[
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Describe the bug**\nA clear and concise description of what the bug is.\n\n** Related Components **\n- [ ] protoc-gen-grpc-federation\n- [ ] grpc-federation-linter\n- [ ] grpc-federation-language-server\n- [ ] grpc-federation-generator\n- [ ] others\n\n**To Reproduce**\nSteps to reproduce the behavior.\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**Screenshots**\nIf applicable, add screenshots to help explain your problem.\n\n**Additional context**\nAdd any other context about the problem here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Is your feature request related to a problem? Please describe.**\nA clear and concise description of what the problem is. Ex. I'm always frustrated when [...]\n\n**Describe the solution you'd like**\nA clear and concise description of what you want to happen.\n\n**Describe alternatives you've considered**\nA clear and concise description of any alternative solutions or features you've considered.\n\n**Additional context**\nAdd any other context or screenshots about the feature request here.\n"
  },
  {
    "path": ".github/pull_request_template.md",
    "content": ""
  },
  {
    "path": ".github/workflows/buf.yml",
    "content": "name: buf\non:\n  push:\n    branches:\n      - main\njobs:\n  buf:\n    name: push Buf modules to BSR\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - uses: bufbuild/buf-action@v1\n        with:\n          format: false\n          lint: false\n          breaking: false\n          pr_comment: false\n          token: ${{ secrets.BUF_TOKEN }}\n          input: proto\n"
  },
  {
    "path": ".github/workflows/lint.yml",
    "content": "name: lint\non:\n  push:\n    branches:\n      - main\n  pull_request:\njobs:\n  lint:\n    name: lint\n    runs-on: ubuntu-latest\n    steps:\n      - name: checkout\n        uses: actions/checkout@v4\n      - uses: actions/setup-go@v4\n        with:\n          go-version-file: ./go.mod\n      - name: install tools\n        run: make tools\n      - name: build tools\n        run: make build\n      - name: run lint\n        run: make lint\n"
  },
  {
    "path": ".github/workflows/release-jetbrains.yml",
    "content": "name: release-jetbrains\non:\n  push:\n    tags:\n      - \"jetbrains/v*\"\n\npermissions:\n  contents: write\n\njobs:\n  release-jetbrains:\n    name: release JetBrains plugin\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n      # Set up Java environment for the next steps\n      - uses: actions/setup-java@v4\n        with:\n          distribution: zulu\n          java-version: 21\n      # Setup Gradle\n      - uses: gradle/actions/setup-gradle@v3\n        with:\n          gradle-home-cache-cleanup: true\n      # Publish the plugin to JetBrains Marketplace\n      - name: Publish Plugin\n        env:\n          PUBLISH_TOKEN: ${{ secrets.JET_BRAINS_PUBLISH_TOKEN }}\n        run: ./gradlew publishPlugin\n        working-directory: ./lsp/client/jetbrains\n\n      # Upload artifact as a release asset\n      - name: Upload Release Asset\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n        run: gh release upload $GITHUB_REF_NAME ./build/distributions/*\n        working-directory: ./lsp/client/jetbrains\n"
  },
  {
    "path": ".github/workflows/release-vscode.yml",
    "content": "name: release-vscode\non:\n  push:\n    tags:\n      - \"v*.*.*\"\n\npermissions:\n  contents: write\n\njobs:\n  release-vscode:\n    name: release vscode extension\n    runs-on: ubuntu-latest\n    steps:\n      - name: install npx\n        run: |\n          sudo apt-get update\n          sudo apt-get install --no-install-recommends -y npm nodejs\n          sudo npm -g install n\n          sudo n stable\n      - name: checkout\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n      - uses: actions/setup-go@v4\n        with:\n          go-version-file: ./go.mod\n      - name: extract version from tags\n        id: meta\n        run: |\n          echo ::set-output name=VERSION::${GITHUB_REF#refs/tags/v}\n      - name: run GoReleaser\n        uses: goreleaser/goreleaser-action@v5\n        with:\n          distribution: goreleaser\n          version: latest\n          args: release --skip-publish --clean\n      - name: build extension\n        run: |\n          make build/vscode-extension\n        env:\n          VERSION: ${{ steps.meta.outputs.VERSION }}\n      - name: release\n        uses: softprops/action-gh-release@v1\n        with:\n          draft: true\n          generate_release_notes: true\n          fail_on_unmatched_files: true\n          files: |\n            ./lsp/client/vscode/grpc-federation-*.vsix\n            ./dist/grpc-federation_*_checksums.txt\n            ./dist/grpc-federation_*_*_*.tar.gz\n            ./dist/grpc-federation_*_*_*.zip\n      - name: publish to Visual Studio Marketplace\n        uses: HaaLeo/publish-vscode-extension@v1\n        with:\n          pat: ${{ secrets.AZURE_DEVOPS_ACCESS_TOKEN }}\n          registryUrl: https://marketplace.visualstudio.com\n          extensionFile: \"./lsp/client/vscode/grpc-federation-${{ steps.meta.outputs.VERSION }}.vsix\"\n"
  },
  {
    "path": ".github/workflows/test.yml",
    "content": "name: test\non:\n  push:\n    branches:\n      - main\n  pull_request:\njobs:\n  build_and_generate:\n    name: build and generate\n    runs-on: ubuntu-latest\n    steps:\n      - name: checkout\n        uses: actions/checkout@v4\n      - uses: actions/setup-go@v4\n        with:\n          go-version-file: ./go.mod\n      - name: install tools\n        run: make tools\n      - name: generate files\n        run: make generate\n      - name: check diff\n        run: git diff --exit-code\n  test:\n    name: test\n    runs-on: ubuntu-latest\n    steps:\n      - name: checkout\n        uses: actions/checkout@v4\n      - name: setup go\n        uses: actions/setup-go@v4\n        with:\n          go-version-file: ./go.mod\n      - name: install tools\n        run: make tools\n      - name: run test\n        run: make test\n      - name: report coverage\n        uses: k1LoW/octocov-action@v1.4.0\n"
  },
  {
    "path": ".gitignore",
    "content": "# Binaries for programs and plugins\n*.exe\n*.exe~\n*.dll\n*.so\n*.dylib\n\n# Test binary, built with `go test -c`\n*.test\n\n# Output of the go coverage tool, specifically when used with LiteIDE\n*.out\n*.out.tmp\n\n# Dependency directories (remove the comment below to include it)\n# vendor/\n\n.DS_Store\nbin\n\ndist/\n"
  },
  {
    "path": ".golangci.yml",
    "content": "# golangci-lint configuration file\n# see: https://github.com/golangci/golangci/wiki/Configuration\n\nrun:\n  timeout: 5m\n  skip-dirs:\n    - bin\n\nlinters-settings:\n\n  govet:\n    check-shadowing: true\n\n  golint:\n    min-confidence: 0\n\n  goimports:\n    local-prefixes: github.com/mercari/grpc-federation\n\n  gocyclo:\n    min-complexity: 10\n\n  maligned:\n    suggest-new: true\n\n  depguard:\n    list-type: blacklist\n    include-go-root: false\n\n\n  misspell:\n    locale: US\n\n  lll:\n    line-length: 120\n\n  nakedret:\n    max-func-lines: 0\n\n  gocritic:\n    disabled-checks:\n      - whyNoLint\n      - wrapperFunc\n      - ifElseChain\n      - unnamedResult\n      - paramTypeCombine\n      - hugeParam\n      - singleCaseSwitch\n      - octalLiteral\n\n    enabled-tags:\n      - performance\n      - style\n      - experimental\n  gci:\n    sections:\n      - \"standard\"\n      - \"default\"\n      - \"prefix(github.com/mercari/grpc-federation)\"\n      - \"blank\"\n      - \"dot\"\n\nlinters:\n  enable:\n    - bodyclose\n    - rowserrcheck\n    - stylecheck\n    - gosec\n    - unconvert\n    - asciicheck\n    - gofmt\n    - goimports\n    - misspell\n    - unparam\n    - dogsled\n    - nakedret\n    - gocritic\n    - godox\n    - whitespace\n    - goprintffuncname\n    - gomodguard\n    - godot\n    - nolintlint\n    - asasalint\n    - bidichk\n    - durationcheck\n    - importas\n    - tagliatelle\n    - tenv\n    - gci\n  disable:\n    - maligned\n    - prealloc\n    - gochecknoglobals\n    - wsl\n    - testpackage\n    - gocognit\n    - depguard\n\n# Configuration of issue rules\nissues:\n  # Excluding configuration per-path, per-linter, per-text and per-source\n  exclude-rules:\n    # Exclude lll issues for long lines with go:generate\n    - linters:\n        - lll\n      source: \"^//go:generate \"\n\n    # Exclude shadow checking on the variable named err and ctx\n    - text: \"shadow: declaration of \\\"(err|ctx)\\\"\"\n      linters:\n        - govet\n\n    # Exclude godox check for TODOs, FIXMEs, and BUGs\n    - text: \"Line contains TODO/BUG/FIXME:\"\n      linters:\n        - godox\n\n    # Exclude some linters from running on tests files\n    - path: suite_test\\.go\n      linters:\n        - typecheck"
  },
  {
    "path": ".goreleaser.yaml",
    "content": "# This is an example .goreleaser.yml file with some sensible defaults.\n# Make sure to check the documentation at https://goreleaser.com\n\n# The lines bellow are called `modelines`. See `:help modeline`\n# Feel free to remove those if you don't want/need to use them.\n# yaml-language-server: $schema=https://goreleaser.com/static/schema.json\n# vim: set ts=2 sw=2 tw=0 fo=cnqoj\n\nbefore:\n  hooks:\n    # You may remove this if you don't use go modules.\n    - go mod tidy\n    # you may remove this if you don't need go generate\n    - go generate ./...\n\nbuilds:\n  - id: grpc-federation-generator\n    main: ./cmd/grpc-federation-generator\n    binary: grpc-federation-generator\n    env:\n      - CGO_ENABLED=0\n    goos:\n      - linux\n      - windows\n      - darwin\n  - id: grpc-federation-language-server\n    main: ./cmd/grpc-federation-language-server\n    binary: grpc-federation-language-server\n    env:\n      - CGO_ENABLED=0\n    goos:\n      - linux\n      - windows\n      - darwin\n  - id: grpc-federation-linter\n    main: ./cmd/grpc-federation-linter\n    binary: grpc-federation-linter\n    env:\n      - CGO_ENABLED=0\n    goos:\n      - linux\n      - windows\n      - darwin\n  - id: protoc-gen-grpc-federation\n    main: ./cmd/protoc-gen-grpc-federation\n    binary: protoc-gen-grpc-federation\n    env:\n      - CGO_ENABLED=0\n    goos:\n      - linux\n      - windows\n      - darwin\n\narchives:\n  - format: tar.gz\n    format_overrides:\n      - goos: windows\n        format: zip\n\nchangelog:\n  sort: asc\n  filters:\n    exclude:\n      - \"^docs:\"\n      - \"^test:\"\n"
  },
  {
    "path": ".octocov.yml",
    "content": "coverage:\n  paths:\n    - cover.out\n  acceptable: current >= 55%\ncodeToTestRatio:\n  code:\n    - '**/*.go'\n    - '!**/*_test.go'\n    - '!**/*.pb.go'\n  test:\n    - '**/*_test.go'\ntestExecutionTime:\n  acceptable: current <= 10min && diff < 3min\ndiff:\n  datastores:\n    - artifact://${GITHUB_REPOSITORY}\ncomment:\n  if: is_pull_request\n  hideFooterLink: true\nreport:\n  if: is_default_branch\n  datastores:\n    - artifact://${GITHUB_REPOSITORY}\n"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n    \"protoc\": {\n        \"options\": [\n            \"--proto_path=proto\",\n            \"--proto_path=proto_deps\",\n        ]\n    },\n    \"grpc-federation\": {\n        \"path\": \"bin/grpc-federation-language-server\",\n        \"import-paths\": [\n            \"proto\",\n        ]\n    }\n}\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2023 Mercari, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Makefile",
    "content": "export\n\nGOBIN := $(PWD)/bin\nPATH := $(GOBIN):$(PATH)\nSHELL := env PATH='$(PATH)' bash\n\nPKG := github.com/mercari/grpc-federation\n\n# retrieve all packages related to the test\nPKGS := $(shell go list ./... | grep -v cmd)\n\n# remove $PKG prefix from package name and add a dot character to convert it to a relative path.\nCOVER_PKGS := $(foreach pkg,$(PKGS),$(subst $(PKG),.,$(pkg)))\n\nCOMMA := ,\nEMPTY :=\nSPACE := $(EMPTY) $(EMPTY)\n\n# join package names for coverage with comma character.\nCOVERPKG_OPT := $(subst $(SPACE),$(COMMA),$(COVER_PKGS))\n\nEXAMPLES := $(wildcard _examples/*)\n\nGIT_REF := $(shell git rev-parse --short=7 HEAD)\n\nVERSION ?= (devel)\nLDFLAGS := -w -s -X=github.com/mercari/grpc-federation/grpc/federation.Version=$(VERSION)\n\n.PHONY: tools\ntools:\n\tgo install github.com/bufbuild/buf/cmd/buf@v1.32.2\n\tgo install github.com/envoyproxy/protoc-gen-validate/cmd/protoc-gen-validate-go@v1.0.4\n\tgo install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.64.8\n\tgo install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.3.0\n\tgo install google.golang.org/protobuf/cmd/protoc-gen-go@v1.33.0\n\n.PHONY: lint\nlint: lint/examples lint/golangci-lint lint/gomod lint/buf\n\n.PHONY: fmt\nfmt: fmt/golangci-lint tidy fmt/buf\n\n.PHONY: tidy\ntidy: tidy/examples\n\tgo mod tidy\n\ntidy/examples: $(foreach var,$(EXAMPLES),tidy/examples/$(var))\n\ntidy/examples/%:\n\tcd $* && go mod tidy\n\nlint/examples: $(foreach var,$(EXAMPLES),lint/examples/$(var))\n\nlint/examples/%:\n\t$(MAKE) -C $* lint\n\nlint/golangci-lint:\n\t$(GOBIN)/golangci-lint run $(args) ./...\n\nlint/gomod: tidy\n\tif git diff --quiet go.mod go.sum; then \\\n        exit 0; \\\n\telse \\\n\t\techo \"go mod tidy resulted in a change of files.\"; \\\n\t\techo \"Run make tidy locally before pushing\"; \\\n\t\texit 1; \\\n\tfi\n\nlint/buf: fmt/buf\n\tif git diff --quiet proto; then \\\n        exit 0; \\\n\telse \\\n\t\techo \"buf format resulted in a change of files.\"; \\\n\t\techo \"Run make fmt/buf locally before pushing\"; \\\n\t\texit 1; \\\n\tfi\n\nfmt/golangci-lint:\n\t$(GOBIN)/golangci-lint run --fix $(args) ./...\n\nfmt/buf:\n\tbuf format --write\n\n.PHONY: generate\ngenerate: build generate/buf generate/examples\n\ngenerate/buf:\n\tbuf generate\n\ngenerate/examples: $(foreach var,$(EXAMPLES),generate/examples/$(var))\n\ngenerate/examples/%:\n\t$(MAKE) -C $* generate\n\n.PHONY: build\nbuild: build/grpcfedctl build/protoc-gen-grpc-federation build/grpc-federation-linter build/grpc-federation-language-server build/grpc-federation-generator\n\nbuild/grpcfedctl:\n\tgo build -ldflags \"$(LDFLAGS)\" -o $(GOBIN)/grpcfedctl ./cmd/grpcfedctl\n\nbuild/protoc-gen-grpc-federation:\n\tgo build -ldflags \"$(LDFLAGS)\" -o $(GOBIN)/protoc-gen-grpc-federation ./cmd/protoc-gen-grpc-federation\n\nbuild/grpc-federation-linter:\n\tgo build -ldflags \"$(LDFLAGS)\" -o $(GOBIN)/grpc-federation-linter ./cmd/grpc-federation-linter\n\nbuild/grpc-federation-language-server:\n\tgo build -ldflags \"$(LDFLAGS)\" -o $(GOBIN)/grpc-federation-language-server ./cmd/grpc-federation-language-server\n\nbuild/grpc-federation-generator:\n\tgo build -ldflags \"$(LDFLAGS)\" -o $(GOBIN)/grpc-federation-generator ./cmd/grpc-federation-generator\n\n.PHONY: build/vscode-extension\nbuild/vscode-extension: versioning/vscode-extension install/vscode-dependencies\n\tcd lsp/client/vscode && npx vsce package -o grpc-federation-$(VERSION).vsix\n\n.PHONY: install/vscode-dependencies\ninstall/vscode-dependencies:\n\tcd lsp/client/vscode && npm install\n\n.PHONY: versioning/vscode-extension\nversioning/vscode-extension:\n\tcd lsp/client/vscode && npm version $(VERSION)\n\n.PHONY: test\ntest: test/examples\n\tgo test -race -coverpkg=$(COVERPKG_OPT) -covermode=atomic -coverprofile=cover.out.tmp `go list ./...`\n\tcat cover.out.tmp |grep -v \"pb.go\" > cover.out && rm cover.out.tmp\n\ntest/examples: $(foreach var,$(EXAMPLES),test/examples/$(var))\n\ntest/examples/%:\n\t$(MAKE) -C $* test\n\n.PHONY: cover-html\ncover-html: test\n\tgo tool cover -html=cover.out\n"
  },
  {
    "path": "README.md",
    "content": "# gRPC Federation\n\n<img width=\"500px\" src=\"https://github.com/mercari/grpc-federation/blob/main/images/logo.png?raw=true\"/>\n\n[![Test](https://github.com/mercari/grpc-federation/actions/workflows/test.yml/badge.svg)](https://github.com/mercari/grpc-federation/actions/workflows/test.yml)\n[![GoDoc](https://godoc.org/github.com/mercari/grpc-federation?status.svg)](https://pkg.go.dev/github.com/mercari/grpc-federation?tab=doc)\n[![Buf](https://img.shields.io/badge/Buf-docs-blue)](https://buf.build/mercari/grpc-federation)\n\ngRPC Federation auto-generates a BFF (Backend for Frontend) server, aggregating and returning results from microservices using the gRPC protocol, configured through Protocol Buffer options.\n\n[Public Roadmap is here](https://github.com/orgs/mercari/projects/1).\n\n# Motivation\n\nImagine a system with a backend of multiple microservices. Instead of the client directly communicating with each microservice, it's more efficient to use a dedicated service (BFF - Backend for Frontend) to aggregate information and send it back to the client. However, as the system grows, determining which team should handle the BFF service becomes unclear. This is where Federated Architecture, like [GraphQL (Apollo) Federation](https://www.apollographql.com/docs/federation/), comes in.\n\nWith GraphQL Federation, each microservice has its own GraphQL server, and the BFF focuses on aggregating resources. However, integrating a new GraphQL server into a large system is challenging, especially in systems developed with the gRPC protocol.\n\nTo streamline, we're exploring the idea of automatically generating a BFF using the gRPC protocol with simple custom options. By leveraging existing Protocol Buffers schema for the BFF, we aim to keep using gRPC while drastically reducing maintenance costs.\n\n# Why Choose gRPC Federation?\n\n## 1. Reduce the Boilerplate Implementation Required to Create a BFF\n\n### 1.1. Automate Type Conversions for the Same Message Across Different Packages\n\nConsider defining a BFF using a proto, assuming the BFF acts as a proxy calling multiple microservices and aggregating results. In this scenario, it's necessary to redefine the same messages to handle microservices responses on the BFF. Without defining these messages on the BFF, the BFF client must be aware of different packages, which is not ideal.\n\nRedefining messages on the BFF results in a considerable number of type conversions for the same messages across different packages.\n\nUsing gRPC Federation removes the need for tedious type conversions. Just define custom options in the proto, and gRPC Federation will automatically handle these conversions.\n\n### 1.2. Optimize gRPC Method Calls\n\nWhen making multiple gRPC method calls, it is crucial to enhance performance by analyzing dependencies between method calls and processing requests in parallel whenever possible. However, identifying dependencies becomes more challenging as the number of method calls increases.\n\ngRPC Federation simplifies this process by automatically analyzing dependencies and generating code to optimize request flows. It removes the need for manual consideration.\n\n### 1.3. Simplify Retries and Timeouts on gRPC Method Calls\n\nSetting timeouts or retry counts for gRPC method calls in dependent services can be complicated. However, gRPC Federation allows for a declarative approach to implementing retries and timeouts.\n\nThese are just a few examples of how gRPC Federation simplifies work. By creating a BFF with minimal proto definitions, you can significantly reduce the development cost of BFFs.\n\n## 2. Explicitly Declare Dependencies on Services\n\nUsing gRPC Federation enables a clear understanding of the services the BFF depends on by reading the proto file. It uncovers a relationship between each microservice and BFF.\n\nFurthermore, gRPC Federation offers functionality to extract dependencies as a Go library, enabling the extraction of service dependencies through static analysis of the proto file. This capability proves valuable for various types of analysis and automation.\n\n# Features\n\n## 1. Code Generation Assistance Tools\n\ngRPC Federation automatically generates a gRPC server by adding custom options to Protocol Buffers. It supports the `protoc-gen-grpc-federation` CLI, accessible through `protoc`. Various other tools are available to assist in code generation:\n\n- `protoc-gen-grpc-federation`: protoc's plugin for gRPC Federation\n- `grpc-federation-linter`: Linter for gRPC Federation\n- `grpc-federation-language-server`: Language server for gRPC Federation\n- `grpc-federation-generator`: Standalone code generation tool, which monitors proto changes and interactively generates codes\n\n## 2. CEL Support for Complex Operations\n\ngRPC Federation integrates [CEL](https://github.com/google/cel-spec) to enable support for more advanced operations on BFFs.  \n\n[gRPC Federation CEL API References](./docs/cel.md)\n\n## 3. Extensible System with WebAssembly\n\ngRPC Federation features three extension points:\n\n1. Code generation pipeline\n2. Complex processes not expressible by Protocol Buffers\n3. CEL API\n\nWe plan to make all three extension points available through WebAssembly in the future. Currently, the code generation pipeline and the CEL API are extensible.\n\n### 3.1 Code Generation Pipeline\n\nThis feature allows you to run a custom auto-generated process using the results from gRPC Federation.\n\n[How to Run Your Own Code Generation Process](./docs/code_generation_plugin.md)\n\n### 3.2 Complex Processes Not Expressible by Protocol Buffers\n\ngRPC Federation uses a hybrid system, with logic in Go managing operations that can't be expressed in Protocol Buffers. We plan to add support for WebAssembly in the future.\n\n[How to Extend the API with the Go](./docs/references.md#grpcfederationmessagecustom_resolver)\n\n### 3.3 CEL API\n\nWhile gRPC Federation inherently supports various CEL APIs, users can use this functionality to use internal domain logic as a CEL API.\n\n[How to Extend the CEL API](./docs/cel_plugin.md)\n\n# Installation\n\nCurrently, there are three ways to use gRPC Federation:\n\n1. Use `buf generate`\n2. Use `protoc-gen-grpc-federation`\n3. Use `grpc-federation-generator`\n\nFor detailed information on each method, please refer to [Installation Documentation](./docs/installation.md).\n\n# Usage\n\n- [`Getting Started`](./docs/getting_started.md)\n- [`DEMO Application`](./demo/README.md)\n- [`Examples`](./_examples/)\n\n# Documents\n\n- [Feature References](./docs/references.md)\n- [CEL API References](./docs/cel.md)\n\n# Contribution\n\nPlease read the CLA carefully before submitting your contribution to Mercari. Under any circumstances, by submitting your contribution, you are deemed to accept and agree to be bound by the terms and conditions of the CLA.\n\nhttps://www.mercari.com/cla/\n\n# License\n\nCopyright 2023 Mercari, Inc.\n\nLicensed under the MIT License.\n"
  },
  {
    "path": "_examples/01_minimum/.gitignore",
    "content": "grpc/federation\n\n"
  },
  {
    "path": "_examples/01_minimum/.vscode/settings.json",
    "content": "{\n    \"protoc\": {\n        \"options\": [\n            \"--proto_path=proto\",\n            \"--proto_path=proto_deps\"\n        ]\n    },\n    \"grpc-federation\": {\n        \"path\": \"../../bin/grpc-federation-language-server\",\n        \"import-paths\": [\n            \"proto\",\n            \"proto_deps\"\n        ]\n    }\n}\n"
  },
  {
    "path": "_examples/01_minimum/Makefile",
    "content": "MAKEFILE_DIR := $(dir $(lastword $(MAKEFILE_LIST)))\nGOBIN := $(MAKEFILE_DIR)/../../bin\nPATH := $(GOBIN):$(PATH)\n\nJAEGER_IMAGE := jaegertracing/all-in-one:latest\n\n.PHONY: generate\ngenerate:\n\t$(GOBIN)/buf generate\n\n.PHONY: lint\nlint:\n\t@$(GOBIN)/grpc-federation-linter -Iproto -Iproto_deps ./proto/federation/federation.proto\n\n.PHONY: test\ntest:\n\tgo test -race ./ -count=1\n\n.PHONY: grpc-federation/generate\ngrpc-federation/generate:\n\t@$(GOBIN)/grpc-federation-generator ./proto/federation/federation.proto\n\n.PHONY: grpc-federation/watch\ngrpc-federation/watch:\n\t@$(GOBIN)/grpc-federation-generator -w\n\n.PHONY: jaeger/start\njaeger/start:\n\t@docker run \\\n\t\t-e COLLECTOR_OTLP_ENABLED=true \\\n\t\t-p 16686:16686 \\\n\t\t-p 4317:4317 \\\n\t\t-p 4318:4318 \\\n\t\t-d \\\n\t\t$(JAEGER_IMAGE)\n\n.PHONY: jaeger/stop\njaeger/stop:\n\t@docker stop $(shell docker ps -q  --filter ancestor=$(JAEGER_IMAGE))\n"
  },
  {
    "path": "_examples/01_minimum/buf.gen.yaml",
    "content": "version: v1\nmanaged:\n  enabled: true\nplugins:\n  - plugin: go\n    out: .\n    opt: paths=source_relative\n  - plugin: go-grpc\n    out: .\n    opt: paths=source_relative\n  - plugin: grpc-federation\n    out: .\n    opt:\n      - paths=source_relative\n"
  },
  {
    "path": "_examples/01_minimum/buf.work.yaml",
    "content": "version: v1\ndirectories:\n  - proto\n  - proto_deps\n"
  },
  {
    "path": "_examples/01_minimum/federation/federation.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype GetPostRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetPostRequest) Reset() {\n\t*x = GetPostRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostRequest) ProtoMessage() {}\n\nfunc (x *GetPostRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostRequest.ProtoReflect.Descriptor instead.\nfunc (*GetPostRequest) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetPostRequest) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\ntype GetPostResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPost *Post `protobuf:\"bytes,1,opt,name=post,proto3\" json:\"post,omitempty\"`\n}\n\nfunc (x *GetPostResponse) Reset() {\n\t*x = GetPostResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostResponse) ProtoMessage() {}\n\nfunc (x *GetPostResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostResponse.ProtoReflect.Descriptor instead.\nfunc (*GetPostResponse) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetPostResponse) GetPost() *Post {\n\tif x != nil {\n\t\treturn x.Post\n\t}\n\treturn nil\n}\n\ntype Post struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId      string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tTitle   string `protobuf:\"bytes,2,opt,name=title,proto3\" json:\"title,omitempty\"`\n\tContent string `protobuf:\"bytes,3,opt,name=content,proto3\" json:\"content,omitempty\"`\n\tUser    *User  `protobuf:\"bytes,4,opt,name=user,proto3\" json:\"user,omitempty\"`\n}\n\nfunc (x *Post) Reset() {\n\t*x = Post{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Post) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Post) ProtoMessage() {}\n\nfunc (x *Post) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Post.ProtoReflect.Descriptor instead.\nfunc (*Post) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *Post) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetTitle() string {\n\tif x != nil {\n\t\treturn x.Title\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetContent() string {\n\tif x != nil {\n\t\treturn x.Content\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetUser() *User {\n\tif x != nil {\n\t\treturn x.User\n\t}\n\treturn nil\n}\n\ntype User struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId   string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *User) Reset() {\n\t*x = User{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *User) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*User) ProtoMessage() {}\n\nfunc (x *User) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use User.ProtoReflect.Descriptor instead.\nfunc (*User) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *User) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *User) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nvar File_federation_federation_proto protoreflect.FileDescriptor\n\nvar file_federation_federation_proto_rawDesc = []byte{\n\t0x0a, 0x1b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x20, 0x67, 0x72, 0x70, 0x63, 0x2f,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x20, 0x0a, 0x0e, 0x47,\n\t0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a,\n\t0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x3e, 0x0a,\n\t0x0f, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x12, 0x24, 0x0a, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x6f, 0x73, 0x74,\n\t0x52, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x3a, 0x05, 0x9a, 0x4a, 0x02, 0x10, 0x01, 0x22, 0x6c, 0x0a,\n\t0x04, 0x50, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x04, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x2a, 0x0a, 0x04, 0x55,\n\t0x73, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x32, 0x5e, 0x0a, 0x11, 0x46, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x44, 0x0a, 0x07,\n\t0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x12, 0x1a, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75,\n\t0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x22, 0x00, 0x1a, 0x03, 0x9a, 0x4a, 0x00, 0x42, 0x88, 0x01, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0f, 0x46, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x1d, 0x65,\n\t0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x3b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xa2, 0x02, 0x03, 0x46,\n\t0x58, 0x58, 0xaa, 0x02, 0x0a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xca,\n\t0x02, 0x0a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xe2, 0x02, 0x16, 0x46,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74,\n\t0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_federation_federation_proto_rawDescOnce sync.Once\n\tfile_federation_federation_proto_rawDescData = file_federation_federation_proto_rawDesc\n)\n\nfunc file_federation_federation_proto_rawDescGZIP() []byte {\n\tfile_federation_federation_proto_rawDescOnce.Do(func() {\n\t\tfile_federation_federation_proto_rawDescData = protoimpl.X.CompressGZIP(file_federation_federation_proto_rawDescData)\n\t})\n\treturn file_federation_federation_proto_rawDescData\n}\n\nvar file_federation_federation_proto_msgTypes = make([]protoimpl.MessageInfo, 4)\nvar file_federation_federation_proto_goTypes = []interface{}{\n\t(*GetPostRequest)(nil),  // 0: federation.GetPostRequest\n\t(*GetPostResponse)(nil), // 1: federation.GetPostResponse\n\t(*Post)(nil),            // 2: federation.Post\n\t(*User)(nil),            // 3: federation.User\n}\nvar file_federation_federation_proto_depIdxs = []int32{\n\t2, // 0: federation.GetPostResponse.post:type_name -> federation.Post\n\t3, // 1: federation.Post.user:type_name -> federation.User\n\t0, // 2: federation.FederationService.GetPost:input_type -> federation.GetPostRequest\n\t1, // 3: federation.FederationService.GetPost:output_type -> federation.GetPostResponse\n\t3, // [3:4] is the sub-list for method output_type\n\t2, // [2:3] is the sub-list for method input_type\n\t2, // [2:2] is the sub-list for extension type_name\n\t2, // [2:2] is the sub-list for extension extendee\n\t0, // [0:2] is the sub-list for field type_name\n}\n\nfunc init() { file_federation_federation_proto_init() }\nfunc file_federation_federation_proto_init() {\n\tif File_federation_federation_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_federation_federation_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Post); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*User); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_federation_federation_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   4,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_federation_federation_proto_goTypes,\n\t\tDependencyIndexes: file_federation_federation_proto_depIdxs,\n\t\tMessageInfos:      file_federation_federation_proto_msgTypes,\n\t}.Build()\n\tFile_federation_federation_proto = out.File\n\tfile_federation_federation_proto_rawDesc = nil\n\tfile_federation_federation_proto_goTypes = nil\n\tfile_federation_federation_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/01_minimum/federation/federation_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tFederationService_GetPost_FullMethodName = \"/federation.FederationService/GetPost\"\n)\n\n// FederationServiceClient is the client API for FederationService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype FederationServiceClient interface {\n\tGetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error)\n}\n\ntype federationServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewFederationServiceClient(cc grpc.ClientConnInterface) FederationServiceClient {\n\treturn &federationServiceClient{cc}\n}\n\nfunc (c *federationServiceClient) GetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error) {\n\tout := new(GetPostResponse)\n\terr := c.cc.Invoke(ctx, FederationService_GetPost_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// FederationServiceServer is the server API for FederationService service.\n// All implementations must embed UnimplementedFederationServiceServer\n// for forward compatibility\ntype FederationServiceServer interface {\n\tGetPost(context.Context, *GetPostRequest) (*GetPostResponse, error)\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\n// UnimplementedFederationServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedFederationServiceServer struct {\n}\n\nfunc (UnimplementedFederationServiceServer) GetPost(context.Context, *GetPostRequest) (*GetPostResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetPost not implemented\")\n}\nfunc (UnimplementedFederationServiceServer) mustEmbedUnimplementedFederationServiceServer() {}\n\n// UnsafeFederationServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to FederationServiceServer will\n// result in compilation errors.\ntype UnsafeFederationServiceServer interface {\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\nfunc RegisterFederationServiceServer(s grpc.ServiceRegistrar, srv FederationServiceServer) {\n\ts.RegisterService(&FederationService_ServiceDesc, srv)\n}\n\nfunc _FederationService_GetPost_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetPostRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(FederationServiceServer).GetPost(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: FederationService_GetPost_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(FederationServiceServer).GetPost(ctx, req.(*GetPostRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// FederationService_ServiceDesc is the grpc.ServiceDesc for FederationService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar FederationService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"federation.FederationService\",\n\tHandlerType: (*FederationServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetPost\",\n\t\t\tHandler:    _FederationService_GetPost_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"federation/federation.proto\",\n}\n"
  },
  {
    "path": "_examples/01_minimum/federation/federation_grpc_federation.pb.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: federation/federation.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Federation_GetPostResponseVariable represents variable definitions in \"federation.GetPostResponse\".\ntype FederationService_Federation_GetPostResponseVariable struct {\n}\n\n// Federation_GetPostResponseArgument is argument for \"federation.GetPostResponse\" message.\ntype FederationService_Federation_GetPostResponseArgument struct {\n\tId string\n\tFederationService_Federation_GetPostResponseVariable\n}\n\n// FederationServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationServiceConfig struct {\n\t// Resolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\n\t// If this interface is not provided, an error is returned during initialization.\n\tResolver FederationServiceResolver // required\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationServiceClientFactory interface {\n}\n\n// FederationServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationServiceDependentClientSet struct {\n}\n\n// FederationServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationServiceResolver interface {\n\t// Resolve_Federation_GetPostResponse implements resolver for \"federation.GetPostResponse\".\n\tResolve_Federation_GetPostResponse(context.Context, *FederationService_Federation_GetPostResponseArgument) (*GetPostResponse, error)\n}\n\n// FederationServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// FederationServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationServiceUnimplementedResolver struct{}\n\n// Resolve_Federation_GetPostResponse resolve \"federation.GetPostResponse\".\n// This method always returns Unimplemented error.\nfunc (FederationServiceUnimplementedResolver) Resolve_Federation_GetPostResponse(context.Context, *FederationService_Federation_GetPostResponseArgument) (ret *GetPostResponse, e error) {\n\te = grpcfed.GRPCErrorf(grpcfed.UnimplementedCode, \"method Resolve_Federation_GetPostResponse not implemented\")\n\treturn\n}\n\n// FederationService represents Federation Service.\ntype FederationService struct {\n\tUnimplementedFederationServiceServer\n\tcfg             FederationServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tresolver        FederationServiceResolver\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationServiceDependentClientSet\n}\n\n// NewFederationService creates FederationService instance by FederationServiceConfig.\nfunc NewFederationService(cfg FederationServiceConfig) (*FederationService, error) {\n\tif cfg.Resolver == nil {\n\t\treturn nil, grpcfed.ErrResolverConfig\n\t}\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"federation.FederationService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.federation.GetPostResponseArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tsvc := &FederationService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tresolver:        cfg.Resolver,\n\t\tclient:          &FederationServiceDependentClientSet{},\n\t}\n\tif resolver, ok := cfg.Resolver.(grpcfed.CustomResolverInitializer); ok {\n\t\tctx := context.Background()\n\t\tif err := resolver.Init(ctx); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationService(ctx context.Context, svc *FederationService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n// GetPost implements \"federation.FederationService/GetPost\" method.\nfunc (s *FederationService) GetPost(ctx context.Context, req *GetPostRequest) (res *GetPostResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.FederationService/GetPost\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Federation_GetPostResponse(ctx, &FederationService_Federation_GetPostResponseArgument{\n\t\tId: req.GetId(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Federation_GetPostResponse resolve \"federation.GetPostResponse\" message.\nfunc (s *FederationService) resolve_Federation_GetPostResponse(ctx context.Context, req *FederationService_Federation_GetPostResponseArgument) (*GetPostResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.GetPostResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.GetPostResponse\", slog.Any(\"message_args\", s.logvalue_Federation_GetPostResponseArgument(req)))\n\n\t// create a message value to be returned.\n\t// `custom_resolver = true` in \"grpc.federation.message\" option.\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx)) // create a new reference to logger.\n\tret, err := s.resolver.Resolve_Federation_GetPostResponse(ctx, req)\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.GetPostResponse\", slog.Any(\"federation.GetPostResponse\", s.logvalue_Federation_GetPostResponse(ret)))\n\treturn ret, nil\n}\n\nfunc (s *FederationService) logvalue_Federation_GetPostResponse(v *GetPostResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"post\", s.logvalue_Federation_Post(v.GetPost())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Federation_GetPostResponseArgument(v *FederationService_Federation_GetPostResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Federation_Post(v *Post) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.String(\"title\", v.GetTitle()),\n\t\tslog.String(\"content\", v.GetContent()),\n\t\tslog.Any(\"user\", s.logvalue_Federation_User(v.GetUser())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Federation_User(v *User) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n"
  },
  {
    "path": "_examples/01_minimum/go.mod",
    "content": "module example\n\ngo 1.24.0\n\nreplace github.com/mercari/grpc-federation => ../../\n\nrequire (\n\tgithub.com/google/go-cmp v0.7.0\n\tgithub.com/mercari/grpc-federation v0.0.0-00010101000000-000000000000\n\tgo.opentelemetry.io/otel v1.24.0\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0\n\tgo.opentelemetry.io/otel/sdk v1.24.0\n\tgo.opentelemetry.io/otel/trace v1.24.0\n\tgo.uber.org/goleak v1.3.0\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7\n\tgoogle.golang.org/grpc v1.65.0\n\tgoogle.golang.org/protobuf v1.34.2\n)\n\nrequire (\n\tcel.dev/expr v0.19.1 // indirect\n\tgithub.com/antlr4-go/antlr/v4 v4.13.0 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.2.1 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/goccy/wasi-go v0.3.2 // indirect\n\tgithub.com/google/cel-go v0.23.1 // indirect\n\tgithub.com/google/uuid v1.6.0 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect\n\tgithub.com/kelseyhightower/envconfig v1.4.0 // indirect\n\tgithub.com/stealthrocket/wazergo v0.19.1 // indirect\n\tgithub.com/stoewer/go-strcase v1.3.0 // indirect\n\tgithub.com/tetratelabs/wazero v1.10.1 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.24.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.0.0 // indirect\n\tgolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect\n\tgolang.org/x/net v0.38.0 // indirect\n\tgolang.org/x/sync v0.14.0 // indirect\n\tgolang.org/x/sys v0.37.0 // indirect\n\tgolang.org/x/text v0.23.0 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 // indirect\n)\n"
  },
  {
    "path": "_examples/01_minimum/go.sum",
    "content": "cel.dev/expr v0.19.1 h1:NciYrtDRIR0lNCnH1LFJegdjspNx9fI59O7TWcua/W4=\ncel.dev/expr v0.19.1/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw=\ngithub.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=\ngithub.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/goccy/wasi-go v0.3.2 h1:wAvGXmqCkfcp0B0AwIp5Ya53hzDwkKm9W8iuT3nCCz0=\ngithub.com/goccy/wasi-go v0.3.2/go.mod h1:nIKD204n9xa4Z20UV+XA483kIr9TAl2vXr+X5qVAO5M=\ngithub.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4=\ngithub.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=\ngithub.com/google/cel-go v0.23.1 h1:91ThhEZlBcE5rB2adBVXqvDoqdL8BG2oyhd0bK1I/r4=\ngithub.com/google/cel-go v0.23.1/go.mod h1:52Pb6QsDbC5kvgxvZhiL9QX1oZEkcUF/ZqaPx1J5Wwo=\ngithub.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\ngithub.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg=\ngithub.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=\ngithub.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/stealthrocket/wazergo v0.19.1 h1:BPrITETPgSFwiytwmToO0MbUC/+RGC39JScz1JmmG6c=\ngithub.com/stealthrocket/wazergo v0.19.1/go.mod h1:riI0hxw4ndZA5e6z7PesHg2BtTftcZaMxRcoiGGipTs=\ngithub.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs=\ngithub.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tetratelabs/wazero v1.10.1 h1:2DugeJf6VVk58KTPszlNfeeN8AhhpwcZqkJj2wwFuH8=\ngithub.com/tetratelabs/wazero v1.10.1/go.mod h1:DRm5twOQ5Gr1AoEdSi0CLjDQF1J9ZAuyqFIjl1KKfQU=\ngo.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo=\ngo.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0=\ngo.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI=\ngo.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=\ngo.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw=\ngo.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg=\ngo.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=\ngo.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=\ngo.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=\ngo.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=\ngolang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=\ngolang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=\ngolang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=\ngolang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=\ngolang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=\ngolang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=\ngolang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 h1:YcyjlL1PRr2Q17/I0dPk2JmYS5CDXfcdb2Z3YRioEbw=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7 h1:2035KHhUv+EpyB+hWgJnaWKJOdX1E95w2S8Rr4uWKTs=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=\ngoogle.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=\ngoogle.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=\ngoogle.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=\ngoogle.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "_examples/01_minimum/grpc-federation.yaml",
    "content": "imports:\n  - proto\nsrc:\n  - proto\nout: .\nplugins:\n  - plugin: go\n    opt: paths=source_relative\n  - plugin: go-grpc\n    opt: paths=source_relative\n  - plugin: grpc-federation\n    opt: paths=source_relative\n"
  },
  {
    "path": "_examples/01_minimum/main_test.go",
    "content": "package main_test\n\nimport (\n\t\"context\"\n\t\"log/slog\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\"\n\t\"go.opentelemetry.io/otel/propagation\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\tsdktrace \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.4.0\"\n\t\"go.uber.org/goleak\"\n\n\t\"example/federation\"\n)\n\ntype Resolver struct {\n\t*federation.FederationServiceUnimplementedResolver\n}\n\nvar (\n\trequestID    = \"foo\"\n\ttestResponse = &federation.GetPostResponse{\n\t\tPost: &federation.Post{\n\t\t\tId:      requestID,\n\t\t\tTitle:   \"xxx\",\n\t\t\tContent: \"yyy\",\n\t\t\tUser: &federation.User{\n\t\t\t\tId:   requestID,\n\t\t\t\tName: \"zzz\",\n\t\t\t},\n\t\t},\n\t}\n)\n\nfunc (r *Resolver) Resolve_Federation_GetPostResponse(ctx context.Context, arg *federation.FederationService_Federation_GetPostResponseArgument) (*federation.GetPostResponse, error) {\n\treturn testResponse, nil\n}\n\nfunc TestFederation(t *testing.T) {\n\tdefer goleak.VerifyNone(t)\n\tctx := context.Background()\n\n\tif os.Getenv(\"ENABLE_JAEGER\") != \"\" {\n\t\texporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithInsecure())\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttp := sdktrace.NewTracerProvider(\n\t\t\tsdktrace.WithBatcher(exporter),\n\t\t\tsdktrace.WithResource(\n\t\t\t\tresource.NewWithAttributes(\n\t\t\t\t\tsemconv.SchemaURL,\n\t\t\t\t\tsemconv.ServiceNameKey.String(\"example01/minimum\"),\n\t\t\t\t\tsemconv.ServiceVersionKey.String(\"1.0.0\"),\n\t\t\t\t\tattribute.String(\"environment\", \"dev\"),\n\t\t\t\t),\n\t\t\t),\n\t\t\tsdktrace.WithSampler(sdktrace.AlwaysSample()),\n\t\t)\n\t\tdefer tp.Shutdown(ctx)\n\t\totel.SetTextMapPropagator(propagation.TraceContext{})\n\t\totel.SetTracerProvider(tp)\n\t}\n\n\tlogger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{\n\t\tLevel: slog.LevelDebug,\n\t}))\n\tsvc, err := federation.NewFederationService(federation.FederationServiceConfig{\n\t\tResolver: new(Resolver),\n\t\tLogger:   logger,\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tres, err := svc.GetPost(ctx, &federation.GetPostRequest{Id: requestID})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif diff := cmp.Diff(\n\t\ttestResponse, res,\n\t\tcmpopts.IgnoreUnexported(federation.GetPostResponse{}, federation.Post{}, federation.User{}),\n\t); diff != \"\" {\n\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t}\n}\n"
  },
  {
    "path": "_examples/01_minimum/proto/buf.yaml",
    "content": "version: v1\nbreaking:\n  use:\n    - FILE\nlint:\n  use:\n    - DEFAULT\n"
  },
  {
    "path": "_examples/01_minimum/proto/federation/federation.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message).custom_resolver = true;\n  Post post = 1;\n}\n\nmessage Post {\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  User user = 4;\n}\n\nmessage User {\n  string id = 1;\n  string name = 2;\n}\n"
  },
  {
    "path": "_examples/02_simple/.gitignore",
    "content": "grpc/federation\n"
  },
  {
    "path": "_examples/02_simple/.vscode/settings.json",
    "content": "{\n    \"protoc\": {\n        \"options\": [\n            \"--proto_path=proto\",\n            \"--proto_path=proto_deps\"\n        ]\n    },\n    \"grpc-federation\": {\n        \"path\": \"../../bin/grpc-federation-language-server\",\n        \"import-paths\": [\n            \"proto\",\n            \"proto_deps\"\n        ]\n    }\n}\n"
  },
  {
    "path": "_examples/02_simple/Makefile",
    "content": "MAKEFILE_DIR := $(dir $(lastword $(MAKEFILE_LIST)))\nGOBIN := $(MAKEFILE_DIR)/../../bin\nPATH := $(GOBIN):$(PATH)\n\nJAEGER_IMAGE := jaegertracing/all-in-one:latest\n\n.PHONY: generate\ngenerate:\n\t$(GOBIN)/buf generate\n\n.PHONY: lint\nlint:\n\t@$(GOBIN)/grpc-federation-linter -Iproto -Iproto_deps ./proto/federation/federation.proto\n\n.PHONY: test\ntest:\n\tgo test -race ./ -count=1\n\n.PHONY: grpc-federation/generate\ngrpc-federation/generate:\n\t@$(GOBIN)/grpc-federation-generator ./proto/federation/federation.proto\n\n.PHONY: grpc-federation/watch\ngrpc-federation/watch:\n\t@$(GOBIN)/grpc-federation-generator -w\n\n.PHONY: jaeger/start\njaeger/start:\n\t@docker run \\\n\t\t-e COLLECTOR_OTLP_ENABLED=true \\\n\t\t-p 16686:16686 \\\n\t\t-p 4317:4317 \\\n\t\t-p 4318:4318 \\\n\t\t-d \\\n\t\t$(JAEGER_IMAGE)\n\n.PHONY: jaeger/stop\njaeger/stop:\n\t@docker stop $(shell docker ps -q  --filter ancestor=$(JAEGER_IMAGE))\n"
  },
  {
    "path": "_examples/02_simple/buf.gen.yaml",
    "content": "version: v1\nmanaged:\n  enabled: true\nplugins:\n  - plugin: go\n    out: .\n    opt: paths=source_relative\n  - plugin: go-grpc\n    out: .\n    opt: paths=source_relative\n  - plugin: grpc-federation\n    out: .\n    opt:\n    - paths=source_relative\n    - import_paths=proto\n"
  },
  {
    "path": "_examples/02_simple/buf.work.yaml",
    "content": "version: v1\ndirectories:\n  - proto\n  - proto_deps\n"
  },
  {
    "path": "_examples/02_simple/federation/federation.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tanypb \"google.golang.org/protobuf/types/known/anypb\"\n\ttimestamppb \"google.golang.org/protobuf/types/known/timestamppb\"\n\twrapperspb \"google.golang.org/protobuf/types/known/wrapperspb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Item_ItemType int32\n\nconst (\n\tItem_ITEM_TYPE_UNSPECIFIED Item_ItemType = 0\n\tItem_ITEM_TYPE_1           Item_ItemType = 1\n\tItem_ITEM_TYPE_2           Item_ItemType = 2\n\tItem_ITEM_TYPE_3           Item_ItemType = 3\n)\n\n// Enum value maps for Item_ItemType.\nvar (\n\tItem_ItemType_name = map[int32]string{\n\t\t0: \"ITEM_TYPE_UNSPECIFIED\",\n\t\t1: \"ITEM_TYPE_1\",\n\t\t2: \"ITEM_TYPE_2\",\n\t\t3: \"ITEM_TYPE_3\",\n\t}\n\tItem_ItemType_value = map[string]int32{\n\t\t\"ITEM_TYPE_UNSPECIFIED\": 0,\n\t\t\"ITEM_TYPE_1\":           1,\n\t\t\"ITEM_TYPE_2\":           2,\n\t\t\"ITEM_TYPE_3\":           3,\n\t}\n)\n\nfunc (x Item_ItemType) Enum() *Item_ItemType {\n\tp := new(Item_ItemType)\n\t*p = x\n\treturn p\n}\n\nfunc (x Item_ItemType) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (Item_ItemType) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_federation_federation_proto_enumTypes[0].Descriptor()\n}\n\nfunc (Item_ItemType) Type() protoreflect.EnumType {\n\treturn &file_federation_federation_proto_enumTypes[0]\n}\n\nfunc (x Item_ItemType) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use Item_ItemType.Descriptor instead.\nfunc (Item_ItemType) EnumDescriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{5, 0}\n}\n\ntype Item_Location_LocationType int32\n\nconst (\n\tItem_Location_LOCATION_TYPE_0 Item_Location_LocationType = 0\n\tItem_Location_LOCATION_TYPE_1 Item_Location_LocationType = 1\n)\n\n// Enum value maps for Item_Location_LocationType.\nvar (\n\tItem_Location_LocationType_name = map[int32]string{\n\t\t0: \"LOCATION_TYPE_0\",\n\t\t1: \"LOCATION_TYPE_1\",\n\t}\n\tItem_Location_LocationType_value = map[string]int32{\n\t\t\"LOCATION_TYPE_0\": 0,\n\t\t\"LOCATION_TYPE_1\": 1,\n\t}\n)\n\nfunc (x Item_Location_LocationType) Enum() *Item_Location_LocationType {\n\tp := new(Item_Location_LocationType)\n\t*p = x\n\treturn p\n}\n\nfunc (x Item_Location_LocationType) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (Item_Location_LocationType) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_federation_federation_proto_enumTypes[1].Descriptor()\n}\n\nfunc (Item_Location_LocationType) Type() protoreflect.EnumType {\n\treturn &file_federation_federation_proto_enumTypes[1]\n}\n\nfunc (x Item_Location_LocationType) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use Item_Location_LocationType.Descriptor instead.\nfunc (Item_Location_LocationType) EnumDescriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{5, 0, 0}\n}\n\ntype GetPostRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetPostRequest) Reset() {\n\t*x = GetPostRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostRequest) ProtoMessage() {}\n\nfunc (x *GetPostRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostRequest.ProtoReflect.Descriptor instead.\nfunc (*GetPostRequest) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetPostRequest) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\ntype GetPostResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPost               *Post                   `protobuf:\"bytes,1,opt,name=post,proto3\" json:\"post,omitempty\"`\n\tStr                string                  `protobuf:\"bytes,2,opt,name=str,proto3\" json:\"str,omitempty\"`\n\tUuid               string                  `protobuf:\"bytes,3,opt,name=uuid,proto3\" json:\"uuid,omitempty\"`\n\tLoc                string                  `protobuf:\"bytes,4,opt,name=loc,proto3\" json:\"loc,omitempty\"`\n\tValue1             string                  `protobuf:\"bytes,5,opt,name=value1,proto3\" json:\"value1,omitempty\"`\n\tItemTypeName       string                  `protobuf:\"bytes,6,opt,name=item_type_name,json=itemTypeName,proto3\" json:\"item_type_name,omitempty\"`\n\tLocationTypeName   string                  `protobuf:\"bytes,7,opt,name=location_type_name,json=locationTypeName,proto3\" json:\"location_type_name,omitempty\"`\n\tUserItemTypeName   string                  `protobuf:\"bytes,8,opt,name=user_item_type_name,json=userItemTypeName,proto3\" json:\"user_item_type_name,omitempty\"`\n\tItemTypeValueEnum  Item_ItemType           `protobuf:\"varint,9,opt,name=item_type_value_enum,json=itemTypeValueEnum,proto3,enum=federation.Item_ItemType\" json:\"item_type_value_enum,omitempty\"`\n\tItemTypeValueInt   int32                   `protobuf:\"varint,10,opt,name=item_type_value_int,json=itemTypeValueInt,proto3\" json:\"item_type_value_int,omitempty\"`\n\tItemTypeValueCast  Item_ItemType           `protobuf:\"varint,11,opt,name=item_type_value_cast,json=itemTypeValueCast,proto3,enum=federation.Item_ItemType\" json:\"item_type_value_cast,omitempty\"`\n\tLocationTypeValue  int32                   `protobuf:\"varint,12,opt,name=location_type_value,json=locationTypeValue,proto3\" json:\"location_type_value,omitempty\"`\n\tUserItemTypeValue  int32                   `protobuf:\"varint,13,opt,name=user_item_type_value,json=userItemTypeValue,proto3\" json:\"user_item_type_value,omitempty\"`\n\tA                  *A                      `protobuf:\"bytes,14,opt,name=a,proto3\" json:\"a,omitempty\"`\n\tSortedValues       []int32                 `protobuf:\"varint,15,rep,packed,name=sorted_values,json=sortedValues,proto3\" json:\"sorted_values,omitempty\"`\n\tSortedItems        []*Item                 `protobuf:\"bytes,16,rep,name=sorted_items,json=sortedItems,proto3\" json:\"sorted_items,omitempty\"`\n\tMapValue           map[int32]string        `protobuf:\"bytes,17,rep,name=map_value,json=mapValue,proto3\" json:\"map_value,omitempty\" protobuf_key:\"varint,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\tDoubleWrapperValue *wrapperspb.DoubleValue `protobuf:\"bytes,18,opt,name=double_wrapper_value,json=doubleWrapperValue,proto3\" json:\"double_wrapper_value,omitempty\"`\n\tFloatWrapperValue  *wrapperspb.FloatValue  `protobuf:\"bytes,19,opt,name=float_wrapper_value,json=floatWrapperValue,proto3\" json:\"float_wrapper_value,omitempty\"`\n\tI64WrapperValue    *wrapperspb.Int64Value  `protobuf:\"bytes,20,opt,name=i64_wrapper_value,json=i64WrapperValue,proto3\" json:\"i64_wrapper_value,omitempty\"`\n\tU64WrapperValue    *wrapperspb.UInt64Value `protobuf:\"bytes,21,opt,name=u64_wrapper_value,json=u64WrapperValue,proto3\" json:\"u64_wrapper_value,omitempty\"`\n\tI32WrapperValue    *wrapperspb.Int32Value  `protobuf:\"bytes,22,opt,name=i32_wrapper_value,json=i32WrapperValue,proto3\" json:\"i32_wrapper_value,omitempty\"`\n\tU32WrapperValue    *wrapperspb.UInt32Value `protobuf:\"bytes,23,opt,name=u32_wrapper_value,json=u32WrapperValue,proto3\" json:\"u32_wrapper_value,omitempty\"`\n\tBoolWrapperValue   *wrapperspb.BoolValue   `protobuf:\"bytes,24,opt,name=bool_wrapper_value,json=boolWrapperValue,proto3\" json:\"bool_wrapper_value,omitempty\"`\n\tStringWrapperValue *wrapperspb.StringValue `protobuf:\"bytes,25,opt,name=string_wrapper_value,json=stringWrapperValue,proto3\" json:\"string_wrapper_value,omitempty\"`\n\tBytesWrapperValue  *wrapperspb.BytesValue  `protobuf:\"bytes,26,opt,name=bytes_wrapper_value,json=bytesWrapperValue,proto3\" json:\"bytes_wrapper_value,omitempty\"`\n\tHello              string                  `protobuf:\"bytes,27,opt,name=hello,proto3\" json:\"hello,omitempty\"`\n\tNullTimestamp      *timestamppb.Timestamp  `protobuf:\"bytes,28,opt,name=null_timestamp,json=nullTimestamp,proto3\" json:\"null_timestamp,omitempty\"`\n\tNullTimestamp2     *timestamppb.Timestamp  `protobuf:\"bytes,29,opt,name=null_timestamp2,json=nullTimestamp2,proto3\" json:\"null_timestamp2,omitempty\"`\n\tNullTimestamp3     *timestamppb.Timestamp  `protobuf:\"bytes,30,opt,name=null_timestamp3,json=nullTimestamp3,proto3\" json:\"null_timestamp3,omitempty\"`\n\tJpLoc              string                  `protobuf:\"bytes,31,opt,name=jp_loc,json=jpLoc,proto3\" json:\"jp_loc,omitempty\"`\n\tStringsJoin        string                  `protobuf:\"bytes,32,opt,name=strings_join,json=stringsJoin,proto3\" json:\"strings_join,omitempty\"`\n\tParseFloat         float64                 `protobuf:\"fixed64,33,opt,name=parse_float,json=parseFloat,proto3\" json:\"parse_float,omitempty\"`\n\tUrlUserName        string                  `protobuf:\"bytes,34,opt,name=url_user_name,json=urlUserName,proto3\" json:\"url_user_name,omitempty\"`\n\tEnumValue          Item_ItemType           `protobuf:\"varint,35,opt,name=enum_value,json=enumValue,proto3,enum=federation.Item_ItemType\" json:\"enum_value,omitempty\"`\n\tEnumValueStr       string                  `protobuf:\"bytes,36,opt,name=enum_value_str,json=enumValueStr,proto3\" json:\"enum_value_str,omitempty\"`\n\tSqrtDouble         float64                 `protobuf:\"fixed64,37,opt,name=sqrt_double,json=sqrtDouble,proto3\" json:\"sqrt_double,omitempty\"`\n\tSqrtInt            float64                 `protobuf:\"fixed64,38,opt,name=sqrt_int,json=sqrtInt,proto3\" json:\"sqrt_int,omitempty\"`\n\tPow                float64                 `protobuf:\"fixed64,39,opt,name=pow,proto3\" json:\"pow,omitempty\"`\n\tFloor              float64                 `protobuf:\"fixed64,40,opt,name=floor,proto3\" json:\"floor,omitempty\"`\n\tFlatten            []int64                 `protobuf:\"varint,41,rep,packed,name=flatten,proto3\" json:\"flatten,omitempty\"`\n\tRound              float64                 `protobuf:\"fixed64,42,opt,name=round,proto3\" json:\"round,omitempty\"`\n\tAny                *anypb.Any              `protobuf:\"bytes,43,opt,name=any,proto3\" json:\"any,omitempty\"`\n\tReplaced           string                  `protobuf:\"bytes,44,opt,name=replaced,proto3\" json:\"replaced,omitempty\"`\n\tListToMap          map[int32]int32         `protobuf:\"bytes,45,rep,name=list_to_map,json=listToMap,proto3\" json:\"list_to_map,omitempty\" protobuf_key:\"varint,1,opt,name=key,proto3\" protobuf_val:\"varint,2,opt,name=value,proto3\"`\n\tUuidParse          string                  `protobuf:\"bytes,46,opt,name=uuid_parse,json=uuidParse,proto3\" json:\"uuid_parse,omitempty\"`\n\tUuidValidate       bool                    `protobuf:\"varint,47,opt,name=uuid_validate,json=uuidValidate,proto3\" json:\"uuid_validate,omitempty\"`\n\tCompile            string                  `protobuf:\"bytes,48,opt,name=compile,proto3\" json:\"compile,omitempty\"`\n\tMustCompile        string                  `protobuf:\"bytes,49,opt,name=must_compile,json=mustCompile,proto3\" json:\"must_compile,omitempty\"`\n\tQuoteMeta          string                  `protobuf:\"bytes,50,opt,name=quote_meta,json=quoteMeta,proto3\" json:\"quote_meta,omitempty\"`\n\tFindStringSubmatch []string                `protobuf:\"bytes,51,rep,name=find_string_submatch,json=findStringSubmatch,proto3\" json:\"find_string_submatch,omitempty\"`\n\tMatchString        bool                    `protobuf:\"varint,52,opt,name=match_string,json=matchString,proto3\" json:\"match_string,omitempty\"`\n\tReplaceAllString   string                  `protobuf:\"bytes,53,opt,name=replace_all_string,json=replaceAllString,proto3\" json:\"replace_all_string,omitempty\"`\n}\n\nfunc (x *GetPostResponse) Reset() {\n\t*x = GetPostResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostResponse) ProtoMessage() {}\n\nfunc (x *GetPostResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostResponse.ProtoReflect.Descriptor instead.\nfunc (*GetPostResponse) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetPostResponse) GetPost() *Post {\n\tif x != nil {\n\t\treturn x.Post\n\t}\n\treturn nil\n}\n\nfunc (x *GetPostResponse) GetStr() string {\n\tif x != nil {\n\t\treturn x.Str\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetPostResponse) GetUuid() string {\n\tif x != nil {\n\t\treturn x.Uuid\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetPostResponse) GetLoc() string {\n\tif x != nil {\n\t\treturn x.Loc\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetPostResponse) GetValue1() string {\n\tif x != nil {\n\t\treturn x.Value1\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetPostResponse) GetItemTypeName() string {\n\tif x != nil {\n\t\treturn x.ItemTypeName\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetPostResponse) GetLocationTypeName() string {\n\tif x != nil {\n\t\treturn x.LocationTypeName\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetPostResponse) GetUserItemTypeName() string {\n\tif x != nil {\n\t\treturn x.UserItemTypeName\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetPostResponse) GetItemTypeValueEnum() Item_ItemType {\n\tif x != nil {\n\t\treturn x.ItemTypeValueEnum\n\t}\n\treturn Item_ITEM_TYPE_UNSPECIFIED\n}\n\nfunc (x *GetPostResponse) GetItemTypeValueInt() int32 {\n\tif x != nil {\n\t\treturn x.ItemTypeValueInt\n\t}\n\treturn 0\n}\n\nfunc (x *GetPostResponse) GetItemTypeValueCast() Item_ItemType {\n\tif x != nil {\n\t\treturn x.ItemTypeValueCast\n\t}\n\treturn Item_ITEM_TYPE_UNSPECIFIED\n}\n\nfunc (x *GetPostResponse) GetLocationTypeValue() int32 {\n\tif x != nil {\n\t\treturn x.LocationTypeValue\n\t}\n\treturn 0\n}\n\nfunc (x *GetPostResponse) GetUserItemTypeValue() int32 {\n\tif x != nil {\n\t\treturn x.UserItemTypeValue\n\t}\n\treturn 0\n}\n\nfunc (x *GetPostResponse) GetA() *A {\n\tif x != nil {\n\t\treturn x.A\n\t}\n\treturn nil\n}\n\nfunc (x *GetPostResponse) GetSortedValues() []int32 {\n\tif x != nil {\n\t\treturn x.SortedValues\n\t}\n\treturn nil\n}\n\nfunc (x *GetPostResponse) GetSortedItems() []*Item {\n\tif x != nil {\n\t\treturn x.SortedItems\n\t}\n\treturn nil\n}\n\nfunc (x *GetPostResponse) GetMapValue() map[int32]string {\n\tif x != nil {\n\t\treturn x.MapValue\n\t}\n\treturn nil\n}\n\nfunc (x *GetPostResponse) GetDoubleWrapperValue() *wrapperspb.DoubleValue {\n\tif x != nil {\n\t\treturn x.DoubleWrapperValue\n\t}\n\treturn nil\n}\n\nfunc (x *GetPostResponse) GetFloatWrapperValue() *wrapperspb.FloatValue {\n\tif x != nil {\n\t\treturn x.FloatWrapperValue\n\t}\n\treturn nil\n}\n\nfunc (x *GetPostResponse) GetI64WrapperValue() *wrapperspb.Int64Value {\n\tif x != nil {\n\t\treturn x.I64WrapperValue\n\t}\n\treturn nil\n}\n\nfunc (x *GetPostResponse) GetU64WrapperValue() *wrapperspb.UInt64Value {\n\tif x != nil {\n\t\treturn x.U64WrapperValue\n\t}\n\treturn nil\n}\n\nfunc (x *GetPostResponse) GetI32WrapperValue() *wrapperspb.Int32Value {\n\tif x != nil {\n\t\treturn x.I32WrapperValue\n\t}\n\treturn nil\n}\n\nfunc (x *GetPostResponse) GetU32WrapperValue() *wrapperspb.UInt32Value {\n\tif x != nil {\n\t\treturn x.U32WrapperValue\n\t}\n\treturn nil\n}\n\nfunc (x *GetPostResponse) GetBoolWrapperValue() *wrapperspb.BoolValue {\n\tif x != nil {\n\t\treturn x.BoolWrapperValue\n\t}\n\treturn nil\n}\n\nfunc (x *GetPostResponse) GetStringWrapperValue() *wrapperspb.StringValue {\n\tif x != nil {\n\t\treturn x.StringWrapperValue\n\t}\n\treturn nil\n}\n\nfunc (x *GetPostResponse) GetBytesWrapperValue() *wrapperspb.BytesValue {\n\tif x != nil {\n\t\treturn x.BytesWrapperValue\n\t}\n\treturn nil\n}\n\nfunc (x *GetPostResponse) GetHello() string {\n\tif x != nil {\n\t\treturn x.Hello\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetPostResponse) GetNullTimestamp() *timestamppb.Timestamp {\n\tif x != nil {\n\t\treturn x.NullTimestamp\n\t}\n\treturn nil\n}\n\nfunc (x *GetPostResponse) GetNullTimestamp2() *timestamppb.Timestamp {\n\tif x != nil {\n\t\treturn x.NullTimestamp2\n\t}\n\treturn nil\n}\n\nfunc (x *GetPostResponse) GetNullTimestamp3() *timestamppb.Timestamp {\n\tif x != nil {\n\t\treturn x.NullTimestamp3\n\t}\n\treturn nil\n}\n\nfunc (x *GetPostResponse) GetJpLoc() string {\n\tif x != nil {\n\t\treturn x.JpLoc\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetPostResponse) GetStringsJoin() string {\n\tif x != nil {\n\t\treturn x.StringsJoin\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetPostResponse) GetParseFloat() float64 {\n\tif x != nil {\n\t\treturn x.ParseFloat\n\t}\n\treturn 0\n}\n\nfunc (x *GetPostResponse) GetUrlUserName() string {\n\tif x != nil {\n\t\treturn x.UrlUserName\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetPostResponse) GetEnumValue() Item_ItemType {\n\tif x != nil {\n\t\treturn x.EnumValue\n\t}\n\treturn Item_ITEM_TYPE_UNSPECIFIED\n}\n\nfunc (x *GetPostResponse) GetEnumValueStr() string {\n\tif x != nil {\n\t\treturn x.EnumValueStr\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetPostResponse) GetSqrtDouble() float64 {\n\tif x != nil {\n\t\treturn x.SqrtDouble\n\t}\n\treturn 0\n}\n\nfunc (x *GetPostResponse) GetSqrtInt() float64 {\n\tif x != nil {\n\t\treturn x.SqrtInt\n\t}\n\treturn 0\n}\n\nfunc (x *GetPostResponse) GetPow() float64 {\n\tif x != nil {\n\t\treturn x.Pow\n\t}\n\treturn 0\n}\n\nfunc (x *GetPostResponse) GetFloor() float64 {\n\tif x != nil {\n\t\treturn x.Floor\n\t}\n\treturn 0\n}\n\nfunc (x *GetPostResponse) GetFlatten() []int64 {\n\tif x != nil {\n\t\treturn x.Flatten\n\t}\n\treturn nil\n}\n\nfunc (x *GetPostResponse) GetRound() float64 {\n\tif x != nil {\n\t\treturn x.Round\n\t}\n\treturn 0\n}\n\nfunc (x *GetPostResponse) GetAny() *anypb.Any {\n\tif x != nil {\n\t\treturn x.Any\n\t}\n\treturn nil\n}\n\nfunc (x *GetPostResponse) GetReplaced() string {\n\tif x != nil {\n\t\treturn x.Replaced\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetPostResponse) GetListToMap() map[int32]int32 {\n\tif x != nil {\n\t\treturn x.ListToMap\n\t}\n\treturn nil\n}\n\nfunc (x *GetPostResponse) GetUuidParse() string {\n\tif x != nil {\n\t\treturn x.UuidParse\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetPostResponse) GetUuidValidate() bool {\n\tif x != nil {\n\t\treturn x.UuidValidate\n\t}\n\treturn false\n}\n\nfunc (x *GetPostResponse) GetCompile() string {\n\tif x != nil {\n\t\treturn x.Compile\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetPostResponse) GetMustCompile() string {\n\tif x != nil {\n\t\treturn x.MustCompile\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetPostResponse) GetQuoteMeta() string {\n\tif x != nil {\n\t\treturn x.QuoteMeta\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetPostResponse) GetFindStringSubmatch() []string {\n\tif x != nil {\n\t\treturn x.FindStringSubmatch\n\t}\n\treturn nil\n}\n\nfunc (x *GetPostResponse) GetMatchString() bool {\n\tif x != nil {\n\t\treturn x.MatchString\n\t}\n\treturn false\n}\n\nfunc (x *GetPostResponse) GetReplaceAllString() string {\n\tif x != nil {\n\t\treturn x.ReplaceAllString\n\t}\n\treturn \"\"\n}\n\ntype A struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tB *A_B `protobuf:\"bytes,1,opt,name=b,proto3\" json:\"b,omitempty\"`\n\t// Types that are assignable to Opt:\n\t//\n\t//\t*A_OptC\n\tOpt isA_Opt `protobuf_oneof:\"opt\"`\n}\n\nfunc (x *A) Reset() {\n\t*x = A{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *A) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*A) ProtoMessage() {}\n\nfunc (x *A) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use A.ProtoReflect.Descriptor instead.\nfunc (*A) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *A) GetB() *A_B {\n\tif x != nil {\n\t\treturn x.B\n\t}\n\treturn nil\n}\n\nfunc (m *A) GetOpt() isA_Opt {\n\tif m != nil {\n\t\treturn m.Opt\n\t}\n\treturn nil\n}\n\nfunc (x *A) GetOptC() *A_B_C {\n\tif x, ok := x.GetOpt().(*A_OptC); ok {\n\t\treturn x.OptC\n\t}\n\treturn nil\n}\n\ntype isA_Opt interface {\n\tisA_Opt()\n}\n\ntype A_OptC struct {\n\tOptC *A_B_C `protobuf:\"bytes,2,opt,name=opt_c,json=optC,proto3,oneof\"`\n}\n\nfunc (*A_OptC) isA_Opt() {}\n\ntype Post struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId      string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tTitle   string `protobuf:\"bytes,2,opt,name=title,proto3\" json:\"title,omitempty\"`\n\tContent string `protobuf:\"bytes,3,opt,name=content,proto3\" json:\"content,omitempty\"`\n\tUser    *User  `protobuf:\"bytes,4,opt,name=user,proto3\" json:\"user,omitempty\"`\n}\n\nfunc (x *Post) Reset() {\n\t*x = Post{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Post) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Post) ProtoMessage() {}\n\nfunc (x *Post) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Post.ProtoReflect.Descriptor instead.\nfunc (*Post) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *Post) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetTitle() string {\n\tif x != nil {\n\t\treturn x.Title\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetContent() string {\n\tif x != nil {\n\t\treturn x.Content\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetUser() *User {\n\tif x != nil {\n\t\treturn x.User\n\t}\n\treturn nil\n}\n\ntype User struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId      string                `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName    string                `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tItems   []*Item               `protobuf:\"bytes,3,rep,name=items,proto3\" json:\"items,omitempty\"`\n\tProfile map[string]*anypb.Any `protobuf:\"bytes,4,rep,name=profile,proto3\" json:\"profile,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\t// Types that are assignable to Attr:\n\t//\n\t//\t*User_AttrA_\n\t//\t*User_B\n\tAttr isUser_Attr `protobuf_oneof:\"attr\"`\n}\n\nfunc (x *User) Reset() {\n\t*x = User{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *User) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*User) ProtoMessage() {}\n\nfunc (x *User) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use User.ProtoReflect.Descriptor instead.\nfunc (*User) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *User) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *User) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *User) GetItems() []*Item {\n\tif x != nil {\n\t\treturn x.Items\n\t}\n\treturn nil\n}\n\nfunc (x *User) GetProfile() map[string]*anypb.Any {\n\tif x != nil {\n\t\treturn x.Profile\n\t}\n\treturn nil\n}\n\nfunc (m *User) GetAttr() isUser_Attr {\n\tif m != nil {\n\t\treturn m.Attr\n\t}\n\treturn nil\n}\n\nfunc (x *User) GetAttrA() *User_AttrA {\n\tif x, ok := x.GetAttr().(*User_AttrA_); ok {\n\t\treturn x.AttrA\n\t}\n\treturn nil\n}\n\nfunc (x *User) GetB() *User_AttrB {\n\tif x, ok := x.GetAttr().(*User_B); ok {\n\t\treturn x.B\n\t}\n\treturn nil\n}\n\ntype isUser_Attr interface {\n\tisUser_Attr()\n}\n\ntype User_AttrA_ struct {\n\tAttrA *User_AttrA `protobuf:\"bytes,5,opt,name=attr_a,json=attrA,proto3,oneof\"`\n}\n\ntype User_B struct {\n\tB *User_AttrB `protobuf:\"bytes,6,opt,name=b,proto3,oneof\"`\n}\n\nfunc (*User_AttrA_) isUser_Attr() {}\n\nfunc (*User_B) isUser_Attr() {}\n\ntype Item struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName     string         `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tType     Item_ItemType  `protobuf:\"varint,2,opt,name=type,proto3,enum=federation.Item_ItemType\" json:\"type,omitempty\"`\n\tValue    int64          `protobuf:\"varint,3,opt,name=value,proto3\" json:\"value,omitempty\"`\n\tLocation *Item_Location `protobuf:\"bytes,4,opt,name=location,proto3\" json:\"location,omitempty\"`\n}\n\nfunc (x *Item) Reset() {\n\t*x = Item{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Item) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Item) ProtoMessage() {}\n\nfunc (x *Item) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Item.ProtoReflect.Descriptor instead.\nfunc (*Item) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *Item) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Item) GetType() Item_ItemType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn Item_ITEM_TYPE_UNSPECIFIED\n}\n\nfunc (x *Item) GetValue() int64 {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn 0\n}\n\nfunc (x *Item) GetLocation() *Item_Location {\n\tif x != nil {\n\t\treturn x.Location\n\t}\n\treturn nil\n}\n\ntype A_B struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tFoo *A_B_C `protobuf:\"bytes,1,opt,name=foo,proto3\" json:\"foo,omitempty\"`\n\tBar *A_B_C `protobuf:\"bytes,2,opt,name=bar,proto3\" json:\"bar,omitempty\"`\n}\n\nfunc (x *A_B) Reset() {\n\t*x = A_B{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *A_B) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*A_B) ProtoMessage() {}\n\nfunc (x *A_B) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use A_B.ProtoReflect.Descriptor instead.\nfunc (*A_B) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{2, 0}\n}\n\nfunc (x *A_B) GetFoo() *A_B_C {\n\tif x != nil {\n\t\treturn x.Foo\n\t}\n\treturn nil\n}\n\nfunc (x *A_B) GetBar() *A_B_C {\n\tif x != nil {\n\t\treturn x.Bar\n\t}\n\treturn nil\n}\n\ntype A_B_C struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tType string `protobuf:\"bytes,1,opt,name=type,proto3\" json:\"type,omitempty\"`\n}\n\nfunc (x *A_B_C) Reset() {\n\t*x = A_B_C{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *A_B_C) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*A_B_C) ProtoMessage() {}\n\nfunc (x *A_B_C) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use A_B_C.ProtoReflect.Descriptor instead.\nfunc (*A_B_C) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{2, 0, 0}\n}\n\nfunc (x *A_B_C) GetType() string {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn \"\"\n}\n\ntype User_AttrA struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tFoo string `protobuf:\"bytes,1,opt,name=foo,proto3\" json:\"foo,omitempty\"`\n}\n\nfunc (x *User_AttrA) Reset() {\n\t*x = User_AttrA{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[11]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *User_AttrA) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*User_AttrA) ProtoMessage() {}\n\nfunc (x *User_AttrA) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[11]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use User_AttrA.ProtoReflect.Descriptor instead.\nfunc (*User_AttrA) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{4, 1}\n}\n\nfunc (x *User_AttrA) GetFoo() string {\n\tif x != nil {\n\t\treturn x.Foo\n\t}\n\treturn \"\"\n}\n\ntype User_AttrB struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tBar bool `protobuf:\"varint,2,opt,name=bar,proto3\" json:\"bar,omitempty\"`\n}\n\nfunc (x *User_AttrB) Reset() {\n\t*x = User_AttrB{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[12]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *User_AttrB) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*User_AttrB) ProtoMessage() {}\n\nfunc (x *User_AttrB) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[12]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use User_AttrB.ProtoReflect.Descriptor instead.\nfunc (*User_AttrB) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{4, 2}\n}\n\nfunc (x *User_AttrB) GetBar() bool {\n\tif x != nil {\n\t\treturn x.Bar\n\t}\n\treturn false\n}\n\ntype Item_Location struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tAddr1 string `protobuf:\"bytes,1,opt,name=addr1,proto3\" json:\"addr1,omitempty\"`\n\tAddr2 string `protobuf:\"bytes,2,opt,name=addr2,proto3\" json:\"addr2,omitempty\"`\n\t// Types that are assignable to Addr3:\n\t//\n\t//\t*Item_Location_AddrA_\n\t//\t*Item_Location_B\n\t//\t*Item_Location_C\n\tAddr3 isItem_Location_Addr3 `protobuf_oneof:\"addr3\"`\n}\n\nfunc (x *Item_Location) Reset() {\n\t*x = Item_Location{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[13]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Item_Location) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Item_Location) ProtoMessage() {}\n\nfunc (x *Item_Location) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[13]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Item_Location.ProtoReflect.Descriptor instead.\nfunc (*Item_Location) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{5, 0}\n}\n\nfunc (x *Item_Location) GetAddr1() string {\n\tif x != nil {\n\t\treturn x.Addr1\n\t}\n\treturn \"\"\n}\n\nfunc (x *Item_Location) GetAddr2() string {\n\tif x != nil {\n\t\treturn x.Addr2\n\t}\n\treturn \"\"\n}\n\nfunc (m *Item_Location) GetAddr3() isItem_Location_Addr3 {\n\tif m != nil {\n\t\treturn m.Addr3\n\t}\n\treturn nil\n}\n\nfunc (x *Item_Location) GetAddrA() *Item_Location_AddrA {\n\tif x, ok := x.GetAddr3().(*Item_Location_AddrA_); ok {\n\t\treturn x.AddrA\n\t}\n\treturn nil\n}\n\nfunc (x *Item_Location) GetB() *Item_Location_AddrB {\n\tif x, ok := x.GetAddr3().(*Item_Location_B); ok {\n\t\treturn x.B\n\t}\n\treturn nil\n}\n\nfunc (x *Item_Location) GetC() string {\n\tif x, ok := x.GetAddr3().(*Item_Location_C); ok {\n\t\treturn x.C\n\t}\n\treturn \"\"\n}\n\ntype isItem_Location_Addr3 interface {\n\tisItem_Location_Addr3()\n}\n\ntype Item_Location_AddrA_ struct {\n\tAddrA *Item_Location_AddrA `protobuf:\"bytes,3,opt,name=addr_a,json=addrA,proto3,oneof\"`\n}\n\ntype Item_Location_B struct {\n\tB *Item_Location_AddrB `protobuf:\"bytes,4,opt,name=b,proto3,oneof\"`\n}\n\ntype Item_Location_C struct {\n\tC string `protobuf:\"bytes,5,opt,name=c,proto3,oneof\"`\n}\n\nfunc (*Item_Location_AddrA_) isItem_Location_Addr3() {}\n\nfunc (*Item_Location_B) isItem_Location_Addr3() {}\n\nfunc (*Item_Location_C) isItem_Location_Addr3() {}\n\ntype Item_Location_AddrA struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tFoo string `protobuf:\"bytes,1,opt,name=foo,proto3\" json:\"foo,omitempty\"`\n}\n\nfunc (x *Item_Location_AddrA) Reset() {\n\t*x = Item_Location_AddrA{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[14]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Item_Location_AddrA) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Item_Location_AddrA) ProtoMessage() {}\n\nfunc (x *Item_Location_AddrA) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[14]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Item_Location_AddrA.ProtoReflect.Descriptor instead.\nfunc (*Item_Location_AddrA) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{5, 0, 0}\n}\n\nfunc (x *Item_Location_AddrA) GetFoo() string {\n\tif x != nil {\n\t\treturn x.Foo\n\t}\n\treturn \"\"\n}\n\ntype Item_Location_AddrB struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tBar int64 `protobuf:\"varint,1,opt,name=bar,proto3\" json:\"bar,omitempty\"`\n}\n\nfunc (x *Item_Location_AddrB) Reset() {\n\t*x = Item_Location_AddrB{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[15]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Item_Location_AddrB) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Item_Location_AddrB) ProtoMessage() {}\n\nfunc (x *Item_Location_AddrB) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[15]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Item_Location_AddrB.ProtoReflect.Descriptor instead.\nfunc (*Item_Location_AddrB) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{5, 0, 1}\n}\n\nfunc (x *Item_Location_AddrB) GetBar() int64 {\n\tif x != nil {\n\t\treturn x.Bar\n\t}\n\treturn 0\n}\n\nvar File_federation_federation_proto protoreflect.FileDescriptor\n\nvar file_federation_federation_proto_rawDesc = []byte{\n\t0x0a, 0x1b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x20, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x6f,\n\t0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0xd8, 0x31, 0x0a, 0x0f, 0x47, 0x65,\n\t0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a,\n\t0x04, 0x70, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x42, 0x09, 0x9a,\n\t0x4a, 0x06, 0x12, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x52, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x12, 0x1e,\n\t0x0a, 0x03, 0x73, 0x74, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0x9a, 0x4a, 0x09,\n\t0x12, 0x07, 0x27, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x27, 0x52, 0x03, 0x73, 0x74, 0x72, 0x12, 0x26,\n\t0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x12, 0x9a, 0x4a,\n\t0x0f, 0x12, 0x0d, 0x75, 0x75, 0x69, 0x64, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29,\n\t0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x23, 0x0a, 0x03, 0x6c, 0x6f, 0x63, 0x18, 0x04, 0x20,\n\t0x01, 0x28, 0x09, 0x42, 0x11, 0x9a, 0x4a, 0x0e, 0x12, 0x0c, 0x6c, 0x6f, 0x63, 0x2e, 0x73, 0x74,\n\t0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x52, 0x03, 0x6c, 0x6f, 0x63, 0x12, 0x23, 0x0a, 0x06, 0x76,\n\t0x61, 0x6c, 0x75, 0x65, 0x31, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0x9a, 0x4a, 0x08,\n\t0x12, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x31, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x31,\n\t0x12, 0x58, 0x0a, 0x0e, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61,\n\t0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x32, 0x9a, 0x4a, 0x2f, 0x12, 0x2d, 0x49,\n\t0x74, 0x65, 0x6d, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x6e, 0x61, 0x6d,\n\t0x65, 0x28, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x2e,\n\t0x49, 0x54, 0x45, 0x4d, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x31, 0x29, 0x52, 0x0c, 0x69, 0x74,\n\t0x65, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x7e, 0x0a, 0x12, 0x6c, 0x6f,\n\t0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65,\n\t0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x50, 0x9a, 0x4a, 0x4d, 0x12, 0x4b, 0x49, 0x74, 0x65,\n\t0x6d, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x49, 0x74, 0x65,\n\t0x6d, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x4c, 0x4f, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e,\n\t0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x31, 0x29, 0x52, 0x10, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x6b, 0x0a, 0x13, 0x75, 0x73,\n\t0x65, 0x72, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d,\n\t0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3c, 0x9a, 0x4a, 0x39, 0x12, 0x37, 0x75, 0x73,\n\t0x65, 0x72, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65,\n\t0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x2e,\n\t0x49, 0x74, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x49, 0x54, 0x45, 0x4d, 0x5f, 0x54, 0x59,\n\t0x50, 0x45, 0x5f, 0x32, 0x29, 0x52, 0x10, 0x75, 0x73, 0x65, 0x72, 0x49, 0x74, 0x65, 0x6d, 0x54,\n\t0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x78, 0x0a, 0x14, 0x69, 0x74, 0x65, 0x6d, 0x5f,\n\t0x74, 0x79, 0x70, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x18,\n\t0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65,\n\t0x42, 0x2c, 0x9a, 0x4a, 0x29, 0x12, 0x27, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x49, 0x74, 0x65, 0x6d,\n\t0x2e, 0x49, 0x74, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28,\n\t0x27, 0x49, 0x54, 0x45, 0x4d, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x31, 0x27, 0x29, 0x52, 0x11,\n\t0x69, 0x74, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x45, 0x6e, 0x75,\n\t0x6d, 0x12, 0x5b, 0x0a, 0x13, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x76,\n\t0x61, 0x6c, 0x75, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x42, 0x2c,\n\t0x9a, 0x4a, 0x29, 0x12, 0x27, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x49,\n\t0x74, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x27, 0x49,\n\t0x54, 0x45, 0x4d, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x31, 0x27, 0x29, 0x52, 0x10, 0x69, 0x74,\n\t0x65, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x49, 0x6e, 0x74, 0x12, 0x6b,\n\t0x0a, 0x14, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75,\n\t0x65, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x49,\n\t0x74, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x42, 0x1f, 0x9a, 0x4a, 0x1c, 0x12, 0x1a, 0x75, 0x73,\n\t0x65, 0x72, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65,\n\t0x2e, 0x66, 0x72, 0x6f, 0x6d, 0x28, 0x31, 0x29, 0x52, 0x11, 0x69, 0x74, 0x65, 0x6d, 0x54, 0x79,\n\t0x70, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x43, 0x61, 0x73, 0x74, 0x12, 0x68, 0x0a, 0x13, 0x6c,\n\t0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x76, 0x61, 0x6c,\n\t0x75, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x42, 0x38, 0x9a, 0x4a, 0x35, 0x12, 0x33, 0x49,\n\t0x74, 0x65, 0x6d, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4c, 0x6f, 0x63,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28,\n\t0x27, 0x4c, 0x4f, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x31,\n\t0x27, 0x29, 0x52, 0x11, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65,\n\t0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x5d, 0x0a, 0x14, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x74,\n\t0x65, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x0d, 0x20,\n\t0x01, 0x28, 0x05, 0x42, 0x2c, 0x9a, 0x4a, 0x29, 0x12, 0x27, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x49,\n\t0x74, 0x65, 0x6d, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x61, 0x6c,\n\t0x75, 0x65, 0x28, 0x27, 0x49, 0x54, 0x45, 0x4d, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x32, 0x27,\n\t0x29, 0x52, 0x11, 0x75, 0x73, 0x65, 0x72, 0x49, 0x74, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x56,\n\t0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x01, 0x61, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x0d, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x41, 0x42, 0x06,\n\t0x9a, 0x4a, 0x03, 0x12, 0x01, 0x61, 0x52, 0x01, 0x61, 0x12, 0x37, 0x0a, 0x0d, 0x73, 0x6f, 0x72,\n\t0x74, 0x65, 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x05,\n\t0x42, 0x12, 0x9a, 0x4a, 0x0f, 0x12, 0x0d, 0x73, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x76, 0x61,\n\t0x6c, 0x75, 0x65, 0x73, 0x52, 0x0c, 0x73, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75,\n\t0x65, 0x73, 0x12, 0x46, 0x0a, 0x0c, 0x73, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x69, 0x74, 0x65,\n\t0x6d, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x42, 0x11, 0x9a, 0x4a, 0x0e, 0x12,\n\t0x0c, 0x73, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x52, 0x0b, 0x73,\n\t0x6f, 0x72, 0x74, 0x65, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x56, 0x0a, 0x09, 0x6d, 0x61,\n\t0x70, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f,\n\t0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x61, 0x70, 0x56, 0x61,\n\t0x6c, 0x75, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x0e, 0x9a, 0x4a, 0x0b, 0x12, 0x09, 0x6d,\n\t0x61, 0x70, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6d, 0x61, 0x70, 0x56, 0x61, 0x6c,\n\t0x75, 0x65, 0x12, 0x7d, 0x0a, 0x14, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x77, 0x72, 0x61,\n\t0x70, 0x70, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,\n\t0x75, 0x66, 0x2e, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x2d,\n\t0x9a, 0x4a, 0x2a, 0x12, 0x28, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65,\n\t0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x20, 0x31, 0x2e, 0x32, 0x33, 0x7d, 0x52, 0x12, 0x64,\n\t0x6f, 0x75, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75,\n\t0x65, 0x12, 0x79, 0x0a, 0x13, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70,\n\t0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,\n\t0x2e, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x2c, 0x9a, 0x4a, 0x29,\n\t0x12, 0x27, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x7b, 0x76, 0x61, 0x6c,\n\t0x75, 0x65, 0x3a, 0x20, 0x33, 0x2e, 0x34, 0x35, 0x7d, 0x52, 0x11, 0x66, 0x6c, 0x6f, 0x61, 0x74,\n\t0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x72, 0x0a, 0x11,\n\t0x69, 0x36, 0x34, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75,\n\t0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56,\n\t0x61, 0x6c, 0x75, 0x65, 0x42, 0x29, 0x9a, 0x4a, 0x26, 0x12, 0x24, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34,\n\t0x56, 0x61, 0x6c, 0x75, 0x65, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x20, 0x31, 0x7d, 0x52,\n\t0x0f, 0x69, 0x36, 0x34, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65,\n\t0x12, 0x7a, 0x0a, 0x11, 0x75, 0x36, 0x34, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x5f,\n\t0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49,\n\t0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x30, 0x9a, 0x4a, 0x2d, 0x12, 0x2b,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,\n\t0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x7b, 0x76, 0x61, 0x6c, 0x75,\n\t0x65, 0x3a, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x32, 0x29, 0x7d, 0x52, 0x0f, 0x75, 0x36, 0x34,\n\t0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x72, 0x0a, 0x11,\n\t0x69, 0x33, 0x32, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75,\n\t0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56,\n\t0x61, 0x6c, 0x75, 0x65, 0x42, 0x29, 0x9a, 0x4a, 0x26, 0x12, 0x24, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32,\n\t0x56, 0x61, 0x6c, 0x75, 0x65, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x20, 0x33, 0x7d, 0x52,\n\t0x0f, 0x69, 0x33, 0x32, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65,\n\t0x12, 0x7a, 0x0a, 0x11, 0x75, 0x33, 0x32, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x5f,\n\t0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49,\n\t0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x30, 0x9a, 0x4a, 0x2d, 0x12, 0x2b,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,\n\t0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x7b, 0x76, 0x61, 0x6c, 0x75,\n\t0x65, 0x3a, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x34, 0x29, 0x7d, 0x52, 0x0f, 0x75, 0x33, 0x32,\n\t0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x75, 0x0a, 0x12,\n\t0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c,\n\t0x75, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56,\n\t0x61, 0x6c, 0x75, 0x65, 0x42, 0x2b, 0x9a, 0x4a, 0x28, 0x12, 0x26, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56,\n\t0x61, 0x6c, 0x75, 0x65, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65,\n\t0x7d, 0x52, 0x10, 0x62, 0x6f, 0x6f, 0x6c, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x56, 0x61,\n\t0x6c, 0x75, 0x65, 0x12, 0x80, 0x01, 0x0a, 0x14, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x77,\n\t0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x19, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65,\n\t0x42, 0x30, 0x9a, 0x4a, 0x2d, 0x12, 0x2b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c,\n\t0x75, 0x65, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x20, 0x27, 0x68, 0x65, 0x6c, 0x6c, 0x6f,\n\t0x27, 0x7d, 0x52, 0x12, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65,\n\t0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x83, 0x01, 0x0a, 0x13, 0x62, 0x79, 0x74, 0x65, 0x73,\n\t0x5f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x1a,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x79, 0x74, 0x65, 0x73, 0x56, 0x61, 0x6c, 0x75,\n\t0x65, 0x42, 0x36, 0x9a, 0x4a, 0x33, 0x12, 0x31, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x79, 0x74, 0x65, 0x73, 0x56, 0x61, 0x6c,\n\t0x75, 0x65, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x28,\n\t0x27, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x27, 0x29, 0x7d, 0x52, 0x11, 0x62, 0x79, 0x74, 0x65, 0x73,\n\t0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x29, 0x0a, 0x05,\n\t0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x09, 0x42, 0x13, 0x9a, 0x4a, 0x10,\n\t0x12, 0x0e, 0x27, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x5c, 0x6e, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x27,\n\t0x52, 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x12, 0x4c, 0x0a, 0x0e, 0x6e, 0x75, 0x6c, 0x6c, 0x5f,\n\t0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x09, 0x9a, 0x4a, 0x06,\n\t0x12, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x52, 0x0d, 0x6e, 0x75, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65,\n\t0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x54, 0x0a, 0x0f, 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x74, 0x69,\n\t0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x32, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,\n\t0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x0f, 0x9a, 0x4a, 0x0c, 0x12,\n\t0x0a, 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0e, 0x6e, 0x75, 0x6c,\n\t0x6c, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x32, 0x12, 0x73, 0x0a, 0x0f, 0x6e,\n\t0x75, 0x6c, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x33, 0x18, 0x1e,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,\n\t0x42, 0x2e, 0x9a, 0x4a, 0x2b, 0x12, 0x29, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3f, 0x20, 0x6e, 0x75,\n\t0x6c, 0x6c, 0x20, 0x3a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x7b, 0x7d,\n\t0x52, 0x0e, 0x6e, 0x75, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x33,\n\t0x12, 0x37, 0x0a, 0x06, 0x6a, 0x70, 0x5f, 0x6c, 0x6f, 0x63, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09,\n\t0x42, 0x20, 0x9a, 0x4a, 0x1d, 0x12, 0x1b, 0x6a, 0x70, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x6c,\n\t0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,\n\t0x28, 0x29, 0x52, 0x05, 0x6a, 0x70, 0x4c, 0x6f, 0x63, 0x12, 0x34, 0x0a, 0x0c, 0x73, 0x74, 0x72,\n\t0x69, 0x6e, 0x67, 0x73, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x18, 0x20, 0x20, 0x01, 0x28, 0x09, 0x42,\n\t0x11, 0x9a, 0x4a, 0x0e, 0x12, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x5f, 0x6a, 0x6f,\n\t0x69, 0x6e, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x4a, 0x6f, 0x69, 0x6e, 0x12,\n\t0x31, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x18, 0x21,\n\t0x20, 0x01, 0x28, 0x01, 0x42, 0x10, 0x9a, 0x4a, 0x0d, 0x12, 0x0b, 0x70, 0x61, 0x72, 0x73, 0x65,\n\t0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x73, 0x65, 0x46, 0x6c, 0x6f,\n\t0x61, 0x74, 0x12, 0x42, 0x0a, 0x0d, 0x75, 0x72, 0x6c, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e,\n\t0x61, 0x6d, 0x65, 0x18, 0x22, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1e, 0x9a, 0x4a, 0x1b, 0x12, 0x19,\n\t0x75, 0x72, 0x6c, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x28, 0x29, 0x2e, 0x75,\n\t0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x29, 0x52, 0x0b, 0x75, 0x72, 0x6c, 0x55, 0x73,\n\t0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x40, 0x0a, 0x0a, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x76,\n\t0x61, 0x6c, 0x75, 0x65, 0x18, 0x23, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x49, 0x74, 0x65,\n\t0x6d, 0x54, 0x79, 0x70, 0x65, 0x42, 0x06, 0x9a, 0x4a, 0x03, 0x12, 0x01, 0x65, 0x52, 0x09, 0x65,\n\t0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x46, 0x0a, 0x0e, 0x65, 0x6e, 0x75, 0x6d,\n\t0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x24, 0x20, 0x01, 0x28, 0x09,\n\t0x42, 0x20, 0x9a, 0x4a, 0x1d, 0x12, 0x1b, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x49, 0x74, 0x65, 0x6d,\n\t0x54, 0x79, 0x70, 0x65, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x65, 0x2c, 0x20, 0x27, 0x65, 0x6e,\n\t0x27, 0x29, 0x52, 0x0c, 0x65, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x53, 0x74, 0x72,\n\t0x12, 0x31, 0x0a, 0x0b, 0x73, 0x71, 0x72, 0x74, 0x5f, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x18,\n\t0x25, 0x20, 0x01, 0x28, 0x01, 0x42, 0x10, 0x9a, 0x4a, 0x0d, 0x12, 0x0b, 0x73, 0x71, 0x72, 0x74,\n\t0x5f, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x52, 0x0a, 0x73, 0x71, 0x72, 0x74, 0x44, 0x6f, 0x75,\n\t0x62, 0x6c, 0x65, 0x12, 0x28, 0x0a, 0x08, 0x73, 0x71, 0x72, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x18,\n\t0x26, 0x20, 0x01, 0x28, 0x01, 0x42, 0x0d, 0x9a, 0x4a, 0x0a, 0x12, 0x08, 0x73, 0x71, 0x72, 0x74,\n\t0x5f, 0x69, 0x6e, 0x74, 0x52, 0x07, 0x73, 0x71, 0x72, 0x74, 0x49, 0x6e, 0x74, 0x12, 0x1a, 0x0a,\n\t0x03, 0x70, 0x6f, 0x77, 0x18, 0x27, 0x20, 0x01, 0x28, 0x01, 0x42, 0x08, 0x9a, 0x4a, 0x05, 0x12,\n\t0x03, 0x70, 0x6f, 0x77, 0x52, 0x03, 0x70, 0x6f, 0x77, 0x12, 0x20, 0x0a, 0x05, 0x66, 0x6c, 0x6f,\n\t0x6f, 0x72, 0x18, 0x28, 0x20, 0x01, 0x28, 0x01, 0x42, 0x0a, 0x9a, 0x4a, 0x07, 0x12, 0x05, 0x66,\n\t0x6c, 0x6f, 0x6f, 0x72, 0x52, 0x05, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x12, 0x26, 0x0a, 0x07, 0x66,\n\t0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x18, 0x29, 0x20, 0x03, 0x28, 0x03, 0x42, 0x0c, 0x9a, 0x4a,\n\t0x09, 0x12, 0x07, 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x52, 0x07, 0x66, 0x6c, 0x61, 0x74,\n\t0x74, 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x05, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x2a, 0x20, 0x01,\n\t0x28, 0x01, 0x42, 0x0a, 0x9a, 0x4a, 0x07, 0x12, 0x05, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x05,\n\t0x72, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x30, 0x0a, 0x03, 0x61, 0x6e, 0x79, 0x18, 0x2b, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x42, 0x08, 0x9a, 0x4a, 0x05, 0x12, 0x03, 0x61,\n\t0x6e, 0x79, 0x52, 0x03, 0x61, 0x6e, 0x79, 0x12, 0x29, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x61,\n\t0x63, 0x65, 0x64, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0d, 0x9a, 0x4a, 0x0a, 0x12, 0x08,\n\t0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x64, 0x52, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63,\n\t0x65, 0x64, 0x12, 0x5c, 0x0a, 0x0b, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61,\n\t0x70, 0x18, 0x2d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70,\n\t0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x4d, 0x61, 0x70, 0x45, 0x6e,\n\t0x74, 0x72, 0x79, 0x42, 0x10, 0x9a, 0x4a, 0x0d, 0x12, 0x0b, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x74,\n\t0x6f, 0x5f, 0x6d, 0x61, 0x70, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x4d, 0x61, 0x70,\n\t0x12, 0x37, 0x0a, 0x0a, 0x75, 0x75, 0x69, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x65, 0x18, 0x2e,\n\t0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0x9a, 0x4a, 0x15, 0x12, 0x13, 0x75, 0x75, 0x69, 0x64, 0x5f,\n\t0x70, 0x61, 0x72, 0x73, 0x65, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x52, 0x09,\n\t0x75, 0x75, 0x69, 0x64, 0x50, 0x61, 0x72, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0d, 0x75, 0x75, 0x69,\n\t0x64, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x08,\n\t0x42, 0x12, 0x9a, 0x4a, 0x0f, 0x12, 0x0d, 0x75, 0x75, 0x69, 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x69,\n\t0x64, 0x61, 0x74, 0x65, 0x52, 0x0c, 0x75, 0x75, 0x69, 0x64, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61,\n\t0x74, 0x65, 0x12, 0x2f, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x18, 0x30, 0x20,\n\t0x01, 0x28, 0x09, 0x42, 0x15, 0x9a, 0x4a, 0x12, 0x12, 0x10, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c,\n\t0x65, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x70,\n\t0x69, 0x6c, 0x65, 0x12, 0x3d, 0x0a, 0x0c, 0x6d, 0x75, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70,\n\t0x69, 0x6c, 0x65, 0x18, 0x31, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1a, 0x9a, 0x4a, 0x17, 0x12, 0x15,\n\t0x6d, 0x75, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x72,\n\t0x69, 0x6e, 0x67, 0x28, 0x29, 0x52, 0x0b, 0x6d, 0x75, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x69,\n\t0x6c, 0x65, 0x12, 0x2e, 0x0a, 0x0a, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61,\n\t0x18, 0x32, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0f, 0x9a, 0x4a, 0x0c, 0x12, 0x0a, 0x71, 0x75, 0x6f,\n\t0x74, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x52, 0x09, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x4d, 0x65,\n\t0x74, 0x61, 0x12, 0x4b, 0x0a, 0x14, 0x66, 0x69, 0x6e, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e,\n\t0x67, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x33, 0x20, 0x03, 0x28, 0x09,\n\t0x42, 0x19, 0x9a, 0x4a, 0x16, 0x12, 0x14, 0x66, 0x69, 0x6e, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x69,\n\t0x6e, 0x67, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x12, 0x66, 0x69, 0x6e,\n\t0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x75, 0x62, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x12,\n\t0x34, 0x0a, 0x0c, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18,\n\t0x34, 0x20, 0x01, 0x28, 0x08, 0x42, 0x11, 0x9a, 0x4a, 0x0e, 0x12, 0x0c, 0x6d, 0x61, 0x74, 0x63,\n\t0x68, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x53,\n\t0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x45, 0x0a, 0x12, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65,\n\t0x5f, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x35, 0x20, 0x01, 0x28,\n\t0x09, 0x42, 0x17, 0x9a, 0x4a, 0x14, 0x12, 0x12, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f,\n\t0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x10, 0x72, 0x65, 0x70, 0x6c,\n\t0x61, 0x63, 0x65, 0x41, 0x6c, 0x6c, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x1a, 0x3b, 0x0a, 0x0d,\n\t0x4d, 0x61, 0x70, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a,\n\t0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12,\n\t0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,\n\t0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3c, 0x0a, 0x0e, 0x4c, 0x69, 0x73,\n\t0x74, 0x54, 0x6f, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b,\n\t0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a,\n\t0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61,\n\t0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x3a, 0xaa, 0x11, 0x9a, 0x4a, 0xa6, 0x11, 0x0a, 0x1a,\n\t0x0a, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x6a, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x73, 0x74, 0x12, 0x0a,\n\t0x0a, 0x02, 0x69, 0x64, 0x12, 0x04, 0x24, 0x2e, 0x69, 0x64, 0x0a, 0x53, 0x0a, 0x0c, 0x73, 0x74,\n\t0x72, 0x69, 0x6e, 0x67, 0x73, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x5a, 0x43, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x73, 0x74, 0x72, 0x69,\n\t0x6e, 0x67, 0x73, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x5b, 0x27, 0x31, 0x32, 0x33, 0x34, 0x35,\n\t0x36, 0x37, 0x27, 0x2e, 0x73, 0x75, 0x62, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x31, 0x2c,\n\t0x20, 0x33, 0x29, 0x2c, 0x20, 0x27, 0x32, 0x27, 0x5d, 0x2c, 0x20, 0x27, 0x2e, 0x27, 0x29, 0x0a,\n\t0x43, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5a, 0x34,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x46, 0x6c, 0x6f,\n\t0x61, 0x74, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x2c,\n\t0x20, 0x36, 0x34, 0x29, 0x0a, 0x4f, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x5a, 0x48, 0x67, 0x72, 0x70,\n\t0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x75, 0x72, 0x6c,\n\t0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x27, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f,\n\t0x74, 0x65, 0x73, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f,\n\t0x72, 0x64, 0x40, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70,\n\t0x61, 0x74, 0x68, 0x27, 0x29, 0x0a, 0x59, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x65, 0x5a, 0x51, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x74,\n\t0x69, 0x6d, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x65, 0x28, 0x32, 0x30, 0x32, 0x33, 0x2c, 0x20, 0x31,\n\t0x32, 0x2c, 0x20, 0x32, 0x35, 0x2c, 0x20, 0x31, 0x32, 0x2c, 0x20, 0x31, 0x30, 0x2c, 0x20, 0x35,\n\t0x2c, 0x20, 0x30, 0x2c, 0x20, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x54, 0x43, 0x28, 0x29, 0x29,\n\t0x0a, 0x3a, 0x0a, 0x0b, 0x72, 0x61, 0x6e, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5a,\n\t0x2b, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x72, 0x61, 0x6e, 0x64, 0x2e, 0x6e, 0x65, 0x77, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x28,\n\t0x64, 0x61, 0x74, 0x65, 0x2e, 0x75, 0x6e, 0x69, 0x78, 0x28, 0x29, 0x29, 0x0a, 0x33, 0x0a, 0x0a,\n\t0x66, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x72, 0x61, 0x6e, 0x64, 0x5a, 0x25, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x72, 0x61, 0x6e, 0x64,\n\t0x2e, 0x6e, 0x65, 0x77, 0x28, 0x72, 0x61, 0x6e, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,\n\t0x29, 0x0a, 0x3b, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x5a, 0x33, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x75, 0x75, 0x69, 0x64,\n\t0x2e, 0x6e, 0x65, 0x77, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x61,\n\t0x6e, 0x64, 0x28, 0x66, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x72, 0x61, 0x6e, 0x64, 0x29, 0x0a, 0x36,\n\t0x0a, 0x03, 0x6c, 0x6f, 0x63, 0x5a, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64,\n\t0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x27, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54,\n\t0x6f, 0x6b, 0x79, 0x6f, 0x27, 0x29, 0x0a, 0x45, 0x0a, 0x07, 0x6a, 0x70, 0x5f, 0x74, 0x69, 0x6d,\n\t0x65, 0x5a, 0x3a, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x65, 0x28, 0x32, 0x30, 0x32,\n\t0x33, 0x2c, 0x20, 0x31, 0x32, 0x2c, 0x20, 0x32, 0x35, 0x2c, 0x20, 0x31, 0x32, 0x2c, 0x20, 0x31,\n\t0x30, 0x2c, 0x20, 0x35, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x29, 0x0a, 0x38, 0x0a,\n\t0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x31, 0x5a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,\n\t0x61, 0x2e, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x5b, 0x27, 0x6b, 0x65,\n\t0x79, 0x31, 0x27, 0x5d, 0x5b, 0x30, 0x5d, 0x0a, 0x08, 0x0a, 0x01, 0x61, 0x6a, 0x03, 0x0a, 0x01,\n\t0x41, 0x0a, 0x2b, 0x0a, 0x0d, 0x73, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x75,\n\t0x65, 0x73, 0x5a, 0x1a, 0x5b, 0x34, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x32, 0x5d,\n\t0x2e, 0x73, 0x6f, 0x72, 0x74, 0x41, 0x73, 0x63, 0x28, 0x76, 0x2c, 0x20, 0x76, 0x29, 0x0a, 0x95,\n\t0x01, 0x0a, 0x0c, 0x73, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x5a,\n\t0x84, 0x01, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x7b, 0x6c, 0x6f, 0x63,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x2e,\n\t0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7b, 0x61, 0x64, 0x64, 0x72, 0x31, 0x3a, 0x27,\n\t0x61, 0x27, 0x7d, 0x7d, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x7b,\n\t0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x49, 0x74,\n\t0x65, 0x6d, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7b, 0x61, 0x64, 0x64, 0x72,\n\t0x31, 0x3a, 0x27, 0x62, 0x27, 0x7d, 0x7d, 0x5d, 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x44, 0x65, 0x73,\n\t0x63, 0x28, 0x76, 0x2c, 0x20, 0x76, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x61, 0x64, 0x64, 0x72, 0x31, 0x29, 0x0a, 0x25, 0x0a, 0x09, 0x6d, 0x61, 0x70, 0x5f, 0x76, 0x61,\n\t0x6c, 0x75, 0x65, 0x5a, 0x18, 0x7b, 0x31, 0x3a, 0x20, 0x27, 0x61, 0x27, 0x2c, 0x20, 0x32, 0x3a,\n\t0x20, 0x27, 0x62, 0x27, 0x2c, 0x20, 0x33, 0x3a, 0x20, 0x27, 0x63, 0x27, 0x7d, 0x0a, 0x12, 0x0a,\n\t0x0a, 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5a, 0x04, 0x6e, 0x75, 0x6c,\n\t0x6c, 0x0a, 0x4b, 0x5a, 0x49, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6c, 0x6f, 0x67, 0x2e, 0x69, 0x6e, 0x66, 0x6f, 0x28, 0x27, 0x6f,\n\t0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x20, 0x6c, 0x6f, 0x67, 0x27, 0x2c, 0x20, 0x7b, 0x27, 0x70, 0x6f, 0x73, 0x74, 0x5f, 0x6d, 0x65,\n\t0x73, 0x73, 0x61, 0x67, 0x65, 0x27, 0x3a, 0x20, 0x70, 0x6f, 0x73, 0x74, 0x7d, 0x29, 0x0a, 0x62,\n\t0x0a, 0x01, 0x65, 0x82, 0x01, 0x5c, 0x0a, 0x0d, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x49, 0x74, 0x65,\n\t0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x4b, 0x74, 0x72, 0x75, 0x65, 0x20, 0x3f, 0x20, 0x75, 0x73,\n\t0x65, 0x72, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65,\n\t0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x27, 0x49, 0x54, 0x45, 0x4d, 0x5f, 0x54, 0x59, 0x50,\n\t0x45, 0x5f, 0x32, 0x27, 0x29, 0x20, 0x3a, 0x20, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x49, 0x74, 0x65,\n\t0x6d, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x66, 0x72, 0x6f, 0x6d, 0x28,\n\t0x31, 0x29, 0x0a, 0x39, 0x0a, 0x0b, 0x73, 0x71, 0x72, 0x74, 0x5f, 0x64, 0x6f, 0x75, 0x62, 0x6c,\n\t0x65, 0x5a, 0x2a, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x71, 0x72, 0x74, 0x28, 0x33, 0x2e, 0x30,\n\t0x2a, 0x33, 0x2e, 0x30, 0x2b, 0x34, 0x2e, 0x30, 0x2a, 0x34, 0x2e, 0x30, 0x29, 0x0a, 0x2e, 0x0a,\n\t0x08, 0x73, 0x71, 0x72, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x5a, 0x22, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6d, 0x61, 0x74, 0x68, 0x2e,\n\t0x73, 0x71, 0x72, 0x74, 0x28, 0x33, 0x2a, 0x33, 0x2b, 0x34, 0x2a, 0x34, 0x29, 0x0a, 0x29, 0x0a,\n\t0x03, 0x70, 0x6f, 0x77, 0x5a, 0x22, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x70, 0x6f, 0x77, 0x28, 0x32,\n\t0x2e, 0x30, 0x2c, 0x20, 0x33, 0x2e, 0x30, 0x29, 0x0a, 0x29, 0x0a, 0x05, 0x66, 0x6c, 0x6f, 0x6f,\n\t0x72, 0x5a, 0x20, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, 0x31, 0x2e,\n\t0x35, 0x31, 0x29, 0x0a, 0x24, 0x0a, 0x07, 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x5a, 0x19,\n\t0x5b, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x5b, 0x33, 0x5d, 0x5d, 0x2e,\n\t0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x28, 0x29, 0x0a, 0x28, 0x0a, 0x05, 0x72, 0x6f, 0x75,\n\t0x6e, 0x64, 0x5a, 0x1f, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x28, 0x31,\n\t0x2e, 0x35, 0x29, 0x0a, 0x2d, 0x0a, 0x03, 0x64, 0x75, 0x70, 0x5a, 0x26, 0x5b, 0x31, 0x2c, 0x20,\n\t0x32, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x34, 0x5d, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28,\n\t0x64, 0x75, 0x70, 0x2c, 0x20, 0x64, 0x75, 0x70, 0x20, 0x25, 0x20, 0x32, 0x20, 0x3d, 0x3d, 0x20,\n\t0x30, 0x29, 0x0a, 0x24, 0x0a, 0x03, 0x61, 0x6e, 0x79, 0x5a, 0x1d, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x61, 0x6e, 0x79, 0x2e, 0x6e,\n\t0x65, 0x77, 0x28, 0x70, 0x6f, 0x73, 0x74, 0x29, 0x0a, 0x29, 0x0a, 0x03, 0x66, 0x6d, 0x74, 0x5a,\n\t0x22, 0x27, 0x25, 0x64, 0x2d, 0x25, 0x64, 0x2d, 0x25, 0x64, 0x2d, 0x77, 0x6f, 0x72, 0x6c, 0x64,\n\t0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x31, 0x2c, 0x20, 0x32, 0x2c, 0x20,\n\t0x33, 0x5d, 0x29, 0x0a, 0x28, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x64, 0x5a,\n\t0x1c, 0x66, 0x6d, 0x74, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x27, 0x77, 0x6f,\n\t0x72, 0x6c, 0x64, 0x27, 0x2c, 0x20, 0x27, 0x67, 0x72, 0x70, 0x63, 0x27, 0x29, 0x0a, 0x4a, 0x0a,\n\t0x0b, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x70, 0x5a, 0x3b, 0x5b, 0x31,\n\t0x2c, 0x20, 0x32, 0x2c, 0x20, 0x33, 0x5d, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72,\n\t0x6d, 0x4d, 0x61, 0x70, 0x28, 0x69, 0x64, 0x78, 0x2c, 0x20, 0x76, 0x2c, 0x20, 0x69, 0x64, 0x78,\n\t0x20, 0x25, 0x20, 0x32, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x28, 0x69, 0x64, 0x78, 0x20,\n\t0x2a, 0x20, 0x76, 0x29, 0x20, 0x2b, 0x20, 0x76, 0x29, 0x0a, 0x37, 0x0a, 0x0a, 0x75, 0x75, 0x69,\n\t0x64, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5a, 0x29, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x75, 0x75, 0x69, 0x64, 0x2e, 0x70, 0x61,\n\t0x72, 0x73, 0x65, 0x28, 0x75, 0x75, 0x69, 0x64, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28,\n\t0x29, 0x29, 0x0a, 0x3d, 0x0a, 0x0d, 0x75, 0x75, 0x69, 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64,\n\t0x61, 0x74, 0x65, 0x5a, 0x2c, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x75, 0x75, 0x69, 0x64, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61,\n\t0x74, 0x65, 0x28, 0x75, 0x75, 0x69, 0x64, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29,\n\t0x29, 0x0a, 0x39, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5a, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x72, 0x65,\n\t0x67, 0x65, 0x78, 0x70, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x27, 0x5b, 0x61,\n\t0x2d, 0x7a, 0x5d, 0x2b, 0x5c, 0x5c, 0x64, 0x5c, 0x5c, 0x64, 0x27, 0x29, 0x0a, 0x46, 0x0a, 0x0c,\n\t0x6d, 0x75, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5a, 0x36, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x72, 0x65,\n\t0x67, 0x65, 0x78, 0x70, 0x2e, 0x6d, 0x75, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65,\n\t0x28, 0x27, 0x28, 0x5b, 0x61, 0x2d, 0x7a, 0x5d, 0x2b, 0x29, 0x5c, 0x5c, 0x64, 0x28, 0x5c, 0x5c,\n\t0x64, 0x29, 0x27, 0x29, 0x0a, 0x3b, 0x0a, 0x0a, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x5f, 0x6d, 0x65,\n\t0x74, 0x61, 0x5a, 0x2d, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x72, 0x65, 0x67, 0x65, 0x78, 0x70, 0x2e, 0x71, 0x75, 0x6f, 0x74, 0x65,\n\t0x4d, 0x65, 0x74, 0x61, 0x28, 0x27, 0x5b, 0x61, 0x2d, 0x7a, 0x5d, 0x2b, 0x5c, 0x5c, 0x64, 0x27,\n\t0x29, 0x0a, 0x41, 0x0a, 0x14, 0x66, 0x69, 0x6e, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,\n\t0x5f, 0x73, 0x75, 0x62, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5a, 0x29, 0x6d, 0x75, 0x73, 0x74, 0x5f,\n\t0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x72, 0x69,\n\t0x6e, 0x67, 0x53, 0x75, 0x62, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x27, 0x61, 0x62, 0x63, 0x31,\n\t0x32, 0x33, 0x27, 0x29, 0x0a, 0x2c, 0x0a, 0x0c, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x74,\n\t0x72, 0x69, 0x6e, 0x67, 0x5a, 0x1c, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x6d, 0x61,\n\t0x74, 0x63, 0x68, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x27, 0x61, 0x62, 0x63, 0x31, 0x32,\n\t0x27, 0x29, 0x0a, 0x70, 0x0a, 0x12, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x61, 0x6c,\n\t0x6c, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5a, 0x5a, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x72, 0x65, 0x67, 0x65, 0x78, 0x70,\n\t0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x27, 0x6d, 0x61, 0x63, 0x6b, 0x65, 0x72,\n\t0x65, 0x6c, 0x27, 0x29, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x41, 0x6c, 0x6c, 0x53,\n\t0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x27, 0x6d, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x65, 0x6c, 0x20,\n\t0x69, 0x73, 0x20, 0x74, 0x61, 0x73, 0x74, 0x79, 0x27, 0x2c, 0x20, 0x27, 0x73, 0x61, 0x6c, 0x6d,\n\t0x6f, 0x6e, 0x27, 0x29, 0x22, 0xa6, 0x04, 0x0a, 0x01, 0x41, 0x12, 0x25, 0x0a, 0x01, 0x62, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x41, 0x2e, 0x42, 0x42, 0x06, 0x9a, 0x4a, 0x03, 0x12, 0x01, 0x62, 0x52, 0x01,\n\t0x62, 0x12, 0x3e, 0x0a, 0x05, 0x6f, 0x70, 0x74, 0x5f, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x11, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x41, 0x2e,\n\t0x42, 0x2e, 0x43, 0x42, 0x14, 0x9a, 0x4a, 0x11, 0x22, 0x0f, 0x22, 0x07, 0x41, 0x2e, 0x42, 0x2e,\n\t0x43, 0x7b, 0x7d, 0x0a, 0x04, 0x74, 0x72, 0x75, 0x65, 0x48, 0x00, 0x52, 0x04, 0x6f, 0x70, 0x74,\n\t0x43, 0x1a, 0xa1, 0x03, 0x0a, 0x01, 0x42, 0x12, 0x2d, 0x0a, 0x03, 0x66, 0x6f, 0x6f, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x41, 0x2e, 0x42, 0x2e, 0x43, 0x42, 0x08, 0x9a, 0x4a, 0x05, 0x12, 0x03, 0x66, 0x6f,\n\t0x6f, 0x52, 0x03, 0x66, 0x6f, 0x6f, 0x12, 0x2d, 0x0a, 0x03, 0x62, 0x61, 0x72, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x41, 0x2e, 0x42, 0x2e, 0x43, 0x42, 0x08, 0x9a, 0x4a, 0x05, 0x12, 0x03, 0x62, 0x61, 0x72,\n\t0x52, 0x03, 0x62, 0x61, 0x72, 0x1a, 0x24, 0x0a, 0x01, 0x43, 0x12, 0x1f, 0x0a, 0x04, 0x74, 0x79,\n\t0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0x9a, 0x4a, 0x08, 0x12, 0x06, 0x24,\n\t0x2e, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x97, 0x02, 0x9a, 0x4a,\n\t0x93, 0x02, 0x0a, 0x1d, 0x0a, 0x03, 0x66, 0x6f, 0x6f, 0x6a, 0x16, 0x0a, 0x05, 0x41, 0x2e, 0x42,\n\t0x2e, 0x43, 0x12, 0x0d, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x05, 0x27, 0x66, 0x6f, 0x6f,\n\t0x27, 0x0a, 0x1d, 0x0a, 0x03, 0x62, 0x61, 0x72, 0x6a, 0x16, 0x0a, 0x05, 0x41, 0x2e, 0x42, 0x2e,\n\t0x43, 0x12, 0x0d, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x05, 0x27, 0x62, 0x61, 0x72, 0x27,\n\t0x0a, 0x89, 0x01, 0x12, 0x11, 0x66, 0x6f, 0x6f, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d,\n\t0x20, 0x27, 0x66, 0x6f, 0x6f, 0x27, 0x5a, 0x74, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6c, 0x6f, 0x67, 0x2e, 0x69, 0x6e, 0x66, 0x6f,\n\t0x28, 0x27, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x67, 0x27, 0x2c, 0x20, 0x7b, 0x27, 0x6d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x73, 0x27, 0x3a, 0x20, 0x5b, 0x66, 0x6f, 0x6f, 0x2c, 0x20, 0x62, 0x61, 0x72,\n\t0x5d, 0x2c, 0x20, 0x27, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x27,\n\t0x3a, 0x20, 0x7b, 0x27, 0x66, 0x6f, 0x6f, 0x27, 0x3a, 0x20, 0x66, 0x6f, 0x6f, 0x2c, 0x20, 0x27,\n\t0x62, 0x61, 0x72, 0x27, 0x3a, 0x20, 0x62, 0x61, 0x72, 0x7d, 0x7d, 0x29, 0x0a, 0x47, 0x5a, 0x45,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x6c, 0x6f, 0x67, 0x2e, 0x61, 0x64, 0x64, 0x28, 0x7b, 0x27, 0x66, 0x6f, 0x6f, 0x5f, 0x74, 0x79,\n\t0x70, 0x65, 0x27, 0x3a, 0x20, 0x66, 0x6f, 0x6f, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x27,\n\t0x62, 0x61, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x27, 0x3a, 0x20, 0x62, 0x61, 0x72, 0x2e, 0x74,\n\t0x79, 0x70, 0x65, 0x7d, 0x29, 0x3a, 0x0f, 0x9a, 0x4a, 0x0c, 0x0a, 0x0a, 0x0a, 0x01, 0x62, 0x6a,\n\t0x05, 0x0a, 0x03, 0x41, 0x2e, 0x42, 0x42, 0x05, 0x0a, 0x03, 0x6f, 0x70, 0x74, 0x22, 0xe6, 0x01,\n\t0x0a, 0x04, 0x50, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07,\n\t0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x04,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x42, 0x09, 0x9a, 0x4a, 0x06, 0x12, 0x04, 0x75, 0x73, 0x65,\n\t0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x6d, 0x9a, 0x4a, 0x6a, 0x0a, 0x3c, 0x0a, 0x03,\n\t0x72, 0x65, 0x73, 0x72, 0x35, 0x0a, 0x18, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74,\n\t0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x12,\n\t0x0a, 0x0a, 0x02, 0x69, 0x64, 0x12, 0x04, 0x24, 0x2e, 0x69, 0x64, 0x1a, 0x03, 0x31, 0x30, 0x73,\n\t0x22, 0x08, 0x0a, 0x06, 0x0a, 0x02, 0x32, 0x73, 0x10, 0x03, 0x0a, 0x12, 0x0a, 0x04, 0x70, 0x6f,\n\t0x73, 0x74, 0x18, 0x01, 0x5a, 0x08, 0x72, 0x65, 0x73, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x0a, 0x16,\n\t0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x6a, 0x0e, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x06,\n\t0x1a, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x22, 0xc8, 0x04, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12,\n\t0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12,\n\t0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03,\n\t0x28, 0x0b, 0x32, 0x10, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x37, 0x0a, 0x07, 0x70,\n\t0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x2e, 0x50,\n\t0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x70, 0x72, 0x6f,\n\t0x66, 0x69, 0x6c, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x61, 0x74, 0x74, 0x72, 0x5f, 0x61, 0x18, 0x05,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x41, 0x48, 0x00, 0x52, 0x05,\n\t0x61, 0x74, 0x74, 0x72, 0x41, 0x12, 0x26, 0x0a, 0x01, 0x62, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x16, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x55, 0x73,\n\t0x65, 0x72, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x42, 0x48, 0x00, 0x52, 0x01, 0x62, 0x1a, 0x50, 0x0a,\n\t0x0c, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a,\n\t0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12,\n\t0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,\n\t0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a,\n\t0x2f, 0x0a, 0x05, 0x41, 0x74, 0x74, 0x72, 0x41, 0x12, 0x10, 0x0a, 0x03, 0x66, 0x6f, 0x6f, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x66, 0x6f, 0x6f, 0x3a, 0x14, 0x9a, 0x4a, 0x11, 0x1a,\n\t0x0f, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x41,\n\t0x1a, 0x2f, 0x0a, 0x05, 0x41, 0x74, 0x74, 0x72, 0x42, 0x12, 0x10, 0x0a, 0x03, 0x62, 0x61, 0x72,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x62, 0x61, 0x72, 0x3a, 0x14, 0x9a, 0x4a, 0x11,\n\t0x1a, 0x0f, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x2e, 0x41, 0x74, 0x74, 0x72,\n\t0x42, 0x3a, 0xa5, 0x01, 0x9a, 0x4a, 0xa1, 0x01, 0x0a, 0x8a, 0x01, 0x0a, 0x03, 0x72, 0x65, 0x73,\n\t0x72, 0x82, 0x01, 0x0a, 0x18, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65,\n\t0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x0f, 0x0a,\n\t0x02, 0x69, 0x64, 0x12, 0x09, 0x24, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x12, 0x2f,\n\t0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x27, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x49, 0x74, 0x65,\n\t0x6d, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65,\n\t0x28, 0x27, 0x49, 0x54, 0x45, 0x4d, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x31, 0x27, 0x29, 0x1a,\n\t0x03, 0x32, 0x30, 0x73, 0x22, 0x1f, 0x12, 0x1d, 0x0a, 0x02, 0x31, 0x73, 0x11, 0x66, 0x66, 0x66,\n\t0x66, 0x66, 0x66, 0xe6, 0x3f, 0x19, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xfb, 0x3f, 0x22, 0x03,\n\t0x33, 0x30, 0x73, 0x28, 0x03, 0x0a, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x5a,\n\t0x08, 0x72, 0x65, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x42, 0x06, 0x0a, 0x04, 0x61, 0x74, 0x74,\n\t0x72, 0x22, 0xb7, 0x06, 0x0a, 0x04, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d,\n\t0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x49,\n\t0x74, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a,\n\t0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61,\n\t0x6c, 0x75, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18,\n\t0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x81, 0x03, 0x0a, 0x08, 0x4c,\n\t0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x64, 0x64, 0x72, 0x31,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x64, 0x64, 0x72, 0x31, 0x12, 0x14, 0x0a,\n\t0x05, 0x61, 0x64, 0x64, 0x72, 0x32, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x64,\n\t0x64, 0x72, 0x32, 0x12, 0x38, 0x0a, 0x06, 0x61, 0x64, 0x64, 0x72, 0x5f, 0x61, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x41,\n\t0x64, 0x64, 0x72, 0x41, 0x48, 0x00, 0x52, 0x05, 0x61, 0x64, 0x64, 0x72, 0x41, 0x12, 0x2f, 0x0a,\n\t0x01, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x42, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x0e,\n\t0x0a, 0x01, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x01, 0x63, 0x1a, 0x38,\n\t0x0a, 0x05, 0x41, 0x64, 0x64, 0x72, 0x41, 0x12, 0x10, 0x0a, 0x03, 0x66, 0x6f, 0x6f, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x66, 0x6f, 0x6f, 0x3a, 0x1d, 0x9a, 0x4a, 0x1a, 0x1a, 0x18,\n\t0x75, 0x73, 0x65, 0x72, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x41, 0x1a, 0x38, 0x0a, 0x05, 0x41, 0x64, 0x64, 0x72,\n\t0x42, 0x12, 0x10, 0x0a, 0x03, 0x62, 0x61, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03,\n\t0x62, 0x61, 0x72, 0x3a, 0x1d, 0x9a, 0x4a, 0x1a, 0x1a, 0x18, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x49,\n\t0x74, 0x65, 0x6d, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x41, 0x64, 0x64,\n\t0x72, 0x42, 0x22, 0x38, 0x0a, 0x0c, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79,\n\t0x70, 0x65, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54,\n\t0x59, 0x50, 0x45, 0x5f, 0x30, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x43, 0x41, 0x54,\n\t0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x31, 0x10, 0x01, 0x3a, 0x17, 0x9a, 0x4a,\n\t0x14, 0x1a, 0x12, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x4c, 0x6f, 0x63,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x07, 0x0a, 0x05, 0x61, 0x64, 0x64, 0x72, 0x33, 0x22, 0x8a,\n\t0x02, 0x0a, 0x08, 0x49, 0x74, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, 0x15, 0x49,\n\t0x54, 0x45, 0x4d, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49,\n\t0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x1a, 0x1e, 0x9a, 0x4a, 0x1b, 0x1a, 0x12, 0x0a, 0x02, 0x65,\n\t0x6e, 0x12, 0x0c, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x1a,\n\t0x05, 0x0a, 0x03, 0x73, 0x75, 0x62, 0x12, 0x37, 0x0a, 0x0b, 0x49, 0x54, 0x45, 0x4d, 0x5f, 0x54,\n\t0x59, 0x50, 0x45, 0x5f, 0x31, 0x10, 0x01, 0x1a, 0x26, 0x9a, 0x4a, 0x23, 0x1a, 0x15, 0x0a, 0x02,\n\t0x65, 0x6e, 0x12, 0x0f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x74,\n\t0x79, 0x70, 0x65, 0x1a, 0x0a, 0x0a, 0x03, 0x73, 0x75, 0x62, 0x12, 0x03, 0x78, 0x78, 0x78, 0x12,\n\t0x38, 0x0a, 0x0b, 0x49, 0x54, 0x45, 0x4d, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x32, 0x10, 0x02,\n\t0x1a, 0x27, 0x9a, 0x4a, 0x24, 0x1a, 0x16, 0x0a, 0x02, 0x65, 0x6e, 0x12, 0x10, 0x73, 0x65, 0x63,\n\t0x6f, 0x6e, 0x64, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x1a, 0x0a, 0x0a,\n\t0x03, 0x73, 0x75, 0x62, 0x12, 0x03, 0x79, 0x79, 0x79, 0x12, 0x37, 0x0a, 0x0b, 0x49, 0x54, 0x45,\n\t0x4d, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x33, 0x10, 0x03, 0x1a, 0x26, 0x9a, 0x4a, 0x23, 0x1a,\n\t0x15, 0x0a, 0x02, 0x65, 0x6e, 0x12, 0x0f, 0x74, 0x68, 0x69, 0x72, 0x64, 0x20, 0x69, 0x74, 0x65,\n\t0x6d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x1a, 0x0a, 0x0a, 0x03, 0x73, 0x75, 0x62, 0x12, 0x03, 0x7a,\n\t0x7a, 0x7a, 0x1a, 0x17, 0x9a, 0x4a, 0x14, 0x0a, 0x12, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x49, 0x74,\n\t0x65, 0x6d, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x0e, 0x9a, 0x4a, 0x0b,\n\t0x1a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x32, 0x5e, 0x0a, 0x11, 0x46,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n\t0x12, 0x44, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x12, 0x1a, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74,\n\t0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70,\n\t0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x1a, 0x03, 0x9a, 0x4a, 0x00, 0x42, 0xad, 0x01, 0x9a, 0x4a,\n\t0x22, 0x12, 0x0f, 0x70, 0x6f, 0x73, 0x74, 0x2f, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x12, 0x0f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x42, 0x0f, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50,\n\t0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x1d, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0xa2, 0x02, 0x03, 0x46, 0x58, 0x58, 0xaa, 0x02, 0x0a, 0x46, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xca, 0x02, 0x0a, 0x46, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0xe2, 0x02, 0x16, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02,\n\t0x0a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_federation_federation_proto_rawDescOnce sync.Once\n\tfile_federation_federation_proto_rawDescData = file_federation_federation_proto_rawDesc\n)\n\nfunc file_federation_federation_proto_rawDescGZIP() []byte {\n\tfile_federation_federation_proto_rawDescOnce.Do(func() {\n\t\tfile_federation_federation_proto_rawDescData = protoimpl.X.CompressGZIP(file_federation_federation_proto_rawDescData)\n\t})\n\treturn file_federation_federation_proto_rawDescData\n}\n\nvar file_federation_federation_proto_enumTypes = make([]protoimpl.EnumInfo, 2)\nvar file_federation_federation_proto_msgTypes = make([]protoimpl.MessageInfo, 16)\nvar file_federation_federation_proto_goTypes = []interface{}{\n\t(Item_ItemType)(0),              // 0: federation.Item.ItemType\n\t(Item_Location_LocationType)(0), // 1: federation.Item.Location.LocationType\n\t(*GetPostRequest)(nil),          // 2: federation.GetPostRequest\n\t(*GetPostResponse)(nil),         // 3: federation.GetPostResponse\n\t(*A)(nil),                       // 4: federation.A\n\t(*Post)(nil),                    // 5: federation.Post\n\t(*User)(nil),                    // 6: federation.User\n\t(*Item)(nil),                    // 7: federation.Item\n\tnil,                             // 8: federation.GetPostResponse.MapValueEntry\n\tnil,                             // 9: federation.GetPostResponse.ListToMapEntry\n\t(*A_B)(nil),                     // 10: federation.A.B\n\t(*A_B_C)(nil),                   // 11: federation.A.B.C\n\tnil,                             // 12: federation.User.ProfileEntry\n\t(*User_AttrA)(nil),              // 13: federation.User.AttrA\n\t(*User_AttrB)(nil),              // 14: federation.User.AttrB\n\t(*Item_Location)(nil),           // 15: federation.Item.Location\n\t(*Item_Location_AddrA)(nil),     // 16: federation.Item.Location.AddrA\n\t(*Item_Location_AddrB)(nil),     // 17: federation.Item.Location.AddrB\n\t(*wrapperspb.DoubleValue)(nil),  // 18: google.protobuf.DoubleValue\n\t(*wrapperspb.FloatValue)(nil),   // 19: google.protobuf.FloatValue\n\t(*wrapperspb.Int64Value)(nil),   // 20: google.protobuf.Int64Value\n\t(*wrapperspb.UInt64Value)(nil),  // 21: google.protobuf.UInt64Value\n\t(*wrapperspb.Int32Value)(nil),   // 22: google.protobuf.Int32Value\n\t(*wrapperspb.UInt32Value)(nil),  // 23: google.protobuf.UInt32Value\n\t(*wrapperspb.BoolValue)(nil),    // 24: google.protobuf.BoolValue\n\t(*wrapperspb.StringValue)(nil),  // 25: google.protobuf.StringValue\n\t(*wrapperspb.BytesValue)(nil),   // 26: google.protobuf.BytesValue\n\t(*timestamppb.Timestamp)(nil),   // 27: google.protobuf.Timestamp\n\t(*anypb.Any)(nil),               // 28: google.protobuf.Any\n}\nvar file_federation_federation_proto_depIdxs = []int32{\n\t5,  // 0: federation.GetPostResponse.post:type_name -> federation.Post\n\t0,  // 1: federation.GetPostResponse.item_type_value_enum:type_name -> federation.Item.ItemType\n\t0,  // 2: federation.GetPostResponse.item_type_value_cast:type_name -> federation.Item.ItemType\n\t4,  // 3: federation.GetPostResponse.a:type_name -> federation.A\n\t7,  // 4: federation.GetPostResponse.sorted_items:type_name -> federation.Item\n\t8,  // 5: federation.GetPostResponse.map_value:type_name -> federation.GetPostResponse.MapValueEntry\n\t18, // 6: federation.GetPostResponse.double_wrapper_value:type_name -> google.protobuf.DoubleValue\n\t19, // 7: federation.GetPostResponse.float_wrapper_value:type_name -> google.protobuf.FloatValue\n\t20, // 8: federation.GetPostResponse.i64_wrapper_value:type_name -> google.protobuf.Int64Value\n\t21, // 9: federation.GetPostResponse.u64_wrapper_value:type_name -> google.protobuf.UInt64Value\n\t22, // 10: federation.GetPostResponse.i32_wrapper_value:type_name -> google.protobuf.Int32Value\n\t23, // 11: federation.GetPostResponse.u32_wrapper_value:type_name -> google.protobuf.UInt32Value\n\t24, // 12: federation.GetPostResponse.bool_wrapper_value:type_name -> google.protobuf.BoolValue\n\t25, // 13: federation.GetPostResponse.string_wrapper_value:type_name -> google.protobuf.StringValue\n\t26, // 14: federation.GetPostResponse.bytes_wrapper_value:type_name -> google.protobuf.BytesValue\n\t27, // 15: federation.GetPostResponse.null_timestamp:type_name -> google.protobuf.Timestamp\n\t27, // 16: federation.GetPostResponse.null_timestamp2:type_name -> google.protobuf.Timestamp\n\t27, // 17: federation.GetPostResponse.null_timestamp3:type_name -> google.protobuf.Timestamp\n\t0,  // 18: federation.GetPostResponse.enum_value:type_name -> federation.Item.ItemType\n\t28, // 19: federation.GetPostResponse.any:type_name -> google.protobuf.Any\n\t9,  // 20: federation.GetPostResponse.list_to_map:type_name -> federation.GetPostResponse.ListToMapEntry\n\t10, // 21: federation.A.b:type_name -> federation.A.B\n\t11, // 22: federation.A.opt_c:type_name -> federation.A.B.C\n\t6,  // 23: federation.Post.user:type_name -> federation.User\n\t7,  // 24: federation.User.items:type_name -> federation.Item\n\t12, // 25: federation.User.profile:type_name -> federation.User.ProfileEntry\n\t13, // 26: federation.User.attr_a:type_name -> federation.User.AttrA\n\t14, // 27: federation.User.b:type_name -> federation.User.AttrB\n\t0,  // 28: federation.Item.type:type_name -> federation.Item.ItemType\n\t15, // 29: federation.Item.location:type_name -> federation.Item.Location\n\t11, // 30: federation.A.B.foo:type_name -> federation.A.B.C\n\t11, // 31: federation.A.B.bar:type_name -> federation.A.B.C\n\t28, // 32: federation.User.ProfileEntry.value:type_name -> google.protobuf.Any\n\t16, // 33: federation.Item.Location.addr_a:type_name -> federation.Item.Location.AddrA\n\t17, // 34: federation.Item.Location.b:type_name -> federation.Item.Location.AddrB\n\t2,  // 35: federation.FederationService.GetPost:input_type -> federation.GetPostRequest\n\t3,  // 36: federation.FederationService.GetPost:output_type -> federation.GetPostResponse\n\t36, // [36:37] is the sub-list for method output_type\n\t35, // [35:36] is the sub-list for method input_type\n\t35, // [35:35] is the sub-list for extension type_name\n\t35, // [35:35] is the sub-list for extension extendee\n\t0,  // [0:35] is the sub-list for field type_name\n}\n\nfunc init() { file_federation_federation_proto_init() }\nfunc file_federation_federation_proto_init() {\n\tif File_federation_federation_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_federation_federation_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*A); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Post); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*User); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Item); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*A_B); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*A_B_C); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*User_AttrA); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*User_AttrB); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Item_Location); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Item_Location_AddrA); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Item_Location_AddrB); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\tfile_federation_federation_proto_msgTypes[2].OneofWrappers = []interface{}{\n\t\t(*A_OptC)(nil),\n\t}\n\tfile_federation_federation_proto_msgTypes[4].OneofWrappers = []interface{}{\n\t\t(*User_AttrA_)(nil),\n\t\t(*User_B)(nil),\n\t}\n\tfile_federation_federation_proto_msgTypes[13].OneofWrappers = []interface{}{\n\t\t(*Item_Location_AddrA_)(nil),\n\t\t(*Item_Location_B)(nil),\n\t\t(*Item_Location_C)(nil),\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_federation_federation_proto_rawDesc,\n\t\t\tNumEnums:      2,\n\t\t\tNumMessages:   16,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_federation_federation_proto_goTypes,\n\t\tDependencyIndexes: file_federation_federation_proto_depIdxs,\n\t\tEnumInfos:         file_federation_federation_proto_enumTypes,\n\t\tMessageInfos:      file_federation_federation_proto_msgTypes,\n\t}.Build()\n\tFile_federation_federation_proto = out.File\n\tfile_federation_federation_proto_rawDesc = nil\n\tfile_federation_federation_proto_goTypes = nil\n\tfile_federation_federation_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/02_simple/federation/federation_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tFederationService_GetPost_FullMethodName = \"/federation.FederationService/GetPost\"\n)\n\n// FederationServiceClient is the client API for FederationService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype FederationServiceClient interface {\n\tGetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error)\n}\n\ntype federationServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewFederationServiceClient(cc grpc.ClientConnInterface) FederationServiceClient {\n\treturn &federationServiceClient{cc}\n}\n\nfunc (c *federationServiceClient) GetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error) {\n\tout := new(GetPostResponse)\n\terr := c.cc.Invoke(ctx, FederationService_GetPost_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// FederationServiceServer is the server API for FederationService service.\n// All implementations must embed UnimplementedFederationServiceServer\n// for forward compatibility\ntype FederationServiceServer interface {\n\tGetPost(context.Context, *GetPostRequest) (*GetPostResponse, error)\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\n// UnimplementedFederationServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedFederationServiceServer struct {\n}\n\nfunc (UnimplementedFederationServiceServer) GetPost(context.Context, *GetPostRequest) (*GetPostResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetPost not implemented\")\n}\nfunc (UnimplementedFederationServiceServer) mustEmbedUnimplementedFederationServiceServer() {}\n\n// UnsafeFederationServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to FederationServiceServer will\n// result in compilation errors.\ntype UnsafeFederationServiceServer interface {\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\nfunc RegisterFederationServiceServer(s grpc.ServiceRegistrar, srv FederationServiceServer) {\n\ts.RegisterService(&FederationService_ServiceDesc, srv)\n}\n\nfunc _FederationService_GetPost_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetPostRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(FederationServiceServer).GetPost(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: FederationService_GetPost_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(FederationServiceServer).GetPost(ctx, req.(*GetPostRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// FederationService_ServiceDesc is the grpc.ServiceDesc for FederationService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar FederationService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"federation.FederationService\",\n\tHandlerType: (*FederationServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetPost\",\n\t\t\tHandler:    _FederationService_GetPost_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"federation/federation.proto\",\n}\n"
  },
  {
    "path": "_examples/02_simple/federation/federation_grpc_federation.pb.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: federation/federation.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n\t\"google.golang.org/protobuf/types/known/anypb\"\n\t\"google.golang.org/protobuf/types/known/timestamppb\"\n\n\tpost \"example/post\"\n\tuser \"example/user\"\n\twrapperspb \"google.golang.org/protobuf/types/known/wrapperspb\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\nvar Item_ItemType_attrMap = grpcfed.EnumAttributeMap[Item_ItemType]{\n\tItem_ITEM_TYPE_UNSPECIFIED: grpcfed.EnumValueAttributeMap{\n\t\t`en`:  `unknown item`,\n\t\t`sub`: ``,\n\t},\n\tItem_ITEM_TYPE_1: grpcfed.EnumValueAttributeMap{\n\t\t`en`:  `first item type`,\n\t\t`sub`: `xxx`,\n\t},\n\tItem_ITEM_TYPE_2: grpcfed.EnumValueAttributeMap{\n\t\t`en`:  `second item type`,\n\t\t`sub`: `yyy`,\n\t},\n\tItem_ITEM_TYPE_3: grpcfed.EnumValueAttributeMap{\n\t\t`en`:  `third item type`,\n\t\t`sub`: `zzz`,\n\t},\n}\n\n// Federation_AVariable represents variable definitions in \"federation.A\".\ntype FederationService_Federation_AVariable struct {\n\tB *A_B\n}\n\n// Federation_AArgument is argument for \"federation.A\" message.\ntype FederationService_Federation_AArgument struct {\n\tFederationService_Federation_AVariable\n}\n\n// Federation_A_BVariable represents variable definitions in \"federation.B\".\ntype FederationService_Federation_A_BVariable struct {\n\tBar *A_B_C\n\tFoo *A_B_C\n}\n\n// Federation_A_BArgument is argument for \"federation.B\" message.\ntype FederationService_Federation_A_BArgument struct {\n\tFederationService_Federation_A_BVariable\n}\n\n// Federation_A_B_CVariable represents variable definitions in \"federation.C\".\ntype FederationService_Federation_A_B_CVariable struct {\n}\n\n// Federation_A_B_CArgument is argument for \"federation.C\" message.\ntype FederationService_Federation_A_B_CArgument struct {\n\tType string\n\tFederationService_Federation_A_B_CVariable\n}\n\n// Federation_GetPostResponseVariable represents variable definitions in \"federation.GetPostResponse\".\ntype FederationService_Federation_GetPostResponseVariable struct {\n\tA                  *A\n\tAny                *anypb.Any\n\tCompile            *grpcfedcel.Regexp\n\tDate               *grpcfedcel.Time\n\tE                  Item_ItemType\n\tFindStringSubmatch []string\n\tFixedRand          *grpcfedcel.Rand\n\tFlatten            []int64\n\tFloor              float64\n\tFmt                string\n\tJpTime             *grpcfedcel.Time\n\tListToMap          map[int64]int64\n\tLoc                *grpcfedcel.Location\n\tMapValue           map[int64]string\n\tMatchString        bool\n\tMustCompile        *grpcfedcel.Regexp\n\tNullValue          any\n\tParseFloat         float64\n\tPost               *Post\n\tPow                float64\n\tQuoteMeta          string\n\tRandSource         *grpcfedcel.Source\n\tReplaceAllString   string\n\tReplaced           string\n\tRound              float64\n\tSortedItems        []*user.Item\n\tSortedValues       []int64\n\tSqrtDouble         float64\n\tSqrtInt            float64\n\tStringsJoin        string\n\tUrl                *grpcfedcel.URL\n\tUuid               *grpcfedcel.UUID\n\tUuidParse          *grpcfedcel.UUID\n\tUuidValidate       bool\n\tValue1             string\n}\n\n// Federation_GetPostResponseArgument is argument for \"federation.GetPostResponse\" message.\ntype FederationService_Federation_GetPostResponseArgument struct {\n\tId string\n\tFederationService_Federation_GetPostResponseVariable\n}\n\n// Federation_PostVariable represents variable definitions in \"federation.Post\".\ntype FederationService_Federation_PostVariable struct {\n\tPost *post.Post\n\tRes  *post.GetPostResponse\n\tUser *User\n}\n\n// Federation_PostArgument is argument for \"federation.Post\" message.\ntype FederationService_Federation_PostArgument struct {\n\tId string\n\tFederationService_Federation_PostVariable\n}\n\n// Federation_UserVariable represents variable definitions in \"federation.User\".\ntype FederationService_Federation_UserVariable struct {\n\tRes  *user.GetUserResponse\n\tUser *user.User\n}\n\n// Federation_UserArgument is argument for \"federation.User\" message.\ntype FederationService_Federation_UserArgument struct {\n\tContent string\n\tId      string\n\tTitle   string\n\tUserId  string\n\tFederationService_Federation_UserVariable\n}\n\n// FederationServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationServiceConfig struct {\n\t// Client provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\n\t// If this interface is not provided, an error is returned during initialization.\n\tClient FederationServiceClientFactory // required\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationServiceClientFactory interface {\n\t// Post_PostServiceClient create a gRPC Client to be used to call methods in post.PostService.\n\tPost_PostServiceClient(FederationServiceClientConfig) (post.PostServiceClient, error)\n\t// User_UserServiceClient create a gRPC Client to be used to call methods in user.UserService.\n\tUser_UserServiceClient(FederationServiceClientConfig) (user.UserServiceClient, error)\n}\n\n// FederationServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationServiceDependentClientSet struct {\n\tPost_PostServiceClient post.PostServiceClient\n\tUser_UserServiceClient user.UserServiceClient\n}\n\n// FederationServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationServiceResolver interface {\n}\n\n// FederationServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// FederationServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationServiceUnimplementedResolver struct{}\n\nconst (\n\tFederationService_DependentMethod_Post_PostService_GetPost = \"/post.PostService/GetPost\"\n\tFederationService_DependentMethod_User_UserService_GetUser = \"/user.UserService/GetUser\"\n)\n\n// FederationService represents Federation Service.\ntype FederationService struct {\n\tUnimplementedFederationServiceServer\n\tcfg             FederationServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationServiceDependentClientSet\n}\n\n// NewFederationService creates FederationService instance by FederationServiceConfig.\nfunc NewFederationService(cfg FederationServiceConfig) (*FederationService, error) {\n\tif cfg.Client == nil {\n\t\treturn nil, grpcfed.ErrClientConfig\n\t}\n\tPost_PostServiceClient, err := cfg.Client.Post_PostServiceClient(FederationServiceClientConfig{\n\t\tService: \"post.PostService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tUser_UserServiceClient, err := cfg.Client.User_UserServiceClient(FederationServiceClientConfig{\n\t\tService: \"user.UserService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"federation.FederationService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.federation.AArgument\":   {},\n\t\t\"grpc.federation.private.federation.A_BArgument\": {},\n\t\t\"grpc.federation.private.federation.A_B_CArgument\": {\n\t\t\t\"type\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Type\"),\n\t\t},\n\t\t\"grpc.federation.private.federation.GetPostResponseArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.federation.PostArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.federation.UserArgument\": {\n\t\t\t\"id\":      grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t\t\"title\":   grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Title\"),\n\t\t\t\"content\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Content\"),\n\t\t\t\"user_id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"UserId\"),\n\t\t},\n\t\t\"federation.A\": {\n\t\t\t\"opt\": grpcfed.NewOneofSelectorFieldType(\n\t\t\t\tgrpcfed.NewCELObjectType(\"federation.A.B.C\"), \"Opt\",\n\t\t\t\t[]reflect.Type{reflect.TypeOf((*A_OptC)(nil))},\n\t\t\t\t[]string{\"GetOptC\"},\n\t\t\t\treflect.Zero(reflect.TypeOf((*A_B_C)(nil))),\n\t\t\t),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.GRPCErrorAccessorOptions(celTypeHelper, \"post.GetPostResponse\")...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.GRPCErrorAccessorOptions(celTypeHelper, \"user.GetUserResponse\")...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"federation.Item.ItemType\", Item_ItemType_value, Item_ItemType_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAttrOption[Item_ItemType](\"federation.Item.ItemType\", Item_ItemType_attrMap))\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"federation.Item.Location.LocationType\", Item_Location_LocationType_value, Item_Location_LocationType_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"user.Item.ItemType\", user.Item_ItemType_value, user.Item_ItemType_name)...)\n\tsvc := &FederationService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tclient: &FederationServiceDependentClientSet{\n\t\t\tPost_PostServiceClient: Post_PostServiceClient,\n\t\t\tUser_UserServiceClient: User_UserServiceClient,\n\t\t},\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationService(ctx context.Context, svc *FederationService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n// GetPost implements \"federation.FederationService/GetPost\" method.\nfunc (s *FederationService) GetPost(ctx context.Context, req *GetPostRequest) (res *GetPostResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.FederationService/GetPost\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Federation_GetPostResponse(ctx, &FederationService_Federation_GetPostResponseArgument{\n\t\tId: req.GetId(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Federation_A resolve \"federation.A\" message.\nfunc (s *FederationService) resolve_Federation_A(ctx context.Context, req *FederationService_Federation_AArgument) (*A, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.A\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.A\", slog.Any(\"message_args\", s.logvalue_Federation_AArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tB *A_B\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.federation.AArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"b\"\n\t\t  message {\n\t\t    name: \"B\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_b := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*A_B, *localValueType]{\n\t\t\tName: `b`,\n\t\t\tType: grpcfed.CELObjectType(\"federation.A.B\"),\n\t\t\tSetter: func(value *localValueType, v *A_B) error {\n\t\t\t\tvalue.vars.B = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Federation_A_BArgument{}\n\t\t\t\tret, err := s.resolve_Federation_A_B(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_b(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Federation_AVariable.B = value.vars.B\n\n\t// create a message value to be returned.\n\tret := &A{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"b\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*A_B]{\n\t\tValue:      value,\n\t\tExpr:       `b`,\n\t\tCacheIndex: 1,\n\t\tSetter: func(v *A_B) error {\n\t\t\tret.B = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\toneof_OptC, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\tValue:      value,\n\t\tExpr:       `true`,\n\t\tOutType:    reflect.TypeOf(true),\n\t\tCacheIndex: 2,\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\tif false {\n\t\t// For code generation reasons, we're using a loop to generate the oneof conditional branches,\n\t\t// so to avoid treating the first element specially, we always generate if branch with false condition.\n\t} else if oneof_OptC.(bool) {\n\n\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*A_B_C]{\n\t\t\tValue:      value,\n\t\t\tExpr:       `A.B.C{}`,\n\t\t\tCacheIndex: 3,\n\t\t\tSetter: func(v *A_B_C) error {\n\t\t\t\toptValue, err := s.cast_Federation_A_B_C__to__Federation_A_OptC(v)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tret.Opt = optValue\n\t\t\t\treturn nil\n\t\t\t},\n\t\t}); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.A\", slog.Any(\"federation.A\", s.logvalue_Federation_A(ret)))\n\treturn ret, nil\n}\n\n// resolve_Federation_A_B resolve \"federation.A.B\" message.\nfunc (s *FederationService) resolve_Federation_A_B(ctx context.Context, req *FederationService_Federation_A_BArgument) (*A_B, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.A.B\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.A.B\", slog.Any(\"message_args\", s.logvalue_Federation_A_BArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tBar   *A_B_C\n\t\t\tFoo   *A_B_C\n\t\t\tXDef2 bool\n\t\t\tXDef3 bool\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.federation.A_BArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"foo\"\n\t\t  message {\n\t\t    name: \"C\"\n\t\t    args { name: \"type\", by: \"'foo'\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_foo := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*A_B_C, *localValueType]{\n\t\t\tName: `foo`,\n\t\t\tType: grpcfed.CELObjectType(\"federation.A.B.C\"),\n\t\t\tSetter: func(value *localValueType, v *A_B_C) error {\n\t\t\t\tvalue.vars.Foo = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Federation_A_B_CArgument{}\n\t\t\t\t// { name: \"type\", by: \"'foo'\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `'foo'`,\n\t\t\t\t\tCacheIndex: 4,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Type = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Federation_A_B_C(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"bar\"\n\t\t  message {\n\t\t    name: \"C\"\n\t\t    args { name: \"type\", by: \"'bar'\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_bar := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*A_B_C, *localValueType]{\n\t\t\tName: `bar`,\n\t\t\tType: grpcfed.CELObjectType(\"federation.A.B.C\"),\n\t\t\tSetter: func(value *localValueType, v *A_B_C) error {\n\t\t\t\tvalue.vars.Bar = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Federation_A_B_CArgument{}\n\t\t\t\t// { name: \"type\", by: \"'bar'\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `'bar'`,\n\t\t\t\t\tCacheIndex: 5,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Type = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Federation_A_B_C(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"_def2\"\n\t\t  if: \"foo.type == 'foo'\"\n\t\t  by: \"grpc.federation.log.info('output federation log', {'messages': [foo, bar], 'message_map': {'foo': foo, 'bar': bar}})\"\n\t\t}\n\t*/\n\tdef__def2 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[bool, *localValueType]{\n\t\t\tIf:           `foo.type == 'foo'`,\n\t\t\tIfCacheIndex: 6,\n\t\t\tName:         `_def2`,\n\t\t\tType:         grpcfed.CELBoolType,\n\t\t\tSetter: func(value *localValueType, v bool) error {\n\t\t\t\tvalue.vars.XDef2 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `grpc.federation.log.info('output federation log', {'messages': [foo, bar], 'message_map': {'foo': foo, 'bar': bar}})`,\n\t\t\tByCacheIndex: 7,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"_def3\"\n\t\t  by: \"grpc.federation.log.add({'foo_type': foo.type, 'bar_type': bar.type})\"\n\t\t}\n\t*/\n\tdef__def3 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[bool, *localValueType]{\n\t\t\tName: `_def3`,\n\t\t\tType: grpcfed.CELBoolType,\n\t\t\tSetter: func(value *localValueType, v bool) error {\n\t\t\t\tvalue.vars.XDef3 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `grpc.federation.log.add({'foo_type': foo.type, 'bar_type': bar.type})`,\n\t\t\tByCacheIndex: 8,\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t   bar ─┐\n\t   foo ─┤\n\t        _def2 ─┐\n\t   bar ─┐      │\n\t   foo ─┤      │\n\t        _def3 ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\teg, ctx2 := grpcfed.ErrorGroupWithContext(ctx1)\n\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\tif err := def_bar(ctx2); err != nil {\n\t\t\t\tgrpcfed.RecordErrorToSpan(ctx2, err)\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn nil, nil\n\t\t})\n\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\tif err := def_foo(ctx2); err != nil {\n\t\t\t\tgrpcfed.RecordErrorToSpan(ctx2, err)\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn nil, nil\n\t\t})\n\t\tif err := eg.Wait(); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def__def2(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\teg, ctx2 := grpcfed.ErrorGroupWithContext(ctx1)\n\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\tif err := def_bar(ctx2); err != nil {\n\t\t\t\tgrpcfed.RecordErrorToSpan(ctx2, err)\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn nil, nil\n\t\t})\n\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\tif err := def_foo(ctx2); err != nil {\n\t\t\t\tgrpcfed.RecordErrorToSpan(ctx2, err)\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn nil, nil\n\t\t})\n\t\tif err := eg.Wait(); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def__def3(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Federation_A_BVariable.Bar = value.vars.Bar\n\treq.FederationService_Federation_A_BVariable.Foo = value.vars.Foo\n\n\t// create a message value to be returned.\n\tret := &A_B{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"foo\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*A_B_C]{\n\t\tValue:      value,\n\t\tExpr:       `foo`,\n\t\tCacheIndex: 9,\n\t\tSetter: func(v *A_B_C) error {\n\t\t\tret.Foo = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"bar\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*A_B_C]{\n\t\tValue:      value,\n\t\tExpr:       `bar`,\n\t\tCacheIndex: 10,\n\t\tSetter: func(v *A_B_C) error {\n\t\t\tret.Bar = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.A.B\", slog.Any(\"federation.A.B\", s.logvalue_Federation_A_B(ret)))\n\treturn ret, nil\n}\n\n// resolve_Federation_A_B_C resolve \"federation.A.B.C\" message.\nfunc (s *FederationService) resolve_Federation_A_B_C(ctx context.Context, req *FederationService_Federation_A_B_CArgument) (*A_B_C, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.A.B.C\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.A.B.C\", slog.Any(\"message_args\", s.logvalue_Federation_A_B_CArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.federation.A_B_CArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &A_B_C{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"$.type\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `$.type`,\n\t\tCacheIndex: 11,\n\t\tSetter: func(v string) error {\n\t\t\tret.Type = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.A.B.C\", slog.Any(\"federation.A.B.C\", s.logvalue_Federation_A_B_C(ret)))\n\treturn ret, nil\n}\n\n// resolve_Federation_GetPostResponse resolve \"federation.GetPostResponse\" message.\nfunc (s *FederationService) resolve_Federation_GetPostResponse(ctx context.Context, req *FederationService_Federation_GetPostResponseArgument) (*GetPostResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.GetPostResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.GetPostResponse\", slog.Any(\"message_args\", s.logvalue_Federation_GetPostResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tA                  *A\n\t\t\tAny                *anypb.Any\n\t\t\tCompile            *grpcfedcel.Regexp\n\t\t\tDate               *grpcfedcel.Time\n\t\t\tDup                []int64\n\t\t\tE                  Item_ItemType\n\t\t\tFindStringSubmatch []string\n\t\t\tFixedRand          *grpcfedcel.Rand\n\t\t\tFlatten            []int64\n\t\t\tFloor              float64\n\t\t\tFmt                string\n\t\t\tJpTime             *grpcfedcel.Time\n\t\t\tListToMap          map[int64]int64\n\t\t\tLoc                *grpcfedcel.Location\n\t\t\tMapValue           map[int64]string\n\t\t\tMatchString        bool\n\t\t\tMustCompile        *grpcfedcel.Regexp\n\t\t\tNullValue          any\n\t\t\tParseFloat         float64\n\t\t\tPost               *Post\n\t\t\tPow                float64\n\t\t\tQuoteMeta          string\n\t\t\tRandSource         *grpcfedcel.Source\n\t\t\tReplaceAllString   string\n\t\t\tReplaced           string\n\t\t\tRound              float64\n\t\t\tSortedItems        []*user.Item\n\t\t\tSortedValues       []int64\n\t\t\tSqrtDouble         float64\n\t\t\tSqrtInt            float64\n\t\t\tStringsJoin        string\n\t\t\tUrl                *grpcfedcel.URL\n\t\t\tUuid               *grpcfedcel.UUID\n\t\t\tUuidParse          *grpcfedcel.UUID\n\t\t\tUuidValidate       bool\n\t\t\tValue1             string\n\t\t\tXDef16             bool\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.federation.GetPostResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"post\"\n\t\t  message {\n\t\t    name: \"Post\"\n\t\t    args { name: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_post := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Post, *localValueType]{\n\t\t\tName: `post`,\n\t\t\tType: grpcfed.CELObjectType(\"federation.Post\"),\n\t\t\tSetter: func(value *localValueType, v *Post) error {\n\t\t\t\tvalue.vars.Post = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Federation_PostArgument{}\n\t\t\t\t// { name: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 12,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Federation_Post(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"strings_join\"\n\t\t  by: \"grpc.federation.strings.join(['1234567'.substring(1, 3), '2'], '.')\"\n\t\t}\n\t*/\n\tdef_strings_join := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[string, *localValueType]{\n\t\t\tName: `strings_join`,\n\t\t\tType: grpcfed.CELStringType,\n\t\t\tSetter: func(value *localValueType, v string) error {\n\t\t\t\tvalue.vars.StringsJoin = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `grpc.federation.strings.join(['1234567'.substring(1, 3), '2'], '.')`,\n\t\t\tByCacheIndex: 13,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"parse_float\"\n\t\t  by: \"grpc.federation.strings.parseFloat(strings_join, 64)\"\n\t\t}\n\t*/\n\tdef_parse_float := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[float64, *localValueType]{\n\t\t\tName: `parse_float`,\n\t\t\tType: grpcfed.CELDoubleType,\n\t\t\tSetter: func(value *localValueType, v float64) error {\n\t\t\t\tvalue.vars.ParseFloat = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `grpc.federation.strings.parseFloat(strings_join, 64)`,\n\t\t\tByCacheIndex: 14,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"url\"\n\t\t  by: \"grpc.federation.url.parse('https://test_user:password@example.com/path')\"\n\t\t}\n\t*/\n\tdef_url := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*grpcfedcel.URL, *localValueType]{\n\t\t\tName: `url`,\n\t\t\tType: grpcfed.CELObjectType(\"grpc.federation.url.URL\"),\n\t\t\tSetter: func(value *localValueType, v *grpcfedcel.URL) error {\n\t\t\t\tvalue.vars.Url = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `grpc.federation.url.parse('https://test_user:password@example.com/path')`,\n\t\t\tByCacheIndex: 15,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"date\"\n\t\t  by: \"grpc.federation.time.date(2023, 12, 25, 12, 10, 5, 0, grpc.federation.time.UTC())\"\n\t\t}\n\t*/\n\tdef_date := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*grpcfedcel.Time, *localValueType]{\n\t\t\tName: `date`,\n\t\t\tType: grpcfed.CELObjectType(\"grpc.federation.time.Time\"),\n\t\t\tSetter: func(value *localValueType, v *grpcfedcel.Time) error {\n\t\t\t\tvalue.vars.Date = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `grpc.federation.time.date(2023, 12, 25, 12, 10, 5, 0, grpc.federation.time.UTC())`,\n\t\t\tByCacheIndex: 16,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"rand_source\"\n\t\t  by: \"grpc.federation.rand.newSource(date.unix())\"\n\t\t}\n\t*/\n\tdef_rand_source := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*grpcfedcel.Source, *localValueType]{\n\t\t\tName: `rand_source`,\n\t\t\tType: grpcfed.CELObjectType(\"grpc.federation.rand.Source\"),\n\t\t\tSetter: func(value *localValueType, v *grpcfedcel.Source) error {\n\t\t\t\tvalue.vars.RandSource = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `grpc.federation.rand.newSource(date.unix())`,\n\t\t\tByCacheIndex: 17,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"fixed_rand\"\n\t\t  by: \"grpc.federation.rand.new(rand_source)\"\n\t\t}\n\t*/\n\tdef_fixed_rand := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*grpcfedcel.Rand, *localValueType]{\n\t\t\tName: `fixed_rand`,\n\t\t\tType: grpcfed.CELObjectType(\"grpc.federation.rand.Rand\"),\n\t\t\tSetter: func(value *localValueType, v *grpcfedcel.Rand) error {\n\t\t\t\tvalue.vars.FixedRand = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `grpc.federation.rand.new(rand_source)`,\n\t\t\tByCacheIndex: 18,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"uuid\"\n\t\t  by: \".grpc.federation.uuid.newRandomFromRand(fixed_rand)\"\n\t\t}\n\t*/\n\tdef_uuid := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*grpcfedcel.UUID, *localValueType]{\n\t\t\tName: `uuid`,\n\t\t\tType: grpcfed.CELObjectType(\"grpc.federation.uuid.UUID\"),\n\t\t\tSetter: func(value *localValueType, v *grpcfedcel.UUID) error {\n\t\t\t\tvalue.vars.Uuid = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `.grpc.federation.uuid.newRandomFromRand(fixed_rand)`,\n\t\t\tByCacheIndex: 19,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"loc\"\n\t\t  by: \"grpc.federation.time.loadLocation('Asia/Tokyo')\"\n\t\t}\n\t*/\n\tdef_loc := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*grpcfedcel.Location, *localValueType]{\n\t\t\tName: `loc`,\n\t\t\tType: grpcfed.CELObjectType(\"grpc.federation.time.Location\"),\n\t\t\tSetter: func(value *localValueType, v *grpcfedcel.Location) error {\n\t\t\t\tvalue.vars.Loc = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `grpc.federation.time.loadLocation('Asia/Tokyo')`,\n\t\t\tByCacheIndex: 20,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"jp_time\"\n\t\t  by: \"grpc.federation.time.date(2023, 12, 25, 12, 10, 5, 0, loc)\"\n\t\t}\n\t*/\n\tdef_jp_time := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*grpcfedcel.Time, *localValueType]{\n\t\t\tName: `jp_time`,\n\t\t\tType: grpcfed.CELObjectType(\"grpc.federation.time.Time\"),\n\t\t\tSetter: func(value *localValueType, v *grpcfedcel.Time) error {\n\t\t\t\tvalue.vars.JpTime = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `grpc.federation.time.date(2023, 12, 25, 12, 10, 5, 0, loc)`,\n\t\t\tByCacheIndex: 21,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"value1\"\n\t\t  by: \"grpc.federation.metadata.incoming()['key1'][0]\"\n\t\t}\n\t*/\n\tdef_value1 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[string, *localValueType]{\n\t\t\tName: `value1`,\n\t\t\tType: grpcfed.CELStringType,\n\t\t\tSetter: func(value *localValueType, v string) error {\n\t\t\t\tvalue.vars.Value1 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `grpc.federation.metadata.incoming()['key1'][0]`,\n\t\t\tByCacheIndex: 22,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"a\"\n\t\t  message {\n\t\t    name: \"A\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_a := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*A, *localValueType]{\n\t\t\tName: `a`,\n\t\t\tType: grpcfed.CELObjectType(\"federation.A\"),\n\t\t\tSetter: func(value *localValueType, v *A) error {\n\t\t\t\tvalue.vars.A = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Federation_AArgument{}\n\t\t\t\tret, err := s.resolve_Federation_A(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"sorted_values\"\n\t\t  by: \"[4, 1, 3, 2].sortAsc(v, v)\"\n\t\t}\n\t*/\n\tdef_sorted_values := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[[]int64, *localValueType]{\n\t\t\tName: `sorted_values`,\n\t\t\tType: grpcfed.CELListType(grpcfed.CELIntType),\n\t\t\tSetter: func(value *localValueType, v []int64) error {\n\t\t\t\tvalue.vars.SortedValues = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `[4, 1, 3, 2].sortAsc(v, v)`,\n\t\t\tByCacheIndex: 23,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"sorted_items\"\n\t\t  by: \"[user.Item{location:user.Item.Location{addr1:'a'}}, user.Item{location:user.Item.Location{addr1:'b'}}].sortDesc(v, v.location.addr1)\"\n\t\t}\n\t*/\n\tdef_sorted_items := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[[]*user.Item, *localValueType]{\n\t\t\tName: `sorted_items`,\n\t\t\tType: grpcfed.CELListType(grpcfed.CELObjectType(\"user.Item\")),\n\t\t\tSetter: func(value *localValueType, v []*user.Item) error {\n\t\t\t\tvalue.vars.SortedItems = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `[user.Item{location:user.Item.Location{addr1:'a'}}, user.Item{location:user.Item.Location{addr1:'b'}}].sortDesc(v, v.location.addr1)`,\n\t\t\tByCacheIndex: 24,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"map_value\"\n\t\t  by: \"{1: 'a', 2: 'b', 3: 'c'}\"\n\t\t}\n\t*/\n\tdef_map_value := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[map[int64]string, *localValueType]{\n\t\t\tName: `map_value`,\n\t\t\tType: grpcfed.NewCELMapType(grpcfed.CELIntType, grpcfed.CELStringType),\n\t\t\tSetter: func(value *localValueType, v map[int64]string) error {\n\t\t\t\tvalue.vars.MapValue = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `{1: 'a', 2: 'b', 3: 'c'}`,\n\t\t\tByCacheIndex: 25,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"null_value\"\n\t\t  by: \"null\"\n\t\t}\n\t*/\n\tdef_null_value := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[any, *localValueType]{\n\t\t\tName: `null_value`,\n\t\t\tType: grpcfed.CELNullType,\n\t\t\tSetter: func(value *localValueType, v any) error {\n\t\t\t\tvalue.vars.NullValue = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `null`,\n\t\t\tByCacheIndex: 26,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"_def16\"\n\t\t  by: \"grpc.federation.log.info('output federation log', {'post_message': post})\"\n\t\t}\n\t*/\n\tdef__def16 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[bool, *localValueType]{\n\t\t\tName: `_def16`,\n\t\t\tType: grpcfed.CELBoolType,\n\t\t\tSetter: func(value *localValueType, v bool) error {\n\t\t\t\tvalue.vars.XDef16 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `grpc.federation.log.info('output federation log', {'post_message': post})`,\n\t\t\tByCacheIndex: 27,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"e\"\n\t\t  enum {\n\t\t    name: \"federation.Item.ItemType\"\n\t\t    by: \"true ? user.Item.ItemType.value('ITEM_TYPE_2') : user.Item.ItemType.from(1)\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_e := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[Item_ItemType, *localValueType]{\n\t\t\tName: `e`,\n\t\t\tType: grpcfed.CELIntType,\n\t\t\tSetter: func(value *localValueType, v Item_ItemType) error {\n\t\t\t\tvalue.vars.E = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tEnum: func(ctx context.Context, value *localValueType) (Item_ItemType, error) {\n\t\t\t\tsrc, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `true ? user.Item.ItemType.value('ITEM_TYPE_2') : user.Item.ItemType.from(1)`,\n\t\t\t\t\tOutType:    reflect.TypeOf(user.Item_ItemType(0)),\n\t\t\t\t\tCacheIndex: 28,\n\t\t\t\t})\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn 0, err\n\t\t\t\t}\n\t\t\t\tv := src.(user.Item_ItemType)\n\t\t\t\treturn s.cast_User_Item_ItemType__to__Federation_Item_ItemType(v)\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"sqrt_double\"\n\t\t  by: \"grpc.federation.math.sqrt(3.0*3.0+4.0*4.0)\"\n\t\t}\n\t*/\n\tdef_sqrt_double := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[float64, *localValueType]{\n\t\t\tName: `sqrt_double`,\n\t\t\tType: grpcfed.CELDoubleType,\n\t\t\tSetter: func(value *localValueType, v float64) error {\n\t\t\t\tvalue.vars.SqrtDouble = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `grpc.federation.math.sqrt(3.0*3.0+4.0*4.0)`,\n\t\t\tByCacheIndex: 29,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"sqrt_int\"\n\t\t  by: \"grpc.federation.math.sqrt(3*3+4*4)\"\n\t\t}\n\t*/\n\tdef_sqrt_int := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[float64, *localValueType]{\n\t\t\tName: `sqrt_int`,\n\t\t\tType: grpcfed.CELDoubleType,\n\t\t\tSetter: func(value *localValueType, v float64) error {\n\t\t\t\tvalue.vars.SqrtInt = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `grpc.federation.math.sqrt(3*3+4*4)`,\n\t\t\tByCacheIndex: 30,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"pow\"\n\t\t  by: \"grpc.federation.math.pow(2.0, 3.0)\"\n\t\t}\n\t*/\n\tdef_pow := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[float64, *localValueType]{\n\t\t\tName: `pow`,\n\t\t\tType: grpcfed.CELDoubleType,\n\t\t\tSetter: func(value *localValueType, v float64) error {\n\t\t\t\tvalue.vars.Pow = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `grpc.federation.math.pow(2.0, 3.0)`,\n\t\t\tByCacheIndex: 31,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"floor\"\n\t\t  by: \"grpc.federation.math.floor(1.51)\"\n\t\t}\n\t*/\n\tdef_floor := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[float64, *localValueType]{\n\t\t\tName: `floor`,\n\t\t\tType: grpcfed.CELDoubleType,\n\t\t\tSetter: func(value *localValueType, v float64) error {\n\t\t\t\tvalue.vars.Floor = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `grpc.federation.math.floor(1.51)`,\n\t\t\tByCacheIndex: 32,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"flatten\"\n\t\t  by: \"[[1], [2], [3]].flatten()\"\n\t\t}\n\t*/\n\tdef_flatten := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[[]int64, *localValueType]{\n\t\t\tName: `flatten`,\n\t\t\tType: grpcfed.CELListType(grpcfed.CELIntType),\n\t\t\tSetter: func(value *localValueType, v []int64) error {\n\t\t\t\tvalue.vars.Flatten = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `[[1], [2], [3]].flatten()`,\n\t\t\tByCacheIndex: 33,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"round\"\n\t\t  by: \"grpc.federation.math.round(1.5)\"\n\t\t}\n\t*/\n\tdef_round := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[float64, *localValueType]{\n\t\t\tName: `round`,\n\t\t\tType: grpcfed.CELDoubleType,\n\t\t\tSetter: func(value *localValueType, v float64) error {\n\t\t\t\tvalue.vars.Round = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `grpc.federation.math.round(1.5)`,\n\t\t\tByCacheIndex: 34,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"dup\"\n\t\t  by: \"[1, 2, 3, 4].filter(dup, dup % 2 == 0)\"\n\t\t}\n\t*/\n\tdef_dup := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[[]int64, *localValueType]{\n\t\t\tName: `dup`,\n\t\t\tType: grpcfed.CELListType(grpcfed.CELIntType),\n\t\t\tSetter: func(value *localValueType, v []int64) error {\n\t\t\t\tvalue.vars.Dup = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `[1, 2, 3, 4].filter(dup, dup % 2 == 0)`,\n\t\t\tByCacheIndex: 35,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"any\"\n\t\t  by: \"grpc.federation.any.new(post)\"\n\t\t}\n\t*/\n\tdef_any := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*anypb.Any, *localValueType]{\n\t\t\tName: `any`,\n\t\t\tType: grpcfed.CELObjectType(\"google.protobuf.Any\"),\n\t\t\tSetter: func(value *localValueType, v *anypb.Any) error {\n\t\t\t\tvalue.vars.Any = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `grpc.federation.any.new(post)`,\n\t\t\tByCacheIndex: 36,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"fmt\"\n\t\t  by: \"'%d-%d-%d-world'.format([1, 2, 3])\"\n\t\t}\n\t*/\n\tdef_fmt := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[string, *localValueType]{\n\t\t\tName: `fmt`,\n\t\t\tType: grpcfed.CELStringType,\n\t\t\tSetter: func(value *localValueType, v string) error {\n\t\t\t\tvalue.vars.Fmt = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `'%d-%d-%d-world'.format([1, 2, 3])`,\n\t\t\tByCacheIndex: 37,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"replaced\"\n\t\t  by: \"fmt.replace('world', 'grpc')\"\n\t\t}\n\t*/\n\tdef_replaced := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[string, *localValueType]{\n\t\t\tName: `replaced`,\n\t\t\tType: grpcfed.CELStringType,\n\t\t\tSetter: func(value *localValueType, v string) error {\n\t\t\t\tvalue.vars.Replaced = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `fmt.replace('world', 'grpc')`,\n\t\t\tByCacheIndex: 38,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"list_to_map\"\n\t\t  by: \"[1, 2, 3].transformMap(idx, v, idx % 2 == 0, (idx * v) + v)\"\n\t\t}\n\t*/\n\tdef_list_to_map := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[map[int64]int64, *localValueType]{\n\t\t\tName: `list_to_map`,\n\t\t\tType: grpcfed.NewCELMapType(grpcfed.CELIntType, grpcfed.CELIntType),\n\t\t\tSetter: func(value *localValueType, v map[int64]int64) error {\n\t\t\t\tvalue.vars.ListToMap = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `[1, 2, 3].transformMap(idx, v, idx % 2 == 0, (idx * v) + v)`,\n\t\t\tByCacheIndex: 39,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"uuid_parse\"\n\t\t  by: \"grpc.federation.uuid.parse(uuid.string())\"\n\t\t}\n\t*/\n\tdef_uuid_parse := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*grpcfedcel.UUID, *localValueType]{\n\t\t\tName: `uuid_parse`,\n\t\t\tType: grpcfed.CELObjectType(\"grpc.federation.uuid.UUID\"),\n\t\t\tSetter: func(value *localValueType, v *grpcfedcel.UUID) error {\n\t\t\t\tvalue.vars.UuidParse = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `grpc.federation.uuid.parse(uuid.string())`,\n\t\t\tByCacheIndex: 40,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"uuid_validate\"\n\t\t  by: \"grpc.federation.uuid.validate(uuid.string())\"\n\t\t}\n\t*/\n\tdef_uuid_validate := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[bool, *localValueType]{\n\t\t\tName: `uuid_validate`,\n\t\t\tType: grpcfed.CELBoolType,\n\t\t\tSetter: func(value *localValueType, v bool) error {\n\t\t\t\tvalue.vars.UuidValidate = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `grpc.federation.uuid.validate(uuid.string())`,\n\t\t\tByCacheIndex: 41,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"compile\"\n\t\t  by: \"grpc.federation.regexp.compile('[a-z]+\\\\\\\\d\\\\\\\\d')\"\n\t\t}\n\t*/\n\tdef_compile := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*grpcfedcel.Regexp, *localValueType]{\n\t\t\tName: `compile`,\n\t\t\tType: grpcfed.CELObjectType(\"grpc.federation.regexp.Regexp\"),\n\t\t\tSetter: func(value *localValueType, v *grpcfedcel.Regexp) error {\n\t\t\t\tvalue.vars.Compile = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `grpc.federation.regexp.compile('[a-z]+\\\\d\\\\d')`,\n\t\t\tByCacheIndex: 42,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"must_compile\"\n\t\t  by: \"grpc.federation.regexp.mustCompile('([a-z]+)\\\\\\\\d(\\\\\\\\d)')\"\n\t\t}\n\t*/\n\tdef_must_compile := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*grpcfedcel.Regexp, *localValueType]{\n\t\t\tName: `must_compile`,\n\t\t\tType: grpcfed.CELObjectType(\"grpc.federation.regexp.Regexp\"),\n\t\t\tSetter: func(value *localValueType, v *grpcfedcel.Regexp) error {\n\t\t\t\tvalue.vars.MustCompile = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `grpc.federation.regexp.mustCompile('([a-z]+)\\\\d(\\\\d)')`,\n\t\t\tByCacheIndex: 43,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"quote_meta\"\n\t\t  by: \"grpc.federation.regexp.quoteMeta('[a-z]+\\\\\\\\d')\"\n\t\t}\n\t*/\n\tdef_quote_meta := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[string, *localValueType]{\n\t\t\tName: `quote_meta`,\n\t\t\tType: grpcfed.CELStringType,\n\t\t\tSetter: func(value *localValueType, v string) error {\n\t\t\t\tvalue.vars.QuoteMeta = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `grpc.federation.regexp.quoteMeta('[a-z]+\\\\d')`,\n\t\t\tByCacheIndex: 44,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"find_string_submatch\"\n\t\t  by: \"must_compile.findStringSubmatch('abc123')\"\n\t\t}\n\t*/\n\tdef_find_string_submatch := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[[]string, *localValueType]{\n\t\t\tName: `find_string_submatch`,\n\t\t\tType: grpcfed.CELListType(grpcfed.CELStringType),\n\t\t\tSetter: func(value *localValueType, v []string) error {\n\t\t\t\tvalue.vars.FindStringSubmatch = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `must_compile.findStringSubmatch('abc123')`,\n\t\t\tByCacheIndex: 45,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"match_string\"\n\t\t  by: \"compile.matchString('abc12')\"\n\t\t}\n\t*/\n\tdef_match_string := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[bool, *localValueType]{\n\t\t\tName: `match_string`,\n\t\t\tType: grpcfed.CELBoolType,\n\t\t\tSetter: func(value *localValueType, v bool) error {\n\t\t\t\tvalue.vars.MatchString = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `compile.matchString('abc12')`,\n\t\t\tByCacheIndex: 46,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"replace_all_string\"\n\t\t  by: \"grpc.federation.regexp.compile('mackerel').replaceAllString('mackerel is tasty', 'salmon')\"\n\t\t}\n\t*/\n\tdef_replace_all_string := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[string, *localValueType]{\n\t\t\tName: `replace_all_string`,\n\t\t\tType: grpcfed.CELStringType,\n\t\t\tSetter: func(value *localValueType, v string) error {\n\t\t\t\tvalue.vars.ReplaceAllString = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `grpc.federation.regexp.compile('mackerel').replaceAllString('mackerel is tasty', 'salmon')`,\n\t\t\tByCacheIndex: 47,\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t                                          post ─┐\n\t                                                              _def16 ─┐\n\t                                                                   a ─┤\n\t                                          post ─┐                     │\n\t                                                                 any ─┤\n\t                                                                 dup ─┤\n\t                                                                   e ─┤\n\t                                  must_compile ─┐                     │\n\t                                                find_string_submatch ─┤\n\t                                                             flatten ─┤\n\t                                                               floor ─┤\n\t                                           loc ─┐                     │\n\t                                                             jp_time ─┤\n\t                                                         list_to_map ─┤\n\t                                                           map_value ─┤\n\t                                       compile ─┐                     │\n\t                                                        match_string ─┤\n\t                                                          null_value ─┤\n\t                                  strings_join ─┐                     │\n\t                                                         parse_float ─┤\n\t                                                                 pow ─┤\n\t                                                          quote_meta ─┤\n\t                                                  replace_all_string ─┤\n\t                                           fmt ─┐                     │\n\t                                                            replaced ─┤\n\t                                                               round ─┤\n\t                                                        sorted_items ─┤\n\t                                                       sorted_values ─┤\n\t                                                         sqrt_double ─┤\n\t                                                            sqrt_int ─┤\n\t                                                                 url ─┤\n\t   date ─┐                                                            │\n\t         rand_source ─┐                                               │\n\t                      fixed_rand ─┐                                   │\n\t                                          uuid ─┐                     │\n\t                                                          uuid_parse ─┤\n\t   date ─┐                                                            │\n\t         rand_source ─┐                                               │\n\t                      fixed_rand ─┐                                   │\n\t                                          uuid ─┐                     │\n\t                                                       uuid_validate ─┤\n\t                                                              value1 ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_post(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def__def16(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_a(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_post(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_any(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_dup(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_e(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_must_compile(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_find_string_submatch(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_flatten(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_floor(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_loc(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_jp_time(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_list_to_map(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_map_value(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_compile(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_match_string(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_null_value(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_strings_join(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_parse_float(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_pow(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_quote_meta(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_replace_all_string(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_fmt(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_replaced(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_round(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_sorted_items(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_sorted_values(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_sqrt_double(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_sqrt_int(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_url(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_date(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_rand_source(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_fixed_rand(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_uuid(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_uuid_parse(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_date(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_rand_source(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_fixed_rand(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_uuid(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_uuid_validate(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_value1(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Federation_GetPostResponseVariable.A = value.vars.A\n\treq.FederationService_Federation_GetPostResponseVariable.Any = value.vars.Any\n\treq.FederationService_Federation_GetPostResponseVariable.Compile = value.vars.Compile\n\treq.FederationService_Federation_GetPostResponseVariable.Date = value.vars.Date\n\treq.FederationService_Federation_GetPostResponseVariable.E = value.vars.E\n\treq.FederationService_Federation_GetPostResponseVariable.FindStringSubmatch = value.vars.FindStringSubmatch\n\treq.FederationService_Federation_GetPostResponseVariable.FixedRand = value.vars.FixedRand\n\treq.FederationService_Federation_GetPostResponseVariable.Flatten = value.vars.Flatten\n\treq.FederationService_Federation_GetPostResponseVariable.Floor = value.vars.Floor\n\treq.FederationService_Federation_GetPostResponseVariable.Fmt = value.vars.Fmt\n\treq.FederationService_Federation_GetPostResponseVariable.JpTime = value.vars.JpTime\n\treq.FederationService_Federation_GetPostResponseVariable.ListToMap = value.vars.ListToMap\n\treq.FederationService_Federation_GetPostResponseVariable.Loc = value.vars.Loc\n\treq.FederationService_Federation_GetPostResponseVariable.MapValue = value.vars.MapValue\n\treq.FederationService_Federation_GetPostResponseVariable.MatchString = value.vars.MatchString\n\treq.FederationService_Federation_GetPostResponseVariable.MustCompile = value.vars.MustCompile\n\treq.FederationService_Federation_GetPostResponseVariable.NullValue = value.vars.NullValue\n\treq.FederationService_Federation_GetPostResponseVariable.ParseFloat = value.vars.ParseFloat\n\treq.FederationService_Federation_GetPostResponseVariable.Post = value.vars.Post\n\treq.FederationService_Federation_GetPostResponseVariable.Pow = value.vars.Pow\n\treq.FederationService_Federation_GetPostResponseVariable.QuoteMeta = value.vars.QuoteMeta\n\treq.FederationService_Federation_GetPostResponseVariable.RandSource = value.vars.RandSource\n\treq.FederationService_Federation_GetPostResponseVariable.ReplaceAllString = value.vars.ReplaceAllString\n\treq.FederationService_Federation_GetPostResponseVariable.Replaced = value.vars.Replaced\n\treq.FederationService_Federation_GetPostResponseVariable.Round = value.vars.Round\n\treq.FederationService_Federation_GetPostResponseVariable.SortedItems = value.vars.SortedItems\n\treq.FederationService_Federation_GetPostResponseVariable.SortedValues = value.vars.SortedValues\n\treq.FederationService_Federation_GetPostResponseVariable.SqrtDouble = value.vars.SqrtDouble\n\treq.FederationService_Federation_GetPostResponseVariable.SqrtInt = value.vars.SqrtInt\n\treq.FederationService_Federation_GetPostResponseVariable.StringsJoin = value.vars.StringsJoin\n\treq.FederationService_Federation_GetPostResponseVariable.Url = value.vars.Url\n\treq.FederationService_Federation_GetPostResponseVariable.Uuid = value.vars.Uuid\n\treq.FederationService_Federation_GetPostResponseVariable.UuidParse = value.vars.UuidParse\n\treq.FederationService_Federation_GetPostResponseVariable.UuidValidate = value.vars.UuidValidate\n\treq.FederationService_Federation_GetPostResponseVariable.Value1 = value.vars.Value1\n\n\t// create a message value to be returned.\n\tret := &GetPostResponse{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"post\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*Post]{\n\t\tValue:      value,\n\t\tExpr:       `post`,\n\t\tCacheIndex: 48,\n\t\tSetter: func(v *Post) error {\n\t\t\tret.Post = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"'hello'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'hello'`,\n\t\tCacheIndex: 49,\n\t\tSetter: func(v string) error {\n\t\t\tret.Str = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"uuid.string()\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `uuid.string()`,\n\t\tCacheIndex: 50,\n\t\tSetter: func(v string) error {\n\t\t\tret.Uuid = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"loc.string()\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `loc.string()`,\n\t\tCacheIndex: 51,\n\t\tSetter: func(v string) error {\n\t\t\tret.Loc = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"value1\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `value1`,\n\t\tCacheIndex: 52,\n\t\tSetter: func(v string) error {\n\t\t\tret.Value1 = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"Item.ItemType.name(Item.ItemType.ITEM_TYPE_1)\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `Item.ItemType.name(Item.ItemType.ITEM_TYPE_1)`,\n\t\tCacheIndex: 53,\n\t\tSetter: func(v string) error {\n\t\t\tret.ItemTypeName = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"Item.Location.LocationType.name(Item.Location.LocationType.LOCATION_TYPE_1)\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `Item.Location.LocationType.name(Item.Location.LocationType.LOCATION_TYPE_1)`,\n\t\tCacheIndex: 54,\n\t\tSetter: func(v string) error {\n\t\t\tret.LocationTypeName = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"user.Item.ItemType.name(user.Item.ItemType.ITEM_TYPE_2)\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `user.Item.ItemType.name(user.Item.ItemType.ITEM_TYPE_2)`,\n\t\tCacheIndex: 55,\n\t\tSetter: func(v string) error {\n\t\t\tret.UserItemTypeName = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"user.Item.ItemType.value('ITEM_TYPE_1')\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[user.Item_ItemType]{\n\t\tValue:      value,\n\t\tExpr:       `user.Item.ItemType.value('ITEM_TYPE_1')`,\n\t\tCacheIndex: 56,\n\t\tSetter: func(v user.Item_ItemType) error {\n\t\t\titemTypeValueEnumValue, err := s.cast_User_Item_ItemType__to__Federation_Item_ItemType(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.ItemTypeValueEnum = itemTypeValueEnumValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"user.Item.ItemType.value('ITEM_TYPE_1')\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[user.Item_ItemType]{\n\t\tValue:      value,\n\t\tExpr:       `user.Item.ItemType.value('ITEM_TYPE_1')`,\n\t\tCacheIndex: 57,\n\t\tSetter: func(v user.Item_ItemType) error {\n\t\t\titemTypeValueIntValue, err := s.cast_User_Item_ItemType__to__int32(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.ItemTypeValueInt = itemTypeValueIntValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"user.Item.ItemType.from(1)\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[user.Item_ItemType]{\n\t\tValue:      value,\n\t\tExpr:       `user.Item.ItemType.from(1)`,\n\t\tCacheIndex: 58,\n\t\tSetter: func(v user.Item_ItemType) error {\n\t\t\titemTypeValueCastValue, err := s.cast_User_Item_ItemType__to__Federation_Item_ItemType(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.ItemTypeValueCast = itemTypeValueCastValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"Item.Location.LocationType.value('LOCATION_TYPE_1')\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[Item_Location_LocationType]{\n\t\tValue:      value,\n\t\tExpr:       `Item.Location.LocationType.value('LOCATION_TYPE_1')`,\n\t\tCacheIndex: 59,\n\t\tSetter: func(v Item_Location_LocationType) error {\n\t\t\tlocationTypeValueValue, err := s.cast_Federation_Item_Location_LocationType__to__int32(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.LocationTypeValue = locationTypeValueValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"user.Item.ItemType.value('ITEM_TYPE_2')\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[user.Item_ItemType]{\n\t\tValue:      value,\n\t\tExpr:       `user.Item.ItemType.value('ITEM_TYPE_2')`,\n\t\tCacheIndex: 60,\n\t\tSetter: func(v user.Item_ItemType) error {\n\t\t\tuserItemTypeValueValue, err := s.cast_User_Item_ItemType__to__int32(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.UserItemTypeValue = userItemTypeValueValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"a\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*A]{\n\t\tValue:      value,\n\t\tExpr:       `a`,\n\t\tCacheIndex: 61,\n\t\tSetter: func(v *A) error {\n\t\t\tret.A = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"sorted_values\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]int32]{\n\t\tValue:      value,\n\t\tExpr:       `sorted_values`,\n\t\tCacheIndex: 62,\n\t\tSetter: func(v []int32) error {\n\t\t\tret.SortedValues = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"sorted_items\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]*user.Item]{\n\t\tValue:      value,\n\t\tExpr:       `sorted_items`,\n\t\tCacheIndex: 63,\n\t\tSetter: func(v []*user.Item) error {\n\t\t\tsortedItemsValue, err := s.cast_repeated_User_Item__to__repeated_Federation_Item(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.SortedItems = sortedItemsValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"map_value\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[map[int64]string]{\n\t\tValue:      value,\n\t\tExpr:       `map_value`,\n\t\tCacheIndex: 64,\n\t\tSetter: func(v map[int64]string) error {\n\t\t\tmapValueValue, err := s.cast_map_int64_string__to__map_int32_string(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.MapValue = mapValueValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"google.protobuf.DoubleValue{value: 1.23}\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*wrapperspb.DoubleValue]{\n\t\tValue:      value,\n\t\tExpr:       `google.protobuf.DoubleValue{value: 1.23}`,\n\t\tCacheIndex: 65,\n\t\tSetter: func(v *wrapperspb.DoubleValue) error {\n\t\t\tdoubleWrapperValueValue, err := s.cast_Google_Protobuf_DoubleValue__to__Google_Protobuf_DoubleValue(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.DoubleWrapperValue = doubleWrapperValueValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"google.protobuf.FloatValue{value: 3.45}\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*wrapperspb.DoubleValue]{\n\t\tValue:      value,\n\t\tExpr:       `google.protobuf.FloatValue{value: 3.45}`,\n\t\tCacheIndex: 66,\n\t\tSetter: func(v *wrapperspb.DoubleValue) error {\n\t\t\tfloatWrapperValueValue, err := s.cast_Google_Protobuf_DoubleValue__to__Google_Protobuf_FloatValue(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.FloatWrapperValue = floatWrapperValueValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"google.protobuf.Int64Value{value: 1}\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*wrapperspb.Int64Value]{\n\t\tValue:      value,\n\t\tExpr:       `google.protobuf.Int64Value{value: 1}`,\n\t\tCacheIndex: 67,\n\t\tSetter: func(v *wrapperspb.Int64Value) error {\n\t\t\ti64WrapperValueValue, err := s.cast_Google_Protobuf_Int64Value__to__Google_Protobuf_Int64Value(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.I64WrapperValue = i64WrapperValueValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"google.protobuf.UInt64Value{value: uint(2)}\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*wrapperspb.UInt64Value]{\n\t\tValue:      value,\n\t\tExpr:       `google.protobuf.UInt64Value{value: uint(2)}`,\n\t\tCacheIndex: 68,\n\t\tSetter: func(v *wrapperspb.UInt64Value) error {\n\t\t\tu64WrapperValueValue, err := s.cast_Google_Protobuf_UInt64Value__to__Google_Protobuf_UInt64Value(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.U64WrapperValue = u64WrapperValueValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"google.protobuf.Int32Value{value: 3}\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*wrapperspb.Int64Value]{\n\t\tValue:      value,\n\t\tExpr:       `google.protobuf.Int32Value{value: 3}`,\n\t\tCacheIndex: 69,\n\t\tSetter: func(v *wrapperspb.Int64Value) error {\n\t\t\ti32WrapperValueValue, err := s.cast_Google_Protobuf_Int64Value__to__Google_Protobuf_Int32Value(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.I32WrapperValue = i32WrapperValueValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"google.protobuf.UInt32Value{value: uint(4)}\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*wrapperspb.UInt64Value]{\n\t\tValue:      value,\n\t\tExpr:       `google.protobuf.UInt32Value{value: uint(4)}`,\n\t\tCacheIndex: 70,\n\t\tSetter: func(v *wrapperspb.UInt64Value) error {\n\t\t\tu32WrapperValueValue, err := s.cast_Google_Protobuf_UInt64Value__to__Google_Protobuf_UInt32Value(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.U32WrapperValue = u32WrapperValueValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"google.protobuf.BoolValue{value: true}\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*wrapperspb.BoolValue]{\n\t\tValue:      value,\n\t\tExpr:       `google.protobuf.BoolValue{value: true}`,\n\t\tCacheIndex: 71,\n\t\tSetter: func(v *wrapperspb.BoolValue) error {\n\t\t\tboolWrapperValueValue, err := s.cast_Google_Protobuf_BoolValue__to__Google_Protobuf_BoolValue(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.BoolWrapperValue = boolWrapperValueValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"google.protobuf.StringValue{value: 'hello'}\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*wrapperspb.StringValue]{\n\t\tValue:      value,\n\t\tExpr:       `google.protobuf.StringValue{value: 'hello'}`,\n\t\tCacheIndex: 72,\n\t\tSetter: func(v *wrapperspb.StringValue) error {\n\t\t\tstringWrapperValueValue, err := s.cast_Google_Protobuf_StringValue__to__Google_Protobuf_StringValue(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.StringWrapperValue = stringWrapperValueValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"google.protobuf.BytesValue{value: bytes('world')}\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*wrapperspb.BytesValue]{\n\t\tValue:      value,\n\t\tExpr:       `google.protobuf.BytesValue{value: bytes('world')}`,\n\t\tCacheIndex: 73,\n\t\tSetter: func(v *wrapperspb.BytesValue) error {\n\t\t\tbytesWrapperValueValue, err := s.cast_Google_Protobuf_BytesValue__to__Google_Protobuf_BytesValue(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.BytesWrapperValue = bytesWrapperValueValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"'hello\\\\nworld'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'hello\\nworld'`,\n\t\tCacheIndex: 74,\n\t\tSetter: func(v string) error {\n\t\t\tret.Hello = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"null\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*timestamppb.Timestamp]{\n\t\tValue:      value,\n\t\tExpr:       `null`,\n\t\tCacheIndex: 75,\n\t\tSetter: func(v *timestamppb.Timestamp) error {\n\t\t\tret.NullTimestamp = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"null_value\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*timestamppb.Timestamp]{\n\t\tValue:      value,\n\t\tExpr:       `null_value`,\n\t\tCacheIndex: 76,\n\t\tSetter: func(v *timestamppb.Timestamp) error {\n\t\t\tret.NullTimestamp2 = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"true ? null : google.protobuf.Timestamp{}\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*timestamppb.Timestamp]{\n\t\tValue:      value,\n\t\tExpr:       `true ? null : google.protobuf.Timestamp{}`,\n\t\tCacheIndex: 77,\n\t\tSetter: func(v *timestamppb.Timestamp) error {\n\t\t\tret.NullTimestamp3 = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"jp_time.location().string()\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `jp_time.location().string()`,\n\t\tCacheIndex: 78,\n\t\tSetter: func(v string) error {\n\t\t\tret.JpLoc = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"strings_join\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `strings_join`,\n\t\tCacheIndex: 79,\n\t\tSetter: func(v string) error {\n\t\t\tret.StringsJoin = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"parse_float\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[float64]{\n\t\tValue:      value,\n\t\tExpr:       `parse_float`,\n\t\tCacheIndex: 80,\n\t\tSetter: func(v float64) error {\n\t\t\tret.ParseFloat = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"url.userinfo().username()\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `url.userinfo().username()`,\n\t\tCacheIndex: 81,\n\t\tSetter: func(v string) error {\n\t\t\tret.UrlUserName = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"e\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[Item_ItemType]{\n\t\tValue:      value,\n\t\tExpr:       `e`,\n\t\tCacheIndex: 82,\n\t\tSetter: func(v Item_ItemType) error {\n\t\t\tret.EnumValue = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"Item.ItemType.attr(e, 'en')\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `Item.ItemType.attr(e, 'en')`,\n\t\tCacheIndex: 83,\n\t\tSetter: func(v string) error {\n\t\t\tret.EnumValueStr = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"sqrt_double\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[float64]{\n\t\tValue:      value,\n\t\tExpr:       `sqrt_double`,\n\t\tCacheIndex: 84,\n\t\tSetter: func(v float64) error {\n\t\t\tret.SqrtDouble = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"sqrt_int\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[float64]{\n\t\tValue:      value,\n\t\tExpr:       `sqrt_int`,\n\t\tCacheIndex: 85,\n\t\tSetter: func(v float64) error {\n\t\t\tret.SqrtInt = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"pow\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[float64]{\n\t\tValue:      value,\n\t\tExpr:       `pow`,\n\t\tCacheIndex: 86,\n\t\tSetter: func(v float64) error {\n\t\t\tret.Pow = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"floor\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[float64]{\n\t\tValue:      value,\n\t\tExpr:       `floor`,\n\t\tCacheIndex: 87,\n\t\tSetter: func(v float64) error {\n\t\t\tret.Floor = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"flatten\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]int64]{\n\t\tValue:      value,\n\t\tExpr:       `flatten`,\n\t\tCacheIndex: 88,\n\t\tSetter: func(v []int64) error {\n\t\t\tret.Flatten = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"round\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[float64]{\n\t\tValue:      value,\n\t\tExpr:       `round`,\n\t\tCacheIndex: 89,\n\t\tSetter: func(v float64) error {\n\t\t\tret.Round = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"any\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*anypb.Any]{\n\t\tValue:      value,\n\t\tExpr:       `any`,\n\t\tCacheIndex: 90,\n\t\tSetter: func(v *anypb.Any) error {\n\t\t\tanyValue, err := s.cast_Google_Protobuf_Any__to__Google_Protobuf_Any(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.Any = anyValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"replaced\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `replaced`,\n\t\tCacheIndex: 91,\n\t\tSetter: func(v string) error {\n\t\t\tret.Replaced = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"list_to_map\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[map[int64]int64]{\n\t\tValue:      value,\n\t\tExpr:       `list_to_map`,\n\t\tCacheIndex: 92,\n\t\tSetter: func(v map[int64]int64) error {\n\t\t\tlistToMapValue, err := s.cast_map_int64_int64__to__map_int32_int32(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.ListToMap = listToMapValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"uuid_parse.string()\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `uuid_parse.string()`,\n\t\tCacheIndex: 93,\n\t\tSetter: func(v string) error {\n\t\t\tret.UuidParse = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"uuid_validate\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[bool]{\n\t\tValue:      value,\n\t\tExpr:       `uuid_validate`,\n\t\tCacheIndex: 94,\n\t\tSetter: func(v bool) error {\n\t\t\tret.UuidValidate = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"compile.string()\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `compile.string()`,\n\t\tCacheIndex: 95,\n\t\tSetter: func(v string) error {\n\t\t\tret.Compile = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"must_compile.string()\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `must_compile.string()`,\n\t\tCacheIndex: 96,\n\t\tSetter: func(v string) error {\n\t\t\tret.MustCompile = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"quote_meta\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `quote_meta`,\n\t\tCacheIndex: 97,\n\t\tSetter: func(v string) error {\n\t\t\tret.QuoteMeta = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"find_string_submatch\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]string]{\n\t\tValue:      value,\n\t\tExpr:       `find_string_submatch`,\n\t\tCacheIndex: 98,\n\t\tSetter: func(v []string) error {\n\t\t\tret.FindStringSubmatch = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"match_string\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[bool]{\n\t\tValue:      value,\n\t\tExpr:       `match_string`,\n\t\tCacheIndex: 99,\n\t\tSetter: func(v bool) error {\n\t\t\tret.MatchString = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"replace_all_string\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `replace_all_string`,\n\t\tCacheIndex: 100,\n\t\tSetter: func(v string) error {\n\t\t\tret.ReplaceAllString = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.GetPostResponse\", slog.Any(\"federation.GetPostResponse\", s.logvalue_Federation_GetPostResponse(ret)))\n\treturn ret, nil\n}\n\n// resolve_Federation_Post resolve \"federation.Post\" message.\nfunc (s *FederationService) resolve_Federation_Post(ctx context.Context, req *FederationService_Federation_PostArgument) (*Post, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.Post\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.Post\", slog.Any(\"message_args\", s.logvalue_Federation_PostArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tPost *post.Post\n\t\t\tRes  *post.GetPostResponse\n\t\t\tUser *User\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.federation.PostArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"post.PostService/GetPost\"\n\t\t    request { field: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.GetPostResponse, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"post.GetPostResponse\"),\n\t\t\tSetter: func(value *localValueType, v *post.GetPostResponse) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &post.GetPostRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 101,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call post.PostService/GetPost\", slog.Any(\"post.GetPostRequest\", s.logvalue_Post_GetPostRequest(args)))\n\t\t\t\tret, err := grpcfed.WithTimeout[post.GetPostResponse](ctx, \"post.PostService/GetPost\", 10000000000 /* 10s */, func(ctx context.Context) (*post.GetPostResponse, error) {\n\t\t\t\t\tb := grpcfed.NewConstantBackOff(2000000000) /* 2s */\n\t\t\t\t\tb = grpcfed.BackOffWithMaxRetries(b, 3)\n\t\t\t\t\tb = grpcfed.BackOffWithContext(b, ctx)\n\t\t\t\t\treturn grpcfed.WithRetry(ctx, &grpcfed.RetryParam[post.GetPostResponse]{\n\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\tIf:         `true`,\n\t\t\t\t\t\tCacheIndex: 102,\n\t\t\t\t\t\tBackOff:    b,\n\t\t\t\t\t\tBody: func() (*post.GetPostResponse, error) {\n\t\t\t\t\t\t\treturn s.client.Post_PostServiceClient.GetPost(ctx, args)\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Post_PostService_GetPost, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"post\"\n\t\t  autobind: true\n\t\t  by: \"res.post\"\n\t\t}\n\t*/\n\tdef_post := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.Post, *localValueType]{\n\t\t\tName: `post`,\n\t\t\tType: grpcfed.CELObjectType(\"post.Post\"),\n\t\t\tSetter: func(value *localValueType, v *post.Post) error {\n\t\t\t\tvalue.vars.Post = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `res.post`,\n\t\t\tByCacheIndex: 103,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"user\"\n\t\t  message {\n\t\t    name: \"User\"\n\t\t    args { inline: \"post\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_user := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*User, *localValueType]{\n\t\t\tName: `user`,\n\t\t\tType: grpcfed.CELObjectType(\"federation.User\"),\n\t\t\tSetter: func(value *localValueType, v *User) error {\n\t\t\t\tvalue.vars.User = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Federation_UserArgument{}\n\t\t\t\t// { inline: \"post\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*post.Post]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `post`,\n\t\t\t\t\tCacheIndex: 104,\n\t\t\t\t\tSetter: func(v *post.Post) error {\n\t\t\t\t\t\targs.Id = v.GetId()\n\t\t\t\t\t\targs.Title = v.GetTitle()\n\t\t\t\t\t\targs.Content = v.GetContent()\n\t\t\t\t\t\targs.UserId = v.GetUserId()\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Federation_User(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_res(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\tif err := def_post(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\tif err := def_user(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Federation_PostVariable.Post = value.vars.Post\n\treq.FederationService_Federation_PostVariable.Res = value.vars.Res\n\treq.FederationService_Federation_PostVariable.User = value.vars.User\n\n\t// create a message value to be returned.\n\tret := &Post{}\n\n\t// field binding section.\n\tret.Id = value.vars.Post.GetId()           // { name: \"post\", autobind: true }\n\tret.Title = value.vars.Post.GetTitle()     // { name: \"post\", autobind: true }\n\tret.Content = value.vars.Post.GetContent() // { name: \"post\", autobind: true }\n\t// (grpc.federation.field).by = \"user\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*User]{\n\t\tValue:      value,\n\t\tExpr:       `user`,\n\t\tCacheIndex: 105,\n\t\tSetter: func(v *User) error {\n\t\t\tret.User = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.Post\", slog.Any(\"federation.Post\", s.logvalue_Federation_Post(ret)))\n\treturn ret, nil\n}\n\n// resolve_Federation_User resolve \"federation.User\" message.\nfunc (s *FederationService) resolve_Federation_User(ctx context.Context, req *FederationService_Federation_UserArgument) (*User, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.User\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.User\", slog.Any(\"message_args\", s.logvalue_Federation_UserArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tRes  *user.GetUserResponse\n\t\t\tUser *user.User\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.federation.UserArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"user.UserService/GetUser\"\n\t\t    request: [\n\t\t      { field: \"id\", by: \"$.user_id\" },\n\t\t      { field: \"type\", by: \"user.Item.ItemType.value('ITEM_TYPE_1')\" }\n\t\t    ]\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*user.GetUserResponse, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"user.GetUserResponse\"),\n\t\t\tSetter: func(value *localValueType, v *user.GetUserResponse) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &user.GetUserRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.user_id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.user_id`,\n\t\t\t\t\tCacheIndex: 106,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"type\", by: \"user.Item.ItemType.value('ITEM_TYPE_1')\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[user.Item_ItemType]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `user.Item.ItemType.value('ITEM_TYPE_1')`,\n\t\t\t\t\tCacheIndex: 107,\n\t\t\t\t\tSetter: func(v user.Item_ItemType) error {\n\t\t\t\t\t\ttypeValue, err := s.cast_User_Item_ItemType__to__int32(v)\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t}\n\t\t\t\t\t\targs.Type = typeValue\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call user.UserService/GetUser\", slog.Any(\"user.GetUserRequest\", s.logvalue_User_GetUserRequest(args)))\n\t\t\t\tret, err := grpcfed.WithTimeout[user.GetUserResponse](ctx, \"user.UserService/GetUser\", 20000000000 /* 20s */, func(ctx context.Context) (*user.GetUserResponse, error) {\n\t\t\t\t\tb := grpcfed.NewExponentialBackOff(&grpcfed.ExponentialBackOffConfig{\n\t\t\t\t\t\tInitialInterval:     1000000000, /* 1s */\n\t\t\t\t\t\tRandomizationFactor: 0.7,\n\t\t\t\t\t\tMultiplier:          1.7,\n\t\t\t\t\t\tMaxInterval:         30000000000, /* 30s */\n\t\t\t\t\t\tMaxElapsedTime:      20000000000, /* 20s */\n\t\t\t\t\t})\n\t\t\t\t\tb = grpcfed.BackOffWithMaxRetries(b, 3)\n\t\t\t\t\tb = grpcfed.BackOffWithContext(b, ctx)\n\t\t\t\t\treturn grpcfed.WithRetry(ctx, &grpcfed.RetryParam[user.GetUserResponse]{\n\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\tIf:         `true`,\n\t\t\t\t\t\tCacheIndex: 108,\n\t\t\t\t\t\tBackOff:    b,\n\t\t\t\t\t\tBody: func() (*user.GetUserResponse, error) {\n\t\t\t\t\t\t\treturn s.client.User_UserServiceClient.GetUser(ctx, args)\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_User_UserService_GetUser, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"user\"\n\t\t  autobind: true\n\t\t  by: \"res.user\"\n\t\t}\n\t*/\n\tdef_user := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*user.User, *localValueType]{\n\t\t\tName: `user`,\n\t\t\tType: grpcfed.CELObjectType(\"user.User\"),\n\t\t\tSetter: func(value *localValueType, v *user.User) error {\n\t\t\t\tvalue.vars.User = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `res.user`,\n\t\t\tByCacheIndex: 109,\n\t\t})\n\t}\n\n\tif err := def_res(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\tif err := def_user(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Federation_UserVariable.Res = value.vars.Res\n\treq.FederationService_Federation_UserVariable.User = value.vars.User\n\n\t// create a message value to be returned.\n\tret := &User{}\n\n\t// field binding section.\n\tret.Id = value.vars.User.GetId()     // { name: \"user\", autobind: true }\n\tret.Name = value.vars.User.GetName() // { name: \"user\", autobind: true }\n\t{\n\t\titemsValue, err := s.cast_repeated_User_Item__to__repeated_Federation_Item(value.vars.User.GetItems()) // { name: \"user\", autobind: true }\n\t\tif err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tret.Items = itemsValue\n\t}\n\tret.Profile = value.vars.User.GetProfile() // { name: \"user\", autobind: true }\n\tif false {\n\t\t// For code generation reasons, we're using a loop to generate the oneof conditional branches,\n\t\t// so to avoid treating the first element specially, we always generate if branch with false condition.\n\t} else if _, ok := value.vars.User.Attr.(*user.User_AttrA_); ok {\n\n\t\tattrValue, err := s.cast_User_User_AttrA___to__Federation_User_AttrA_(value.vars.User.Attr.(*user.User_AttrA_))\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret.Attr = attrValue\n\t} else if _, ok := value.vars.User.Attr.(*user.User_B); ok {\n\n\t\tattrValue, err := s.cast_User_User_B__to__Federation_User_B(value.vars.User.Attr.(*user.User_B))\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret.Attr = attrValue\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.User\", slog.Any(\"federation.User\", s.logvalue_Federation_User(ret)))\n\treturn ret, nil\n}\n\n// cast_Federation_A_B_C__to__Federation_A_OptC cast from \"federation.A.B.C\" to \"federation.A.opt_c\".\nfunc (s *FederationService) cast_Federation_A_B_C__to__Federation_A_OptC(from *A_B_C) (*A_OptC, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\ttypeValue := from.GetType()\n\tret := &A_B_C{\n\t\tType: typeValue,\n\t}\n\n\treturn &A_OptC{\n\t\tOptC: ret,\n\t}, nil\n}\n\n// cast_Federation_Item_Location_LocationType__to__int32 cast from \"federation.Item.Location.LocationType\" to \"int32\".\nfunc (s *FederationService) cast_Federation_Item_Location_LocationType__to__int32(from Item_Location_LocationType) (int32, error) {\n\treturn int32(from), nil\n}\n\n// cast_Google_Protobuf_Any__to__Google_Protobuf_Any cast from \"google.protobuf.Any\" to \"google.protobuf.Any\".\nfunc (s *FederationService) cast_Google_Protobuf_Any__to__Google_Protobuf_Any(from *anypb.Any) (*anypb.Any, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\ttypeUrlValue := from.GetTypeUrl()\n\tvalueValue := from.GetValue()\n\tret := &anypb.Any{\n\t\tTypeUrl: typeUrlValue,\n\t\tValue:   valueValue,\n\t}\n\n\treturn ret, nil\n}\n\n// cast_Google_Protobuf_BoolValue__to__Google_Protobuf_BoolValue cast from \"google.protobuf.BoolValue\" to \"google.protobuf.BoolValue\".\nfunc (s *FederationService) cast_Google_Protobuf_BoolValue__to__Google_Protobuf_BoolValue(from *wrapperspb.BoolValue) (*wrapperspb.BoolValue, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tvalueValue := from.GetValue()\n\tret := &wrapperspb.BoolValue{\n\t\tValue: valueValue,\n\t}\n\n\treturn ret, nil\n}\n\n// cast_Google_Protobuf_BytesValue__to__Google_Protobuf_BytesValue cast from \"google.protobuf.BytesValue\" to \"google.protobuf.BytesValue\".\nfunc (s *FederationService) cast_Google_Protobuf_BytesValue__to__Google_Protobuf_BytesValue(from *wrapperspb.BytesValue) (*wrapperspb.BytesValue, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tvalueValue := from.GetValue()\n\tret := &wrapperspb.BytesValue{\n\t\tValue: valueValue,\n\t}\n\n\treturn ret, nil\n}\n\n// cast_Google_Protobuf_DoubleValue__to__Google_Protobuf_DoubleValue cast from \"google.protobuf.DoubleValue\" to \"google.protobuf.DoubleValue\".\nfunc (s *FederationService) cast_Google_Protobuf_DoubleValue__to__Google_Protobuf_DoubleValue(from *wrapperspb.DoubleValue) (*wrapperspb.DoubleValue, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tvalueValue := from.GetValue()\n\tret := &wrapperspb.DoubleValue{\n\t\tValue: valueValue,\n\t}\n\n\treturn ret, nil\n}\n\n// cast_Google_Protobuf_DoubleValue__to__Google_Protobuf_FloatValue cast from \"google.protobuf.DoubleValue\" to \"google.protobuf.FloatValue\".\nfunc (s *FederationService) cast_Google_Protobuf_DoubleValue__to__Google_Protobuf_FloatValue(from *wrapperspb.DoubleValue) (*wrapperspb.FloatValue, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tvalueValue, err := s.cast_float64__to__float32(from.GetValue())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret := &wrapperspb.FloatValue{\n\t\tValue: valueValue,\n\t}\n\n\treturn ret, nil\n}\n\n// cast_Google_Protobuf_Int64Value__to__Google_Protobuf_Int32Value cast from \"google.protobuf.Int64Value\" to \"google.protobuf.Int32Value\".\nfunc (s *FederationService) cast_Google_Protobuf_Int64Value__to__Google_Protobuf_Int32Value(from *wrapperspb.Int64Value) (*wrapperspb.Int32Value, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tvalueValue, err := s.cast_int64__to__int32(from.GetValue())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret := &wrapperspb.Int32Value{\n\t\tValue: valueValue,\n\t}\n\n\treturn ret, nil\n}\n\n// cast_Google_Protobuf_Int64Value__to__Google_Protobuf_Int64Value cast from \"google.protobuf.Int64Value\" to \"google.protobuf.Int64Value\".\nfunc (s *FederationService) cast_Google_Protobuf_Int64Value__to__Google_Protobuf_Int64Value(from *wrapperspb.Int64Value) (*wrapperspb.Int64Value, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tvalueValue := from.GetValue()\n\tret := &wrapperspb.Int64Value{\n\t\tValue: valueValue,\n\t}\n\n\treturn ret, nil\n}\n\n// cast_Google_Protobuf_StringValue__to__Google_Protobuf_StringValue cast from \"google.protobuf.StringValue\" to \"google.protobuf.StringValue\".\nfunc (s *FederationService) cast_Google_Protobuf_StringValue__to__Google_Protobuf_StringValue(from *wrapperspb.StringValue) (*wrapperspb.StringValue, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tvalueValue := from.GetValue()\n\tret := &wrapperspb.StringValue{\n\t\tValue: valueValue,\n\t}\n\n\treturn ret, nil\n}\n\n// cast_Google_Protobuf_UInt64Value__to__Google_Protobuf_UInt32Value cast from \"google.protobuf.UInt64Value\" to \"google.protobuf.UInt32Value\".\nfunc (s *FederationService) cast_Google_Protobuf_UInt64Value__to__Google_Protobuf_UInt32Value(from *wrapperspb.UInt64Value) (*wrapperspb.UInt32Value, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tvalueValue, err := s.cast_uint64__to__uint32(from.GetValue())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret := &wrapperspb.UInt32Value{\n\t\tValue: valueValue,\n\t}\n\n\treturn ret, nil\n}\n\n// cast_Google_Protobuf_UInt64Value__to__Google_Protobuf_UInt64Value cast from \"google.protobuf.UInt64Value\" to \"google.protobuf.UInt64Value\".\nfunc (s *FederationService) cast_Google_Protobuf_UInt64Value__to__Google_Protobuf_UInt64Value(from *wrapperspb.UInt64Value) (*wrapperspb.UInt64Value, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tvalueValue := from.GetValue()\n\tret := &wrapperspb.UInt64Value{\n\t\tValue: valueValue,\n\t}\n\n\treturn ret, nil\n}\n\n// cast_User_Item_ItemType__to__Federation_Item_ItemType cast from \"user.Item.ItemType\" to \"federation.Item.ItemType\".\nfunc (s *FederationService) cast_User_Item_ItemType__to__Federation_Item_ItemType(from user.Item_ItemType) (Item_ItemType, error) {\n\tvar ret Item_ItemType\n\tswitch from {\n\tcase user.Item_ITEM_TYPE_UNSPECIFIED:\n\t\tret = Item_ITEM_TYPE_UNSPECIFIED\n\tcase user.Item_ITEM_TYPE_1:\n\t\tret = Item_ITEM_TYPE_1\n\tcase user.Item_ITEM_TYPE_2:\n\t\tret = Item_ITEM_TYPE_2\n\tcase user.Item_ITEM_TYPE_3:\n\t\tret = Item_ITEM_TYPE_3\n\tdefault:\n\t\tret = 0\n\t}\n\treturn ret, nil\n}\n\n// cast_User_Item_ItemType__to__int32 cast from \"user.Item.ItemType\" to \"int32\".\nfunc (s *FederationService) cast_User_Item_ItemType__to__int32(from user.Item_ItemType) (int32, error) {\n\treturn int32(from), nil\n}\n\n// cast_User_Item_Location_AddrA___to__Federation_Item_Location_AddrA_ cast from \"user.Item.Location.addr_a\" to \"federation.Item.Location.addr_a\".\nfunc (s *FederationService) cast_User_Item_Location_AddrA___to__Federation_Item_Location_AddrA_(from *user.Item_Location_AddrA_) (*Item_Location_AddrA_, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\n\taddrAValue, err := s.cast_User_Item_Location_AddrA__to__Federation_Item_Location_AddrA(from.AddrA)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &Item_Location_AddrA_{AddrA: addrAValue}, nil\n}\n\n// cast_User_Item_Location_AddrA__to__Federation_Item_Location_AddrA cast from \"user.Item.Location.AddrA\" to \"federation.Item.Location.AddrA\".\nfunc (s *FederationService) cast_User_Item_Location_AddrA__to__Federation_Item_Location_AddrA(from *user.Item_Location_AddrA) (*Item_Location_AddrA, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tfooValue := from.GetFoo()\n\tret := &Item_Location_AddrA{\n\t\tFoo: fooValue,\n\t}\n\n\treturn ret, nil\n}\n\n// cast_User_Item_Location_AddrB__to__Federation_Item_Location_AddrB cast from \"user.Item.Location.AddrB\" to \"federation.Item.Location.AddrB\".\nfunc (s *FederationService) cast_User_Item_Location_AddrB__to__Federation_Item_Location_AddrB(from *user.Item_Location_AddrB) (*Item_Location_AddrB, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tbarValue := from.GetBar()\n\tret := &Item_Location_AddrB{\n\t\tBar: barValue,\n\t}\n\n\treturn ret, nil\n}\n\n// cast_User_Item_Location_B__to__Federation_Item_Location_B cast from \"user.Item.Location.b\" to \"federation.Item.Location.b\".\nfunc (s *FederationService) cast_User_Item_Location_B__to__Federation_Item_Location_B(from *user.Item_Location_B) (*Item_Location_B, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\n\tbValue, err := s.cast_User_Item_Location_AddrB__to__Federation_Item_Location_AddrB(from.B)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &Item_Location_B{B: bValue}, nil\n}\n\n// cast_User_Item_Location_C__to__Federation_Item_Location_C cast from \"user.Item.Location.c\" to \"federation.Item.Location.c\".\nfunc (s *FederationService) cast_User_Item_Location_C__to__Federation_Item_Location_C(from *user.Item_Location_C) (*Item_Location_C, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\n\tcValue := from.C\n\treturn &Item_Location_C{C: cValue}, nil\n}\n\n// cast_User_Item_Location__to__Federation_Item_Location cast from \"user.Item.Location\" to \"federation.Item.Location\".\nfunc (s *FederationService) cast_User_Item_Location__to__Federation_Item_Location(from *user.Item_Location) (*Item_Location, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\taddr1Value := from.GetAddr1()\n\taddr2Value := from.GetAddr2()\n\tret := &Item_Location{\n\t\tAddr1: addr1Value,\n\t\tAddr2: addr2Value,\n\t}\n\n\tswitch x := from.Addr3.(type) {\n\n\tcase *user.Item_Location_AddrA_:\n\t\taddr3Value, err := s.cast_User_Item_Location_AddrA___to__Federation_Item_Location_AddrA_(x)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret.Addr3 = addr3Value\n\tcase *user.Item_Location_B:\n\t\taddr3Value, err := s.cast_User_Item_Location_B__to__Federation_Item_Location_B(x)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret.Addr3 = addr3Value\n\tcase *user.Item_Location_C:\n\t\taddr3Value, err := s.cast_User_Item_Location_C__to__Federation_Item_Location_C(x)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret.Addr3 = addr3Value\n\t}\n\treturn ret, nil\n}\n\n// cast_User_Item__to__Federation_Item cast from \"user.Item\" to \"federation.Item\".\nfunc (s *FederationService) cast_User_Item__to__Federation_Item(from *user.Item) (*Item, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tnameValue := from.GetName()\n\ttypeValue, err := s.cast_User_Item_ItemType__to__Federation_Item_ItemType(from.GetType())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvalueValue := from.GetValue()\n\tlocationValue, err := s.cast_User_Item_Location__to__Federation_Item_Location(from.GetLocation())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret := &Item{\n\t\tName:     nameValue,\n\t\tType:     typeValue,\n\t\tValue:    valueValue,\n\t\tLocation: locationValue,\n\t}\n\n\treturn ret, nil\n}\n\n// cast_User_User_AttrA___to__Federation_User_AttrA_ cast from \"user.User.attr_a\" to \"federation.User.attr_a\".\nfunc (s *FederationService) cast_User_User_AttrA___to__Federation_User_AttrA_(from *user.User_AttrA_) (*User_AttrA_, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\n\tattrAValue, err := s.cast_User_User_AttrA__to__Federation_User_AttrA(from.AttrA)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &User_AttrA_{AttrA: attrAValue}, nil\n}\n\n// cast_User_User_AttrA__to__Federation_User_AttrA cast from \"user.User.AttrA\" to \"federation.User.AttrA\".\nfunc (s *FederationService) cast_User_User_AttrA__to__Federation_User_AttrA(from *user.User_AttrA) (*User_AttrA, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tfooValue := from.GetFoo()\n\tret := &User_AttrA{\n\t\tFoo: fooValue,\n\t}\n\n\treturn ret, nil\n}\n\n// cast_User_User_AttrB__to__Federation_User_AttrB cast from \"user.User.AttrB\" to \"federation.User.AttrB\".\nfunc (s *FederationService) cast_User_User_AttrB__to__Federation_User_AttrB(from *user.User_AttrB) (*User_AttrB, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tbarValue := from.GetBar()\n\tret := &User_AttrB{\n\t\tBar: barValue,\n\t}\n\n\treturn ret, nil\n}\n\n// cast_User_User_B__to__Federation_User_B cast from \"user.User.b\" to \"federation.User.b\".\nfunc (s *FederationService) cast_User_User_B__to__Federation_User_B(from *user.User_B) (*User_B, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\n\tbValue, err := s.cast_User_User_AttrB__to__Federation_User_AttrB(from.B)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &User_B{B: bValue}, nil\n}\n\n// cast_float64__to__float32 cast from \"double\" to \"float\".\nfunc (s *FederationService) cast_float64__to__float32(from float64) (float32, error) {\n\treturn float32(from), nil\n}\n\n// cast_int64__to__int32 cast from \"int64\" to \"int32\".\nfunc (s *FederationService) cast_int64__to__int32(from int64) (int32, error) {\n\tret, err := grpcfed.Int64ToInt32(from)\n\tif err != nil {\n\t\treturn ret, err\n\t}\n\treturn ret, nil\n}\n\n// cast_map_int64_int64__to__map_int32_int32 cast from \"map<int64, int64>\" to \"map<int32, int32>\".\nfunc (s *FederationService) cast_map_int64_int64__to__map_int32_int32(from map[int64]int64) (map[int32]int32, error) {\n\tret := map[int32]int32{}\n\tfor k, v := range from {\n\t\tkey, err := s.cast_int64__to__int32(k)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tval, err := s.cast_int64__to__int32(v)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret[key] = val\n\t}\n\treturn ret, nil\n}\n\n// cast_map_int64_string__to__map_int32_string cast from \"map<int64, string>\" to \"map<int32, string>\".\nfunc (s *FederationService) cast_map_int64_string__to__map_int32_string(from map[int64]string) (map[int32]string, error) {\n\tret := map[int32]string{}\n\tfor k, v := range from {\n\t\tkey, err := s.cast_int64__to__int32(k)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tval := v\n\t\tret[key] = val\n\t}\n\treturn ret, nil\n}\n\n// cast_repeated_User_Item__to__repeated_Federation_Item cast from \"repeated user.Item\" to \"repeated federation.Item\".\nfunc (s *FederationService) cast_repeated_User_Item__to__repeated_Federation_Item(from []*user.Item) ([]*Item, error) {\n\tret := make([]*Item, 0, len(from))\n\tfor _, v := range from {\n\t\tcasted, err := s.cast_User_Item__to__Federation_Item(v)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret = append(ret, casted)\n\t}\n\treturn ret, nil\n}\n\n// cast_repeated_int64__to__repeated_int32 cast from \"repeated int64\" to \"repeated int32\".\nfunc (s *FederationService) cast_repeated_int64__to__repeated_int32(from []int64) ([]int32, error) {\n\tret := make([]int32, 0, len(from))\n\tfor _, v := range from {\n\t\tcasted, err := s.cast_int64__to__int32(v)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret = append(ret, casted)\n\t}\n\treturn ret, nil\n}\n\n// cast_uint64__to__uint32 cast from \"uint64\" to \"uint32\".\nfunc (s *FederationService) cast_uint64__to__uint32(from uint64) (uint32, error) {\n\tret, err := grpcfed.Uint64ToUint32(from)\n\tif err != nil {\n\t\treturn ret, err\n\t}\n\treturn ret, nil\n}\n\nfunc (s *FederationService) logvalue_Federation_A(v *A) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"b\", s.logvalue_Federation_A_B(v.GetB())),\n\t\tslog.Any(\"opt_c\", s.logvalue_Federation_A_B_C(v.GetOptC())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Federation_AArgument(v *FederationService_Federation_AArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Federation_A_B(v *A_B) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"foo\", s.logvalue_Federation_A_B_C(v.GetFoo())),\n\t\tslog.Any(\"bar\", s.logvalue_Federation_A_B_C(v.GetBar())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Federation_A_BArgument(v *FederationService_Federation_A_BArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Federation_A_B_C(v *A_B_C) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"type\", v.GetType()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Federation_A_B_CArgument(v *FederationService_Federation_A_B_CArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"type\", v.Type),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Federation_GetPostResponse(v *GetPostResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"post\", s.logvalue_Federation_Post(v.GetPost())),\n\t\tslog.String(\"str\", v.GetStr()),\n\t\tslog.String(\"uuid\", v.GetUuid()),\n\t\tslog.String(\"loc\", v.GetLoc()),\n\t\tslog.String(\"value1\", v.GetValue1()),\n\t\tslog.String(\"item_type_name\", v.GetItemTypeName()),\n\t\tslog.String(\"location_type_name\", v.GetLocationTypeName()),\n\t\tslog.String(\"user_item_type_name\", v.GetUserItemTypeName()),\n\t\tslog.String(\"item_type_value_enum\", s.logvalue_Federation_Item_ItemType(v.GetItemTypeValueEnum()).String()),\n\t\tslog.Int64(\"item_type_value_int\", int64(v.GetItemTypeValueInt())),\n\t\tslog.String(\"item_type_value_cast\", s.logvalue_Federation_Item_ItemType(v.GetItemTypeValueCast()).String()),\n\t\tslog.Int64(\"location_type_value\", int64(v.GetLocationTypeValue())),\n\t\tslog.Int64(\"user_item_type_value\", int64(v.GetUserItemTypeValue())),\n\t\tslog.Any(\"a\", s.logvalue_Federation_A(v.GetA())),\n\t\tslog.Any(\"sorted_values\", v.GetSortedValues()),\n\t\tslog.Any(\"sorted_items\", s.logvalue_repeated_Federation_Item(v.GetSortedItems())),\n\t\tslog.Any(\"map_value\", s.logvalue_Federation_GetPostResponse_MapValueEntry(v.GetMapValue())),\n\t\tslog.Any(\"double_wrapper_value\", s.logvalue_Google_Protobuf_DoubleValue(v.GetDoubleWrapperValue())),\n\t\tslog.Any(\"float_wrapper_value\", s.logvalue_Google_Protobuf_FloatValue(v.GetFloatWrapperValue())),\n\t\tslog.Any(\"i64_wrapper_value\", s.logvalue_Google_Protobuf_Int64Value(v.GetI64WrapperValue())),\n\t\tslog.Any(\"u64_wrapper_value\", s.logvalue_Google_Protobuf_UInt64Value(v.GetU64WrapperValue())),\n\t\tslog.Any(\"i32_wrapper_value\", s.logvalue_Google_Protobuf_Int32Value(v.GetI32WrapperValue())),\n\t\tslog.Any(\"u32_wrapper_value\", s.logvalue_Google_Protobuf_UInt32Value(v.GetU32WrapperValue())),\n\t\tslog.Any(\"bool_wrapper_value\", s.logvalue_Google_Protobuf_BoolValue(v.GetBoolWrapperValue())),\n\t\tslog.Any(\"string_wrapper_value\", s.logvalue_Google_Protobuf_StringValue(v.GetStringWrapperValue())),\n\t\tslog.Any(\"bytes_wrapper_value\", s.logvalue_Google_Protobuf_BytesValue(v.GetBytesWrapperValue())),\n\t\tslog.String(\"hello\", v.GetHello()),\n\t\tslog.Any(\"null_timestamp\", s.logvalue_Google_Protobuf_Timestamp(v.GetNullTimestamp())),\n\t\tslog.Any(\"null_timestamp2\", s.logvalue_Google_Protobuf_Timestamp(v.GetNullTimestamp2())),\n\t\tslog.Any(\"null_timestamp3\", s.logvalue_Google_Protobuf_Timestamp(v.GetNullTimestamp3())),\n\t\tslog.String(\"jp_loc\", v.GetJpLoc()),\n\t\tslog.String(\"strings_join\", v.GetStringsJoin()),\n\t\tslog.Float64(\"parse_float\", v.GetParseFloat()),\n\t\tslog.String(\"url_user_name\", v.GetUrlUserName()),\n\t\tslog.String(\"enum_value\", s.logvalue_Federation_Item_ItemType(v.GetEnumValue()).String()),\n\t\tslog.String(\"enum_value_str\", v.GetEnumValueStr()),\n\t\tslog.Float64(\"sqrt_double\", v.GetSqrtDouble()),\n\t\tslog.Float64(\"sqrt_int\", v.GetSqrtInt()),\n\t\tslog.Float64(\"pow\", v.GetPow()),\n\t\tslog.Float64(\"floor\", v.GetFloor()),\n\t\tslog.Any(\"flatten\", v.GetFlatten()),\n\t\tslog.Float64(\"round\", v.GetRound()),\n\t\tslog.Any(\"any\", s.logvalue_Google_Protobuf_Any(v.GetAny())),\n\t\tslog.String(\"replaced\", v.GetReplaced()),\n\t\tslog.Any(\"list_to_map\", s.logvalue_Federation_GetPostResponse_ListToMapEntry(v.GetListToMap())),\n\t\tslog.String(\"uuid_parse\", v.GetUuidParse()),\n\t\tslog.Bool(\"uuid_validate\", v.GetUuidValidate()),\n\t\tslog.String(\"compile\", v.GetCompile()),\n\t\tslog.String(\"must_compile\", v.GetMustCompile()),\n\t\tslog.String(\"quote_meta\", v.GetQuoteMeta()),\n\t\tslog.Any(\"find_string_submatch\", v.GetFindStringSubmatch()),\n\t\tslog.Bool(\"match_string\", v.GetMatchString()),\n\t\tslog.String(\"replace_all_string\", v.GetReplaceAllString()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Federation_GetPostResponseArgument(v *FederationService_Federation_GetPostResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Federation_GetPostResponse_ListToMapEntry(v map[int32]int32) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tattrs := make([]slog.Attr, 0, len(v))\n\tfor key, value := range v {\n\t\tattrs = append(attrs, slog.Attr{\n\t\t\tKey:   grpcfed.ToLogAttrKey(key),\n\t\t\tValue: slog.AnyValue(value),\n\t\t})\n\t}\n\treturn slog.GroupValue(attrs...)\n}\n\nfunc (s *FederationService) logvalue_Federation_GetPostResponse_MapValueEntry(v map[int32]string) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tattrs := make([]slog.Attr, 0, len(v))\n\tfor key, value := range v {\n\t\tattrs = append(attrs, slog.Attr{\n\t\t\tKey:   grpcfed.ToLogAttrKey(key),\n\t\t\tValue: slog.AnyValue(value),\n\t\t})\n\t}\n\treturn slog.GroupValue(attrs...)\n}\n\nfunc (s *FederationService) logvalue_Federation_Item(v *Item) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"name\", v.GetName()),\n\t\tslog.String(\"type\", s.logvalue_Federation_Item_ItemType(v.GetType()).String()),\n\t\tslog.Int64(\"value\", v.GetValue()),\n\t\tslog.Any(\"location\", s.logvalue_Federation_Item_Location(v.GetLocation())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Federation_Item_ItemType(v Item_ItemType) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tswitch v {\n\tcase Item_ITEM_TYPE_UNSPECIFIED:\n\t\treturn slog.StringValue(\"ITEM_TYPE_UNSPECIFIED\")\n\tcase Item_ITEM_TYPE_1:\n\t\treturn slog.StringValue(\"ITEM_TYPE_1\")\n\tcase Item_ITEM_TYPE_2:\n\t\treturn slog.StringValue(\"ITEM_TYPE_2\")\n\tcase Item_ITEM_TYPE_3:\n\t\treturn slog.StringValue(\"ITEM_TYPE_3\")\n\t}\n\treturn slog.StringValue(\"\")\n}\n\nfunc (s *FederationService) logvalue_Federation_Item_Location(v *Item_Location) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"addr1\", v.GetAddr1()),\n\t\tslog.String(\"addr2\", v.GetAddr2()),\n\t\tslog.Any(\"addr_a\", s.logvalue_Federation_Item_Location_AddrA(v.GetAddrA())),\n\t\tslog.Any(\"b\", s.logvalue_Federation_Item_Location_AddrB(v.GetB())),\n\t\tslog.String(\"c\", v.GetC()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Federation_Item_Location_AddrA(v *Item_Location_AddrA) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"foo\", v.GetFoo()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Federation_Item_Location_AddrB(v *Item_Location_AddrB) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Int64(\"bar\", v.GetBar()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Federation_Item_Location_LocationType(v Item_Location_LocationType) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tswitch v {\n\tcase Item_Location_LOCATION_TYPE_0:\n\t\treturn slog.StringValue(\"LOCATION_TYPE_0\")\n\tcase Item_Location_LOCATION_TYPE_1:\n\t\treturn slog.StringValue(\"LOCATION_TYPE_1\")\n\t}\n\treturn slog.StringValue(\"\")\n}\n\nfunc (s *FederationService) logvalue_Federation_Post(v *Post) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.String(\"title\", v.GetTitle()),\n\t\tslog.String(\"content\", v.GetContent()),\n\t\tslog.Any(\"user\", s.logvalue_Federation_User(v.GetUser())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Federation_PostArgument(v *FederationService_Federation_PostArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Federation_User(v *User) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.String(\"name\", v.GetName()),\n\t\tslog.Any(\"items\", s.logvalue_repeated_Federation_Item(v.GetItems())),\n\t\tslog.Any(\"profile\", s.logvalue_Federation_User_ProfileEntry(v.GetProfile())),\n\t\tslog.Any(\"attr_a\", s.logvalue_Federation_User_AttrA(v.GetAttrA())),\n\t\tslog.Any(\"b\", s.logvalue_Federation_User_AttrB(v.GetB())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Federation_UserArgument(v *FederationService_Federation_UserArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t\tslog.String(\"title\", v.Title),\n\t\tslog.String(\"content\", v.Content),\n\t\tslog.String(\"user_id\", v.UserId),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Federation_User_AttrA(v *User_AttrA) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"foo\", v.GetFoo()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Federation_User_AttrB(v *User_AttrB) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Bool(\"bar\", v.GetBar()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Federation_User_ProfileEntry(v map[string]*anypb.Any) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tattrs := make([]slog.Attr, 0, len(v))\n\tfor key, value := range v {\n\t\tattrs = append(attrs, slog.Attr{\n\t\t\tKey:   grpcfed.ToLogAttrKey(key),\n\t\t\tValue: s.logvalue_Google_Protobuf_Any(value),\n\t\t})\n\t}\n\treturn slog.GroupValue(attrs...)\n}\n\nfunc (s *FederationService) logvalue_Google_Protobuf_Any(v *anypb.Any) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"type_url\", v.GetTypeUrl()),\n\t\tslog.String(\"value\", string(v.GetValue())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Google_Protobuf_BoolValue(v *wrapperspb.BoolValue) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Bool(\"value\", v.GetValue()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Google_Protobuf_BytesValue(v *wrapperspb.BytesValue) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"value\", string(v.GetValue())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Google_Protobuf_DoubleValue(v *wrapperspb.DoubleValue) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Float64(\"value\", v.GetValue()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Google_Protobuf_FloatValue(v *wrapperspb.FloatValue) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Float64(\"value\", float64(v.GetValue())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Google_Protobuf_Int32Value(v *wrapperspb.Int32Value) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Int64(\"value\", int64(v.GetValue())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Google_Protobuf_Int64Value(v *wrapperspb.Int64Value) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Int64(\"value\", v.GetValue()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Google_Protobuf_StringValue(v *wrapperspb.StringValue) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"value\", v.GetValue()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Google_Protobuf_Timestamp(v *timestamppb.Timestamp) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Int64(\"seconds\", v.GetSeconds()),\n\t\tslog.Int64(\"nanos\", int64(v.GetNanos())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Google_Protobuf_UInt32Value(v *wrapperspb.UInt32Value) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Uint64(\"value\", uint64(v.GetValue())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Google_Protobuf_UInt64Value(v *wrapperspb.UInt64Value) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Uint64(\"value\", v.GetValue()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Post_GetPostRequest(v *post.GetPostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Post_GetPostsRequest(v *post.GetPostsRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.GetIds()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_User_GetUserRequest(v *user.GetUserRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.Int64(\"type\", int64(v.GetType())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_User_GetUsersRequest(v *user.GetUsersRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.GetIds()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_repeated_Federation_Item(v []*Item) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tattrs := make([]slog.Attr, 0, len(v))\n\tfor idx, vv := range v {\n\t\tattrs = append(attrs, slog.Attr{\n\t\t\tKey:   grpcfed.ToLogAttrKey(idx),\n\t\t\tValue: s.logvalue_Federation_Item(vv),\n\t\t})\n\t}\n\treturn slog.GroupValue(attrs...)\n}\n"
  },
  {
    "path": "_examples/02_simple/go.mod",
    "content": "module example\n\ngo 1.24.0\n\nreplace github.com/mercari/grpc-federation => ../../\n\nrequire (\n\tgithub.com/google/go-cmp v0.7.0\n\tgithub.com/mercari/grpc-federation v0.0.0-00010101000000-000000000000\n\tgo.opentelemetry.io/otel v1.24.0\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0\n\tgo.opentelemetry.io/otel/sdk v1.24.0\n\tgo.opentelemetry.io/otel/trace v1.24.0\n\tgo.uber.org/goleak v1.3.0\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7\n\tgoogle.golang.org/grpc v1.65.0\n\tgoogle.golang.org/protobuf v1.34.2\n)\n\nrequire (\n\tcel.dev/expr v0.19.1 // indirect\n\tgithub.com/antlr4-go/antlr/v4 v4.13.0 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.2.1 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/goccy/wasi-go v0.3.2 // indirect\n\tgithub.com/google/cel-go v0.23.1 // indirect\n\tgithub.com/google/uuid v1.6.0 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect\n\tgithub.com/kelseyhightower/envconfig v1.4.0 // indirect\n\tgithub.com/stealthrocket/wazergo v0.19.1 // indirect\n\tgithub.com/stoewer/go-strcase v1.3.0 // indirect\n\tgithub.com/tetratelabs/wazero v1.10.1 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.24.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.0.0 // indirect\n\tgolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect\n\tgolang.org/x/net v0.38.0 // indirect\n\tgolang.org/x/sync v0.15.0 // indirect\n\tgolang.org/x/sys v0.37.0 // indirect\n\tgolang.org/x/text v0.26.0 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 // indirect\n)\n"
  },
  {
    "path": "_examples/02_simple/go.sum",
    "content": "cel.dev/expr v0.19.1 h1:NciYrtDRIR0lNCnH1LFJegdjspNx9fI59O7TWcua/W4=\ncel.dev/expr v0.19.1/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw=\ngithub.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=\ngithub.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/goccy/wasi-go v0.3.2 h1:wAvGXmqCkfcp0B0AwIp5Ya53hzDwkKm9W8iuT3nCCz0=\ngithub.com/goccy/wasi-go v0.3.2/go.mod h1:nIKD204n9xa4Z20UV+XA483kIr9TAl2vXr+X5qVAO5M=\ngithub.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4=\ngithub.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=\ngithub.com/google/cel-go v0.23.1 h1:91ThhEZlBcE5rB2adBVXqvDoqdL8BG2oyhd0bK1I/r4=\ngithub.com/google/cel-go v0.23.1/go.mod h1:52Pb6QsDbC5kvgxvZhiL9QX1oZEkcUF/ZqaPx1J5Wwo=\ngithub.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\ngithub.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg=\ngithub.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=\ngithub.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/stealthrocket/wazergo v0.19.1 h1:BPrITETPgSFwiytwmToO0MbUC/+RGC39JScz1JmmG6c=\ngithub.com/stealthrocket/wazergo v0.19.1/go.mod h1:riI0hxw4ndZA5e6z7PesHg2BtTftcZaMxRcoiGGipTs=\ngithub.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs=\ngithub.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tetratelabs/wazero v1.10.1 h1:2DugeJf6VVk58KTPszlNfeeN8AhhpwcZqkJj2wwFuH8=\ngithub.com/tetratelabs/wazero v1.10.1/go.mod h1:DRm5twOQ5Gr1AoEdSi0CLjDQF1J9ZAuyqFIjl1KKfQU=\ngo.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo=\ngo.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0=\ngo.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI=\ngo.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=\ngo.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw=\ngo.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg=\ngo.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=\ngo.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=\ngo.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=\ngo.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=\ngolang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=\ngolang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=\ngolang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8=\ngolang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=\ngolang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=\ngolang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=\ngolang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 h1:YcyjlL1PRr2Q17/I0dPk2JmYS5CDXfcdb2Z3YRioEbw=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7 h1:2035KHhUv+EpyB+hWgJnaWKJOdX1E95w2S8Rr4uWKTs=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=\ngoogle.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=\ngoogle.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=\ngoogle.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=\ngoogle.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "_examples/02_simple/grpc-federation.yaml",
    "content": "imports:\n  - proto\nsrc:\n  - proto\nout: .\nplugins:\n  - plugin: go\n    opt: paths=source_relative\n  - plugin: go-grpc\n    opt: paths=source_relative\n  - plugin: grpc-federation\n    opt:\n    - paths=source_relative\n    - import_paths=proto\n"
  },
  {
    "path": "_examples/02_simple/main_test.go",
    "content": "package main_test\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"net\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\"\n\t\"go.opentelemetry.io/otel/propagation\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\tsdktrace \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.4.0\"\n\t\"go.uber.org/goleak\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/credentials/insecure\"\n\t\"google.golang.org/grpc/metadata\"\n\t\"google.golang.org/grpc/test/bufconn\"\n\t\"google.golang.org/protobuf/types/known/anypb\"\n\t\"google.golang.org/protobuf/types/known/wrapperspb\"\n\n\t\"example/federation\"\n\t\"example/post\"\n\t\"example/user\"\n)\n\nconst bufSize = 1024\n\nvar (\n\tlistener   *bufconn.Listener\n\tpostClient post.PostServiceClient\n\tuserClient user.UserServiceClient\n)\n\ntype clientConfig struct{}\n\nfunc (c *clientConfig) Post_PostServiceClient(cfg federation.FederationServiceClientConfig) (post.PostServiceClient, error) {\n\treturn postClient, nil\n}\n\nfunc (c *clientConfig) User_UserServiceClient(cfg federation.FederationServiceClientConfig) (user.UserServiceClient, error) {\n\treturn userClient, nil\n}\n\ntype PostServer struct {\n\t*post.UnimplementedPostServiceServer\n}\n\nfunc (s *PostServer) GetPost(ctx context.Context, req *post.GetPostRequest) (*post.GetPostResponse, error) {\n\treturn &post.GetPostResponse{\n\t\tPost: &post.Post{\n\t\t\tId:      req.Id,\n\t\t\tTitle:   \"foo\",\n\t\t\tContent: \"bar\",\n\t\t\tUserId:  fmt.Sprintf(\"user:%s\", req.Id),\n\t\t},\n\t}, nil\n}\n\nfunc (s *PostServer) GetPosts(ctx context.Context, req *post.GetPostsRequest) (*post.GetPostsResponse, error) {\n\tvar posts []*post.Post\n\tfor _, id := range req.Ids {\n\t\tposts = append(posts, &post.Post{\n\t\t\tId:      id,\n\t\t\tTitle:   \"foo\",\n\t\t\tContent: \"bar\",\n\t\t\tUserId:  fmt.Sprintf(\"user:%s\", id),\n\t\t})\n\t}\n\treturn &post.GetPostsResponse{Posts: posts}, nil\n}\n\ntype UserServer struct {\n\t*user.UnimplementedUserServiceServer\n}\n\nfunc (s *UserServer) GetUser(ctx context.Context, req *user.GetUserRequest) (*user.GetUserResponse, error) {\n\tprofile, err := anypb.New(&user.User{\n\t\tName: \"foo\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &user.GetUserResponse{\n\t\tUser: &user.User{\n\t\t\tId:   req.Id,\n\t\t\tName: fmt.Sprintf(\"name_%s\", req.Id),\n\t\t\tItems: []*user.Item{\n\t\t\t\t{\n\t\t\t\t\tName:  \"item1\",\n\t\t\t\t\tType:  user.Item_ITEM_TYPE_1,\n\t\t\t\t\tValue: 1,\n\t\t\t\t\tLocation: &user.Item_Location{\n\t\t\t\t\t\tAddr1: \"foo\",\n\t\t\t\t\t\tAddr2: \"bar\",\n\t\t\t\t\t\tAddr3: &user.Item_Location_B{\n\t\t\t\t\t\t\tB: &user.Item_Location_AddrB{Bar: 1},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{Name: \"item2\", Type: user.Item_ITEM_TYPE_2, Value: 2},\n\t\t\t},\n\t\t\tProfile: map[string]*anypb.Any{\"user\": profile},\n\t\t\tAttr: &user.User_B{\n\t\t\t\tB: &user.User_AttrB{\n\t\t\t\t\tBar: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}, nil\n}\n\nfunc (s *UserServer) GetUsers(ctx context.Context, req *user.GetUsersRequest) (*user.GetUsersResponse, error) {\n\tvar users []*user.User\n\tfor _, id := range req.Ids {\n\t\tusers = append(users, &user.User{\n\t\t\tId:   id,\n\t\t\tName: fmt.Sprintf(\"name_%s\", id),\n\t\t})\n\t}\n\treturn &user.GetUsersResponse{Users: users}, nil\n}\n\nfunc dialer(ctx context.Context, address string) (net.Conn, error) {\n\treturn listener.Dial()\n}\n\nfunc TestFederation(t *testing.T) {\n\tdefer goleak.VerifyNone(t)\n\n\tctx := context.Background()\n\tlistener = bufconn.Listen(bufSize)\n\n\tif os.Getenv(\"ENABLE_JAEGER\") != \"\" {\n\t\texporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithInsecure())\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttp := sdktrace.NewTracerProvider(\n\t\t\tsdktrace.WithBatcher(exporter),\n\t\t\tsdktrace.WithResource(\n\t\t\t\tresource.NewWithAttributes(\n\t\t\t\t\tsemconv.SchemaURL,\n\t\t\t\t\tsemconv.ServiceNameKey.String(\"example02/simple\"),\n\t\t\t\t\tsemconv.ServiceVersionKey.String(\"1.0.0\"),\n\t\t\t\t\tattribute.String(\"environment\", \"dev\"),\n\t\t\t\t),\n\t\t\t),\n\t\t\tsdktrace.WithSampler(sdktrace.AlwaysSample()),\n\t\t)\n\t\tdefer tp.Shutdown(ctx)\n\t\totel.SetTextMapPropagator(propagation.TraceContext{})\n\t\totel.SetTracerProvider(tp)\n\t}\n\n\tconn, err := grpc.DialContext(\n\t\tctx, \"\",\n\t\tgrpc.WithContextDialer(dialer),\n\t\tgrpc.WithTransportCredentials(insecure.NewCredentials()),\n\t)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer conn.Close()\n\n\tpostClient = post.NewPostServiceClient(conn)\n\tuserClient = user.NewUserServiceClient(conn)\n\n\tgrpcServer := grpc.NewServer()\n\tdefer grpcServer.Stop()\n\n\tlogger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{\n\t\tLevel: slog.LevelDebug,\n\t}))\n\tfederationServer, err := federation.NewFederationService(federation.FederationServiceConfig{\n\t\tClient: new(clientConfig),\n\t\tLogger: logger,\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer federation.CleanupFederationService(ctx, federationServer)\n\tpost.RegisterPostServiceServer(grpcServer, &PostServer{})\n\tuser.RegisterUserServiceServer(grpcServer, &UserServer{})\n\tfederation.RegisterFederationServiceServer(grpcServer, federationServer)\n\n\tgo func() {\n\t\tif err := grpcServer.Serve(listener); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t}()\n\n\tclient := federation.NewFederationServiceClient(conn)\n\tctx = metadata.AppendToOutgoingContext(ctx, \"key1\", \"value1\")\n\tres, err := client.GetPost(ctx, &federation.GetPostRequest{\n\t\tId: \"foo\",\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tprofile, err := anypb.New(&user.User{\n\t\tName: \"foo\",\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tpostMsg := &federation.Post{\n\t\tId:      \"foo\",\n\t\tTitle:   \"foo\",\n\t\tContent: \"bar\",\n\t\tUser: &federation.User{\n\t\t\tId:   \"user:foo\",\n\t\t\tName: \"name_user:foo\",\n\t\t\tItems: []*federation.Item{\n\t\t\t\t{\n\t\t\t\t\tName:  \"item1\",\n\t\t\t\t\tType:  federation.Item_ITEM_TYPE_1,\n\t\t\t\t\tValue: 1,\n\t\t\t\t\tLocation: &federation.Item_Location{\n\t\t\t\t\t\tAddr1: \"foo\",\n\t\t\t\t\t\tAddr2: \"bar\",\n\t\t\t\t\t\tAddr3: &federation.Item_Location_B{\n\t\t\t\t\t\t\tB: &federation.Item_Location_AddrB{\n\t\t\t\t\t\t\t\tBar: 1,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tName:  \"item2\",\n\t\t\t\t\tType:  federation.Item_ITEM_TYPE_2,\n\t\t\t\t\tValue: 2,\n\t\t\t\t},\n\t\t\t},\n\t\t\tProfile: map[string]*anypb.Any{\n\t\t\t\t\"user\": profile,\n\t\t\t},\n\t\t\tAttr: &federation.User_B{\n\t\t\t\tB: &federation.User_AttrB{\n\t\t\t\t\tBar: true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\tanyMsg, err := anypb.New(postMsg)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tif diff := cmp.Diff(res, &federation.GetPostResponse{\n\t\tPost:              postMsg,\n\t\tStr:               \"hello\",\n\t\tUuid:              \"daa4728d-159f-4fc2-82cf-cae915d54e08\",\n\t\tLoc:               \"Asia/Tokyo\",\n\t\tValue1:            \"value1\",\n\t\tItemTypeName:      \"ITEM_TYPE_1\",\n\t\tLocationTypeName:  \"LOCATION_TYPE_1\",\n\t\tUserItemTypeName:  \"ITEM_TYPE_2\",\n\t\tItemTypeValueEnum: federation.Item_ITEM_TYPE_1,\n\t\tItemTypeValueInt:  1,\n\t\tItemTypeValueCast: federation.Item_ITEM_TYPE_1,\n\t\tLocationTypeValue: 1,\n\t\tUserItemTypeValue: 2,\n\t\tA: &federation.A{\n\t\t\tB: &federation.A_B{\n\t\t\t\tFoo: &federation.A_B_C{\n\t\t\t\t\tType: \"foo\",\n\t\t\t\t},\n\t\t\t\tBar: &federation.A_B_C{\n\t\t\t\t\tType: \"bar\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tOpt: &federation.A_OptC{OptC: &federation.A_B_C{}},\n\t\t},\n\t\tSortedValues: []int32{1, 2, 3, 4},\n\t\tSortedItems: []*federation.Item{\n\t\t\t{\n\t\t\t\tLocation: &federation.Item_Location{\n\t\t\t\t\tAddr1: \"b\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tLocation: &federation.Item_Location{\n\t\t\t\t\tAddr1: \"a\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tMapValue: map[int32]string{\n\t\t\t1: \"a\",\n\t\t\t2: \"b\",\n\t\t\t3: \"c\",\n\t\t},\n\t\tDoubleWrapperValue: &wrapperspb.DoubleValue{\n\t\t\tValue: 1.23,\n\t\t},\n\t\tFloatWrapperValue: &wrapperspb.FloatValue{\n\t\t\tValue: 3.45,\n\t\t},\n\t\tI64WrapperValue: &wrapperspb.Int64Value{\n\t\t\tValue: 1,\n\t\t},\n\t\tU64WrapperValue: &wrapperspb.UInt64Value{\n\t\t\tValue: 2,\n\t\t},\n\t\tI32WrapperValue: &wrapperspb.Int32Value{\n\t\t\tValue: 3,\n\t\t},\n\t\tU32WrapperValue: &wrapperspb.UInt32Value{\n\t\t\tValue: 4,\n\t\t},\n\t\tStringWrapperValue: &wrapperspb.StringValue{\n\t\t\tValue: \"hello\",\n\t\t},\n\t\tBytesWrapperValue: &wrapperspb.BytesValue{\n\t\t\tValue: []byte(\"world\"),\n\t\t},\n\t\tBoolWrapperValue: &wrapperspb.BoolValue{\n\t\t\tValue: true,\n\t\t},\n\t\tHello:              \"hello\\nworld\",\n\t\tNullTimestamp:      nil,\n\t\tNullTimestamp2:     nil,\n\t\tNullTimestamp3:     nil,\n\t\tJpLoc:              \"JST\",\n\t\tStringsJoin:        \"23.2\",\n\t\tParseFloat:         23.2,\n\t\tUrlUserName:        \"test_user\",\n\t\tEnumValue:          federation.Item_ITEM_TYPE_2,\n\t\tEnumValueStr:       \"second item type\",\n\t\tSqrtDouble:         5,\n\t\tSqrtInt:            5,\n\t\tPow:                8,\n\t\tFloor:              1,\n\t\tFlatten:            []int64{1, 2, 3},\n\t\tRound:              2,\n\t\tAny:                anyMsg,\n\t\tReplaced:           \"1-2-3-grpc\",\n\t\tListToMap:          map[int32]int32{0: 1, 2: 9},\n\t\tUuidParse:          \"daa4728d-159f-4fc2-82cf-cae915d54e08\",\n\t\tUuidValidate:       true,\n\t\tCompile:            \"[a-z]+\\\\d\\\\d\",\n\t\tMustCompile:        \"([a-z]+)\\\\d(\\\\d)\",\n\t\tQuoteMeta:          \"\\\\[a-z\\\\]\\\\+\\\\\\\\d\",\n\t\tFindStringSubmatch: []string{\"abc12\", \"abc\", \"2\"},\n\t\tMatchString:        true,\n\t\tReplaceAllString:   \"salmon is tasty\",\n\t}, cmpopts.IgnoreUnexported(\n\t\tfederation.GetPostResponse{},\n\t\tfederation.Post{},\n\t\tfederation.User{},\n\t\tfederation.Item{},\n\t\tfederation.Item_Location{},\n\t\tfederation.User_B{},\n\t\tfederation.User_AttrB{},\n\t\tfederation.Item_Location_B{},\n\t\tfederation.Item_Location_AddrB{},\n\t\tfederation.A{},\n\t\tfederation.A_B{},\n\t\tfederation.A_B_C{},\n\t\tanypb.Any{},\n\t\twrapperspb.DoubleValue{},\n\t\twrapperspb.FloatValue{},\n\t\twrapperspb.Int64Value{},\n\t\twrapperspb.UInt64Value{},\n\t\twrapperspb.Int32Value{},\n\t\twrapperspb.UInt32Value{},\n\t\twrapperspb.StringValue{},\n\t\twrapperspb.BytesValue{},\n\t\twrapperspb.BoolValue{},\n\t)); diff != \"\" {\n\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t}\n}\n"
  },
  {
    "path": "_examples/02_simple/post/post.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: post/post.proto\n\npackage post\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype GetPostRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetPostRequest) Reset() {\n\t*x = GetPostRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostRequest) ProtoMessage() {}\n\nfunc (x *GetPostRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostRequest.ProtoReflect.Descriptor instead.\nfunc (*GetPostRequest) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetPostRequest) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\ntype GetPostResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPost *Post `protobuf:\"bytes,1,opt,name=post,proto3\" json:\"post,omitempty\"`\n}\n\nfunc (x *GetPostResponse) Reset() {\n\t*x = GetPostResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostResponse) ProtoMessage() {}\n\nfunc (x *GetPostResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostResponse.ProtoReflect.Descriptor instead.\nfunc (*GetPostResponse) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetPostResponse) GetPost() *Post {\n\tif x != nil {\n\t\treturn x.Post\n\t}\n\treturn nil\n}\n\ntype GetPostsRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tIds []string `protobuf:\"bytes,1,rep,name=ids,proto3\" json:\"ids,omitempty\"`\n}\n\nfunc (x *GetPostsRequest) Reset() {\n\t*x = GetPostsRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostsRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostsRequest) ProtoMessage() {}\n\nfunc (x *GetPostsRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostsRequest.ProtoReflect.Descriptor instead.\nfunc (*GetPostsRequest) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *GetPostsRequest) GetIds() []string {\n\tif x != nil {\n\t\treturn x.Ids\n\t}\n\treturn nil\n}\n\ntype GetPostsResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPosts []*Post `protobuf:\"bytes,1,rep,name=posts,proto3\" json:\"posts,omitempty\"`\n}\n\nfunc (x *GetPostsResponse) Reset() {\n\t*x = GetPostsResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostsResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostsResponse) ProtoMessage() {}\n\nfunc (x *GetPostsResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostsResponse.ProtoReflect.Descriptor instead.\nfunc (*GetPostsResponse) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *GetPostsResponse) GetPosts() []*Post {\n\tif x != nil {\n\t\treturn x.Posts\n\t}\n\treturn nil\n}\n\ntype Post struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId      string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tTitle   string `protobuf:\"bytes,2,opt,name=title,proto3\" json:\"title,omitempty\"`\n\tContent string `protobuf:\"bytes,3,opt,name=content,proto3\" json:\"content,omitempty\"`\n\tUserId  string `protobuf:\"bytes,4,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *Post) Reset() {\n\t*x = Post{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Post) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Post) ProtoMessage() {}\n\nfunc (x *Post) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Post.ProtoReflect.Descriptor instead.\nfunc (*Post) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *Post) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetTitle() string {\n\tif x != nil {\n\t\treturn x.Title\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetContent() string {\n\tif x != nil {\n\t\treturn x.Content\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetUserId() string {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn \"\"\n}\n\nvar File_post_post_proto protoreflect.FileDescriptor\n\nvar file_post_post_proto_rawDesc = []byte{\n\t0x0a, 0x0f, 0x70, 0x6f, 0x73, 0x74, 0x2f, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x20, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x6f,\n\t0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x31, 0x0a, 0x0f, 0x47, 0x65, 0x74,\n\t0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x04,\n\t0x70, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x6f, 0x73,\n\t0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x23, 0x0a, 0x0f,\n\t0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,\n\t0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64,\n\t0x73, 0x22, 0x34, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65, 0x73,\n\t0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x05, 0x70, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74,\n\t0x52, 0x05, 0x70, 0x6f, 0x73, 0x74, 0x73, 0x22, 0x5f, 0x0a, 0x04, 0x50, 0x6f, 0x73, 0x74, 0x12,\n\t0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12,\n\t0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,\n\t0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12,\n\t0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x32, 0x84, 0x01, 0x0a, 0x0b, 0x50, 0x6f, 0x73,\n\t0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x38, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x50,\n\t0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f,\n\t0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x70, 0x6f, 0x73, 0x74,\n\t0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x22, 0x00, 0x12, 0x3b, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x15,\n\t0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65,\n\t0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x47, 0x65, 0x74,\n\t0x50, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42,\n\t0x58, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x42, 0x09, 0x50, 0x6f, 0x73,\n\t0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x11, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c,\n\t0x65, 0x2f, 0x70, 0x6f, 0x73, 0x74, 0x3b, 0x70, 0x6f, 0x73, 0x74, 0xa2, 0x02, 0x03, 0x50, 0x58,\n\t0x58, 0xaa, 0x02, 0x04, 0x50, 0x6f, 0x73, 0x74, 0xca, 0x02, 0x04, 0x50, 0x6f, 0x73, 0x74, 0xe2,\n\t0x02, 0x10, 0x50, 0x6f, 0x73, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61,\n\t0x74, 0x61, 0xea, 0x02, 0x04, 0x50, 0x6f, 0x73, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x33,\n}\n\nvar (\n\tfile_post_post_proto_rawDescOnce sync.Once\n\tfile_post_post_proto_rawDescData = file_post_post_proto_rawDesc\n)\n\nfunc file_post_post_proto_rawDescGZIP() []byte {\n\tfile_post_post_proto_rawDescOnce.Do(func() {\n\t\tfile_post_post_proto_rawDescData = protoimpl.X.CompressGZIP(file_post_post_proto_rawDescData)\n\t})\n\treturn file_post_post_proto_rawDescData\n}\n\nvar file_post_post_proto_msgTypes = make([]protoimpl.MessageInfo, 5)\nvar file_post_post_proto_goTypes = []interface{}{\n\t(*GetPostRequest)(nil),   // 0: post.GetPostRequest\n\t(*GetPostResponse)(nil),  // 1: post.GetPostResponse\n\t(*GetPostsRequest)(nil),  // 2: post.GetPostsRequest\n\t(*GetPostsResponse)(nil), // 3: post.GetPostsResponse\n\t(*Post)(nil),             // 4: post.Post\n}\nvar file_post_post_proto_depIdxs = []int32{\n\t4, // 0: post.GetPostResponse.post:type_name -> post.Post\n\t4, // 1: post.GetPostsResponse.posts:type_name -> post.Post\n\t0, // 2: post.PostService.GetPost:input_type -> post.GetPostRequest\n\t2, // 3: post.PostService.GetPosts:input_type -> post.GetPostsRequest\n\t1, // 4: post.PostService.GetPost:output_type -> post.GetPostResponse\n\t3, // 5: post.PostService.GetPosts:output_type -> post.GetPostsResponse\n\t4, // [4:6] is the sub-list for method output_type\n\t2, // [2:4] is the sub-list for method input_type\n\t2, // [2:2] is the sub-list for extension type_name\n\t2, // [2:2] is the sub-list for extension extendee\n\t0, // [0:2] is the sub-list for field type_name\n}\n\nfunc init() { file_post_post_proto_init() }\nfunc file_post_post_proto_init() {\n\tif File_post_post_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_post_post_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostsRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostsResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Post); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_post_post_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   5,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_post_post_proto_goTypes,\n\t\tDependencyIndexes: file_post_post_proto_depIdxs,\n\t\tMessageInfos:      file_post_post_proto_msgTypes,\n\t}.Build()\n\tFile_post_post_proto = out.File\n\tfile_post_post_proto_rawDesc = nil\n\tfile_post_post_proto_goTypes = nil\n\tfile_post_post_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/02_simple/post/post_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: post/post.proto\n\npackage post\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tPostService_GetPost_FullMethodName  = \"/post.PostService/GetPost\"\n\tPostService_GetPosts_FullMethodName = \"/post.PostService/GetPosts\"\n)\n\n// PostServiceClient is the client API for PostService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype PostServiceClient interface {\n\tGetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error)\n\tGetPosts(ctx context.Context, in *GetPostsRequest, opts ...grpc.CallOption) (*GetPostsResponse, error)\n}\n\ntype postServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewPostServiceClient(cc grpc.ClientConnInterface) PostServiceClient {\n\treturn &postServiceClient{cc}\n}\n\nfunc (c *postServiceClient) GetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error) {\n\tout := new(GetPostResponse)\n\terr := c.cc.Invoke(ctx, PostService_GetPost_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *postServiceClient) GetPosts(ctx context.Context, in *GetPostsRequest, opts ...grpc.CallOption) (*GetPostsResponse, error) {\n\tout := new(GetPostsResponse)\n\terr := c.cc.Invoke(ctx, PostService_GetPosts_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// PostServiceServer is the server API for PostService service.\n// All implementations must embed UnimplementedPostServiceServer\n// for forward compatibility\ntype PostServiceServer interface {\n\tGetPost(context.Context, *GetPostRequest) (*GetPostResponse, error)\n\tGetPosts(context.Context, *GetPostsRequest) (*GetPostsResponse, error)\n\tmustEmbedUnimplementedPostServiceServer()\n}\n\n// UnimplementedPostServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedPostServiceServer struct {\n}\n\nfunc (UnimplementedPostServiceServer) GetPost(context.Context, *GetPostRequest) (*GetPostResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetPost not implemented\")\n}\nfunc (UnimplementedPostServiceServer) GetPosts(context.Context, *GetPostsRequest) (*GetPostsResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetPosts not implemented\")\n}\nfunc (UnimplementedPostServiceServer) mustEmbedUnimplementedPostServiceServer() {}\n\n// UnsafePostServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to PostServiceServer will\n// result in compilation errors.\ntype UnsafePostServiceServer interface {\n\tmustEmbedUnimplementedPostServiceServer()\n}\n\nfunc RegisterPostServiceServer(s grpc.ServiceRegistrar, srv PostServiceServer) {\n\ts.RegisterService(&PostService_ServiceDesc, srv)\n}\n\nfunc _PostService_GetPost_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetPostRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(PostServiceServer).GetPost(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: PostService_GetPost_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(PostServiceServer).GetPost(ctx, req.(*GetPostRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _PostService_GetPosts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetPostsRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(PostServiceServer).GetPosts(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: PostService_GetPosts_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(PostServiceServer).GetPosts(ctx, req.(*GetPostsRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// PostService_ServiceDesc is the grpc.ServiceDesc for PostService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar PostService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"post.PostService\",\n\tHandlerType: (*PostServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetPost\",\n\t\t\tHandler:    _PostService_GetPost_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetPosts\",\n\t\t\tHandler:    _PostService_GetPosts_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"post/post.proto\",\n}\n"
  },
  {
    "path": "_examples/02_simple/proto/buf.yaml",
    "content": "version: v1\nbreaking:\n  use:\n    - FILE\nlint:\n  use:\n    - DEFAULT\n"
  },
  {
    "path": "_examples/02_simple/proto/federation/federation.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"google/protobuf/any.proto\";\nimport \"google/protobuf/wrappers.proto\";\nimport \"google/protobuf/timestamp.proto\";\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\noption (grpc.federation.file)= {\n  import: [\"post/post.proto\", \"user/user.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (.grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n    def { name: \"strings_join\" by: \"grpc.federation.strings.join(['1234567'.substring(1, 3), '2'], '.')\" }\n    def { name: \"parse_float\" by: \"grpc.federation.strings.parseFloat(strings_join, 64)\" }\n    def { name: \"url\" by: \"grpc.federation.url.parse('https://test_user:password@example.com/path')\" }\n    def { name: \"date\" by: \"grpc.federation.time.date(2023, 12, 25, 12, 10, 5, 0, grpc.federation.time.UTC())\" }\n    def { name: \"rand_source\" by: \"grpc.federation.rand.newSource(date.unix())\" }\n    def { name: \"fixed_rand\" by: \"grpc.federation.rand.new(rand_source)\" }\n    def { name: \"uuid\" by: \".grpc.federation.uuid.newRandomFromRand(fixed_rand)\" }\n    def { name: \"loc\" by: \"grpc.federation.time.loadLocation('Asia/Tokyo')\"}\n    def { name: \"jp_time\" by: \"grpc.federation.time.date(2023, 12, 25, 12, 10, 5, 0, loc)\" }\n    def { name: \"value1\" by: \"grpc.federation.metadata.incoming()['key1'][0]\"}\n    def { name: \"a\" message { name: \"A\" } }\n    def { name: \"sorted_values\" by: \"[4, 1, 3, 2].sortAsc(v, v)\" }\n    def { name: \"sorted_items\" by: \"[user.Item{location:user.Item.Location{addr1:'a'}}, user.Item{location:user.Item.Location{addr1:'b'}}].sortDesc(v, v.location.addr1)\" }\n    def { name: \"map_value\" by : \"{1: 'a', 2: 'b', 3: 'c'}\" }\n    def { name: \"null_value\" by: \"null\" }\n    def { by: \"grpc.federation.log.info('output federation log', {'post_message': post})\" }\n    def { name: \"e\" enum {name: \"Item.ItemType\" by: \"true ? user.Item.ItemType.value('ITEM_TYPE_2') : user.Item.ItemType.from(1)\"}}\n    def { name: \"sqrt_double\" by: \"grpc.federation.math.sqrt(3.0*3.0+4.0*4.0)\" }\n    def { name: \"sqrt_int\" by: \"grpc.federation.math.sqrt(3*3+4*4)\" }\n    def { name: \"pow\" by: \"grpc.federation.math.pow(2.0, 3.0)\" }\n    def { name: \"floor\" by: \"grpc.federation.math.floor(1.51)\" }\n    def { name: \"flatten\" by: \"[[1], [2], [3]].flatten()\" }\n    def { name: \"round\" by: \"grpc.federation.math.round(1.5)\" }\n    def { name: \"dup\" by: \"[1, 2, 3, 4].filter(dup, dup % 2 == 0)\"}\n    def { name: \"any\" by: \"grpc.federation.any.new(post)\" }\n    def { name: \"fmt\" by: \"'%d-%d-%d-world'.format([1, 2, 3])\" }\n    def { name: \"replaced\" by: \"fmt.replace('world', 'grpc')\" }\n    def { name: \"list_to_map\" by: \"[1, 2, 3].transformMap(idx, v, idx % 2 == 0, (idx * v) + v)\" }\n    def { name: \"uuid_parse\" by: \"grpc.federation.uuid.parse(uuid.string())\" }\n    def { name: \"uuid_validate\" by: \"grpc.federation.uuid.validate(uuid.string())\" }\n    def { name: \"compile\" by: \"grpc.federation.regexp.compile('[a-z]+\\\\\\\\d\\\\\\\\d')\" }\n    def { name: \"must_compile\" by: \"grpc.federation.regexp.mustCompile('([a-z]+)\\\\\\\\d(\\\\\\\\d)')\" }\n    def { name: \"quote_meta\" by: \"grpc.federation.regexp.quoteMeta('[a-z]+\\\\\\\\d')\" }\n    def { name: \"find_string_submatch\" by: \"must_compile.findStringSubmatch('abc123')\" }\n    def { name: \"match_string\" by: \"compile.matchString('abc12')\" }\n    def { name: \"replace_all_string\" by: \"grpc.federation.regexp.compile('mackerel').replaceAllString('mackerel is tasty', 'salmon')\" }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n  string str = 2 [(grpc.federation.field).by = \"'hello'\"];\n  string uuid = 3 [(grpc.federation.field).by = \"uuid.string()\"];\n  string loc = 4 [(grpc.federation.field).by = \"loc.string()\"];\n  string value1 = 5 [(grpc.federation.field).by = \"value1\"];\n  string item_type_name = 6 [(grpc.federation.field).by = \"Item.ItemType.name(Item.ItemType.ITEM_TYPE_1)\"];\n  string location_type_name = 7 [(grpc.federation.field).by = \"Item.Location.LocationType.name(Item.Location.LocationType.LOCATION_TYPE_1)\"];\n  string user_item_type_name = 8 [(grpc.federation.field).by = \"user.Item.ItemType.name(user.Item.ItemType.ITEM_TYPE_2)\"];\n  Item.ItemType item_type_value_enum = 9 [(grpc.federation.field).by = \"user.Item.ItemType.value('ITEM_TYPE_1')\"];\n  int32 item_type_value_int = 10 [(grpc.federation.field).by = \"user.Item.ItemType.value('ITEM_TYPE_1')\"];\n  Item.ItemType item_type_value_cast = 11 [(grpc.federation.field).by = \"user.Item.ItemType.from(1)\"];\n  int32 location_type_value = 12 [(grpc.federation.field).by = \"Item.Location.LocationType.value('LOCATION_TYPE_1')\"];\n  int32 user_item_type_value = 13 [(grpc.federation.field).by = \"user.Item.ItemType.value('ITEM_TYPE_2')\"];\n  A a = 14 [(grpc.federation.field).by = \"a\"];\n  repeated int32 sorted_values = 15 [(grpc.federation.field).by = \"sorted_values\"];\n  repeated Item sorted_items = 16 [(grpc.federation.field).by = \"sorted_items\"];\n  map<int32, string> map_value = 17 [(grpc.federation.field).by = \"map_value\"];\n  google.protobuf.DoubleValue double_wrapper_value = 18 [(grpc.federation.field).by = \"google.protobuf.DoubleValue{value: 1.23}\"];\n  google.protobuf.FloatValue float_wrapper_value = 19 [(grpc.federation.field).by = \"google.protobuf.FloatValue{value: 3.45}\"];\n  google.protobuf.Int64Value i64_wrapper_value = 20 [(grpc.federation.field).by = \"google.protobuf.Int64Value{value: 1}\"];\n  google.protobuf.UInt64Value u64_wrapper_value = 21 [(grpc.federation.field).by = \"google.protobuf.UInt64Value{value: uint(2)}\"];\n  google.protobuf.Int32Value i32_wrapper_value = 22 [(grpc.federation.field).by = \"google.protobuf.Int32Value{value: 3}\"];\n  google.protobuf.UInt32Value u32_wrapper_value = 23 [(grpc.federation.field).by = \"google.protobuf.UInt32Value{value: uint(4)}\"];\n  google.protobuf.BoolValue bool_wrapper_value = 24 [(grpc.federation.field).by = \"google.protobuf.BoolValue{value: true}\"];\n  google.protobuf.StringValue string_wrapper_value = 25 [(grpc.federation.field).by = \"google.protobuf.StringValue{value: 'hello'}\"];\n  google.protobuf.BytesValue bytes_wrapper_value = 26 [(grpc.federation.field).by = \"google.protobuf.BytesValue{value: bytes('world')}\"];\n  string hello = 27 [(grpc.federation.field).by = \"'hello\\\\nworld'\"];\n  google.protobuf.Timestamp null_timestamp = 28 [(grpc.federation.field).by = \"null\"];\n  google.protobuf.Timestamp null_timestamp2 = 29 [(grpc.federation.field).by = \"null_value\"];\n  google.protobuf.Timestamp null_timestamp3 = 30 [(grpc.federation.field).by = \"true ? null : google.protobuf.Timestamp{}\"];\n  string jp_loc = 31 [(grpc.federation.field).by = \"jp_time.location().string()\"];\n  string strings_join = 32 [(grpc.federation.field).by = \"strings_join\"];\n  double parse_float = 33 [(grpc.federation.field).by = \"parse_float\"];\n  string url_user_name = 34 [(grpc.federation.field).by = \"url.userinfo().username()\"];\n  Item.ItemType enum_value = 35 [(grpc.federation.field).by = \"e\"];\n  string enum_value_str = 36 [(grpc.federation.field).by = \"Item.ItemType.attr(e, 'en')\"];\n  double sqrt_double = 37 [(grpc.federation.field).by = \"sqrt_double\"];\n  double sqrt_int = 38 [(grpc.federation.field).by = \"sqrt_int\"];\n  double pow = 39 [(grpc.federation.field).by = \"pow\"];\n  double floor = 40 [(grpc.federation.field).by = \"floor\"];\n  repeated int64 flatten = 41 [(grpc.federation.field).by = \"flatten\"];\n  double round = 42 [(grpc.federation.field).by = \"round\"];\n  google.protobuf.Any any = 43 [(grpc.federation.field).by = \"any\"];\n  string replaced = 44 [(grpc.federation.field).by = \"replaced\"];\n  map<int32, int32> list_to_map = 45 [(grpc.federation.field).by = \"list_to_map\"];\n  string uuid_parse = 46 [(grpc.federation.field).by = \"uuid_parse.string()\"];\n  bool uuid_validate = 47 [(grpc.federation.field).by = \"uuid_validate\"];\n  string compile = 48 [(grpc.federation.field).by = \"compile.string()\"];\n  string must_compile = 49 [(grpc.federation.field).by = \"must_compile.string()\"];\n  string quote_meta = 50 [(grpc.federation.field).by = \"quote_meta\"];\n  repeated string find_string_submatch = 51 [(grpc.federation.field).by = \"find_string_submatch\"];\n  bool match_string = 52 [(grpc.federation.field).by = \"match_string\"];\n  string replace_all_string = 53 [(grpc.federation.field).by = \"replace_all_string\"];\n}\n\nmessage A {\n  message B {\n    option (grpc.federation.message) = {\n      def [\n        { name: \"foo\" message: { name: \"A.B.C\" args { name: \"type\" by: \"'foo'\" } } },\n        { name: \"bar\" message: { name: \"A.B.C\" args { name: \"type\" by: \"'bar'\" } } },\n        { if: \"foo.type == 'foo'\" by: \"grpc.federation.log.info('output federation log', {'messages': [foo, bar], 'message_map': {'foo': foo, 'bar': bar}})\" },\n        { by: \"grpc.federation.log.add({'foo_type': foo.type, 'bar_type': bar.type})\" }\n      ]\n    };\n    message C {\n      string type = 1 [(grpc.federation.field).by = \"$.type\"];\n    }\n    C foo = 1 [(grpc.federation.field).by = \"foo\"];\n    C bar = 2 [(grpc.federation.field).by = \"bar\"];\n  }\n  option (grpc.federation.message) = {\n    def { name: \"b\" message { name: \"A.B\" } }\n  };\n  B b = 1 [(grpc.federation.field).by = \"b\"];\n  oneof opt {\n    B.C opt_c = 2 [(grpc.federation.field).oneof = {\n      if: \"true\"\n      by: \"A.B.C{}\"\n    }];\n  }\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"res\"\n        call {\n          method: \"post.PostService/GetPost\"\n          request { field: \"id\", by: \"$.id\" }      \n          timeout: \"10s\"\n          retry {\n            constant {\n              interval: \"2s\"\n              max_retries: 3\n            }\n          }\n        }\n      },\n      { name: \"post\", by: \"res.post\", autobind: true },\n      {\n        name: \"user\"\n        message {\n          name: \"User\"\n          args { inline: \"post\" }\n        }\n      }\n    ]\n  };\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  User user = 4 [(grpc.federation.field).by = \"user\"];\n}\n\nmessage User {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"res\"\n        call {\n          method: \"user.UserService/GetUser\"\n          request [\n            { field: \"id\", by: \"$.user_id\" },\n            { field: \"type\" by: \"user.Item.ItemType.value('ITEM_TYPE_1')\" }\n          ]\n          timeout: \"20s\"\n          retry {\n            exponential {\n              initial_interval: \"1s\"\n              randomization_factor: 0.7\n              multiplier: 1.7\n              max_interval: \"30s\"\n              max_retries: 3\n            }\n          }\n        }\n      },\n      { name: \"user\", by: \"res.user\", autobind: true }\n    ]\n  };\n  string id = 1;\n  string name = 2;\n  repeated Item items = 3;\n  map<string, google.protobuf.Any> profile = 4;\n  oneof attr {\n    AttrA attr_a = 5;\n    AttrB b = 6;\n  }\n  message AttrA {\n    option (grpc.federation.message).alias = \"user.User.AttrA\";\n    string foo = 1;\n  }\n  message AttrB {\n    option (grpc.federation.message).alias = \"user.User.AttrB\";\n    bool bar = 2;\n  }\n}\n\nmessage Item {\n  option (grpc.federation.message).alias = \"user.Item\";\n\n  enum ItemType {\n    option (grpc.federation.enum).alias = \"user.Item.ItemType\";\n\n    ITEM_TYPE_UNSPECIFIED = 0 [(grpc.federation.enum_value) = {\n      attr {\n        name: \"en\"\n        value: \"unknown item\"\n      }\n      attr {\n        name: \"sub\"\n        value: \"\"\n      }\n    }];\n    ITEM_TYPE_1 = 1 [(grpc.federation.enum_value) = {\n      attr {\n        name: \"en\"\n        value: \"first item type\"\n      }\n      attr {\n        name: \"sub\"\n        value: \"xxx\"\n      }\n    }];\n    ITEM_TYPE_2 = 2 [(grpc.federation.enum_value) = {\n      attr {\n        name: \"en\"\n        value: \"second item type\"\n      }\n      attr {\n        name: \"sub\"\n        value: \"yyy\"\n      }\n    }];\n    ITEM_TYPE_3 = 3 [(grpc.federation.enum_value) = {\n      attr {\n        name: \"en\"\n        value: \"third item type\"\n      }\n      attr {\n        name: \"sub\"\n        value: \"zzz\"\n      }\n    }];\n  }\n  message Location {\n    option (grpc.federation.message).alias = \"user.Item.Location\";\n\n    string addr1 = 1;\n    string addr2 = 2;\n    oneof addr3 {\n      AddrA addr_a = 3;\n      AddrB b = 4;\n      string c = 5;\n    };\n    message AddrA {\n      option (grpc.federation.message).alias = \"user.Item.Location.AddrA\";\n      string foo = 1;\n    }\n    message AddrB {\n      option (grpc.federation.message).alias = \"user.Item.Location.AddrB\";\n      int64 bar = 1;\n    }\n\n    enum LocationType {\n      LOCATION_TYPE_0 = 0;\n      LOCATION_TYPE_1 = 1;\n    }\n  }\n  string name = 1;\n  ItemType type = 2;\n  int64 value = 3;\n  Location location = 4;\n}\n"
  },
  {
    "path": "_examples/02_simple/proto/post/post.proto",
    "content": "syntax = \"proto3\";\n\npackage post;\n\noption go_package = \"example/post;post\";\n\nservice PostService {\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n  rpc GetPosts(GetPostsRequest) returns (GetPostsResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  Post post = 1;\n}\n\nmessage GetPostsRequest {\n  repeated string ids = 1;\n}\n\nmessage GetPostsResponse {\n  repeated Post posts = 1;\n}\n\nmessage Post {\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  string user_id = 4;\n}\n"
  },
  {
    "path": "_examples/02_simple/proto/user/user.proto",
    "content": "syntax = \"proto3\";\n\npackage user;\n\nimport \"google/protobuf/any.proto\";\n\noption go_package = \"example/user;user\";\n\nservice UserService {\n  rpc GetUser(GetUserRequest) returns (GetUserResponse) {};\n  rpc GetUsers(GetUsersRequest) returns (GetUsersResponse) {};\n}\n\nmessage GetUserRequest {\n  string id = 1;\n  int32 type = 2;\n}\n\nmessage GetUserResponse {\n  User user = 1;\n}\n\nmessage GetUsersRequest {\n  repeated string ids = 1;\n}\n\nmessage GetUsersResponse {\n  repeated User users = 1;\n}\n\nmessage User {\n  string id = 1;\n  string name = 2;\n  repeated Item items = 3;\n  map<string, google.protobuf.Any> profile = 4;\n  oneof attr {\n    AttrA attr_a = 5;\n    AttrB b = 6;\n  }\n  message AttrA {\n    string foo = 1;\n  }\n  message AttrB {\n    bool bar = 2;\n  }\n}\n\nmessage Item {\n  enum ItemType {\n    ITEM_TYPE_UNSPECIFIED = 0;\n    ITEM_TYPE_1 = 1;\n    ITEM_TYPE_2 = 2;\n    ITEM_TYPE_3 = 3;\n  }\n  message Location {\n    string addr1 = 1;\n    string addr2 = 2;\n    oneof addr3 {\n      AddrA addr_a = 3;\n      AddrB b = 4;\n      string c = 5;\n    };\n    message AddrA {\n      string foo = 1;\n    }\n    message AddrB {\n      int64 bar = 1;\n    }\n  }\n  string name = 1;\n  ItemType type = 2;\n  int64 value = 3;\n  Location location = 4;\n}"
  },
  {
    "path": "_examples/02_simple/user/user.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: user/user.proto\n\npackage user\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tanypb \"google.golang.org/protobuf/types/known/anypb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Item_ItemType int32\n\nconst (\n\tItem_ITEM_TYPE_UNSPECIFIED Item_ItemType = 0\n\tItem_ITEM_TYPE_1           Item_ItemType = 1\n\tItem_ITEM_TYPE_2           Item_ItemType = 2\n\tItem_ITEM_TYPE_3           Item_ItemType = 3\n)\n\n// Enum value maps for Item_ItemType.\nvar (\n\tItem_ItemType_name = map[int32]string{\n\t\t0: \"ITEM_TYPE_UNSPECIFIED\",\n\t\t1: \"ITEM_TYPE_1\",\n\t\t2: \"ITEM_TYPE_2\",\n\t\t3: \"ITEM_TYPE_3\",\n\t}\n\tItem_ItemType_value = map[string]int32{\n\t\t\"ITEM_TYPE_UNSPECIFIED\": 0,\n\t\t\"ITEM_TYPE_1\":           1,\n\t\t\"ITEM_TYPE_2\":           2,\n\t\t\"ITEM_TYPE_3\":           3,\n\t}\n)\n\nfunc (x Item_ItemType) Enum() *Item_ItemType {\n\tp := new(Item_ItemType)\n\t*p = x\n\treturn p\n}\n\nfunc (x Item_ItemType) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (Item_ItemType) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_user_user_proto_enumTypes[0].Descriptor()\n}\n\nfunc (Item_ItemType) Type() protoreflect.EnumType {\n\treturn &file_user_user_proto_enumTypes[0]\n}\n\nfunc (x Item_ItemType) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use Item_ItemType.Descriptor instead.\nfunc (Item_ItemType) EnumDescriptor() ([]byte, []int) {\n\treturn file_user_user_proto_rawDescGZIP(), []int{5, 0}\n}\n\ntype GetUserRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId   string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tType int32  `protobuf:\"varint,2,opt,name=type,proto3\" json:\"type,omitempty\"`\n}\n\nfunc (x *GetUserRequest) Reset() {\n\t*x = GetUserRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_user_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetUserRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetUserRequest) ProtoMessage() {}\n\nfunc (x *GetUserRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_user_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetUserRequest.ProtoReflect.Descriptor instead.\nfunc (*GetUserRequest) Descriptor() ([]byte, []int) {\n\treturn file_user_user_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetUserRequest) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetUserRequest) GetType() int32 {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn 0\n}\n\ntype GetUserResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUser *User `protobuf:\"bytes,1,opt,name=user,proto3\" json:\"user,omitempty\"`\n}\n\nfunc (x *GetUserResponse) Reset() {\n\t*x = GetUserResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_user_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetUserResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetUserResponse) ProtoMessage() {}\n\nfunc (x *GetUserResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_user_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetUserResponse.ProtoReflect.Descriptor instead.\nfunc (*GetUserResponse) Descriptor() ([]byte, []int) {\n\treturn file_user_user_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetUserResponse) GetUser() *User {\n\tif x != nil {\n\t\treturn x.User\n\t}\n\treturn nil\n}\n\ntype GetUsersRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tIds []string `protobuf:\"bytes,1,rep,name=ids,proto3\" json:\"ids,omitempty\"`\n}\n\nfunc (x *GetUsersRequest) Reset() {\n\t*x = GetUsersRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_user_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetUsersRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetUsersRequest) ProtoMessage() {}\n\nfunc (x *GetUsersRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_user_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetUsersRequest.ProtoReflect.Descriptor instead.\nfunc (*GetUsersRequest) Descriptor() ([]byte, []int) {\n\treturn file_user_user_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *GetUsersRequest) GetIds() []string {\n\tif x != nil {\n\t\treturn x.Ids\n\t}\n\treturn nil\n}\n\ntype GetUsersResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUsers []*User `protobuf:\"bytes,1,rep,name=users,proto3\" json:\"users,omitempty\"`\n}\n\nfunc (x *GetUsersResponse) Reset() {\n\t*x = GetUsersResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_user_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetUsersResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetUsersResponse) ProtoMessage() {}\n\nfunc (x *GetUsersResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_user_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetUsersResponse.ProtoReflect.Descriptor instead.\nfunc (*GetUsersResponse) Descriptor() ([]byte, []int) {\n\treturn file_user_user_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *GetUsersResponse) GetUsers() []*User {\n\tif x != nil {\n\t\treturn x.Users\n\t}\n\treturn nil\n}\n\ntype User struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId      string                `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName    string                `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tItems   []*Item               `protobuf:\"bytes,3,rep,name=items,proto3\" json:\"items,omitempty\"`\n\tProfile map[string]*anypb.Any `protobuf:\"bytes,4,rep,name=profile,proto3\" json:\"profile,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\t// Types that are assignable to Attr:\n\t//\n\t//\t*User_AttrA_\n\t//\t*User_B\n\tAttr isUser_Attr `protobuf_oneof:\"attr\"`\n}\n\nfunc (x *User) Reset() {\n\t*x = User{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_user_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *User) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*User) ProtoMessage() {}\n\nfunc (x *User) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_user_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use User.ProtoReflect.Descriptor instead.\nfunc (*User) Descriptor() ([]byte, []int) {\n\treturn file_user_user_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *User) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *User) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *User) GetItems() []*Item {\n\tif x != nil {\n\t\treturn x.Items\n\t}\n\treturn nil\n}\n\nfunc (x *User) GetProfile() map[string]*anypb.Any {\n\tif x != nil {\n\t\treturn x.Profile\n\t}\n\treturn nil\n}\n\nfunc (m *User) GetAttr() isUser_Attr {\n\tif m != nil {\n\t\treturn m.Attr\n\t}\n\treturn nil\n}\n\nfunc (x *User) GetAttrA() *User_AttrA {\n\tif x, ok := x.GetAttr().(*User_AttrA_); ok {\n\t\treturn x.AttrA\n\t}\n\treturn nil\n}\n\nfunc (x *User) GetB() *User_AttrB {\n\tif x, ok := x.GetAttr().(*User_B); ok {\n\t\treturn x.B\n\t}\n\treturn nil\n}\n\ntype isUser_Attr interface {\n\tisUser_Attr()\n}\n\ntype User_AttrA_ struct {\n\tAttrA *User_AttrA `protobuf:\"bytes,5,opt,name=attr_a,json=attrA,proto3,oneof\"`\n}\n\ntype User_B struct {\n\tB *User_AttrB `protobuf:\"bytes,6,opt,name=b,proto3,oneof\"`\n}\n\nfunc (*User_AttrA_) isUser_Attr() {}\n\nfunc (*User_B) isUser_Attr() {}\n\ntype Item struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName     string         `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tType     Item_ItemType  `protobuf:\"varint,2,opt,name=type,proto3,enum=user.Item_ItemType\" json:\"type,omitempty\"`\n\tValue    int64          `protobuf:\"varint,3,opt,name=value,proto3\" json:\"value,omitempty\"`\n\tLocation *Item_Location `protobuf:\"bytes,4,opt,name=location,proto3\" json:\"location,omitempty\"`\n}\n\nfunc (x *Item) Reset() {\n\t*x = Item{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_user_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Item) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Item) ProtoMessage() {}\n\nfunc (x *Item) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_user_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Item.ProtoReflect.Descriptor instead.\nfunc (*Item) Descriptor() ([]byte, []int) {\n\treturn file_user_user_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *Item) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Item) GetType() Item_ItemType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn Item_ITEM_TYPE_UNSPECIFIED\n}\n\nfunc (x *Item) GetValue() int64 {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn 0\n}\n\nfunc (x *Item) GetLocation() *Item_Location {\n\tif x != nil {\n\t\treturn x.Location\n\t}\n\treturn nil\n}\n\ntype User_AttrA struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tFoo string `protobuf:\"bytes,1,opt,name=foo,proto3\" json:\"foo,omitempty\"`\n}\n\nfunc (x *User_AttrA) Reset() {\n\t*x = User_AttrA{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_user_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *User_AttrA) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*User_AttrA) ProtoMessage() {}\n\nfunc (x *User_AttrA) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_user_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use User_AttrA.ProtoReflect.Descriptor instead.\nfunc (*User_AttrA) Descriptor() ([]byte, []int) {\n\treturn file_user_user_proto_rawDescGZIP(), []int{4, 1}\n}\n\nfunc (x *User_AttrA) GetFoo() string {\n\tif x != nil {\n\t\treturn x.Foo\n\t}\n\treturn \"\"\n}\n\ntype User_AttrB struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tBar bool `protobuf:\"varint,2,opt,name=bar,proto3\" json:\"bar,omitempty\"`\n}\n\nfunc (x *User_AttrB) Reset() {\n\t*x = User_AttrB{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_user_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *User_AttrB) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*User_AttrB) ProtoMessage() {}\n\nfunc (x *User_AttrB) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_user_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use User_AttrB.ProtoReflect.Descriptor instead.\nfunc (*User_AttrB) Descriptor() ([]byte, []int) {\n\treturn file_user_user_proto_rawDescGZIP(), []int{4, 2}\n}\n\nfunc (x *User_AttrB) GetBar() bool {\n\tif x != nil {\n\t\treturn x.Bar\n\t}\n\treturn false\n}\n\ntype Item_Location struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tAddr1 string `protobuf:\"bytes,1,opt,name=addr1,proto3\" json:\"addr1,omitempty\"`\n\tAddr2 string `protobuf:\"bytes,2,opt,name=addr2,proto3\" json:\"addr2,omitempty\"`\n\t// Types that are assignable to Addr3:\n\t//\n\t//\t*Item_Location_AddrA_\n\t//\t*Item_Location_B\n\t//\t*Item_Location_C\n\tAddr3 isItem_Location_Addr3 `protobuf_oneof:\"addr3\"`\n}\n\nfunc (x *Item_Location) Reset() {\n\t*x = Item_Location{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_user_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Item_Location) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Item_Location) ProtoMessage() {}\n\nfunc (x *Item_Location) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_user_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Item_Location.ProtoReflect.Descriptor instead.\nfunc (*Item_Location) Descriptor() ([]byte, []int) {\n\treturn file_user_user_proto_rawDescGZIP(), []int{5, 0}\n}\n\nfunc (x *Item_Location) GetAddr1() string {\n\tif x != nil {\n\t\treturn x.Addr1\n\t}\n\treturn \"\"\n}\n\nfunc (x *Item_Location) GetAddr2() string {\n\tif x != nil {\n\t\treturn x.Addr2\n\t}\n\treturn \"\"\n}\n\nfunc (m *Item_Location) GetAddr3() isItem_Location_Addr3 {\n\tif m != nil {\n\t\treturn m.Addr3\n\t}\n\treturn nil\n}\n\nfunc (x *Item_Location) GetAddrA() *Item_Location_AddrA {\n\tif x, ok := x.GetAddr3().(*Item_Location_AddrA_); ok {\n\t\treturn x.AddrA\n\t}\n\treturn nil\n}\n\nfunc (x *Item_Location) GetB() *Item_Location_AddrB {\n\tif x, ok := x.GetAddr3().(*Item_Location_B); ok {\n\t\treturn x.B\n\t}\n\treturn nil\n}\n\nfunc (x *Item_Location) GetC() string {\n\tif x, ok := x.GetAddr3().(*Item_Location_C); ok {\n\t\treturn x.C\n\t}\n\treturn \"\"\n}\n\ntype isItem_Location_Addr3 interface {\n\tisItem_Location_Addr3()\n}\n\ntype Item_Location_AddrA_ struct {\n\tAddrA *Item_Location_AddrA `protobuf:\"bytes,3,opt,name=addr_a,json=addrA,proto3,oneof\"`\n}\n\ntype Item_Location_B struct {\n\tB *Item_Location_AddrB `protobuf:\"bytes,4,opt,name=b,proto3,oneof\"`\n}\n\ntype Item_Location_C struct {\n\tC string `protobuf:\"bytes,5,opt,name=c,proto3,oneof\"`\n}\n\nfunc (*Item_Location_AddrA_) isItem_Location_Addr3() {}\n\nfunc (*Item_Location_B) isItem_Location_Addr3() {}\n\nfunc (*Item_Location_C) isItem_Location_Addr3() {}\n\ntype Item_Location_AddrA struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tFoo string `protobuf:\"bytes,1,opt,name=foo,proto3\" json:\"foo,omitempty\"`\n}\n\nfunc (x *Item_Location_AddrA) Reset() {\n\t*x = Item_Location_AddrA{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_user_proto_msgTypes[10]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Item_Location_AddrA) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Item_Location_AddrA) ProtoMessage() {}\n\nfunc (x *Item_Location_AddrA) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_user_proto_msgTypes[10]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Item_Location_AddrA.ProtoReflect.Descriptor instead.\nfunc (*Item_Location_AddrA) Descriptor() ([]byte, []int) {\n\treturn file_user_user_proto_rawDescGZIP(), []int{5, 0, 0}\n}\n\nfunc (x *Item_Location_AddrA) GetFoo() string {\n\tif x != nil {\n\t\treturn x.Foo\n\t}\n\treturn \"\"\n}\n\ntype Item_Location_AddrB struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tBar int64 `protobuf:\"varint,1,opt,name=bar,proto3\" json:\"bar,omitempty\"`\n}\n\nfunc (x *Item_Location_AddrB) Reset() {\n\t*x = Item_Location_AddrB{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_user_proto_msgTypes[11]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Item_Location_AddrB) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Item_Location_AddrB) ProtoMessage() {}\n\nfunc (x *Item_Location_AddrB) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_user_proto_msgTypes[11]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Item_Location_AddrB.ProtoReflect.Descriptor instead.\nfunc (*Item_Location_AddrB) Descriptor() ([]byte, []int) {\n\treturn file_user_user_proto_rawDescGZIP(), []int{5, 0, 1}\n}\n\nfunc (x *Item_Location_AddrB) GetBar() int64 {\n\tif x != nil {\n\t\treturn x.Bar\n\t}\n\treturn 0\n}\n\nvar File_user_user_proto protoreflect.FileDescriptor\n\nvar file_user_user_proto_rawDesc = []byte{\n\t0x0a, 0x0f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x04, 0x75, 0x73, 0x65, 0x72, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x22, 0x34, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x05, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x31, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x55,\n\t0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x04, 0x75,\n\t0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x75, 0x73, 0x65, 0x72,\n\t0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x23, 0x0a, 0x0f, 0x47,\n\t0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10,\n\t0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73,\n\t0x22, 0x34, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70,\n\t0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20,\n\t0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52,\n\t0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x22, 0xdc, 0x02, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12,\n\t0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12,\n\t0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03,\n\t0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05,\n\t0x69, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x31, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65,\n\t0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73,\n\t0x65, 0x72, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52,\n\t0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x61, 0x74, 0x74, 0x72,\n\t0x5f, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e,\n\t0x55, 0x73, 0x65, 0x72, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x41, 0x48, 0x00, 0x52, 0x05, 0x61, 0x74,\n\t0x74, 0x72, 0x41, 0x12, 0x20, 0x0a, 0x01, 0x62, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10,\n\t0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x42,\n\t0x48, 0x00, 0x52, 0x01, 0x62, 0x1a, 0x50, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65,\n\t0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, 0x76, 0x61,\n\t0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x19, 0x0a, 0x05, 0x41, 0x74, 0x74, 0x72, 0x41,\n\t0x12, 0x10, 0x0a, 0x03, 0x66, 0x6f, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x66,\n\t0x6f, 0x6f, 0x1a, 0x19, 0x0a, 0x05, 0x41, 0x74, 0x74, 0x72, 0x42, 0x12, 0x10, 0x0a, 0x03, 0x62,\n\t0x61, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x62, 0x61, 0x72, 0x42, 0x06, 0x0a,\n\t0x04, 0x61, 0x74, 0x74, 0x72, 0x22, 0xcb, 0x03, 0x0a, 0x04, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x12,\n\t0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e,\n\t0x32, 0x13, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x49, 0x74, 0x65,\n\t0x6d, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76,\n\t0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,\n\t0x65, 0x12, 0x2f, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x2e,\n\t0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x1a, 0xe4, 0x01, 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12,\n\t0x14, 0x0a, 0x05, 0x61, 0x64, 0x64, 0x72, 0x31, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,\n\t0x61, 0x64, 0x64, 0x72, 0x31, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x64, 0x64, 0x72, 0x32, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x64, 0x64, 0x72, 0x32, 0x12, 0x32, 0x0a, 0x06, 0x61,\n\t0x64, 0x64, 0x72, 0x5f, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x75, 0x73,\n\t0x65, 0x72, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x41, 0x64, 0x64, 0x72, 0x41, 0x48, 0x00, 0x52, 0x05, 0x61, 0x64, 0x64, 0x72, 0x41, 0x12,\n\t0x29, 0x0a, 0x01, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x75, 0x73, 0x65,\n\t0x72, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x41, 0x64, 0x64, 0x72, 0x42, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x0e, 0x0a, 0x01, 0x63, 0x18,\n\t0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x01, 0x63, 0x1a, 0x19, 0x0a, 0x05, 0x41, 0x64,\n\t0x64, 0x72, 0x41, 0x12, 0x10, 0x0a, 0x03, 0x66, 0x6f, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x03, 0x66, 0x6f, 0x6f, 0x1a, 0x19, 0x0a, 0x05, 0x41, 0x64, 0x64, 0x72, 0x42, 0x12, 0x10,\n\t0x0a, 0x03, 0x62, 0x61, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x62, 0x61, 0x72,\n\t0x42, 0x07, 0x0a, 0x05, 0x61, 0x64, 0x64, 0x72, 0x33, 0x22, 0x58, 0x0a, 0x08, 0x49, 0x74, 0x65,\n\t0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, 0x15, 0x49, 0x54, 0x45, 0x4d, 0x5f, 0x54, 0x59,\n\t0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00,\n\t0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x54, 0x45, 0x4d, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x31, 0x10,\n\t0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x54, 0x45, 0x4d, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x32,\n\t0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x54, 0x45, 0x4d, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f,\n\t0x33, 0x10, 0x03, 0x32, 0x84, 0x01, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x12, 0x38, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x14,\n\t0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x55,\n\t0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a,\n\t0x08, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x15, 0x2e, 0x75, 0x73, 0x65, 0x72,\n\t0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x1a, 0x16, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73,\n\t0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x58, 0x0a, 0x08, 0x63, 0x6f,\n\t0x6d, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x42, 0x09, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74,\n\t0x6f, 0x50, 0x01, 0x5a, 0x11, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x75, 0x73, 0x65,\n\t0x72, 0x3b, 0x75, 0x73, 0x65, 0x72, 0xa2, 0x02, 0x03, 0x55, 0x58, 0x58, 0xaa, 0x02, 0x04, 0x55,\n\t0x73, 0x65, 0x72, 0xca, 0x02, 0x04, 0x55, 0x73, 0x65, 0x72, 0xe2, 0x02, 0x10, 0x55, 0x73, 0x65,\n\t0x72, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x04,\n\t0x55, 0x73, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_user_user_proto_rawDescOnce sync.Once\n\tfile_user_user_proto_rawDescData = file_user_user_proto_rawDesc\n)\n\nfunc file_user_user_proto_rawDescGZIP() []byte {\n\tfile_user_user_proto_rawDescOnce.Do(func() {\n\t\tfile_user_user_proto_rawDescData = protoimpl.X.CompressGZIP(file_user_user_proto_rawDescData)\n\t})\n\treturn file_user_user_proto_rawDescData\n}\n\nvar file_user_user_proto_enumTypes = make([]protoimpl.EnumInfo, 1)\nvar file_user_user_proto_msgTypes = make([]protoimpl.MessageInfo, 12)\nvar file_user_user_proto_goTypes = []interface{}{\n\t(Item_ItemType)(0),          // 0: user.Item.ItemType\n\t(*GetUserRequest)(nil),      // 1: user.GetUserRequest\n\t(*GetUserResponse)(nil),     // 2: user.GetUserResponse\n\t(*GetUsersRequest)(nil),     // 3: user.GetUsersRequest\n\t(*GetUsersResponse)(nil),    // 4: user.GetUsersResponse\n\t(*User)(nil),                // 5: user.User\n\t(*Item)(nil),                // 6: user.Item\n\tnil,                         // 7: user.User.ProfileEntry\n\t(*User_AttrA)(nil),          // 8: user.User.AttrA\n\t(*User_AttrB)(nil),          // 9: user.User.AttrB\n\t(*Item_Location)(nil),       // 10: user.Item.Location\n\t(*Item_Location_AddrA)(nil), // 11: user.Item.Location.AddrA\n\t(*Item_Location_AddrB)(nil), // 12: user.Item.Location.AddrB\n\t(*anypb.Any)(nil),           // 13: google.protobuf.Any\n}\nvar file_user_user_proto_depIdxs = []int32{\n\t5,  // 0: user.GetUserResponse.user:type_name -> user.User\n\t5,  // 1: user.GetUsersResponse.users:type_name -> user.User\n\t6,  // 2: user.User.items:type_name -> user.Item\n\t7,  // 3: user.User.profile:type_name -> user.User.ProfileEntry\n\t8,  // 4: user.User.attr_a:type_name -> user.User.AttrA\n\t9,  // 5: user.User.b:type_name -> user.User.AttrB\n\t0,  // 6: user.Item.type:type_name -> user.Item.ItemType\n\t10, // 7: user.Item.location:type_name -> user.Item.Location\n\t13, // 8: user.User.ProfileEntry.value:type_name -> google.protobuf.Any\n\t11, // 9: user.Item.Location.addr_a:type_name -> user.Item.Location.AddrA\n\t12, // 10: user.Item.Location.b:type_name -> user.Item.Location.AddrB\n\t1,  // 11: user.UserService.GetUser:input_type -> user.GetUserRequest\n\t3,  // 12: user.UserService.GetUsers:input_type -> user.GetUsersRequest\n\t2,  // 13: user.UserService.GetUser:output_type -> user.GetUserResponse\n\t4,  // 14: user.UserService.GetUsers:output_type -> user.GetUsersResponse\n\t13, // [13:15] is the sub-list for method output_type\n\t11, // [11:13] is the sub-list for method input_type\n\t11, // [11:11] is the sub-list for extension type_name\n\t11, // [11:11] is the sub-list for extension extendee\n\t0,  // [0:11] is the sub-list for field type_name\n}\n\nfunc init() { file_user_user_proto_init() }\nfunc file_user_user_proto_init() {\n\tif File_user_user_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_user_user_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetUserRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_user_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetUserResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_user_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetUsersRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_user_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetUsersResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_user_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*User); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_user_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Item); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_user_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*User_AttrA); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_user_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*User_AttrB); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_user_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Item_Location); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_user_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Item_Location_AddrA); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_user_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Item_Location_AddrB); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\tfile_user_user_proto_msgTypes[4].OneofWrappers = []interface{}{\n\t\t(*User_AttrA_)(nil),\n\t\t(*User_B)(nil),\n\t}\n\tfile_user_user_proto_msgTypes[9].OneofWrappers = []interface{}{\n\t\t(*Item_Location_AddrA_)(nil),\n\t\t(*Item_Location_B)(nil),\n\t\t(*Item_Location_C)(nil),\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_user_user_proto_rawDesc,\n\t\t\tNumEnums:      1,\n\t\t\tNumMessages:   12,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_user_user_proto_goTypes,\n\t\tDependencyIndexes: file_user_user_proto_depIdxs,\n\t\tEnumInfos:         file_user_user_proto_enumTypes,\n\t\tMessageInfos:      file_user_user_proto_msgTypes,\n\t}.Build()\n\tFile_user_user_proto = out.File\n\tfile_user_user_proto_rawDesc = nil\n\tfile_user_user_proto_goTypes = nil\n\tfile_user_user_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/02_simple/user/user_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: user/user.proto\n\npackage user\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tUserService_GetUser_FullMethodName  = \"/user.UserService/GetUser\"\n\tUserService_GetUsers_FullMethodName = \"/user.UserService/GetUsers\"\n)\n\n// UserServiceClient is the client API for UserService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype UserServiceClient interface {\n\tGetUser(ctx context.Context, in *GetUserRequest, opts ...grpc.CallOption) (*GetUserResponse, error)\n\tGetUsers(ctx context.Context, in *GetUsersRequest, opts ...grpc.CallOption) (*GetUsersResponse, error)\n}\n\ntype userServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewUserServiceClient(cc grpc.ClientConnInterface) UserServiceClient {\n\treturn &userServiceClient{cc}\n}\n\nfunc (c *userServiceClient) GetUser(ctx context.Context, in *GetUserRequest, opts ...grpc.CallOption) (*GetUserResponse, error) {\n\tout := new(GetUserResponse)\n\terr := c.cc.Invoke(ctx, UserService_GetUser_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userServiceClient) GetUsers(ctx context.Context, in *GetUsersRequest, opts ...grpc.CallOption) (*GetUsersResponse, error) {\n\tout := new(GetUsersResponse)\n\terr := c.cc.Invoke(ctx, UserService_GetUsers_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// UserServiceServer is the server API for UserService service.\n// All implementations must embed UnimplementedUserServiceServer\n// for forward compatibility\ntype UserServiceServer interface {\n\tGetUser(context.Context, *GetUserRequest) (*GetUserResponse, error)\n\tGetUsers(context.Context, *GetUsersRequest) (*GetUsersResponse, error)\n\tmustEmbedUnimplementedUserServiceServer()\n}\n\n// UnimplementedUserServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedUserServiceServer struct {\n}\n\nfunc (UnimplementedUserServiceServer) GetUser(context.Context, *GetUserRequest) (*GetUserResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetUser not implemented\")\n}\nfunc (UnimplementedUserServiceServer) GetUsers(context.Context, *GetUsersRequest) (*GetUsersResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetUsers not implemented\")\n}\nfunc (UnimplementedUserServiceServer) mustEmbedUnimplementedUserServiceServer() {}\n\n// UnsafeUserServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to UserServiceServer will\n// result in compilation errors.\ntype UnsafeUserServiceServer interface {\n\tmustEmbedUnimplementedUserServiceServer()\n}\n\nfunc RegisterUserServiceServer(s grpc.ServiceRegistrar, srv UserServiceServer) {\n\ts.RegisterService(&UserService_ServiceDesc, srv)\n}\n\nfunc _UserService_GetUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetUserRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServiceServer).GetUser(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: UserService_GetUser_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServiceServer).GetUser(ctx, req.(*GetUserRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _UserService_GetUsers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetUsersRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServiceServer).GetUsers(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: UserService_GetUsers_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServiceServer).GetUsers(ctx, req.(*GetUsersRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// UserService_ServiceDesc is the grpc.ServiceDesc for UserService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar UserService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"user.UserService\",\n\tHandlerType: (*UserServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetUser\",\n\t\t\tHandler:    _UserService_GetUser_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetUsers\",\n\t\t\tHandler:    _UserService_GetUsers_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"user/user.proto\",\n}\n"
  },
  {
    "path": "_examples/03_custom_resolver/.gitignore",
    "content": "grpc/federation\n"
  },
  {
    "path": "_examples/03_custom_resolver/.vscode/settings.json",
    "content": "{\n    \"protoc\": {\n        \"options\": [\n            \"--proto_path=proto\",\n            \"--proto_path=proto_deps\"\n        ]\n    },\n    \"grpc-federation\": {\n        \"path\": \"../../bin/grpc-federation-language-server\",\n        \"import-paths\": [\n            \"proto\",\n            \"proto_deps\"\n        ]\n    }\n}\n"
  },
  {
    "path": "_examples/03_custom_resolver/Makefile",
    "content": "MAKEFILE_DIR := $(dir $(lastword $(MAKEFILE_LIST)))\nGOBIN := $(MAKEFILE_DIR)/../../bin\nPATH := $(GOBIN):$(PATH)\n\nJAEGER_IMAGE := jaegertracing/all-in-one:latest\n\n.PHONY: generate\ngenerate:\n\t$(GOBIN)/buf generate\n\n.PHONY: lint\nlint:\n\t@$(GOBIN)/grpc-federation-linter -Iproto -Iproto_deps ./proto/federation/federation.proto\n\n.PHONY: test\ntest:\n\tgo test -race ./ -count=1\n\n.PHONY: grpc-federation/generate\ngrpc-federation/generate:\n\t@$(GOBIN)/grpc-federation-generator ./proto/federation/federation.proto\n\n.PHONY: grpc-federation/watch\ngrpc-federation/watch:\n\t@$(GOBIN)/grpc-federation-generator -w\n\n.PHONY: jaeger/start\njaeger/start:\n\t@docker run \\\n\t\t-e COLLECTOR_OTLP_ENABLED=true \\\n\t\t-p 16686:16686 \\\n\t\t-p 4317:4317 \\\n\t\t-p 4318:4318 \\\n\t\t-d \\\n\t\t$(JAEGER_IMAGE)\n\n.PHONY: jaeger/stop\njaeger/stop:\n\t@docker stop $(shell docker ps -q  --filter ancestor=$(JAEGER_IMAGE))\n"
  },
  {
    "path": "_examples/03_custom_resolver/buf.gen.yaml",
    "content": "version: v1\nmanaged:\n  enabled: true\nplugins:\n  - plugin: go\n    out: .\n    opt: paths=source_relative\n  - plugin: go-grpc\n    out: .\n    opt: paths=source_relative\n  - plugin: grpc-federation\n    out: .\n    opt:\n    - paths=source_relative\n    - import_paths=proto\n"
  },
  {
    "path": "_examples/03_custom_resolver/buf.work.yaml",
    "content": "version: v1\ndirectories:\n  - proto\n  - proto_deps\n"
  },
  {
    "path": "_examples/03_custom_resolver/federation/federation.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tdurationpb \"google.golang.org/protobuf/types/known/durationpb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype PostV2DevType int32\n\nconst (\n\tPostV2DevType_POST_V2_DEV_TYPE PostV2DevType = 0\n)\n\n// Enum value maps for PostV2DevType.\nvar (\n\tPostV2DevType_name = map[int32]string{\n\t\t0: \"POST_V2_DEV_TYPE\",\n\t}\n\tPostV2DevType_value = map[string]int32{\n\t\t\"POST_V2_DEV_TYPE\": 0,\n\t}\n)\n\nfunc (x PostV2DevType) Enum() *PostV2DevType {\n\tp := new(PostV2DevType)\n\t*p = x\n\treturn p\n}\n\nfunc (x PostV2DevType) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (PostV2DevType) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_federation_federation_proto_enumTypes[0].Descriptor()\n}\n\nfunc (PostV2DevType) Type() protoreflect.EnumType {\n\treturn &file_federation_federation_proto_enumTypes[0]\n}\n\nfunc (x PostV2DevType) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use PostV2DevType.Descriptor instead.\nfunc (PostV2DevType) EnumDescriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\ntype GetPostV2DevRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetPostV2DevRequest) Reset() {\n\t*x = GetPostV2DevRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostV2DevRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostV2DevRequest) ProtoMessage() {}\n\nfunc (x *GetPostV2DevRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostV2DevRequest.ProtoReflect.Descriptor instead.\nfunc (*GetPostV2DevRequest) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetPostV2DevRequest) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\ntype GetPostV2DevResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPost      *PostV2Dev           `protobuf:\"bytes,1,opt,name=post,proto3\" json:\"post,omitempty\"`\n\tType      PostV2DevType        `protobuf:\"varint,2,opt,name=type,proto3,enum=federation.v2dev.PostV2DevType\" json:\"type,omitempty\"`\n\tEnvA      string               `protobuf:\"bytes,3,opt,name=env_a,json=envA,proto3\" json:\"env_a,omitempty\"`\n\tEnvB      int64                `protobuf:\"varint,4,opt,name=env_b,json=envB,proto3\" json:\"env_b,omitempty\"`\n\tEnvCValue *durationpb.Duration `protobuf:\"bytes,5,opt,name=env_c_value,json=envCValue,proto3\" json:\"env_c_value,omitempty\"`\n\tRef       *Ref                 `protobuf:\"bytes,6,opt,name=ref,proto3\" json:\"ref,omitempty\"`\n}\n\nfunc (x *GetPostV2DevResponse) Reset() {\n\t*x = GetPostV2DevResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostV2DevResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostV2DevResponse) ProtoMessage() {}\n\nfunc (x *GetPostV2DevResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostV2DevResponse.ProtoReflect.Descriptor instead.\nfunc (*GetPostV2DevResponse) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetPostV2DevResponse) GetPost() *PostV2Dev {\n\tif x != nil {\n\t\treturn x.Post\n\t}\n\treturn nil\n}\n\nfunc (x *GetPostV2DevResponse) GetType() PostV2DevType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn PostV2DevType_POST_V2_DEV_TYPE\n}\n\nfunc (x *GetPostV2DevResponse) GetEnvA() string {\n\tif x != nil {\n\t\treturn x.EnvA\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetPostV2DevResponse) GetEnvB() int64 {\n\tif x != nil {\n\t\treturn x.EnvB\n\t}\n\treturn 0\n}\n\nfunc (x *GetPostV2DevResponse) GetEnvCValue() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.EnvCValue\n\t}\n\treturn nil\n}\n\nfunc (x *GetPostV2DevResponse) GetRef() *Ref {\n\tif x != nil {\n\t\treturn x.Ref\n\t}\n\treturn nil\n}\n\ntype PostV2Dev struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId        string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tTitle     string `protobuf:\"bytes,2,opt,name=title,proto3\" json:\"title,omitempty\"`\n\tContent   string `protobuf:\"bytes,3,opt,name=content,proto3\" json:\"content,omitempty\"`\n\tUser      *User  `protobuf:\"bytes,4,opt,name=user,proto3\" json:\"user,omitempty\"`\n\tNullCheck bool   `protobuf:\"varint,5,opt,name=null_check,json=nullCheck,proto3\" json:\"null_check,omitempty\"`\n}\n\nfunc (x *PostV2Dev) Reset() {\n\t*x = PostV2Dev{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *PostV2Dev) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*PostV2Dev) ProtoMessage() {}\n\nfunc (x *PostV2Dev) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use PostV2Dev.ProtoReflect.Descriptor instead.\nfunc (*PostV2Dev) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *PostV2Dev) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *PostV2Dev) GetTitle() string {\n\tif x != nil {\n\t\treturn x.Title\n\t}\n\treturn \"\"\n}\n\nfunc (x *PostV2Dev) GetContent() string {\n\tif x != nil {\n\t\treturn x.Content\n\t}\n\treturn \"\"\n}\n\nfunc (x *PostV2Dev) GetUser() *User {\n\tif x != nil {\n\t\treturn x.User\n\t}\n\treturn nil\n}\n\nfunc (x *PostV2Dev) GetNullCheck() bool {\n\tif x != nil {\n\t\treturn x.NullCheck\n\t}\n\treturn false\n}\n\ntype User struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId   string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *User) Reset() {\n\t*x = User{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *User) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*User) ProtoMessage() {}\n\nfunc (x *User) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use User.ProtoReflect.Descriptor instead.\nfunc (*User) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *User) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *User) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\ntype Unused struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tFoo string `protobuf:\"bytes,1,opt,name=foo,proto3\" json:\"foo,omitempty\"`\n}\n\nfunc (x *Unused) Reset() {\n\t*x = Unused{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Unused) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Unused) ProtoMessage() {}\n\nfunc (x *Unused) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Unused.ProtoReflect.Descriptor instead.\nfunc (*Unused) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *Unused) GetFoo() string {\n\tif x != nil {\n\t\treturn x.Foo\n\t}\n\treturn \"\"\n}\n\ntype ForNameless struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tBar string `protobuf:\"bytes,1,opt,name=bar,proto3\" json:\"bar,omitempty\"`\n}\n\nfunc (x *ForNameless) Reset() {\n\t*x = ForNameless{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ForNameless) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ForNameless) ProtoMessage() {}\n\nfunc (x *ForNameless) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ForNameless.ProtoReflect.Descriptor instead.\nfunc (*ForNameless) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *ForNameless) GetBar() string {\n\tif x != nil {\n\t\treturn x.Bar\n\t}\n\treturn \"\"\n}\n\ntype TypedNil struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *TypedNil) Reset() {\n\t*x = TypedNil{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *TypedNil) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*TypedNil) ProtoMessage() {}\n\nfunc (x *TypedNil) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use TypedNil.ProtoReflect.Descriptor instead.\nfunc (*TypedNil) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{6}\n}\n\nvar File_federation_federation_proto protoreflect.FileDescriptor\n\nvar file_federation_federation_proto_rawDesc = []byte{\n\t0x0a, 0x1b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x64, 0x65, 0x76, 0x1a,\n\t0x20, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,\n\t0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x1a, 0x16, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6f, 0x74,\n\t0x68, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x25, 0x0a, 0x13, 0x47, 0x65, 0x74,\n\t0x50, 0x6f, 0x73, 0x74, 0x56, 0x32, 0x64, 0x65, 0x76, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64,\n\t0x22, 0xd9, 0x03, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x56, 0x32, 0x64, 0x65,\n\t0x76, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x04, 0x70, 0x6f, 0x73,\n\t0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x64, 0x65, 0x76, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x56,\n\t0x32, 0x64, 0x65, 0x76, 0x42, 0x09, 0x9a, 0x4a, 0x06, 0x12, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x52,\n\t0x04, 0x70, 0x6f, 0x73, 0x74, 0x12, 0x61, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x76, 0x32, 0x64, 0x65, 0x76, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x56, 0x32, 0x64, 0x65, 0x76,\n\t0x54, 0x79, 0x70, 0x65, 0x42, 0x2c, 0x9a, 0x4a, 0x29, 0x12, 0x27, 0x50, 0x6f, 0x73, 0x74, 0x56,\n\t0x32, 0x64, 0x65, 0x76, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x27,\n\t0x50, 0x4f, 0x53, 0x54, 0x5f, 0x56, 0x32, 0x5f, 0x44, 0x45, 0x56, 0x5f, 0x54, 0x59, 0x50, 0x45,\n\t0x27, 0x29, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2f, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x5f,\n\t0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1a, 0x9a, 0x4a, 0x17, 0x12, 0x15, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x65, 0x6e,\n\t0x76, 0x2e, 0x61, 0x52, 0x04, 0x65, 0x6e, 0x76, 0x41, 0x12, 0x32, 0x0a, 0x05, 0x65, 0x6e, 0x76,\n\t0x5f, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x42, 0x1d, 0x9a, 0x4a, 0x1a, 0x12, 0x18, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x65,\n\t0x6e, 0x76, 0x2e, 0x62, 0x5b, 0x31, 0x5d, 0x52, 0x04, 0x65, 0x6e, 0x76, 0x42, 0x12, 0x5a, 0x0a,\n\t0x0b, 0x65, 0x6e, 0x76, 0x5f, 0x63, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x1f, 0x9a,\n\t0x4a, 0x1c, 0x12, 0x1a, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x65, 0x6e, 0x76, 0x2e, 0x63, 0x5b, 0x27, 0x7a, 0x27, 0x5d, 0x52, 0x09,\n\t0x65, 0x6e, 0x76, 0x43, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2f, 0x0a, 0x03, 0x72, 0x65, 0x66,\n\t0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x64, 0x65, 0x76, 0x2e, 0x52, 0x65, 0x66, 0x42, 0x06, 0x9a,\n\t0x4a, 0x03, 0x12, 0x01, 0x72, 0x52, 0x03, 0x72, 0x65, 0x66, 0x3a, 0x30, 0x9a, 0x4a, 0x2d, 0x0a,\n\t0x1f, 0x0a, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x6a, 0x17, 0x0a, 0x09, 0x50, 0x6f, 0x73, 0x74, 0x56,\n\t0x32, 0x64, 0x65, 0x76, 0x12, 0x0a, 0x0a, 0x02, 0x69, 0x64, 0x12, 0x04, 0x24, 0x2e, 0x69, 0x64,\n\t0x0a, 0x0a, 0x0a, 0x01, 0x72, 0x6a, 0x05, 0x0a, 0x03, 0x52, 0x65, 0x66, 0x22, 0xf3, 0x03, 0x0a,\n\t0x09, 0x50, 0x6f, 0x73, 0x74, 0x56, 0x32, 0x64, 0x65, 0x76, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69,\n\t0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65,\n\t0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x31, 0x0a, 0x04, 0x75, 0x73,\n\t0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x64, 0x65, 0x76, 0x2e, 0x55, 0x73, 0x65, 0x72,\n\t0x42, 0x05, 0x9a, 0x4a, 0x02, 0x08, 0x01, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x2e, 0x0a,\n\t0x0a, 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28,\n\t0x08, 0x42, 0x0f, 0x9a, 0x4a, 0x0c, 0x12, 0x0a, 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x63, 0x68, 0x65,\n\t0x63, 0x6b, 0x52, 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x3a, 0xc2, 0x02,\n\t0x9a, 0x4a, 0xbe, 0x02, 0x0a, 0x2d, 0x0a, 0x03, 0x72, 0x65, 0x73, 0x72, 0x26, 0x0a, 0x18, 0x70,\n\t0x6f, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f,\n\t0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x12, 0x0a, 0x0a, 0x02, 0x69, 0x64, 0x12, 0x04, 0x24,\n\t0x2e, 0x69, 0x64, 0x0a, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x5a, 0x08, 0x72,\n\t0x65, 0x73, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x0a, 0x16, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x6a,\n\t0x0e, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x06, 0x1a, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x0a,\n\t0x20, 0x0a, 0x06, 0x75, 0x6e, 0x75, 0x73, 0x65, 0x64, 0x6a, 0x16, 0x0a, 0x06, 0x55, 0x6e, 0x75,\n\t0x73, 0x65, 0x64, 0x12, 0x0c, 0x0a, 0x03, 0x66, 0x6f, 0x6f, 0x12, 0x05, 0x27, 0x66, 0x6f, 0x6f,\n\t0x27, 0x0a, 0x1d, 0x6a, 0x1b, 0x0a, 0x0b, 0x46, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x6c, 0x65,\n\t0x73, 0x73, 0x12, 0x0c, 0x0a, 0x03, 0x62, 0x61, 0x72, 0x12, 0x05, 0x27, 0x62, 0x61, 0x72, 0x27,\n\t0x0a, 0x17, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x6e, 0x69, 0x6c, 0x6a, 0x0a, 0x0a,\n\t0x08, 0x54, 0x79, 0x70, 0x65, 0x64, 0x4e, 0x69, 0x6c, 0x0a, 0x25, 0x0a, 0x0a, 0x6e, 0x75, 0x6c,\n\t0x6c, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x11, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x6e,\n\t0x69, 0x6c, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x5a, 0x04, 0x74, 0x72, 0x75, 0x65,\n\t0x0a, 0x60, 0x12, 0x11, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x6e, 0x69, 0x6c, 0x20, 0x3d, 0x3d,\n\t0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x5a, 0x4b, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6c, 0x6f, 0x67, 0x2e, 0x69, 0x6e, 0x66, 0x6f, 0x28,\n\t0x27, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x6e, 0x69,\n\t0x6c, 0x27, 0x2c, 0x20, 0x7b, 0x27, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x27, 0x3a, 0x20, 0x74,\n\t0x79, 0x70, 0x65, 0x64, 0x5f, 0x6e, 0x69, 0x6c, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x75, 0x6c, 0x6c,\n\t0x7d, 0x29, 0x22, 0x7b, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x05, 0x9a, 0x4a, 0x02, 0x08, 0x01, 0x52,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x48, 0x9a, 0x4a, 0x45, 0x0a, 0x32, 0x0a, 0x03, 0x72, 0x65,\n\t0x73, 0x72, 0x2b, 0x0a, 0x18, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65,\n\t0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x0f, 0x0a,\n\t0x02, 0x69, 0x64, 0x12, 0x09, 0x24, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x0a, 0x0d,\n\t0x0a, 0x01, 0x75, 0x5a, 0x08, 0x72, 0x65, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x10, 0x01, 0x22,\n\t0x21, 0x0a, 0x06, 0x55, 0x6e, 0x75, 0x73, 0x65, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x66, 0x6f, 0x6f,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x66, 0x6f, 0x6f, 0x3a, 0x05, 0x9a, 0x4a, 0x02,\n\t0x10, 0x01, 0x22, 0x26, 0x0a, 0x0b, 0x46, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x6c, 0x65, 0x73,\n\t0x73, 0x12, 0x10, 0x0a, 0x03, 0x62, 0x61, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03,\n\t0x62, 0x61, 0x72, 0x3a, 0x05, 0x9a, 0x4a, 0x02, 0x10, 0x01, 0x22, 0x11, 0x0a, 0x08, 0x54, 0x79,\n\t0x70, 0x65, 0x64, 0x4e, 0x69, 0x6c, 0x3a, 0x05, 0x9a, 0x4a, 0x02, 0x10, 0x01, 0x2a, 0x25, 0x0a,\n\t0x0d, 0x50, 0x6f, 0x73, 0x74, 0x56, 0x32, 0x64, 0x65, 0x76, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14,\n\t0x0a, 0x10, 0x50, 0x4f, 0x53, 0x54, 0x5f, 0x56, 0x32, 0x5f, 0x44, 0x45, 0x56, 0x5f, 0x54, 0x59,\n\t0x50, 0x45, 0x10, 0x00, 0x32, 0xeb, 0x01, 0x0a, 0x16, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x56, 0x32, 0x64, 0x65, 0x76, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12,\n\t0x5f, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x56, 0x32, 0x64, 0x65, 0x76, 0x12,\n\t0x25, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x64,\n\t0x65, 0x76, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x56, 0x32, 0x64, 0x65, 0x76, 0x52,\n\t0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x64, 0x65, 0x76, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73,\n\t0x74, 0x56, 0x32, 0x64, 0x65, 0x76, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00,\n\t0x1a, 0x70, 0x9a, 0x4a, 0x6d, 0x0a, 0x49, 0x0a, 0x0e, 0x0a, 0x01, 0x61, 0x12, 0x02, 0x08, 0x01,\n\t0x1a, 0x05, 0x12, 0x03, 0x78, 0x78, 0x78, 0x0a, 0x10, 0x0a, 0x01, 0x62, 0x12, 0x04, 0x12, 0x02,\n\t0x08, 0x03, 0x1a, 0x05, 0x0a, 0x03, 0x79, 0x79, 0x79, 0x0a, 0x18, 0x0a, 0x01, 0x63, 0x12, 0x0a,\n\t0x1a, 0x08, 0x0a, 0x02, 0x08, 0x01, 0x12, 0x02, 0x08, 0x06, 0x1a, 0x07, 0x0a, 0x03, 0x7a, 0x7a,\n\t0x7a, 0x18, 0x01, 0x0a, 0x0b, 0x0a, 0x01, 0x64, 0x12, 0x02, 0x08, 0x05, 0x1a, 0x02, 0x20, 0x01,\n\t0x12, 0x20, 0x0a, 0x1b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a,\n\t0x01, 0x31, 0x42, 0xcc, 0x01, 0x9a, 0x4a, 0x22, 0x12, 0x0f, 0x70, 0x6f, 0x73, 0x74, 0x2f, 0x70,\n\t0x6f, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x75, 0x73, 0x65, 0x72, 0x2f,\n\t0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x64, 0x65, 0x76,\n\t0x42, 0x0f, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74,\n\t0x6f, 0x50, 0x01, 0x5a, 0x1d, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0xa2, 0x02, 0x03, 0x46, 0x56, 0x58, 0xaa, 0x02, 0x10, 0x46, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x32, 0x64, 0x65, 0x76, 0xca, 0x02, 0x10, 0x46, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x56, 0x32, 0x64, 0x65, 0x76, 0xe2, 0x02,\n\t0x1c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x56, 0x32, 0x64, 0x65,\n\t0x76, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x11,\n\t0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x3a, 0x56, 0x32, 0x64, 0x65,\n\t0x76, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_federation_federation_proto_rawDescOnce sync.Once\n\tfile_federation_federation_proto_rawDescData = file_federation_federation_proto_rawDesc\n)\n\nfunc file_federation_federation_proto_rawDescGZIP() []byte {\n\tfile_federation_federation_proto_rawDescOnce.Do(func() {\n\t\tfile_federation_federation_proto_rawDescData = protoimpl.X.CompressGZIP(file_federation_federation_proto_rawDescData)\n\t})\n\treturn file_federation_federation_proto_rawDescData\n}\n\nvar file_federation_federation_proto_enumTypes = make([]protoimpl.EnumInfo, 1)\nvar file_federation_federation_proto_msgTypes = make([]protoimpl.MessageInfo, 7)\nvar file_federation_federation_proto_goTypes = []interface{}{\n\t(PostV2DevType)(0),           // 0: federation.v2dev.PostV2devType\n\t(*GetPostV2DevRequest)(nil),  // 1: federation.v2dev.GetPostV2devRequest\n\t(*GetPostV2DevResponse)(nil), // 2: federation.v2dev.GetPostV2devResponse\n\t(*PostV2Dev)(nil),            // 3: federation.v2dev.PostV2dev\n\t(*User)(nil),                 // 4: federation.v2dev.User\n\t(*Unused)(nil),               // 5: federation.v2dev.Unused\n\t(*ForNameless)(nil),          // 6: federation.v2dev.ForNameless\n\t(*TypedNil)(nil),             // 7: federation.v2dev.TypedNil\n\t(*durationpb.Duration)(nil),  // 8: google.protobuf.Duration\n\t(*Ref)(nil),                  // 9: federation.v2dev.Ref\n}\nvar file_federation_federation_proto_depIdxs = []int32{\n\t3, // 0: federation.v2dev.GetPostV2devResponse.post:type_name -> federation.v2dev.PostV2dev\n\t0, // 1: federation.v2dev.GetPostV2devResponse.type:type_name -> federation.v2dev.PostV2devType\n\t8, // 2: federation.v2dev.GetPostV2devResponse.env_c_value:type_name -> google.protobuf.Duration\n\t9, // 3: federation.v2dev.GetPostV2devResponse.ref:type_name -> federation.v2dev.Ref\n\t4, // 4: federation.v2dev.PostV2dev.user:type_name -> federation.v2dev.User\n\t1, // 5: federation.v2dev.FederationV2devService.GetPostV2dev:input_type -> federation.v2dev.GetPostV2devRequest\n\t2, // 6: federation.v2dev.FederationV2devService.GetPostV2dev:output_type -> federation.v2dev.GetPostV2devResponse\n\t6, // [6:7] is the sub-list for method output_type\n\t5, // [5:6] is the sub-list for method input_type\n\t5, // [5:5] is the sub-list for extension type_name\n\t5, // [5:5] is the sub-list for extension extendee\n\t0, // [0:5] is the sub-list for field type_name\n}\n\nfunc init() { file_federation_federation_proto_init() }\nfunc file_federation_federation_proto_init() {\n\tif File_federation_federation_proto != nil {\n\t\treturn\n\t}\n\tfile_federation_other_proto_init()\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_federation_federation_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostV2DevRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostV2DevResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*PostV2Dev); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*User); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Unused); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ForNameless); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*TypedNil); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_federation_federation_proto_rawDesc,\n\t\t\tNumEnums:      1,\n\t\t\tNumMessages:   7,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_federation_federation_proto_goTypes,\n\t\tDependencyIndexes: file_federation_federation_proto_depIdxs,\n\t\tEnumInfos:         file_federation_federation_proto_enumTypes,\n\t\tMessageInfos:      file_federation_federation_proto_msgTypes,\n\t}.Build()\n\tFile_federation_federation_proto = out.File\n\tfile_federation_federation_proto_rawDesc = nil\n\tfile_federation_federation_proto_goTypes = nil\n\tfile_federation_federation_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/03_custom_resolver/federation/federation_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tFederationV2DevService_GetPostV2Dev_FullMethodName = \"/federation.v2dev.FederationV2devService/GetPostV2dev\"\n)\n\n// FederationV2DevServiceClient is the client API for FederationV2DevService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype FederationV2DevServiceClient interface {\n\tGetPostV2Dev(ctx context.Context, in *GetPostV2DevRequest, opts ...grpc.CallOption) (*GetPostV2DevResponse, error)\n}\n\ntype federationV2DevServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewFederationV2DevServiceClient(cc grpc.ClientConnInterface) FederationV2DevServiceClient {\n\treturn &federationV2DevServiceClient{cc}\n}\n\nfunc (c *federationV2DevServiceClient) GetPostV2Dev(ctx context.Context, in *GetPostV2DevRequest, opts ...grpc.CallOption) (*GetPostV2DevResponse, error) {\n\tout := new(GetPostV2DevResponse)\n\terr := c.cc.Invoke(ctx, FederationV2DevService_GetPostV2Dev_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// FederationV2DevServiceServer is the server API for FederationV2DevService service.\n// All implementations must embed UnimplementedFederationV2DevServiceServer\n// for forward compatibility\ntype FederationV2DevServiceServer interface {\n\tGetPostV2Dev(context.Context, *GetPostV2DevRequest) (*GetPostV2DevResponse, error)\n\tmustEmbedUnimplementedFederationV2DevServiceServer()\n}\n\n// UnimplementedFederationV2DevServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedFederationV2DevServiceServer struct {\n}\n\nfunc (UnimplementedFederationV2DevServiceServer) GetPostV2Dev(context.Context, *GetPostV2DevRequest) (*GetPostV2DevResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetPostV2Dev not implemented\")\n}\nfunc (UnimplementedFederationV2DevServiceServer) mustEmbedUnimplementedFederationV2DevServiceServer() {\n}\n\n// UnsafeFederationV2DevServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to FederationV2DevServiceServer will\n// result in compilation errors.\ntype UnsafeFederationV2DevServiceServer interface {\n\tmustEmbedUnimplementedFederationV2DevServiceServer()\n}\n\nfunc RegisterFederationV2DevServiceServer(s grpc.ServiceRegistrar, srv FederationV2DevServiceServer) {\n\ts.RegisterService(&FederationV2DevService_ServiceDesc, srv)\n}\n\nfunc _FederationV2DevService_GetPostV2Dev_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetPostV2DevRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(FederationV2DevServiceServer).GetPostV2Dev(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: FederationV2DevService_GetPostV2Dev_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(FederationV2DevServiceServer).GetPostV2Dev(ctx, req.(*GetPostV2DevRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// FederationV2DevService_ServiceDesc is the grpc.ServiceDesc for FederationV2DevService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar FederationV2DevService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"federation.v2dev.FederationV2devService\",\n\tHandlerType: (*FederationV2DevServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetPostV2dev\",\n\t\t\tHandler:    _FederationV2DevService_GetPostV2Dev_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"federation/federation.proto\",\n}\n"
  },
  {
    "path": "_examples/03_custom_resolver/federation/federation_grpc_federation.pb.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: federation/federation.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n\t\"google.golang.org/protobuf/types/known/durationpb\"\n\n\tpost \"example/post\"\n\tuser \"example/user\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Federation_V2Dev_ForNamelessVariable represents variable definitions in \"federation.v2dev.ForNameless\".\ntype FederationV2DevService_Federation_V2Dev_ForNamelessVariable struct {\n}\n\n// Federation_V2Dev_ForNamelessArgument is argument for \"federation.v2dev.ForNameless\" message.\ntype FederationV2DevService_Federation_V2Dev_ForNamelessArgument struct {\n\tBar string\n\tFederationV2DevService_Federation_V2Dev_ForNamelessVariable\n}\n\n// Federation_V2Dev_GetPostV2DevResponseVariable represents variable definitions in \"federation.v2dev.GetPostV2devResponse\".\ntype FederationV2DevService_Federation_V2Dev_GetPostV2DevResponseVariable struct {\n\tPost *PostV2Dev\n\tR    *Ref\n}\n\n// Federation_V2Dev_GetPostV2DevResponseArgument is argument for \"federation.v2dev.GetPostV2devResponse\" message.\ntype FederationV2DevService_Federation_V2Dev_GetPostV2DevResponseArgument struct {\n\tId string\n\tFederationV2DevService_Federation_V2Dev_GetPostV2DevResponseVariable\n}\n\n// Federation_V2Dev_PostV2DevVariable represents variable definitions in \"federation.v2dev.PostV2dev\".\ntype FederationV2DevService_Federation_V2Dev_PostV2DevVariable struct {\n\tNullCheck bool\n\tPost      *post.Post\n\tRes       *post.GetPostResponse\n\tTypedNil  *TypedNil\n\tUnused    *Unused\n\tUser      *User\n\tXDef4     *ForNameless\n\tXDef7     bool\n}\n\n// Federation_V2Dev_PostV2DevArgument is argument for \"federation.v2dev.PostV2dev\" message.\ntype FederationV2DevService_Federation_V2Dev_PostV2DevArgument struct {\n\tId string\n\tFederationV2DevService_Federation_V2Dev_PostV2DevVariable\n}\n\n// Federation_V2Dev_PostV2Dev_UserArgument is custom resolver's argument for \"user\" field of \"federation.v2dev.PostV2dev\" message.\ntype FederationV2DevService_Federation_V2Dev_PostV2Dev_UserArgument struct {\n\t*FederationV2DevService_Federation_V2Dev_PostV2DevArgument\n}\n\n// Federation_V2Dev_RefVariable represents variable definitions in \"federation.v2dev.Ref\".\ntype FederationV2DevService_Federation_V2Dev_RefVariable struct {\n}\n\n// Federation_V2Dev_RefArgument is argument for \"federation.v2dev.Ref\" message.\ntype FederationV2DevService_Federation_V2Dev_RefArgument struct {\n\tFederationV2DevService_Federation_V2Dev_RefVariable\n}\n\n// Federation_V2Dev_TypedNilVariable represents variable definitions in \"federation.v2dev.TypedNil\".\ntype FederationV2DevService_Federation_V2Dev_TypedNilVariable struct {\n}\n\n// Federation_V2Dev_TypedNilArgument is argument for \"federation.v2dev.TypedNil\" message.\ntype FederationV2DevService_Federation_V2Dev_TypedNilArgument struct {\n\tFederationV2DevService_Federation_V2Dev_TypedNilVariable\n}\n\n// Federation_V2Dev_UnusedVariable represents variable definitions in \"federation.v2dev.Unused\".\ntype FederationV2DevService_Federation_V2Dev_UnusedVariable struct {\n}\n\n// Federation_V2Dev_UnusedArgument is argument for \"federation.v2dev.Unused\" message.\ntype FederationV2DevService_Federation_V2Dev_UnusedArgument struct {\n\tFoo string\n\tFederationV2DevService_Federation_V2Dev_UnusedVariable\n}\n\n// Federation_V2Dev_UserVariable represents variable definitions in \"federation.v2dev.User\".\ntype FederationV2DevService_Federation_V2Dev_UserVariable struct {\n\tRes *user.GetUserResponse\n\tU   *user.User\n}\n\n// Federation_V2Dev_UserArgument is argument for \"federation.v2dev.User\" message.\ntype FederationV2DevService_Federation_V2Dev_UserArgument struct {\n\tContent string\n\tId      string\n\tTitle   string\n\tUserId  string\n\tFederationV2DevService_Federation_V2Dev_UserVariable\n}\n\n// Federation_V2Dev_User_NameArgument is custom resolver's argument for \"name\" field of \"federation.v2dev.User\" message.\ntype FederationV2DevService_Federation_V2Dev_User_NameArgument struct {\n\t*FederationV2DevService_Federation_V2Dev_UserArgument\n\tFederation_V2Dev_User *User\n}\n\n// FederationV2DevServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationV2DevServiceConfig struct {\n\t// Client provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\n\t// If this interface is not provided, an error is returned during initialization.\n\tClient FederationV2DevServiceClientFactory // required\n\t// Resolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\n\t// If this interface is not provided, an error is returned during initialization.\n\tResolver FederationV2DevServiceResolver // required\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationV2DevServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationV2DevServiceClientFactory interface {\n\t// Post_PostServiceClient create a gRPC Client to be used to call methods in post.PostService.\n\tPost_PostServiceClient(FederationV2DevServiceClientConfig) (post.PostServiceClient, error)\n\t// User_UserServiceClient create a gRPC Client to be used to call methods in user.UserService.\n\tUser_UserServiceClient(FederationV2DevServiceClientConfig) (user.UserServiceClient, error)\n}\n\n// FederationV2DevServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationV2DevServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationV2DevServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationV2DevServiceDependentClientSet struct {\n\tPost_PostServiceClient post.PostServiceClient\n\tUser_UserServiceClient user.UserServiceClient\n}\n\n// FederationV2DevServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationV2DevServiceResolver interface {\n\t// Resolve_Federation_V2Dev_ForNameless implements resolver for \"federation.v2dev.ForNameless\".\n\tResolve_Federation_V2Dev_ForNameless(context.Context, *FederationV2DevService_Federation_V2Dev_ForNamelessArgument) (*ForNameless, error)\n\t// Resolve_Federation_V2Dev_PostV2Dev_User implements resolver for \"federation.v2dev.PostV2dev.user\".\n\tResolve_Federation_V2Dev_PostV2Dev_User(context.Context, *FederationV2DevService_Federation_V2Dev_PostV2Dev_UserArgument) (*User, error)\n\t// Resolve_Federation_V2Dev_TypedNil implements resolver for \"federation.v2dev.TypedNil\".\n\tResolve_Federation_V2Dev_TypedNil(context.Context, *FederationV2DevService_Federation_V2Dev_TypedNilArgument) (*TypedNil, error)\n\t// Resolve_Federation_V2Dev_Unused implements resolver for \"federation.v2dev.Unused\".\n\tResolve_Federation_V2Dev_Unused(context.Context, *FederationV2DevService_Federation_V2Dev_UnusedArgument) (*Unused, error)\n\t// Resolve_Federation_V2Dev_User implements resolver for \"federation.v2dev.User\".\n\tResolve_Federation_V2Dev_User(context.Context, *FederationV2DevService_Federation_V2Dev_UserArgument) (*User, error)\n\t// Resolve_Federation_V2Dev_User_Name implements resolver for \"federation.v2dev.User.name\".\n\tResolve_Federation_V2Dev_User_Name(context.Context, *FederationV2DevService_Federation_V2Dev_User_NameArgument) (string, error)\n}\n\n// FederationV2DevServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationV2DevServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationV2DevServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationV2DevServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// FederationV2DevServiceEnv keeps the values read from environment variables.\ntype FederationV2DevServiceEnv struct {\n\tA string                      `envconfig:\"A\" default:\"xxx\"`\n\tB []int64                     `envconfig:\"yyy\"`\n\tC map[string]grpcfed.Duration `envconfig:\"zzz\" required:\"true\"`\n\tD float64                     `envconfig:\"D\" ignored:\"true\"`\n}\n\ntype keyFederationV2DevServiceEnv struct{}\n\n// GetFederationV2DevServiceEnv gets environment variables.\nfunc GetFederationV2DevServiceEnv(ctx context.Context) *FederationV2DevServiceEnv {\n\tvalue := ctx.Value(keyFederationV2DevServiceEnv{})\n\tif value == nil {\n\t\treturn nil\n\t}\n\treturn value.(*FederationV2DevServiceEnv)\n}\n\nfunc withFederationV2DevServiceEnv(ctx context.Context, env *FederationV2DevServiceEnv) context.Context {\n\treturn context.WithValue(ctx, keyFederationV2DevServiceEnv{}, env)\n}\n\n// FederationV2DevServiceVariable keeps the initial values.\ntype FederationV2DevServiceVariable struct {\n\tFederationServiceVariable int64\n}\n\ntype keyFederationV2DevServiceVariable struct{}\n\n// GetFederationV2DevServiceVariable gets initial variables.\nfunc GetFederationV2DevServiceVariable(ctx context.Context) *FederationV2DevServiceVariable {\n\tvalue := ctx.Value(keyFederationV2DevServiceVariable{})\n\tif value == nil {\n\t\treturn nil\n\t}\n\treturn value.(*FederationV2DevServiceVariable)\n}\n\nfunc withFederationV2DevServiceVariable(ctx context.Context, svcVar *FederationV2DevServiceVariable) context.Context {\n\treturn context.WithValue(ctx, keyFederationV2DevServiceVariable{}, svcVar)\n}\n\n// FederationV2DevServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationV2DevServiceUnimplementedResolver struct{}\n\n// Resolve_Federation_V2Dev_ForNameless resolve \"federation.v2dev.ForNameless\".\n// This method always returns Unimplemented error.\nfunc (FederationV2DevServiceUnimplementedResolver) Resolve_Federation_V2Dev_ForNameless(context.Context, *FederationV2DevService_Federation_V2Dev_ForNamelessArgument) (ret *ForNameless, e error) {\n\te = grpcfed.GRPCErrorf(grpcfed.UnimplementedCode, \"method Resolve_Federation_V2Dev_ForNameless not implemented\")\n\treturn\n}\n\n// Resolve_Federation_V2Dev_PostV2Dev_User resolve \"federation.v2dev.PostV2dev.user\".\n// This method always returns Unimplemented error.\nfunc (FederationV2DevServiceUnimplementedResolver) Resolve_Federation_V2Dev_PostV2Dev_User(context.Context, *FederationV2DevService_Federation_V2Dev_PostV2Dev_UserArgument) (ret *User, e error) {\n\te = grpcfed.GRPCErrorf(grpcfed.UnimplementedCode, \"method Resolve_Federation_V2Dev_PostV2Dev_User not implemented\")\n\treturn\n}\n\n// Resolve_Federation_V2Dev_TypedNil resolve \"federation.v2dev.TypedNil\".\n// This method always returns Unimplemented error.\nfunc (FederationV2DevServiceUnimplementedResolver) Resolve_Federation_V2Dev_TypedNil(context.Context, *FederationV2DevService_Federation_V2Dev_TypedNilArgument) (ret *TypedNil, e error) {\n\te = grpcfed.GRPCErrorf(grpcfed.UnimplementedCode, \"method Resolve_Federation_V2Dev_TypedNil not implemented\")\n\treturn\n}\n\n// Resolve_Federation_V2Dev_Unused resolve \"federation.v2dev.Unused\".\n// This method always returns Unimplemented error.\nfunc (FederationV2DevServiceUnimplementedResolver) Resolve_Federation_V2Dev_Unused(context.Context, *FederationV2DevService_Federation_V2Dev_UnusedArgument) (ret *Unused, e error) {\n\te = grpcfed.GRPCErrorf(grpcfed.UnimplementedCode, \"method Resolve_Federation_V2Dev_Unused not implemented\")\n\treturn\n}\n\n// Resolve_Federation_V2Dev_User resolve \"federation.v2dev.User\".\n// This method always returns Unimplemented error.\nfunc (FederationV2DevServiceUnimplementedResolver) Resolve_Federation_V2Dev_User(context.Context, *FederationV2DevService_Federation_V2Dev_UserArgument) (ret *User, e error) {\n\te = grpcfed.GRPCErrorf(grpcfed.UnimplementedCode, \"method Resolve_Federation_V2Dev_User not implemented\")\n\treturn\n}\n\n// Resolve_Federation_V2Dev_User_Name resolve \"federation.v2dev.User.name\".\n// This method always returns Unimplemented error.\nfunc (FederationV2DevServiceUnimplementedResolver) Resolve_Federation_V2Dev_User_Name(context.Context, *FederationV2DevService_Federation_V2Dev_User_NameArgument) (ret string, e error) {\n\te = grpcfed.GRPCErrorf(grpcfed.UnimplementedCode, \"method Resolve_Federation_V2Dev_User_Name not implemented\")\n\treturn\n}\n\nconst (\n\tFederationV2DevService_DependentMethod_Post_PostService_GetPost = \"/post.PostService/GetPost\"\n\tFederationV2DevService_DependentMethod_User_UserService_GetUser = \"/user.UserService/GetUser\"\n)\n\n// FederationV2DevService represents Federation Service.\ntype FederationV2DevService struct {\n\tUnimplementedFederationV2DevServiceServer\n\tcfg             FederationV2DevServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tenv             *FederationV2DevServiceEnv\n\tsvcVar          *FederationV2DevServiceVariable\n\tresolver        FederationV2DevServiceResolver\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationV2DevServiceDependentClientSet\n}\n\n// NewFederationV2DevService creates FederationV2DevService instance by FederationV2DevServiceConfig.\nfunc NewFederationV2DevService(cfg FederationV2DevServiceConfig) (*FederationV2DevService, error) {\n\tif cfg.Client == nil {\n\t\treturn nil, grpcfed.ErrClientConfig\n\t}\n\tif cfg.Resolver == nil {\n\t\treturn nil, grpcfed.ErrResolverConfig\n\t}\n\tPost_PostServiceClient, err := cfg.Client.Post_PostServiceClient(FederationV2DevServiceClientConfig{\n\t\tService: \"post.PostService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tUser_UserServiceClient, err := cfg.Client.User_UserServiceClient(FederationV2DevServiceClientConfig{\n\t\tService: \"user.UserService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"federation.v2dev.FederationV2devService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.federation.v2dev.ForNamelessArgument\": {\n\t\t\t\"bar\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Bar\"),\n\t\t},\n\t\t\"grpc.federation.private.federation.v2dev.GetPostV2devResponseArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.federation.v2dev.PostV2devArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.federation.v2dev.RefArgument\":      {},\n\t\t\"grpc.federation.private.federation.v2dev.TypedNilArgument\": {},\n\t\t\"grpc.federation.private.federation.v2dev.UnusedArgument\": {\n\t\t\t\"foo\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Foo\"),\n\t\t},\n\t\t\"grpc.federation.private.federation.v2dev.UserArgument\": {\n\t\t\t\"id\":      grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t\t\"title\":   grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Title\"),\n\t\t\t\"content\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Content\"),\n\t\t\t\"user_id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"UserId\"),\n\t\t},\n\t\t\"grpc.federation.private.Env\": {\n\t\t\t\"a\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"A\"),\n\t\t\t\"b\": grpcfed.NewCELFieldType(grpcfed.NewCELListType(grpcfed.CELIntType), \"B\"),\n\t\t\t\"c\": grpcfed.NewCELFieldType(grpcfed.NewCELMapType(grpcfed.CELStringType, grpcfed.CELDurationType), \"C\"),\n\t\t\t\"d\": grpcfed.NewCELFieldType(grpcfed.CELDoubleType, \"D\"),\n\t\t},\n\t\t\"grpc.federation.private.ServiceVariable\": {\n\t\t\t\"federation_service_variable\": grpcfed.NewCELFieldType(grpcfed.CELIntType, \"FederationServiceVariable\"),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"federation.v2dev\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.GRPCErrorAccessorOptions(celTypeHelper, \"post.GetPostResponse\")...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.GRPCErrorAccessorOptions(celTypeHelper, \"user.GetUserResponse\")...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"federation.v2dev.PostV2devType\", PostV2DevType_value, PostV2DevType_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewCELVariable(\"grpc.federation.env\", grpcfed.CELObjectType(\"grpc.federation.private.Env\")))\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewCELVariable(\"grpc.federation.var\", grpcfed.CELObjectType(\"grpc.federation.private.ServiceVariable\")))\n\tvar env FederationV2DevServiceEnv\n\tif err := grpcfed.LoadEnv(\"\", &env); err != nil {\n\t\treturn nil, err\n\t}\n\tsvc := &FederationV2DevService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tenv:             &env,\n\t\tsvcVar:          new(FederationV2DevServiceVariable),\n\t\tresolver:        cfg.Resolver,\n\t\tclient: &FederationV2DevServiceDependentClientSet{\n\t\t\tPost_PostServiceClient: Post_PostServiceClient,\n\t\t\tUser_UserServiceClient: User_UserServiceClient,\n\t\t},\n\t}\n\tif err := svc.initServiceVariables(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\tif resolver, ok := cfg.Resolver.(grpcfed.CustomResolverInitializer); ok {\n\t\tctx := context.Background()\n\t\tctx = withFederationV2DevServiceEnv(ctx, svc.env)\n\t\tctx = withFederationV2DevServiceVariable(ctx, svc.svcVar)\n\t\tif err := resolver.Init(ctx); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationV2DevService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationV2DevService(ctx context.Context, svc *FederationV2DevService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationV2DevService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\nfunc (s *FederationV2DevService) initServiceVariables(ctx context.Context) error {\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars *FederationV2DevServiceVariable\n\t}\n\tvalue := &localValueType{\n\t\tLocalValue: grpcfed.NewServiceVariableLocalValue(s.celEnvOpts),\n\t\tvars:       s.svcVar,\n\t}\n\tvalue.AddEnv(s.env)\n\tvalue.AddServiceVariable(s.svcVar)\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t/*\n\t\tdef {\n\t\t  name: \"federation_service_variable\"\n\t\t  by: \"1\"\n\t\t}\n\t*/\n\tdef_federation_service_variable := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[int64, *localValueType]{\n\t\t\tName: `federation_service_variable`,\n\t\t\tType: grpcfed.CELIntType,\n\t\t\tSetter: func(value *localValueType, v int64) error {\n\t\t\t\tvalue.vars.FederationServiceVariable = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `1`,\n\t\t\tByCacheIndex: 1,\n\t\t})\n\t}\n\tif err := def_federation_service_variable(ctx); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// GetPostV2Dev implements \"federation.v2dev.FederationV2devService/GetPostV2dev\" method.\nfunc (s *FederationV2DevService) GetPostV2Dev(ctx context.Context, req *GetPostV2DevRequest) (res *GetPostV2DevResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.v2dev.FederationV2devService/GetPostV2dev\")\n\tdefer span.End()\n\tctx = withFederationV2DevServiceEnv(ctx, s.env)\n\tctx = withFederationV2DevServiceVariable(ctx, s.svcVar)\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Federation_V2Dev_GetPostV2DevResponse(ctx, &FederationV2DevService_Federation_V2Dev_GetPostV2DevResponseArgument{\n\t\tId: req.GetId(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Federation_V2Dev_ForNameless resolve \"federation.v2dev.ForNameless\" message.\nfunc (s *FederationV2DevService) resolve_Federation_V2Dev_ForNameless(ctx context.Context, req *FederationV2DevService_Federation_V2Dev_ForNamelessArgument) (*ForNameless, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.v2dev.ForNameless\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.v2dev.ForNameless\", slog.Any(\"message_args\", s.logvalue_Federation_V2Dev_ForNamelessArgument(req)))\n\n\t// create a message value to be returned.\n\t// `custom_resolver = true` in \"grpc.federation.message\" option.\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx)) // create a new reference to logger.\n\tret, err := s.resolver.Resolve_Federation_V2Dev_ForNameless(ctx, req)\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.v2dev.ForNameless\", slog.Any(\"federation.v2dev.ForNameless\", s.logvalue_Federation_V2Dev_ForNameless(ret)))\n\treturn ret, nil\n}\n\n// resolve_Federation_V2Dev_GetPostV2DevResponse resolve \"federation.v2dev.GetPostV2devResponse\" message.\nfunc (s *FederationV2DevService) resolve_Federation_V2Dev_GetPostV2DevResponse(ctx context.Context, req *FederationV2DevService_Federation_V2Dev_GetPostV2DevResponseArgument) (*GetPostV2DevResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.v2dev.GetPostV2devResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.v2dev.GetPostV2devResponse\", slog.Any(\"message_args\", s.logvalue_Federation_V2Dev_GetPostV2DevResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tPost *PostV2Dev\n\t\t\tR    *Ref\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.federation.v2dev.GetPostV2devResponseArgument\", req)}\n\tvalue.AddEnv(s.env)\n\tvalue.AddServiceVariable(s.svcVar)\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"post\"\n\t\t  message {\n\t\t    name: \"PostV2dev\"\n\t\t    args { name: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_post := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*PostV2Dev, *localValueType]{\n\t\t\tName: `post`,\n\t\t\tType: grpcfed.CELObjectType(\"federation.v2dev.PostV2dev\"),\n\t\t\tSetter: func(value *localValueType, v *PostV2Dev) error {\n\t\t\t\tvalue.vars.Post = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationV2DevService_Federation_V2Dev_PostV2DevArgument{}\n\t\t\t\t// { name: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 2,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Federation_V2Dev_PostV2Dev(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"r\"\n\t\t  message {\n\t\t    name: \"Ref\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_r := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Ref, *localValueType]{\n\t\t\tName: `r`,\n\t\t\tType: grpcfed.CELObjectType(\"federation.v2dev.Ref\"),\n\t\t\tSetter: func(value *localValueType, v *Ref) error {\n\t\t\t\tvalue.vars.R = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationV2DevService_Federation_V2Dev_RefArgument{}\n\t\t\t\tret, err := s.resolve_Federation_V2Dev_Ref(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t   post ─┐\n\t      r ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_post(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_r(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationV2DevService_Federation_V2Dev_GetPostV2DevResponseVariable.Post = value.vars.Post\n\treq.FederationV2DevService_Federation_V2Dev_GetPostV2DevResponseVariable.R = value.vars.R\n\n\t// create a message value to be returned.\n\tret := &GetPostV2DevResponse{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"post\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*PostV2Dev]{\n\t\tValue:      value,\n\t\tExpr:       `post`,\n\t\tCacheIndex: 3,\n\t\tSetter: func(v *PostV2Dev) error {\n\t\t\tret.Post = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"PostV2devType.value('POST_V2_DEV_TYPE')\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[PostV2DevType]{\n\t\tValue:      value,\n\t\tExpr:       `PostV2devType.value('POST_V2_DEV_TYPE')`,\n\t\tCacheIndex: 4,\n\t\tSetter: func(v PostV2DevType) error {\n\t\t\tret.Type = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"grpc.federation.env.a\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `grpc.federation.env.a`,\n\t\tCacheIndex: 5,\n\t\tSetter: func(v string) error {\n\t\t\tret.EnvA = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"grpc.federation.env.b[1]\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[int64]{\n\t\tValue:      value,\n\t\tExpr:       `grpc.federation.env.b[1]`,\n\t\tCacheIndex: 6,\n\t\tSetter: func(v int64) error {\n\t\t\tret.EnvB = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"grpc.federation.env.c['z']\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*durationpb.Duration]{\n\t\tValue:      value,\n\t\tExpr:       `grpc.federation.env.c['z']`,\n\t\tCacheIndex: 7,\n\t\tSetter: func(v *durationpb.Duration) error {\n\t\t\tenvCValueValue, err := s.cast_Google_Protobuf_Duration__to__Google_Protobuf_Duration(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.EnvCValue = envCValueValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"r\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*Ref]{\n\t\tValue:      value,\n\t\tExpr:       `r`,\n\t\tCacheIndex: 8,\n\t\tSetter: func(v *Ref) error {\n\t\t\tret.Ref = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.v2dev.GetPostV2devResponse\", slog.Any(\"federation.v2dev.GetPostV2devResponse\", s.logvalue_Federation_V2Dev_GetPostV2DevResponse(ret)))\n\treturn ret, nil\n}\n\n// resolve_Federation_V2Dev_PostV2Dev resolve \"federation.v2dev.PostV2dev\" message.\nfunc (s *FederationV2DevService) resolve_Federation_V2Dev_PostV2Dev(ctx context.Context, req *FederationV2DevService_Federation_V2Dev_PostV2DevArgument) (*PostV2Dev, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.v2dev.PostV2dev\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.v2dev.PostV2dev\", slog.Any(\"message_args\", s.logvalue_Federation_V2Dev_PostV2DevArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tNullCheck bool\n\t\t\tPost      *post.Post\n\t\t\tRes       *post.GetPostResponse\n\t\t\tTypedNil  *TypedNil\n\t\t\tUnused    *Unused\n\t\t\tUser      *User\n\t\t\tXDef4     *ForNameless\n\t\t\tXDef7     bool\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.federation.v2dev.PostV2devArgument\", req)}\n\tvalue.AddEnv(s.env)\n\tvalue.AddServiceVariable(s.svcVar)\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"post.PostService/GetPost\"\n\t\t    request { field: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.GetPostResponse, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"post.GetPostResponse\"),\n\t\t\tSetter: func(value *localValueType, v *post.GetPostResponse) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &post.GetPostRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 9,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call post.PostService/GetPost\", slog.Any(\"post.GetPostRequest\", s.logvalue_Post_GetPostRequest(args)))\n\t\t\t\tret, err := s.client.Post_PostServiceClient.GetPost(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, FederationV2DevService_DependentMethod_Post_PostService_GetPost, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"post\"\n\t\t  autobind: true\n\t\t  by: \"res.post\"\n\t\t}\n\t*/\n\tdef_post := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.Post, *localValueType]{\n\t\t\tName: `post`,\n\t\t\tType: grpcfed.CELObjectType(\"post.Post\"),\n\t\t\tSetter: func(value *localValueType, v *post.Post) error {\n\t\t\t\tvalue.vars.Post = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `res.post`,\n\t\t\tByCacheIndex: 10,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"user\"\n\t\t  message {\n\t\t    name: \"User\"\n\t\t    args { inline: \"post\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_user := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*User, *localValueType]{\n\t\t\tName: `user`,\n\t\t\tType: grpcfed.CELObjectType(\"federation.v2dev.User\"),\n\t\t\tSetter: func(value *localValueType, v *User) error {\n\t\t\t\tvalue.vars.User = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationV2DevService_Federation_V2Dev_UserArgument{}\n\t\t\t\t// { inline: \"post\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*post.Post]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `post`,\n\t\t\t\t\tCacheIndex: 11,\n\t\t\t\t\tSetter: func(v *post.Post) error {\n\t\t\t\t\t\targs.Id = v.GetId()\n\t\t\t\t\t\targs.Title = v.GetTitle()\n\t\t\t\t\t\targs.Content = v.GetContent()\n\t\t\t\t\t\targs.UserId = v.GetUserId()\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Federation_V2Dev_User(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"unused\"\n\t\t  message {\n\t\t    name: \"Unused\"\n\t\t    args { name: \"foo\", by: \"'foo'\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_unused := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Unused, *localValueType]{\n\t\t\tName: `unused`,\n\t\t\tType: grpcfed.CELObjectType(\"federation.v2dev.Unused\"),\n\t\t\tSetter: func(value *localValueType, v *Unused) error {\n\t\t\t\tvalue.vars.Unused = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationV2DevService_Federation_V2Dev_UnusedArgument{}\n\t\t\t\t// { name: \"foo\", by: \"'foo'\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `'foo'`,\n\t\t\t\t\tCacheIndex: 12,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Foo = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Federation_V2Dev_Unused(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"_def4\"\n\t\t  message {\n\t\t    name: \"ForNameless\"\n\t\t    args { name: \"bar\", by: \"'bar'\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef__def4 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*ForNameless, *localValueType]{\n\t\t\tName: `_def4`,\n\t\t\tType: grpcfed.CELObjectType(\"federation.v2dev.ForNameless\"),\n\t\t\tSetter: func(value *localValueType, v *ForNameless) error {\n\t\t\t\tvalue.vars.XDef4 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationV2DevService_Federation_V2Dev_ForNamelessArgument{}\n\t\t\t\t// { name: \"bar\", by: \"'bar'\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `'bar'`,\n\t\t\t\t\tCacheIndex: 13,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Bar = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Federation_V2Dev_ForNameless(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"typed_nil\"\n\t\t  message {\n\t\t    name: \"TypedNil\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_typed_nil := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*TypedNil, *localValueType]{\n\t\t\tName: `typed_nil`,\n\t\t\tType: grpcfed.CELObjectType(\"federation.v2dev.TypedNil\"),\n\t\t\tSetter: func(value *localValueType, v *TypedNil) error {\n\t\t\t\tvalue.vars.TypedNil = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationV2DevService_Federation_V2Dev_TypedNilArgument{}\n\t\t\t\tret, err := s.resolve_Federation_V2Dev_TypedNil(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"null_check\"\n\t\t  if: \"typed_nil == null\"\n\t\t  by: \"true\"\n\t\t}\n\t*/\n\tdef_null_check := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[bool, *localValueType]{\n\t\t\tIf:           `typed_nil == null`,\n\t\t\tIfCacheIndex: 14,\n\t\t\tName:         `null_check`,\n\t\t\tType:         grpcfed.CELBoolType,\n\t\t\tSetter: func(value *localValueType, v bool) error {\n\t\t\t\tvalue.vars.NullCheck = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `true`,\n\t\t\tByCacheIndex: 15,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"_def7\"\n\t\t  if: \"typed_nil == null\"\n\t\t  by: \"grpc.federation.log.info('output typed_nil', {'result': typed_nil == null})\"\n\t\t}\n\t*/\n\tdef__def7 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[bool, *localValueType]{\n\t\t\tIf:           `typed_nil == null`,\n\t\t\tIfCacheIndex: 16,\n\t\t\tName:         `_def7`,\n\t\t\tType:         grpcfed.CELBoolType,\n\t\t\tSetter: func(value *localValueType, v bool) error {\n\t\t\t\tvalue.vars.XDef7 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `grpc.federation.log.info('output typed_nil', {'result': typed_nil == null})`,\n\t\t\tByCacheIndex: 17,\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t                        _def4 ─┐\n\t        typed_nil ─┐           │\n\t                        _def7 ─┤\n\t        typed_nil ─┐           │\n\t                   null_check ─┤\n\t                       unused ─┤\n\t   res ─┐                      │\n\t             post ─┐           │\n\t                         user ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def__def4(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_typed_nil(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def__def7(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_typed_nil(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_null_check(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_unused(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_post(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_user(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationV2DevService_Federation_V2Dev_PostV2DevVariable.NullCheck = value.vars.NullCheck\n\treq.FederationV2DevService_Federation_V2Dev_PostV2DevVariable.Post = value.vars.Post\n\treq.FederationV2DevService_Federation_V2Dev_PostV2DevVariable.Res = value.vars.Res\n\treq.FederationV2DevService_Federation_V2Dev_PostV2DevVariable.TypedNil = value.vars.TypedNil\n\treq.FederationV2DevService_Federation_V2Dev_PostV2DevVariable.Unused = value.vars.Unused\n\treq.FederationV2DevService_Federation_V2Dev_PostV2DevVariable.User = value.vars.User\n\treq.FederationV2DevService_Federation_V2Dev_PostV2DevVariable.XDef4 = value.vars.XDef4\n\treq.FederationV2DevService_Federation_V2Dev_PostV2DevVariable.XDef7 = value.vars.XDef7\n\n\t// create a message value to be returned.\n\tret := &PostV2Dev{}\n\n\t// field binding section.\n\tret.Id = value.vars.Post.GetId()           // { name: \"post\", autobind: true }\n\tret.Title = value.vars.Post.GetTitle()     // { name: \"post\", autobind: true }\n\tret.Content = value.vars.Post.GetContent() // { name: \"post\", autobind: true }\n\t{\n\t\t// (grpc.federation.field).custom_resolver = true\n\t\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx)) // create a new reference to logger.\n\t\tvar err error\n\t\tret.User, err = s.resolver.Resolve_Federation_V2Dev_PostV2Dev_User(ctx, &FederationV2DevService_Federation_V2Dev_PostV2Dev_UserArgument{\n\t\t\tFederationV2DevService_Federation_V2Dev_PostV2DevArgument: req,\n\t\t})\n\t\tif err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t}\n\t// (grpc.federation.field).by = \"null_check\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[bool]{\n\t\tValue:      value,\n\t\tExpr:       `null_check`,\n\t\tCacheIndex: 18,\n\t\tSetter: func(v bool) error {\n\t\t\tret.NullCheck = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.v2dev.PostV2dev\", slog.Any(\"federation.v2dev.PostV2dev\", s.logvalue_Federation_V2Dev_PostV2Dev(ret)))\n\treturn ret, nil\n}\n\n// resolve_Federation_V2Dev_Ref resolve \"federation.v2dev.Ref\" message.\nfunc (s *FederationV2DevService) resolve_Federation_V2Dev_Ref(ctx context.Context, req *FederationV2DevService_Federation_V2Dev_RefArgument) (*Ref, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.v2dev.Ref\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.v2dev.Ref\", slog.Any(\"message_args\", s.logvalue_Federation_V2Dev_RefArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.federation.v2dev.RefArgument\", req)}\n\tvalue.AddEnv(s.env)\n\tvalue.AddServiceVariable(s.svcVar)\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &Ref{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"grpc.federation.env.a\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `grpc.federation.env.a`,\n\t\tCacheIndex: 19,\n\t\tSetter: func(v string) error {\n\t\t\tret.A = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.v2dev.Ref\", slog.Any(\"federation.v2dev.Ref\", s.logvalue_Federation_V2Dev_Ref(ret)))\n\treturn ret, nil\n}\n\n// resolve_Federation_V2Dev_TypedNil resolve \"federation.v2dev.TypedNil\" message.\nfunc (s *FederationV2DevService) resolve_Federation_V2Dev_TypedNil(ctx context.Context, req *FederationV2DevService_Federation_V2Dev_TypedNilArgument) (*TypedNil, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.v2dev.TypedNil\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.v2dev.TypedNil\", slog.Any(\"message_args\", s.logvalue_Federation_V2Dev_TypedNilArgument(req)))\n\n\t// create a message value to be returned.\n\t// `custom_resolver = true` in \"grpc.federation.message\" option.\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx)) // create a new reference to logger.\n\tret, err := s.resolver.Resolve_Federation_V2Dev_TypedNil(ctx, req)\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.v2dev.TypedNil\", slog.Any(\"federation.v2dev.TypedNil\", s.logvalue_Federation_V2Dev_TypedNil(ret)))\n\treturn ret, nil\n}\n\n// resolve_Federation_V2Dev_Unused resolve \"federation.v2dev.Unused\" message.\nfunc (s *FederationV2DevService) resolve_Federation_V2Dev_Unused(ctx context.Context, req *FederationV2DevService_Federation_V2Dev_UnusedArgument) (*Unused, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.v2dev.Unused\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.v2dev.Unused\", slog.Any(\"message_args\", s.logvalue_Federation_V2Dev_UnusedArgument(req)))\n\n\t// create a message value to be returned.\n\t// `custom_resolver = true` in \"grpc.federation.message\" option.\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx)) // create a new reference to logger.\n\tret, err := s.resolver.Resolve_Federation_V2Dev_Unused(ctx, req)\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.v2dev.Unused\", slog.Any(\"federation.v2dev.Unused\", s.logvalue_Federation_V2Dev_Unused(ret)))\n\treturn ret, nil\n}\n\n// resolve_Federation_V2Dev_User resolve \"federation.v2dev.User\" message.\nfunc (s *FederationV2DevService) resolve_Federation_V2Dev_User(ctx context.Context, req *FederationV2DevService_Federation_V2Dev_UserArgument) (*User, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.v2dev.User\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.v2dev.User\", slog.Any(\"message_args\", s.logvalue_Federation_V2Dev_UserArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tRes *user.GetUserResponse\n\t\t\tU   *user.User\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.federation.v2dev.UserArgument\", req)}\n\tvalue.AddEnv(s.env)\n\tvalue.AddServiceVariable(s.svcVar)\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"user.UserService/GetUser\"\n\t\t    request { field: \"id\", by: \"$.user_id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*user.GetUserResponse, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"user.GetUserResponse\"),\n\t\t\tSetter: func(value *localValueType, v *user.GetUserResponse) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &user.GetUserRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.user_id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.user_id`,\n\t\t\t\t\tCacheIndex: 20,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call user.UserService/GetUser\", slog.Any(\"user.GetUserRequest\", s.logvalue_User_GetUserRequest(args)))\n\t\t\t\tret, err := s.client.User_UserServiceClient.GetUser(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, FederationV2DevService_DependentMethod_User_UserService_GetUser, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"u\"\n\t\t  by: \"res.user\"\n\t\t}\n\t*/\n\tdef_u := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*user.User, *localValueType]{\n\t\t\tName: `u`,\n\t\t\tType: grpcfed.CELObjectType(\"user.User\"),\n\t\t\tSetter: func(value *localValueType, v *user.User) error {\n\t\t\t\tvalue.vars.U = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `res.user`,\n\t\t\tByCacheIndex: 21,\n\t\t})\n\t}\n\n\tif err := def_res(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\tif err := def_u(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationV2DevService_Federation_V2Dev_UserVariable.Res = value.vars.Res\n\treq.FederationV2DevService_Federation_V2Dev_UserVariable.U = value.vars.U\n\n\t// create a message value to be returned.\n\t// `custom_resolver = true` in \"grpc.federation.message\" option.\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx)) // create a new reference to logger.\n\tret, err := s.resolver.Resolve_Federation_V2Dev_User(ctx, req)\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// field binding section.\n\t{\n\t\t// (grpc.federation.field).custom_resolver = true\n\t\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx)) // create a new reference to logger.\n\t\tvar err error\n\t\tret.Name, err = s.resolver.Resolve_Federation_V2Dev_User_Name(ctx, &FederationV2DevService_Federation_V2Dev_User_NameArgument{\n\t\t\tFederationV2DevService_Federation_V2Dev_UserArgument: req,\n\t\t\tFederation_V2Dev_User:                                ret,\n\t\t})\n\t\tif err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.v2dev.User\", slog.Any(\"federation.v2dev.User\", s.logvalue_Federation_V2Dev_User(ret)))\n\treturn ret, nil\n}\n\n// cast_Google_Protobuf_Duration__to__Google_Protobuf_Duration cast from \"google.protobuf.Duration\" to \"google.protobuf.Duration\".\nfunc (s *FederationV2DevService) cast_Google_Protobuf_Duration__to__Google_Protobuf_Duration(from *durationpb.Duration) (*durationpb.Duration, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tsecondsValue := from.GetSeconds()\n\tnanosValue := from.GetNanos()\n\tret := &durationpb.Duration{\n\t\tSeconds: secondsValue,\n\t\tNanos:   nanosValue,\n\t}\n\n\treturn ret, nil\n}\n\nfunc (s *FederationV2DevService) logvalue_Federation_V2Dev_ForNameless(v *ForNameless) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"bar\", v.GetBar()),\n\t)\n}\n\nfunc (s *FederationV2DevService) logvalue_Federation_V2Dev_ForNamelessArgument(v *FederationV2DevService_Federation_V2Dev_ForNamelessArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"bar\", v.Bar),\n\t)\n}\n\nfunc (s *FederationV2DevService) logvalue_Federation_V2Dev_GetPostV2DevResponse(v *GetPostV2DevResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"post\", s.logvalue_Federation_V2Dev_PostV2Dev(v.GetPost())),\n\t\tslog.String(\"type\", s.logvalue_Federation_V2Dev_PostV2DevType(v.GetType()).String()),\n\t\tslog.String(\"env_a\", v.GetEnvA()),\n\t\tslog.Int64(\"env_b\", v.GetEnvB()),\n\t\tslog.Any(\"env_c_value\", s.logvalue_Google_Protobuf_Duration(v.GetEnvCValue())),\n\t\tslog.Any(\"ref\", s.logvalue_Federation_V2Dev_Ref(v.GetRef())),\n\t)\n}\n\nfunc (s *FederationV2DevService) logvalue_Federation_V2Dev_GetPostV2DevResponseArgument(v *FederationV2DevService_Federation_V2Dev_GetPostV2DevResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationV2DevService) logvalue_Federation_V2Dev_PostV2Dev(v *PostV2Dev) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.String(\"title\", v.GetTitle()),\n\t\tslog.String(\"content\", v.GetContent()),\n\t\tslog.Any(\"user\", s.logvalue_Federation_V2Dev_User(v.GetUser())),\n\t\tslog.Bool(\"null_check\", v.GetNullCheck()),\n\t)\n}\n\nfunc (s *FederationV2DevService) logvalue_Federation_V2Dev_PostV2DevArgument(v *FederationV2DevService_Federation_V2Dev_PostV2DevArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationV2DevService) logvalue_Federation_V2Dev_PostV2DevType(v PostV2DevType) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tswitch v {\n\tcase PostV2DevType_POST_V2_DEV_TYPE:\n\t\treturn slog.StringValue(\"POST_V2_DEV_TYPE\")\n\t}\n\treturn slog.StringValue(\"\")\n}\n\nfunc (s *FederationV2DevService) logvalue_Federation_V2Dev_Ref(v *Ref) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"a\", v.GetA()),\n\t)\n}\n\nfunc (s *FederationV2DevService) logvalue_Federation_V2Dev_RefArgument(v *FederationV2DevService_Federation_V2Dev_RefArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationV2DevService) logvalue_Federation_V2Dev_TypedNil(v *TypedNil) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationV2DevService) logvalue_Federation_V2Dev_TypedNilArgument(v *FederationV2DevService_Federation_V2Dev_TypedNilArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationV2DevService) logvalue_Federation_V2Dev_Unused(v *Unused) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"foo\", v.GetFoo()),\n\t)\n}\n\nfunc (s *FederationV2DevService) logvalue_Federation_V2Dev_UnusedArgument(v *FederationV2DevService_Federation_V2Dev_UnusedArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"foo\", v.Foo),\n\t)\n}\n\nfunc (s *FederationV2DevService) logvalue_Federation_V2Dev_User(v *User) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n\nfunc (s *FederationV2DevService) logvalue_Federation_V2Dev_UserArgument(v *FederationV2DevService_Federation_V2Dev_UserArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t\tslog.String(\"title\", v.Title),\n\t\tslog.String(\"content\", v.Content),\n\t\tslog.String(\"user_id\", v.UserId),\n\t)\n}\n\nfunc (s *FederationV2DevService) logvalue_Google_Protobuf_Duration(v *durationpb.Duration) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Int64(\"seconds\", v.GetSeconds()),\n\t\tslog.Int64(\"nanos\", int64(v.GetNanos())),\n\t)\n}\n\nfunc (s *FederationV2DevService) logvalue_Post_GetPostRequest(v *post.GetPostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t)\n}\n\nfunc (s *FederationV2DevService) logvalue_Post_GetPostsRequest(v *post.GetPostsRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.GetIds()),\n\t)\n}\n\nfunc (s *FederationV2DevService) logvalue_User_GetUserRequest(v *user.GetUserRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t)\n}\n\nfunc (s *FederationV2DevService) logvalue_User_GetUsersRequest(v *user.GetUsersRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.GetIds()),\n\t)\n}\n"
  },
  {
    "path": "_examples/03_custom_resolver/federation/other.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: federation/other.proto\n\npackage federation\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Ref struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tA string `protobuf:\"bytes,1,opt,name=a,proto3\" json:\"a,omitempty\"`\n}\n\nfunc (x *Ref) Reset() {\n\t*x = Ref{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_other_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Ref) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Ref) ProtoMessage() {}\n\nfunc (x *Ref) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_other_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Ref.ProtoReflect.Descriptor instead.\nfunc (*Ref) Descriptor() ([]byte, []int) {\n\treturn file_federation_other_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Ref) GetA() string {\n\tif x != nil {\n\t\treturn x.A\n\t}\n\treturn \"\"\n}\n\nvar File_federation_other_proto protoreflect.FileDescriptor\n\nvar file_federation_other_proto_rawDesc = []byte{\n\t0x0a, 0x16, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6f, 0x74, 0x68,\n\t0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x64, 0x65, 0x76, 0x1a, 0x20, 0x67, 0x72, 0x70, 0x63,\n\t0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x2f, 0x0a, 0x03,\n\t0x52, 0x65, 0x66, 0x12, 0x28, 0x0a, 0x01, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1a,\n\t0x9a, 0x4a, 0x17, 0x12, 0x15, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x65, 0x6e, 0x76, 0x2e, 0x61, 0x52, 0x01, 0x61, 0x42, 0xa2, 0x01,\n\t0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x76, 0x32, 0x64, 0x65, 0x76, 0x42, 0x0a, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x50, 0x72, 0x6f,\n\t0x74, 0x6f, 0x50, 0x01, 0x5a, 0x1d, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0xa2, 0x02, 0x03, 0x46, 0x56, 0x58, 0xaa, 0x02, 0x10, 0x46, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x32, 0x64, 0x65, 0x76, 0xca, 0x02, 0x10, 0x46,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x56, 0x32, 0x64, 0x65, 0x76, 0xe2,\n\t0x02, 0x1c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x56, 0x32, 0x64,\n\t0x65, 0x76, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02,\n\t0x11, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x3a, 0x56, 0x32, 0x64,\n\t0x65, 0x76, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_federation_other_proto_rawDescOnce sync.Once\n\tfile_federation_other_proto_rawDescData = file_federation_other_proto_rawDesc\n)\n\nfunc file_federation_other_proto_rawDescGZIP() []byte {\n\tfile_federation_other_proto_rawDescOnce.Do(func() {\n\t\tfile_federation_other_proto_rawDescData = protoimpl.X.CompressGZIP(file_federation_other_proto_rawDescData)\n\t})\n\treturn file_federation_other_proto_rawDescData\n}\n\nvar file_federation_other_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_federation_other_proto_goTypes = []interface{}{\n\t(*Ref)(nil), // 0: federation.v2dev.Ref\n}\nvar file_federation_other_proto_depIdxs = []int32{\n\t0, // [0:0] is the sub-list for method output_type\n\t0, // [0:0] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_federation_other_proto_init() }\nfunc file_federation_other_proto_init() {\n\tif File_federation_other_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_federation_other_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Ref); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_federation_other_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_federation_other_proto_goTypes,\n\t\tDependencyIndexes: file_federation_other_proto_depIdxs,\n\t\tMessageInfos:      file_federation_other_proto_msgTypes,\n\t}.Build()\n\tFile_federation_other_proto = out.File\n\tfile_federation_other_proto_rawDesc = nil\n\tfile_federation_other_proto_goTypes = nil\n\tfile_federation_other_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/03_custom_resolver/federation/other_grpc_federation.pb.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: federation/other.proto\npackage federation\n\nimport (\n\t\"reflect\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n"
  },
  {
    "path": "_examples/03_custom_resolver/go.mod",
    "content": "module example\n\ngo 1.24.0\n\nreplace github.com/mercari/grpc-federation => ../../\n\nrequire (\n\tgithub.com/google/go-cmp v0.7.0\n\tgithub.com/mercari/grpc-federation v0.0.0-00010101000000-000000000000\n\tgo.opentelemetry.io/otel v1.24.0\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0\n\tgo.opentelemetry.io/otel/sdk v1.24.0\n\tgo.opentelemetry.io/otel/trace v1.24.0\n\tgo.uber.org/goleak v1.3.0\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7\n\tgoogle.golang.org/grpc v1.65.0\n\tgoogle.golang.org/protobuf v1.34.2\n)\n\nrequire (\n\tcel.dev/expr v0.19.1 // indirect\n\tgithub.com/antlr4-go/antlr/v4 v4.13.0 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.2.1 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/goccy/wasi-go v0.3.2 // indirect\n\tgithub.com/google/cel-go v0.23.1 // indirect\n\tgithub.com/google/uuid v1.6.0 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect\n\tgithub.com/kelseyhightower/envconfig v1.4.0 // indirect\n\tgithub.com/stealthrocket/wazergo v0.19.1 // indirect\n\tgithub.com/stoewer/go-strcase v1.3.0 // indirect\n\tgithub.com/tetratelabs/wazero v1.10.1 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.24.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.0.0 // indirect\n\tgolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect\n\tgolang.org/x/net v0.38.0 // indirect\n\tgolang.org/x/sync v0.14.0 // indirect\n\tgolang.org/x/sys v0.37.0 // indirect\n\tgolang.org/x/text v0.23.0 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 // indirect\n)\n"
  },
  {
    "path": "_examples/03_custom_resolver/go.sum",
    "content": "cel.dev/expr v0.19.1 h1:NciYrtDRIR0lNCnH1LFJegdjspNx9fI59O7TWcua/W4=\ncel.dev/expr v0.19.1/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw=\ngithub.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=\ngithub.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/goccy/wasi-go v0.3.2 h1:wAvGXmqCkfcp0B0AwIp5Ya53hzDwkKm9W8iuT3nCCz0=\ngithub.com/goccy/wasi-go v0.3.2/go.mod h1:nIKD204n9xa4Z20UV+XA483kIr9TAl2vXr+X5qVAO5M=\ngithub.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4=\ngithub.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=\ngithub.com/google/cel-go v0.23.1 h1:91ThhEZlBcE5rB2adBVXqvDoqdL8BG2oyhd0bK1I/r4=\ngithub.com/google/cel-go v0.23.1/go.mod h1:52Pb6QsDbC5kvgxvZhiL9QX1oZEkcUF/ZqaPx1J5Wwo=\ngithub.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\ngithub.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg=\ngithub.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=\ngithub.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/stealthrocket/wazergo v0.19.1 h1:BPrITETPgSFwiytwmToO0MbUC/+RGC39JScz1JmmG6c=\ngithub.com/stealthrocket/wazergo v0.19.1/go.mod h1:riI0hxw4ndZA5e6z7PesHg2BtTftcZaMxRcoiGGipTs=\ngithub.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs=\ngithub.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tetratelabs/wazero v1.10.1 h1:2DugeJf6VVk58KTPszlNfeeN8AhhpwcZqkJj2wwFuH8=\ngithub.com/tetratelabs/wazero v1.10.1/go.mod h1:DRm5twOQ5Gr1AoEdSi0CLjDQF1J9ZAuyqFIjl1KKfQU=\ngo.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo=\ngo.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0=\ngo.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI=\ngo.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=\ngo.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw=\ngo.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg=\ngo.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=\ngo.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=\ngo.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=\ngo.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=\ngolang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=\ngolang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=\ngolang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=\ngolang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=\ngolang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=\ngolang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=\ngolang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 h1:YcyjlL1PRr2Q17/I0dPk2JmYS5CDXfcdb2Z3YRioEbw=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7 h1:2035KHhUv+EpyB+hWgJnaWKJOdX1E95w2S8Rr4uWKTs=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=\ngoogle.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=\ngoogle.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=\ngoogle.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=\ngoogle.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "_examples/03_custom_resolver/main_test.go",
    "content": "package main_test\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"net\"\n\t\"os\"\n\t\"reflect\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\"\n\t\"go.opentelemetry.io/otel/propagation\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\tsdktrace \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.4.0\"\n\t\"go.uber.org/goleak\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/test/bufconn\"\n\t\"google.golang.org/protobuf/types/known/durationpb\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\n\t\"example/federation\"\n\t\"example/post\"\n\t\"example/user\"\n)\n\nconst bufSize = 1024\n\nvar (\n\tlistener   *bufconn.Listener\n\tpostClient post.PostServiceClient\n\tuserClient user.UserServiceClient\n)\n\ntype clientConfig struct{}\n\nfunc (c *clientConfig) Post_PostServiceClient(cfg federation.FederationV2DevServiceClientConfig) (post.PostServiceClient, error) {\n\treturn postClient, nil\n}\n\nfunc (c *clientConfig) User_UserServiceClient(cfg federation.FederationV2DevServiceClientConfig) (user.UserServiceClient, error) {\n\treturn userClient, nil\n}\n\ntype Resolver struct {\n}\n\nfunc (r *Resolver) Init(ctx context.Context) error {\n\tif err := r.validateEnv(ctx); err != nil {\n\t\treturn err\n\t}\n\tif err := r.validateServiceVar(ctx); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (r *Resolver) Resolve_Federation_V2Dev_User(ctx context.Context, arg *federation.FederationV2DevService_Federation_V2Dev_UserArgument) (*federation.User, error) {\n\tif err := r.validateEnv(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\tif err := r.validateServiceVar(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\treturn &federation.User{\n\t\tId:   arg.U.Id,\n\t\tName: arg.U.Name,\n\t}, nil\n}\n\nfunc (r *Resolver) validateEnv(ctx context.Context) error {\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx))\n\tenv := federation.GetFederationV2DevServiceEnv(ctx)\n\tif env.A != \"xxx\" {\n\t\treturn fmt.Errorf(\"failed to get environment variable for A: %v\", env.A)\n\t}\n\tif !reflect.DeepEqual(env.B, []int64{1, 2, 3, 4}) {\n\t\treturn fmt.Errorf(\"failed to get environment variable for B: %v\", env.B)\n\t}\n\tif len(env.C) != len(envCMap) {\n\t\treturn fmt.Errorf(\"failed to get environment variable for C: %v\", env.C)\n\t}\n\tif env.D != 0 {\n\t\treturn fmt.Errorf(\"failed to get environment variable for D: %v\", env.D)\n\t}\n\tgrpcfed.Logger(ctx).Debug(\"print env variables\", slog.Any(\"env\", env))\n\treturn nil\n}\n\nfunc (r *Resolver) validateServiceVar(ctx context.Context) error {\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx))\n\tsvcVar := federation.GetFederationV2DevServiceVariable(ctx)\n\tif svcVar.FederationServiceVariable != 1 {\n\t\treturn fmt.Errorf(\"failed to get service variable for FederationServiceVariable: %v\", svcVar.FederationServiceVariable)\n\t}\n\tgrpcfed.Logger(ctx).Debug(\"print service variables\", slog.Any(\"svc_var\", svcVar))\n\treturn nil\n}\n\nfunc (r *Resolver) Resolve_Federation_V2Dev_PostV2Dev_User(ctx context.Context, arg *federation.FederationV2DevService_Federation_V2Dev_PostV2Dev_UserArgument) (*federation.User, error) {\n\treturn arg.User, nil\n}\n\nfunc (r *Resolver) Resolve_Federation_V2Dev_Unused(_ context.Context, _ *federation.FederationV2DevService_Federation_V2Dev_UnusedArgument) (*federation.Unused, error) {\n\treturn &federation.Unused{}, nil\n}\n\nfunc (r *Resolver) Resolve_Federation_V2Dev_ForNameless(_ context.Context, _ *federation.FederationV2DevService_Federation_V2Dev_ForNamelessArgument) (*federation.ForNameless, error) {\n\treturn &federation.ForNameless{}, nil\n}\n\nfunc (r *Resolver) Resolve_Federation_V2Dev_User_Name(_ context.Context, arg *federation.FederationV2DevService_Federation_V2Dev_User_NameArgument) (string, error) {\n\treturn arg.Federation_V2Dev_User.Name, nil\n}\n\nfunc (r *Resolver) Resolve_Federation_V2Dev_TypedNil(_ context.Context, _ *federation.FederationV2DevService_Federation_V2Dev_TypedNilArgument) (*federation.TypedNil, error) {\n\treturn nil, nil\n}\n\ntype PostServer struct {\n\t*post.UnimplementedPostServiceServer\n}\n\nfunc (s *PostServer) GetPost(ctx context.Context, req *post.GetPostRequest) (*post.GetPostResponse, error) {\n\treturn nil, errors.New(\"error!!\")\n}\n\nfunc (s *PostServer) GetPosts(ctx context.Context, req *post.GetPostsRequest) (*post.GetPostsResponse, error) {\n\treturn nil, errors.New(\"error!!\")\n}\n\ntype UserServer struct {\n\t*user.UnimplementedUserServiceServer\n}\n\nfunc (s *UserServer) GetUser(ctx context.Context, req *user.GetUserRequest) (*user.GetUserResponse, error) {\n\tif req.Id == \"\" {\n\t\treturn &user.GetUserResponse{User: &user.User{Id: \"anonymous_id\", Name: \"anonymous\"}}, nil\n\t}\n\treturn &user.GetUserResponse{\n\t\tUser: &user.User{\n\t\t\tId:   req.Id,\n\t\t\tName: fmt.Sprintf(\"name_%s\", req.Id),\n\t\t},\n\t}, nil\n}\n\nfunc (s *UserServer) GetUsers(ctx context.Context, req *user.GetUsersRequest) (*user.GetUsersResponse, error) {\n\tvar users []*user.User\n\tfor _, id := range req.Ids {\n\t\tusers = append(users, &user.User{\n\t\t\tId:   id,\n\t\t\tName: fmt.Sprintf(\"name_%s\", id),\n\t\t})\n\t}\n\treturn &user.GetUsersResponse{Users: users}, nil\n}\n\nfunc dialer(ctx context.Context, address string) (net.Conn, error) {\n\treturn listener.Dial()\n}\n\nvar envCMap map[string]grpcfed.Duration\n\nfunc init() {\n\tx, err := time.ParseDuration(\"10h\")\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\ty, err := time.ParseDuration(\"20m\")\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tz, err := time.ParseDuration(\"30s\")\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tenvCMap = map[string]grpcfed.Duration{\n\t\t\"x\": grpcfed.Duration(x),\n\t\t\"y\": grpcfed.Duration(y),\n\t\t\"z\": grpcfed.Duration(z),\n\t}\n}\n\nfunc TestFederation(t *testing.T) {\n\tdefer goleak.VerifyNone(t)\n\tctx := context.Background()\n\tlistener = bufconn.Listen(bufSize)\n\n\tt.Setenv(\"YYY\", \"1,2,3,4\")\n\tt.Setenv(\"ZZZ\", \"x:10h,y:20m,z:30s\")\n\tt.Setenv(\"d\", \"2.0\")\n\n\tif os.Getenv(\"ENABLE_JAEGER\") != \"\" {\n\t\texporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithInsecure())\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttp := sdktrace.NewTracerProvider(\n\t\t\tsdktrace.WithBatcher(exporter),\n\t\t\tsdktrace.WithResource(\n\t\t\t\tresource.NewWithAttributes(\n\t\t\t\t\tsemconv.SchemaURL,\n\t\t\t\t\tsemconv.ServiceNameKey.String(\"example03/custom_resolver\"),\n\t\t\t\t\tsemconv.ServiceVersionKey.String(\"1.0.0\"),\n\t\t\t\t\tattribute.String(\"environment\", \"dev\"),\n\t\t\t\t),\n\t\t\t),\n\t\t\tsdktrace.WithSampler(sdktrace.AlwaysSample()),\n\t\t)\n\t\tdefer tp.Shutdown(ctx)\n\t\totel.SetTextMapPropagator(propagation.TraceContext{})\n\t\totel.SetTracerProvider(tp)\n\t}\n\n\tconn, err := grpc.DialContext(ctx, \"\", grpc.WithContextDialer(dialer), grpc.WithInsecure())\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer conn.Close()\n\n\tpostClient = post.NewPostServiceClient(conn)\n\tuserClient = user.NewUserServiceClient(conn)\n\n\tgrpcServer := grpc.NewServer()\n\tdefer grpcServer.Stop()\n\n\tlogger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{\n\t\tLevel: slog.LevelDebug,\n\t}))\n\tfederationServer, err := federation.NewFederationV2DevService(federation.FederationV2DevServiceConfig{\n\t\tClient:   new(clientConfig),\n\t\tResolver: new(Resolver),\n\t\tLogger:   logger,\n\t\tErrorHandler: func(ctx context.Context, methodName string, err error) error {\n\t\t\tfederationServiceMethodName, _ := grpc.Method(ctx)\n\t\t\tgrpcfed.Logger(ctx).InfoContext(\n\t\t\t\tctx,\n\t\t\t\t\"error handler\",\n\t\t\t\tslog.String(\"federation-service-method\", federationServiceMethodName),\n\t\t\t\tslog.String(\"dependent-method\", methodName),\n\t\t\t)\n\t\t\tswitch methodName {\n\t\t\tcase federation.FederationV2DevService_DependentMethod_Post_PostService_GetPost:\n\t\t\t\treturn nil\n\t\t\tcase federation.FederationV2DevService_DependentMethod_User_UserService_GetUser:\n\t\t\t\treturn err\n\t\t\t}\n\t\t\treturn err\n\t\t},\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer federation.CleanupFederationV2DevService(ctx, federationServer)\n\n\tpost.RegisterPostServiceServer(grpcServer, &PostServer{})\n\tuser.RegisterUserServiceServer(grpcServer, &UserServer{})\n\tfederation.RegisterFederationV2DevServiceServer(grpcServer, federationServer)\n\n\tgo func() {\n\t\tif err := grpcServer.Serve(listener); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t}()\n\n\tclient := federation.NewFederationV2DevServiceClient(conn)\n\tres, err := client.GetPostV2Dev(ctx, &federation.GetPostV2DevRequest{\n\t\tId: \"foo\",\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif diff := cmp.Diff(res, &federation.GetPostV2DevResponse{\n\t\tPost: &federation.PostV2Dev{\n\t\t\tUser: &federation.User{\n\t\t\t\tId:   \"anonymous_id\",\n\t\t\t\tName: \"anonymous\",\n\t\t\t},\n\t\t\tNullCheck: true,\n\t\t},\n\t\tEnvA:      \"xxx\",\n\t\tEnvB:      2,\n\t\tEnvCValue: durationpb.New(envCMap[\"z\"]),\n\t\tRef:       &federation.Ref{A: \"xxx\"},\n\t}, cmpopts.IgnoreUnexported(\n\t\tfederation.GetPostV2DevResponse{},\n\t\tfederation.PostV2Dev{},\n\t\tfederation.User{},\n\t\tfederation.Ref{},\n\t\tdurationpb.Duration{},\n\t)); diff != \"\" {\n\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t}\n}\n"
  },
  {
    "path": "_examples/03_custom_resolver/post/post.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: post/post.proto\n\npackage post\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype GetPostRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetPostRequest) Reset() {\n\t*x = GetPostRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostRequest) ProtoMessage() {}\n\nfunc (x *GetPostRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostRequest.ProtoReflect.Descriptor instead.\nfunc (*GetPostRequest) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetPostRequest) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\ntype GetPostResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPost *Post `protobuf:\"bytes,1,opt,name=post,proto3\" json:\"post,omitempty\"`\n}\n\nfunc (x *GetPostResponse) Reset() {\n\t*x = GetPostResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostResponse) ProtoMessage() {}\n\nfunc (x *GetPostResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostResponse.ProtoReflect.Descriptor instead.\nfunc (*GetPostResponse) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetPostResponse) GetPost() *Post {\n\tif x != nil {\n\t\treturn x.Post\n\t}\n\treturn nil\n}\n\ntype GetPostsRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tIds []string `protobuf:\"bytes,1,rep,name=ids,proto3\" json:\"ids,omitempty\"`\n}\n\nfunc (x *GetPostsRequest) Reset() {\n\t*x = GetPostsRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostsRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostsRequest) ProtoMessage() {}\n\nfunc (x *GetPostsRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostsRequest.ProtoReflect.Descriptor instead.\nfunc (*GetPostsRequest) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *GetPostsRequest) GetIds() []string {\n\tif x != nil {\n\t\treturn x.Ids\n\t}\n\treturn nil\n}\n\ntype GetPostsResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPosts []*Post `protobuf:\"bytes,1,rep,name=posts,proto3\" json:\"posts,omitempty\"`\n}\n\nfunc (x *GetPostsResponse) Reset() {\n\t*x = GetPostsResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostsResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostsResponse) ProtoMessage() {}\n\nfunc (x *GetPostsResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostsResponse.ProtoReflect.Descriptor instead.\nfunc (*GetPostsResponse) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *GetPostsResponse) GetPosts() []*Post {\n\tif x != nil {\n\t\treturn x.Posts\n\t}\n\treturn nil\n}\n\ntype Post struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId      string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tTitle   string `protobuf:\"bytes,2,opt,name=title,proto3\" json:\"title,omitempty\"`\n\tContent string `protobuf:\"bytes,3,opt,name=content,proto3\" json:\"content,omitempty\"`\n\tUserId  string `protobuf:\"bytes,4,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *Post) Reset() {\n\t*x = Post{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Post) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Post) ProtoMessage() {}\n\nfunc (x *Post) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Post.ProtoReflect.Descriptor instead.\nfunc (*Post) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *Post) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetTitle() string {\n\tif x != nil {\n\t\treturn x.Title\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetContent() string {\n\tif x != nil {\n\t\treturn x.Content\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetUserId() string {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn \"\"\n}\n\nvar File_post_post_proto protoreflect.FileDescriptor\n\nvar file_post_post_proto_rawDesc = []byte{\n\t0x0a, 0x0f, 0x70, 0x6f, 0x73, 0x74, 0x2f, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x20, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x6f,\n\t0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x31, 0x0a, 0x0f, 0x47, 0x65, 0x74,\n\t0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x04,\n\t0x70, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x6f, 0x73,\n\t0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x23, 0x0a, 0x0f,\n\t0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,\n\t0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64,\n\t0x73, 0x22, 0x34, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65, 0x73,\n\t0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x05, 0x70, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74,\n\t0x52, 0x05, 0x70, 0x6f, 0x73, 0x74, 0x73, 0x22, 0x5f, 0x0a, 0x04, 0x50, 0x6f, 0x73, 0x74, 0x12,\n\t0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12,\n\t0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,\n\t0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12,\n\t0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x32, 0x84, 0x01, 0x0a, 0x0b, 0x50, 0x6f, 0x73,\n\t0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x38, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x50,\n\t0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f,\n\t0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x70, 0x6f, 0x73, 0x74,\n\t0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x22, 0x00, 0x12, 0x3b, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x15,\n\t0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65,\n\t0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x47, 0x65, 0x74,\n\t0x50, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42,\n\t0x58, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x42, 0x09, 0x50, 0x6f, 0x73,\n\t0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x11, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c,\n\t0x65, 0x2f, 0x70, 0x6f, 0x73, 0x74, 0x3b, 0x70, 0x6f, 0x73, 0x74, 0xa2, 0x02, 0x03, 0x50, 0x58,\n\t0x58, 0xaa, 0x02, 0x04, 0x50, 0x6f, 0x73, 0x74, 0xca, 0x02, 0x04, 0x50, 0x6f, 0x73, 0x74, 0xe2,\n\t0x02, 0x10, 0x50, 0x6f, 0x73, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61,\n\t0x74, 0x61, 0xea, 0x02, 0x04, 0x50, 0x6f, 0x73, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x33,\n}\n\nvar (\n\tfile_post_post_proto_rawDescOnce sync.Once\n\tfile_post_post_proto_rawDescData = file_post_post_proto_rawDesc\n)\n\nfunc file_post_post_proto_rawDescGZIP() []byte {\n\tfile_post_post_proto_rawDescOnce.Do(func() {\n\t\tfile_post_post_proto_rawDescData = protoimpl.X.CompressGZIP(file_post_post_proto_rawDescData)\n\t})\n\treturn file_post_post_proto_rawDescData\n}\n\nvar file_post_post_proto_msgTypes = make([]protoimpl.MessageInfo, 5)\nvar file_post_post_proto_goTypes = []interface{}{\n\t(*GetPostRequest)(nil),   // 0: post.GetPostRequest\n\t(*GetPostResponse)(nil),  // 1: post.GetPostResponse\n\t(*GetPostsRequest)(nil),  // 2: post.GetPostsRequest\n\t(*GetPostsResponse)(nil), // 3: post.GetPostsResponse\n\t(*Post)(nil),             // 4: post.Post\n}\nvar file_post_post_proto_depIdxs = []int32{\n\t4, // 0: post.GetPostResponse.post:type_name -> post.Post\n\t4, // 1: post.GetPostsResponse.posts:type_name -> post.Post\n\t0, // 2: post.PostService.GetPost:input_type -> post.GetPostRequest\n\t2, // 3: post.PostService.GetPosts:input_type -> post.GetPostsRequest\n\t1, // 4: post.PostService.GetPost:output_type -> post.GetPostResponse\n\t3, // 5: post.PostService.GetPosts:output_type -> post.GetPostsResponse\n\t4, // [4:6] is the sub-list for method output_type\n\t2, // [2:4] is the sub-list for method input_type\n\t2, // [2:2] is the sub-list for extension type_name\n\t2, // [2:2] is the sub-list for extension extendee\n\t0, // [0:2] is the sub-list for field type_name\n}\n\nfunc init() { file_post_post_proto_init() }\nfunc file_post_post_proto_init() {\n\tif File_post_post_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_post_post_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostsRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostsResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Post); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_post_post_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   5,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_post_post_proto_goTypes,\n\t\tDependencyIndexes: file_post_post_proto_depIdxs,\n\t\tMessageInfos:      file_post_post_proto_msgTypes,\n\t}.Build()\n\tFile_post_post_proto = out.File\n\tfile_post_post_proto_rawDesc = nil\n\tfile_post_post_proto_goTypes = nil\n\tfile_post_post_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/03_custom_resolver/post/post_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: post/post.proto\n\npackage post\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tPostService_GetPost_FullMethodName  = \"/post.PostService/GetPost\"\n\tPostService_GetPosts_FullMethodName = \"/post.PostService/GetPosts\"\n)\n\n// PostServiceClient is the client API for PostService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype PostServiceClient interface {\n\tGetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error)\n\tGetPosts(ctx context.Context, in *GetPostsRequest, opts ...grpc.CallOption) (*GetPostsResponse, error)\n}\n\ntype postServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewPostServiceClient(cc grpc.ClientConnInterface) PostServiceClient {\n\treturn &postServiceClient{cc}\n}\n\nfunc (c *postServiceClient) GetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error) {\n\tout := new(GetPostResponse)\n\terr := c.cc.Invoke(ctx, PostService_GetPost_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *postServiceClient) GetPosts(ctx context.Context, in *GetPostsRequest, opts ...grpc.CallOption) (*GetPostsResponse, error) {\n\tout := new(GetPostsResponse)\n\terr := c.cc.Invoke(ctx, PostService_GetPosts_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// PostServiceServer is the server API for PostService service.\n// All implementations must embed UnimplementedPostServiceServer\n// for forward compatibility\ntype PostServiceServer interface {\n\tGetPost(context.Context, *GetPostRequest) (*GetPostResponse, error)\n\tGetPosts(context.Context, *GetPostsRequest) (*GetPostsResponse, error)\n\tmustEmbedUnimplementedPostServiceServer()\n}\n\n// UnimplementedPostServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedPostServiceServer struct {\n}\n\nfunc (UnimplementedPostServiceServer) GetPost(context.Context, *GetPostRequest) (*GetPostResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetPost not implemented\")\n}\nfunc (UnimplementedPostServiceServer) GetPosts(context.Context, *GetPostsRequest) (*GetPostsResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetPosts not implemented\")\n}\nfunc (UnimplementedPostServiceServer) mustEmbedUnimplementedPostServiceServer() {}\n\n// UnsafePostServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to PostServiceServer will\n// result in compilation errors.\ntype UnsafePostServiceServer interface {\n\tmustEmbedUnimplementedPostServiceServer()\n}\n\nfunc RegisterPostServiceServer(s grpc.ServiceRegistrar, srv PostServiceServer) {\n\ts.RegisterService(&PostService_ServiceDesc, srv)\n}\n\nfunc _PostService_GetPost_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetPostRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(PostServiceServer).GetPost(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: PostService_GetPost_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(PostServiceServer).GetPost(ctx, req.(*GetPostRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _PostService_GetPosts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetPostsRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(PostServiceServer).GetPosts(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: PostService_GetPosts_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(PostServiceServer).GetPosts(ctx, req.(*GetPostsRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// PostService_ServiceDesc is the grpc.ServiceDesc for PostService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar PostService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"post.PostService\",\n\tHandlerType: (*PostServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetPost\",\n\t\t\tHandler:    _PostService_GetPost_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetPosts\",\n\t\t\tHandler:    _PostService_GetPosts_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"post/post.proto\",\n}\n"
  },
  {
    "path": "_examples/03_custom_resolver/proto/buf.yaml",
    "content": "version: v1\nbreaking:\n  use:\n    - FILE\nlint:\n  use:\n    - DEFAULT\n"
  },
  {
    "path": "_examples/03_custom_resolver/proto/federation/federation.proto",
    "content": "syntax = \"proto3\";\n\npackage federation.v2dev;\n\nimport \"grpc/federation/federation.proto\";\nimport \"google/protobuf/duration.proto\";\nimport \"federation/other.proto\";\n\noption go_package = \"example/federation;federation\";\n\noption (grpc.federation.file)= {\n  import: [\"post/post.proto\", \"user/user.proto\"]\n};\n\nservice FederationV2devService {\n  option (grpc.federation.service) = {\n    env {\n      var {\n        name: \"a\"\n        type { kind: STRING }\n        option {\n          default: \"xxx\"\n        }\n      }\n      var {\n        name: \"b\"\n        type { repeated { kind: INT64 } }\n        option {\n          alternate: \"yyy\"\n        }\n      }\n      var {\n        name: \"c\"\n        type { map { key { kind: STRING } value { kind: DURATION } } }\n        option {\n          required: true\n          alternate: \"zzz\"\n        }\n      }\n      var {\n        name: \"d\"\n        type { kind: DOUBLE }\n        option {\n          ignored: true\n        }\n      }\n    }\n    var {\n      name: \"federation_service_variable\"\n      by: \"1\"\n    }\n  };\n  rpc GetPostV2dev(GetPostV2devRequest) returns (GetPostV2devResponse) {};\n}\n\nmessage GetPostV2devRequest {\n  string id = 1;\n}\n\nenum PostV2devType {\n  POST_V2_DEV_TYPE = 0;\n}\n\nmessage GetPostV2devResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"PostV2dev\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n    def { name: \"r\" message { name: \"Ref\" } }\n  };\n  PostV2dev post = 1 [(grpc.federation.field).by = \"post\"];\n  PostV2devType type = 2 [(grpc.federation.field).by = \"PostV2devType.value('POST_V2_DEV_TYPE')\"];\n  string env_a = 3 [(grpc.federation.field).by = \"grpc.federation.env.a\"];\n  int64 env_b = 4 [(grpc.federation.field).by = \"grpc.federation.env.b[1]\"];\n  google.protobuf.Duration env_c_value = 5 [(grpc.federation.field).by = \"grpc.federation.env.c['z']\"];\n  Ref ref = 6 [(grpc.federation.field).by = \"r\"];\n}\n\nmessage PostV2dev {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"res\"\n        call {\n          method: \"post.PostService/GetPost\"\n          request { field: \"id\", by: \"$.id\" }\n        }\n      },\n      { name: \"post\", by: \"res.post\", autobind: true },\n      {\n        name: \"user\"\n        message {\n          name: \"User\"\n          args { inline: \"post\" }\n        }\n      },\n      {\n        name: \"unused\"\n        message {\n          name: \"Unused\"\n          args { name: \"foo\", by: \"'foo'\" }\n        }\n      },\n      {\n        // without name\n        message {\n          name: \"ForNameless\"\n          args { name: \"bar\", by: \"'bar'\" }\n        }\n      },\n      {\n        // assign typed-nil by custom resolver\n        name: \"typed_nil\"\n        message {\n          name: \"TypedNil\"\n        }\n      },\n      {\n        name: \"null_check\"\n        if: \"typed_nil == null\" // replace `grpc.federation.cast.null_value(typed_nil) == null` by EvalCEL function\n        by: \"true\"\n      },\n      {\n        if: \"typed_nil == null\"\n        by: \"grpc.federation.log.info('output typed_nil', {'result': typed_nil == null})\"\n      }\n    ]\n  };\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  User user = 4 [(grpc.federation.field).custom_resolver = true];\n  bool null_check = 5 [(grpc.federation.field).by = \"null_check\"];\n}\n\nmessage User {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"user.UserService/GetUser\"\n        request { field: \"id\", by: \"$.user_id\" }\n      }\n    }\n    def { name: \"u\", by: \"res.user\" }\n    custom_resolver: true\n  };\n  string id = 1;\n  string name = 2 [(grpc.federation.field).custom_resolver = true];\n}\n\nmessage Unused {\n  option (grpc.federation.message).custom_resolver = true;\n  string foo = 1;\n}\n\nmessage ForNameless {\n  option (grpc.federation.message).custom_resolver = true;\n  string bar = 1;\n}\n\nmessage TypedNil {\n  option (grpc.federation.message).custom_resolver = true;\n}"
  },
  {
    "path": "_examples/03_custom_resolver/proto/federation/other.proto",
    "content": "syntax = \"proto3\";\n\npackage federation.v2dev;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nmessage Ref {\n  string a = 1 [(grpc.federation.field).by = \"grpc.federation.env.a\"];\n}"
  },
  {
    "path": "_examples/03_custom_resolver/proto/post/post.proto",
    "content": "syntax = \"proto3\";\n\npackage post;\n\noption go_package = \"example/post;post\";\n\nservice PostService {\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n  rpc GetPosts(GetPostsRequest) returns (GetPostsResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  Post post = 1;\n}\n\nmessage GetPostsRequest {\n  repeated string ids = 1;\n}\n\nmessage GetPostsResponse {\n  repeated Post posts = 1;\n}\n\nmessage Post {\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  string user_id = 4;\n}\n"
  },
  {
    "path": "_examples/03_custom_resolver/proto/user/user.proto",
    "content": "syntax = \"proto3\";\n\npackage user;\n\noption go_package = \"example/user;user\";\n\nservice UserService {\n  rpc GetUser(GetUserRequest) returns (GetUserResponse) {};\n  rpc GetUsers(GetUsersRequest) returns (GetUsersResponse) {};\n}\n\nmessage GetUserRequest {\n  string id = 1;\n}\n\nmessage GetUserResponse {\n  User user = 1;\n}\n\nmessage GetUsersRequest {\n  repeated string ids = 1;\n}\n\nmessage GetUsersResponse {\n  repeated User users = 1;\n}\n\nmessage User {\n  string id = 1;\n  string name = 2;\n}\n"
  },
  {
    "path": "_examples/03_custom_resolver/user/user.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: user/user.proto\n\npackage user\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype GetUserRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetUserRequest) Reset() {\n\t*x = GetUserRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_user_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetUserRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetUserRequest) ProtoMessage() {}\n\nfunc (x *GetUserRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_user_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetUserRequest.ProtoReflect.Descriptor instead.\nfunc (*GetUserRequest) Descriptor() ([]byte, []int) {\n\treturn file_user_user_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetUserRequest) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\ntype GetUserResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUser *User `protobuf:\"bytes,1,opt,name=user,proto3\" json:\"user,omitempty\"`\n}\n\nfunc (x *GetUserResponse) Reset() {\n\t*x = GetUserResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_user_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetUserResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetUserResponse) ProtoMessage() {}\n\nfunc (x *GetUserResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_user_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetUserResponse.ProtoReflect.Descriptor instead.\nfunc (*GetUserResponse) Descriptor() ([]byte, []int) {\n\treturn file_user_user_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetUserResponse) GetUser() *User {\n\tif x != nil {\n\t\treturn x.User\n\t}\n\treturn nil\n}\n\ntype GetUsersRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tIds []string `protobuf:\"bytes,1,rep,name=ids,proto3\" json:\"ids,omitempty\"`\n}\n\nfunc (x *GetUsersRequest) Reset() {\n\t*x = GetUsersRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_user_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetUsersRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetUsersRequest) ProtoMessage() {}\n\nfunc (x *GetUsersRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_user_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetUsersRequest.ProtoReflect.Descriptor instead.\nfunc (*GetUsersRequest) Descriptor() ([]byte, []int) {\n\treturn file_user_user_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *GetUsersRequest) GetIds() []string {\n\tif x != nil {\n\t\treturn x.Ids\n\t}\n\treturn nil\n}\n\ntype GetUsersResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUsers []*User `protobuf:\"bytes,1,rep,name=users,proto3\" json:\"users,omitempty\"`\n}\n\nfunc (x *GetUsersResponse) Reset() {\n\t*x = GetUsersResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_user_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetUsersResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetUsersResponse) ProtoMessage() {}\n\nfunc (x *GetUsersResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_user_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetUsersResponse.ProtoReflect.Descriptor instead.\nfunc (*GetUsersResponse) Descriptor() ([]byte, []int) {\n\treturn file_user_user_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *GetUsersResponse) GetUsers() []*User {\n\tif x != nil {\n\t\treturn x.Users\n\t}\n\treturn nil\n}\n\ntype User struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId   string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *User) Reset() {\n\t*x = User{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_user_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *User) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*User) ProtoMessage() {}\n\nfunc (x *User) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_user_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use User.ProtoReflect.Descriptor instead.\nfunc (*User) Descriptor() ([]byte, []int) {\n\treturn file_user_user_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *User) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *User) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nvar File_user_user_proto protoreflect.FileDescriptor\n\nvar file_user_user_proto_rawDesc = []byte{\n\t0x0a, 0x0f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x20, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x55, 0x73,\n\t0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x31, 0x0a, 0x0f, 0x47, 0x65, 0x74,\n\t0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x04,\n\t0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x75, 0x73, 0x65,\n\t0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x23, 0x0a, 0x0f,\n\t0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,\n\t0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64,\n\t0x73, 0x22, 0x34, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73,\n\t0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72,\n\t0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x22, 0x2a, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12,\n\t0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12,\n\t0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x32, 0x84, 0x01, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x12, 0x38, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x14,\n\t0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x55,\n\t0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a,\n\t0x08, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x15, 0x2e, 0x75, 0x73, 0x65, 0x72,\n\t0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x1a, 0x16, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73,\n\t0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x58, 0x0a, 0x08, 0x63, 0x6f,\n\t0x6d, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x42, 0x09, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74,\n\t0x6f, 0x50, 0x01, 0x5a, 0x11, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x75, 0x73, 0x65,\n\t0x72, 0x3b, 0x75, 0x73, 0x65, 0x72, 0xa2, 0x02, 0x03, 0x55, 0x58, 0x58, 0xaa, 0x02, 0x04, 0x55,\n\t0x73, 0x65, 0x72, 0xca, 0x02, 0x04, 0x55, 0x73, 0x65, 0x72, 0xe2, 0x02, 0x10, 0x55, 0x73, 0x65,\n\t0x72, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x04,\n\t0x55, 0x73, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_user_user_proto_rawDescOnce sync.Once\n\tfile_user_user_proto_rawDescData = file_user_user_proto_rawDesc\n)\n\nfunc file_user_user_proto_rawDescGZIP() []byte {\n\tfile_user_user_proto_rawDescOnce.Do(func() {\n\t\tfile_user_user_proto_rawDescData = protoimpl.X.CompressGZIP(file_user_user_proto_rawDescData)\n\t})\n\treturn file_user_user_proto_rawDescData\n}\n\nvar file_user_user_proto_msgTypes = make([]protoimpl.MessageInfo, 5)\nvar file_user_user_proto_goTypes = []interface{}{\n\t(*GetUserRequest)(nil),   // 0: user.GetUserRequest\n\t(*GetUserResponse)(nil),  // 1: user.GetUserResponse\n\t(*GetUsersRequest)(nil),  // 2: user.GetUsersRequest\n\t(*GetUsersResponse)(nil), // 3: user.GetUsersResponse\n\t(*User)(nil),             // 4: user.User\n}\nvar file_user_user_proto_depIdxs = []int32{\n\t4, // 0: user.GetUserResponse.user:type_name -> user.User\n\t4, // 1: user.GetUsersResponse.users:type_name -> user.User\n\t0, // 2: user.UserService.GetUser:input_type -> user.GetUserRequest\n\t2, // 3: user.UserService.GetUsers:input_type -> user.GetUsersRequest\n\t1, // 4: user.UserService.GetUser:output_type -> user.GetUserResponse\n\t3, // 5: user.UserService.GetUsers:output_type -> user.GetUsersResponse\n\t4, // [4:6] is the sub-list for method output_type\n\t2, // [2:4] is the sub-list for method input_type\n\t2, // [2:2] is the sub-list for extension type_name\n\t2, // [2:2] is the sub-list for extension extendee\n\t0, // [0:2] is the sub-list for field type_name\n}\n\nfunc init() { file_user_user_proto_init() }\nfunc file_user_user_proto_init() {\n\tif File_user_user_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_user_user_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetUserRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_user_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetUserResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_user_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetUsersRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_user_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetUsersResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_user_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*User); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_user_user_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   5,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_user_user_proto_goTypes,\n\t\tDependencyIndexes: file_user_user_proto_depIdxs,\n\t\tMessageInfos:      file_user_user_proto_msgTypes,\n\t}.Build()\n\tFile_user_user_proto = out.File\n\tfile_user_user_proto_rawDesc = nil\n\tfile_user_user_proto_goTypes = nil\n\tfile_user_user_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/03_custom_resolver/user/user_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: user/user.proto\n\npackage user\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tUserService_GetUser_FullMethodName  = \"/user.UserService/GetUser\"\n\tUserService_GetUsers_FullMethodName = \"/user.UserService/GetUsers\"\n)\n\n// UserServiceClient is the client API for UserService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype UserServiceClient interface {\n\tGetUser(ctx context.Context, in *GetUserRequest, opts ...grpc.CallOption) (*GetUserResponse, error)\n\tGetUsers(ctx context.Context, in *GetUsersRequest, opts ...grpc.CallOption) (*GetUsersResponse, error)\n}\n\ntype userServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewUserServiceClient(cc grpc.ClientConnInterface) UserServiceClient {\n\treturn &userServiceClient{cc}\n}\n\nfunc (c *userServiceClient) GetUser(ctx context.Context, in *GetUserRequest, opts ...grpc.CallOption) (*GetUserResponse, error) {\n\tout := new(GetUserResponse)\n\terr := c.cc.Invoke(ctx, UserService_GetUser_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userServiceClient) GetUsers(ctx context.Context, in *GetUsersRequest, opts ...grpc.CallOption) (*GetUsersResponse, error) {\n\tout := new(GetUsersResponse)\n\terr := c.cc.Invoke(ctx, UserService_GetUsers_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// UserServiceServer is the server API for UserService service.\n// All implementations must embed UnimplementedUserServiceServer\n// for forward compatibility\ntype UserServiceServer interface {\n\tGetUser(context.Context, *GetUserRequest) (*GetUserResponse, error)\n\tGetUsers(context.Context, *GetUsersRequest) (*GetUsersResponse, error)\n\tmustEmbedUnimplementedUserServiceServer()\n}\n\n// UnimplementedUserServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedUserServiceServer struct {\n}\n\nfunc (UnimplementedUserServiceServer) GetUser(context.Context, *GetUserRequest) (*GetUserResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetUser not implemented\")\n}\nfunc (UnimplementedUserServiceServer) GetUsers(context.Context, *GetUsersRequest) (*GetUsersResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetUsers not implemented\")\n}\nfunc (UnimplementedUserServiceServer) mustEmbedUnimplementedUserServiceServer() {}\n\n// UnsafeUserServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to UserServiceServer will\n// result in compilation errors.\ntype UnsafeUserServiceServer interface {\n\tmustEmbedUnimplementedUserServiceServer()\n}\n\nfunc RegisterUserServiceServer(s grpc.ServiceRegistrar, srv UserServiceServer) {\n\ts.RegisterService(&UserService_ServiceDesc, srv)\n}\n\nfunc _UserService_GetUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetUserRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServiceServer).GetUser(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: UserService_GetUser_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServiceServer).GetUser(ctx, req.(*GetUserRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _UserService_GetUsers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetUsersRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServiceServer).GetUsers(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: UserService_GetUsers_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServiceServer).GetUsers(ctx, req.(*GetUsersRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// UserService_ServiceDesc is the grpc.ServiceDesc for UserService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar UserService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"user.UserService\",\n\tHandlerType: (*UserServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetUser\",\n\t\t\tHandler:    _UserService_GetUser_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetUsers\",\n\t\t\tHandler:    _UserService_GetUsers_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"user/user.proto\",\n}\n"
  },
  {
    "path": "_examples/04_timeout/.gitignore",
    "content": "grpc/federation\n"
  },
  {
    "path": "_examples/04_timeout/Makefile",
    "content": "MAKEFILE_DIR := $(dir $(lastword $(MAKEFILE_LIST)))\nGOBIN := $(MAKEFILE_DIR)/../../bin\nPATH := $(GOBIN):$(PATH)\n\nJAEGER_IMAGE := jaegertracing/all-in-one:latest\n\n.PHONY: generate\ngenerate:\n\t$(GOBIN)/buf generate\n\n.PHONY: lint\nlint:\n\t@$(GOBIN)/grpc-federation-linter -Iproto -Iproto_deps ./proto/federation/federation.proto\n\n.PHONY: test\ntest:\n\tgo test -race ./ -count=1\n\n.PHONY: grpc-federation/generate\ngrpc-federation/generate:\n\t@$(GOBIN)/grpc-federation-generator ./proto/federation/federation.proto\n\n.PHONY: grpc-federation/watch\ngrpc-federation/watch:\n\t@$(GOBIN)/grpc-federation-generator -w\n\n.PHONY: jaeger/start\njaeger/start:\n\t@docker run \\\n\t\t-e COLLECTOR_OTLP_ENABLED=true \\\n\t\t-p 16686:16686 \\\n\t\t-p 4317:4317 \\\n\t\t-p 4318:4318 \\\n\t\t-d \\\n\t\t$(JAEGER_IMAGE)\n\n.PHONY: jaeger/stop\njaeger/stop:\n\t@docker stop $(shell docker ps -q  --filter ancestor=$(JAEGER_IMAGE))\n"
  },
  {
    "path": "_examples/04_timeout/buf.gen.yaml",
    "content": "version: v1\nmanaged:\n  enabled: true\nplugins:\n  - plugin: go\n    out: .\n    opt: paths=source_relative\n  - plugin: go-grpc\n    out: .\n    opt: paths=source_relative\n  - plugin: grpc-federation\n    out: .\n    opt:\n    - paths=source_relative\n    - import_paths=proto\n"
  },
  {
    "path": "_examples/04_timeout/buf.work.yaml",
    "content": "version: v1\ndirectories:\n  - proto\n  - proto_deps\n"
  },
  {
    "path": "_examples/04_timeout/federation/federation.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tdescriptorpb \"google.golang.org/protobuf/types/descriptorpb\"\n\temptypb \"google.golang.org/protobuf/types/known/emptypb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Ext struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tFoo string `protobuf:\"bytes,1,opt,name=foo,proto3\" json:\"foo,omitempty\"`\n}\n\nfunc (x *Ext) Reset() {\n\t*x = Ext{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Ext) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Ext) ProtoMessage() {}\n\nfunc (x *Ext) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Ext.ProtoReflect.Descriptor instead.\nfunc (*Ext) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Ext) GetFoo() string {\n\tif x != nil {\n\t\treturn x.Foo\n\t}\n\treturn \"\"\n}\n\ntype GetPostRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetPostRequest) Reset() {\n\t*x = GetPostRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostRequest) ProtoMessage() {}\n\nfunc (x *GetPostRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostRequest.ProtoReflect.Descriptor instead.\nfunc (*GetPostRequest) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetPostRequest) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\ntype GetPostResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPost *Post `protobuf:\"bytes,1,opt,name=post,proto3\" json:\"post,omitempty\"`\n}\n\nfunc (x *GetPostResponse) Reset() {\n\t*x = GetPostResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostResponse) ProtoMessage() {}\n\nfunc (x *GetPostResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostResponse.ProtoReflect.Descriptor instead.\nfunc (*GetPostResponse) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *GetPostResponse) GetPost() *Post {\n\tif x != nil {\n\t\treturn x.Post\n\t}\n\treturn nil\n}\n\ntype Post struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId      string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tTitle   string `protobuf:\"bytes,2,opt,name=title,proto3\" json:\"title,omitempty\"`\n\tContent string `protobuf:\"bytes,3,opt,name=content,proto3\" json:\"content,omitempty\"`\n}\n\nfunc (x *Post) Reset() {\n\t*x = Post{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Post) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Post) ProtoMessage() {}\n\nfunc (x *Post) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Post.ProtoReflect.Descriptor instead.\nfunc (*Post) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *Post) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetTitle() string {\n\tif x != nil {\n\t\treturn x.Title\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetContent() string {\n\tif x != nil {\n\t\treturn x.Content\n\t}\n\treturn \"\"\n}\n\ntype UpdatePostRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *UpdatePostRequest) Reset() {\n\t*x = UpdatePostRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *UpdatePostRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UpdatePostRequest) ProtoMessage() {}\n\nfunc (x *UpdatePostRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UpdatePostRequest.ProtoReflect.Descriptor instead.\nfunc (*UpdatePostRequest) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *UpdatePostRequest) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\ntype UpdatePostResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *UpdatePostResponse) Reset() {\n\t*x = UpdatePostResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *UpdatePostResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UpdatePostResponse) ProtoMessage() {}\n\nfunc (x *UpdatePostResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UpdatePostResponse.ProtoReflect.Descriptor instead.\nfunc (*UpdatePostResponse) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{5}\n}\n\nvar file_federation_federation_proto_extTypes = []protoimpl.ExtensionInfo{\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*Ext)(nil),\n\t\tField:         70001,\n\t\tName:          \"federation.ext\",\n\t\tTag:           \"bytes,70001,opt,name=ext\",\n\t\tFilename:      \"federation/federation.proto\",\n\t},\n}\n\n// Extension fields to descriptorpb.MethodOptions.\nvar (\n\t// optional federation.Ext ext = 70001;\n\tE_Ext = &file_federation_federation_proto_extTypes[0]\n)\n\nvar File_federation_federation_proto protoreflect.FileDescriptor\n\nvar file_federation_federation_proto_rawDesc = []byte{\n\t0x0a, 0x1b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x20, 0x67, 0x72, 0x70, 0x63, 0x2f,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73,\n\t0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65,\n\t0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x17, 0x0a, 0x03, 0x45, 0x78,\n\t0x74, 0x12, 0x10, 0x0a, 0x03, 0x66, 0x6f, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03,\n\t0x66, 0x6f, 0x6f, 0x22, 0x20, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65,\n\t0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x63, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74,\n\t0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x04, 0x70, 0x6f, 0x73, 0x74,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x42, 0x09, 0x9a, 0x4a, 0x06, 0x12, 0x04, 0x70,\n\t0x6f, 0x73, 0x74, 0x52, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x3a, 0x1f, 0x9a, 0x4a, 0x1c, 0x0a, 0x1a,\n\t0x0a, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x6a, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x73, 0x74, 0x12, 0x0a,\n\t0x0a, 0x02, 0x69, 0x64, 0x12, 0x04, 0x24, 0x2e, 0x69, 0x64, 0x22, 0x8e, 0x01, 0x0a, 0x04, 0x50,\n\t0x6f, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74,\n\t0x65, 0x6e, 0x74, 0x3a, 0x46, 0x9a, 0x4a, 0x43, 0x0a, 0x2d, 0x0a, 0x03, 0x72, 0x65, 0x73, 0x72,\n\t0x26, 0x0a, 0x18, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x2f, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x12, 0x0a, 0x0a, 0x02, 0x69,\n\t0x64, 0x12, 0x04, 0x24, 0x2e, 0x69, 0x64, 0x0a, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x18,\n\t0x01, 0x5a, 0x08, 0x72, 0x65, 0x73, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x23, 0x0a, 0x11, 0x55,\n\t0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64,\n\t0x22, 0x77, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65,\n\t0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3a, 0x61, 0x9a, 0x4a, 0x5e, 0x0a, 0x2f, 0x72, 0x2d, 0x0a,\n\t0x1b, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,\n\t0x65, 0x2f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x73, 0x74, 0x12, 0x0a, 0x0a, 0x02,\n\t0x69, 0x64, 0x12, 0x04, 0x24, 0x2e, 0x69, 0x64, 0x1a, 0x02, 0x33, 0x73, 0x0a, 0x2b, 0x72, 0x29,\n\t0x0a, 0x1b, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69,\n\t0x63, 0x65, 0x2f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x73, 0x74, 0x12, 0x0a, 0x0a,\n\t0x02, 0x69, 0x64, 0x12, 0x04, 0x24, 0x2e, 0x69, 0x64, 0x32, 0xcc, 0x01, 0x0a, 0x11, 0x46, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12,\n\t0x54, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x12, 0x1a, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52,\n\t0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f,\n\t0x6e, 0x73, 0x65, 0x22, 0x10, 0x9a, 0x4a, 0x04, 0x0a, 0x02, 0x31, 0x73, 0x8a, 0x97, 0x22, 0x05,\n\t0x0a, 0x03, 0x78, 0x78, 0x78, 0x12, 0x5c, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50,\n\t0x6f, 0x73, 0x74, 0x12, 0x1d, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,\n\t0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x17, 0x9a, 0x4a, 0x14, 0x12,\n\t0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f,\n\t0x6e, 0x73, 0x65, 0x1a, 0x03, 0x9a, 0x4a, 0x00, 0x3a, 0x43, 0x0a, 0x03, 0x65, 0x78, 0x74, 0x12,\n\t0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,\n\t0xf1, 0xa2, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x78, 0x74, 0x52, 0x03, 0x65, 0x78, 0x74, 0x42, 0x9c, 0x01,\n\t0x9a, 0x4a, 0x11, 0x12, 0x0f, 0x70, 0x6f, 0x73, 0x74, 0x2f, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0f, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x1d, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,\n\t0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xa2, 0x02, 0x03, 0x46, 0x58, 0x58, 0xaa, 0x02, 0x0a, 0x46,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xca, 0x02, 0x0a, 0x46, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xe2, 0x02, 0x16, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea,\n\t0x02, 0x0a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_federation_federation_proto_rawDescOnce sync.Once\n\tfile_federation_federation_proto_rawDescData = file_federation_federation_proto_rawDesc\n)\n\nfunc file_federation_federation_proto_rawDescGZIP() []byte {\n\tfile_federation_federation_proto_rawDescOnce.Do(func() {\n\t\tfile_federation_federation_proto_rawDescData = protoimpl.X.CompressGZIP(file_federation_federation_proto_rawDescData)\n\t})\n\treturn file_federation_federation_proto_rawDescData\n}\n\nvar file_federation_federation_proto_msgTypes = make([]protoimpl.MessageInfo, 6)\nvar file_federation_federation_proto_goTypes = []interface{}{\n\t(*Ext)(nil),                        // 0: federation.Ext\n\t(*GetPostRequest)(nil),             // 1: federation.GetPostRequest\n\t(*GetPostResponse)(nil),            // 2: federation.GetPostResponse\n\t(*Post)(nil),                       // 3: federation.Post\n\t(*UpdatePostRequest)(nil),          // 4: federation.UpdatePostRequest\n\t(*UpdatePostResponse)(nil),         // 5: federation.UpdatePostResponse\n\t(*descriptorpb.MethodOptions)(nil), // 6: google.protobuf.MethodOptions\n\t(*emptypb.Empty)(nil),              // 7: google.protobuf.Empty\n}\nvar file_federation_federation_proto_depIdxs = []int32{\n\t3, // 0: federation.GetPostResponse.post:type_name -> federation.Post\n\t6, // 1: federation.ext:extendee -> google.protobuf.MethodOptions\n\t0, // 2: federation.ext:type_name -> federation.Ext\n\t1, // 3: federation.FederationService.GetPost:input_type -> federation.GetPostRequest\n\t4, // 4: federation.FederationService.UpdatePost:input_type -> federation.UpdatePostRequest\n\t2, // 5: federation.FederationService.GetPost:output_type -> federation.GetPostResponse\n\t7, // 6: federation.FederationService.UpdatePost:output_type -> google.protobuf.Empty\n\t5, // [5:7] is the sub-list for method output_type\n\t3, // [3:5] is the sub-list for method input_type\n\t2, // [2:3] is the sub-list for extension type_name\n\t1, // [1:2] is the sub-list for extension extendee\n\t0, // [0:1] is the sub-list for field type_name\n}\n\nfunc init() { file_federation_federation_proto_init() }\nfunc file_federation_federation_proto_init() {\n\tif File_federation_federation_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_federation_federation_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Ext); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Post); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*UpdatePostRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*UpdatePostResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_federation_federation_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   6,\n\t\t\tNumExtensions: 1,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_federation_federation_proto_goTypes,\n\t\tDependencyIndexes: file_federation_federation_proto_depIdxs,\n\t\tMessageInfos:      file_federation_federation_proto_msgTypes,\n\t\tExtensionInfos:    file_federation_federation_proto_extTypes,\n\t}.Build()\n\tFile_federation_federation_proto = out.File\n\tfile_federation_federation_proto_rawDesc = nil\n\tfile_federation_federation_proto_goTypes = nil\n\tfile_federation_federation_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/04_timeout/federation/federation_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n\temptypb \"google.golang.org/protobuf/types/known/emptypb\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tFederationService_GetPost_FullMethodName    = \"/federation.FederationService/GetPost\"\n\tFederationService_UpdatePost_FullMethodName = \"/federation.FederationService/UpdatePost\"\n)\n\n// FederationServiceClient is the client API for FederationService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype FederationServiceClient interface {\n\tGetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error)\n\tUpdatePost(ctx context.Context, in *UpdatePostRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)\n}\n\ntype federationServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewFederationServiceClient(cc grpc.ClientConnInterface) FederationServiceClient {\n\treturn &federationServiceClient{cc}\n}\n\nfunc (c *federationServiceClient) GetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error) {\n\tout := new(GetPostResponse)\n\terr := c.cc.Invoke(ctx, FederationService_GetPost_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *federationServiceClient) UpdatePost(ctx context.Context, in *UpdatePostRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {\n\tout := new(emptypb.Empty)\n\terr := c.cc.Invoke(ctx, FederationService_UpdatePost_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// FederationServiceServer is the server API for FederationService service.\n// All implementations must embed UnimplementedFederationServiceServer\n// for forward compatibility\ntype FederationServiceServer interface {\n\tGetPost(context.Context, *GetPostRequest) (*GetPostResponse, error)\n\tUpdatePost(context.Context, *UpdatePostRequest) (*emptypb.Empty, error)\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\n// UnimplementedFederationServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedFederationServiceServer struct {\n}\n\nfunc (UnimplementedFederationServiceServer) GetPost(context.Context, *GetPostRequest) (*GetPostResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetPost not implemented\")\n}\nfunc (UnimplementedFederationServiceServer) UpdatePost(context.Context, *UpdatePostRequest) (*emptypb.Empty, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method UpdatePost not implemented\")\n}\nfunc (UnimplementedFederationServiceServer) mustEmbedUnimplementedFederationServiceServer() {}\n\n// UnsafeFederationServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to FederationServiceServer will\n// result in compilation errors.\ntype UnsafeFederationServiceServer interface {\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\nfunc RegisterFederationServiceServer(s grpc.ServiceRegistrar, srv FederationServiceServer) {\n\ts.RegisterService(&FederationService_ServiceDesc, srv)\n}\n\nfunc _FederationService_GetPost_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetPostRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(FederationServiceServer).GetPost(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: FederationService_GetPost_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(FederationServiceServer).GetPost(ctx, req.(*GetPostRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _FederationService_UpdatePost_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(UpdatePostRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(FederationServiceServer).UpdatePost(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: FederationService_UpdatePost_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(FederationServiceServer).UpdatePost(ctx, req.(*UpdatePostRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// FederationService_ServiceDesc is the grpc.ServiceDesc for FederationService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar FederationService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"federation.FederationService\",\n\tHandlerType: (*FederationServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetPost\",\n\t\t\tHandler:    _FederationService_GetPost_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"UpdatePost\",\n\t\t\tHandler:    _FederationService_UpdatePost_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"federation/federation.proto\",\n}\n"
  },
  {
    "path": "_examples/04_timeout/federation/federation_grpc_federation.pb.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: federation/federation.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n\t\"google.golang.org/protobuf/types/known/emptypb\"\n\n\tpost \"example/post\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Federation_GetPostResponseVariable represents variable definitions in \"federation.GetPostResponse\".\ntype FederationService_Federation_GetPostResponseVariable struct {\n\tPost *Post\n}\n\n// Federation_GetPostResponseArgument is argument for \"federation.GetPostResponse\" message.\ntype FederationService_Federation_GetPostResponseArgument struct {\n\tId string\n\tFederationService_Federation_GetPostResponseVariable\n}\n\n// Federation_PostVariable represents variable definitions in \"federation.Post\".\ntype FederationService_Federation_PostVariable struct {\n\tPost *post.Post\n\tRes  *post.GetPostResponse\n}\n\n// Federation_PostArgument is argument for \"federation.Post\" message.\ntype FederationService_Federation_PostArgument struct {\n\tId string\n\tFederationService_Federation_PostVariable\n}\n\n// Federation_UpdatePostResponseVariable represents variable definitions in \"federation.UpdatePostResponse\".\ntype FederationService_Federation_UpdatePostResponseVariable struct {\n}\n\n// Federation_UpdatePostResponseArgument is argument for \"federation.UpdatePostResponse\" message.\ntype FederationService_Federation_UpdatePostResponseArgument struct {\n\tId string\n\tFederationService_Federation_UpdatePostResponseVariable\n}\n\n// FederationServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationServiceConfig struct {\n\t// Client provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\n\t// If this interface is not provided, an error is returned during initialization.\n\tClient FederationServiceClientFactory // required\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationServiceClientFactory interface {\n\t// Post_PostServiceClient create a gRPC Client to be used to call methods in post.PostService.\n\tPost_PostServiceClient(FederationServiceClientConfig) (post.PostServiceClient, error)\n}\n\n// FederationServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationServiceDependentClientSet struct {\n\tPost_PostServiceClient post.PostServiceClient\n}\n\n// FederationServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationServiceResolver interface {\n}\n\n// FederationServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// FederationServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationServiceUnimplementedResolver struct{}\n\nconst (\n\tFederationService_DependentMethod_Post_PostService_DeletePost = \"/post.PostService/DeletePost\"\n\tFederationService_DependentMethod_Post_PostService_GetPost    = \"/post.PostService/GetPost\"\n\tFederationService_DependentMethod_Post_PostService_UpdatePost = \"/post.PostService/UpdatePost\"\n)\n\n// FederationService represents Federation Service.\ntype FederationService struct {\n\tUnimplementedFederationServiceServer\n\tcfg             FederationServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationServiceDependentClientSet\n}\n\n// NewFederationService creates FederationService instance by FederationServiceConfig.\nfunc NewFederationService(cfg FederationServiceConfig) (*FederationService, error) {\n\tif cfg.Client == nil {\n\t\treturn nil, grpcfed.ErrClientConfig\n\t}\n\tPost_PostServiceClient, err := cfg.Client.Post_PostServiceClient(FederationServiceClientConfig{\n\t\tService: \"post.PostService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"federation.FederationService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.federation.GetPostResponseArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.federation.PostArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.federation.UpdatePostResponseArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.GRPCErrorAccessorOptions(celTypeHelper, \"post.DeletePostResponse\")...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.GRPCErrorAccessorOptions(celTypeHelper, \"post.GetPostResponse\")...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.GRPCErrorAccessorOptions(celTypeHelper, \"post.UpdatePostResponse\")...)\n\tsvc := &FederationService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tclient: &FederationServiceDependentClientSet{\n\t\t\tPost_PostServiceClient: Post_PostServiceClient,\n\t\t},\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationService(ctx context.Context, svc *FederationService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n// GetPost implements \"federation.FederationService/GetPost\" method.\nfunc (s *FederationService) GetPost(ctx context.Context, req *GetPostRequest) (res *GetPostResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.FederationService/GetPost\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := grpcfed.WithTimeout[GetPostResponse](ctx, \"federation.FederationService/GetPost\", 1000000000 /* 1s */, func(ctx context.Context) (*GetPostResponse, error) {\n\t\treturn s.resolve_Federation_GetPostResponse(ctx, &FederationService_Federation_GetPostResponseArgument{\n\t\t\tId: req.GetId(),\n\t\t})\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// UpdatePost implements \"federation.FederationService/UpdatePost\" method.\nfunc (s *FederationService) UpdatePost(ctx context.Context, req *UpdatePostRequest) (res *emptypb.Empty, e error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.FederationService/UpdatePost\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tcustomRes, err := s.resolve_Federation_UpdatePostResponse(ctx, &FederationService_Federation_UpdatePostResponseArgument{\n\t\tId: req.GetId(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\tret, err := s.cast_Federation_UpdatePostResponse__to__Google_Protobuf_Empty(customRes)\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn ret, nil\n}\n\n// resolve_Federation_GetPostResponse resolve \"federation.GetPostResponse\" message.\nfunc (s *FederationService) resolve_Federation_GetPostResponse(ctx context.Context, req *FederationService_Federation_GetPostResponseArgument) (*GetPostResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.GetPostResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.GetPostResponse\", slog.Any(\"message_args\", s.logvalue_Federation_GetPostResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tPost *Post\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.federation.GetPostResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"post\"\n\t\t  message {\n\t\t    name: \"Post\"\n\t\t    args { name: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_post := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Post, *localValueType]{\n\t\t\tName: `post`,\n\t\t\tType: grpcfed.CELObjectType(\"federation.Post\"),\n\t\t\tSetter: func(value *localValueType, v *Post) error {\n\t\t\t\tvalue.vars.Post = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Federation_PostArgument{}\n\t\t\t\t// { name: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 1,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Federation_Post(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_post(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Federation_GetPostResponseVariable.Post = value.vars.Post\n\n\t// create a message value to be returned.\n\tret := &GetPostResponse{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"post\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*Post]{\n\t\tValue:      value,\n\t\tExpr:       `post`,\n\t\tCacheIndex: 2,\n\t\tSetter: func(v *Post) error {\n\t\t\tret.Post = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.GetPostResponse\", slog.Any(\"federation.GetPostResponse\", s.logvalue_Federation_GetPostResponse(ret)))\n\treturn ret, nil\n}\n\n// resolve_Federation_Post resolve \"federation.Post\" message.\nfunc (s *FederationService) resolve_Federation_Post(ctx context.Context, req *FederationService_Federation_PostArgument) (*Post, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.Post\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.Post\", slog.Any(\"message_args\", s.logvalue_Federation_PostArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tPost *post.Post\n\t\t\tRes  *post.GetPostResponse\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.federation.PostArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"post.PostService/GetPost\"\n\t\t    request { field: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.GetPostResponse, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"post.GetPostResponse\"),\n\t\t\tSetter: func(value *localValueType, v *post.GetPostResponse) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &post.GetPostRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 3,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call post.PostService/GetPost\", slog.Any(\"post.GetPostRequest\", s.logvalue_Post_GetPostRequest(args)))\n\t\t\t\tret, err := s.client.Post_PostServiceClient.GetPost(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Post_PostService_GetPost, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"post\"\n\t\t  autobind: true\n\t\t  by: \"res.post\"\n\t\t}\n\t*/\n\tdef_post := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.Post, *localValueType]{\n\t\t\tName: `post`,\n\t\t\tType: grpcfed.CELObjectType(\"post.Post\"),\n\t\t\tSetter: func(value *localValueType, v *post.Post) error {\n\t\t\t\tvalue.vars.Post = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `res.post`,\n\t\t\tByCacheIndex: 4,\n\t\t})\n\t}\n\n\tif err := def_res(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\tif err := def_post(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Federation_PostVariable.Post = value.vars.Post\n\treq.FederationService_Federation_PostVariable.Res = value.vars.Res\n\n\t// create a message value to be returned.\n\tret := &Post{}\n\n\t// field binding section.\n\tret.Id = value.vars.Post.GetId()           // { name: \"post\", autobind: true }\n\tret.Title = value.vars.Post.GetTitle()     // { name: \"post\", autobind: true }\n\tret.Content = value.vars.Post.GetContent() // { name: \"post\", autobind: true }\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.Post\", slog.Any(\"federation.Post\", s.logvalue_Federation_Post(ret)))\n\treturn ret, nil\n}\n\n// resolve_Federation_UpdatePostResponse resolve \"federation.UpdatePostResponse\" message.\nfunc (s *FederationService) resolve_Federation_UpdatePostResponse(ctx context.Context, req *FederationService_Federation_UpdatePostResponseArgument) (*UpdatePostResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.UpdatePostResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.UpdatePostResponse\", slog.Any(\"message_args\", s.logvalue_Federation_UpdatePostResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tXDef0 *post.UpdatePostResponse\n\t\t\tXDef1 *post.DeletePostResponse\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.federation.UpdatePostResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"_def0\"\n\t\t  call {\n\t\t    method: \"post.PostService/UpdatePost\"\n\t\t    request { field: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef__def0 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.UpdatePostResponse, *localValueType]{\n\t\t\tName: `_def0`,\n\t\t\tType: grpcfed.CELObjectType(\"post.UpdatePostResponse\"),\n\t\t\tSetter: func(value *localValueType, v *post.UpdatePostResponse) error {\n\t\t\t\tvalue.vars.XDef0 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &post.UpdatePostRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 5,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call post.PostService/UpdatePost\", slog.Any(\"post.UpdatePostRequest\", s.logvalue_Post_UpdatePostRequest(args)))\n\t\t\t\tret, err := grpcfed.WithTimeout[post.UpdatePostResponse](ctx, \"post.PostService/UpdatePost\", 3000000000 /* 3s */, func(ctx context.Context) (*post.UpdatePostResponse, error) {\n\t\t\t\t\treturn s.client.Post_PostServiceClient.UpdatePost(ctx, args)\n\t\t\t\t})\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Post_PostService_UpdatePost, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"_def1\"\n\t\t  call {\n\t\t    method: \"post.PostService/DeletePost\"\n\t\t    request { field: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef__def1 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.DeletePostResponse, *localValueType]{\n\t\t\tName: `_def1`,\n\t\t\tType: grpcfed.CELObjectType(\"post.DeletePostResponse\"),\n\t\t\tSetter: func(value *localValueType, v *post.DeletePostResponse) error {\n\t\t\t\tvalue.vars.XDef1 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &post.DeletePostRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 6,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call post.PostService/DeletePost\", slog.Any(\"post.DeletePostRequest\", s.logvalue_Post_DeletePostRequest(args)))\n\t\t\t\tret, err := s.client.Post_PostServiceClient.DeletePost(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Post_PostService_DeletePost, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t   _def0 ─┐\n\t   _def1 ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def__def0(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def__def1(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// create a message value to be returned.\n\tret := &UpdatePostResponse{}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.UpdatePostResponse\", slog.Any(\"federation.UpdatePostResponse\", s.logvalue_Federation_UpdatePostResponse(ret)))\n\treturn ret, nil\n}\n\n// cast_Federation_UpdatePostResponse__to__Google_Protobuf_Empty cast from \"federation.UpdatePostResponse\" to \"google.protobuf.Empty\".\nfunc (s *FederationService) cast_Federation_UpdatePostResponse__to__Google_Protobuf_Empty(from *UpdatePostResponse) (*emptypb.Empty, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tret := &emptypb.Empty{}\n\n\treturn ret, nil\n}\n\nfunc (s *FederationService) logvalue_Federation_GetPostResponse(v *GetPostResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"post\", s.logvalue_Federation_Post(v.GetPost())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Federation_GetPostResponseArgument(v *FederationService_Federation_GetPostResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Federation_Post(v *Post) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.String(\"title\", v.GetTitle()),\n\t\tslog.String(\"content\", v.GetContent()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Federation_PostArgument(v *FederationService_Federation_PostArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Federation_UpdatePostResponse(v *UpdatePostResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Federation_UpdatePostResponseArgument(v *FederationService_Federation_UpdatePostResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Post_DeletePostRequest(v *post.DeletePostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Post_GetPostRequest(v *post.GetPostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Post_UpdatePostRequest(v *post.UpdatePostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t)\n}\n"
  },
  {
    "path": "_examples/04_timeout/go.mod",
    "content": "module example\n\ngo 1.24.0\n\nreplace github.com/mercari/grpc-federation => ../../\n\nrequire (\n\tgithub.com/mercari/grpc-federation v0.0.0-00010101000000-000000000000\n\tgo.opentelemetry.io/otel v1.24.0\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0\n\tgo.opentelemetry.io/otel/sdk v1.24.0\n\tgo.opentelemetry.io/otel/trace v1.24.0\n\tgo.uber.org/goleak v1.3.0\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7\n\tgoogle.golang.org/grpc v1.65.0\n\tgoogle.golang.org/protobuf v1.34.2\n)\n\nrequire (\n\tcel.dev/expr v0.19.1 // indirect\n\tgithub.com/antlr4-go/antlr/v4 v4.13.0 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.2.1 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/goccy/wasi-go v0.3.2 // indirect\n\tgithub.com/google/cel-go v0.23.1 // indirect\n\tgithub.com/google/uuid v1.6.0 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect\n\tgithub.com/kelseyhightower/envconfig v1.4.0 // indirect\n\tgithub.com/stealthrocket/wazergo v0.19.1 // indirect\n\tgithub.com/stoewer/go-strcase v1.3.0 // indirect\n\tgithub.com/tetratelabs/wazero v1.10.1 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.24.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.0.0 // indirect\n\tgolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect\n\tgolang.org/x/net v0.38.0 // indirect\n\tgolang.org/x/sync v0.14.0 // indirect\n\tgolang.org/x/sys v0.37.0 // indirect\n\tgolang.org/x/text v0.23.0 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 // indirect\n)\n"
  },
  {
    "path": "_examples/04_timeout/go.sum",
    "content": "cel.dev/expr v0.19.1 h1:NciYrtDRIR0lNCnH1LFJegdjspNx9fI59O7TWcua/W4=\ncel.dev/expr v0.19.1/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw=\ngithub.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=\ngithub.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/goccy/wasi-go v0.3.2 h1:wAvGXmqCkfcp0B0AwIp5Ya53hzDwkKm9W8iuT3nCCz0=\ngithub.com/goccy/wasi-go v0.3.2/go.mod h1:nIKD204n9xa4Z20UV+XA483kIr9TAl2vXr+X5qVAO5M=\ngithub.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4=\ngithub.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=\ngithub.com/google/cel-go v0.23.1 h1:91ThhEZlBcE5rB2adBVXqvDoqdL8BG2oyhd0bK1I/r4=\ngithub.com/google/cel-go v0.23.1/go.mod h1:52Pb6QsDbC5kvgxvZhiL9QX1oZEkcUF/ZqaPx1J5Wwo=\ngithub.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\ngithub.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg=\ngithub.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=\ngithub.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/stealthrocket/wazergo v0.19.1 h1:BPrITETPgSFwiytwmToO0MbUC/+RGC39JScz1JmmG6c=\ngithub.com/stealthrocket/wazergo v0.19.1/go.mod h1:riI0hxw4ndZA5e6z7PesHg2BtTftcZaMxRcoiGGipTs=\ngithub.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs=\ngithub.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tetratelabs/wazero v1.10.1 h1:2DugeJf6VVk58KTPszlNfeeN8AhhpwcZqkJj2wwFuH8=\ngithub.com/tetratelabs/wazero v1.10.1/go.mod h1:DRm5twOQ5Gr1AoEdSi0CLjDQF1J9ZAuyqFIjl1KKfQU=\ngo.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo=\ngo.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0=\ngo.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI=\ngo.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=\ngo.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw=\ngo.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg=\ngo.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=\ngo.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=\ngo.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=\ngo.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=\ngolang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=\ngolang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=\ngolang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=\ngolang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=\ngolang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=\ngolang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=\ngolang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 h1:YcyjlL1PRr2Q17/I0dPk2JmYS5CDXfcdb2Z3YRioEbw=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7 h1:2035KHhUv+EpyB+hWgJnaWKJOdX1E95w2S8Rr4uWKTs=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=\ngoogle.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=\ngoogle.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=\ngoogle.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=\ngoogle.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "_examples/04_timeout/grpc/federation/federation.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: grpc/federation/federation.proto\n\npackage federation\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\tcode \"google.golang.org/genproto/googleapis/rpc/code\"\n\terrdetails \"google.golang.org/genproto/googleapis/rpc/errdetails\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tdescriptorpb \"google.golang.org/protobuf/types/descriptorpb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// TypeKind is primitive kind list.\ntype TypeKind int32\n\nconst (\n\t// UNKNOWN represents unexpected value.\n\tTypeKind_UNKNOWN TypeKind = 0\n\t// STRING is used to convert the input value to `string` type.\n\tTypeKind_STRING TypeKind = 1\n\t// BOOL is used to convert the input value to `bool` type.\n\tTypeKind_BOOL TypeKind = 2\n\t// INT64 is used to convert the input value to `int64` type.\n\tTypeKind_INT64 TypeKind = 3\n\t// UINT64 is used to convert the input value to `uint64` type.\n\tTypeKind_UINT64 TypeKind = 4\n\t// DOUBLE is used to convert the input value to `double` type.\n\tTypeKind_DOUBLE TypeKind = 5\n\t// DURATION is used to convert the input value to the `google.protobuf.Duration` type.\n\tTypeKind_DURATION TypeKind = 6\n)\n\n// Enum value maps for TypeKind.\nvar (\n\tTypeKind_name = map[int32]string{\n\t\t0: \"UNKNOWN\",\n\t\t1: \"STRING\",\n\t\t2: \"BOOL\",\n\t\t3: \"INT64\",\n\t\t4: \"UINT64\",\n\t\t5: \"DOUBLE\",\n\t\t6: \"DURATION\",\n\t}\n\tTypeKind_value = map[string]int32{\n\t\t\"UNKNOWN\":  0,\n\t\t\"STRING\":   1,\n\t\t\"BOOL\":     2,\n\t\t\"INT64\":    3,\n\t\t\"UINT64\":   4,\n\t\t\"DOUBLE\":   5,\n\t\t\"DURATION\": 6,\n\t}\n)\n\nfunc (x TypeKind) Enum() *TypeKind {\n\tp := new(TypeKind)\n\t*p = x\n\treturn p\n}\n\nfunc (x TypeKind) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (TypeKind) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_grpc_federation_federation_proto_enumTypes[0].Descriptor()\n}\n\nfunc (TypeKind) Type() protoreflect.EnumType {\n\treturn &file_grpc_federation_federation_proto_enumTypes[0]\n}\n\nfunc (x TypeKind) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use TypeKind.Descriptor instead.\nfunc (TypeKind) EnumDescriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\n// LogLevel is the importance or severity of a log event.\ntype GRPCError_LogLevel int32\n\nconst (\n\t// UNKNOWN represents unexpected value.\n\tGRPCError_UNKNOWN GRPCError_LogLevel = 0\n\t// DEBUG is used for detailed information that is useful during development and debugging.\n\tGRPCError_DEBUG GRPCError_LogLevel = 1\n\t// INFO logs are used to provide information about the normal functioning of the application.\n\tGRPCError_INFO GRPCError_LogLevel = 2\n\t// WARN signifies a potential problem or warning that does not necessarily stop the program from working but may lead to issues in the future.\n\tGRPCError_WARN GRPCError_LogLevel = 3\n\t// ERROR indicates a serious issue that has caused a failure in the application.\n\tGRPCError_ERROR GRPCError_LogLevel = 4\n)\n\n// Enum value maps for GRPCError_LogLevel.\nvar (\n\tGRPCError_LogLevel_name = map[int32]string{\n\t\t0: \"UNKNOWN\",\n\t\t1: \"DEBUG\",\n\t\t2: \"INFO\",\n\t\t3: \"WARN\",\n\t\t4: \"ERROR\",\n\t}\n\tGRPCError_LogLevel_value = map[string]int32{\n\t\t\"UNKNOWN\": 0,\n\t\t\"DEBUG\":   1,\n\t\t\"INFO\":    2,\n\t\t\"WARN\":    3,\n\t\t\"ERROR\":   4,\n\t}\n)\n\nfunc (x GRPCError_LogLevel) Enum() *GRPCError_LogLevel {\n\tp := new(GRPCError_LogLevel)\n\t*p = x\n\treturn p\n}\n\nfunc (x GRPCError_LogLevel) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (GRPCError_LogLevel) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_grpc_federation_federation_proto_enumTypes[1].Descriptor()\n}\n\nfunc (GRPCError_LogLevel) Type() protoreflect.EnumType {\n\treturn &file_grpc_federation_federation_proto_enumTypes[1]\n}\n\nfunc (x GRPCError_LogLevel) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use GRPCError_LogLevel.Descriptor instead.\nfunc (GRPCError_LogLevel) EnumDescriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{24, 0}\n}\n\ntype FileRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPlugin *CELPlugin `protobuf:\"bytes,1,opt,name=plugin,proto3\" json:\"plugin,omitempty\"`\n\t// import can be used to resolve methods, messages, etc. that are referenced in gRPC Federation rules.\n\tImport []string `protobuf:\"bytes,2,rep,name=import,proto3\" json:\"import,omitempty\"`\n}\n\nfunc (x *FileRule) Reset() {\n\t*x = FileRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *FileRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*FileRule) ProtoMessage() {}\n\nfunc (x *FileRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use FileRule.ProtoReflect.Descriptor instead.\nfunc (*FileRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *FileRule) GetPlugin() *CELPlugin {\n\tif x != nil {\n\t\treturn x.Plugin\n\t}\n\treturn nil\n}\n\nfunc (x *FileRule) GetImport() []string {\n\tif x != nil {\n\t\treturn x.Import\n\t}\n\treturn nil\n}\n\ntype EnumRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// alias mapping between enums defined in other packages and enums defined on the federation service side.\n\t// The alias is the FQDN ( <package-name>.<enum-name> ) to the enum.\n\t// If this definition exists, type conversion is automatically performed before the enum value assignment operation.\n\t// If a enum with this option has a value that is not present in the enum specified by alias, and the alias option is not specified for that value, an error is occurred.\n\t// You can specify multiple aliases. In that case, only values common to all aliases will be considered.\n\t// Specifying a value that is not included in either alias will result in an error.\n\tAlias []string `protobuf:\"bytes,1,rep,name=alias,proto3\" json:\"alias,omitempty\"`\n}\n\nfunc (x *EnumRule) Reset() {\n\t*x = EnumRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumRule) ProtoMessage() {}\n\nfunc (x *EnumRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumRule.ProtoReflect.Descriptor instead.\nfunc (*EnumRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *EnumRule) GetAlias() []string {\n\tif x != nil {\n\t\treturn x.Alias\n\t}\n\treturn nil\n}\n\ntype EnumValueRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// specifies the default value of the enum.\n\t// All values other than those specified in alias will be default values.\n\tDefault *bool `protobuf:\"varint,1,opt,name=default,proto3,oneof\" json:\"default,omitempty\"`\n\t// alias can be used when alias is specified in grpc.federation.enum option,\n\t// and specifies the value name to be referenced among the enums specified in alias of enum option.\n\t// multiple value names can be specified for alias.\n\tAlias []string `protobuf:\"bytes,2,rep,name=alias,proto3\" json:\"alias,omitempty\"`\n\t// attr is used to hold multiple name-value pairs corresponding to an enum value.\n\t// The values specified by the name must be consistently specified for all enum values.\n\t// The values stored using this feature can be retrieved using the `attr()` method of the enum API.\n\tAttr []*EnumValueAttribute `protobuf:\"bytes,3,rep,name=attr,proto3\" json:\"attr,omitempty\"`\n\t// noalias exclude from the target of alias.\n\t// This option cannot be specified simultaneously with `default` or `alias`.\n\tNoalias *bool `protobuf:\"varint,4,opt,name=noalias,proto3,oneof\" json:\"noalias,omitempty\"`\n}\n\nfunc (x *EnumValueRule) Reset() {\n\t*x = EnumValueRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumValueRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumValueRule) ProtoMessage() {}\n\nfunc (x *EnumValueRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumValueRule.ProtoReflect.Descriptor instead.\nfunc (*EnumValueRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *EnumValueRule) GetDefault() bool {\n\tif x != nil && x.Default != nil {\n\t\treturn *x.Default\n\t}\n\treturn false\n}\n\nfunc (x *EnumValueRule) GetAlias() []string {\n\tif x != nil {\n\t\treturn x.Alias\n\t}\n\treturn nil\n}\n\nfunc (x *EnumValueRule) GetAttr() []*EnumValueAttribute {\n\tif x != nil {\n\t\treturn x.Attr\n\t}\n\treturn nil\n}\n\nfunc (x *EnumValueRule) GetNoalias() bool {\n\tif x != nil && x.Noalias != nil {\n\t\treturn *x.Noalias\n\t}\n\treturn false\n}\n\ntype EnumValueAttribute struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the attribute key.\n\t// This value is used to search for values using the `attr(<name>)` method.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// value represents the value corresponding to `name`.\n\tValue string `protobuf:\"bytes,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *EnumValueAttribute) Reset() {\n\t*x = EnumValueAttribute{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumValueAttribute) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumValueAttribute) ProtoMessage() {}\n\nfunc (x *EnumValueAttribute) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumValueAttribute.ProtoReflect.Descriptor instead.\nfunc (*EnumValueAttribute) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *EnumValueAttribute) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnumValueAttribute) GetValue() string {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn \"\"\n}\n\ntype OneofRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *OneofRule) Reset() {\n\t*x = OneofRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *OneofRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*OneofRule) ProtoMessage() {}\n\nfunc (x *OneofRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use OneofRule.ProtoReflect.Descriptor instead.\nfunc (*OneofRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{4}\n}\n\n// ServiceRule define gRPC Federation rules for the service.\ntype ServiceRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// env defines the environment variable.\n\tEnv *Env `protobuf:\"bytes,1,opt,name=env,proto3\" json:\"env,omitempty\"`\n\t// var defines the service-level variables.\n\tVar []*ServiceVariable `protobuf:\"bytes,2,rep,name=var,proto3\" json:\"var,omitempty\"`\n}\n\nfunc (x *ServiceRule) Reset() {\n\t*x = ServiceRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceRule) ProtoMessage() {}\n\nfunc (x *ServiceRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceRule.ProtoReflect.Descriptor instead.\nfunc (*ServiceRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *ServiceRule) GetEnv() *Env {\n\tif x != nil {\n\t\treturn x.Env\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceRule) GetVar() []*ServiceVariable {\n\tif x != nil {\n\t\treturn x.Var\n\t}\n\treturn nil\n}\n\n// Env is used when setting environment variables.\n// There are two ways to configure it.\ntype Env struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// var is used to directly list environment variables.\n\tVar []*EnvVar `protobuf:\"bytes,1,rep,name=var,proto3\" json:\"var,omitempty\"`\n\t// message is used to reference an already defined Protocol Buffers' message for defining environment variables.\n\t// If you want to set detailed options for the fields of the message, use the `env` option in FieldRule.\n\tMessage string `protobuf:\"bytes,2,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Env) Reset() {\n\t*x = Env{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Env) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Env) ProtoMessage() {}\n\nfunc (x *Env) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Env.ProtoReflect.Descriptor instead.\nfunc (*Env) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *Env) GetVar() []*EnvVar {\n\tif x != nil {\n\t\treturn x.Var\n\t}\n\treturn nil\n}\n\nfunc (x *Env) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\n// ServiceVariable define variables at the service level.\n// This definition is executed at server startup, after the initialization of Env.\n// The defined variables can be used across all messages that the service depends on.\ntype ServiceVariable struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is a variable name.\n\t// This name can be referenced in all CELs related to the service by using `grpc.federation.var.` prefix.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// if specify the condition for evaluating expr.\n\t// this value evaluated by CEL and it must return a boolean value.\n\t// If the result of evaluation is `false`, the value assigned to name is the default value of the result of evaluation of `expr`.\n\tIf *string `protobuf:\"bytes,2,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n\t// expr specify the value to be assigned to name.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*ServiceVariable_By\n\t//\t*ServiceVariable_Map\n\t//\t*ServiceVariable_Message\n\t//\t*ServiceVariable_Validation\n\t//\t*ServiceVariable_Enum\n\t//\t*ServiceVariable_Switch\n\tExpr isServiceVariable_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *ServiceVariable) Reset() {\n\t*x = ServiceVariable{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceVariable) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceVariable) ProtoMessage() {}\n\nfunc (x *ServiceVariable) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceVariable.ProtoReflect.Descriptor instead.\nfunc (*ServiceVariable) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{7}\n}\n\nfunc (x *ServiceVariable) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *ServiceVariable) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\nfunc (m *ServiceVariable) GetExpr() isServiceVariable_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetBy() string {\n\tif x, ok := x.GetExpr().(*ServiceVariable_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *ServiceVariable) GetMap() *MapExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetMessage() *MessageExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetValidation() *ServiceVariableValidationExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Validation); ok {\n\t\treturn x.Validation\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetEnum() *EnumExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetSwitch() *SwitchExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Switch); ok {\n\t\treturn x.Switch\n\t}\n\treturn nil\n}\n\ntype isServiceVariable_Expr interface {\n\tisServiceVariable_Expr()\n}\n\ntype ServiceVariable_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\ntype ServiceVariable_Map struct {\n\t// map apply map operation for the specified repeated type.\n\tMap *MapExpr `protobuf:\"bytes,12,opt,name=map,proto3,oneof\"`\n}\n\ntype ServiceVariable_Message struct {\n\t// message gets with message arguments.\n\tMessage *MessageExpr `protobuf:\"bytes,13,opt,name=message,proto3,oneof\"`\n}\n\ntype ServiceVariable_Validation struct {\n\t// validation defines the validation rule and message.\n\tValidation *ServiceVariableValidationExpr `protobuf:\"bytes,14,opt,name=validation,proto3,oneof\"`\n}\n\ntype ServiceVariable_Enum struct {\n\t// enum gets with cel value.\n\tEnum *EnumExpr `protobuf:\"bytes,15,opt,name=enum,proto3,oneof\"`\n}\n\ntype ServiceVariable_Switch struct {\n\t// switch provides conditional evaluation with multiple branches.\n\tSwitch *SwitchExpr `protobuf:\"bytes,16,opt,name=switch,proto3,oneof\"`\n}\n\nfunc (*ServiceVariable_By) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Map) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Message) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Validation) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Enum) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Switch) isServiceVariable_Expr() {}\n\n// ServiceVariableValidationExpr represents validation rule and error message.\ntype ServiceVariableValidationExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// if specifies condition in CEL. If the condition is true, it returns error.\n\t// The return value must always be of type boolean.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3\" json:\"if,omitempty\"`\n\t// message is a error message in CEL.\n\tMessage string `protobuf:\"bytes,2,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *ServiceVariableValidationExpr) Reset() {\n\t*x = ServiceVariableValidationExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceVariableValidationExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceVariableValidationExpr) ProtoMessage() {}\n\nfunc (x *ServiceVariableValidationExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceVariableValidationExpr.ProtoReflect.Descriptor instead.\nfunc (*ServiceVariableValidationExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{8}\n}\n\nfunc (x *ServiceVariableValidationExpr) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *ServiceVariableValidationExpr) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\n// EnvVar represents an environment variable.\ntype EnvVar struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is an environment variable name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// type is an environment variable type.\n\tType *EnvType `protobuf:\"bytes,2,opt,name=type,proto3\" json:\"type,omitempty\"`\n\t// option is an additional option for parsing environment variable.\n\tOption *EnvVarOption `protobuf:\"bytes,3,opt,name=option,proto3,oneof\" json:\"option,omitempty\"`\n}\n\nfunc (x *EnvVar) Reset() {\n\t*x = EnvVar{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvVar) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvVar) ProtoMessage() {}\n\nfunc (x *EnvVar) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvVar.ProtoReflect.Descriptor instead.\nfunc (*EnvVar) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{9}\n}\n\nfunc (x *EnvVar) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnvVar) GetType() *EnvType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nfunc (x *EnvVar) GetOption() *EnvVarOption {\n\tif x != nil {\n\t\treturn x.Option\n\t}\n\treturn nil\n}\n\n// EnvType represents type information for environment variable.\ntype EnvType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to Type:\n\t//\n\t//\t*EnvType_Kind\n\t//\t*EnvType_Repeated\n\t//\t*EnvType_Map\n\tType isEnvType_Type `protobuf_oneof:\"type\"`\n}\n\nfunc (x *EnvType) Reset() {\n\t*x = EnvType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[10]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvType) ProtoMessage() {}\n\nfunc (x *EnvType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[10]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvType.ProtoReflect.Descriptor instead.\nfunc (*EnvType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{10}\n}\n\nfunc (m *EnvType) GetType() isEnvType_Type {\n\tif m != nil {\n\t\treturn m.Type\n\t}\n\treturn nil\n}\n\nfunc (x *EnvType) GetKind() TypeKind {\n\tif x, ok := x.GetType().(*EnvType_Kind); ok {\n\t\treturn x.Kind\n\t}\n\treturn TypeKind_UNKNOWN\n}\n\nfunc (x *EnvType) GetRepeated() *EnvType {\n\tif x, ok := x.GetType().(*EnvType_Repeated); ok {\n\t\treturn x.Repeated\n\t}\n\treturn nil\n}\n\nfunc (x *EnvType) GetMap() *EnvMapType {\n\tif x, ok := x.GetType().(*EnvType_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\ntype isEnvType_Type interface {\n\tisEnvType_Type()\n}\n\ntype EnvType_Kind struct {\n\t// kind is used when the type is a primitive type.\n\tKind TypeKind `protobuf:\"varint,1,opt,name=kind,proto3,enum=grpc.federation.TypeKind,oneof\"`\n}\n\ntype EnvType_Repeated struct {\n\t// repeated is used when the type is a repeated type.\n\tRepeated *EnvType `protobuf:\"bytes,2,opt,name=repeated,proto3,oneof\"`\n}\n\ntype EnvType_Map struct {\n\t// map is used when the type is a map type.\n\tMap *EnvMapType `protobuf:\"bytes,3,opt,name=map,proto3,oneof\"`\n}\n\nfunc (*EnvType_Kind) isEnvType_Type() {}\n\nfunc (*EnvType_Repeated) isEnvType_Type() {}\n\nfunc (*EnvType_Map) isEnvType_Type() {}\n\n// EnvMapType represents map type.\ntype EnvMapType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// key represents map's key type.\n\tKey *EnvType `protobuf:\"bytes,1,opt,name=key,proto3\" json:\"key,omitempty\"`\n\t// value represents map's value type.\n\tValue *EnvType `protobuf:\"bytes,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *EnvMapType) Reset() {\n\t*x = EnvMapType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[11]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvMapType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvMapType) ProtoMessage() {}\n\nfunc (x *EnvMapType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[11]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvMapType.ProtoReflect.Descriptor instead.\nfunc (*EnvMapType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{11}\n}\n\nfunc (x *EnvMapType) GetKey() *EnvType {\n\tif x != nil {\n\t\treturn x.Key\n\t}\n\treturn nil\n}\n\nfunc (x *EnvMapType) GetValue() *EnvType {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn nil\n}\n\n// EnvVarOption represents additional option for environment variable.\n// The option work with the `envconfig` library in Go language.\n// For detailed specifications, please refer to the library's documentation ( https://pkg.go.dev/github.com/kelseyhightower/envconfig#section-readme ).\ntype EnvVarOption struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// alternate use this option if you want to use an environment variable with a different name than the value specified in `EnvVar.name`.\n\tAlternate *string `protobuf:\"bytes,1,opt,name=alternate,proto3,oneof\" json:\"alternate,omitempty\"`\n\t// default specify the value to use as a fallback if the specified environment variable is not found.\n\tDefault *string `protobuf:\"bytes,2,opt,name=default,proto3,oneof\" json:\"default,omitempty\"`\n\t// required require the environment variable to exist.\n\t// If it does not exist, an error will occur at startup.\n\tRequired *bool `protobuf:\"varint,3,opt,name=required,proto3,oneof\" json:\"required,omitempty\"`\n\t// ignored if ignored is true, it does nothing even if the environment variable exists.\n\tIgnored *bool `protobuf:\"varint,4,opt,name=ignored,proto3,oneof\" json:\"ignored,omitempty\"`\n}\n\nfunc (x *EnvVarOption) Reset() {\n\t*x = EnvVarOption{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[12]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvVarOption) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvVarOption) ProtoMessage() {}\n\nfunc (x *EnvVarOption) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[12]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvVarOption.ProtoReflect.Descriptor instead.\nfunc (*EnvVarOption) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{12}\n}\n\nfunc (x *EnvVarOption) GetAlternate() string {\n\tif x != nil && x.Alternate != nil {\n\t\treturn *x.Alternate\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnvVarOption) GetDefault() string {\n\tif x != nil && x.Default != nil {\n\t\treturn *x.Default\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnvVarOption) GetRequired() bool {\n\tif x != nil && x.Required != nil {\n\t\treturn *x.Required\n\t}\n\treturn false\n}\n\nfunc (x *EnvVarOption) GetIgnored() bool {\n\tif x != nil && x.Ignored != nil {\n\t\treturn *x.Ignored\n\t}\n\treturn false\n}\n\ntype MethodRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// the time to timeout. If the specified time period elapses, DEADLINE_EXCEEDED status is returned.\n\t// If you want to handle this error, you need to implement a custom error handler in Go.\n\t// The format is the same as Go's time.Duration format. See https://pkg.go.dev/time#ParseDuration.\n\tTimeout *string `protobuf:\"bytes,1,opt,name=timeout,proto3,oneof\" json:\"timeout,omitempty\"`\n\t// response specify the name of the message you want to use to create the response value.\n\t// If you specify a reserved type like `google.protobuf.Empty` as the response, you cannot define gRPC Federation options.\n\t// In such cases, you can specify a separate message to create the response value.\n\t// The specified response message must contain fields with the same names and types as all the fields in the original response.\n\tResponse *string `protobuf:\"bytes,2,opt,name=response,proto3,oneof\" json:\"response,omitempty\"`\n}\n\nfunc (x *MethodRule) Reset() {\n\t*x = MethodRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[13]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MethodRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MethodRule) ProtoMessage() {}\n\nfunc (x *MethodRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[13]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MethodRule.ProtoReflect.Descriptor instead.\nfunc (*MethodRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{13}\n}\n\nfunc (x *MethodRule) GetTimeout() string {\n\tif x != nil && x.Timeout != nil {\n\t\treturn *x.Timeout\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodRule) GetResponse() string {\n\tif x != nil && x.Response != nil {\n\t\treturn *x.Response\n\t}\n\treturn \"\"\n}\n\n// MessageRule define gRPC Federation rules for the message.\ntype MessageRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// def specify variables to be used in field binding by `grpc.federation.field` option.\n\tDef []*VariableDefinition `protobuf:\"bytes,1,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// if custom_resolver is true, the resolver for this message is implemented by Go.\n\t// If there are any values retrieved by resolver or messages, they are passed as arguments for custom resolver.\n\t// Each field of the message returned by the custom resolver is automatically bound.\n\t// If you want to change the binding process for a particular field, set `custom_resolver=true` option for that field.\n\tCustomResolver *bool `protobuf:\"varint,2,opt,name=custom_resolver,json=customResolver,proto3,oneof\" json:\"custom_resolver,omitempty\"`\n\t// alias mapping between messages defined in other packages and messages defined on the federation service side.\n\t// The alias is the FQDN ( <package-name>.<message-name> ) to the message.\n\t// If this definition exists, type conversion is automatically performed before the field assignment operation.\n\t// If a message with this option has a field that is not present in the message specified by alias, and the alias option is not specified for that field, an error is occurred.\n\t// You can specify multiple aliases. In that case, only fields common to all aliases will be considered.\n\t// Specifying a field that is not included in either alias will result in an error.\n\tAlias []string `protobuf:\"bytes,3,rep,name=alias,proto3\" json:\"alias,omitempty\"`\n}\n\nfunc (x *MessageRule) Reset() {\n\t*x = MessageRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[14]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MessageRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MessageRule) ProtoMessage() {}\n\nfunc (x *MessageRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[14]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MessageRule.ProtoReflect.Descriptor instead.\nfunc (*MessageRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{14}\n}\n\nfunc (x *MessageRule) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *MessageRule) GetCustomResolver() bool {\n\tif x != nil && x.CustomResolver != nil {\n\t\treturn *x.CustomResolver\n\t}\n\treturn false\n}\n\nfunc (x *MessageRule) GetAlias() []string {\n\tif x != nil {\n\t\treturn x.Alias\n\t}\n\treturn nil\n}\n\n// VariableDefinition represents variable definition.\ntype VariableDefinition struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is a variable name.\n\t// This name can be referenced in all CELs defined after itself in the same message.\n\t// It can also be referenced in `grpc.federation.field` option.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// if specify the condition for evaluating expr.\n\t// this value evaluated by CEL and it must return a boolean value.\n\t// If the result of evaluation is `false`, the value assigned to name is the default value of the result of evaluation of `expr`.\n\tIf *string `protobuf:\"bytes,2,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n\t// autobind if the result value of `expr` is a message type,\n\t// the value of a field with the same name and type as the field name of its own message is automatically assigned to the value of the field in the message.\n\t// If multiple autobinds are used at the same message,\n\t// you must explicitly use the `grpc.federation.field` option to do the binding yourself, since duplicate field names cannot be correctly determined as one.\n\tAutobind *bool `protobuf:\"varint,3,opt,name=autobind,proto3,oneof\" json:\"autobind,omitempty\"`\n\t// expr specify the value to be assigned to name.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*VariableDefinition_By\n\t//\t*VariableDefinition_Map\n\t//\t*VariableDefinition_Message\n\t//\t*VariableDefinition_Call\n\t//\t*VariableDefinition_Validation\n\t//\t*VariableDefinition_Enum\n\t//\t*VariableDefinition_Switch\n\tExpr isVariableDefinition_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *VariableDefinition) Reset() {\n\t*x = VariableDefinition{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[15]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *VariableDefinition) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*VariableDefinition) ProtoMessage() {}\n\nfunc (x *VariableDefinition) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[15]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use VariableDefinition.ProtoReflect.Descriptor instead.\nfunc (*VariableDefinition) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{15}\n}\n\nfunc (x *VariableDefinition) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *VariableDefinition) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *VariableDefinition) GetAutobind() bool {\n\tif x != nil && x.Autobind != nil {\n\t\treturn *x.Autobind\n\t}\n\treturn false\n}\n\nfunc (m *VariableDefinition) GetExpr() isVariableDefinition_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetBy() string {\n\tif x, ok := x.GetExpr().(*VariableDefinition_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *VariableDefinition) GetMap() *MapExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetMessage() *MessageExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetCall() *CallExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Call); ok {\n\t\treturn x.Call\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetValidation() *ValidationExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Validation); ok {\n\t\treturn x.Validation\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetEnum() *EnumExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetSwitch() *SwitchExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Switch); ok {\n\t\treturn x.Switch\n\t}\n\treturn nil\n}\n\ntype isVariableDefinition_Expr interface {\n\tisVariableDefinition_Expr()\n}\n\ntype VariableDefinition_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\ntype VariableDefinition_Map struct {\n\t// map apply map operation for the specified repeated type.\n\tMap *MapExpr `protobuf:\"bytes,12,opt,name=map,proto3,oneof\"`\n}\n\ntype VariableDefinition_Message struct {\n\t// message gets with message arguments.\n\tMessage *MessageExpr `protobuf:\"bytes,13,opt,name=message,proto3,oneof\"`\n}\n\ntype VariableDefinition_Call struct {\n\t// call specifies how to call gRPC method.\n\tCall *CallExpr `protobuf:\"bytes,14,opt,name=call,proto3,oneof\"`\n}\n\ntype VariableDefinition_Validation struct {\n\t// validation defines the validation rule and error.\n\tValidation *ValidationExpr `protobuf:\"bytes,15,opt,name=validation,proto3,oneof\"`\n}\n\ntype VariableDefinition_Enum struct {\n\t// enum gets with cel value.\n\tEnum *EnumExpr `protobuf:\"bytes,16,opt,name=enum,proto3,oneof\"`\n}\n\ntype VariableDefinition_Switch struct {\n\t// switch provides conditional evaluation with multiple branches.\n\tSwitch *SwitchExpr `protobuf:\"bytes,17,opt,name=switch,proto3,oneof\"`\n}\n\nfunc (*VariableDefinition_By) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Map) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Message) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Call) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Validation) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Enum) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Switch) isVariableDefinition_Expr() {}\n\n// MapExpr apply map operation for the specified repeated type.\ntype MapExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// iterator define iterator variable.\n\t// When evaluating CEL in `expr`, we can refer to the name defined in iterator.\n\tIterator *Iterator `protobuf:\"bytes,1,opt,name=iterator,proto3\" json:\"iterator,omitempty\"`\n\t// expr creates map elements using iterator variable.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*MapExpr_By\n\t//\t*MapExpr_Message\n\t//\t*MapExpr_Enum\n\tExpr isMapExpr_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *MapExpr) Reset() {\n\t*x = MapExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[16]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MapExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MapExpr) ProtoMessage() {}\n\nfunc (x *MapExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[16]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MapExpr.ProtoReflect.Descriptor instead.\nfunc (*MapExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{16}\n}\n\nfunc (x *MapExpr) GetIterator() *Iterator {\n\tif x != nil {\n\t\treturn x.Iterator\n\t}\n\treturn nil\n}\n\nfunc (m *MapExpr) GetExpr() isMapExpr_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *MapExpr) GetBy() string {\n\tif x, ok := x.GetExpr().(*MapExpr_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *MapExpr) GetMessage() *MessageExpr {\n\tif x, ok := x.GetExpr().(*MapExpr_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *MapExpr) GetEnum() *EnumExpr {\n\tif x, ok := x.GetExpr().(*MapExpr_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn nil\n}\n\ntype isMapExpr_Expr interface {\n\tisMapExpr_Expr()\n}\n\ntype MapExpr_By struct {\n\t// `by` evaluates with CEL.\n\t// this can refer to the variable declared by `iterator`.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\ntype MapExpr_Message struct {\n\t// message gets with message arguments, and it is made an element of the map.\n\t// The result type of MapExpr is the repeated type of the specified message.\n\tMessage *MessageExpr `protobuf:\"bytes,12,opt,name=message,proto3,oneof\"`\n}\n\ntype MapExpr_Enum struct {\n\t// enum creates enum value for each element of the map.\n\t// The result type of MapExpr is the repeated type of the specified enum.\n\tEnum *EnumExpr `protobuf:\"bytes,13,opt,name=enum,proto3,oneof\"`\n}\n\nfunc (*MapExpr_By) isMapExpr_Expr() {}\n\nfunc (*MapExpr_Message) isMapExpr_Expr() {}\n\nfunc (*MapExpr_Enum) isMapExpr_Expr() {}\n\n// Iterator represents iterator variable.\ntype Iterator struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// variable name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// src the value that will be the source for creating the iterator.\n\t// src must be a repeated type.\n\tSrc string `protobuf:\"bytes,2,opt,name=src,proto3\" json:\"src,omitempty\"`\n}\n\nfunc (x *Iterator) Reset() {\n\t*x = Iterator{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[17]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Iterator) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Iterator) ProtoMessage() {}\n\nfunc (x *Iterator) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[17]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Iterator.ProtoReflect.Descriptor instead.\nfunc (*Iterator) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{17}\n}\n\nfunc (x *Iterator) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Iterator) GetSrc() string {\n\tif x != nil {\n\t\treturn x.Src\n\t}\n\treturn \"\"\n}\n\n// MessageExpr represents dependent message.\ntype MessageExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name specify the message name by FQDN. format is `<package-name>.<message-name>`.\n\t// <package-name> can be omitted when referring to messages in the same package.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// args specify the parameters needed to get the message. This is called the \"message arguments\".\n\tArgs []*Argument `protobuf:\"bytes,2,rep,name=args,proto3\" json:\"args,omitempty\"`\n}\n\nfunc (x *MessageExpr) Reset() {\n\t*x = MessageExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[18]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MessageExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MessageExpr) ProtoMessage() {}\n\nfunc (x *MessageExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[18]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MessageExpr.ProtoReflect.Descriptor instead.\nfunc (*MessageExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{18}\n}\n\nfunc (x *MessageExpr) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *MessageExpr) GetArgs() []*Argument {\n\tif x != nil {\n\t\treturn x.Args\n\t}\n\treturn nil\n}\n\n// EnumExpr represents dependent enum.\ntype EnumExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name specify the enum name by FQDN. format is `<package-name>.<enum-name>`.\n\t// <package-name> can be omitted when referring to enum in the same package.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,2,opt,name=by,proto3\" json:\"by,omitempty\"`\n}\n\nfunc (x *EnumExpr) Reset() {\n\t*x = EnumExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[19]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumExpr) ProtoMessage() {}\n\nfunc (x *EnumExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[19]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumExpr.ProtoReflect.Descriptor instead.\nfunc (*EnumExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{19}\n}\n\nfunc (x *EnumExpr) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnumExpr) GetBy() string {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\n// CallExpr represents how to call gRPC method.\ntype CallExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// method specify the FQDN for the gRPC method. format is `<package-name>.<service-name>/<method-name>`.\n\tMethod string `protobuf:\"bytes,1,opt,name=method,proto3\" json:\"method,omitempty\"`\n\t// request specify request parameters for the gRPC method.\n\tRequest []*MethodRequest `protobuf:\"bytes,2,rep,name=request,proto3\" json:\"request,omitempty\"`\n\t// the time to timeout. If the specified time period elapses, DEADLINE_EXCEEDED status is returned.\n\t// If you want to handle this error, you need to implement a custom error handler in Go.\n\t// The format is the same as Go's time.Duration format. See https://pkg.go.dev/time#ParseDuration.\n\tTimeout *string `protobuf:\"bytes,3,opt,name=timeout,proto3,oneof\" json:\"timeout,omitempty\"`\n\t// retry specifies the retry policy if the method call fails.\n\tRetry *RetryPolicy `protobuf:\"bytes,4,opt,name=retry,proto3,oneof\" json:\"retry,omitempty\"`\n\t// error evaluated when an error occurs during a method call.\n\t// Multiple errors can be defined and are evaluated in the order in which they are described.\n\t// If an error occurs while creating an gRPC status error, original error will be returned.\n\tError []*GRPCError `protobuf:\"bytes,5,rep,name=error,proto3\" json:\"error,omitempty\"`\n\t// option is the gRPC's call option (https://pkg.go.dev/google.golang.org/grpc#CallOption).\n\tOption *GRPCCallOption `protobuf:\"bytes,6,opt,name=option,proto3,oneof\" json:\"option,omitempty\"`\n\t// metadata specify outgoing metadata with CEL value.\n\t// The specified type must always be of type map<string, repeated string>.\n\tMetadata *string `protobuf:\"bytes,7,opt,name=metadata,proto3,oneof\" json:\"metadata,omitempty\"`\n}\n\nfunc (x *CallExpr) Reset() {\n\t*x = CallExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[20]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CallExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CallExpr) ProtoMessage() {}\n\nfunc (x *CallExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[20]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CallExpr.ProtoReflect.Descriptor instead.\nfunc (*CallExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{20}\n}\n\nfunc (x *CallExpr) GetMethod() string {\n\tif x != nil {\n\t\treturn x.Method\n\t}\n\treturn \"\"\n}\n\nfunc (x *CallExpr) GetRequest() []*MethodRequest {\n\tif x != nil {\n\t\treturn x.Request\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetTimeout() string {\n\tif x != nil && x.Timeout != nil {\n\t\treturn *x.Timeout\n\t}\n\treturn \"\"\n}\n\nfunc (x *CallExpr) GetRetry() *RetryPolicy {\n\tif x != nil {\n\t\treturn x.Retry\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetError() []*GRPCError {\n\tif x != nil {\n\t\treturn x.Error\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetOption() *GRPCCallOption {\n\tif x != nil {\n\t\treturn x.Option\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetMetadata() string {\n\tif x != nil && x.Metadata != nil {\n\t\treturn *x.Metadata\n\t}\n\treturn \"\"\n}\n\n// SwitchExpr represents a switch statement. At least one \"case\", and \"default\", must be defined. All\n// case.if expressions must evaluate to a boolean value. All case.by expressions, and default.by, must\n// evaluate to the same type (the return type of the switch).\n//\n// When executed, the case.if expressions are evaluated in order, and, for the first case whose\n// case.if expression evaluates to true, its case.by is evaluated to make the return value of the\n// SwitchExpr.\n// If no case.if evaluates to true, default.by is evaluated to make the return value.\ntype SwitchExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Cases for the switch expression.\n\tCase []*SwitchCaseExpr `protobuf:\"bytes,1,rep,name=case,proto3\" json:\"case,omitempty\"`\n\t// The default case, if none of the \"case.if\" expressions evaluate to true.\n\tDefault *SwitchDefaultExpr `protobuf:\"bytes,2,opt,name=default,proto3\" json:\"default,omitempty\"`\n}\n\nfunc (x *SwitchExpr) Reset() {\n\t*x = SwitchExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[21]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SwitchExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SwitchExpr) ProtoMessage() {}\n\nfunc (x *SwitchExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[21]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SwitchExpr.ProtoReflect.Descriptor instead.\nfunc (*SwitchExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{21}\n}\n\nfunc (x *SwitchExpr) GetCase() []*SwitchCaseExpr {\n\tif x != nil {\n\t\treturn x.Case\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchExpr) GetDefault() *SwitchDefaultExpr {\n\tif x != nil {\n\t\treturn x.Default\n\t}\n\treturn nil\n}\n\n// SwitchCaseExpr represents a single case for a switch expression.\ntype SwitchCaseExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// if specify the condition for evaluating expr.\n\t// this value evaluated by CEL and it must return a boolean value.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3\" json:\"if,omitempty\"`\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,2,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// expr specify the value to return for the case.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*SwitchCaseExpr_By\n\tExpr isSwitchCaseExpr_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *SwitchCaseExpr) Reset() {\n\t*x = SwitchCaseExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[22]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SwitchCaseExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SwitchCaseExpr) ProtoMessage() {}\n\nfunc (x *SwitchCaseExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[22]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SwitchCaseExpr.ProtoReflect.Descriptor instead.\nfunc (*SwitchCaseExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{22}\n}\n\nfunc (x *SwitchCaseExpr) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *SwitchCaseExpr) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (m *SwitchCaseExpr) GetExpr() isSwitchCaseExpr_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchCaseExpr) GetBy() string {\n\tif x, ok := x.GetExpr().(*SwitchCaseExpr_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\ntype isSwitchCaseExpr_Expr interface {\n\tisSwitchCaseExpr_Expr()\n}\n\ntype SwitchCaseExpr_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\nfunc (*SwitchCaseExpr_By) isSwitchCaseExpr_Expr() {}\n\n// SwitchDefaultExpr represents the default case for a switch expression.\ntype SwitchDefaultExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,1,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// expr specify the value to return for the default case.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*SwitchDefaultExpr_By\n\tExpr isSwitchDefaultExpr_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *SwitchDefaultExpr) Reset() {\n\t*x = SwitchDefaultExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[23]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SwitchDefaultExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SwitchDefaultExpr) ProtoMessage() {}\n\nfunc (x *SwitchDefaultExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[23]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SwitchDefaultExpr.ProtoReflect.Descriptor instead.\nfunc (*SwitchDefaultExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{23}\n}\n\nfunc (x *SwitchDefaultExpr) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (m *SwitchDefaultExpr) GetExpr() isSwitchDefaultExpr_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchDefaultExpr) GetBy() string {\n\tif x, ok := x.GetExpr().(*SwitchDefaultExpr_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\ntype isSwitchDefaultExpr_Expr interface {\n\tisSwitchDefaultExpr_Expr()\n}\n\ntype SwitchDefaultExpr_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\nfunc (*SwitchDefaultExpr_By) isSwitchDefaultExpr_Expr() {}\n\n// GRPCError create gRPC status value.\ntype GRPCError struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,1,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// if specifies condition in CEL. If the condition is true, it returns defined error information.\n\t// If this field is omitted, it is always treated as 'true' and returns defined error information.\n\t// The return value must always be of type boolean.\n\tIf *string `protobuf:\"bytes,2,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n\t// code is a gRPC status code.\n\tCode *code.Code `protobuf:\"varint,3,opt,name=code,proto3,enum=google.rpc.Code,oneof\" json:\"code,omitempty\"`\n\t// message is a gRPC status message.\n\t// If omitted, the message will be auto-generated from the configurations.\n\tMessage *string `protobuf:\"bytes,4,opt,name=message,proto3,oneof\" json:\"message,omitempty\"`\n\t// details is a list of error details.\n\t// If returns error, the corresponding error details are set.\n\tDetails []*GRPCErrorDetail `protobuf:\"bytes,5,rep,name=details,proto3\" json:\"details,omitempty\"`\n\t// ignore ignore the error if the condition in the \"if\" field is true and \"ignore\" field is set to true.\n\t// When an error is ignored, the returned response is always null value.\n\t// If you want to return a response that is not null, please use `ignore_and_response` feature.\n\t// Therefore, `ignore` and `ignore_and_response` cannot be specified same.\n\tIgnore *bool `protobuf:\"varint,6,opt,name=ignore,proto3,oneof\" json:\"ignore,omitempty\"`\n\t// ignore_and_response ignore the error if the condition in the \"if\" field is true and it returns response specified in CEL.\n\t// The evaluation value of CEL must always be the same as the response message type.\n\t// `ignore` and `ignore_and_response` cannot be specified same.\n\tIgnoreAndResponse *string `protobuf:\"bytes,7,opt,name=ignore_and_response,json=ignoreAndResponse,proto3,oneof\" json:\"ignore_and_response,omitempty\"`\n\t// log_level can be configured to output logs as any log level.\n\t// If DEBUG is specified for the log_level, logs are output as debug logs.\n\t// default value is ERROR.\n\tLogLevel *GRPCError_LogLevel `protobuf:\"varint,8,opt,name=log_level,json=logLevel,proto3,enum=grpc.federation.GRPCError_LogLevel,oneof\" json:\"log_level,omitempty\"`\n}\n\nfunc (x *GRPCError) Reset() {\n\t*x = GRPCError{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[24]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GRPCError) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GRPCError) ProtoMessage() {}\n\nfunc (x *GRPCError) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[24]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GRPCError.ProtoReflect.Descriptor instead.\nfunc (*GRPCError) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{24}\n}\n\nfunc (x *GRPCError) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCError) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCError) GetCode() code.Code {\n\tif x != nil && x.Code != nil {\n\t\treturn *x.Code\n\t}\n\treturn code.Code(0)\n}\n\nfunc (x *GRPCError) GetMessage() string {\n\tif x != nil && x.Message != nil {\n\t\treturn *x.Message\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCError) GetDetails() []*GRPCErrorDetail {\n\tif x != nil {\n\t\treturn x.Details\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCError) GetIgnore() bool {\n\tif x != nil && x.Ignore != nil {\n\t\treturn *x.Ignore\n\t}\n\treturn false\n}\n\nfunc (x *GRPCError) GetIgnoreAndResponse() string {\n\tif x != nil && x.IgnoreAndResponse != nil {\n\t\treturn *x.IgnoreAndResponse\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCError) GetLogLevel() GRPCError_LogLevel {\n\tif x != nil && x.LogLevel != nil {\n\t\treturn *x.LogLevel\n\t}\n\treturn GRPCError_UNKNOWN\n}\n\ntype GRPCErrorDetail struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// if specifies condition rule in CEL. If the condition is true, gRPC error detail is added to the error.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3\" json:\"if,omitempty\"`\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,2,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// message represents arbitrary messages to describe the detail of the error.\n\tMessage []*MessageExpr `protobuf:\"bytes,3,rep,name=message,proto3\" json:\"message,omitempty\"`\n\t// error_info describes the cause of the error with structured details.\n\tErrorInfo []*errdetails.ErrorInfo `protobuf:\"bytes,4,rep,name=error_info,json=errorInfo,proto3\" json:\"error_info,omitempty\"`\n\t// retry_info describes when the clients can retry a failed request.\n\tRetryInfo []*errdetails.RetryInfo `protobuf:\"bytes,5,rep,name=retry_info,json=retryInfo,proto3\" json:\"retry_info,omitempty\"`\n\t// debug_info describes additional debugging info.\n\tDebugInfo []*errdetails.DebugInfo `protobuf:\"bytes,6,rep,name=debug_info,json=debugInfo,proto3\" json:\"debug_info,omitempty\"`\n\t// quota_failure describes how a quota check failed.\n\tQuotaFailure []*errdetails.QuotaFailure `protobuf:\"bytes,7,rep,name=quota_failure,json=quotaFailure,proto3\" json:\"quota_failure,omitempty\"`\n\t// precondition_failure describes what preconditions have failed.\n\tPreconditionFailure []*errdetails.PreconditionFailure `protobuf:\"bytes,8,rep,name=precondition_failure,json=preconditionFailure,proto3\" json:\"precondition_failure,omitempty\"`\n\t// bad_request describes violations in a client request.\n\tBadRequest []*errdetails.BadRequest `protobuf:\"bytes,9,rep,name=bad_request,json=badRequest,proto3\" json:\"bad_request,omitempty\"`\n\t// request_info contains metadata about the request that clients can attach.\n\tRequestInfo []*errdetails.RequestInfo `protobuf:\"bytes,10,rep,name=request_info,json=requestInfo,proto3\" json:\"request_info,omitempty\"`\n\t// resource_info describes the resource that is being accessed.\n\tResourceInfo []*errdetails.ResourceInfo `protobuf:\"bytes,11,rep,name=resource_info,json=resourceInfo,proto3\" json:\"resource_info,omitempty\"`\n\t// help provides links to documentation or for performing an out of band action.\n\tHelp []*errdetails.Help `protobuf:\"bytes,12,rep,name=help,proto3\" json:\"help,omitempty\"`\n\t// localized_message provides a localized error message that is safe to return to the user.\n\tLocalizedMessage []*errdetails.LocalizedMessage `protobuf:\"bytes,13,rep,name=localized_message,json=localizedMessage,proto3\" json:\"localized_message,omitempty\"`\n\t// by specify a message in CEL to express the details of the error.\n\tBy []string `protobuf:\"bytes,14,rep,name=by,proto3\" json:\"by,omitempty\"`\n}\n\nfunc (x *GRPCErrorDetail) Reset() {\n\t*x = GRPCErrorDetail{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[25]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GRPCErrorDetail) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GRPCErrorDetail) ProtoMessage() {}\n\nfunc (x *GRPCErrorDetail) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[25]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GRPCErrorDetail.ProtoReflect.Descriptor instead.\nfunc (*GRPCErrorDetail) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{25}\n}\n\nfunc (x *GRPCErrorDetail) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCErrorDetail) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetMessage() []*MessageExpr {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetErrorInfo() []*errdetails.ErrorInfo {\n\tif x != nil {\n\t\treturn x.ErrorInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetRetryInfo() []*errdetails.RetryInfo {\n\tif x != nil {\n\t\treturn x.RetryInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetDebugInfo() []*errdetails.DebugInfo {\n\tif x != nil {\n\t\treturn x.DebugInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetQuotaFailure() []*errdetails.QuotaFailure {\n\tif x != nil {\n\t\treturn x.QuotaFailure\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetPreconditionFailure() []*errdetails.PreconditionFailure {\n\tif x != nil {\n\t\treturn x.PreconditionFailure\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetBadRequest() []*errdetails.BadRequest {\n\tif x != nil {\n\t\treturn x.BadRequest\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetRequestInfo() []*errdetails.RequestInfo {\n\tif x != nil {\n\t\treturn x.RequestInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetResourceInfo() []*errdetails.ResourceInfo {\n\tif x != nil {\n\t\treturn x.ResourceInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetHelp() []*errdetails.Help {\n\tif x != nil {\n\t\treturn x.Help\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetLocalizedMessage() []*errdetails.LocalizedMessage {\n\tif x != nil {\n\t\treturn x.LocalizedMessage\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetBy() []string {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn nil\n}\n\n// GRPCCallOption configures a gRPC Call before it starts or extracts information from a gRPC Call after it completes.\ntype GRPCCallOption struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// set the content-subtype. For example, if content-subtype is \"json\", the Content-Type over the wire will be \"application/grpc+json\".\n\t// The content-subtype is converted to lowercase before being included in Content-Type.\n\t// See Content-Type on https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests for more details.\n\t// If no such codec is found, the call will result in an error with code INTERNAL.\n\tContentSubtype *string `protobuf:\"bytes,1,opt,name=content_subtype,json=contentSubtype,proto3,oneof\" json:\"content_subtype,omitempty\"`\n\t// header retrieves the header metadata for a unary RPC.\n\t// In order to obtain the metadata, you must specify a variable of type map<string, repeated string> in the header.\n\t// e.g.)\n\t// def [\n\t//\n\t//\t{ name: \"hdr\" by: \"grpc.federation.metadata.new()\" }\n\t//\t{ call { method: \"pkg.Method\" option { header: \"hdr\" } } }\n\t//\n\t// ]\n\tHeader *string `protobuf:\"bytes,2,opt,name=header,proto3,oneof\" json:\"header,omitempty\"`\n\t// max_call_recv_msg_size sets the maximum message size in bytes the client can receive.\n\t// If this is not set, gRPC uses the default 4MB.\n\tMaxCallRecvMsgSize *int64 `protobuf:\"varint,3,opt,name=max_call_recv_msg_size,json=maxCallRecvMsgSize,proto3,oneof\" json:\"max_call_recv_msg_size,omitempty\"`\n\t// max_call_send_msg_size sets the maximum message size in bytes the client can send.\n\t// If this is not set, gRPC uses the default maximum number of int32 range.\n\tMaxCallSendMsgSize *int64 `protobuf:\"varint,4,opt,name=max_call_send_msg_size,json=maxCallSendMsgSize,proto3,oneof\" json:\"max_call_send_msg_size,omitempty\"`\n\t// static_method specifies that a call is being made to a method that is static,\n\t// which means the method is known at compile time and doesn't change at runtime.\n\t// This can be used as a signal to stats plugins that this method is safe to include as a key to a measurement.\n\tStaticMethod *bool `protobuf:\"varint,5,opt,name=static_method,json=staticMethod,proto3,oneof\" json:\"static_method,omitempty\"`\n\t// trailer retrieves the trailer metadata for a unary RPC.\n\t// In order to obtain the metadata, you must specify a variable of type map<string, repeated string> in the trailer.\n\t// e.g.)\n\t// def [\n\t//\n\t//\t{ name: \"trl\" by: \"grpc.federation.metadata.new()\" }\n\t//\t{ call { method: \"pkg.Method\" option { trailer: \"trl\" } } }\n\t//\n\t// ]\n\tTrailer *string `protobuf:\"bytes,6,opt,name=trailer,proto3,oneof\" json:\"trailer,omitempty\"`\n\t// wait_for_ready configures the RPC's behavior when the client is in TRANSIENT_FAILURE,\n\t// which occurs when all addresses fail to connect.\n\t// If wait_for_ready is false, the RPC will fail immediately.\n\t// Otherwise, the client will wait until a connection becomes available or the RPC's deadline is reached.\n\t// By default, RPCs do not \"wait for ready\".\n\tWaitForReady *bool `protobuf:\"varint,7,opt,name=wait_for_ready,json=waitForReady,proto3,oneof\" json:\"wait_for_ready,omitempty\"`\n}\n\nfunc (x *GRPCCallOption) Reset() {\n\t*x = GRPCCallOption{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[26]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GRPCCallOption) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GRPCCallOption) ProtoMessage() {}\n\nfunc (x *GRPCCallOption) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[26]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GRPCCallOption.ProtoReflect.Descriptor instead.\nfunc (*GRPCCallOption) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{26}\n}\n\nfunc (x *GRPCCallOption) GetContentSubtype() string {\n\tif x != nil && x.ContentSubtype != nil {\n\t\treturn *x.ContentSubtype\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCCallOption) GetHeader() string {\n\tif x != nil && x.Header != nil {\n\t\treturn *x.Header\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCCallOption) GetMaxCallRecvMsgSize() int64 {\n\tif x != nil && x.MaxCallRecvMsgSize != nil {\n\t\treturn *x.MaxCallRecvMsgSize\n\t}\n\treturn 0\n}\n\nfunc (x *GRPCCallOption) GetMaxCallSendMsgSize() int64 {\n\tif x != nil && x.MaxCallSendMsgSize != nil {\n\t\treturn *x.MaxCallSendMsgSize\n\t}\n\treturn 0\n}\n\nfunc (x *GRPCCallOption) GetStaticMethod() bool {\n\tif x != nil && x.StaticMethod != nil {\n\t\treturn *x.StaticMethod\n\t}\n\treturn false\n}\n\nfunc (x *GRPCCallOption) GetTrailer() string {\n\tif x != nil && x.Trailer != nil {\n\t\treturn *x.Trailer\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCCallOption) GetWaitForReady() bool {\n\tif x != nil && x.WaitForReady != nil {\n\t\treturn *x.WaitForReady\n\t}\n\treturn false\n}\n\n// Validation represents a validation rule against variables defined within the current scope.\ntype ValidationExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is a unique name for the validation.\n\t// If set, the validation error type will be <message-name><name>Error.\n\t// If omitted, the validation error type will be ValidationError.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// error defines the actual validation rules and an error to returned if the validation fails.\n\tError *GRPCError `protobuf:\"bytes,2,opt,name=error,proto3\" json:\"error,omitempty\"`\n}\n\nfunc (x *ValidationExpr) Reset() {\n\t*x = ValidationExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[27]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ValidationExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ValidationExpr) ProtoMessage() {}\n\nfunc (x *ValidationExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[27]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ValidationExpr.ProtoReflect.Descriptor instead.\nfunc (*ValidationExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{27}\n}\n\nfunc (x *ValidationExpr) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *ValidationExpr) GetError() *GRPCError {\n\tif x != nil {\n\t\treturn x.Error\n\t}\n\treturn nil\n}\n\n// RetryPolicy define the retry policy if the method call fails.\ntype RetryPolicy struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to Policy:\n\t//\n\t//\t*RetryPolicy_Constant\n\t//\t*RetryPolicy_Exponential\n\tPolicy isRetryPolicy_Policy `protobuf_oneof:\"policy\"`\n\t// if specifies condition in CEL. If the condition is true, run the retry process according to the policy.\n\t// If this field is omitted, it is always treated as 'true' and run the retry process.\n\t// The return value must always be of type boolean.\n\tIf string `protobuf:\"bytes,3,opt,name=if,proto3\" json:\"if,omitempty\"`\n}\n\nfunc (x *RetryPolicy) Reset() {\n\t*x = RetryPolicy{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[28]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RetryPolicy) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RetryPolicy) ProtoMessage() {}\n\nfunc (x *RetryPolicy) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[28]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RetryPolicy.ProtoReflect.Descriptor instead.\nfunc (*RetryPolicy) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{28}\n}\n\nfunc (m *RetryPolicy) GetPolicy() isRetryPolicy_Policy {\n\tif m != nil {\n\t\treturn m.Policy\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicy) GetConstant() *RetryPolicyConstant {\n\tif x, ok := x.GetPolicy().(*RetryPolicy_Constant); ok {\n\t\treturn x.Constant\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicy) GetExponential() *RetryPolicyExponential {\n\tif x, ok := x.GetPolicy().(*RetryPolicy_Exponential); ok {\n\t\treturn x.Exponential\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicy) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\ntype isRetryPolicy_Policy interface {\n\tisRetryPolicy_Policy()\n}\n\ntype RetryPolicy_Constant struct {\n\t// retry according to the \"constant\" policy.\n\tConstant *RetryPolicyConstant `protobuf:\"bytes,1,opt,name=constant,proto3,oneof\"`\n}\n\ntype RetryPolicy_Exponential struct {\n\t// retry according to the \"exponential backoff\" policy.\n\t// The following Go library is used in the implementation,\n\t// so please refer to the library documentation for how to specify each parameter.\n\t// https://pkg.go.dev/github.com/cenkalti/backoff/v4#section-readme.\n\tExponential *RetryPolicyExponential `protobuf:\"bytes,2,opt,name=exponential,proto3,oneof\"`\n}\n\nfunc (*RetryPolicy_Constant) isRetryPolicy_Policy() {}\n\nfunc (*RetryPolicy_Exponential) isRetryPolicy_Policy() {}\n\n// RetryPolicyConstant define \"constant\" based retry policy.\ntype RetryPolicyConstant struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// interval value. ( default value is 1s ).\n\tInterval *string `protobuf:\"bytes,1,opt,name=interval,proto3,oneof\" json:\"interval,omitempty\"`\n\t// max retry count. ( default value is 5. If zero is specified, it never stops )\n\tMaxRetries *uint64 `protobuf:\"varint,2,opt,name=max_retries,json=maxRetries,proto3,oneof\" json:\"max_retries,omitempty\"`\n}\n\nfunc (x *RetryPolicyConstant) Reset() {\n\t*x = RetryPolicyConstant{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[29]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RetryPolicyConstant) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RetryPolicyConstant) ProtoMessage() {}\n\nfunc (x *RetryPolicyConstant) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[29]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RetryPolicyConstant.ProtoReflect.Descriptor instead.\nfunc (*RetryPolicyConstant) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{29}\n}\n\nfunc (x *RetryPolicyConstant) GetInterval() string {\n\tif x != nil && x.Interval != nil {\n\t\treturn *x.Interval\n\t}\n\treturn \"\"\n}\n\nfunc (x *RetryPolicyConstant) GetMaxRetries() uint64 {\n\tif x != nil && x.MaxRetries != nil {\n\t\treturn *x.MaxRetries\n\t}\n\treturn 0\n}\n\n// RetryPolicyExponential define \"exponential backoff\" based retry policy.\ntype RetryPolicyExponential struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// initial interval value. ( default value is \"500ms\" ).\n\tInitialInterval *string `protobuf:\"bytes,1,opt,name=initial_interval,json=initialInterval,proto3,oneof\" json:\"initial_interval,omitempty\"`\n\t// randomization factor value. ( default value is 0.5 ).\n\tRandomizationFactor *float64 `protobuf:\"fixed64,2,opt,name=randomization_factor,json=randomizationFactor,proto3,oneof\" json:\"randomization_factor,omitempty\"`\n\t// multiplier. ( default value is 1.5 ).\n\tMultiplier *float64 `protobuf:\"fixed64,3,opt,name=multiplier,proto3,oneof\" json:\"multiplier,omitempty\"`\n\t// max interval value. ( default value is \"60s\" ).\n\tMaxInterval *string `protobuf:\"bytes,4,opt,name=max_interval,json=maxInterval,proto3,oneof\" json:\"max_interval,omitempty\"`\n\t// max retry count. ( default value is 5. If zero is specified, it never stops ).\n\tMaxRetries *uint64 `protobuf:\"varint,5,opt,name=max_retries,json=maxRetries,proto3,oneof\" json:\"max_retries,omitempty\"`\n}\n\nfunc (x *RetryPolicyExponential) Reset() {\n\t*x = RetryPolicyExponential{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[30]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RetryPolicyExponential) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RetryPolicyExponential) ProtoMessage() {}\n\nfunc (x *RetryPolicyExponential) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[30]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RetryPolicyExponential.ProtoReflect.Descriptor instead.\nfunc (*RetryPolicyExponential) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{30}\n}\n\nfunc (x *RetryPolicyExponential) GetInitialInterval() string {\n\tif x != nil && x.InitialInterval != nil {\n\t\treturn *x.InitialInterval\n\t}\n\treturn \"\"\n}\n\nfunc (x *RetryPolicyExponential) GetRandomizationFactor() float64 {\n\tif x != nil && x.RandomizationFactor != nil {\n\t\treturn *x.RandomizationFactor\n\t}\n\treturn 0\n}\n\nfunc (x *RetryPolicyExponential) GetMultiplier() float64 {\n\tif x != nil && x.Multiplier != nil {\n\t\treturn *x.Multiplier\n\t}\n\treturn 0\n}\n\nfunc (x *RetryPolicyExponential) GetMaxInterval() string {\n\tif x != nil && x.MaxInterval != nil {\n\t\treturn *x.MaxInterval\n\t}\n\treturn \"\"\n}\n\nfunc (x *RetryPolicyExponential) GetMaxRetries() uint64 {\n\tif x != nil && x.MaxRetries != nil {\n\t\treturn *x.MaxRetries\n\t}\n\treturn 0\n}\n\n// MethodRequest define parameters to be used for gRPC method request.\ntype MethodRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// field name of the request message.\n\tField string `protobuf:\"bytes,1,opt,name=field,proto3\" json:\"field,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tBy *string `protobuf:\"bytes,2,opt,name=by,proto3,oneof\" json:\"by,omitempty\"`\n\t// if describes the condition to be assigned to field.\n\t// The return value must be of type bool.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\t// If the field is a 'oneof' field, it must be specified.\n\tIf *string `protobuf:\"bytes,3,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n}\n\nfunc (x *MethodRequest) Reset() {\n\t*x = MethodRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[31]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MethodRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MethodRequest) ProtoMessage() {}\n\nfunc (x *MethodRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[31]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MethodRequest.ProtoReflect.Descriptor instead.\nfunc (*MethodRequest) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{31}\n}\n\nfunc (x *MethodRequest) GetField() string {\n\tif x != nil {\n\t\treturn x.Field\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodRequest) GetBy() string {\n\tif x != nil && x.By != nil {\n\t\treturn *x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodRequest) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\n// MethodResponse define which value of the method response is referenced.\ntype MethodResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name specify the unique name that can be used in a `MessageRule` / `FieldRule` for the same message for a specific field in the response.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// field name in response message.\n\tField *string `protobuf:\"bytes,2,opt,name=field,proto3,oneof\" json:\"field,omitempty\"`\n\t// autobind if the value referenced by `field` is a message type,\n\t// the value of a field with the same name and type as the field name of its own message is automatically assigned to the value of the field in the message.\n\t// If multiple autobinds are used at the same message,\n\t// you must explicitly use the `grpc.federation.field` option to do the binding yourself, since duplicate field names cannot be correctly determined as one.\n\tAutobind *bool `protobuf:\"varint,3,opt,name=autobind,proto3,oneof\" json:\"autobind,omitempty\"`\n}\n\nfunc (x *MethodResponse) Reset() {\n\t*x = MethodResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[32]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MethodResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MethodResponse) ProtoMessage() {}\n\nfunc (x *MethodResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[32]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MethodResponse.ProtoReflect.Descriptor instead.\nfunc (*MethodResponse) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{32}\n}\n\nfunc (x *MethodResponse) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodResponse) GetField() string {\n\tif x != nil && x.Field != nil {\n\t\treturn *x.Field\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodResponse) GetAutobind() bool {\n\tif x != nil && x.Autobind != nil {\n\t\treturn *x.Autobind\n\t}\n\treturn false\n}\n\n// Argument define message argument.\ntype Argument struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name of the message argument.\n\t// Use this name to refer to the message argument.\n\t// For example, if `foo` is specified as the name, it is referenced by `$.foo`.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tBy *string `protobuf:\"bytes,2,opt,name=by,proto3,oneof\" json:\"by,omitempty\"`\n\t// inline like by, it refers to the specified value and expands all fields beyond it.\n\t// For this reason, the referenced value must always be of message type.\n\tInline *string `protobuf:\"bytes,3,opt,name=inline,proto3,oneof\" json:\"inline,omitempty\"`\n}\n\nfunc (x *Argument) Reset() {\n\t*x = Argument{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[33]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Argument) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Argument) ProtoMessage() {}\n\nfunc (x *Argument) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[33]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Argument.ProtoReflect.Descriptor instead.\nfunc (*Argument) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{33}\n}\n\nfunc (x *Argument) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Argument) GetBy() string {\n\tif x != nil && x.By != nil {\n\t\treturn *x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *Argument) GetInline() string {\n\tif x != nil && x.Inline != nil {\n\t\treturn *x.Inline\n\t}\n\treturn \"\"\n}\n\n// FieldRule define gRPC Federation rules for the field of message.\ntype FieldRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// If custom_resolver is true, the field binding process is to be implemented in Go.\n\t// If there are any values retrieved by grpc.federation.message option, they are passed as arguments for custom resolver.\n\tCustomResolver *bool `protobuf:\"varint,1,opt,name=custom_resolver,json=customResolver,proto3,oneof\" json:\"custom_resolver,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tBy *string `protobuf:\"bytes,2,opt,name=by,proto3,oneof\" json:\"by,omitempty\"`\n\t// alias can be used when alias is specified in grpc.federation.message option,\n\t// and specifies the field name to be referenced among the messages specified in alias of message option.\n\t// If the specified field has the same type or can be converted automatically, its value is assigned.\n\tAlias *string `protobuf:\"bytes,3,opt,name=alias,proto3,oneof\" json:\"alias,omitempty\"`\n\t// use to evaluate any one of fields. this field only available in oneof.\n\tOneof *FieldOneof `protobuf:\"bytes,4,opt,name=oneof,proto3\" json:\"oneof,omitempty\"`\n\t// when defining an environment variable, use it for fields where you want to set additional options.\n\tEnv *EnvVarOption `protobuf:\"bytes,5,opt,name=env,proto3\" json:\"env,omitempty\"`\n}\n\nfunc (x *FieldRule) Reset() {\n\t*x = FieldRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[34]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *FieldRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*FieldRule) ProtoMessage() {}\n\nfunc (x *FieldRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[34]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use FieldRule.ProtoReflect.Descriptor instead.\nfunc (*FieldRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{34}\n}\n\nfunc (x *FieldRule) GetCustomResolver() bool {\n\tif x != nil && x.CustomResolver != nil {\n\t\treturn *x.CustomResolver\n\t}\n\treturn false\n}\n\nfunc (x *FieldRule) GetBy() string {\n\tif x != nil && x.By != nil {\n\t\treturn *x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *FieldRule) GetAlias() string {\n\tif x != nil && x.Alias != nil {\n\t\treturn *x.Alias\n\t}\n\treturn \"\"\n}\n\nfunc (x *FieldRule) GetOneof() *FieldOneof {\n\tif x != nil {\n\t\treturn x.Oneof\n\t}\n\treturn nil\n}\n\nfunc (x *FieldRule) GetEnv() *EnvVarOption {\n\tif x != nil {\n\t\treturn x.Env\n\t}\n\treturn nil\n}\n\n// FieldOneof evaluate \"messages\" or other field only if expr is true and assign to the oneof field.\n// This feature only available in oneof.\ntype FieldOneof struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// cond specify either `expr` or `default`. Only one `default` can be set per oneof.\n\t//\n\t// Types that are assignable to Cond:\n\t//\n\t//\t*FieldOneof_If\n\t//\t*FieldOneof_Default\n\tCond isFieldOneof_Cond `protobuf_oneof:\"cond\"`\n\t// def specify variables to be used in current oneof field's scope for field binding.\n\tDef []*VariableDefinition `protobuf:\"bytes,3,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule and FieldOneOf can be used.\n\tBy string `protobuf:\"bytes,4,opt,name=by,proto3\" json:\"by,omitempty\"`\n}\n\nfunc (x *FieldOneof) Reset() {\n\t*x = FieldOneof{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[35]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *FieldOneof) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*FieldOneof) ProtoMessage() {}\n\nfunc (x *FieldOneof) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[35]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use FieldOneof.ProtoReflect.Descriptor instead.\nfunc (*FieldOneof) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{35}\n}\n\nfunc (m *FieldOneof) GetCond() isFieldOneof_Cond {\n\tif m != nil {\n\t\treturn m.Cond\n\t}\n\treturn nil\n}\n\nfunc (x *FieldOneof) GetIf() string {\n\tif x, ok := x.GetCond().(*FieldOneof_If); ok {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *FieldOneof) GetDefault() bool {\n\tif x, ok := x.GetCond().(*FieldOneof_Default); ok {\n\t\treturn x.Default\n\t}\n\treturn false\n}\n\nfunc (x *FieldOneof) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *FieldOneof) GetBy() string {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\ntype isFieldOneof_Cond interface {\n\tisFieldOneof_Cond()\n}\n\ntype FieldOneof_If struct {\n\t// if describes the condition to be assigned to field.\n\t// The return value must be of type bool.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3,oneof\"`\n}\n\ntype FieldOneof_Default struct {\n\t// default used to assign a value when none of the other fields match any of the specified expressions.\n\t// Only one value can be defined per oneof.\n\tDefault bool `protobuf:\"varint,2,opt,name=default,proto3,oneof\"`\n}\n\nfunc (*FieldOneof_If) isFieldOneof_Cond() {}\n\nfunc (*FieldOneof_Default) isFieldOneof_Cond() {}\n\n// CELPlugin define schema of CEL plugin.\ntype CELPlugin struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tExport []*CELPluginExport `protobuf:\"bytes,1,rep,name=export,proto3\" json:\"export,omitempty\"`\n}\n\nfunc (x *CELPlugin) Reset() {\n\t*x = CELPlugin{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[36]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPlugin) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPlugin) ProtoMessage() {}\n\nfunc (x *CELPlugin) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[36]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPlugin.ProtoReflect.Descriptor instead.\nfunc (*CELPlugin) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{36}\n}\n\nfunc (x *CELPlugin) GetExport() []*CELPluginExport {\n\tif x != nil {\n\t\treturn x.Export\n\t}\n\treturn nil\n}\n\n// CELPluginExport describe the schema to be exposed as a CEL plugin.\ntype CELPluginExport struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the plugin name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// types describe the message type you want to expose.\n\tTypes []*CELReceiverType `protobuf:\"bytes,3,rep,name=types,proto3\" json:\"types,omitempty\"`\n\t// functions describe the definition of the function you want to expose.\n\tFunctions []*CELFunction `protobuf:\"bytes,4,rep,name=functions,proto3\" json:\"functions,omitempty\"`\n\t// variables describe the definition of the variable you want to expose.\n\tVariables  []*CELVariable       `protobuf:\"bytes,5,rep,name=variables,proto3\" json:\"variables,omitempty\"`\n\tCapability *CELPluginCapability `protobuf:\"bytes,6,opt,name=capability,proto3\" json:\"capability,omitempty\"`\n}\n\nfunc (x *CELPluginExport) Reset() {\n\t*x = CELPluginExport{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[37]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginExport) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginExport) ProtoMessage() {}\n\nfunc (x *CELPluginExport) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[37]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginExport.ProtoReflect.Descriptor instead.\nfunc (*CELPluginExport) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{37}\n}\n\nfunc (x *CELPluginExport) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELPluginExport) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELPluginExport) GetTypes() []*CELReceiverType {\n\tif x != nil {\n\t\treturn x.Types\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginExport) GetFunctions() []*CELFunction {\n\tif x != nil {\n\t\treturn x.Functions\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginExport) GetVariables() []*CELVariable {\n\tif x != nil {\n\t\treturn x.Variables\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginExport) GetCapability() *CELPluginCapability {\n\tif x != nil {\n\t\treturn x.Capability\n\t}\n\treturn nil\n}\n\n// CELPluginCapability controls the permissions granted to the WebAssembly plugin.\ntype CELPluginCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// env is the capability for environment variable.\n\tEnv *CELPluginEnvCapability `protobuf:\"bytes,1,opt,name=env,proto3,oneof\" json:\"env,omitempty\"`\n\t// file_system is the capability for file system.\n\tFileSystem *CELPluginFileSystemCapability `protobuf:\"bytes,2,opt,name=file_system,json=fileSystem,proto3,oneof\" json:\"file_system,omitempty\"`\n\t// network is the capability for network.\n\tNetwork *CELPluginNetworkCapability `protobuf:\"bytes,3,opt,name=network,proto3,oneof\" json:\"network,omitempty\"`\n}\n\nfunc (x *CELPluginCapability) Reset() {\n\t*x = CELPluginCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[38]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginCapability) ProtoMessage() {}\n\nfunc (x *CELPluginCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[38]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{38}\n}\n\nfunc (x *CELPluginCapability) GetEnv() *CELPluginEnvCapability {\n\tif x != nil {\n\t\treturn x.Env\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginCapability) GetFileSystem() *CELPluginFileSystemCapability {\n\tif x != nil {\n\t\treturn x.FileSystem\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginCapability) GetNetwork() *CELPluginNetworkCapability {\n\tif x != nil {\n\t\treturn x.Network\n\t}\n\treturn nil\n}\n\n// CELPluginEnvCapability controls access to the environment variable.\ntype CELPluginEnvCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// all allows access to all environment variables.\n\tAll bool `protobuf:\"varint,1,opt,name=all,proto3\" json:\"all,omitempty\"`\n\t// specifies accessible names. If \"all\" is true, it takes precedence.\n\tNames []string `protobuf:\"bytes,2,rep,name=names,proto3\" json:\"names,omitempty\"`\n}\n\nfunc (x *CELPluginEnvCapability) Reset() {\n\t*x = CELPluginEnvCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[39]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginEnvCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginEnvCapability) ProtoMessage() {}\n\nfunc (x *CELPluginEnvCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[39]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginEnvCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginEnvCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{39}\n}\n\nfunc (x *CELPluginEnvCapability) GetAll() bool {\n\tif x != nil {\n\t\treturn x.All\n\t}\n\treturn false\n}\n\nfunc (x *CELPluginEnvCapability) GetNames() []string {\n\tif x != nil {\n\t\treturn x.Names\n\t}\n\treturn nil\n}\n\n// CELPluginFileSystemCapability controls access to the file system.\ntype CELPluginFileSystemCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// mount_path specifies the file path of the host to mount.\n\t// If not specified, the root directory will be used.\n\tMountPath string `protobuf:\"bytes,1,opt,name=mount_path,json=mountPath,proto3\" json:\"mount_path,omitempty\"`\n}\n\nfunc (x *CELPluginFileSystemCapability) Reset() {\n\t*x = CELPluginFileSystemCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[40]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginFileSystemCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginFileSystemCapability) ProtoMessage() {}\n\nfunc (x *CELPluginFileSystemCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[40]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginFileSystemCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginFileSystemCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{40}\n}\n\nfunc (x *CELPluginFileSystemCapability) GetMountPath() string {\n\tif x != nil {\n\t\treturn x.MountPath\n\t}\n\treturn \"\"\n}\n\n// CELPluginNetworkCapability sets permissions related to network access.\n// This is an experimental feature.\ntype CELPluginNetworkCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *CELPluginNetworkCapability) Reset() {\n\t*x = CELPluginNetworkCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[41]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginNetworkCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginNetworkCapability) ProtoMessage() {}\n\nfunc (x *CELPluginNetworkCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[41]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginNetworkCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginNetworkCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{41}\n}\n\n// CELFunction represents the CEL function definition.\ntype CELFunction struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the function name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of function.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// args describe the definition of the function argument.\n\tArgs []*CELFunctionArgument `protobuf:\"bytes,3,rep,name=args,proto3\" json:\"args,omitempty\"`\n\t// return describe the definition of return type of function.\n\tReturn *CELType `protobuf:\"bytes,4,opt,name=return,proto3\" json:\"return,omitempty\"`\n}\n\nfunc (x *CELFunction) Reset() {\n\t*x = CELFunction{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[42]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELFunction) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELFunction) ProtoMessage() {}\n\nfunc (x *CELFunction) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[42]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELFunction.ProtoReflect.Descriptor instead.\nfunc (*CELFunction) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{42}\n}\n\nfunc (x *CELFunction) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunction) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunction) GetArgs() []*CELFunctionArgument {\n\tif x != nil {\n\t\treturn x.Args\n\t}\n\treturn nil\n}\n\nfunc (x *CELFunction) GetReturn() *CELType {\n\tif x != nil {\n\t\treturn x.Return\n\t}\n\treturn nil\n}\n\n// CELReceiverType represents methods tied to the message.\ntype CELReceiverType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the message name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// methods describe the definition of the method for the message.\n\tMethods []*CELFunction `protobuf:\"bytes,3,rep,name=methods,proto3\" json:\"methods,omitempty\"`\n}\n\nfunc (x *CELReceiverType) Reset() {\n\t*x = CELReceiverType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[43]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELReceiverType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELReceiverType) ProtoMessage() {}\n\nfunc (x *CELReceiverType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[43]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELReceiverType.ProtoReflect.Descriptor instead.\nfunc (*CELReceiverType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{43}\n}\n\nfunc (x *CELReceiverType) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELReceiverType) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELReceiverType) GetMethods() []*CELFunction {\n\tif x != nil {\n\t\treturn x.Methods\n\t}\n\treturn nil\n}\n\n// CELFunctionArgument represents the function argument.\ntype CELFunctionArgument struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the argument value name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// type is the argument type.\n\tType *CELType `protobuf:\"bytes,3,opt,name=type,proto3\" json:\"type,omitempty\"`\n}\n\nfunc (x *CELFunctionArgument) Reset() {\n\t*x = CELFunctionArgument{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[44]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELFunctionArgument) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELFunctionArgument) ProtoMessage() {}\n\nfunc (x *CELFunctionArgument) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[44]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELFunctionArgument.ProtoReflect.Descriptor instead.\nfunc (*CELFunctionArgument) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{44}\n}\n\nfunc (x *CELFunctionArgument) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunctionArgument) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunctionArgument) GetType() *CELType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\n// CELType represents type information for CEL plugin interface.\ntype CELType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to Type:\n\t//\n\t//\t*CELType_Kind\n\t//\t*CELType_Repeated\n\t//\t*CELType_Map\n\t//\t*CELType_Message\n\t//\t*CELType_Enum\n\tType isCELType_Type `protobuf_oneof:\"type\"`\n}\n\nfunc (x *CELType) Reset() {\n\t*x = CELType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[45]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELType) ProtoMessage() {}\n\nfunc (x *CELType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[45]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELType.ProtoReflect.Descriptor instead.\nfunc (*CELType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{45}\n}\n\nfunc (m *CELType) GetType() isCELType_Type {\n\tif m != nil {\n\t\treturn m.Type\n\t}\n\treturn nil\n}\n\nfunc (x *CELType) GetKind() TypeKind {\n\tif x, ok := x.GetType().(*CELType_Kind); ok {\n\t\treturn x.Kind\n\t}\n\treturn TypeKind_UNKNOWN\n}\n\nfunc (x *CELType) GetRepeated() *CELType {\n\tif x, ok := x.GetType().(*CELType_Repeated); ok {\n\t\treturn x.Repeated\n\t}\n\treturn nil\n}\n\nfunc (x *CELType) GetMap() *CELMapType {\n\tif x, ok := x.GetType().(*CELType_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\nfunc (x *CELType) GetMessage() string {\n\tif x, ok := x.GetType().(*CELType_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELType) GetEnum() string {\n\tif x, ok := x.GetType().(*CELType_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn \"\"\n}\n\ntype isCELType_Type interface {\n\tisCELType_Type()\n}\n\ntype CELType_Kind struct {\n\t// kind is used when the type is a primitive type.\n\tKind TypeKind `protobuf:\"varint,1,opt,name=kind,proto3,enum=grpc.federation.TypeKind,oneof\"`\n}\n\ntype CELType_Repeated struct {\n\t// repeated is used when the type is a repeated type.\n\tRepeated *CELType `protobuf:\"bytes,2,opt,name=repeated,proto3,oneof\"`\n}\n\ntype CELType_Map struct {\n\t// map is used when the type is a map type.\n\tMap *CELMapType `protobuf:\"bytes,3,opt,name=map,proto3,oneof\"`\n}\n\ntype CELType_Message struct {\n\t// message is a fqdn to the message type.\n\tMessage string `protobuf:\"bytes,4,opt,name=message,proto3,oneof\"`\n}\n\ntype CELType_Enum struct {\n\t// enum is a fqdn to the enum type.\n\tEnum string `protobuf:\"bytes,5,opt,name=enum,proto3,oneof\"`\n}\n\nfunc (*CELType_Kind) isCELType_Type() {}\n\nfunc (*CELType_Repeated) isCELType_Type() {}\n\nfunc (*CELType_Map) isCELType_Type() {}\n\nfunc (*CELType_Message) isCELType_Type() {}\n\nfunc (*CELType_Enum) isCELType_Type() {}\n\n// CELMapType represents map type.\ntype CELMapType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// key represents map's key type.\n\tKey *CELType `protobuf:\"bytes,1,opt,name=key,proto3\" json:\"key,omitempty\"`\n\t// value represents map's value type.\n\tValue *CELType `protobuf:\"bytes,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *CELMapType) Reset() {\n\t*x = CELMapType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[46]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELMapType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELMapType) ProtoMessage() {}\n\nfunc (x *CELMapType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[46]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELMapType.ProtoReflect.Descriptor instead.\nfunc (*CELMapType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{46}\n}\n\nfunc (x *CELMapType) GetKey() *CELType {\n\tif x != nil {\n\t\treturn x.Key\n\t}\n\treturn nil\n}\n\nfunc (x *CELMapType) GetValue() *CELType {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn nil\n}\n\n// CELVariable represents CEL variable.\ntype CELVariable struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the variable name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// type is the variable type.\n\tType *CELType `protobuf:\"bytes,3,opt,name=type,proto3\" json:\"type,omitempty\"`\n}\n\nfunc (x *CELVariable) Reset() {\n\t*x = CELVariable{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[47]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELVariable) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELVariable) ProtoMessage() {}\n\nfunc (x *CELVariable) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[47]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELVariable.ProtoReflect.Descriptor instead.\nfunc (*CELVariable) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{47}\n}\n\nfunc (x *CELVariable) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELVariable) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELVariable) GetType() *CELType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nvar file_grpc_federation_federation_proto_extTypes = []protoimpl.ExtensionInfo{\n\t{\n\t\tExtendedType:  (*descriptorpb.FileOptions)(nil),\n\t\tExtensionType: (*FileRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.file\",\n\t\tTag:           \"bytes,1187,opt,name=file\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*ServiceRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.service\",\n\t\tTag:           \"bytes,1187,opt,name=service\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*MethodRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.method\",\n\t\tTag:           \"bytes,1187,opt,name=method\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MessageOptions)(nil),\n\t\tExtensionType: (*MessageRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.message\",\n\t\tTag:           \"bytes,1187,opt,name=message\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*FieldRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.field\",\n\t\tTag:           \"bytes,1187,opt,name=field\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.EnumOptions)(nil),\n\t\tExtensionType: (*EnumRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.enum\",\n\t\tTag:           \"bytes,1187,opt,name=enum\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.EnumValueOptions)(nil),\n\t\tExtensionType: (*EnumValueRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.enum_value\",\n\t\tTag:           \"bytes,1187,opt,name=enum_value\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.OneofOptions)(nil),\n\t\tExtensionType: (*OneofRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.oneof\",\n\t\tTag:           \"bytes,1187,opt,name=oneof\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n}\n\n// Extension fields to descriptorpb.FileOptions.\nvar (\n\t// optional grpc.federation.FileRule file = 1187;\n\tE_File = &file_grpc_federation_federation_proto_extTypes[0]\n)\n\n// Extension fields to descriptorpb.ServiceOptions.\nvar (\n\t// optional grpc.federation.ServiceRule service = 1187;\n\tE_Service = &file_grpc_federation_federation_proto_extTypes[1]\n)\n\n// Extension fields to descriptorpb.MethodOptions.\nvar (\n\t// optional grpc.federation.MethodRule method = 1187;\n\tE_Method = &file_grpc_federation_federation_proto_extTypes[2]\n)\n\n// Extension fields to descriptorpb.MessageOptions.\nvar (\n\t// optional grpc.federation.MessageRule message = 1187;\n\tE_Message = &file_grpc_federation_federation_proto_extTypes[3]\n)\n\n// Extension fields to descriptorpb.FieldOptions.\nvar (\n\t// optional grpc.federation.FieldRule field = 1187;\n\tE_Field = &file_grpc_federation_federation_proto_extTypes[4]\n)\n\n// Extension fields to descriptorpb.EnumOptions.\nvar (\n\t// optional grpc.federation.EnumRule enum = 1187;\n\tE_Enum = &file_grpc_federation_federation_proto_extTypes[5]\n)\n\n// Extension fields to descriptorpb.EnumValueOptions.\nvar (\n\t// optional grpc.federation.EnumValueRule enum_value = 1187;\n\tE_EnumValue = &file_grpc_federation_federation_proto_extTypes[6]\n)\n\n// Extension fields to descriptorpb.OneofOptions.\nvar (\n\t// optional grpc.federation.OneofRule oneof = 1187;\n\tE_Oneof = &file_grpc_federation_federation_proto_extTypes[7]\n)\n\nvar File_grpc_federation_federation_proto protoreflect.FileDescriptor\n\nvar file_grpc_federation_federation_proto_rawDesc = []byte{\n\t0x0a, 0x20, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x12, 0x0f, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70,\n\t0x63, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x64,\n\t0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x67, 0x72,\n\t0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x70, 0x72,\n\t0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x67, 0x72, 0x70,\n\t0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x74, 0x69, 0x6d,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x56, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x52,\n\t0x75, 0x6c, 0x65, 0x12, 0x32, 0x0a, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52,\n\t0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6d, 0x70, 0x6f, 0x72,\n\t0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x22,\n\t0x20, 0x0a, 0x08, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61,\n\t0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61,\n\t0x73, 0x22, 0xb4, 0x01, 0x0a, 0x0d, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52,\n\t0x75, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x88,\n\t0x01, 0x01, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,\n\t0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x37, 0x0a, 0x04, 0x61, 0x74, 0x74, 0x72,\n\t0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c,\n\t0x75, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, 0x04, 0x61, 0x74, 0x74,\n\t0x72, 0x12, 0x1d, 0x0a, 0x07, 0x6e, 0x6f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x04, 0x20, 0x01,\n\t0x28, 0x08, 0x48, 0x01, 0x52, 0x07, 0x6e, 0x6f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x88, 0x01, 0x01,\n\t0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x42, 0x0a, 0x0a, 0x08,\n\t0x5f, 0x6e, 0x6f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x3e, 0x0a, 0x12, 0x45, 0x6e, 0x75, 0x6d,\n\t0x56, 0x61, 0x6c, 0x75, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x12, 0x12,\n\t0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x0b, 0x0a, 0x09, 0x4f, 0x6e, 0x65, 0x6f,\n\t0x66, 0x52, 0x75, 0x6c, 0x65, 0x22, 0x69, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n\t0x52, 0x75, 0x6c, 0x65, 0x12, 0x26, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x14, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x32, 0x0a, 0x03,\n\t0x76, 0x61, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x03, 0x76, 0x61, 0x72,\n\t0x22, 0x4a, 0x0a, 0x03, 0x45, 0x6e, 0x76, 0x12, 0x29, 0x0a, 0x03, 0x76, 0x61, 0x72, 0x18, 0x01,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x52, 0x03, 0x76,\n\t0x61, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x8b, 0x03, 0x0a,\n\t0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65,\n\t0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01,\n\t0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x66, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x02, 0x69, 0x66, 0x88, 0x01, 0x01, 0x12, 0x10,\n\t0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x62, 0x79,\n\t0x12, 0x2c, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x4d, 0x61, 0x70, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x70, 0x12, 0x38,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52,\n\t0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x50, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x69,\n\t0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x61,\n\t0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x0a,\n\t0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x04, 0x65, 0x6e,\n\t0x75, 0x6d, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x45,\n\t0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x35, 0x0a, 0x06, 0x73,\n\t0x77, 0x69, 0x74, 0x63, 0x68, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x77,\n\t0x69, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x06, 0x73, 0x77, 0x69, 0x74,\n\t0x63, 0x68, 0x42, 0x06, 0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e,\n\t0x61, 0x6d, 0x65, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x66, 0x22, 0x49, 0x0a, 0x1d, 0x53, 0x65,\n\t0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c,\n\t0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69,\n\t0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x66, 0x12, 0x18, 0x0a, 0x07, 0x6d,\n\t0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65,\n\t0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x06, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72,\n\t0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79,\n\t0x70, 0x65, 0x12, 0x3a, 0x0a, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x48, 0x00, 0x52, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x09,\n\t0x0a, 0x07, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xab, 0x01, 0x0a, 0x07, 0x45, 0x6e,\n\t0x76, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2f, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x00,\n\t0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x36, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74,\n\t0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79,\n\t0x70, 0x65, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2f,\n\t0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e,\n\t0x76, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x70, 0x42,\n\t0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x68, 0x0a, 0x0a, 0x45, 0x6e, 0x76, 0x4d, 0x61,\n\t0x70, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2a, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79, 0x70, 0x65, 0x52, 0x03, 0x6b, 0x65,\n\t0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,\n\t0x65, 0x22, 0xc3, 0x01, 0x0a, 0x0c, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x09, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61,\n\t0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c,\n\t0x74, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72,\n\t0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64,\n\t0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x07, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65,\n\t0x64, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61,\n\t0x74, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x42, 0x0b,\n\t0x0a, 0x09, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x5f,\n\t0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x22, 0x65, 0x0a, 0x0a, 0x4d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75,\n\t0x74, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e,\n\t0x73, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75,\n\t0x74, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9c,\n\t0x01, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x35,\n\t0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61,\n\t0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e,\n\t0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f,\n\t0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00,\n\t0x52, 0x0e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72,\n\t0x88, 0x01, 0x01, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x03, 0x20, 0x03,\n\t0x28, 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x75,\n\t0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x22, 0xde, 0x03,\n\t0x0a, 0x12, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69,\n\t0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x48, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x13, 0x0a,\n\t0x02, 0x69, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x02, 0x69, 0x66, 0x88,\n\t0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x18, 0x03,\n\t0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64,\n\t0x88, 0x01, 0x01, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48,\n\t0x00, 0x52, 0x02, 0x62, 0x79, 0x12, 0x2c, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x0c, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x61, 0x70, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x03,\n\t0x6d, 0x61, 0x70, 0x12, 0x38, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0d,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78,\n\t0x70, 0x72, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2f, 0x0a,\n\t0x04, 0x63, 0x61, 0x6c, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x61,\n\t0x6c, 0x6c, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x63, 0x61, 0x6c, 0x6c, 0x12, 0x41,\n\t0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45,\n\t0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x12, 0x2f, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e,\n\t0x75, 0x6d, 0x12, 0x35, 0x0a, 0x06, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x18, 0x11, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x48,\n\t0x00, 0x52, 0x06, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x42, 0x06, 0x0a, 0x04, 0x65, 0x78, 0x70,\n\t0x72, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69,\n\t0x66, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x22, 0xc5,\n\t0x01, 0x0a, 0x07, 0x4d, 0x61, 0x70, 0x45, 0x78, 0x70, 0x72, 0x12, 0x35, 0x0a, 0x08, 0x69, 0x74,\n\t0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49,\n\t0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f,\n\t0x72, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,\n\t0x02, 0x62, 0x79, 0x12, 0x38, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0c,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78,\n\t0x70, 0x72, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2f, 0x0a,\n\t0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e,\n\t0x75, 0x6d, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x42, 0x06,\n\t0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x22, 0x30, 0x0a, 0x08, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74,\n\t0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x72, 0x63, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x72, 0x63, 0x22, 0x50, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x45, 0x78, 0x70, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x04, 0x61,\n\t0x72, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x41, 0x72, 0x67, 0x75,\n\t0x6d, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x22, 0x2e, 0x0a, 0x08, 0x45, 0x6e,\n\t0x75, 0x6d, 0x45, 0x78, 0x70, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x62, 0x79,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x62, 0x79, 0x22, 0xf3, 0x02, 0x0a, 0x08, 0x43,\n\t0x61, 0x6c, 0x6c, 0x45, 0x78, 0x70, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12,\n\t0x38, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x07, 0x74, 0x69, 0x6d,\n\t0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x74, 0x69,\n\t0x6d, 0x65, 0x6f, 0x75, 0x74, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x05, 0x72, 0x65, 0x74, 0x72,\n\t0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50,\n\t0x6f, 0x6c, 0x69, 0x63, 0x79, 0x48, 0x01, 0x52, 0x05, 0x72, 0x65, 0x74, 0x72, 0x79, 0x88, 0x01,\n\t0x01, 0x12, 0x30, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72,\n\t0x72, 0x6f, 0x72, 0x12, 0x3c, 0x0a, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x43, 0x61, 0x6c, 0x6c, 0x4f, 0x70,\n\t0x74, 0x69, 0x6f, 0x6e, 0x48, 0x02, 0x52, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01,\n\t0x01, 0x12, 0x1f, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20,\n\t0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x88,\n\t0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x42, 0x08,\n\t0x0a, 0x06, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x79, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,\n\t0x22, 0x7f, 0x0a, 0x0a, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x12, 0x33,\n\t0x0a, 0x04, 0x63, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53,\n\t0x77, 0x69, 0x74, 0x63, 0x68, 0x43, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x72, 0x52, 0x04, 0x63,\n\t0x61, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x44, 0x65, 0x66,\n\t0x61, 0x75, 0x6c, 0x74, 0x45, 0x78, 0x70, 0x72, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c,\n\t0x74, 0x22, 0x71, 0x0a, 0x0e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x43, 0x61, 0x73, 0x65, 0x45,\n\t0x78, 0x70, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x02, 0x69, 0x66, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e,\n\t0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x79,\n\t0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x62, 0x79, 0x42, 0x06, 0x0a, 0x04,\n\t0x65, 0x78, 0x70, 0x72, 0x22, 0x64, 0x0a, 0x11, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x44, 0x65,\n\t0x66, 0x61, 0x75, 0x6c, 0x74, 0x45, 0x78, 0x70, 0x72, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66,\n\t0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c,\n\t0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66,\n\t0x12, 0x10, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02,\n\t0x62, 0x79, 0x42, 0x06, 0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x22, 0x86, 0x04, 0x0a, 0x09, 0x47,\n\t0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18,\n\t0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65,\n\t0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12,\n\t0x13, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x69,\n\t0x66, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x0e, 0x32, 0x10, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e,\n\t0x43, 0x6f, 0x64, 0x65, 0x48, 0x01, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12,\n\t0x1d, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,\n\t0x48, 0x02, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a,\n\t0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x20, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69,\n\t0x6c, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x69, 0x67,\n\t0x6e, 0x6f, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x06, 0x69, 0x67,\n\t0x6e, 0x6f, 0x72, 0x65, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x67, 0x6e, 0x6f, 0x72,\n\t0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x07,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x11, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x41, 0x6e,\n\t0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x88, 0x01, 0x01, 0x12, 0x45, 0x0a, 0x09,\n\t0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32,\n\t0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x4c, 0x6f, 0x67, 0x4c,\n\t0x65, 0x76, 0x65, 0x6c, 0x48, 0x05, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c,\n\t0x88, 0x01, 0x01, 0x22, 0x41, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12,\n\t0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05,\n\t0x44, 0x45, 0x42, 0x55, 0x47, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x4e, 0x46, 0x4f, 0x10,\n\t0x02, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x41, 0x52, 0x4e, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x45,\n\t0x52, 0x52, 0x4f, 0x52, 0x10, 0x04, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x66, 0x42, 0x07, 0x0a,\n\t0x05, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61,\n\t0x67, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x42, 0x16, 0x0a,\n\t0x14, 0x5f, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x72, 0x65, 0x73,\n\t0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65,\n\t0x76, 0x65, 0x6c, 0x22, 0xfa, 0x05, 0x0a, 0x0f, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f,\n\t0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x66, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x02,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44,\n\t0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x36,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78, 0x70, 0x72, 0x52, 0x07, 0x6d,\n\t0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f,\n\t0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66,\n\t0x6f, 0x52, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x34, 0x0a, 0x0a,\n\t0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65,\n\t0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x72, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e,\n\t0x66, 0x6f, 0x12, 0x34, 0x0a, 0x0a, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x69, 0x6e, 0x66, 0x6f,\n\t0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x64,\n\t0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3d, 0x0a, 0x0d, 0x71, 0x75, 0x6f, 0x74,\n\t0x61, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x6f,\n\t0x74, 0x61, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x0c, 0x71, 0x75, 0x6f, 0x74, 0x61,\n\t0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x52, 0x0a, 0x14, 0x70, 0x72, 0x65, 0x63, 0x6f,\n\t0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18,\n\t0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72,\n\t0x70, 0x63, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x46,\n\t0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x13, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69,\n\t0x74, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x62,\n\t0x61, 0x64, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61,\n\t0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x62, 0x61, 0x64, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f,\n\t0x69, 0x6e, 0x66, 0x6f, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49,\n\t0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f,\n\t0x12, 0x3d, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66,\n\t0x6f, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66,\n\t0x6f, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12,\n\t0x24, 0x0a, 0x04, 0x68, 0x65, 0x6c, 0x70, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x48, 0x65, 0x6c, 0x70, 0x52,\n\t0x04, 0x68, 0x65, 0x6c, 0x70, 0x12, 0x49, 0x0a, 0x11, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a,\n\t0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f,\n\t0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x10,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,\n\t0x12, 0x0e, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x02, 0x62, 0x79,\n\t0x22, 0xc7, 0x03, 0x0a, 0x0e, 0x47, 0x52, 0x50, 0x43, 0x43, 0x61, 0x6c, 0x6c, 0x4f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x73,\n\t0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0e,\n\t0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x88, 0x01,\n\t0x01, 0x12, 0x1b, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x48, 0x01, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x37,\n\t0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x72, 0x65, 0x63, 0x76, 0x5f,\n\t0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02,\n\t0x52, 0x12, 0x6d, 0x61, 0x78, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x63, 0x76, 0x4d, 0x73, 0x67,\n\t0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x63,\n\t0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a,\n\t0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x43, 0x61,\n\t0x6c, 0x6c, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01,\n\t0x12, 0x28, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x48, 0x04, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x69,\n\t0x63, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x74, 0x72,\n\t0x61, 0x69, 0x6c, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x07, 0x74,\n\t0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x0e, 0x77, 0x61, 0x69,\n\t0x74, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28,\n\t0x08, 0x48, 0x06, 0x52, 0x0c, 0x77, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x52, 0x65, 0x61, 0x64,\n\t0x79, 0x88, 0x01, 0x01, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,\n\t0x5f, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x68, 0x65, 0x61,\n\t0x64, 0x65, 0x72, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c,\n\t0x5f, 0x72, 0x65, 0x63, 0x76, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x19,\n\t0x0a, 0x17, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x65, 0x6e, 0x64,\n\t0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x74,\n\t0x61, 0x74, 0x69, 0x63, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x5f,\n\t0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x77, 0x61, 0x69, 0x74,\n\t0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x22, 0x64, 0x0a, 0x0e, 0x56, 0x61,\n\t0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72, 0x12, 0x17, 0x0a, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72,\n\t0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65,\n\t0x22, 0xb8, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,\n\t0x12, 0x42, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,\n\t0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x73,\n\t0x74, 0x61, 0x6e, 0x74, 0x12, 0x4b, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74,\n\t0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x72,\n\t0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x69,\n\t0x61, 0x6c, 0x48, 0x00, 0x52, 0x0b, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x69, 0x61,\n\t0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,\n\t0x66, 0x42, 0x08, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x79, 0x0a, 0x13, 0x52,\n\t0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61,\n\t0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c,\n\t0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69,\n\t0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, 0x01, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x52,\n\t0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x69, 0x6e,\n\t0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x72,\n\t0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0xd1, 0x02, 0x0a, 0x16, 0x52, 0x65, 0x74, 0x72, 0x79,\n\t0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x69, 0x61,\n\t0x6c, 0x12, 0x2e, 0x0a, 0x10, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x74,\n\t0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0f, 0x69,\n\t0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x88, 0x01,\n\t0x01, 0x12, 0x36, 0x0a, 0x14, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x48,\n\t0x01, 0x52, 0x13, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0a, 0x6d, 0x75, 0x6c,\n\t0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x48, 0x02, 0x52,\n\t0x0a, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x26,\n\t0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x04,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x49, 0x6e, 0x74, 0x65, 0x72,\n\t0x76, 0x61, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65,\n\t0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x48, 0x04, 0x52, 0x0a, 0x6d,\n\t0x61, 0x78, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x42, 0x13, 0x0a, 0x11,\n\t0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61,\n\t0x6c, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x6d,\n\t0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6d, 0x61,\n\t0x78, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d,\n\t0x61, 0x78, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x5d, 0x0a, 0x0d, 0x4d, 0x65,\n\t0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x66,\n\t0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c,\n\t0x64, 0x12, 0x13, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,\n\t0x02, 0x62, 0x79, 0x88, 0x01, 0x01, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x48, 0x01, 0x52, 0x02, 0x69, 0x66, 0x88, 0x01, 0x01, 0x42, 0x05, 0x0a, 0x03, 0x5f,\n\t0x62, 0x79, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x66, 0x22, 0x85, 0x01, 0x0a, 0x0e, 0x4d, 0x65,\n\t0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x17, 0x0a, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x88, 0x01, 0x01,\n\t0x12, 0x1f, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x08, 0x48, 0x02, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x88, 0x01,\n\t0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x66,\n\t0x69, 0x65, 0x6c, 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e,\n\t0x64, 0x22, 0x62, 0x0a, 0x08, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x12, 0x13, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,\n\t0x02, 0x62, 0x79, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x06, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65,\n\t0x88, 0x01, 0x01, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x62, 0x79, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x69,\n\t0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0xf2, 0x01, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52,\n\t0x75, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65,\n\t0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0e,\n\t0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x88, 0x01,\n\t0x01, 0x12, 0x13, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52,\n\t0x02, 0x62, 0x79, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x88, 0x01,\n\t0x01, 0x12, 0x31, 0x0a, 0x05, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x52, 0x05, 0x6f,\n\t0x6e, 0x65, 0x6f, 0x66, 0x12, 0x2f, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x05, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x52, 0x03, 0x65, 0x6e, 0x76, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d,\n\t0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x62, 0x79,\n\t0x42, 0x08, 0x0a, 0x06, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x89, 0x01, 0x0a, 0x0a, 0x46,\n\t0x69, 0x65, 0x6c, 0x64, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x12, 0x10, 0x0a, 0x02, 0x69, 0x66, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x69, 0x66, 0x12, 0x1a, 0x0a, 0x07, 0x64,\n\t0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x07,\n\t0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x03,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44,\n\t0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x0e,\n\t0x0a, 0x02, 0x62, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x62, 0x79, 0x42, 0x06,\n\t0x0a, 0x04, 0x63, 0x6f, 0x6e, 0x64, 0x22, 0x45, 0x0a, 0x09, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75,\n\t0x67, 0x69, 0x6e, 0x12, 0x38, 0x0a, 0x06, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20,\n\t0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x45,\n\t0x78, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x06, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x22, 0xaf, 0x02,\n\t0x0a, 0x0f, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x45, 0x78, 0x70, 0x6f, 0x72,\n\t0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x36, 0x0a, 0x05, 0x74, 0x79, 0x70,\n\t0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x52, 0x65,\n\t0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x74, 0x79, 0x70, 0x65,\n\t0x73, 0x12, 0x3a, 0x0a, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69,\n\t0x6f, 0x6e, 0x52, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3a, 0x0a,\n\t0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x09,\n\t0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x44, 0x0a, 0x0a, 0x63, 0x61, 0x70,\n\t0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c,\n\t0x69, 0x74, 0x79, 0x52, 0x0a, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22,\n\t0x9b, 0x02, 0x0a, 0x13, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x70,\n\t0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x3e, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e,\n\t0x45, 0x6e, 0x76, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x48, 0x00, 0x52,\n\t0x03, 0x65, 0x6e, 0x76, 0x88, 0x01, 0x01, 0x12, 0x54, 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x65, 0x5f,\n\t0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43,\n\t0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x73, 0x74,\n\t0x65, 0x6d, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x48, 0x01, 0x52, 0x0a,\n\t0x66, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x4a, 0x0a,\n\t0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b,\n\t0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72,\n\t0x6b, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x48, 0x02, 0x52, 0x07, 0x6e,\n\t0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x88, 0x01, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x65, 0x6e,\n\t0x76, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65,\n\t0x6d, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x40, 0x0a,\n\t0x16, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x45, 0x6e, 0x76, 0x43, 0x61, 0x70,\n\t0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d,\n\t0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22,\n\t0x3e, 0x0a, 0x1d, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65,\n\t0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79,\n\t0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 0x74, 0x68, 0x22,\n\t0x1c, 0x0a, 0x1a, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x4e, 0x65, 0x74, 0x77,\n\t0x6f, 0x72, 0x6b, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22, 0xa1, 0x01,\n\t0x0a, 0x0b, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x38, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x03, 0x20,\n\t0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,\n\t0x6e, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12,\n\t0x30, 0x0a, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72,\n\t0x6e, 0x22, 0x71, 0x0a, 0x0f, 0x43, 0x45, 0x4c, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72,\n\t0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x36, 0x0a, 0x07,\n\t0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x6d, 0x65, 0x74,\n\t0x68, 0x6f, 0x64, 0x73, 0x22, 0x6b, 0x0a, 0x13, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74,\n\t0x69, 0x6f, 0x6e, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,\n\t0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64,\n\t0x65, 0x73, 0x63, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70,\n\t0x65, 0x22, 0xdd, 0x01, 0x0a, 0x07, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2f, 0x0a,\n\t0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x79,\n\t0x70, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x36,\n\t0x0a, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65,\n\t0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2f, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65,\n\t0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x70, 0x12, 0x1a, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61,\n\t0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28,\n\t0x09, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70,\n\t0x65, 0x22, 0x68, 0x0a, 0x0a, 0x43, 0x45, 0x4c, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65, 0x12,\n\t0x2a, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43,\n\t0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76,\n\t0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70,\n\t0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c,\n\t0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x63, 0x0a, 0x0b, 0x43,\n\t0x45, 0x4c, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12,\n\t0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65,\n\t0x73, 0x63, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65,\n\t0x2a, 0x5e, 0x0a, 0x08, 0x54, 0x79, 0x70, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x0b, 0x0a, 0x07,\n\t0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52,\n\t0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x4f, 0x4f, 0x4c, 0x10, 0x02, 0x12,\n\t0x09, 0x0a, 0x05, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x49,\n\t0x4e, 0x54, 0x36, 0x34, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45,\n\t0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x06,\n\t0x3a, 0x4c, 0x0a, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x46, 0x69, 0x6c, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x3a, 0x58,\n\t0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52,\n\t0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x3a, 0x54, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a, 0x58,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52,\n\t0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x50, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c,\n\t0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52,\n\t0x75, 0x6c, 0x65, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x3a, 0x4c, 0x0a, 0x04, 0x65, 0x6e,\n\t0x75, 0x6d, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x75,\n\t0x6c, 0x65, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x3a, 0x61, 0x0a, 0x0a, 0x65, 0x6e, 0x75, 0x6d,\n\t0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c,\n\t0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x1e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x75, 0x6c, 0x65,\n\t0x52, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x50, 0x0a, 0x05, 0x6f,\n\t0x6e, 0x65, 0x6f, 0x66, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70,\n\t0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x6e, 0x65,\n\t0x6f, 0x66, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x42, 0xc2, 0x01,\n\t0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0f, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,\n\t0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x65, 0x72, 0x63, 0x61, 0x72, 0x69, 0x2f, 0x67, 0x72, 0x70,\n\t0x63, 0x2d, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x67, 0x72, 0x70,\n\t0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xa2, 0x02, 0x03, 0x47, 0x46, 0x58, 0xaa, 0x02, 0x0f,\n\t0x47, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xca,\n\t0x02, 0x0f, 0x47, 0x72, 0x70, 0x63, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0xe2, 0x02, 0x1b, 0x47, 0x72, 0x70, 0x63, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea,\n\t0x02, 0x10, 0x47, 0x72, 0x70, 0x63, 0x3a, 0x3a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_grpc_federation_federation_proto_rawDescOnce sync.Once\n\tfile_grpc_federation_federation_proto_rawDescData = file_grpc_federation_federation_proto_rawDesc\n)\n\nfunc file_grpc_federation_federation_proto_rawDescGZIP() []byte {\n\tfile_grpc_federation_federation_proto_rawDescOnce.Do(func() {\n\t\tfile_grpc_federation_federation_proto_rawDescData = protoimpl.X.CompressGZIP(file_grpc_federation_federation_proto_rawDescData)\n\t})\n\treturn file_grpc_federation_federation_proto_rawDescData\n}\n\nvar file_grpc_federation_federation_proto_enumTypes = make([]protoimpl.EnumInfo, 2)\nvar file_grpc_federation_federation_proto_msgTypes = make([]protoimpl.MessageInfo, 48)\nvar file_grpc_federation_federation_proto_goTypes = []interface{}{\n\t(TypeKind)(0),                          // 0: grpc.federation.TypeKind\n\t(GRPCError_LogLevel)(0),                // 1: grpc.federation.GRPCError.LogLevel\n\t(*FileRule)(nil),                       // 2: grpc.federation.FileRule\n\t(*EnumRule)(nil),                       // 3: grpc.federation.EnumRule\n\t(*EnumValueRule)(nil),                  // 4: grpc.federation.EnumValueRule\n\t(*EnumValueAttribute)(nil),             // 5: grpc.federation.EnumValueAttribute\n\t(*OneofRule)(nil),                      // 6: grpc.federation.OneofRule\n\t(*ServiceRule)(nil),                    // 7: grpc.federation.ServiceRule\n\t(*Env)(nil),                            // 8: grpc.federation.Env\n\t(*ServiceVariable)(nil),                // 9: grpc.federation.ServiceVariable\n\t(*ServiceVariableValidationExpr)(nil),  // 10: grpc.federation.ServiceVariableValidationExpr\n\t(*EnvVar)(nil),                         // 11: grpc.federation.EnvVar\n\t(*EnvType)(nil),                        // 12: grpc.federation.EnvType\n\t(*EnvMapType)(nil),                     // 13: grpc.federation.EnvMapType\n\t(*EnvVarOption)(nil),                   // 14: grpc.federation.EnvVarOption\n\t(*MethodRule)(nil),                     // 15: grpc.federation.MethodRule\n\t(*MessageRule)(nil),                    // 16: grpc.federation.MessageRule\n\t(*VariableDefinition)(nil),             // 17: grpc.federation.VariableDefinition\n\t(*MapExpr)(nil),                        // 18: grpc.federation.MapExpr\n\t(*Iterator)(nil),                       // 19: grpc.federation.Iterator\n\t(*MessageExpr)(nil),                    // 20: grpc.federation.MessageExpr\n\t(*EnumExpr)(nil),                       // 21: grpc.federation.EnumExpr\n\t(*CallExpr)(nil),                       // 22: grpc.federation.CallExpr\n\t(*SwitchExpr)(nil),                     // 23: grpc.federation.SwitchExpr\n\t(*SwitchCaseExpr)(nil),                 // 24: grpc.federation.SwitchCaseExpr\n\t(*SwitchDefaultExpr)(nil),              // 25: grpc.federation.SwitchDefaultExpr\n\t(*GRPCError)(nil),                      // 26: grpc.federation.GRPCError\n\t(*GRPCErrorDetail)(nil),                // 27: grpc.federation.GRPCErrorDetail\n\t(*GRPCCallOption)(nil),                 // 28: grpc.federation.GRPCCallOption\n\t(*ValidationExpr)(nil),                 // 29: grpc.federation.ValidationExpr\n\t(*RetryPolicy)(nil),                    // 30: grpc.federation.RetryPolicy\n\t(*RetryPolicyConstant)(nil),            // 31: grpc.federation.RetryPolicyConstant\n\t(*RetryPolicyExponential)(nil),         // 32: grpc.federation.RetryPolicyExponential\n\t(*MethodRequest)(nil),                  // 33: grpc.federation.MethodRequest\n\t(*MethodResponse)(nil),                 // 34: grpc.federation.MethodResponse\n\t(*Argument)(nil),                       // 35: grpc.federation.Argument\n\t(*FieldRule)(nil),                      // 36: grpc.federation.FieldRule\n\t(*FieldOneof)(nil),                     // 37: grpc.federation.FieldOneof\n\t(*CELPlugin)(nil),                      // 38: grpc.federation.CELPlugin\n\t(*CELPluginExport)(nil),                // 39: grpc.federation.CELPluginExport\n\t(*CELPluginCapability)(nil),            // 40: grpc.federation.CELPluginCapability\n\t(*CELPluginEnvCapability)(nil),         // 41: grpc.federation.CELPluginEnvCapability\n\t(*CELPluginFileSystemCapability)(nil),  // 42: grpc.federation.CELPluginFileSystemCapability\n\t(*CELPluginNetworkCapability)(nil),     // 43: grpc.federation.CELPluginNetworkCapability\n\t(*CELFunction)(nil),                    // 44: grpc.federation.CELFunction\n\t(*CELReceiverType)(nil),                // 45: grpc.federation.CELReceiverType\n\t(*CELFunctionArgument)(nil),            // 46: grpc.federation.CELFunctionArgument\n\t(*CELType)(nil),                        // 47: grpc.federation.CELType\n\t(*CELMapType)(nil),                     // 48: grpc.federation.CELMapType\n\t(*CELVariable)(nil),                    // 49: grpc.federation.CELVariable\n\t(code.Code)(0),                         // 50: google.rpc.Code\n\t(*errdetails.ErrorInfo)(nil),           // 51: google.rpc.ErrorInfo\n\t(*errdetails.RetryInfo)(nil),           // 52: google.rpc.RetryInfo\n\t(*errdetails.DebugInfo)(nil),           // 53: google.rpc.DebugInfo\n\t(*errdetails.QuotaFailure)(nil),        // 54: google.rpc.QuotaFailure\n\t(*errdetails.PreconditionFailure)(nil), // 55: google.rpc.PreconditionFailure\n\t(*errdetails.BadRequest)(nil),          // 56: google.rpc.BadRequest\n\t(*errdetails.RequestInfo)(nil),         // 57: google.rpc.RequestInfo\n\t(*errdetails.ResourceInfo)(nil),        // 58: google.rpc.ResourceInfo\n\t(*errdetails.Help)(nil),                // 59: google.rpc.Help\n\t(*errdetails.LocalizedMessage)(nil),    // 60: google.rpc.LocalizedMessage\n\t(*descriptorpb.FileOptions)(nil),       // 61: google.protobuf.FileOptions\n\t(*descriptorpb.ServiceOptions)(nil),    // 62: google.protobuf.ServiceOptions\n\t(*descriptorpb.MethodOptions)(nil),     // 63: google.protobuf.MethodOptions\n\t(*descriptorpb.MessageOptions)(nil),    // 64: google.protobuf.MessageOptions\n\t(*descriptorpb.FieldOptions)(nil),      // 65: google.protobuf.FieldOptions\n\t(*descriptorpb.EnumOptions)(nil),       // 66: google.protobuf.EnumOptions\n\t(*descriptorpb.EnumValueOptions)(nil),  // 67: google.protobuf.EnumValueOptions\n\t(*descriptorpb.OneofOptions)(nil),      // 68: google.protobuf.OneofOptions\n}\nvar file_grpc_federation_federation_proto_depIdxs = []int32{\n\t38, // 0: grpc.federation.FileRule.plugin:type_name -> grpc.federation.CELPlugin\n\t5,  // 1: grpc.federation.EnumValueRule.attr:type_name -> grpc.federation.EnumValueAttribute\n\t8,  // 2: grpc.federation.ServiceRule.env:type_name -> grpc.federation.Env\n\t9,  // 3: grpc.federation.ServiceRule.var:type_name -> grpc.federation.ServiceVariable\n\t11, // 4: grpc.federation.Env.var:type_name -> grpc.federation.EnvVar\n\t18, // 5: grpc.federation.ServiceVariable.map:type_name -> grpc.federation.MapExpr\n\t20, // 6: grpc.federation.ServiceVariable.message:type_name -> grpc.federation.MessageExpr\n\t10, // 7: grpc.federation.ServiceVariable.validation:type_name -> grpc.federation.ServiceVariableValidationExpr\n\t21, // 8: grpc.federation.ServiceVariable.enum:type_name -> grpc.federation.EnumExpr\n\t23, // 9: grpc.federation.ServiceVariable.switch:type_name -> grpc.federation.SwitchExpr\n\t12, // 10: grpc.federation.EnvVar.type:type_name -> grpc.federation.EnvType\n\t14, // 11: grpc.federation.EnvVar.option:type_name -> grpc.federation.EnvVarOption\n\t0,  // 12: grpc.federation.EnvType.kind:type_name -> grpc.federation.TypeKind\n\t12, // 13: grpc.federation.EnvType.repeated:type_name -> grpc.federation.EnvType\n\t13, // 14: grpc.federation.EnvType.map:type_name -> grpc.federation.EnvMapType\n\t12, // 15: grpc.federation.EnvMapType.key:type_name -> grpc.federation.EnvType\n\t12, // 16: grpc.federation.EnvMapType.value:type_name -> grpc.federation.EnvType\n\t17, // 17: grpc.federation.MessageRule.def:type_name -> grpc.federation.VariableDefinition\n\t18, // 18: grpc.federation.VariableDefinition.map:type_name -> grpc.federation.MapExpr\n\t20, // 19: grpc.federation.VariableDefinition.message:type_name -> grpc.federation.MessageExpr\n\t22, // 20: grpc.federation.VariableDefinition.call:type_name -> grpc.federation.CallExpr\n\t29, // 21: grpc.federation.VariableDefinition.validation:type_name -> grpc.federation.ValidationExpr\n\t21, // 22: grpc.federation.VariableDefinition.enum:type_name -> grpc.federation.EnumExpr\n\t23, // 23: grpc.federation.VariableDefinition.switch:type_name -> grpc.federation.SwitchExpr\n\t19, // 24: grpc.federation.MapExpr.iterator:type_name -> grpc.federation.Iterator\n\t20, // 25: grpc.federation.MapExpr.message:type_name -> grpc.federation.MessageExpr\n\t21, // 26: grpc.federation.MapExpr.enum:type_name -> grpc.federation.EnumExpr\n\t35, // 27: grpc.federation.MessageExpr.args:type_name -> grpc.federation.Argument\n\t33, // 28: grpc.federation.CallExpr.request:type_name -> grpc.federation.MethodRequest\n\t30, // 29: grpc.federation.CallExpr.retry:type_name -> grpc.federation.RetryPolicy\n\t26, // 30: grpc.federation.CallExpr.error:type_name -> grpc.federation.GRPCError\n\t28, // 31: grpc.federation.CallExpr.option:type_name -> grpc.federation.GRPCCallOption\n\t24, // 32: grpc.federation.SwitchExpr.case:type_name -> grpc.federation.SwitchCaseExpr\n\t25, // 33: grpc.federation.SwitchExpr.default:type_name -> grpc.federation.SwitchDefaultExpr\n\t17, // 34: grpc.federation.SwitchCaseExpr.def:type_name -> grpc.federation.VariableDefinition\n\t17, // 35: grpc.federation.SwitchDefaultExpr.def:type_name -> grpc.federation.VariableDefinition\n\t17, // 36: grpc.federation.GRPCError.def:type_name -> grpc.federation.VariableDefinition\n\t50, // 37: grpc.federation.GRPCError.code:type_name -> google.rpc.Code\n\t27, // 38: grpc.federation.GRPCError.details:type_name -> grpc.federation.GRPCErrorDetail\n\t1,  // 39: grpc.federation.GRPCError.log_level:type_name -> grpc.federation.GRPCError.LogLevel\n\t17, // 40: grpc.federation.GRPCErrorDetail.def:type_name -> grpc.federation.VariableDefinition\n\t20, // 41: grpc.federation.GRPCErrorDetail.message:type_name -> grpc.federation.MessageExpr\n\t51, // 42: grpc.federation.GRPCErrorDetail.error_info:type_name -> google.rpc.ErrorInfo\n\t52, // 43: grpc.federation.GRPCErrorDetail.retry_info:type_name -> google.rpc.RetryInfo\n\t53, // 44: grpc.federation.GRPCErrorDetail.debug_info:type_name -> google.rpc.DebugInfo\n\t54, // 45: grpc.federation.GRPCErrorDetail.quota_failure:type_name -> google.rpc.QuotaFailure\n\t55, // 46: grpc.federation.GRPCErrorDetail.precondition_failure:type_name -> google.rpc.PreconditionFailure\n\t56, // 47: grpc.federation.GRPCErrorDetail.bad_request:type_name -> google.rpc.BadRequest\n\t57, // 48: grpc.federation.GRPCErrorDetail.request_info:type_name -> google.rpc.RequestInfo\n\t58, // 49: grpc.federation.GRPCErrorDetail.resource_info:type_name -> google.rpc.ResourceInfo\n\t59, // 50: grpc.federation.GRPCErrorDetail.help:type_name -> google.rpc.Help\n\t60, // 51: grpc.federation.GRPCErrorDetail.localized_message:type_name -> google.rpc.LocalizedMessage\n\t26, // 52: grpc.federation.ValidationExpr.error:type_name -> grpc.federation.GRPCError\n\t31, // 53: grpc.federation.RetryPolicy.constant:type_name -> grpc.federation.RetryPolicyConstant\n\t32, // 54: grpc.federation.RetryPolicy.exponential:type_name -> grpc.federation.RetryPolicyExponential\n\t37, // 55: grpc.federation.FieldRule.oneof:type_name -> grpc.federation.FieldOneof\n\t14, // 56: grpc.federation.FieldRule.env:type_name -> grpc.federation.EnvVarOption\n\t17, // 57: grpc.federation.FieldOneof.def:type_name -> grpc.federation.VariableDefinition\n\t39, // 58: grpc.federation.CELPlugin.export:type_name -> grpc.federation.CELPluginExport\n\t45, // 59: grpc.federation.CELPluginExport.types:type_name -> grpc.federation.CELReceiverType\n\t44, // 60: grpc.federation.CELPluginExport.functions:type_name -> grpc.federation.CELFunction\n\t49, // 61: grpc.federation.CELPluginExport.variables:type_name -> grpc.federation.CELVariable\n\t40, // 62: grpc.federation.CELPluginExport.capability:type_name -> grpc.federation.CELPluginCapability\n\t41, // 63: grpc.federation.CELPluginCapability.env:type_name -> grpc.federation.CELPluginEnvCapability\n\t42, // 64: grpc.federation.CELPluginCapability.file_system:type_name -> grpc.federation.CELPluginFileSystemCapability\n\t43, // 65: grpc.federation.CELPluginCapability.network:type_name -> grpc.federation.CELPluginNetworkCapability\n\t46, // 66: grpc.federation.CELFunction.args:type_name -> grpc.federation.CELFunctionArgument\n\t47, // 67: grpc.federation.CELFunction.return:type_name -> grpc.federation.CELType\n\t44, // 68: grpc.federation.CELReceiverType.methods:type_name -> grpc.federation.CELFunction\n\t47, // 69: grpc.federation.CELFunctionArgument.type:type_name -> grpc.federation.CELType\n\t0,  // 70: grpc.federation.CELType.kind:type_name -> grpc.federation.TypeKind\n\t47, // 71: grpc.federation.CELType.repeated:type_name -> grpc.federation.CELType\n\t48, // 72: grpc.federation.CELType.map:type_name -> grpc.federation.CELMapType\n\t47, // 73: grpc.federation.CELMapType.key:type_name -> grpc.federation.CELType\n\t47, // 74: grpc.federation.CELMapType.value:type_name -> grpc.federation.CELType\n\t47, // 75: grpc.federation.CELVariable.type:type_name -> grpc.federation.CELType\n\t61, // 76: grpc.federation.file:extendee -> google.protobuf.FileOptions\n\t62, // 77: grpc.federation.service:extendee -> google.protobuf.ServiceOptions\n\t63, // 78: grpc.federation.method:extendee -> google.protobuf.MethodOptions\n\t64, // 79: grpc.federation.message:extendee -> google.protobuf.MessageOptions\n\t65, // 80: grpc.federation.field:extendee -> google.protobuf.FieldOptions\n\t66, // 81: grpc.federation.enum:extendee -> google.protobuf.EnumOptions\n\t67, // 82: grpc.federation.enum_value:extendee -> google.protobuf.EnumValueOptions\n\t68, // 83: grpc.federation.oneof:extendee -> google.protobuf.OneofOptions\n\t2,  // 84: grpc.federation.file:type_name -> grpc.federation.FileRule\n\t7,  // 85: grpc.federation.service:type_name -> grpc.federation.ServiceRule\n\t15, // 86: grpc.federation.method:type_name -> grpc.federation.MethodRule\n\t16, // 87: grpc.federation.message:type_name -> grpc.federation.MessageRule\n\t36, // 88: grpc.federation.field:type_name -> grpc.federation.FieldRule\n\t3,  // 89: grpc.federation.enum:type_name -> grpc.federation.EnumRule\n\t4,  // 90: grpc.federation.enum_value:type_name -> grpc.federation.EnumValueRule\n\t6,  // 91: grpc.federation.oneof:type_name -> grpc.federation.OneofRule\n\t92, // [92:92] is the sub-list for method output_type\n\t92, // [92:92] is the sub-list for method input_type\n\t84, // [84:92] is the sub-list for extension type_name\n\t76, // [76:84] is the sub-list for extension extendee\n\t0,  // [0:76] is the sub-list for field type_name\n}\n\nfunc init() { file_grpc_federation_federation_proto_init() }\nfunc file_grpc_federation_federation_proto_init() {\n\tif File_grpc_federation_federation_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_grpc_federation_federation_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*FileRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumValueRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumValueAttribute); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*OneofRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Env); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceVariable); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceVariableValidationExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvVar); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvMapType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvVarOption); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MethodRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MessageRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*VariableDefinition); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MapExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Iterator); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MessageExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CallExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SwitchExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SwitchCaseExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SwitchDefaultExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GRPCError); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GRPCErrorDetail); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GRPCCallOption); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ValidationExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RetryPolicy); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RetryPolicyConstant); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RetryPolicyExponential); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MethodRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MethodResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Argument); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*FieldRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*FieldOneof); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPlugin); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginExport); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginEnvCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginFileSystemCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginNetworkCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELFunction); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELReceiverType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELFunctionArgument); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELMapType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELVariable); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[2].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[7].OneofWrappers = []interface{}{\n\t\t(*ServiceVariable_By)(nil),\n\t\t(*ServiceVariable_Map)(nil),\n\t\t(*ServiceVariable_Message)(nil),\n\t\t(*ServiceVariable_Validation)(nil),\n\t\t(*ServiceVariable_Enum)(nil),\n\t\t(*ServiceVariable_Switch)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[9].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[10].OneofWrappers = []interface{}{\n\t\t(*EnvType_Kind)(nil),\n\t\t(*EnvType_Repeated)(nil),\n\t\t(*EnvType_Map)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[12].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[13].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[14].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[15].OneofWrappers = []interface{}{\n\t\t(*VariableDefinition_By)(nil),\n\t\t(*VariableDefinition_Map)(nil),\n\t\t(*VariableDefinition_Message)(nil),\n\t\t(*VariableDefinition_Call)(nil),\n\t\t(*VariableDefinition_Validation)(nil),\n\t\t(*VariableDefinition_Enum)(nil),\n\t\t(*VariableDefinition_Switch)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[16].OneofWrappers = []interface{}{\n\t\t(*MapExpr_By)(nil),\n\t\t(*MapExpr_Message)(nil),\n\t\t(*MapExpr_Enum)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[20].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[22].OneofWrappers = []interface{}{\n\t\t(*SwitchCaseExpr_By)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[23].OneofWrappers = []interface{}{\n\t\t(*SwitchDefaultExpr_By)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[24].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[26].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[27].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[28].OneofWrappers = []interface{}{\n\t\t(*RetryPolicy_Constant)(nil),\n\t\t(*RetryPolicy_Exponential)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[29].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[30].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[31].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[32].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[33].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[34].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[35].OneofWrappers = []interface{}{\n\t\t(*FieldOneof_If)(nil),\n\t\t(*FieldOneof_Default)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[38].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[45].OneofWrappers = []interface{}{\n\t\t(*CELType_Kind)(nil),\n\t\t(*CELType_Repeated)(nil),\n\t\t(*CELType_Map)(nil),\n\t\t(*CELType_Message)(nil),\n\t\t(*CELType_Enum)(nil),\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_grpc_federation_federation_proto_rawDesc,\n\t\t\tNumEnums:      2,\n\t\t\tNumMessages:   48,\n\t\t\tNumExtensions: 8,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_grpc_federation_federation_proto_goTypes,\n\t\tDependencyIndexes: file_grpc_federation_federation_proto_depIdxs,\n\t\tEnumInfos:         file_grpc_federation_federation_proto_enumTypes,\n\t\tMessageInfos:      file_grpc_federation_federation_proto_msgTypes,\n\t\tExtensionInfos:    file_grpc_federation_federation_proto_extTypes,\n\t}.Build()\n\tFile_grpc_federation_federation_proto = out.File\n\tfile_grpc_federation_federation_proto_rawDesc = nil\n\tfile_grpc_federation_federation_proto_goTypes = nil\n\tfile_grpc_federation_federation_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/04_timeout/grpc-federation.yaml",
    "content": "imports:\n  - proto\nsrc:\n  - proto\nout: .\nplugins:\n  - plugin: go\n    opt: paths=source_relative\n  - plugin: go-grpc\n    opt: paths=source_relative\n  - plugin: grpc-federation\n    opt: paths=source_relative\n"
  },
  {
    "path": "_examples/04_timeout/main_test.go",
    "content": "package main_test\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"net\"\n\t\"os\"\n\t\"testing\"\n\t\"time\"\n\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\"\n\t\"go.opentelemetry.io/otel/propagation\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\tsdktrace \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.4.0\"\n\t\"go.uber.org/goleak\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/codes\"\n\t\"google.golang.org/grpc/status\"\n\t\"google.golang.org/grpc/test/bufconn\"\n\n\t\"example/federation\"\n\t\"example/post\"\n)\n\nconst bufSize = 1024\n\nvar (\n\tlistener   *bufconn.Listener\n\tpostClient post.PostServiceClient\n\tupdateDone = make(chan struct{})\n\tblockCh    = make(chan struct{})\n)\n\ntype clientConfig struct{}\n\nfunc (c *clientConfig) Post_PostServiceClient(cfg federation.FederationServiceClientConfig) (post.PostServiceClient, error) {\n\treturn postClient, nil\n}\n\ntype PostServer struct {\n\t*post.UnimplementedPostServiceServer\n}\n\nfunc (s *PostServer) GetPost(ctx context.Context, req *post.GetPostRequest) (*post.GetPostResponse, error) {\n\t<-blockCh\n\treturn &post.GetPostResponse{\n\t\tPost: &post.Post{\n\t\t\tId:      req.Id,\n\t\t\tTitle:   \"foo\",\n\t\t\tContent: \"bar\",\n\t\t\tUserId:  fmt.Sprintf(\"user:%s\", req.Id),\n\t\t},\n\t}, nil\n}\n\nfunc (s *PostServer) UpdatePost(ctx context.Context, req *post.UpdatePostRequest) (*post.UpdatePostResponse, error) {\n\ttime.Sleep(2 * time.Second)\n\tupdateDone <- struct{}{}\n\treturn nil, nil\n}\n\nfunc (s *PostServer) DeletePost(ctx context.Context, req *post.DeletePostRequest) (*post.DeletePostResponse, error) {\n\ttime.Sleep(1 * time.Second)\n\treturn nil, status.New(codes.Internal, \"failed to delete\").Err()\n}\n\nfunc dialer(ctx context.Context, address string) (net.Conn, error) {\n\treturn listener.Dial()\n}\n\nfunc TestFederation(t *testing.T) {\n\tdefer goleak.VerifyNone(t)\n\n\tctx := context.Background()\n\tlistener = bufconn.Listen(bufSize)\n\n\tif os.Getenv(\"ENABLE_JAEGER\") != \"\" {\n\t\texporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithInsecure())\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttp := sdktrace.NewTracerProvider(\n\t\t\tsdktrace.WithBatcher(exporter),\n\t\t\tsdktrace.WithResource(\n\t\t\t\tresource.NewWithAttributes(\n\t\t\t\t\tsemconv.SchemaURL,\n\t\t\t\t\tsemconv.ServiceNameKey.String(\"example04/timeout\"),\n\t\t\t\t\tsemconv.ServiceVersionKey.String(\"1.0.0\"),\n\t\t\t\t\tattribute.String(\"environment\", \"dev\"),\n\t\t\t\t),\n\t\t\t),\n\t\t\tsdktrace.WithSampler(sdktrace.AlwaysSample()),\n\t\t)\n\t\tdefer tp.Shutdown(ctx)\n\t\totel.SetTextMapPropagator(propagation.TraceContext{})\n\t\totel.SetTracerProvider(tp)\n\t}\n\n\tconn, err := grpc.DialContext(ctx, \"\", grpc.WithContextDialer(dialer), grpc.WithInsecure())\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer conn.Close()\n\n\tpostClient = post.NewPostServiceClient(conn)\n\n\tgrpcServer := grpc.NewServer()\n\tdefer grpcServer.Stop()\n\n\tlogger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{\n\t\tLevel: slog.LevelDebug,\n\t}))\n\tfederationServer, err := federation.NewFederationService(federation.FederationServiceConfig{\n\t\tClient: new(clientConfig),\n\t\tLogger: logger,\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer federation.CleanupFederationService(ctx, federationServer)\n\n\tpost.RegisterPostServiceServer(grpcServer, &PostServer{})\n\tfederation.RegisterFederationServiceServer(grpcServer, federationServer)\n\n\tgo func() {\n\t\tif err := grpcServer.Serve(listener); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t}()\n\n\tclient := federation.NewFederationServiceClient(conn)\n\n\tt.Run(\"GetPost\", func(t *testing.T) {\n\t\tif _, err := client.GetPost(ctx, &federation.GetPostRequest{\n\t\t\tId: \"foo\",\n\t\t}); err == nil {\n\t\t\tt.Fatal(\"expected error\")\n\t\t} else {\n\t\t\tif status.Code(err) != codes.DeadlineExceeded {\n\t\t\t\tt.Fatalf(\"unexpected status code: %v\", err)\n\t\t\t}\n\t\t}\n\t})\n\tt.Run(\"UpdatePost\", func(t *testing.T) {\n\t\t_, err := client.UpdatePost(ctx, &federation.UpdatePostRequest{\n\t\t\tId: \"foo\",\n\t\t})\n\t\tif err == nil {\n\t\t\tt.Fatal(\"expected error\")\n\t\t}\n\t\tst, ok := status.FromError(err)\n\t\tif !ok {\n\t\t\tt.Fatal(\"failed to get gRPC status error\")\n\t\t}\n\t\tif st.Code() != codes.Internal {\n\t\t\tt.Fatalf(\"failed to get status code: %s\", st.Code())\n\t\t}\n\t})\n\tblockCh <- struct{}{}\n\t<-updateDone\n\ttime.Sleep(100 * time.Millisecond)\n}\n"
  },
  {
    "path": "_examples/04_timeout/post/post.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: post/post.proto\n\npackage post\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype GetPostRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetPostRequest) Reset() {\n\t*x = GetPostRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostRequest) ProtoMessage() {}\n\nfunc (x *GetPostRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostRequest.ProtoReflect.Descriptor instead.\nfunc (*GetPostRequest) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetPostRequest) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\ntype GetPostResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPost *Post `protobuf:\"bytes,1,opt,name=post,proto3\" json:\"post,omitempty\"`\n}\n\nfunc (x *GetPostResponse) Reset() {\n\t*x = GetPostResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostResponse) ProtoMessage() {}\n\nfunc (x *GetPostResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostResponse.ProtoReflect.Descriptor instead.\nfunc (*GetPostResponse) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetPostResponse) GetPost() *Post {\n\tif x != nil {\n\t\treturn x.Post\n\t}\n\treturn nil\n}\n\ntype Post struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId      string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tTitle   string `protobuf:\"bytes,2,opt,name=title,proto3\" json:\"title,omitempty\"`\n\tContent string `protobuf:\"bytes,3,opt,name=content,proto3\" json:\"content,omitempty\"`\n\tUserId  string `protobuf:\"bytes,4,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *Post) Reset() {\n\t*x = Post{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Post) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Post) ProtoMessage() {}\n\nfunc (x *Post) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Post.ProtoReflect.Descriptor instead.\nfunc (*Post) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *Post) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetTitle() string {\n\tif x != nil {\n\t\treturn x.Title\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetContent() string {\n\tif x != nil {\n\t\treturn x.Content\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetUserId() string {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn \"\"\n}\n\ntype UpdatePostRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *UpdatePostRequest) Reset() {\n\t*x = UpdatePostRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *UpdatePostRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UpdatePostRequest) ProtoMessage() {}\n\nfunc (x *UpdatePostRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UpdatePostRequest.ProtoReflect.Descriptor instead.\nfunc (*UpdatePostRequest) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *UpdatePostRequest) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\ntype UpdatePostResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *UpdatePostResponse) Reset() {\n\t*x = UpdatePostResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *UpdatePostResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UpdatePostResponse) ProtoMessage() {}\n\nfunc (x *UpdatePostResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UpdatePostResponse.ProtoReflect.Descriptor instead.\nfunc (*UpdatePostResponse) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{4}\n}\n\ntype DeletePostRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *DeletePostRequest) Reset() {\n\t*x = DeletePostRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *DeletePostRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*DeletePostRequest) ProtoMessage() {}\n\nfunc (x *DeletePostRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use DeletePostRequest.ProtoReflect.Descriptor instead.\nfunc (*DeletePostRequest) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *DeletePostRequest) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\ntype DeletePostResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *DeletePostResponse) Reset() {\n\t*x = DeletePostResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *DeletePostResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*DeletePostResponse) ProtoMessage() {}\n\nfunc (x *DeletePostResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use DeletePostResponse.ProtoReflect.Descriptor instead.\nfunc (*DeletePostResponse) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{6}\n}\n\nvar File_post_post_proto protoreflect.FileDescriptor\n\nvar file_post_post_proto_rawDesc = []byte{\n\t0x0a, 0x0f, 0x70, 0x6f, 0x73, 0x74, 0x2f, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x20, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x6f,\n\t0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x31, 0x0a, 0x0f, 0x47, 0x65, 0x74,\n\t0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x04,\n\t0x70, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x6f, 0x73,\n\t0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x5f, 0x0a, 0x04,\n\t0x50, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18,\n\t0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x23, 0x0a,\n\t0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,\n\t0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,\n\t0x69, 0x64, 0x22, 0x14, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x73, 0x74,\n\t0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65,\n\t0x74, 0x65, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a,\n\t0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x14, 0x0a,\n\t0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f,\n\t0x6e, 0x73, 0x65, 0x32, 0xcd, 0x01, 0x0a, 0x0b, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x12, 0x38, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x12, 0x14,\n\t0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x50,\n\t0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a,\n\t0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x73, 0x74, 0x12, 0x17, 0x2e, 0x70, 0x6f,\n\t0x73, 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61,\n\t0x74, 0x65, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00,\n\t0x12, 0x41, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x73, 0x74, 0x12, 0x17,\n\t0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x73, 0x74,\n\t0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x44,\n\t0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,\n\t0x65, 0x22, 0x00, 0x42, 0x58, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x42,\n\t0x09, 0x50, 0x6f, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x11, 0x65, 0x78,\n\t0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x70, 0x6f, 0x73, 0x74, 0x3b, 0x70, 0x6f, 0x73, 0x74, 0xa2,\n\t0x02, 0x03, 0x50, 0x58, 0x58, 0xaa, 0x02, 0x04, 0x50, 0x6f, 0x73, 0x74, 0xca, 0x02, 0x04, 0x50,\n\t0x6f, 0x73, 0x74, 0xe2, 0x02, 0x10, 0x50, 0x6f, 0x73, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65,\n\t0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x04, 0x50, 0x6f, 0x73, 0x74, 0x62, 0x06, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_post_post_proto_rawDescOnce sync.Once\n\tfile_post_post_proto_rawDescData = file_post_post_proto_rawDesc\n)\n\nfunc file_post_post_proto_rawDescGZIP() []byte {\n\tfile_post_post_proto_rawDescOnce.Do(func() {\n\t\tfile_post_post_proto_rawDescData = protoimpl.X.CompressGZIP(file_post_post_proto_rawDescData)\n\t})\n\treturn file_post_post_proto_rawDescData\n}\n\nvar file_post_post_proto_msgTypes = make([]protoimpl.MessageInfo, 7)\nvar file_post_post_proto_goTypes = []interface{}{\n\t(*GetPostRequest)(nil),     // 0: post.GetPostRequest\n\t(*GetPostResponse)(nil),    // 1: post.GetPostResponse\n\t(*Post)(nil),               // 2: post.Post\n\t(*UpdatePostRequest)(nil),  // 3: post.UpdatePostRequest\n\t(*UpdatePostResponse)(nil), // 4: post.UpdatePostResponse\n\t(*DeletePostRequest)(nil),  // 5: post.DeletePostRequest\n\t(*DeletePostResponse)(nil), // 6: post.DeletePostResponse\n}\nvar file_post_post_proto_depIdxs = []int32{\n\t2, // 0: post.GetPostResponse.post:type_name -> post.Post\n\t0, // 1: post.PostService.GetPost:input_type -> post.GetPostRequest\n\t3, // 2: post.PostService.UpdatePost:input_type -> post.UpdatePostRequest\n\t5, // 3: post.PostService.DeletePost:input_type -> post.DeletePostRequest\n\t1, // 4: post.PostService.GetPost:output_type -> post.GetPostResponse\n\t4, // 5: post.PostService.UpdatePost:output_type -> post.UpdatePostResponse\n\t6, // 6: post.PostService.DeletePost:output_type -> post.DeletePostResponse\n\t4, // [4:7] is the sub-list for method output_type\n\t1, // [1:4] is the sub-list for method input_type\n\t1, // [1:1] is the sub-list for extension type_name\n\t1, // [1:1] is the sub-list for extension extendee\n\t0, // [0:1] is the sub-list for field type_name\n}\n\nfunc init() { file_post_post_proto_init() }\nfunc file_post_post_proto_init() {\n\tif File_post_post_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_post_post_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Post); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*UpdatePostRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*UpdatePostResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*DeletePostRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*DeletePostResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_post_post_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   7,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_post_post_proto_goTypes,\n\t\tDependencyIndexes: file_post_post_proto_depIdxs,\n\t\tMessageInfos:      file_post_post_proto_msgTypes,\n\t}.Build()\n\tFile_post_post_proto = out.File\n\tfile_post_post_proto_rawDesc = nil\n\tfile_post_post_proto_goTypes = nil\n\tfile_post_post_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/04_timeout/post/post_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: post/post.proto\n\npackage post\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tPostService_GetPost_FullMethodName    = \"/post.PostService/GetPost\"\n\tPostService_UpdatePost_FullMethodName = \"/post.PostService/UpdatePost\"\n\tPostService_DeletePost_FullMethodName = \"/post.PostService/DeletePost\"\n)\n\n// PostServiceClient is the client API for PostService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype PostServiceClient interface {\n\tGetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error)\n\tUpdatePost(ctx context.Context, in *UpdatePostRequest, opts ...grpc.CallOption) (*UpdatePostResponse, error)\n\tDeletePost(ctx context.Context, in *DeletePostRequest, opts ...grpc.CallOption) (*DeletePostResponse, error)\n}\n\ntype postServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewPostServiceClient(cc grpc.ClientConnInterface) PostServiceClient {\n\treturn &postServiceClient{cc}\n}\n\nfunc (c *postServiceClient) GetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error) {\n\tout := new(GetPostResponse)\n\terr := c.cc.Invoke(ctx, PostService_GetPost_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *postServiceClient) UpdatePost(ctx context.Context, in *UpdatePostRequest, opts ...grpc.CallOption) (*UpdatePostResponse, error) {\n\tout := new(UpdatePostResponse)\n\terr := c.cc.Invoke(ctx, PostService_UpdatePost_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *postServiceClient) DeletePost(ctx context.Context, in *DeletePostRequest, opts ...grpc.CallOption) (*DeletePostResponse, error) {\n\tout := new(DeletePostResponse)\n\terr := c.cc.Invoke(ctx, PostService_DeletePost_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// PostServiceServer is the server API for PostService service.\n// All implementations must embed UnimplementedPostServiceServer\n// for forward compatibility\ntype PostServiceServer interface {\n\tGetPost(context.Context, *GetPostRequest) (*GetPostResponse, error)\n\tUpdatePost(context.Context, *UpdatePostRequest) (*UpdatePostResponse, error)\n\tDeletePost(context.Context, *DeletePostRequest) (*DeletePostResponse, error)\n\tmustEmbedUnimplementedPostServiceServer()\n}\n\n// UnimplementedPostServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedPostServiceServer struct {\n}\n\nfunc (UnimplementedPostServiceServer) GetPost(context.Context, *GetPostRequest) (*GetPostResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetPost not implemented\")\n}\nfunc (UnimplementedPostServiceServer) UpdatePost(context.Context, *UpdatePostRequest) (*UpdatePostResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method UpdatePost not implemented\")\n}\nfunc (UnimplementedPostServiceServer) DeletePost(context.Context, *DeletePostRequest) (*DeletePostResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method DeletePost not implemented\")\n}\nfunc (UnimplementedPostServiceServer) mustEmbedUnimplementedPostServiceServer() {}\n\n// UnsafePostServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to PostServiceServer will\n// result in compilation errors.\ntype UnsafePostServiceServer interface {\n\tmustEmbedUnimplementedPostServiceServer()\n}\n\nfunc RegisterPostServiceServer(s grpc.ServiceRegistrar, srv PostServiceServer) {\n\ts.RegisterService(&PostService_ServiceDesc, srv)\n}\n\nfunc _PostService_GetPost_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetPostRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(PostServiceServer).GetPost(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: PostService_GetPost_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(PostServiceServer).GetPost(ctx, req.(*GetPostRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _PostService_UpdatePost_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(UpdatePostRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(PostServiceServer).UpdatePost(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: PostService_UpdatePost_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(PostServiceServer).UpdatePost(ctx, req.(*UpdatePostRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _PostService_DeletePost_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(DeletePostRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(PostServiceServer).DeletePost(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: PostService_DeletePost_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(PostServiceServer).DeletePost(ctx, req.(*DeletePostRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// PostService_ServiceDesc is the grpc.ServiceDesc for PostService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar PostService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"post.PostService\",\n\tHandlerType: (*PostServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetPost\",\n\t\t\tHandler:    _PostService_GetPost_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"UpdatePost\",\n\t\t\tHandler:    _PostService_UpdatePost_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"DeletePost\",\n\t\t\tHandler:    _PostService_DeletePost_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"post/post.proto\",\n}\n"
  },
  {
    "path": "_examples/04_timeout/proto/buf.yaml",
    "content": "version: v1\nbreaking:\n  use:\n    - FILE\nlint:\n  use:\n    - DEFAULT\n"
  },
  {
    "path": "_examples/04_timeout/proto/federation/federation.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"grpc/federation/federation.proto\";\nimport \"google/protobuf/descriptor.proto\";\nimport \"google/protobuf/empty.proto\";\n\noption go_package = \"example/federation;federation\";\n\noption (grpc.federation.file)= {\n  import: [\"post/post.proto\"]\n};\n\nextend google.protobuf.MethodOptions {\n  Ext ext = 70001;\n}\n\nmessage Ext {\n  string foo = 1;\n}\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {\n    option (grpc.federation.method).timeout = \"1s\";\n    option (ext).foo = \"xxx\";\n  };\n  rpc UpdatePost(UpdatePostRequest) returns (google.protobuf.Empty) {\n    option (grpc.federation.method).response = \"UpdatePostResponse\";\n  }\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (.grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"post.PostService/GetPost\"\n        request { field: \"id\", by: \"$.id\" }\n      }\n    }\n    def { name: \"post\", by: \"res.post\", autobind: true }\n  };\n  string id = 1;\n  string title = 2;\n  string content = 3;\n}\n\nmessage UpdatePostRequest {\n  string id = 1;\n}\n\nmessage UpdatePostResponse {\n  option (grpc.federation.message) = {\n    def {\n      call {\n        method: \"post.PostService/UpdatePost\"\n        request { field: \"id\" by: \"$.id\" }\n        timeout: \"3s\"\n      }\n    }\n    def {\n      call {\n        method: \"post.PostService/DeletePost\"\n        request { field: \"id\" by: \"$.id\" }\n      }\n    }\n  };\n}"
  },
  {
    "path": "_examples/04_timeout/proto/post/post.proto",
    "content": "syntax = \"proto3\";\n\npackage post;\n\noption go_package = \"example/post;post\";\n\nservice PostService {\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n  rpc UpdatePost(UpdatePostRequest) returns (UpdatePostResponse) {};\n  rpc DeletePost(DeletePostRequest) returns (DeletePostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  Post post = 1;\n}\n\nmessage Post {\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  string user_id = 4;\n}\n\nmessage UpdatePostRequest {\n  string id = 1;\n}\n\nmessage UpdatePostResponse {\n  \n}\n\nmessage DeletePostRequest {\n  string id = 1;\n}\n\nmessage DeletePostResponse {\n}"
  },
  {
    "path": "_examples/05_async/.gitignore",
    "content": "grpc/federation\n"
  },
  {
    "path": "_examples/05_async/Makefile",
    "content": "MAKEFILE_DIR := $(dir $(lastword $(MAKEFILE_LIST)))\nGOBIN := $(MAKEFILE_DIR)/../../bin\nPATH := $(GOBIN):$(PATH)\n\nJAEGER_IMAGE := jaegertracing/all-in-one:latest\n\n.PHONY: generate\ngenerate:\n\t$(GOBIN)/buf generate\n\n.PHONY: lint\nlint:\n\t@$(GOBIN)/grpc-federation-linter -Iproto -Iproto_deps ./proto/federation/federation.proto\n\n.PHONY: test\ntest:\n\tgo test -race ./ -count=1\n\n.PHONY: grpc-federation/generate\ngrpc-federation/generate:\n\t@$(GOBIN)/grpc-federation-generator ./proto/federation/federation.proto\n\n.PHONY: grpc-federation/watch\ngrpc-federation/watch:\n\t@$(GOBIN)/grpc-federation-generator -w\n\n.PHONY: jaeger/start\njaeger/start:\n\t@docker run \\\n\t\t-e COLLECTOR_OTLP_ENABLED=true \\\n\t\t-p 16686:16686 \\\n\t\t-p 4317:4317 \\\n\t\t-p 4318:4318 \\\n\t\t-d \\\n\t\t$(JAEGER_IMAGE)\n\n.PHONY: jaeger/stop\njaeger/stop:\n\t@docker stop $(shell docker ps -q  --filter ancestor=$(JAEGER_IMAGE))\n"
  },
  {
    "path": "_examples/05_async/buf.gen.yaml",
    "content": "version: v1\nmanaged:\n  enabled: true\nplugins:\n  - plugin: go\n    out: .\n    opt: paths=source_relative\n  - plugin: go-grpc\n    out: .\n    opt: paths=source_relative\n  - plugin: grpc-federation\n    out: .\n    opt: paths=source_relative\n"
  },
  {
    "path": "_examples/05_async/buf.work.yaml",
    "content": "version: v1\ndirectories:\n  - proto\n  - proto_deps\n"
  },
  {
    "path": "_examples/05_async/federation/federation.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype GetRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *GetRequest) Reset() {\n\t*x = GetRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetRequest) ProtoMessage() {}\n\nfunc (x *GetRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetRequest.ProtoReflect.Descriptor instead.\nfunc (*GetRequest) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\ntype GetResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tHname string `protobuf:\"bytes,1,opt,name=hname,proto3\" json:\"hname,omitempty\"`\n\tJname string `protobuf:\"bytes,2,opt,name=jname,proto3\" json:\"jname,omitempty\"`\n}\n\nfunc (x *GetResponse) Reset() {\n\t*x = GetResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetResponse) ProtoMessage() {}\n\nfunc (x *GetResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetResponse.ProtoReflect.Descriptor instead.\nfunc (*GetResponse) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetResponse) GetHname() string {\n\tif x != nil {\n\t\treturn x.Hname\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetResponse) GetJname() string {\n\tif x != nil {\n\t\treturn x.Jname\n\t}\n\treturn \"\"\n}\n\ntype A struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *A) Reset() {\n\t*x = A{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *A) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*A) ProtoMessage() {}\n\nfunc (x *A) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use A.ProtoReflect.Descriptor instead.\nfunc (*A) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *A) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\ntype AA struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *AA) Reset() {\n\t*x = AA{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AA) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AA) ProtoMessage() {}\n\nfunc (x *AA) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AA.ProtoReflect.Descriptor instead.\nfunc (*AA) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *AA) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\ntype AB struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *AB) Reset() {\n\t*x = AB{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AB) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AB) ProtoMessage() {}\n\nfunc (x *AB) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AB.ProtoReflect.Descriptor instead.\nfunc (*AB) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *AB) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\ntype B struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *B) Reset() {\n\t*x = B{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *B) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*B) ProtoMessage() {}\n\nfunc (x *B) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use B.ProtoReflect.Descriptor instead.\nfunc (*B) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *B) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\ntype C struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *C) Reset() {\n\t*x = C{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *C) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*C) ProtoMessage() {}\n\nfunc (x *C) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use C.ProtoReflect.Descriptor instead.\nfunc (*C) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *C) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\ntype D struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *D) Reset() {\n\t*x = D{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *D) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*D) ProtoMessage() {}\n\nfunc (x *D) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use D.ProtoReflect.Descriptor instead.\nfunc (*D) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{7}\n}\n\nfunc (x *D) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\ntype E struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *E) Reset() {\n\t*x = E{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *E) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*E) ProtoMessage() {}\n\nfunc (x *E) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use E.ProtoReflect.Descriptor instead.\nfunc (*E) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{8}\n}\n\nfunc (x *E) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\ntype F struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *F) Reset() {\n\t*x = F{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *F) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*F) ProtoMessage() {}\n\nfunc (x *F) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use F.ProtoReflect.Descriptor instead.\nfunc (*F) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{9}\n}\n\nfunc (x *F) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\ntype G struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *G) Reset() {\n\t*x = G{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[10]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *G) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*G) ProtoMessage() {}\n\nfunc (x *G) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[10]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use G.ProtoReflect.Descriptor instead.\nfunc (*G) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{10}\n}\n\nfunc (x *G) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\ntype H struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *H) Reset() {\n\t*x = H{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[11]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *H) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*H) ProtoMessage() {}\n\nfunc (x *H) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[11]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use H.ProtoReflect.Descriptor instead.\nfunc (*H) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{11}\n}\n\nfunc (x *H) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\ntype I struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *I) Reset() {\n\t*x = I{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[12]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *I) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*I) ProtoMessage() {}\n\nfunc (x *I) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[12]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use I.ProtoReflect.Descriptor instead.\nfunc (*I) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{12}\n}\n\nfunc (x *I) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\ntype J struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *J) Reset() {\n\t*x = J{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[13]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *J) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*J) ProtoMessage() {}\n\nfunc (x *J) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[13]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use J.ProtoReflect.Descriptor instead.\nfunc (*J) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{13}\n}\n\nfunc (x *J) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nvar File_federation_federation_proto protoreflect.FileDescriptor\n\nvar file_federation_federation_proto_rawDesc = []byte{\n\t0x0a, 0x1b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x6f,\n\t0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x20, 0x67,\n\t0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22,\n\t0x0c, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xc0, 0x02,\n\t0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a,\n\t0x05, 0x68, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0x9a, 0x4a,\n\t0x08, 0x12, 0x06, 0x68, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x05, 0x68, 0x6e, 0x61, 0x6d, 0x65,\n\t0x12, 0x21, 0x0a, 0x05, 0x6a, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42,\n\t0x0b, 0x9a, 0x4a, 0x08, 0x12, 0x06, 0x6a, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x05, 0x6a, 0x6e,\n\t0x61, 0x6d, 0x65, 0x3a, 0xea, 0x01, 0x9a, 0x4a, 0xe6, 0x01, 0x0a, 0x08, 0x0a, 0x01, 0x61, 0x6a,\n\t0x03, 0x0a, 0x01, 0x41, 0x0a, 0x08, 0x0a, 0x01, 0x62, 0x6a, 0x03, 0x0a, 0x01, 0x42, 0x0a, 0x15,\n\t0x0a, 0x01, 0x63, 0x6a, 0x10, 0x0a, 0x01, 0x43, 0x12, 0x0b, 0x0a, 0x01, 0x61, 0x12, 0x06, 0x61,\n\t0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x15, 0x0a, 0x01, 0x64, 0x6a, 0x10, 0x0a, 0x01, 0x44, 0x12,\n\t0x0b, 0x0a, 0x01, 0x62, 0x12, 0x06, 0x62, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x22, 0x0a, 0x01,\n\t0x65, 0x6a, 0x1d, 0x0a, 0x01, 0x45, 0x12, 0x0b, 0x0a, 0x01, 0x63, 0x12, 0x06, 0x63, 0x2e, 0x6e,\n\t0x61, 0x6d, 0x65, 0x12, 0x0b, 0x0a, 0x01, 0x64, 0x12, 0x06, 0x64, 0x2e, 0x6e, 0x61, 0x6d, 0x65,\n\t0x0a, 0x22, 0x0a, 0x01, 0x66, 0x6a, 0x1d, 0x0a, 0x01, 0x46, 0x12, 0x0b, 0x0a, 0x01, 0x63, 0x12,\n\t0x06, 0x63, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0b, 0x0a, 0x01, 0x64, 0x12, 0x06, 0x64, 0x2e,\n\t0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x08, 0x0a, 0x01, 0x67, 0x6a, 0x03, 0x0a, 0x01, 0x47, 0x0a, 0x2f,\n\t0x0a, 0x01, 0x68, 0x6a, 0x2a, 0x0a, 0x01, 0x48, 0x12, 0x0b, 0x0a, 0x01, 0x65, 0x12, 0x06, 0x65,\n\t0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0b, 0x0a, 0x01, 0x66, 0x12, 0x06, 0x66, 0x2e, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x0b, 0x0a, 0x01, 0x67, 0x12, 0x06, 0x67, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x0a,\n\t0x08, 0x0a, 0x01, 0x69, 0x6a, 0x03, 0x0a, 0x01, 0x49, 0x0a, 0x15, 0x0a, 0x01, 0x6a, 0x6a, 0x10,\n\t0x0a, 0x01, 0x4a, 0x12, 0x0b, 0x0a, 0x01, 0x69, 0x12, 0x06, 0x69, 0x2e, 0x6e, 0x61, 0x6d, 0x65,\n\t0x22, 0x3e, 0x0a, 0x01, 0x41, 0x12, 0x1c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x09, 0x42, 0x08, 0x9a, 0x4a, 0x05, 0x12, 0x03, 0x27, 0x61, 0x27, 0x52, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x3a, 0x1b, 0x9a, 0x4a, 0x18, 0x0a, 0x0a, 0x0a, 0x02, 0x61, 0x61, 0x6a, 0x04,\n\t0x0a, 0x02, 0x41, 0x41, 0x0a, 0x0a, 0x0a, 0x02, 0x61, 0x62, 0x6a, 0x04, 0x0a, 0x02, 0x41, 0x42,\n\t0x22, 0x23, 0x0a, 0x02, 0x41, 0x41, 0x12, 0x1d, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0x9a, 0x4a, 0x06, 0x12, 0x04, 0x27, 0x61, 0x61, 0x27, 0x52,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x23, 0x0a, 0x02, 0x41, 0x42, 0x12, 0x1d, 0x0a, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0x9a, 0x4a, 0x06, 0x12, 0x04,\n\t0x27, 0x61, 0x62, 0x27, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x21, 0x0a, 0x01, 0x42, 0x12,\n\t0x1c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0x9a,\n\t0x4a, 0x05, 0x12, 0x03, 0x27, 0x62, 0x27, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x21, 0x0a,\n\t0x01, 0x43, 0x12, 0x1c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x42, 0x08, 0x9a, 0x4a, 0x05, 0x12, 0x03, 0x27, 0x63, 0x27, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,\n\t0x22, 0x21, 0x0a, 0x01, 0x44, 0x12, 0x1c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x09, 0x42, 0x08, 0x9a, 0x4a, 0x05, 0x12, 0x03, 0x27, 0x64, 0x27, 0x52, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x22, 0x21, 0x0a, 0x01, 0x45, 0x12, 0x1c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0x9a, 0x4a, 0x05, 0x12, 0x03, 0x27, 0x65, 0x27,\n\t0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x21, 0x0a, 0x01, 0x46, 0x12, 0x1c, 0x0a, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0x9a, 0x4a, 0x05, 0x12, 0x03,\n\t0x27, 0x66, 0x27, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x21, 0x0a, 0x01, 0x47, 0x12, 0x1c,\n\t0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0x9a, 0x4a,\n\t0x05, 0x12, 0x03, 0x27, 0x67, 0x27, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x21, 0x0a, 0x01,\n\t0x48, 0x12, 0x1c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42,\n\t0x08, 0x9a, 0x4a, 0x05, 0x12, 0x03, 0x27, 0x68, 0x27, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22,\n\t0x21, 0x0a, 0x01, 0x49, 0x12, 0x1c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x42, 0x08, 0x9a, 0x4a, 0x05, 0x12, 0x03, 0x27, 0x69, 0x27, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x22, 0x21, 0x0a, 0x01, 0x4a, 0x12, 0x1c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0x9a, 0x4a, 0x05, 0x12, 0x03, 0x27, 0x6a, 0x27, 0x52,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x32, 0x5a, 0x0a, 0x11, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x40, 0x0a, 0x03, 0x47, 0x65,\n\t0x74, 0x12, 0x1a, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e,\n\t0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47,\n\t0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x1a, 0x03, 0x9a, 0x4a,\n\t0x00, 0x42, 0x9d, 0x01, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0f, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x1d, 0x65, 0x78, 0x61,\n\t0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xa2, 0x02, 0x03, 0x4f, 0x46, 0x58,\n\t0xaa, 0x02, 0x0e, 0x4f, 0x72, 0x67, 0x2e, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0xca, 0x02, 0x0e, 0x4f, 0x72, 0x67, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0xe2, 0x02, 0x1a, 0x4f, 0x72, 0x67, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea,\n\t0x02, 0x0f, 0x4f, 0x72, 0x67, 0x3a, 0x3a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_federation_federation_proto_rawDescOnce sync.Once\n\tfile_federation_federation_proto_rawDescData = file_federation_federation_proto_rawDesc\n)\n\nfunc file_federation_federation_proto_rawDescGZIP() []byte {\n\tfile_federation_federation_proto_rawDescOnce.Do(func() {\n\t\tfile_federation_federation_proto_rawDescData = protoimpl.X.CompressGZIP(file_federation_federation_proto_rawDescData)\n\t})\n\treturn file_federation_federation_proto_rawDescData\n}\n\nvar file_federation_federation_proto_msgTypes = make([]protoimpl.MessageInfo, 14)\nvar file_federation_federation_proto_goTypes = []interface{}{\n\t(*GetRequest)(nil),  // 0: org.federation.GetRequest\n\t(*GetResponse)(nil), // 1: org.federation.GetResponse\n\t(*A)(nil),           // 2: org.federation.A\n\t(*AA)(nil),          // 3: org.federation.AA\n\t(*AB)(nil),          // 4: org.federation.AB\n\t(*B)(nil),           // 5: org.federation.B\n\t(*C)(nil),           // 6: org.federation.C\n\t(*D)(nil),           // 7: org.federation.D\n\t(*E)(nil),           // 8: org.federation.E\n\t(*F)(nil),           // 9: org.federation.F\n\t(*G)(nil),           // 10: org.federation.G\n\t(*H)(nil),           // 11: org.federation.H\n\t(*I)(nil),           // 12: org.federation.I\n\t(*J)(nil),           // 13: org.federation.J\n}\nvar file_federation_federation_proto_depIdxs = []int32{\n\t0, // 0: org.federation.FederationService.Get:input_type -> org.federation.GetRequest\n\t1, // 1: org.federation.FederationService.Get:output_type -> org.federation.GetResponse\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_federation_federation_proto_init() }\nfunc file_federation_federation_proto_init() {\n\tif File_federation_federation_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_federation_federation_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*A); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AA); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AB); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*B); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*C); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*D); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*E); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*F); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*G); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*H); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*I); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*J); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_federation_federation_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   14,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_federation_federation_proto_goTypes,\n\t\tDependencyIndexes: file_federation_federation_proto_depIdxs,\n\t\tMessageInfos:      file_federation_federation_proto_msgTypes,\n\t}.Build()\n\tFile_federation_federation_proto = out.File\n\tfile_federation_federation_proto_rawDesc = nil\n\tfile_federation_federation_proto_goTypes = nil\n\tfile_federation_federation_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/05_async/federation/federation_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tFederationService_Get_FullMethodName = \"/org.federation.FederationService/Get\"\n)\n\n// FederationServiceClient is the client API for FederationService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype FederationServiceClient interface {\n\tGet(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error)\n}\n\ntype federationServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewFederationServiceClient(cc grpc.ClientConnInterface) FederationServiceClient {\n\treturn &federationServiceClient{cc}\n}\n\nfunc (c *federationServiceClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) {\n\tout := new(GetResponse)\n\terr := c.cc.Invoke(ctx, FederationService_Get_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// FederationServiceServer is the server API for FederationService service.\n// All implementations must embed UnimplementedFederationServiceServer\n// for forward compatibility\ntype FederationServiceServer interface {\n\tGet(context.Context, *GetRequest) (*GetResponse, error)\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\n// UnimplementedFederationServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedFederationServiceServer struct {\n}\n\nfunc (UnimplementedFederationServiceServer) Get(context.Context, *GetRequest) (*GetResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method Get not implemented\")\n}\nfunc (UnimplementedFederationServiceServer) mustEmbedUnimplementedFederationServiceServer() {}\n\n// UnsafeFederationServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to FederationServiceServer will\n// result in compilation errors.\ntype UnsafeFederationServiceServer interface {\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\nfunc RegisterFederationServiceServer(s grpc.ServiceRegistrar, srv FederationServiceServer) {\n\ts.RegisterService(&FederationService_ServiceDesc, srv)\n}\n\nfunc _FederationService_Get_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(FederationServiceServer).Get(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: FederationService_Get_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(FederationServiceServer).Get(ctx, req.(*GetRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// FederationService_ServiceDesc is the grpc.ServiceDesc for FederationService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar FederationService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"org.federation.FederationService\",\n\tHandlerType: (*FederationServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"Get\",\n\t\t\tHandler:    _FederationService_Get_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"federation/federation.proto\",\n}\n"
  },
  {
    "path": "_examples/05_async/federation/federation_grpc_federation.pb.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: federation/federation.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Org_Federation_AAVariable represents variable definitions in \"org.federation.AA\".\ntype FederationService_Org_Federation_AAVariable struct {\n}\n\n// Org_Federation_AAArgument is argument for \"org.federation.AA\" message.\ntype FederationService_Org_Federation_AAArgument struct {\n\tFederationService_Org_Federation_AAVariable\n}\n\n// Org_Federation_AVariable represents variable definitions in \"org.federation.A\".\ntype FederationService_Org_Federation_AVariable struct {\n}\n\n// Org_Federation_AArgument is argument for \"org.federation.A\" message.\ntype FederationService_Org_Federation_AArgument struct {\n\tFederationService_Org_Federation_AVariable\n}\n\n// Org_Federation_ABVariable represents variable definitions in \"org.federation.AB\".\ntype FederationService_Org_Federation_ABVariable struct {\n}\n\n// Org_Federation_ABArgument is argument for \"org.federation.AB\" message.\ntype FederationService_Org_Federation_ABArgument struct {\n\tFederationService_Org_Federation_ABVariable\n}\n\n// Org_Federation_BVariable represents variable definitions in \"org.federation.B\".\ntype FederationService_Org_Federation_BVariable struct {\n}\n\n// Org_Federation_BArgument is argument for \"org.federation.B\" message.\ntype FederationService_Org_Federation_BArgument struct {\n\tFederationService_Org_Federation_BVariable\n}\n\n// Org_Federation_CVariable represents variable definitions in \"org.federation.C\".\ntype FederationService_Org_Federation_CVariable struct {\n}\n\n// Org_Federation_CArgument is argument for \"org.federation.C\" message.\ntype FederationService_Org_Federation_CArgument struct {\n\tA string\n\tFederationService_Org_Federation_CVariable\n}\n\n// Org_Federation_DVariable represents variable definitions in \"org.federation.D\".\ntype FederationService_Org_Federation_DVariable struct {\n}\n\n// Org_Federation_DArgument is argument for \"org.federation.D\" message.\ntype FederationService_Org_Federation_DArgument struct {\n\tB string\n\tFederationService_Org_Federation_DVariable\n}\n\n// Org_Federation_EVariable represents variable definitions in \"org.federation.E\".\ntype FederationService_Org_Federation_EVariable struct {\n}\n\n// Org_Federation_EArgument is argument for \"org.federation.E\" message.\ntype FederationService_Org_Federation_EArgument struct {\n\tC string\n\tD string\n\tFederationService_Org_Federation_EVariable\n}\n\n// Org_Federation_FVariable represents variable definitions in \"org.federation.F\".\ntype FederationService_Org_Federation_FVariable struct {\n}\n\n// Org_Federation_FArgument is argument for \"org.federation.F\" message.\ntype FederationService_Org_Federation_FArgument struct {\n\tC string\n\tD string\n\tFederationService_Org_Federation_FVariable\n}\n\n// Org_Federation_GVariable represents variable definitions in \"org.federation.G\".\ntype FederationService_Org_Federation_GVariable struct {\n}\n\n// Org_Federation_GArgument is argument for \"org.federation.G\" message.\ntype FederationService_Org_Federation_GArgument struct {\n\tFederationService_Org_Federation_GVariable\n}\n\n// Org_Federation_GetResponseVariable represents variable definitions in \"org.federation.GetResponse\".\ntype FederationService_Org_Federation_GetResponseVariable struct {\n\tA *A\n\tB *B\n\tC *C\n\tD *D\n\tE *E\n\tF *F\n\tG *G\n\tH *H\n\tI *I\n\tJ *J\n}\n\n// Org_Federation_GetResponseArgument is argument for \"org.federation.GetResponse\" message.\ntype FederationService_Org_Federation_GetResponseArgument struct {\n\tFederationService_Org_Federation_GetResponseVariable\n}\n\n// Org_Federation_HVariable represents variable definitions in \"org.federation.H\".\ntype FederationService_Org_Federation_HVariable struct {\n}\n\n// Org_Federation_HArgument is argument for \"org.federation.H\" message.\ntype FederationService_Org_Federation_HArgument struct {\n\tE string\n\tF string\n\tG string\n\tFederationService_Org_Federation_HVariable\n}\n\n// Org_Federation_IVariable represents variable definitions in \"org.federation.I\".\ntype FederationService_Org_Federation_IVariable struct {\n}\n\n// Org_Federation_IArgument is argument for \"org.federation.I\" message.\ntype FederationService_Org_Federation_IArgument struct {\n\tFederationService_Org_Federation_IVariable\n}\n\n// Org_Federation_JVariable represents variable definitions in \"org.federation.J\".\ntype FederationService_Org_Federation_JVariable struct {\n}\n\n// Org_Federation_JArgument is argument for \"org.federation.J\" message.\ntype FederationService_Org_Federation_JArgument struct {\n\tI string\n\tFederationService_Org_Federation_JVariable\n}\n\n// FederationServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationServiceConfig struct {\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationServiceClientFactory interface {\n}\n\n// FederationServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationServiceDependentClientSet struct {\n}\n\n// FederationServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationServiceResolver interface {\n}\n\n// FederationServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// FederationServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationServiceUnimplementedResolver struct{}\n\n// FederationService represents Federation Service.\ntype FederationService struct {\n\tUnimplementedFederationServiceServer\n\tcfg             FederationServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationServiceDependentClientSet\n}\n\n// NewFederationService creates FederationService instance by FederationServiceConfig.\nfunc NewFederationService(cfg FederationServiceConfig) (*FederationService, error) {\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"org.federation.FederationService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.org.federation.AAArgument\": {},\n\t\t\"grpc.federation.private.org.federation.AArgument\":  {},\n\t\t\"grpc.federation.private.org.federation.ABArgument\": {},\n\t\t\"grpc.federation.private.org.federation.BArgument\":  {},\n\t\t\"grpc.federation.private.org.federation.CArgument\": {\n\t\t\t\"a\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"A\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.DArgument\": {\n\t\t\t\"b\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"B\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.EArgument\": {\n\t\t\t\"c\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"C\"),\n\t\t\t\"d\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"D\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.FArgument\": {\n\t\t\t\"c\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"C\"),\n\t\t\t\"d\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"D\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.GArgument\":           {},\n\t\t\"grpc.federation.private.org.federation.GetResponseArgument\": {},\n\t\t\"grpc.federation.private.org.federation.HArgument\": {\n\t\t\t\"e\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"E\"),\n\t\t\t\"f\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"F\"),\n\t\t\t\"g\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"G\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.IArgument\": {},\n\t\t\"grpc.federation.private.org.federation.JArgument\": {\n\t\t\t\"i\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"I\"),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"org.federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tsvc := &FederationService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tclient:          &FederationServiceDependentClientSet{},\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationService(ctx context.Context, svc *FederationService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n// Get implements \"org.federation.FederationService/Get\" method.\nfunc (s *FederationService) Get(ctx context.Context, req *GetRequest) (res *GetResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.FederationService/Get\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Org_Federation_GetResponse(ctx, &FederationService_Org_Federation_GetResponseArgument{})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Org_Federation_A resolve \"org.federation.A\" message.\nfunc (s *FederationService) resolve_Org_Federation_A(ctx context.Context, req *FederationService_Org_Federation_AArgument) (*A, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.A\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.A\", slog.Any(\"message_args\", s.logvalue_Org_Federation_AArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tAa *AA\n\t\t\tAb *AB\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.AArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"aa\"\n\t\t  message {\n\t\t    name: \"AA\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_aa := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*AA, *localValueType]{\n\t\t\tName: `aa`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.AA\"),\n\t\t\tSetter: func(value *localValueType, v *AA) error {\n\t\t\t\tvalue.vars.Aa = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_AAArgument{}\n\t\t\t\tret, err := s.resolve_Org_Federation_AA(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"ab\"\n\t\t  message {\n\t\t    name: \"AB\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_ab := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*AB, *localValueType]{\n\t\t\tName: `ab`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.AB\"),\n\t\t\tSetter: func(value *localValueType, v *AB) error {\n\t\t\t\tvalue.vars.Ab = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_ABArgument{}\n\t\t\t\tret, err := s.resolve_Org_Federation_AB(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t   aa ─┐\n\t   ab ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_aa(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_ab(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// create a message value to be returned.\n\tret := &A{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'a'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'a'`,\n\t\tCacheIndex: 1,\n\t\tSetter: func(v string) error {\n\t\t\tret.Name = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.A\", slog.Any(\"org.federation.A\", s.logvalue_Org_Federation_A(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_AA resolve \"org.federation.AA\" message.\nfunc (s *FederationService) resolve_Org_Federation_AA(ctx context.Context, req *FederationService_Org_Federation_AAArgument) (*AA, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.AA\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.AA\", slog.Any(\"message_args\", s.logvalue_Org_Federation_AAArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.AAArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &AA{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'aa'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'aa'`,\n\t\tCacheIndex: 2,\n\t\tSetter: func(v string) error {\n\t\t\tret.Name = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.AA\", slog.Any(\"org.federation.AA\", s.logvalue_Org_Federation_AA(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_AB resolve \"org.federation.AB\" message.\nfunc (s *FederationService) resolve_Org_Federation_AB(ctx context.Context, req *FederationService_Org_Federation_ABArgument) (*AB, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.AB\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.AB\", slog.Any(\"message_args\", s.logvalue_Org_Federation_ABArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.ABArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &AB{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'ab'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'ab'`,\n\t\tCacheIndex: 3,\n\t\tSetter: func(v string) error {\n\t\t\tret.Name = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.AB\", slog.Any(\"org.federation.AB\", s.logvalue_Org_Federation_AB(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_B resolve \"org.federation.B\" message.\nfunc (s *FederationService) resolve_Org_Federation_B(ctx context.Context, req *FederationService_Org_Federation_BArgument) (*B, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.B\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.B\", slog.Any(\"message_args\", s.logvalue_Org_Federation_BArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.BArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &B{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'b'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'b'`,\n\t\tCacheIndex: 4,\n\t\tSetter: func(v string) error {\n\t\t\tret.Name = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.B\", slog.Any(\"org.federation.B\", s.logvalue_Org_Federation_B(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_C resolve \"org.federation.C\" message.\nfunc (s *FederationService) resolve_Org_Federation_C(ctx context.Context, req *FederationService_Org_Federation_CArgument) (*C, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.C\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.C\", slog.Any(\"message_args\", s.logvalue_Org_Federation_CArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.CArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &C{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'c'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'c'`,\n\t\tCacheIndex: 5,\n\t\tSetter: func(v string) error {\n\t\t\tret.Name = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.C\", slog.Any(\"org.federation.C\", s.logvalue_Org_Federation_C(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_D resolve \"org.federation.D\" message.\nfunc (s *FederationService) resolve_Org_Federation_D(ctx context.Context, req *FederationService_Org_Federation_DArgument) (*D, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.D\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.D\", slog.Any(\"message_args\", s.logvalue_Org_Federation_DArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.DArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &D{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'d'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'d'`,\n\t\tCacheIndex: 6,\n\t\tSetter: func(v string) error {\n\t\t\tret.Name = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.D\", slog.Any(\"org.federation.D\", s.logvalue_Org_Federation_D(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_E resolve \"org.federation.E\" message.\nfunc (s *FederationService) resolve_Org_Federation_E(ctx context.Context, req *FederationService_Org_Federation_EArgument) (*E, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.E\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.E\", slog.Any(\"message_args\", s.logvalue_Org_Federation_EArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.EArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &E{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'e'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'e'`,\n\t\tCacheIndex: 7,\n\t\tSetter: func(v string) error {\n\t\t\tret.Name = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.E\", slog.Any(\"org.federation.E\", s.logvalue_Org_Federation_E(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_F resolve \"org.federation.F\" message.\nfunc (s *FederationService) resolve_Org_Federation_F(ctx context.Context, req *FederationService_Org_Federation_FArgument) (*F, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.F\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.F\", slog.Any(\"message_args\", s.logvalue_Org_Federation_FArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.FArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &F{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'f'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'f'`,\n\t\tCacheIndex: 8,\n\t\tSetter: func(v string) error {\n\t\t\tret.Name = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.F\", slog.Any(\"org.federation.F\", s.logvalue_Org_Federation_F(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_G resolve \"org.federation.G\" message.\nfunc (s *FederationService) resolve_Org_Federation_G(ctx context.Context, req *FederationService_Org_Federation_GArgument) (*G, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.G\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.G\", slog.Any(\"message_args\", s.logvalue_Org_Federation_GArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.GArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &G{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'g'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'g'`,\n\t\tCacheIndex: 9,\n\t\tSetter: func(v string) error {\n\t\t\tret.Name = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.G\", slog.Any(\"org.federation.G\", s.logvalue_Org_Federation_G(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_GetResponse resolve \"org.federation.GetResponse\" message.\nfunc (s *FederationService) resolve_Org_Federation_GetResponse(ctx context.Context, req *FederationService_Org_Federation_GetResponseArgument) (*GetResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.GetResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.GetResponse\", slog.Any(\"message_args\", s.logvalue_Org_Federation_GetResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tA *A\n\t\t\tB *B\n\t\t\tC *C\n\t\t\tD *D\n\t\t\tE *E\n\t\t\tF *F\n\t\t\tG *G\n\t\t\tH *H\n\t\t\tI *I\n\t\t\tJ *J\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.GetResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"a\"\n\t\t  message {\n\t\t    name: \"A\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_a := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*A, *localValueType]{\n\t\t\tName: `a`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.A\"),\n\t\t\tSetter: func(value *localValueType, v *A) error {\n\t\t\t\tvalue.vars.A = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_AArgument{}\n\t\t\t\tret, err := s.resolve_Org_Federation_A(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"b\"\n\t\t  message {\n\t\t    name: \"B\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_b := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*B, *localValueType]{\n\t\t\tName: `b`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.B\"),\n\t\t\tSetter: func(value *localValueType, v *B) error {\n\t\t\t\tvalue.vars.B = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_BArgument{}\n\t\t\t\tret, err := s.resolve_Org_Federation_B(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"c\"\n\t\t  message {\n\t\t    name: \"C\"\n\t\t    args { name: \"a\", by: \"a.name\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_c := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*C, *localValueType]{\n\t\t\tName: `c`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.C\"),\n\t\t\tSetter: func(value *localValueType, v *C) error {\n\t\t\t\tvalue.vars.C = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_CArgument{}\n\t\t\t\t// { name: \"a\", by: \"a.name\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `a.name`,\n\t\t\t\t\tCacheIndex: 10,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.A = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_C(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"d\"\n\t\t  message {\n\t\t    name: \"D\"\n\t\t    args { name: \"b\", by: \"b.name\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_d := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*D, *localValueType]{\n\t\t\tName: `d`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.D\"),\n\t\t\tSetter: func(value *localValueType, v *D) error {\n\t\t\t\tvalue.vars.D = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_DArgument{}\n\t\t\t\t// { name: \"b\", by: \"b.name\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `b.name`,\n\t\t\t\t\tCacheIndex: 11,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.B = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_D(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"e\"\n\t\t  message {\n\t\t    name: \"E\"\n\t\t    args: [\n\t\t      { name: \"c\", by: \"c.name\" },\n\t\t      { name: \"d\", by: \"d.name\" }\n\t\t    ]\n\t\t  }\n\t\t}\n\t*/\n\tdef_e := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*E, *localValueType]{\n\t\t\tName: `e`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.E\"),\n\t\t\tSetter: func(value *localValueType, v *E) error {\n\t\t\t\tvalue.vars.E = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_EArgument{}\n\t\t\t\t// { name: \"c\", by: \"c.name\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `c.name`,\n\t\t\t\t\tCacheIndex: 12,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.C = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { name: \"d\", by: \"d.name\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `d.name`,\n\t\t\t\t\tCacheIndex: 13,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.D = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_E(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"f\"\n\t\t  message {\n\t\t    name: \"F\"\n\t\t    args: [\n\t\t      { name: \"c\", by: \"c.name\" },\n\t\t      { name: \"d\", by: \"d.name\" }\n\t\t    ]\n\t\t  }\n\t\t}\n\t*/\n\tdef_f := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*F, *localValueType]{\n\t\t\tName: `f`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.F\"),\n\t\t\tSetter: func(value *localValueType, v *F) error {\n\t\t\t\tvalue.vars.F = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_FArgument{}\n\t\t\t\t// { name: \"c\", by: \"c.name\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `c.name`,\n\t\t\t\t\tCacheIndex: 14,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.C = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { name: \"d\", by: \"d.name\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `d.name`,\n\t\t\t\t\tCacheIndex: 15,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.D = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_F(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"g\"\n\t\t  message {\n\t\t    name: \"G\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_g := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*G, *localValueType]{\n\t\t\tName: `g`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.G\"),\n\t\t\tSetter: func(value *localValueType, v *G) error {\n\t\t\t\tvalue.vars.G = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_GArgument{}\n\t\t\t\tret, err := s.resolve_Org_Federation_G(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"h\"\n\t\t  message {\n\t\t    name: \"H\"\n\t\t    args: [\n\t\t      { name: \"e\", by: \"e.name\" },\n\t\t      { name: \"f\", by: \"f.name\" },\n\t\t      { name: \"g\", by: \"g.name\" }\n\t\t    ]\n\t\t  }\n\t\t}\n\t*/\n\tdef_h := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*H, *localValueType]{\n\t\t\tName: `h`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.H\"),\n\t\t\tSetter: func(value *localValueType, v *H) error {\n\t\t\t\tvalue.vars.H = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_HArgument{}\n\t\t\t\t// { name: \"e\", by: \"e.name\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `e.name`,\n\t\t\t\t\tCacheIndex: 16,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.E = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { name: \"f\", by: \"f.name\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `f.name`,\n\t\t\t\t\tCacheIndex: 17,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.F = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { name: \"g\", by: \"g.name\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `g.name`,\n\t\t\t\t\tCacheIndex: 18,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.G = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_H(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"i\"\n\t\t  message {\n\t\t    name: \"I\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_i := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*I, *localValueType]{\n\t\t\tName: `i`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.I\"),\n\t\t\tSetter: func(value *localValueType, v *I) error {\n\t\t\t\tvalue.vars.I = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_IArgument{}\n\t\t\t\tret, err := s.resolve_Org_Federation_I(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"j\"\n\t\t  message {\n\t\t    name: \"J\"\n\t\t    args { name: \"i\", by: \"i.name\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_j := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*J, *localValueType]{\n\t\t\tName: `j`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.J\"),\n\t\t\tSetter: func(value *localValueType, v *J) error {\n\t\t\t\tvalue.vars.J = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_JArgument{}\n\t\t\t\t// { name: \"i\", by: \"i.name\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `i.name`,\n\t\t\t\t\tCacheIndex: 19,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.I = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_J(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t   a ─┐\n\t      c ─┐\n\t   b ─┐  │\n\t      d ─┤\n\t         e ─┐\n\t   a ─┐     │\n\t      c ─┐  │\n\t   b ─┐  │  │\n\t      d ─┤  │\n\t         f ─┤\n\t         g ─┤\n\t            h ─┐\n\t         i ─┐  │\n\t            j ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\teg, ctx2 := grpcfed.ErrorGroupWithContext(ctx1)\n\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\teg, ctx3 := grpcfed.ErrorGroupWithContext(ctx2)\n\t\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\t\tif err := def_a(ctx3); err != nil {\n\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx3, err)\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tif err := def_c(ctx3); err != nil {\n\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx3, err)\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn nil, nil\n\t\t\t})\n\t\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\t\tif err := def_b(ctx3); err != nil {\n\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx3, err)\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tif err := def_d(ctx3); err != nil {\n\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx3, err)\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn nil, nil\n\t\t\t})\n\t\t\tif err := eg.Wait(); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif err := def_e(ctx2); err != nil {\n\t\t\t\tgrpcfed.RecordErrorToSpan(ctx2, err)\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn nil, nil\n\t\t})\n\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\teg, ctx3 := grpcfed.ErrorGroupWithContext(ctx2)\n\t\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\t\tif err := def_a(ctx3); err != nil {\n\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx3, err)\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tif err := def_c(ctx3); err != nil {\n\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx3, err)\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn nil, nil\n\t\t\t})\n\t\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\t\tif err := def_b(ctx3); err != nil {\n\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx3, err)\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tif err := def_d(ctx3); err != nil {\n\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx3, err)\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn nil, nil\n\t\t\t})\n\t\t\tif err := eg.Wait(); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif err := def_f(ctx2); err != nil {\n\t\t\t\tgrpcfed.RecordErrorToSpan(ctx2, err)\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn nil, nil\n\t\t})\n\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\tif err := def_g(ctx2); err != nil {\n\t\t\t\tgrpcfed.RecordErrorToSpan(ctx2, err)\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn nil, nil\n\t\t})\n\t\tif err := eg.Wait(); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_h(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_i(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_j(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_GetResponseVariable.A = value.vars.A\n\treq.FederationService_Org_Federation_GetResponseVariable.B = value.vars.B\n\treq.FederationService_Org_Federation_GetResponseVariable.C = value.vars.C\n\treq.FederationService_Org_Federation_GetResponseVariable.D = value.vars.D\n\treq.FederationService_Org_Federation_GetResponseVariable.E = value.vars.E\n\treq.FederationService_Org_Federation_GetResponseVariable.F = value.vars.F\n\treq.FederationService_Org_Federation_GetResponseVariable.G = value.vars.G\n\treq.FederationService_Org_Federation_GetResponseVariable.H = value.vars.H\n\treq.FederationService_Org_Federation_GetResponseVariable.I = value.vars.I\n\treq.FederationService_Org_Federation_GetResponseVariable.J = value.vars.J\n\n\t// create a message value to be returned.\n\tret := &GetResponse{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"h.name\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `h.name`,\n\t\tCacheIndex: 20,\n\t\tSetter: func(v string) error {\n\t\t\tret.Hname = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"j.name\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `j.name`,\n\t\tCacheIndex: 21,\n\t\tSetter: func(v string) error {\n\t\t\tret.Jname = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.GetResponse\", slog.Any(\"org.federation.GetResponse\", s.logvalue_Org_Federation_GetResponse(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_H resolve \"org.federation.H\" message.\nfunc (s *FederationService) resolve_Org_Federation_H(ctx context.Context, req *FederationService_Org_Federation_HArgument) (*H, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.H\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.H\", slog.Any(\"message_args\", s.logvalue_Org_Federation_HArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.HArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &H{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'h'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'h'`,\n\t\tCacheIndex: 22,\n\t\tSetter: func(v string) error {\n\t\t\tret.Name = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.H\", slog.Any(\"org.federation.H\", s.logvalue_Org_Federation_H(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_I resolve \"org.federation.I\" message.\nfunc (s *FederationService) resolve_Org_Federation_I(ctx context.Context, req *FederationService_Org_Federation_IArgument) (*I, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.I\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.I\", slog.Any(\"message_args\", s.logvalue_Org_Federation_IArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.IArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &I{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'i'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'i'`,\n\t\tCacheIndex: 23,\n\t\tSetter: func(v string) error {\n\t\t\tret.Name = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.I\", slog.Any(\"org.federation.I\", s.logvalue_Org_Federation_I(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_J resolve \"org.federation.J\" message.\nfunc (s *FederationService) resolve_Org_Federation_J(ctx context.Context, req *FederationService_Org_Federation_JArgument) (*J, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.J\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.J\", slog.Any(\"message_args\", s.logvalue_Org_Federation_JArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.JArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &J{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'j'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'j'`,\n\t\tCacheIndex: 24,\n\t\tSetter: func(v string) error {\n\t\t\tret.Name = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.J\", slog.Any(\"org.federation.J\", s.logvalue_Org_Federation_J(ret)))\n\treturn ret, nil\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_A(v *A) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_AA(v *AA) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_AAArgument(v *FederationService_Org_Federation_AAArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_AArgument(v *FederationService_Org_Federation_AArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_AB(v *AB) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_ABArgument(v *FederationService_Org_Federation_ABArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_B(v *B) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_BArgument(v *FederationService_Org_Federation_BArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_C(v *C) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_CArgument(v *FederationService_Org_Federation_CArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"a\", v.A),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_D(v *D) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_DArgument(v *FederationService_Org_Federation_DArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"b\", v.B),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_E(v *E) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_EArgument(v *FederationService_Org_Federation_EArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"c\", v.C),\n\t\tslog.String(\"d\", v.D),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_F(v *F) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_FArgument(v *FederationService_Org_Federation_FArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"c\", v.C),\n\t\tslog.String(\"d\", v.D),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_G(v *G) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GArgument(v *FederationService_Org_Federation_GArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetResponse(v *GetResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"hname\", v.GetHname()),\n\t\tslog.String(\"jname\", v.GetJname()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetResponseArgument(v *FederationService_Org_Federation_GetResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_H(v *H) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_HArgument(v *FederationService_Org_Federation_HArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"e\", v.E),\n\t\tslog.String(\"f\", v.F),\n\t\tslog.String(\"g\", v.G),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_I(v *I) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_IArgument(v *FederationService_Org_Federation_IArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_J(v *J) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_JArgument(v *FederationService_Org_Federation_JArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"i\", v.I),\n\t)\n}\n"
  },
  {
    "path": "_examples/05_async/go.mod",
    "content": "module example\n\ngo 1.24.0\n\nreplace github.com/mercari/grpc-federation => ../../\n\nrequire (\n\tgithub.com/google/go-cmp v0.7.0\n\tgithub.com/mercari/grpc-federation v0.0.0-00010101000000-000000000000\n\tgo.opentelemetry.io/otel v1.24.0\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0\n\tgo.opentelemetry.io/otel/sdk v1.24.0\n\tgo.opentelemetry.io/otel/trace v1.24.0\n\tgo.uber.org/goleak v1.3.0\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7\n\tgoogle.golang.org/grpc v1.65.0\n\tgoogle.golang.org/protobuf v1.34.2\n)\n\nrequire (\n\tcel.dev/expr v0.19.1 // indirect\n\tgithub.com/antlr4-go/antlr/v4 v4.13.0 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.2.1 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/goccy/wasi-go v0.3.2 // indirect\n\tgithub.com/google/cel-go v0.23.1 // indirect\n\tgithub.com/google/uuid v1.6.0 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect\n\tgithub.com/kelseyhightower/envconfig v1.4.0 // indirect\n\tgithub.com/stealthrocket/wazergo v0.19.1 // indirect\n\tgithub.com/stoewer/go-strcase v1.3.0 // indirect\n\tgithub.com/tetratelabs/wazero v1.10.1 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.24.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.0.0 // indirect\n\tgolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect\n\tgolang.org/x/net v0.38.0 // indirect\n\tgolang.org/x/sync v0.14.0 // indirect\n\tgolang.org/x/sys v0.37.0 // indirect\n\tgolang.org/x/text v0.23.0 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 // indirect\n)\n"
  },
  {
    "path": "_examples/05_async/go.sum",
    "content": "cel.dev/expr v0.19.1 h1:NciYrtDRIR0lNCnH1LFJegdjspNx9fI59O7TWcua/W4=\ncel.dev/expr v0.19.1/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw=\ngithub.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=\ngithub.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/goccy/wasi-go v0.3.2 h1:wAvGXmqCkfcp0B0AwIp5Ya53hzDwkKm9W8iuT3nCCz0=\ngithub.com/goccy/wasi-go v0.3.2/go.mod h1:nIKD204n9xa4Z20UV+XA483kIr9TAl2vXr+X5qVAO5M=\ngithub.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4=\ngithub.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=\ngithub.com/google/cel-go v0.23.1 h1:91ThhEZlBcE5rB2adBVXqvDoqdL8BG2oyhd0bK1I/r4=\ngithub.com/google/cel-go v0.23.1/go.mod h1:52Pb6QsDbC5kvgxvZhiL9QX1oZEkcUF/ZqaPx1J5Wwo=\ngithub.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\ngithub.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg=\ngithub.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=\ngithub.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/stealthrocket/wazergo v0.19.1 h1:BPrITETPgSFwiytwmToO0MbUC/+RGC39JScz1JmmG6c=\ngithub.com/stealthrocket/wazergo v0.19.1/go.mod h1:riI0hxw4ndZA5e6z7PesHg2BtTftcZaMxRcoiGGipTs=\ngithub.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs=\ngithub.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tetratelabs/wazero v1.10.1 h1:2DugeJf6VVk58KTPszlNfeeN8AhhpwcZqkJj2wwFuH8=\ngithub.com/tetratelabs/wazero v1.10.1/go.mod h1:DRm5twOQ5Gr1AoEdSi0CLjDQF1J9ZAuyqFIjl1KKfQU=\ngo.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo=\ngo.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0=\ngo.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI=\ngo.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=\ngo.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw=\ngo.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg=\ngo.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=\ngo.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=\ngo.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=\ngo.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=\ngolang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=\ngolang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=\ngolang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=\ngolang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=\ngolang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=\ngolang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=\ngolang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 h1:YcyjlL1PRr2Q17/I0dPk2JmYS5CDXfcdb2Z3YRioEbw=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7 h1:2035KHhUv+EpyB+hWgJnaWKJOdX1E95w2S8Rr4uWKTs=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=\ngoogle.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=\ngoogle.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=\ngoogle.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=\ngoogle.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "_examples/05_async/grpc/federation/federation.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: grpc/federation/federation.proto\n\npackage federation\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\tcode \"google.golang.org/genproto/googleapis/rpc/code\"\n\terrdetails \"google.golang.org/genproto/googleapis/rpc/errdetails\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tdescriptorpb \"google.golang.org/protobuf/types/descriptorpb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// TypeKind is primitive kind list.\ntype TypeKind int32\n\nconst (\n\t// UNKNOWN represents unexpected value.\n\tTypeKind_UNKNOWN TypeKind = 0\n\t// STRING is used to convert the input value to `string` type.\n\tTypeKind_STRING TypeKind = 1\n\t// BOOL is used to convert the input value to `bool` type.\n\tTypeKind_BOOL TypeKind = 2\n\t// INT64 is used to convert the input value to `int64` type.\n\tTypeKind_INT64 TypeKind = 3\n\t// UINT64 is used to convert the input value to `uint64` type.\n\tTypeKind_UINT64 TypeKind = 4\n\t// DOUBLE is used to convert the input value to `double` type.\n\tTypeKind_DOUBLE TypeKind = 5\n\t// DURATION is used to convert the input value to the `google.protobuf.Duration` type.\n\tTypeKind_DURATION TypeKind = 6\n)\n\n// Enum value maps for TypeKind.\nvar (\n\tTypeKind_name = map[int32]string{\n\t\t0: \"UNKNOWN\",\n\t\t1: \"STRING\",\n\t\t2: \"BOOL\",\n\t\t3: \"INT64\",\n\t\t4: \"UINT64\",\n\t\t5: \"DOUBLE\",\n\t\t6: \"DURATION\",\n\t}\n\tTypeKind_value = map[string]int32{\n\t\t\"UNKNOWN\":  0,\n\t\t\"STRING\":   1,\n\t\t\"BOOL\":     2,\n\t\t\"INT64\":    3,\n\t\t\"UINT64\":   4,\n\t\t\"DOUBLE\":   5,\n\t\t\"DURATION\": 6,\n\t}\n)\n\nfunc (x TypeKind) Enum() *TypeKind {\n\tp := new(TypeKind)\n\t*p = x\n\treturn p\n}\n\nfunc (x TypeKind) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (TypeKind) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_grpc_federation_federation_proto_enumTypes[0].Descriptor()\n}\n\nfunc (TypeKind) Type() protoreflect.EnumType {\n\treturn &file_grpc_federation_federation_proto_enumTypes[0]\n}\n\nfunc (x TypeKind) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use TypeKind.Descriptor instead.\nfunc (TypeKind) EnumDescriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\n// LogLevel is the importance or severity of a log event.\ntype GRPCError_LogLevel int32\n\nconst (\n\t// UNKNOWN represents unexpected value.\n\tGRPCError_UNKNOWN GRPCError_LogLevel = 0\n\t// DEBUG is used for detailed information that is useful during development and debugging.\n\tGRPCError_DEBUG GRPCError_LogLevel = 1\n\t// INFO logs are used to provide information about the normal functioning of the application.\n\tGRPCError_INFO GRPCError_LogLevel = 2\n\t// WARN signifies a potential problem or warning that does not necessarily stop the program from working but may lead to issues in the future.\n\tGRPCError_WARN GRPCError_LogLevel = 3\n\t// ERROR indicates a serious issue that has caused a failure in the application.\n\tGRPCError_ERROR GRPCError_LogLevel = 4\n)\n\n// Enum value maps for GRPCError_LogLevel.\nvar (\n\tGRPCError_LogLevel_name = map[int32]string{\n\t\t0: \"UNKNOWN\",\n\t\t1: \"DEBUG\",\n\t\t2: \"INFO\",\n\t\t3: \"WARN\",\n\t\t4: \"ERROR\",\n\t}\n\tGRPCError_LogLevel_value = map[string]int32{\n\t\t\"UNKNOWN\": 0,\n\t\t\"DEBUG\":   1,\n\t\t\"INFO\":    2,\n\t\t\"WARN\":    3,\n\t\t\"ERROR\":   4,\n\t}\n)\n\nfunc (x GRPCError_LogLevel) Enum() *GRPCError_LogLevel {\n\tp := new(GRPCError_LogLevel)\n\t*p = x\n\treturn p\n}\n\nfunc (x GRPCError_LogLevel) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (GRPCError_LogLevel) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_grpc_federation_federation_proto_enumTypes[1].Descriptor()\n}\n\nfunc (GRPCError_LogLevel) Type() protoreflect.EnumType {\n\treturn &file_grpc_federation_federation_proto_enumTypes[1]\n}\n\nfunc (x GRPCError_LogLevel) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use GRPCError_LogLevel.Descriptor instead.\nfunc (GRPCError_LogLevel) EnumDescriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{24, 0}\n}\n\ntype FileRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPlugin *CELPlugin `protobuf:\"bytes,1,opt,name=plugin,proto3\" json:\"plugin,omitempty\"`\n\t// import can be used to resolve methods, messages, etc. that are referenced in gRPC Federation rules.\n\tImport []string `protobuf:\"bytes,2,rep,name=import,proto3\" json:\"import,omitempty\"`\n}\n\nfunc (x *FileRule) Reset() {\n\t*x = FileRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *FileRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*FileRule) ProtoMessage() {}\n\nfunc (x *FileRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use FileRule.ProtoReflect.Descriptor instead.\nfunc (*FileRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *FileRule) GetPlugin() *CELPlugin {\n\tif x != nil {\n\t\treturn x.Plugin\n\t}\n\treturn nil\n}\n\nfunc (x *FileRule) GetImport() []string {\n\tif x != nil {\n\t\treturn x.Import\n\t}\n\treturn nil\n}\n\ntype EnumRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// alias mapping between enums defined in other packages and enums defined on the federation service side.\n\t// The alias is the FQDN ( <package-name>.<enum-name> ) to the enum.\n\t// If this definition exists, type conversion is automatically performed before the enum value assignment operation.\n\t// If a enum with this option has a value that is not present in the enum specified by alias, and the alias option is not specified for that value, an error is occurred.\n\t// You can specify multiple aliases. In that case, only values common to all aliases will be considered.\n\t// Specifying a value that is not included in either alias will result in an error.\n\tAlias []string `protobuf:\"bytes,1,rep,name=alias,proto3\" json:\"alias,omitempty\"`\n}\n\nfunc (x *EnumRule) Reset() {\n\t*x = EnumRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumRule) ProtoMessage() {}\n\nfunc (x *EnumRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumRule.ProtoReflect.Descriptor instead.\nfunc (*EnumRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *EnumRule) GetAlias() []string {\n\tif x != nil {\n\t\treturn x.Alias\n\t}\n\treturn nil\n}\n\ntype EnumValueRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// specifies the default value of the enum.\n\t// All values other than those specified in alias will be default values.\n\tDefault *bool `protobuf:\"varint,1,opt,name=default,proto3,oneof\" json:\"default,omitempty\"`\n\t// alias can be used when alias is specified in grpc.federation.enum option,\n\t// and specifies the value name to be referenced among the enums specified in alias of enum option.\n\t// multiple value names can be specified for alias.\n\tAlias []string `protobuf:\"bytes,2,rep,name=alias,proto3\" json:\"alias,omitempty\"`\n\t// attr is used to hold multiple name-value pairs corresponding to an enum value.\n\t// The values specified by the name must be consistently specified for all enum values.\n\t// The values stored using this feature can be retrieved using the `attr()` method of the enum API.\n\tAttr []*EnumValueAttribute `protobuf:\"bytes,3,rep,name=attr,proto3\" json:\"attr,omitempty\"`\n\t// noalias exclude from the target of alias.\n\t// This option cannot be specified simultaneously with `default` or `alias`.\n\tNoalias *bool `protobuf:\"varint,4,opt,name=noalias,proto3,oneof\" json:\"noalias,omitempty\"`\n}\n\nfunc (x *EnumValueRule) Reset() {\n\t*x = EnumValueRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumValueRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumValueRule) ProtoMessage() {}\n\nfunc (x *EnumValueRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumValueRule.ProtoReflect.Descriptor instead.\nfunc (*EnumValueRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *EnumValueRule) GetDefault() bool {\n\tif x != nil && x.Default != nil {\n\t\treturn *x.Default\n\t}\n\treturn false\n}\n\nfunc (x *EnumValueRule) GetAlias() []string {\n\tif x != nil {\n\t\treturn x.Alias\n\t}\n\treturn nil\n}\n\nfunc (x *EnumValueRule) GetAttr() []*EnumValueAttribute {\n\tif x != nil {\n\t\treturn x.Attr\n\t}\n\treturn nil\n}\n\nfunc (x *EnumValueRule) GetNoalias() bool {\n\tif x != nil && x.Noalias != nil {\n\t\treturn *x.Noalias\n\t}\n\treturn false\n}\n\ntype EnumValueAttribute struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the attribute key.\n\t// This value is used to search for values using the `attr(<name>)` method.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// value represents the value corresponding to `name`.\n\tValue string `protobuf:\"bytes,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *EnumValueAttribute) Reset() {\n\t*x = EnumValueAttribute{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumValueAttribute) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumValueAttribute) ProtoMessage() {}\n\nfunc (x *EnumValueAttribute) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumValueAttribute.ProtoReflect.Descriptor instead.\nfunc (*EnumValueAttribute) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *EnumValueAttribute) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnumValueAttribute) GetValue() string {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn \"\"\n}\n\ntype OneofRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *OneofRule) Reset() {\n\t*x = OneofRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *OneofRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*OneofRule) ProtoMessage() {}\n\nfunc (x *OneofRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use OneofRule.ProtoReflect.Descriptor instead.\nfunc (*OneofRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{4}\n}\n\n// ServiceRule define gRPC Federation rules for the service.\ntype ServiceRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// env defines the environment variable.\n\tEnv *Env `protobuf:\"bytes,1,opt,name=env,proto3\" json:\"env,omitempty\"`\n\t// var defines the service-level variables.\n\tVar []*ServiceVariable `protobuf:\"bytes,2,rep,name=var,proto3\" json:\"var,omitempty\"`\n}\n\nfunc (x *ServiceRule) Reset() {\n\t*x = ServiceRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceRule) ProtoMessage() {}\n\nfunc (x *ServiceRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceRule.ProtoReflect.Descriptor instead.\nfunc (*ServiceRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *ServiceRule) GetEnv() *Env {\n\tif x != nil {\n\t\treturn x.Env\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceRule) GetVar() []*ServiceVariable {\n\tif x != nil {\n\t\treturn x.Var\n\t}\n\treturn nil\n}\n\n// Env is used when setting environment variables.\n// There are two ways to configure it.\ntype Env struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// var is used to directly list environment variables.\n\tVar []*EnvVar `protobuf:\"bytes,1,rep,name=var,proto3\" json:\"var,omitempty\"`\n\t// message is used to reference an already defined Protocol Buffers' message for defining environment variables.\n\t// If you want to set detailed options for the fields of the message, use the `env` option in FieldRule.\n\tMessage string `protobuf:\"bytes,2,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Env) Reset() {\n\t*x = Env{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Env) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Env) ProtoMessage() {}\n\nfunc (x *Env) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Env.ProtoReflect.Descriptor instead.\nfunc (*Env) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *Env) GetVar() []*EnvVar {\n\tif x != nil {\n\t\treturn x.Var\n\t}\n\treturn nil\n}\n\nfunc (x *Env) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\n// ServiceVariable define variables at the service level.\n// This definition is executed at server startup, after the initialization of Env.\n// The defined variables can be used across all messages that the service depends on.\ntype ServiceVariable struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is a variable name.\n\t// This name can be referenced in all CELs related to the service by using `grpc.federation.var.` prefix.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// if specify the condition for evaluating expr.\n\t// this value evaluated by CEL and it must return a boolean value.\n\t// If the result of evaluation is `false`, the value assigned to name is the default value of the result of evaluation of `expr`.\n\tIf *string `protobuf:\"bytes,2,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n\t// expr specify the value to be assigned to name.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*ServiceVariable_By\n\t//\t*ServiceVariable_Map\n\t//\t*ServiceVariable_Message\n\t//\t*ServiceVariable_Validation\n\t//\t*ServiceVariable_Enum\n\t//\t*ServiceVariable_Switch\n\tExpr isServiceVariable_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *ServiceVariable) Reset() {\n\t*x = ServiceVariable{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceVariable) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceVariable) ProtoMessage() {}\n\nfunc (x *ServiceVariable) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceVariable.ProtoReflect.Descriptor instead.\nfunc (*ServiceVariable) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{7}\n}\n\nfunc (x *ServiceVariable) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *ServiceVariable) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\nfunc (m *ServiceVariable) GetExpr() isServiceVariable_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetBy() string {\n\tif x, ok := x.GetExpr().(*ServiceVariable_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *ServiceVariable) GetMap() *MapExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetMessage() *MessageExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetValidation() *ServiceVariableValidationExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Validation); ok {\n\t\treturn x.Validation\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetEnum() *EnumExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetSwitch() *SwitchExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Switch); ok {\n\t\treturn x.Switch\n\t}\n\treturn nil\n}\n\ntype isServiceVariable_Expr interface {\n\tisServiceVariable_Expr()\n}\n\ntype ServiceVariable_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\ntype ServiceVariable_Map struct {\n\t// map apply map operation for the specified repeated type.\n\tMap *MapExpr `protobuf:\"bytes,12,opt,name=map,proto3,oneof\"`\n}\n\ntype ServiceVariable_Message struct {\n\t// message gets with message arguments.\n\tMessage *MessageExpr `protobuf:\"bytes,13,opt,name=message,proto3,oneof\"`\n}\n\ntype ServiceVariable_Validation struct {\n\t// validation defines the validation rule and message.\n\tValidation *ServiceVariableValidationExpr `protobuf:\"bytes,14,opt,name=validation,proto3,oneof\"`\n}\n\ntype ServiceVariable_Enum struct {\n\t// enum gets with cel value.\n\tEnum *EnumExpr `protobuf:\"bytes,15,opt,name=enum,proto3,oneof\"`\n}\n\ntype ServiceVariable_Switch struct {\n\t// switch provides conditional evaluation with multiple branches.\n\tSwitch *SwitchExpr `protobuf:\"bytes,16,opt,name=switch,proto3,oneof\"`\n}\n\nfunc (*ServiceVariable_By) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Map) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Message) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Validation) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Enum) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Switch) isServiceVariable_Expr() {}\n\n// ServiceVariableValidationExpr represents validation rule and error message.\ntype ServiceVariableValidationExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// if specifies condition in CEL. If the condition is true, it returns error.\n\t// The return value must always be of type boolean.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3\" json:\"if,omitempty\"`\n\t// message is a error message in CEL.\n\tMessage string `protobuf:\"bytes,2,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *ServiceVariableValidationExpr) Reset() {\n\t*x = ServiceVariableValidationExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceVariableValidationExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceVariableValidationExpr) ProtoMessage() {}\n\nfunc (x *ServiceVariableValidationExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceVariableValidationExpr.ProtoReflect.Descriptor instead.\nfunc (*ServiceVariableValidationExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{8}\n}\n\nfunc (x *ServiceVariableValidationExpr) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *ServiceVariableValidationExpr) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\n// EnvVar represents an environment variable.\ntype EnvVar struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is an environment variable name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// type is an environment variable type.\n\tType *EnvType `protobuf:\"bytes,2,opt,name=type,proto3\" json:\"type,omitempty\"`\n\t// option is an additional option for parsing environment variable.\n\tOption *EnvVarOption `protobuf:\"bytes,3,opt,name=option,proto3,oneof\" json:\"option,omitempty\"`\n}\n\nfunc (x *EnvVar) Reset() {\n\t*x = EnvVar{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvVar) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvVar) ProtoMessage() {}\n\nfunc (x *EnvVar) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvVar.ProtoReflect.Descriptor instead.\nfunc (*EnvVar) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{9}\n}\n\nfunc (x *EnvVar) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnvVar) GetType() *EnvType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nfunc (x *EnvVar) GetOption() *EnvVarOption {\n\tif x != nil {\n\t\treturn x.Option\n\t}\n\treturn nil\n}\n\n// EnvType represents type information for environment variable.\ntype EnvType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to Type:\n\t//\n\t//\t*EnvType_Kind\n\t//\t*EnvType_Repeated\n\t//\t*EnvType_Map\n\tType isEnvType_Type `protobuf_oneof:\"type\"`\n}\n\nfunc (x *EnvType) Reset() {\n\t*x = EnvType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[10]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvType) ProtoMessage() {}\n\nfunc (x *EnvType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[10]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvType.ProtoReflect.Descriptor instead.\nfunc (*EnvType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{10}\n}\n\nfunc (m *EnvType) GetType() isEnvType_Type {\n\tif m != nil {\n\t\treturn m.Type\n\t}\n\treturn nil\n}\n\nfunc (x *EnvType) GetKind() TypeKind {\n\tif x, ok := x.GetType().(*EnvType_Kind); ok {\n\t\treturn x.Kind\n\t}\n\treturn TypeKind_UNKNOWN\n}\n\nfunc (x *EnvType) GetRepeated() *EnvType {\n\tif x, ok := x.GetType().(*EnvType_Repeated); ok {\n\t\treturn x.Repeated\n\t}\n\treturn nil\n}\n\nfunc (x *EnvType) GetMap() *EnvMapType {\n\tif x, ok := x.GetType().(*EnvType_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\ntype isEnvType_Type interface {\n\tisEnvType_Type()\n}\n\ntype EnvType_Kind struct {\n\t// kind is used when the type is a primitive type.\n\tKind TypeKind `protobuf:\"varint,1,opt,name=kind,proto3,enum=grpc.federation.TypeKind,oneof\"`\n}\n\ntype EnvType_Repeated struct {\n\t// repeated is used when the type is a repeated type.\n\tRepeated *EnvType `protobuf:\"bytes,2,opt,name=repeated,proto3,oneof\"`\n}\n\ntype EnvType_Map struct {\n\t// map is used when the type is a map type.\n\tMap *EnvMapType `protobuf:\"bytes,3,opt,name=map,proto3,oneof\"`\n}\n\nfunc (*EnvType_Kind) isEnvType_Type() {}\n\nfunc (*EnvType_Repeated) isEnvType_Type() {}\n\nfunc (*EnvType_Map) isEnvType_Type() {}\n\n// EnvMapType represents map type.\ntype EnvMapType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// key represents map's key type.\n\tKey *EnvType `protobuf:\"bytes,1,opt,name=key,proto3\" json:\"key,omitempty\"`\n\t// value represents map's value type.\n\tValue *EnvType `protobuf:\"bytes,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *EnvMapType) Reset() {\n\t*x = EnvMapType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[11]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvMapType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvMapType) ProtoMessage() {}\n\nfunc (x *EnvMapType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[11]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvMapType.ProtoReflect.Descriptor instead.\nfunc (*EnvMapType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{11}\n}\n\nfunc (x *EnvMapType) GetKey() *EnvType {\n\tif x != nil {\n\t\treturn x.Key\n\t}\n\treturn nil\n}\n\nfunc (x *EnvMapType) GetValue() *EnvType {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn nil\n}\n\n// EnvVarOption represents additional option for environment variable.\n// The option work with the `envconfig` library in Go language.\n// For detailed specifications, please refer to the library's documentation ( https://pkg.go.dev/github.com/kelseyhightower/envconfig#section-readme ).\ntype EnvVarOption struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// alternate use this option if you want to use an environment variable with a different name than the value specified in `EnvVar.name`.\n\tAlternate *string `protobuf:\"bytes,1,opt,name=alternate,proto3,oneof\" json:\"alternate,omitempty\"`\n\t// default specify the value to use as a fallback if the specified environment variable is not found.\n\tDefault *string `protobuf:\"bytes,2,opt,name=default,proto3,oneof\" json:\"default,omitempty\"`\n\t// required require the environment variable to exist.\n\t// If it does not exist, an error will occur at startup.\n\tRequired *bool `protobuf:\"varint,3,opt,name=required,proto3,oneof\" json:\"required,omitempty\"`\n\t// ignored if ignored is true, it does nothing even if the environment variable exists.\n\tIgnored *bool `protobuf:\"varint,4,opt,name=ignored,proto3,oneof\" json:\"ignored,omitempty\"`\n}\n\nfunc (x *EnvVarOption) Reset() {\n\t*x = EnvVarOption{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[12]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvVarOption) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvVarOption) ProtoMessage() {}\n\nfunc (x *EnvVarOption) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[12]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvVarOption.ProtoReflect.Descriptor instead.\nfunc (*EnvVarOption) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{12}\n}\n\nfunc (x *EnvVarOption) GetAlternate() string {\n\tif x != nil && x.Alternate != nil {\n\t\treturn *x.Alternate\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnvVarOption) GetDefault() string {\n\tif x != nil && x.Default != nil {\n\t\treturn *x.Default\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnvVarOption) GetRequired() bool {\n\tif x != nil && x.Required != nil {\n\t\treturn *x.Required\n\t}\n\treturn false\n}\n\nfunc (x *EnvVarOption) GetIgnored() bool {\n\tif x != nil && x.Ignored != nil {\n\t\treturn *x.Ignored\n\t}\n\treturn false\n}\n\ntype MethodRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// the time to timeout. If the specified time period elapses, DEADLINE_EXCEEDED status is returned.\n\t// If you want to handle this error, you need to implement a custom error handler in Go.\n\t// The format is the same as Go's time.Duration format. See https://pkg.go.dev/time#ParseDuration.\n\tTimeout *string `protobuf:\"bytes,1,opt,name=timeout,proto3,oneof\" json:\"timeout,omitempty\"`\n\t// response specify the name of the message you want to use to create the response value.\n\t// If you specify a reserved type like `google.protobuf.Empty` as the response, you cannot define gRPC Federation options.\n\t// In such cases, you can specify a separate message to create the response value.\n\t// The specified response message must contain fields with the same names and types as all the fields in the original response.\n\tResponse *string `protobuf:\"bytes,2,opt,name=response,proto3,oneof\" json:\"response,omitempty\"`\n}\n\nfunc (x *MethodRule) Reset() {\n\t*x = MethodRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[13]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MethodRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MethodRule) ProtoMessage() {}\n\nfunc (x *MethodRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[13]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MethodRule.ProtoReflect.Descriptor instead.\nfunc (*MethodRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{13}\n}\n\nfunc (x *MethodRule) GetTimeout() string {\n\tif x != nil && x.Timeout != nil {\n\t\treturn *x.Timeout\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodRule) GetResponse() string {\n\tif x != nil && x.Response != nil {\n\t\treturn *x.Response\n\t}\n\treturn \"\"\n}\n\n// MessageRule define gRPC Federation rules for the message.\ntype MessageRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// def specify variables to be used in field binding by `grpc.federation.field` option.\n\tDef []*VariableDefinition `protobuf:\"bytes,1,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// if custom_resolver is true, the resolver for this message is implemented by Go.\n\t// If there are any values retrieved by resolver or messages, they are passed as arguments for custom resolver.\n\t// Each field of the message returned by the custom resolver is automatically bound.\n\t// If you want to change the binding process for a particular field, set `custom_resolver=true` option for that field.\n\tCustomResolver *bool `protobuf:\"varint,2,opt,name=custom_resolver,json=customResolver,proto3,oneof\" json:\"custom_resolver,omitempty\"`\n\t// alias mapping between messages defined in other packages and messages defined on the federation service side.\n\t// The alias is the FQDN ( <package-name>.<message-name> ) to the message.\n\t// If this definition exists, type conversion is automatically performed before the field assignment operation.\n\t// If a message with this option has a field that is not present in the message specified by alias, and the alias option is not specified for that field, an error is occurred.\n\t// You can specify multiple aliases. In that case, only fields common to all aliases will be considered.\n\t// Specifying a field that is not included in either alias will result in an error.\n\tAlias []string `protobuf:\"bytes,3,rep,name=alias,proto3\" json:\"alias,omitempty\"`\n}\n\nfunc (x *MessageRule) Reset() {\n\t*x = MessageRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[14]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MessageRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MessageRule) ProtoMessage() {}\n\nfunc (x *MessageRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[14]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MessageRule.ProtoReflect.Descriptor instead.\nfunc (*MessageRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{14}\n}\n\nfunc (x *MessageRule) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *MessageRule) GetCustomResolver() bool {\n\tif x != nil && x.CustomResolver != nil {\n\t\treturn *x.CustomResolver\n\t}\n\treturn false\n}\n\nfunc (x *MessageRule) GetAlias() []string {\n\tif x != nil {\n\t\treturn x.Alias\n\t}\n\treturn nil\n}\n\n// VariableDefinition represents variable definition.\ntype VariableDefinition struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is a variable name.\n\t// This name can be referenced in all CELs defined after itself in the same message.\n\t// It can also be referenced in `grpc.federation.field` option.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// if specify the condition for evaluating expr.\n\t// this value evaluated by CEL and it must return a boolean value.\n\t// If the result of evaluation is `false`, the value assigned to name is the default value of the result of evaluation of `expr`.\n\tIf *string `protobuf:\"bytes,2,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n\t// autobind if the result value of `expr` is a message type,\n\t// the value of a field with the same name and type as the field name of its own message is automatically assigned to the value of the field in the message.\n\t// If multiple autobinds are used at the same message,\n\t// you must explicitly use the `grpc.federation.field` option to do the binding yourself, since duplicate field names cannot be correctly determined as one.\n\tAutobind *bool `protobuf:\"varint,3,opt,name=autobind,proto3,oneof\" json:\"autobind,omitempty\"`\n\t// expr specify the value to be assigned to name.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*VariableDefinition_By\n\t//\t*VariableDefinition_Map\n\t//\t*VariableDefinition_Message\n\t//\t*VariableDefinition_Call\n\t//\t*VariableDefinition_Validation\n\t//\t*VariableDefinition_Enum\n\t//\t*VariableDefinition_Switch\n\tExpr isVariableDefinition_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *VariableDefinition) Reset() {\n\t*x = VariableDefinition{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[15]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *VariableDefinition) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*VariableDefinition) ProtoMessage() {}\n\nfunc (x *VariableDefinition) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[15]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use VariableDefinition.ProtoReflect.Descriptor instead.\nfunc (*VariableDefinition) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{15}\n}\n\nfunc (x *VariableDefinition) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *VariableDefinition) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *VariableDefinition) GetAutobind() bool {\n\tif x != nil && x.Autobind != nil {\n\t\treturn *x.Autobind\n\t}\n\treturn false\n}\n\nfunc (m *VariableDefinition) GetExpr() isVariableDefinition_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetBy() string {\n\tif x, ok := x.GetExpr().(*VariableDefinition_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *VariableDefinition) GetMap() *MapExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetMessage() *MessageExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetCall() *CallExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Call); ok {\n\t\treturn x.Call\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetValidation() *ValidationExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Validation); ok {\n\t\treturn x.Validation\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetEnum() *EnumExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetSwitch() *SwitchExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Switch); ok {\n\t\treturn x.Switch\n\t}\n\treturn nil\n}\n\ntype isVariableDefinition_Expr interface {\n\tisVariableDefinition_Expr()\n}\n\ntype VariableDefinition_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\ntype VariableDefinition_Map struct {\n\t// map apply map operation for the specified repeated type.\n\tMap *MapExpr `protobuf:\"bytes,12,opt,name=map,proto3,oneof\"`\n}\n\ntype VariableDefinition_Message struct {\n\t// message gets with message arguments.\n\tMessage *MessageExpr `protobuf:\"bytes,13,opt,name=message,proto3,oneof\"`\n}\n\ntype VariableDefinition_Call struct {\n\t// call specifies how to call gRPC method.\n\tCall *CallExpr `protobuf:\"bytes,14,opt,name=call,proto3,oneof\"`\n}\n\ntype VariableDefinition_Validation struct {\n\t// validation defines the validation rule and error.\n\tValidation *ValidationExpr `protobuf:\"bytes,15,opt,name=validation,proto3,oneof\"`\n}\n\ntype VariableDefinition_Enum struct {\n\t// enum gets with cel value.\n\tEnum *EnumExpr `protobuf:\"bytes,16,opt,name=enum,proto3,oneof\"`\n}\n\ntype VariableDefinition_Switch struct {\n\t// switch provides conditional evaluation with multiple branches.\n\tSwitch *SwitchExpr `protobuf:\"bytes,17,opt,name=switch,proto3,oneof\"`\n}\n\nfunc (*VariableDefinition_By) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Map) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Message) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Call) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Validation) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Enum) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Switch) isVariableDefinition_Expr() {}\n\n// MapExpr apply map operation for the specified repeated type.\ntype MapExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// iterator define iterator variable.\n\t// When evaluating CEL in `expr`, we can refer to the name defined in iterator.\n\tIterator *Iterator `protobuf:\"bytes,1,opt,name=iterator,proto3\" json:\"iterator,omitempty\"`\n\t// expr creates map elements using iterator variable.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*MapExpr_By\n\t//\t*MapExpr_Message\n\t//\t*MapExpr_Enum\n\tExpr isMapExpr_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *MapExpr) Reset() {\n\t*x = MapExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[16]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MapExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MapExpr) ProtoMessage() {}\n\nfunc (x *MapExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[16]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MapExpr.ProtoReflect.Descriptor instead.\nfunc (*MapExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{16}\n}\n\nfunc (x *MapExpr) GetIterator() *Iterator {\n\tif x != nil {\n\t\treturn x.Iterator\n\t}\n\treturn nil\n}\n\nfunc (m *MapExpr) GetExpr() isMapExpr_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *MapExpr) GetBy() string {\n\tif x, ok := x.GetExpr().(*MapExpr_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *MapExpr) GetMessage() *MessageExpr {\n\tif x, ok := x.GetExpr().(*MapExpr_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *MapExpr) GetEnum() *EnumExpr {\n\tif x, ok := x.GetExpr().(*MapExpr_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn nil\n}\n\ntype isMapExpr_Expr interface {\n\tisMapExpr_Expr()\n}\n\ntype MapExpr_By struct {\n\t// `by` evaluates with CEL.\n\t// this can refer to the variable declared by `iterator`.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\ntype MapExpr_Message struct {\n\t// message gets with message arguments, and it is made an element of the map.\n\t// The result type of MapExpr is the repeated type of the specified message.\n\tMessage *MessageExpr `protobuf:\"bytes,12,opt,name=message,proto3,oneof\"`\n}\n\ntype MapExpr_Enum struct {\n\t// enum creates enum value for each element of the map.\n\t// The result type of MapExpr is the repeated type of the specified enum.\n\tEnum *EnumExpr `protobuf:\"bytes,13,opt,name=enum,proto3,oneof\"`\n}\n\nfunc (*MapExpr_By) isMapExpr_Expr() {}\n\nfunc (*MapExpr_Message) isMapExpr_Expr() {}\n\nfunc (*MapExpr_Enum) isMapExpr_Expr() {}\n\n// Iterator represents iterator variable.\ntype Iterator struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// variable name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// src the value that will be the source for creating the iterator.\n\t// src must be a repeated type.\n\tSrc string `protobuf:\"bytes,2,opt,name=src,proto3\" json:\"src,omitempty\"`\n}\n\nfunc (x *Iterator) Reset() {\n\t*x = Iterator{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[17]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Iterator) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Iterator) ProtoMessage() {}\n\nfunc (x *Iterator) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[17]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Iterator.ProtoReflect.Descriptor instead.\nfunc (*Iterator) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{17}\n}\n\nfunc (x *Iterator) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Iterator) GetSrc() string {\n\tif x != nil {\n\t\treturn x.Src\n\t}\n\treturn \"\"\n}\n\n// MessageExpr represents dependent message.\ntype MessageExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name specify the message name by FQDN. format is `<package-name>.<message-name>`.\n\t// <package-name> can be omitted when referring to messages in the same package.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// args specify the parameters needed to get the message. This is called the \"message arguments\".\n\tArgs []*Argument `protobuf:\"bytes,2,rep,name=args,proto3\" json:\"args,omitempty\"`\n}\n\nfunc (x *MessageExpr) Reset() {\n\t*x = MessageExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[18]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MessageExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MessageExpr) ProtoMessage() {}\n\nfunc (x *MessageExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[18]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MessageExpr.ProtoReflect.Descriptor instead.\nfunc (*MessageExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{18}\n}\n\nfunc (x *MessageExpr) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *MessageExpr) GetArgs() []*Argument {\n\tif x != nil {\n\t\treturn x.Args\n\t}\n\treturn nil\n}\n\n// EnumExpr represents dependent enum.\ntype EnumExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name specify the enum name by FQDN. format is `<package-name>.<enum-name>`.\n\t// <package-name> can be omitted when referring to enum in the same package.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,2,opt,name=by,proto3\" json:\"by,omitempty\"`\n}\n\nfunc (x *EnumExpr) Reset() {\n\t*x = EnumExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[19]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumExpr) ProtoMessage() {}\n\nfunc (x *EnumExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[19]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumExpr.ProtoReflect.Descriptor instead.\nfunc (*EnumExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{19}\n}\n\nfunc (x *EnumExpr) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnumExpr) GetBy() string {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\n// CallExpr represents how to call gRPC method.\ntype CallExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// method specify the FQDN for the gRPC method. format is `<package-name>.<service-name>/<method-name>`.\n\tMethod string `protobuf:\"bytes,1,opt,name=method,proto3\" json:\"method,omitempty\"`\n\t// request specify request parameters for the gRPC method.\n\tRequest []*MethodRequest `protobuf:\"bytes,2,rep,name=request,proto3\" json:\"request,omitempty\"`\n\t// the time to timeout. If the specified time period elapses, DEADLINE_EXCEEDED status is returned.\n\t// If you want to handle this error, you need to implement a custom error handler in Go.\n\t// The format is the same as Go's time.Duration format. See https://pkg.go.dev/time#ParseDuration.\n\tTimeout *string `protobuf:\"bytes,3,opt,name=timeout,proto3,oneof\" json:\"timeout,omitempty\"`\n\t// retry specifies the retry policy if the method call fails.\n\tRetry *RetryPolicy `protobuf:\"bytes,4,opt,name=retry,proto3,oneof\" json:\"retry,omitempty\"`\n\t// error evaluated when an error occurs during a method call.\n\t// Multiple errors can be defined and are evaluated in the order in which they are described.\n\t// If an error occurs while creating an gRPC status error, original error will be returned.\n\tError []*GRPCError `protobuf:\"bytes,5,rep,name=error,proto3\" json:\"error,omitempty\"`\n\t// option is the gRPC's call option (https://pkg.go.dev/google.golang.org/grpc#CallOption).\n\tOption *GRPCCallOption `protobuf:\"bytes,6,opt,name=option,proto3,oneof\" json:\"option,omitempty\"`\n\t// metadata specify outgoing metadata with CEL value.\n\t// The specified type must always be of type map<string, repeated string>.\n\tMetadata *string `protobuf:\"bytes,7,opt,name=metadata,proto3,oneof\" json:\"metadata,omitempty\"`\n}\n\nfunc (x *CallExpr) Reset() {\n\t*x = CallExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[20]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CallExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CallExpr) ProtoMessage() {}\n\nfunc (x *CallExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[20]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CallExpr.ProtoReflect.Descriptor instead.\nfunc (*CallExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{20}\n}\n\nfunc (x *CallExpr) GetMethod() string {\n\tif x != nil {\n\t\treturn x.Method\n\t}\n\treturn \"\"\n}\n\nfunc (x *CallExpr) GetRequest() []*MethodRequest {\n\tif x != nil {\n\t\treturn x.Request\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetTimeout() string {\n\tif x != nil && x.Timeout != nil {\n\t\treturn *x.Timeout\n\t}\n\treturn \"\"\n}\n\nfunc (x *CallExpr) GetRetry() *RetryPolicy {\n\tif x != nil {\n\t\treturn x.Retry\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetError() []*GRPCError {\n\tif x != nil {\n\t\treturn x.Error\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetOption() *GRPCCallOption {\n\tif x != nil {\n\t\treturn x.Option\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetMetadata() string {\n\tif x != nil && x.Metadata != nil {\n\t\treturn *x.Metadata\n\t}\n\treturn \"\"\n}\n\n// SwitchExpr represents a switch statement. At least one \"case\", and \"default\", must be defined. All\n// case.if expressions must evaluate to a boolean value. All case.by expressions, and default.by, must\n// evaluate to the same type (the return type of the switch).\n//\n// When executed, the case.if expressions are evaluated in order, and, for the first case whose\n// case.if expression evaluates to true, its case.by is evaluated to make the return value of the\n// SwitchExpr.\n// If no case.if evaluates to true, default.by is evaluated to make the return value.\ntype SwitchExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Cases for the switch expression.\n\tCase []*SwitchCaseExpr `protobuf:\"bytes,1,rep,name=case,proto3\" json:\"case,omitempty\"`\n\t// The default case, if none of the \"case.if\" expressions evaluate to true.\n\tDefault *SwitchDefaultExpr `protobuf:\"bytes,2,opt,name=default,proto3\" json:\"default,omitempty\"`\n}\n\nfunc (x *SwitchExpr) Reset() {\n\t*x = SwitchExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[21]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SwitchExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SwitchExpr) ProtoMessage() {}\n\nfunc (x *SwitchExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[21]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SwitchExpr.ProtoReflect.Descriptor instead.\nfunc (*SwitchExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{21}\n}\n\nfunc (x *SwitchExpr) GetCase() []*SwitchCaseExpr {\n\tif x != nil {\n\t\treturn x.Case\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchExpr) GetDefault() *SwitchDefaultExpr {\n\tif x != nil {\n\t\treturn x.Default\n\t}\n\treturn nil\n}\n\n// SwitchCaseExpr represents a single case for a switch expression.\ntype SwitchCaseExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// if specify the condition for evaluating expr.\n\t// this value evaluated by CEL and it must return a boolean value.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3\" json:\"if,omitempty\"`\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,2,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// expr specify the value to return for the case.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*SwitchCaseExpr_By\n\tExpr isSwitchCaseExpr_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *SwitchCaseExpr) Reset() {\n\t*x = SwitchCaseExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[22]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SwitchCaseExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SwitchCaseExpr) ProtoMessage() {}\n\nfunc (x *SwitchCaseExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[22]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SwitchCaseExpr.ProtoReflect.Descriptor instead.\nfunc (*SwitchCaseExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{22}\n}\n\nfunc (x *SwitchCaseExpr) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *SwitchCaseExpr) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (m *SwitchCaseExpr) GetExpr() isSwitchCaseExpr_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchCaseExpr) GetBy() string {\n\tif x, ok := x.GetExpr().(*SwitchCaseExpr_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\ntype isSwitchCaseExpr_Expr interface {\n\tisSwitchCaseExpr_Expr()\n}\n\ntype SwitchCaseExpr_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\nfunc (*SwitchCaseExpr_By) isSwitchCaseExpr_Expr() {}\n\n// SwitchDefaultExpr represents the default case for a switch expression.\ntype SwitchDefaultExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,1,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// expr specify the value to return for the default case.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*SwitchDefaultExpr_By\n\tExpr isSwitchDefaultExpr_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *SwitchDefaultExpr) Reset() {\n\t*x = SwitchDefaultExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[23]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SwitchDefaultExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SwitchDefaultExpr) ProtoMessage() {}\n\nfunc (x *SwitchDefaultExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[23]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SwitchDefaultExpr.ProtoReflect.Descriptor instead.\nfunc (*SwitchDefaultExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{23}\n}\n\nfunc (x *SwitchDefaultExpr) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (m *SwitchDefaultExpr) GetExpr() isSwitchDefaultExpr_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchDefaultExpr) GetBy() string {\n\tif x, ok := x.GetExpr().(*SwitchDefaultExpr_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\ntype isSwitchDefaultExpr_Expr interface {\n\tisSwitchDefaultExpr_Expr()\n}\n\ntype SwitchDefaultExpr_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\nfunc (*SwitchDefaultExpr_By) isSwitchDefaultExpr_Expr() {}\n\n// GRPCError create gRPC status value.\ntype GRPCError struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,1,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// if specifies condition in CEL. If the condition is true, it returns defined error information.\n\t// If this field is omitted, it is always treated as 'true' and returns defined error information.\n\t// The return value must always be of type boolean.\n\tIf *string `protobuf:\"bytes,2,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n\t// code is a gRPC status code.\n\tCode *code.Code `protobuf:\"varint,3,opt,name=code,proto3,enum=google.rpc.Code,oneof\" json:\"code,omitempty\"`\n\t// message is a gRPC status message.\n\t// If omitted, the message will be auto-generated from the configurations.\n\tMessage *string `protobuf:\"bytes,4,opt,name=message,proto3,oneof\" json:\"message,omitempty\"`\n\t// details is a list of error details.\n\t// If returns error, the corresponding error details are set.\n\tDetails []*GRPCErrorDetail `protobuf:\"bytes,5,rep,name=details,proto3\" json:\"details,omitempty\"`\n\t// ignore ignore the error if the condition in the \"if\" field is true and \"ignore\" field is set to true.\n\t// When an error is ignored, the returned response is always null value.\n\t// If you want to return a response that is not null, please use `ignore_and_response` feature.\n\t// Therefore, `ignore` and `ignore_and_response` cannot be specified same.\n\tIgnore *bool `protobuf:\"varint,6,opt,name=ignore,proto3,oneof\" json:\"ignore,omitempty\"`\n\t// ignore_and_response ignore the error if the condition in the \"if\" field is true and it returns response specified in CEL.\n\t// The evaluation value of CEL must always be the same as the response message type.\n\t// `ignore` and `ignore_and_response` cannot be specified same.\n\tIgnoreAndResponse *string `protobuf:\"bytes,7,opt,name=ignore_and_response,json=ignoreAndResponse,proto3,oneof\" json:\"ignore_and_response,omitempty\"`\n\t// log_level can be configured to output logs as any log level.\n\t// If DEBUG is specified for the log_level, logs are output as debug logs.\n\t// default value is ERROR.\n\tLogLevel *GRPCError_LogLevel `protobuf:\"varint,8,opt,name=log_level,json=logLevel,proto3,enum=grpc.federation.GRPCError_LogLevel,oneof\" json:\"log_level,omitempty\"`\n}\n\nfunc (x *GRPCError) Reset() {\n\t*x = GRPCError{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[24]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GRPCError) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GRPCError) ProtoMessage() {}\n\nfunc (x *GRPCError) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[24]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GRPCError.ProtoReflect.Descriptor instead.\nfunc (*GRPCError) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{24}\n}\n\nfunc (x *GRPCError) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCError) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCError) GetCode() code.Code {\n\tif x != nil && x.Code != nil {\n\t\treturn *x.Code\n\t}\n\treturn code.Code(0)\n}\n\nfunc (x *GRPCError) GetMessage() string {\n\tif x != nil && x.Message != nil {\n\t\treturn *x.Message\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCError) GetDetails() []*GRPCErrorDetail {\n\tif x != nil {\n\t\treturn x.Details\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCError) GetIgnore() bool {\n\tif x != nil && x.Ignore != nil {\n\t\treturn *x.Ignore\n\t}\n\treturn false\n}\n\nfunc (x *GRPCError) GetIgnoreAndResponse() string {\n\tif x != nil && x.IgnoreAndResponse != nil {\n\t\treturn *x.IgnoreAndResponse\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCError) GetLogLevel() GRPCError_LogLevel {\n\tif x != nil && x.LogLevel != nil {\n\t\treturn *x.LogLevel\n\t}\n\treturn GRPCError_UNKNOWN\n}\n\ntype GRPCErrorDetail struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// if specifies condition rule in CEL. If the condition is true, gRPC error detail is added to the error.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3\" json:\"if,omitempty\"`\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,2,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// message represents arbitrary messages to describe the detail of the error.\n\tMessage []*MessageExpr `protobuf:\"bytes,3,rep,name=message,proto3\" json:\"message,omitempty\"`\n\t// error_info describes the cause of the error with structured details.\n\tErrorInfo []*errdetails.ErrorInfo `protobuf:\"bytes,4,rep,name=error_info,json=errorInfo,proto3\" json:\"error_info,omitempty\"`\n\t// retry_info describes when the clients can retry a failed request.\n\tRetryInfo []*errdetails.RetryInfo `protobuf:\"bytes,5,rep,name=retry_info,json=retryInfo,proto3\" json:\"retry_info,omitempty\"`\n\t// debug_info describes additional debugging info.\n\tDebugInfo []*errdetails.DebugInfo `protobuf:\"bytes,6,rep,name=debug_info,json=debugInfo,proto3\" json:\"debug_info,omitempty\"`\n\t// quota_failure describes how a quota check failed.\n\tQuotaFailure []*errdetails.QuotaFailure `protobuf:\"bytes,7,rep,name=quota_failure,json=quotaFailure,proto3\" json:\"quota_failure,omitempty\"`\n\t// precondition_failure describes what preconditions have failed.\n\tPreconditionFailure []*errdetails.PreconditionFailure `protobuf:\"bytes,8,rep,name=precondition_failure,json=preconditionFailure,proto3\" json:\"precondition_failure,omitempty\"`\n\t// bad_request describes violations in a client request.\n\tBadRequest []*errdetails.BadRequest `protobuf:\"bytes,9,rep,name=bad_request,json=badRequest,proto3\" json:\"bad_request,omitempty\"`\n\t// request_info contains metadata about the request that clients can attach.\n\tRequestInfo []*errdetails.RequestInfo `protobuf:\"bytes,10,rep,name=request_info,json=requestInfo,proto3\" json:\"request_info,omitempty\"`\n\t// resource_info describes the resource that is being accessed.\n\tResourceInfo []*errdetails.ResourceInfo `protobuf:\"bytes,11,rep,name=resource_info,json=resourceInfo,proto3\" json:\"resource_info,omitempty\"`\n\t// help provides links to documentation or for performing an out of band action.\n\tHelp []*errdetails.Help `protobuf:\"bytes,12,rep,name=help,proto3\" json:\"help,omitempty\"`\n\t// localized_message provides a localized error message that is safe to return to the user.\n\tLocalizedMessage []*errdetails.LocalizedMessage `protobuf:\"bytes,13,rep,name=localized_message,json=localizedMessage,proto3\" json:\"localized_message,omitempty\"`\n\t// by specify a message in CEL to express the details of the error.\n\tBy []string `protobuf:\"bytes,14,rep,name=by,proto3\" json:\"by,omitempty\"`\n}\n\nfunc (x *GRPCErrorDetail) Reset() {\n\t*x = GRPCErrorDetail{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[25]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GRPCErrorDetail) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GRPCErrorDetail) ProtoMessage() {}\n\nfunc (x *GRPCErrorDetail) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[25]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GRPCErrorDetail.ProtoReflect.Descriptor instead.\nfunc (*GRPCErrorDetail) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{25}\n}\n\nfunc (x *GRPCErrorDetail) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCErrorDetail) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetMessage() []*MessageExpr {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetErrorInfo() []*errdetails.ErrorInfo {\n\tif x != nil {\n\t\treturn x.ErrorInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetRetryInfo() []*errdetails.RetryInfo {\n\tif x != nil {\n\t\treturn x.RetryInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetDebugInfo() []*errdetails.DebugInfo {\n\tif x != nil {\n\t\treturn x.DebugInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetQuotaFailure() []*errdetails.QuotaFailure {\n\tif x != nil {\n\t\treturn x.QuotaFailure\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetPreconditionFailure() []*errdetails.PreconditionFailure {\n\tif x != nil {\n\t\treturn x.PreconditionFailure\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetBadRequest() []*errdetails.BadRequest {\n\tif x != nil {\n\t\treturn x.BadRequest\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetRequestInfo() []*errdetails.RequestInfo {\n\tif x != nil {\n\t\treturn x.RequestInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetResourceInfo() []*errdetails.ResourceInfo {\n\tif x != nil {\n\t\treturn x.ResourceInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetHelp() []*errdetails.Help {\n\tif x != nil {\n\t\treturn x.Help\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetLocalizedMessage() []*errdetails.LocalizedMessage {\n\tif x != nil {\n\t\treturn x.LocalizedMessage\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetBy() []string {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn nil\n}\n\n// GRPCCallOption configures a gRPC Call before it starts or extracts information from a gRPC Call after it completes.\ntype GRPCCallOption struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// set the content-subtype. For example, if content-subtype is \"json\", the Content-Type over the wire will be \"application/grpc+json\".\n\t// The content-subtype is converted to lowercase before being included in Content-Type.\n\t// See Content-Type on https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests for more details.\n\t// If no such codec is found, the call will result in an error with code INTERNAL.\n\tContentSubtype *string `protobuf:\"bytes,1,opt,name=content_subtype,json=contentSubtype,proto3,oneof\" json:\"content_subtype,omitempty\"`\n\t// header retrieves the header metadata for a unary RPC.\n\t// In order to obtain the metadata, you must specify a variable of type map<string, repeated string> in the header.\n\t// e.g.)\n\t// def [\n\t//\n\t//\t{ name: \"hdr\" by: \"grpc.federation.metadata.new()\" }\n\t//\t{ call { method: \"pkg.Method\" option { header: \"hdr\" } } }\n\t//\n\t// ]\n\tHeader *string `protobuf:\"bytes,2,opt,name=header,proto3,oneof\" json:\"header,omitempty\"`\n\t// max_call_recv_msg_size sets the maximum message size in bytes the client can receive.\n\t// If this is not set, gRPC uses the default 4MB.\n\tMaxCallRecvMsgSize *int64 `protobuf:\"varint,3,opt,name=max_call_recv_msg_size,json=maxCallRecvMsgSize,proto3,oneof\" json:\"max_call_recv_msg_size,omitempty\"`\n\t// max_call_send_msg_size sets the maximum message size in bytes the client can send.\n\t// If this is not set, gRPC uses the default maximum number of int32 range.\n\tMaxCallSendMsgSize *int64 `protobuf:\"varint,4,opt,name=max_call_send_msg_size,json=maxCallSendMsgSize,proto3,oneof\" json:\"max_call_send_msg_size,omitempty\"`\n\t// static_method specifies that a call is being made to a method that is static,\n\t// which means the method is known at compile time and doesn't change at runtime.\n\t// This can be used as a signal to stats plugins that this method is safe to include as a key to a measurement.\n\tStaticMethod *bool `protobuf:\"varint,5,opt,name=static_method,json=staticMethod,proto3,oneof\" json:\"static_method,omitempty\"`\n\t// trailer retrieves the trailer metadata for a unary RPC.\n\t// In order to obtain the metadata, you must specify a variable of type map<string, repeated string> in the trailer.\n\t// e.g.)\n\t// def [\n\t//\n\t//\t{ name: \"trl\" by: \"grpc.federation.metadata.new()\" }\n\t//\t{ call { method: \"pkg.Method\" option { trailer: \"trl\" } } }\n\t//\n\t// ]\n\tTrailer *string `protobuf:\"bytes,6,opt,name=trailer,proto3,oneof\" json:\"trailer,omitempty\"`\n\t// wait_for_ready configures the RPC's behavior when the client is in TRANSIENT_FAILURE,\n\t// which occurs when all addresses fail to connect.\n\t// If wait_for_ready is false, the RPC will fail immediately.\n\t// Otherwise, the client will wait until a connection becomes available or the RPC's deadline is reached.\n\t// By default, RPCs do not \"wait for ready\".\n\tWaitForReady *bool `protobuf:\"varint,7,opt,name=wait_for_ready,json=waitForReady,proto3,oneof\" json:\"wait_for_ready,omitempty\"`\n}\n\nfunc (x *GRPCCallOption) Reset() {\n\t*x = GRPCCallOption{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[26]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GRPCCallOption) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GRPCCallOption) ProtoMessage() {}\n\nfunc (x *GRPCCallOption) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[26]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GRPCCallOption.ProtoReflect.Descriptor instead.\nfunc (*GRPCCallOption) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{26}\n}\n\nfunc (x *GRPCCallOption) GetContentSubtype() string {\n\tif x != nil && x.ContentSubtype != nil {\n\t\treturn *x.ContentSubtype\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCCallOption) GetHeader() string {\n\tif x != nil && x.Header != nil {\n\t\treturn *x.Header\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCCallOption) GetMaxCallRecvMsgSize() int64 {\n\tif x != nil && x.MaxCallRecvMsgSize != nil {\n\t\treturn *x.MaxCallRecvMsgSize\n\t}\n\treturn 0\n}\n\nfunc (x *GRPCCallOption) GetMaxCallSendMsgSize() int64 {\n\tif x != nil && x.MaxCallSendMsgSize != nil {\n\t\treturn *x.MaxCallSendMsgSize\n\t}\n\treturn 0\n}\n\nfunc (x *GRPCCallOption) GetStaticMethod() bool {\n\tif x != nil && x.StaticMethod != nil {\n\t\treturn *x.StaticMethod\n\t}\n\treturn false\n}\n\nfunc (x *GRPCCallOption) GetTrailer() string {\n\tif x != nil && x.Trailer != nil {\n\t\treturn *x.Trailer\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCCallOption) GetWaitForReady() bool {\n\tif x != nil && x.WaitForReady != nil {\n\t\treturn *x.WaitForReady\n\t}\n\treturn false\n}\n\n// Validation represents a validation rule against variables defined within the current scope.\ntype ValidationExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is a unique name for the validation.\n\t// If set, the validation error type will be <message-name><name>Error.\n\t// If omitted, the validation error type will be ValidationError.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// error defines the actual validation rules and an error to returned if the validation fails.\n\tError *GRPCError `protobuf:\"bytes,2,opt,name=error,proto3\" json:\"error,omitempty\"`\n}\n\nfunc (x *ValidationExpr) Reset() {\n\t*x = ValidationExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[27]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ValidationExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ValidationExpr) ProtoMessage() {}\n\nfunc (x *ValidationExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[27]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ValidationExpr.ProtoReflect.Descriptor instead.\nfunc (*ValidationExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{27}\n}\n\nfunc (x *ValidationExpr) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *ValidationExpr) GetError() *GRPCError {\n\tif x != nil {\n\t\treturn x.Error\n\t}\n\treturn nil\n}\n\n// RetryPolicy define the retry policy if the method call fails.\ntype RetryPolicy struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to Policy:\n\t//\n\t//\t*RetryPolicy_Constant\n\t//\t*RetryPolicy_Exponential\n\tPolicy isRetryPolicy_Policy `protobuf_oneof:\"policy\"`\n\t// if specifies condition in CEL. If the condition is true, run the retry process according to the policy.\n\t// If this field is omitted, it is always treated as 'true' and run the retry process.\n\t// The return value must always be of type boolean.\n\tIf string `protobuf:\"bytes,3,opt,name=if,proto3\" json:\"if,omitempty\"`\n}\n\nfunc (x *RetryPolicy) Reset() {\n\t*x = RetryPolicy{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[28]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RetryPolicy) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RetryPolicy) ProtoMessage() {}\n\nfunc (x *RetryPolicy) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[28]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RetryPolicy.ProtoReflect.Descriptor instead.\nfunc (*RetryPolicy) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{28}\n}\n\nfunc (m *RetryPolicy) GetPolicy() isRetryPolicy_Policy {\n\tif m != nil {\n\t\treturn m.Policy\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicy) GetConstant() *RetryPolicyConstant {\n\tif x, ok := x.GetPolicy().(*RetryPolicy_Constant); ok {\n\t\treturn x.Constant\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicy) GetExponential() *RetryPolicyExponential {\n\tif x, ok := x.GetPolicy().(*RetryPolicy_Exponential); ok {\n\t\treturn x.Exponential\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicy) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\ntype isRetryPolicy_Policy interface {\n\tisRetryPolicy_Policy()\n}\n\ntype RetryPolicy_Constant struct {\n\t// retry according to the \"constant\" policy.\n\tConstant *RetryPolicyConstant `protobuf:\"bytes,1,opt,name=constant,proto3,oneof\"`\n}\n\ntype RetryPolicy_Exponential struct {\n\t// retry according to the \"exponential backoff\" policy.\n\t// The following Go library is used in the implementation,\n\t// so please refer to the library documentation for how to specify each parameter.\n\t// https://pkg.go.dev/github.com/cenkalti/backoff/v4#section-readme.\n\tExponential *RetryPolicyExponential `protobuf:\"bytes,2,opt,name=exponential,proto3,oneof\"`\n}\n\nfunc (*RetryPolicy_Constant) isRetryPolicy_Policy() {}\n\nfunc (*RetryPolicy_Exponential) isRetryPolicy_Policy() {}\n\n// RetryPolicyConstant define \"constant\" based retry policy.\ntype RetryPolicyConstant struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// interval value. ( default value is 1s ).\n\tInterval *string `protobuf:\"bytes,1,opt,name=interval,proto3,oneof\" json:\"interval,omitempty\"`\n\t// max retry count. ( default value is 5. If zero is specified, it never stops )\n\tMaxRetries *uint64 `protobuf:\"varint,2,opt,name=max_retries,json=maxRetries,proto3,oneof\" json:\"max_retries,omitempty\"`\n}\n\nfunc (x *RetryPolicyConstant) Reset() {\n\t*x = RetryPolicyConstant{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[29]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RetryPolicyConstant) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RetryPolicyConstant) ProtoMessage() {}\n\nfunc (x *RetryPolicyConstant) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[29]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RetryPolicyConstant.ProtoReflect.Descriptor instead.\nfunc (*RetryPolicyConstant) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{29}\n}\n\nfunc (x *RetryPolicyConstant) GetInterval() string {\n\tif x != nil && x.Interval != nil {\n\t\treturn *x.Interval\n\t}\n\treturn \"\"\n}\n\nfunc (x *RetryPolicyConstant) GetMaxRetries() uint64 {\n\tif x != nil && x.MaxRetries != nil {\n\t\treturn *x.MaxRetries\n\t}\n\treturn 0\n}\n\n// RetryPolicyExponential define \"exponential backoff\" based retry policy.\ntype RetryPolicyExponential struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// initial interval value. ( default value is \"500ms\" ).\n\tInitialInterval *string `protobuf:\"bytes,1,opt,name=initial_interval,json=initialInterval,proto3,oneof\" json:\"initial_interval,omitempty\"`\n\t// randomization factor value. ( default value is 0.5 ).\n\tRandomizationFactor *float64 `protobuf:\"fixed64,2,opt,name=randomization_factor,json=randomizationFactor,proto3,oneof\" json:\"randomization_factor,omitempty\"`\n\t// multiplier. ( default value is 1.5 ).\n\tMultiplier *float64 `protobuf:\"fixed64,3,opt,name=multiplier,proto3,oneof\" json:\"multiplier,omitempty\"`\n\t// max interval value. ( default value is \"60s\" ).\n\tMaxInterval *string `protobuf:\"bytes,4,opt,name=max_interval,json=maxInterval,proto3,oneof\" json:\"max_interval,omitempty\"`\n\t// max retry count. ( default value is 5. If zero is specified, it never stops ).\n\tMaxRetries *uint64 `protobuf:\"varint,5,opt,name=max_retries,json=maxRetries,proto3,oneof\" json:\"max_retries,omitempty\"`\n}\n\nfunc (x *RetryPolicyExponential) Reset() {\n\t*x = RetryPolicyExponential{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[30]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RetryPolicyExponential) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RetryPolicyExponential) ProtoMessage() {}\n\nfunc (x *RetryPolicyExponential) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[30]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RetryPolicyExponential.ProtoReflect.Descriptor instead.\nfunc (*RetryPolicyExponential) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{30}\n}\n\nfunc (x *RetryPolicyExponential) GetInitialInterval() string {\n\tif x != nil && x.InitialInterval != nil {\n\t\treturn *x.InitialInterval\n\t}\n\treturn \"\"\n}\n\nfunc (x *RetryPolicyExponential) GetRandomizationFactor() float64 {\n\tif x != nil && x.RandomizationFactor != nil {\n\t\treturn *x.RandomizationFactor\n\t}\n\treturn 0\n}\n\nfunc (x *RetryPolicyExponential) GetMultiplier() float64 {\n\tif x != nil && x.Multiplier != nil {\n\t\treturn *x.Multiplier\n\t}\n\treturn 0\n}\n\nfunc (x *RetryPolicyExponential) GetMaxInterval() string {\n\tif x != nil && x.MaxInterval != nil {\n\t\treturn *x.MaxInterval\n\t}\n\treturn \"\"\n}\n\nfunc (x *RetryPolicyExponential) GetMaxRetries() uint64 {\n\tif x != nil && x.MaxRetries != nil {\n\t\treturn *x.MaxRetries\n\t}\n\treturn 0\n}\n\n// MethodRequest define parameters to be used for gRPC method request.\ntype MethodRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// field name of the request message.\n\tField string `protobuf:\"bytes,1,opt,name=field,proto3\" json:\"field,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tBy *string `protobuf:\"bytes,2,opt,name=by,proto3,oneof\" json:\"by,omitempty\"`\n\t// if describes the condition to be assigned to field.\n\t// The return value must be of type bool.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\t// If the field is a 'oneof' field, it must be specified.\n\tIf *string `protobuf:\"bytes,3,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n}\n\nfunc (x *MethodRequest) Reset() {\n\t*x = MethodRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[31]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MethodRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MethodRequest) ProtoMessage() {}\n\nfunc (x *MethodRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[31]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MethodRequest.ProtoReflect.Descriptor instead.\nfunc (*MethodRequest) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{31}\n}\n\nfunc (x *MethodRequest) GetField() string {\n\tif x != nil {\n\t\treturn x.Field\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodRequest) GetBy() string {\n\tif x != nil && x.By != nil {\n\t\treturn *x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodRequest) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\n// MethodResponse define which value of the method response is referenced.\ntype MethodResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name specify the unique name that can be used in a `MessageRule` / `FieldRule` for the same message for a specific field in the response.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// field name in response message.\n\tField *string `protobuf:\"bytes,2,opt,name=field,proto3,oneof\" json:\"field,omitempty\"`\n\t// autobind if the value referenced by `field` is a message type,\n\t// the value of a field with the same name and type as the field name of its own message is automatically assigned to the value of the field in the message.\n\t// If multiple autobinds are used at the same message,\n\t// you must explicitly use the `grpc.federation.field` option to do the binding yourself, since duplicate field names cannot be correctly determined as one.\n\tAutobind *bool `protobuf:\"varint,3,opt,name=autobind,proto3,oneof\" json:\"autobind,omitempty\"`\n}\n\nfunc (x *MethodResponse) Reset() {\n\t*x = MethodResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[32]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MethodResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MethodResponse) ProtoMessage() {}\n\nfunc (x *MethodResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[32]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MethodResponse.ProtoReflect.Descriptor instead.\nfunc (*MethodResponse) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{32}\n}\n\nfunc (x *MethodResponse) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodResponse) GetField() string {\n\tif x != nil && x.Field != nil {\n\t\treturn *x.Field\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodResponse) GetAutobind() bool {\n\tif x != nil && x.Autobind != nil {\n\t\treturn *x.Autobind\n\t}\n\treturn false\n}\n\n// Argument define message argument.\ntype Argument struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name of the message argument.\n\t// Use this name to refer to the message argument.\n\t// For example, if `foo` is specified as the name, it is referenced by `$.foo`.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tBy *string `protobuf:\"bytes,2,opt,name=by,proto3,oneof\" json:\"by,omitempty\"`\n\t// inline like by, it refers to the specified value and expands all fields beyond it.\n\t// For this reason, the referenced value must always be of message type.\n\tInline *string `protobuf:\"bytes,3,opt,name=inline,proto3,oneof\" json:\"inline,omitempty\"`\n}\n\nfunc (x *Argument) Reset() {\n\t*x = Argument{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[33]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Argument) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Argument) ProtoMessage() {}\n\nfunc (x *Argument) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[33]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Argument.ProtoReflect.Descriptor instead.\nfunc (*Argument) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{33}\n}\n\nfunc (x *Argument) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Argument) GetBy() string {\n\tif x != nil && x.By != nil {\n\t\treturn *x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *Argument) GetInline() string {\n\tif x != nil && x.Inline != nil {\n\t\treturn *x.Inline\n\t}\n\treturn \"\"\n}\n\n// FieldRule define gRPC Federation rules for the field of message.\ntype FieldRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// If custom_resolver is true, the field binding process is to be implemented in Go.\n\t// If there are any values retrieved by grpc.federation.message option, they are passed as arguments for custom resolver.\n\tCustomResolver *bool `protobuf:\"varint,1,opt,name=custom_resolver,json=customResolver,proto3,oneof\" json:\"custom_resolver,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tBy *string `protobuf:\"bytes,2,opt,name=by,proto3,oneof\" json:\"by,omitempty\"`\n\t// alias can be used when alias is specified in grpc.federation.message option,\n\t// and specifies the field name to be referenced among the messages specified in alias of message option.\n\t// If the specified field has the same type or can be converted automatically, its value is assigned.\n\tAlias *string `protobuf:\"bytes,3,opt,name=alias,proto3,oneof\" json:\"alias,omitempty\"`\n\t// use to evaluate any one of fields. this field only available in oneof.\n\tOneof *FieldOneof `protobuf:\"bytes,4,opt,name=oneof,proto3\" json:\"oneof,omitempty\"`\n\t// when defining an environment variable, use it for fields where you want to set additional options.\n\tEnv *EnvVarOption `protobuf:\"bytes,5,opt,name=env,proto3\" json:\"env,omitempty\"`\n}\n\nfunc (x *FieldRule) Reset() {\n\t*x = FieldRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[34]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *FieldRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*FieldRule) ProtoMessage() {}\n\nfunc (x *FieldRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[34]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use FieldRule.ProtoReflect.Descriptor instead.\nfunc (*FieldRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{34}\n}\n\nfunc (x *FieldRule) GetCustomResolver() bool {\n\tif x != nil && x.CustomResolver != nil {\n\t\treturn *x.CustomResolver\n\t}\n\treturn false\n}\n\nfunc (x *FieldRule) GetBy() string {\n\tif x != nil && x.By != nil {\n\t\treturn *x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *FieldRule) GetAlias() string {\n\tif x != nil && x.Alias != nil {\n\t\treturn *x.Alias\n\t}\n\treturn \"\"\n}\n\nfunc (x *FieldRule) GetOneof() *FieldOneof {\n\tif x != nil {\n\t\treturn x.Oneof\n\t}\n\treturn nil\n}\n\nfunc (x *FieldRule) GetEnv() *EnvVarOption {\n\tif x != nil {\n\t\treturn x.Env\n\t}\n\treturn nil\n}\n\n// FieldOneof evaluate \"messages\" or other field only if expr is true and assign to the oneof field.\n// This feature only available in oneof.\ntype FieldOneof struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// cond specify either `expr` or `default`. Only one `default` can be set per oneof.\n\t//\n\t// Types that are assignable to Cond:\n\t//\n\t//\t*FieldOneof_If\n\t//\t*FieldOneof_Default\n\tCond isFieldOneof_Cond `protobuf_oneof:\"cond\"`\n\t// def specify variables to be used in current oneof field's scope for field binding.\n\tDef []*VariableDefinition `protobuf:\"bytes,3,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule and FieldOneOf can be used.\n\tBy string `protobuf:\"bytes,4,opt,name=by,proto3\" json:\"by,omitempty\"`\n}\n\nfunc (x *FieldOneof) Reset() {\n\t*x = FieldOneof{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[35]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *FieldOneof) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*FieldOneof) ProtoMessage() {}\n\nfunc (x *FieldOneof) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[35]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use FieldOneof.ProtoReflect.Descriptor instead.\nfunc (*FieldOneof) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{35}\n}\n\nfunc (m *FieldOneof) GetCond() isFieldOneof_Cond {\n\tif m != nil {\n\t\treturn m.Cond\n\t}\n\treturn nil\n}\n\nfunc (x *FieldOneof) GetIf() string {\n\tif x, ok := x.GetCond().(*FieldOneof_If); ok {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *FieldOneof) GetDefault() bool {\n\tif x, ok := x.GetCond().(*FieldOneof_Default); ok {\n\t\treturn x.Default\n\t}\n\treturn false\n}\n\nfunc (x *FieldOneof) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *FieldOneof) GetBy() string {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\ntype isFieldOneof_Cond interface {\n\tisFieldOneof_Cond()\n}\n\ntype FieldOneof_If struct {\n\t// if describes the condition to be assigned to field.\n\t// The return value must be of type bool.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3,oneof\"`\n}\n\ntype FieldOneof_Default struct {\n\t// default used to assign a value when none of the other fields match any of the specified expressions.\n\t// Only one value can be defined per oneof.\n\tDefault bool `protobuf:\"varint,2,opt,name=default,proto3,oneof\"`\n}\n\nfunc (*FieldOneof_If) isFieldOneof_Cond() {}\n\nfunc (*FieldOneof_Default) isFieldOneof_Cond() {}\n\n// CELPlugin define schema of CEL plugin.\ntype CELPlugin struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tExport []*CELPluginExport `protobuf:\"bytes,1,rep,name=export,proto3\" json:\"export,omitempty\"`\n}\n\nfunc (x *CELPlugin) Reset() {\n\t*x = CELPlugin{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[36]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPlugin) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPlugin) ProtoMessage() {}\n\nfunc (x *CELPlugin) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[36]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPlugin.ProtoReflect.Descriptor instead.\nfunc (*CELPlugin) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{36}\n}\n\nfunc (x *CELPlugin) GetExport() []*CELPluginExport {\n\tif x != nil {\n\t\treturn x.Export\n\t}\n\treturn nil\n}\n\n// CELPluginExport describe the schema to be exposed as a CEL plugin.\ntype CELPluginExport struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the plugin name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// types describe the message type you want to expose.\n\tTypes []*CELReceiverType `protobuf:\"bytes,3,rep,name=types,proto3\" json:\"types,omitempty\"`\n\t// functions describe the definition of the function you want to expose.\n\tFunctions []*CELFunction `protobuf:\"bytes,4,rep,name=functions,proto3\" json:\"functions,omitempty\"`\n\t// variables describe the definition of the variable you want to expose.\n\tVariables  []*CELVariable       `protobuf:\"bytes,5,rep,name=variables,proto3\" json:\"variables,omitempty\"`\n\tCapability *CELPluginCapability `protobuf:\"bytes,6,opt,name=capability,proto3\" json:\"capability,omitempty\"`\n}\n\nfunc (x *CELPluginExport) Reset() {\n\t*x = CELPluginExport{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[37]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginExport) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginExport) ProtoMessage() {}\n\nfunc (x *CELPluginExport) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[37]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginExport.ProtoReflect.Descriptor instead.\nfunc (*CELPluginExport) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{37}\n}\n\nfunc (x *CELPluginExport) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELPluginExport) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELPluginExport) GetTypes() []*CELReceiverType {\n\tif x != nil {\n\t\treturn x.Types\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginExport) GetFunctions() []*CELFunction {\n\tif x != nil {\n\t\treturn x.Functions\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginExport) GetVariables() []*CELVariable {\n\tif x != nil {\n\t\treturn x.Variables\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginExport) GetCapability() *CELPluginCapability {\n\tif x != nil {\n\t\treturn x.Capability\n\t}\n\treturn nil\n}\n\n// CELPluginCapability controls the permissions granted to the WebAssembly plugin.\ntype CELPluginCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// env is the capability for environment variable.\n\tEnv *CELPluginEnvCapability `protobuf:\"bytes,1,opt,name=env,proto3,oneof\" json:\"env,omitempty\"`\n\t// file_system is the capability for file system.\n\tFileSystem *CELPluginFileSystemCapability `protobuf:\"bytes,2,opt,name=file_system,json=fileSystem,proto3,oneof\" json:\"file_system,omitempty\"`\n\t// network is the capability for network.\n\tNetwork *CELPluginNetworkCapability `protobuf:\"bytes,3,opt,name=network,proto3,oneof\" json:\"network,omitempty\"`\n}\n\nfunc (x *CELPluginCapability) Reset() {\n\t*x = CELPluginCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[38]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginCapability) ProtoMessage() {}\n\nfunc (x *CELPluginCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[38]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{38}\n}\n\nfunc (x *CELPluginCapability) GetEnv() *CELPluginEnvCapability {\n\tif x != nil {\n\t\treturn x.Env\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginCapability) GetFileSystem() *CELPluginFileSystemCapability {\n\tif x != nil {\n\t\treturn x.FileSystem\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginCapability) GetNetwork() *CELPluginNetworkCapability {\n\tif x != nil {\n\t\treturn x.Network\n\t}\n\treturn nil\n}\n\n// CELPluginEnvCapability controls access to the environment variable.\ntype CELPluginEnvCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// all allows access to all environment variables.\n\tAll bool `protobuf:\"varint,1,opt,name=all,proto3\" json:\"all,omitempty\"`\n\t// specifies accessible names. If \"all\" is true, it takes precedence.\n\tNames []string `protobuf:\"bytes,2,rep,name=names,proto3\" json:\"names,omitempty\"`\n}\n\nfunc (x *CELPluginEnvCapability) Reset() {\n\t*x = CELPluginEnvCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[39]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginEnvCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginEnvCapability) ProtoMessage() {}\n\nfunc (x *CELPluginEnvCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[39]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginEnvCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginEnvCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{39}\n}\n\nfunc (x *CELPluginEnvCapability) GetAll() bool {\n\tif x != nil {\n\t\treturn x.All\n\t}\n\treturn false\n}\n\nfunc (x *CELPluginEnvCapability) GetNames() []string {\n\tif x != nil {\n\t\treturn x.Names\n\t}\n\treturn nil\n}\n\n// CELPluginFileSystemCapability controls access to the file system.\ntype CELPluginFileSystemCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// mount_path specifies the file path of the host to mount.\n\t// If not specified, the root directory will be used.\n\tMountPath string `protobuf:\"bytes,1,opt,name=mount_path,json=mountPath,proto3\" json:\"mount_path,omitempty\"`\n}\n\nfunc (x *CELPluginFileSystemCapability) Reset() {\n\t*x = CELPluginFileSystemCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[40]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginFileSystemCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginFileSystemCapability) ProtoMessage() {}\n\nfunc (x *CELPluginFileSystemCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[40]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginFileSystemCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginFileSystemCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{40}\n}\n\nfunc (x *CELPluginFileSystemCapability) GetMountPath() string {\n\tif x != nil {\n\t\treturn x.MountPath\n\t}\n\treturn \"\"\n}\n\n// CELPluginNetworkCapability sets permissions related to network access.\n// This is an experimental feature.\ntype CELPluginNetworkCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *CELPluginNetworkCapability) Reset() {\n\t*x = CELPluginNetworkCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[41]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginNetworkCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginNetworkCapability) ProtoMessage() {}\n\nfunc (x *CELPluginNetworkCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[41]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginNetworkCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginNetworkCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{41}\n}\n\n// CELFunction represents the CEL function definition.\ntype CELFunction struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the function name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of function.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// args describe the definition of the function argument.\n\tArgs []*CELFunctionArgument `protobuf:\"bytes,3,rep,name=args,proto3\" json:\"args,omitempty\"`\n\t// return describe the definition of return type of function.\n\tReturn *CELType `protobuf:\"bytes,4,opt,name=return,proto3\" json:\"return,omitempty\"`\n}\n\nfunc (x *CELFunction) Reset() {\n\t*x = CELFunction{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[42]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELFunction) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELFunction) ProtoMessage() {}\n\nfunc (x *CELFunction) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[42]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELFunction.ProtoReflect.Descriptor instead.\nfunc (*CELFunction) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{42}\n}\n\nfunc (x *CELFunction) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunction) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunction) GetArgs() []*CELFunctionArgument {\n\tif x != nil {\n\t\treturn x.Args\n\t}\n\treturn nil\n}\n\nfunc (x *CELFunction) GetReturn() *CELType {\n\tif x != nil {\n\t\treturn x.Return\n\t}\n\treturn nil\n}\n\n// CELReceiverType represents methods tied to the message.\ntype CELReceiverType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the message name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// methods describe the definition of the method for the message.\n\tMethods []*CELFunction `protobuf:\"bytes,3,rep,name=methods,proto3\" json:\"methods,omitempty\"`\n}\n\nfunc (x *CELReceiverType) Reset() {\n\t*x = CELReceiverType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[43]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELReceiverType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELReceiverType) ProtoMessage() {}\n\nfunc (x *CELReceiverType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[43]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELReceiverType.ProtoReflect.Descriptor instead.\nfunc (*CELReceiverType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{43}\n}\n\nfunc (x *CELReceiverType) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELReceiverType) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELReceiverType) GetMethods() []*CELFunction {\n\tif x != nil {\n\t\treturn x.Methods\n\t}\n\treturn nil\n}\n\n// CELFunctionArgument represents the function argument.\ntype CELFunctionArgument struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the argument value name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// type is the argument type.\n\tType *CELType `protobuf:\"bytes,3,opt,name=type,proto3\" json:\"type,omitempty\"`\n}\n\nfunc (x *CELFunctionArgument) Reset() {\n\t*x = CELFunctionArgument{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[44]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELFunctionArgument) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELFunctionArgument) ProtoMessage() {}\n\nfunc (x *CELFunctionArgument) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[44]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELFunctionArgument.ProtoReflect.Descriptor instead.\nfunc (*CELFunctionArgument) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{44}\n}\n\nfunc (x *CELFunctionArgument) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunctionArgument) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunctionArgument) GetType() *CELType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\n// CELType represents type information for CEL plugin interface.\ntype CELType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to Type:\n\t//\n\t//\t*CELType_Kind\n\t//\t*CELType_Repeated\n\t//\t*CELType_Map\n\t//\t*CELType_Message\n\t//\t*CELType_Enum\n\tType isCELType_Type `protobuf_oneof:\"type\"`\n}\n\nfunc (x *CELType) Reset() {\n\t*x = CELType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[45]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELType) ProtoMessage() {}\n\nfunc (x *CELType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[45]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELType.ProtoReflect.Descriptor instead.\nfunc (*CELType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{45}\n}\n\nfunc (m *CELType) GetType() isCELType_Type {\n\tif m != nil {\n\t\treturn m.Type\n\t}\n\treturn nil\n}\n\nfunc (x *CELType) GetKind() TypeKind {\n\tif x, ok := x.GetType().(*CELType_Kind); ok {\n\t\treturn x.Kind\n\t}\n\treturn TypeKind_UNKNOWN\n}\n\nfunc (x *CELType) GetRepeated() *CELType {\n\tif x, ok := x.GetType().(*CELType_Repeated); ok {\n\t\treturn x.Repeated\n\t}\n\treturn nil\n}\n\nfunc (x *CELType) GetMap() *CELMapType {\n\tif x, ok := x.GetType().(*CELType_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\nfunc (x *CELType) GetMessage() string {\n\tif x, ok := x.GetType().(*CELType_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELType) GetEnum() string {\n\tif x, ok := x.GetType().(*CELType_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn \"\"\n}\n\ntype isCELType_Type interface {\n\tisCELType_Type()\n}\n\ntype CELType_Kind struct {\n\t// kind is used when the type is a primitive type.\n\tKind TypeKind `protobuf:\"varint,1,opt,name=kind,proto3,enum=grpc.federation.TypeKind,oneof\"`\n}\n\ntype CELType_Repeated struct {\n\t// repeated is used when the type is a repeated type.\n\tRepeated *CELType `protobuf:\"bytes,2,opt,name=repeated,proto3,oneof\"`\n}\n\ntype CELType_Map struct {\n\t// map is used when the type is a map type.\n\tMap *CELMapType `protobuf:\"bytes,3,opt,name=map,proto3,oneof\"`\n}\n\ntype CELType_Message struct {\n\t// message is a fqdn to the message type.\n\tMessage string `protobuf:\"bytes,4,opt,name=message,proto3,oneof\"`\n}\n\ntype CELType_Enum struct {\n\t// enum is a fqdn to the enum type.\n\tEnum string `protobuf:\"bytes,5,opt,name=enum,proto3,oneof\"`\n}\n\nfunc (*CELType_Kind) isCELType_Type() {}\n\nfunc (*CELType_Repeated) isCELType_Type() {}\n\nfunc (*CELType_Map) isCELType_Type() {}\n\nfunc (*CELType_Message) isCELType_Type() {}\n\nfunc (*CELType_Enum) isCELType_Type() {}\n\n// CELMapType represents map type.\ntype CELMapType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// key represents map's key type.\n\tKey *CELType `protobuf:\"bytes,1,opt,name=key,proto3\" json:\"key,omitempty\"`\n\t// value represents map's value type.\n\tValue *CELType `protobuf:\"bytes,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *CELMapType) Reset() {\n\t*x = CELMapType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[46]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELMapType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELMapType) ProtoMessage() {}\n\nfunc (x *CELMapType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[46]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELMapType.ProtoReflect.Descriptor instead.\nfunc (*CELMapType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{46}\n}\n\nfunc (x *CELMapType) GetKey() *CELType {\n\tif x != nil {\n\t\treturn x.Key\n\t}\n\treturn nil\n}\n\nfunc (x *CELMapType) GetValue() *CELType {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn nil\n}\n\n// CELVariable represents CEL variable.\ntype CELVariable struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the variable name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// type is the variable type.\n\tType *CELType `protobuf:\"bytes,3,opt,name=type,proto3\" json:\"type,omitempty\"`\n}\n\nfunc (x *CELVariable) Reset() {\n\t*x = CELVariable{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[47]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELVariable) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELVariable) ProtoMessage() {}\n\nfunc (x *CELVariable) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[47]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELVariable.ProtoReflect.Descriptor instead.\nfunc (*CELVariable) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{47}\n}\n\nfunc (x *CELVariable) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELVariable) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELVariable) GetType() *CELType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nvar file_grpc_federation_federation_proto_extTypes = []protoimpl.ExtensionInfo{\n\t{\n\t\tExtendedType:  (*descriptorpb.FileOptions)(nil),\n\t\tExtensionType: (*FileRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.file\",\n\t\tTag:           \"bytes,1187,opt,name=file\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*ServiceRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.service\",\n\t\tTag:           \"bytes,1187,opt,name=service\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*MethodRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.method\",\n\t\tTag:           \"bytes,1187,opt,name=method\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MessageOptions)(nil),\n\t\tExtensionType: (*MessageRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.message\",\n\t\tTag:           \"bytes,1187,opt,name=message\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*FieldRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.field\",\n\t\tTag:           \"bytes,1187,opt,name=field\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.EnumOptions)(nil),\n\t\tExtensionType: (*EnumRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.enum\",\n\t\tTag:           \"bytes,1187,opt,name=enum\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.EnumValueOptions)(nil),\n\t\tExtensionType: (*EnumValueRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.enum_value\",\n\t\tTag:           \"bytes,1187,opt,name=enum_value\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.OneofOptions)(nil),\n\t\tExtensionType: (*OneofRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.oneof\",\n\t\tTag:           \"bytes,1187,opt,name=oneof\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n}\n\n// Extension fields to descriptorpb.FileOptions.\nvar (\n\t// optional grpc.federation.FileRule file = 1187;\n\tE_File = &file_grpc_federation_federation_proto_extTypes[0]\n)\n\n// Extension fields to descriptorpb.ServiceOptions.\nvar (\n\t// optional grpc.federation.ServiceRule service = 1187;\n\tE_Service = &file_grpc_federation_federation_proto_extTypes[1]\n)\n\n// Extension fields to descriptorpb.MethodOptions.\nvar (\n\t// optional grpc.federation.MethodRule method = 1187;\n\tE_Method = &file_grpc_federation_federation_proto_extTypes[2]\n)\n\n// Extension fields to descriptorpb.MessageOptions.\nvar (\n\t// optional grpc.federation.MessageRule message = 1187;\n\tE_Message = &file_grpc_federation_federation_proto_extTypes[3]\n)\n\n// Extension fields to descriptorpb.FieldOptions.\nvar (\n\t// optional grpc.federation.FieldRule field = 1187;\n\tE_Field = &file_grpc_federation_federation_proto_extTypes[4]\n)\n\n// Extension fields to descriptorpb.EnumOptions.\nvar (\n\t// optional grpc.federation.EnumRule enum = 1187;\n\tE_Enum = &file_grpc_federation_federation_proto_extTypes[5]\n)\n\n// Extension fields to descriptorpb.EnumValueOptions.\nvar (\n\t// optional grpc.federation.EnumValueRule enum_value = 1187;\n\tE_EnumValue = &file_grpc_federation_federation_proto_extTypes[6]\n)\n\n// Extension fields to descriptorpb.OneofOptions.\nvar (\n\t// optional grpc.federation.OneofRule oneof = 1187;\n\tE_Oneof = &file_grpc_federation_federation_proto_extTypes[7]\n)\n\nvar File_grpc_federation_federation_proto protoreflect.FileDescriptor\n\nvar file_grpc_federation_federation_proto_rawDesc = []byte{\n\t0x0a, 0x20, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x12, 0x0f, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70,\n\t0x63, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x64,\n\t0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x67, 0x72,\n\t0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x70, 0x72,\n\t0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x67, 0x72, 0x70,\n\t0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x74, 0x69, 0x6d,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x56, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x52,\n\t0x75, 0x6c, 0x65, 0x12, 0x32, 0x0a, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52,\n\t0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6d, 0x70, 0x6f, 0x72,\n\t0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x22,\n\t0x20, 0x0a, 0x08, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61,\n\t0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61,\n\t0x73, 0x22, 0xb4, 0x01, 0x0a, 0x0d, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52,\n\t0x75, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x88,\n\t0x01, 0x01, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,\n\t0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x37, 0x0a, 0x04, 0x61, 0x74, 0x74, 0x72,\n\t0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c,\n\t0x75, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, 0x04, 0x61, 0x74, 0x74,\n\t0x72, 0x12, 0x1d, 0x0a, 0x07, 0x6e, 0x6f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x04, 0x20, 0x01,\n\t0x28, 0x08, 0x48, 0x01, 0x52, 0x07, 0x6e, 0x6f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x88, 0x01, 0x01,\n\t0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x42, 0x0a, 0x0a, 0x08,\n\t0x5f, 0x6e, 0x6f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x3e, 0x0a, 0x12, 0x45, 0x6e, 0x75, 0x6d,\n\t0x56, 0x61, 0x6c, 0x75, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x12, 0x12,\n\t0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x0b, 0x0a, 0x09, 0x4f, 0x6e, 0x65, 0x6f,\n\t0x66, 0x52, 0x75, 0x6c, 0x65, 0x22, 0x69, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n\t0x52, 0x75, 0x6c, 0x65, 0x12, 0x26, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x14, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x32, 0x0a, 0x03,\n\t0x76, 0x61, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x03, 0x76, 0x61, 0x72,\n\t0x22, 0x4a, 0x0a, 0x03, 0x45, 0x6e, 0x76, 0x12, 0x29, 0x0a, 0x03, 0x76, 0x61, 0x72, 0x18, 0x01,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x52, 0x03, 0x76,\n\t0x61, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x8b, 0x03, 0x0a,\n\t0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65,\n\t0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01,\n\t0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x66, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x02, 0x69, 0x66, 0x88, 0x01, 0x01, 0x12, 0x10,\n\t0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x62, 0x79,\n\t0x12, 0x2c, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x4d, 0x61, 0x70, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x70, 0x12, 0x38,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52,\n\t0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x50, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x69,\n\t0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x61,\n\t0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x0a,\n\t0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x04, 0x65, 0x6e,\n\t0x75, 0x6d, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x45,\n\t0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x35, 0x0a, 0x06, 0x73,\n\t0x77, 0x69, 0x74, 0x63, 0x68, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x77,\n\t0x69, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x06, 0x73, 0x77, 0x69, 0x74,\n\t0x63, 0x68, 0x42, 0x06, 0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e,\n\t0x61, 0x6d, 0x65, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x66, 0x22, 0x49, 0x0a, 0x1d, 0x53, 0x65,\n\t0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c,\n\t0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69,\n\t0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x66, 0x12, 0x18, 0x0a, 0x07, 0x6d,\n\t0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65,\n\t0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x06, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72,\n\t0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79,\n\t0x70, 0x65, 0x12, 0x3a, 0x0a, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x48, 0x00, 0x52, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x09,\n\t0x0a, 0x07, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xab, 0x01, 0x0a, 0x07, 0x45, 0x6e,\n\t0x76, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2f, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x00,\n\t0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x36, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74,\n\t0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79,\n\t0x70, 0x65, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2f,\n\t0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e,\n\t0x76, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x70, 0x42,\n\t0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x68, 0x0a, 0x0a, 0x45, 0x6e, 0x76, 0x4d, 0x61,\n\t0x70, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2a, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79, 0x70, 0x65, 0x52, 0x03, 0x6b, 0x65,\n\t0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,\n\t0x65, 0x22, 0xc3, 0x01, 0x0a, 0x0c, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x09, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61,\n\t0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c,\n\t0x74, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72,\n\t0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64,\n\t0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x07, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65,\n\t0x64, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61,\n\t0x74, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x42, 0x0b,\n\t0x0a, 0x09, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x5f,\n\t0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x22, 0x65, 0x0a, 0x0a, 0x4d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75,\n\t0x74, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e,\n\t0x73, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75,\n\t0x74, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9c,\n\t0x01, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x35,\n\t0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61,\n\t0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e,\n\t0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f,\n\t0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00,\n\t0x52, 0x0e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72,\n\t0x88, 0x01, 0x01, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x03, 0x20, 0x03,\n\t0x28, 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x75,\n\t0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x22, 0xde, 0x03,\n\t0x0a, 0x12, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69,\n\t0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x48, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x13, 0x0a,\n\t0x02, 0x69, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x02, 0x69, 0x66, 0x88,\n\t0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x18, 0x03,\n\t0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64,\n\t0x88, 0x01, 0x01, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48,\n\t0x00, 0x52, 0x02, 0x62, 0x79, 0x12, 0x2c, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x0c, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x61, 0x70, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x03,\n\t0x6d, 0x61, 0x70, 0x12, 0x38, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0d,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78,\n\t0x70, 0x72, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2f, 0x0a,\n\t0x04, 0x63, 0x61, 0x6c, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x61,\n\t0x6c, 0x6c, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x63, 0x61, 0x6c, 0x6c, 0x12, 0x41,\n\t0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45,\n\t0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x12, 0x2f, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e,\n\t0x75, 0x6d, 0x12, 0x35, 0x0a, 0x06, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x18, 0x11, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x48,\n\t0x00, 0x52, 0x06, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x42, 0x06, 0x0a, 0x04, 0x65, 0x78, 0x70,\n\t0x72, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69,\n\t0x66, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x22, 0xc5,\n\t0x01, 0x0a, 0x07, 0x4d, 0x61, 0x70, 0x45, 0x78, 0x70, 0x72, 0x12, 0x35, 0x0a, 0x08, 0x69, 0x74,\n\t0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49,\n\t0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f,\n\t0x72, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,\n\t0x02, 0x62, 0x79, 0x12, 0x38, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0c,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78,\n\t0x70, 0x72, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2f, 0x0a,\n\t0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e,\n\t0x75, 0x6d, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x42, 0x06,\n\t0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x22, 0x30, 0x0a, 0x08, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74,\n\t0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x72, 0x63, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x72, 0x63, 0x22, 0x50, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x45, 0x78, 0x70, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x04, 0x61,\n\t0x72, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x41, 0x72, 0x67, 0x75,\n\t0x6d, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x22, 0x2e, 0x0a, 0x08, 0x45, 0x6e,\n\t0x75, 0x6d, 0x45, 0x78, 0x70, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x62, 0x79,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x62, 0x79, 0x22, 0xf3, 0x02, 0x0a, 0x08, 0x43,\n\t0x61, 0x6c, 0x6c, 0x45, 0x78, 0x70, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12,\n\t0x38, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x07, 0x74, 0x69, 0x6d,\n\t0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x74, 0x69,\n\t0x6d, 0x65, 0x6f, 0x75, 0x74, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x05, 0x72, 0x65, 0x74, 0x72,\n\t0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50,\n\t0x6f, 0x6c, 0x69, 0x63, 0x79, 0x48, 0x01, 0x52, 0x05, 0x72, 0x65, 0x74, 0x72, 0x79, 0x88, 0x01,\n\t0x01, 0x12, 0x30, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72,\n\t0x72, 0x6f, 0x72, 0x12, 0x3c, 0x0a, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x43, 0x61, 0x6c, 0x6c, 0x4f, 0x70,\n\t0x74, 0x69, 0x6f, 0x6e, 0x48, 0x02, 0x52, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01,\n\t0x01, 0x12, 0x1f, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20,\n\t0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x88,\n\t0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x42, 0x08,\n\t0x0a, 0x06, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x79, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,\n\t0x22, 0x7f, 0x0a, 0x0a, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x12, 0x33,\n\t0x0a, 0x04, 0x63, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53,\n\t0x77, 0x69, 0x74, 0x63, 0x68, 0x43, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x72, 0x52, 0x04, 0x63,\n\t0x61, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x44, 0x65, 0x66,\n\t0x61, 0x75, 0x6c, 0x74, 0x45, 0x78, 0x70, 0x72, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c,\n\t0x74, 0x22, 0x71, 0x0a, 0x0e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x43, 0x61, 0x73, 0x65, 0x45,\n\t0x78, 0x70, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x02, 0x69, 0x66, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e,\n\t0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x79,\n\t0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x62, 0x79, 0x42, 0x06, 0x0a, 0x04,\n\t0x65, 0x78, 0x70, 0x72, 0x22, 0x64, 0x0a, 0x11, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x44, 0x65,\n\t0x66, 0x61, 0x75, 0x6c, 0x74, 0x45, 0x78, 0x70, 0x72, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66,\n\t0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c,\n\t0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66,\n\t0x12, 0x10, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02,\n\t0x62, 0x79, 0x42, 0x06, 0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x22, 0x86, 0x04, 0x0a, 0x09, 0x47,\n\t0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18,\n\t0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65,\n\t0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12,\n\t0x13, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x69,\n\t0x66, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x0e, 0x32, 0x10, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e,\n\t0x43, 0x6f, 0x64, 0x65, 0x48, 0x01, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12,\n\t0x1d, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,\n\t0x48, 0x02, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a,\n\t0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x20, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69,\n\t0x6c, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x69, 0x67,\n\t0x6e, 0x6f, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x06, 0x69, 0x67,\n\t0x6e, 0x6f, 0x72, 0x65, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x67, 0x6e, 0x6f, 0x72,\n\t0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x07,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x11, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x41, 0x6e,\n\t0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x88, 0x01, 0x01, 0x12, 0x45, 0x0a, 0x09,\n\t0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32,\n\t0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x4c, 0x6f, 0x67, 0x4c,\n\t0x65, 0x76, 0x65, 0x6c, 0x48, 0x05, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c,\n\t0x88, 0x01, 0x01, 0x22, 0x41, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12,\n\t0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05,\n\t0x44, 0x45, 0x42, 0x55, 0x47, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x4e, 0x46, 0x4f, 0x10,\n\t0x02, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x41, 0x52, 0x4e, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x45,\n\t0x52, 0x52, 0x4f, 0x52, 0x10, 0x04, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x66, 0x42, 0x07, 0x0a,\n\t0x05, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61,\n\t0x67, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x42, 0x16, 0x0a,\n\t0x14, 0x5f, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x72, 0x65, 0x73,\n\t0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65,\n\t0x76, 0x65, 0x6c, 0x22, 0xfa, 0x05, 0x0a, 0x0f, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f,\n\t0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x66, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x02,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44,\n\t0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x36,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78, 0x70, 0x72, 0x52, 0x07, 0x6d,\n\t0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f,\n\t0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66,\n\t0x6f, 0x52, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x34, 0x0a, 0x0a,\n\t0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65,\n\t0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x72, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e,\n\t0x66, 0x6f, 0x12, 0x34, 0x0a, 0x0a, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x69, 0x6e, 0x66, 0x6f,\n\t0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x64,\n\t0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3d, 0x0a, 0x0d, 0x71, 0x75, 0x6f, 0x74,\n\t0x61, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x6f,\n\t0x74, 0x61, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x0c, 0x71, 0x75, 0x6f, 0x74, 0x61,\n\t0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x52, 0x0a, 0x14, 0x70, 0x72, 0x65, 0x63, 0x6f,\n\t0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18,\n\t0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72,\n\t0x70, 0x63, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x46,\n\t0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x13, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69,\n\t0x74, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x62,\n\t0x61, 0x64, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61,\n\t0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x62, 0x61, 0x64, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f,\n\t0x69, 0x6e, 0x66, 0x6f, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49,\n\t0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f,\n\t0x12, 0x3d, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66,\n\t0x6f, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66,\n\t0x6f, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12,\n\t0x24, 0x0a, 0x04, 0x68, 0x65, 0x6c, 0x70, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x48, 0x65, 0x6c, 0x70, 0x52,\n\t0x04, 0x68, 0x65, 0x6c, 0x70, 0x12, 0x49, 0x0a, 0x11, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a,\n\t0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f,\n\t0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x10,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,\n\t0x12, 0x0e, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x02, 0x62, 0x79,\n\t0x22, 0xc7, 0x03, 0x0a, 0x0e, 0x47, 0x52, 0x50, 0x43, 0x43, 0x61, 0x6c, 0x6c, 0x4f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x73,\n\t0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0e,\n\t0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x88, 0x01,\n\t0x01, 0x12, 0x1b, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x48, 0x01, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x37,\n\t0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x72, 0x65, 0x63, 0x76, 0x5f,\n\t0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02,\n\t0x52, 0x12, 0x6d, 0x61, 0x78, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x63, 0x76, 0x4d, 0x73, 0x67,\n\t0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x63,\n\t0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a,\n\t0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x43, 0x61,\n\t0x6c, 0x6c, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01,\n\t0x12, 0x28, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x48, 0x04, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x69,\n\t0x63, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x74, 0x72,\n\t0x61, 0x69, 0x6c, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x07, 0x74,\n\t0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x0e, 0x77, 0x61, 0x69,\n\t0x74, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28,\n\t0x08, 0x48, 0x06, 0x52, 0x0c, 0x77, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x52, 0x65, 0x61, 0x64,\n\t0x79, 0x88, 0x01, 0x01, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,\n\t0x5f, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x68, 0x65, 0x61,\n\t0x64, 0x65, 0x72, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c,\n\t0x5f, 0x72, 0x65, 0x63, 0x76, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x19,\n\t0x0a, 0x17, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x65, 0x6e, 0x64,\n\t0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x74,\n\t0x61, 0x74, 0x69, 0x63, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x5f,\n\t0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x77, 0x61, 0x69, 0x74,\n\t0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x22, 0x64, 0x0a, 0x0e, 0x56, 0x61,\n\t0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72, 0x12, 0x17, 0x0a, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72,\n\t0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65,\n\t0x22, 0xb8, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,\n\t0x12, 0x42, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,\n\t0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x73,\n\t0x74, 0x61, 0x6e, 0x74, 0x12, 0x4b, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74,\n\t0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x72,\n\t0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x69,\n\t0x61, 0x6c, 0x48, 0x00, 0x52, 0x0b, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x69, 0x61,\n\t0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,\n\t0x66, 0x42, 0x08, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x79, 0x0a, 0x13, 0x52,\n\t0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61,\n\t0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c,\n\t0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69,\n\t0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, 0x01, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x52,\n\t0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x69, 0x6e,\n\t0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x72,\n\t0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0xd1, 0x02, 0x0a, 0x16, 0x52, 0x65, 0x74, 0x72, 0x79,\n\t0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x69, 0x61,\n\t0x6c, 0x12, 0x2e, 0x0a, 0x10, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x74,\n\t0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0f, 0x69,\n\t0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x88, 0x01,\n\t0x01, 0x12, 0x36, 0x0a, 0x14, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x48,\n\t0x01, 0x52, 0x13, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0a, 0x6d, 0x75, 0x6c,\n\t0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x48, 0x02, 0x52,\n\t0x0a, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x26,\n\t0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x04,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x49, 0x6e, 0x74, 0x65, 0x72,\n\t0x76, 0x61, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65,\n\t0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x48, 0x04, 0x52, 0x0a, 0x6d,\n\t0x61, 0x78, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x42, 0x13, 0x0a, 0x11,\n\t0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61,\n\t0x6c, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x6d,\n\t0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6d, 0x61,\n\t0x78, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d,\n\t0x61, 0x78, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x5d, 0x0a, 0x0d, 0x4d, 0x65,\n\t0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x66,\n\t0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c,\n\t0x64, 0x12, 0x13, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,\n\t0x02, 0x62, 0x79, 0x88, 0x01, 0x01, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x48, 0x01, 0x52, 0x02, 0x69, 0x66, 0x88, 0x01, 0x01, 0x42, 0x05, 0x0a, 0x03, 0x5f,\n\t0x62, 0x79, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x66, 0x22, 0x85, 0x01, 0x0a, 0x0e, 0x4d, 0x65,\n\t0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x17, 0x0a, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x88, 0x01, 0x01,\n\t0x12, 0x1f, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x08, 0x48, 0x02, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x88, 0x01,\n\t0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x66,\n\t0x69, 0x65, 0x6c, 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e,\n\t0x64, 0x22, 0x62, 0x0a, 0x08, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x12, 0x13, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,\n\t0x02, 0x62, 0x79, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x06, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65,\n\t0x88, 0x01, 0x01, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x62, 0x79, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x69,\n\t0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0xf2, 0x01, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52,\n\t0x75, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65,\n\t0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0e,\n\t0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x88, 0x01,\n\t0x01, 0x12, 0x13, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52,\n\t0x02, 0x62, 0x79, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x88, 0x01,\n\t0x01, 0x12, 0x31, 0x0a, 0x05, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x52, 0x05, 0x6f,\n\t0x6e, 0x65, 0x6f, 0x66, 0x12, 0x2f, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x05, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x52, 0x03, 0x65, 0x6e, 0x76, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d,\n\t0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x62, 0x79,\n\t0x42, 0x08, 0x0a, 0x06, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x89, 0x01, 0x0a, 0x0a, 0x46,\n\t0x69, 0x65, 0x6c, 0x64, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x12, 0x10, 0x0a, 0x02, 0x69, 0x66, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x69, 0x66, 0x12, 0x1a, 0x0a, 0x07, 0x64,\n\t0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x07,\n\t0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x03,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44,\n\t0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x0e,\n\t0x0a, 0x02, 0x62, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x62, 0x79, 0x42, 0x06,\n\t0x0a, 0x04, 0x63, 0x6f, 0x6e, 0x64, 0x22, 0x45, 0x0a, 0x09, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75,\n\t0x67, 0x69, 0x6e, 0x12, 0x38, 0x0a, 0x06, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20,\n\t0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x45,\n\t0x78, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x06, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x22, 0xaf, 0x02,\n\t0x0a, 0x0f, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x45, 0x78, 0x70, 0x6f, 0x72,\n\t0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x36, 0x0a, 0x05, 0x74, 0x79, 0x70,\n\t0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x52, 0x65,\n\t0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x74, 0x79, 0x70, 0x65,\n\t0x73, 0x12, 0x3a, 0x0a, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69,\n\t0x6f, 0x6e, 0x52, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3a, 0x0a,\n\t0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x09,\n\t0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x44, 0x0a, 0x0a, 0x63, 0x61, 0x70,\n\t0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c,\n\t0x69, 0x74, 0x79, 0x52, 0x0a, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22,\n\t0x9b, 0x02, 0x0a, 0x13, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x70,\n\t0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x3e, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e,\n\t0x45, 0x6e, 0x76, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x48, 0x00, 0x52,\n\t0x03, 0x65, 0x6e, 0x76, 0x88, 0x01, 0x01, 0x12, 0x54, 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x65, 0x5f,\n\t0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43,\n\t0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x73, 0x74,\n\t0x65, 0x6d, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x48, 0x01, 0x52, 0x0a,\n\t0x66, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x4a, 0x0a,\n\t0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b,\n\t0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72,\n\t0x6b, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x48, 0x02, 0x52, 0x07, 0x6e,\n\t0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x88, 0x01, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x65, 0x6e,\n\t0x76, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65,\n\t0x6d, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x40, 0x0a,\n\t0x16, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x45, 0x6e, 0x76, 0x43, 0x61, 0x70,\n\t0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d,\n\t0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22,\n\t0x3e, 0x0a, 0x1d, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65,\n\t0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79,\n\t0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 0x74, 0x68, 0x22,\n\t0x1c, 0x0a, 0x1a, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x4e, 0x65, 0x74, 0x77,\n\t0x6f, 0x72, 0x6b, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22, 0xa1, 0x01,\n\t0x0a, 0x0b, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x38, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x03, 0x20,\n\t0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,\n\t0x6e, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12,\n\t0x30, 0x0a, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72,\n\t0x6e, 0x22, 0x71, 0x0a, 0x0f, 0x43, 0x45, 0x4c, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72,\n\t0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x36, 0x0a, 0x07,\n\t0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x6d, 0x65, 0x74,\n\t0x68, 0x6f, 0x64, 0x73, 0x22, 0x6b, 0x0a, 0x13, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74,\n\t0x69, 0x6f, 0x6e, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,\n\t0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64,\n\t0x65, 0x73, 0x63, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70,\n\t0x65, 0x22, 0xdd, 0x01, 0x0a, 0x07, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2f, 0x0a,\n\t0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x79,\n\t0x70, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x36,\n\t0x0a, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65,\n\t0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2f, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65,\n\t0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x70, 0x12, 0x1a, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61,\n\t0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28,\n\t0x09, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70,\n\t0x65, 0x22, 0x68, 0x0a, 0x0a, 0x43, 0x45, 0x4c, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65, 0x12,\n\t0x2a, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43,\n\t0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76,\n\t0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70,\n\t0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c,\n\t0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x63, 0x0a, 0x0b, 0x43,\n\t0x45, 0x4c, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12,\n\t0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65,\n\t0x73, 0x63, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65,\n\t0x2a, 0x5e, 0x0a, 0x08, 0x54, 0x79, 0x70, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x0b, 0x0a, 0x07,\n\t0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52,\n\t0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x4f, 0x4f, 0x4c, 0x10, 0x02, 0x12,\n\t0x09, 0x0a, 0x05, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x49,\n\t0x4e, 0x54, 0x36, 0x34, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45,\n\t0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x06,\n\t0x3a, 0x4c, 0x0a, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x46, 0x69, 0x6c, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x3a, 0x58,\n\t0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52,\n\t0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x3a, 0x54, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a, 0x58,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52,\n\t0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x50, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c,\n\t0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52,\n\t0x75, 0x6c, 0x65, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x3a, 0x4c, 0x0a, 0x04, 0x65, 0x6e,\n\t0x75, 0x6d, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x75,\n\t0x6c, 0x65, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x3a, 0x61, 0x0a, 0x0a, 0x65, 0x6e, 0x75, 0x6d,\n\t0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c,\n\t0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x1e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x75, 0x6c, 0x65,\n\t0x52, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x50, 0x0a, 0x05, 0x6f,\n\t0x6e, 0x65, 0x6f, 0x66, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70,\n\t0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x6e, 0x65,\n\t0x6f, 0x66, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x42, 0xc2, 0x01,\n\t0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0f, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,\n\t0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x65, 0x72, 0x63, 0x61, 0x72, 0x69, 0x2f, 0x67, 0x72, 0x70,\n\t0x63, 0x2d, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x67, 0x72, 0x70,\n\t0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xa2, 0x02, 0x03, 0x47, 0x46, 0x58, 0xaa, 0x02, 0x0f,\n\t0x47, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xca,\n\t0x02, 0x0f, 0x47, 0x72, 0x70, 0x63, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0xe2, 0x02, 0x1b, 0x47, 0x72, 0x70, 0x63, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea,\n\t0x02, 0x10, 0x47, 0x72, 0x70, 0x63, 0x3a, 0x3a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_grpc_federation_federation_proto_rawDescOnce sync.Once\n\tfile_grpc_federation_federation_proto_rawDescData = file_grpc_federation_federation_proto_rawDesc\n)\n\nfunc file_grpc_federation_federation_proto_rawDescGZIP() []byte {\n\tfile_grpc_federation_federation_proto_rawDescOnce.Do(func() {\n\t\tfile_grpc_federation_federation_proto_rawDescData = protoimpl.X.CompressGZIP(file_grpc_federation_federation_proto_rawDescData)\n\t})\n\treturn file_grpc_federation_federation_proto_rawDescData\n}\n\nvar file_grpc_federation_federation_proto_enumTypes = make([]protoimpl.EnumInfo, 2)\nvar file_grpc_federation_federation_proto_msgTypes = make([]protoimpl.MessageInfo, 48)\nvar file_grpc_federation_federation_proto_goTypes = []interface{}{\n\t(TypeKind)(0),                          // 0: grpc.federation.TypeKind\n\t(GRPCError_LogLevel)(0),                // 1: grpc.federation.GRPCError.LogLevel\n\t(*FileRule)(nil),                       // 2: grpc.federation.FileRule\n\t(*EnumRule)(nil),                       // 3: grpc.federation.EnumRule\n\t(*EnumValueRule)(nil),                  // 4: grpc.federation.EnumValueRule\n\t(*EnumValueAttribute)(nil),             // 5: grpc.federation.EnumValueAttribute\n\t(*OneofRule)(nil),                      // 6: grpc.federation.OneofRule\n\t(*ServiceRule)(nil),                    // 7: grpc.federation.ServiceRule\n\t(*Env)(nil),                            // 8: grpc.federation.Env\n\t(*ServiceVariable)(nil),                // 9: grpc.federation.ServiceVariable\n\t(*ServiceVariableValidationExpr)(nil),  // 10: grpc.federation.ServiceVariableValidationExpr\n\t(*EnvVar)(nil),                         // 11: grpc.federation.EnvVar\n\t(*EnvType)(nil),                        // 12: grpc.federation.EnvType\n\t(*EnvMapType)(nil),                     // 13: grpc.federation.EnvMapType\n\t(*EnvVarOption)(nil),                   // 14: grpc.federation.EnvVarOption\n\t(*MethodRule)(nil),                     // 15: grpc.federation.MethodRule\n\t(*MessageRule)(nil),                    // 16: grpc.federation.MessageRule\n\t(*VariableDefinition)(nil),             // 17: grpc.federation.VariableDefinition\n\t(*MapExpr)(nil),                        // 18: grpc.federation.MapExpr\n\t(*Iterator)(nil),                       // 19: grpc.federation.Iterator\n\t(*MessageExpr)(nil),                    // 20: grpc.federation.MessageExpr\n\t(*EnumExpr)(nil),                       // 21: grpc.federation.EnumExpr\n\t(*CallExpr)(nil),                       // 22: grpc.federation.CallExpr\n\t(*SwitchExpr)(nil),                     // 23: grpc.federation.SwitchExpr\n\t(*SwitchCaseExpr)(nil),                 // 24: grpc.federation.SwitchCaseExpr\n\t(*SwitchDefaultExpr)(nil),              // 25: grpc.federation.SwitchDefaultExpr\n\t(*GRPCError)(nil),                      // 26: grpc.federation.GRPCError\n\t(*GRPCErrorDetail)(nil),                // 27: grpc.federation.GRPCErrorDetail\n\t(*GRPCCallOption)(nil),                 // 28: grpc.federation.GRPCCallOption\n\t(*ValidationExpr)(nil),                 // 29: grpc.federation.ValidationExpr\n\t(*RetryPolicy)(nil),                    // 30: grpc.federation.RetryPolicy\n\t(*RetryPolicyConstant)(nil),            // 31: grpc.federation.RetryPolicyConstant\n\t(*RetryPolicyExponential)(nil),         // 32: grpc.federation.RetryPolicyExponential\n\t(*MethodRequest)(nil),                  // 33: grpc.federation.MethodRequest\n\t(*MethodResponse)(nil),                 // 34: grpc.federation.MethodResponse\n\t(*Argument)(nil),                       // 35: grpc.federation.Argument\n\t(*FieldRule)(nil),                      // 36: grpc.federation.FieldRule\n\t(*FieldOneof)(nil),                     // 37: grpc.federation.FieldOneof\n\t(*CELPlugin)(nil),                      // 38: grpc.federation.CELPlugin\n\t(*CELPluginExport)(nil),                // 39: grpc.federation.CELPluginExport\n\t(*CELPluginCapability)(nil),            // 40: grpc.federation.CELPluginCapability\n\t(*CELPluginEnvCapability)(nil),         // 41: grpc.federation.CELPluginEnvCapability\n\t(*CELPluginFileSystemCapability)(nil),  // 42: grpc.federation.CELPluginFileSystemCapability\n\t(*CELPluginNetworkCapability)(nil),     // 43: grpc.federation.CELPluginNetworkCapability\n\t(*CELFunction)(nil),                    // 44: grpc.federation.CELFunction\n\t(*CELReceiverType)(nil),                // 45: grpc.federation.CELReceiverType\n\t(*CELFunctionArgument)(nil),            // 46: grpc.federation.CELFunctionArgument\n\t(*CELType)(nil),                        // 47: grpc.federation.CELType\n\t(*CELMapType)(nil),                     // 48: grpc.federation.CELMapType\n\t(*CELVariable)(nil),                    // 49: grpc.federation.CELVariable\n\t(code.Code)(0),                         // 50: google.rpc.Code\n\t(*errdetails.ErrorInfo)(nil),           // 51: google.rpc.ErrorInfo\n\t(*errdetails.RetryInfo)(nil),           // 52: google.rpc.RetryInfo\n\t(*errdetails.DebugInfo)(nil),           // 53: google.rpc.DebugInfo\n\t(*errdetails.QuotaFailure)(nil),        // 54: google.rpc.QuotaFailure\n\t(*errdetails.PreconditionFailure)(nil), // 55: google.rpc.PreconditionFailure\n\t(*errdetails.BadRequest)(nil),          // 56: google.rpc.BadRequest\n\t(*errdetails.RequestInfo)(nil),         // 57: google.rpc.RequestInfo\n\t(*errdetails.ResourceInfo)(nil),        // 58: google.rpc.ResourceInfo\n\t(*errdetails.Help)(nil),                // 59: google.rpc.Help\n\t(*errdetails.LocalizedMessage)(nil),    // 60: google.rpc.LocalizedMessage\n\t(*descriptorpb.FileOptions)(nil),       // 61: google.protobuf.FileOptions\n\t(*descriptorpb.ServiceOptions)(nil),    // 62: google.protobuf.ServiceOptions\n\t(*descriptorpb.MethodOptions)(nil),     // 63: google.protobuf.MethodOptions\n\t(*descriptorpb.MessageOptions)(nil),    // 64: google.protobuf.MessageOptions\n\t(*descriptorpb.FieldOptions)(nil),      // 65: google.protobuf.FieldOptions\n\t(*descriptorpb.EnumOptions)(nil),       // 66: google.protobuf.EnumOptions\n\t(*descriptorpb.EnumValueOptions)(nil),  // 67: google.protobuf.EnumValueOptions\n\t(*descriptorpb.OneofOptions)(nil),      // 68: google.protobuf.OneofOptions\n}\nvar file_grpc_federation_federation_proto_depIdxs = []int32{\n\t38, // 0: grpc.federation.FileRule.plugin:type_name -> grpc.federation.CELPlugin\n\t5,  // 1: grpc.federation.EnumValueRule.attr:type_name -> grpc.federation.EnumValueAttribute\n\t8,  // 2: grpc.federation.ServiceRule.env:type_name -> grpc.federation.Env\n\t9,  // 3: grpc.federation.ServiceRule.var:type_name -> grpc.federation.ServiceVariable\n\t11, // 4: grpc.federation.Env.var:type_name -> grpc.federation.EnvVar\n\t18, // 5: grpc.federation.ServiceVariable.map:type_name -> grpc.federation.MapExpr\n\t20, // 6: grpc.federation.ServiceVariable.message:type_name -> grpc.federation.MessageExpr\n\t10, // 7: grpc.federation.ServiceVariable.validation:type_name -> grpc.federation.ServiceVariableValidationExpr\n\t21, // 8: grpc.federation.ServiceVariable.enum:type_name -> grpc.federation.EnumExpr\n\t23, // 9: grpc.federation.ServiceVariable.switch:type_name -> grpc.federation.SwitchExpr\n\t12, // 10: grpc.federation.EnvVar.type:type_name -> grpc.federation.EnvType\n\t14, // 11: grpc.federation.EnvVar.option:type_name -> grpc.federation.EnvVarOption\n\t0,  // 12: grpc.federation.EnvType.kind:type_name -> grpc.federation.TypeKind\n\t12, // 13: grpc.federation.EnvType.repeated:type_name -> grpc.federation.EnvType\n\t13, // 14: grpc.federation.EnvType.map:type_name -> grpc.federation.EnvMapType\n\t12, // 15: grpc.federation.EnvMapType.key:type_name -> grpc.federation.EnvType\n\t12, // 16: grpc.federation.EnvMapType.value:type_name -> grpc.federation.EnvType\n\t17, // 17: grpc.federation.MessageRule.def:type_name -> grpc.federation.VariableDefinition\n\t18, // 18: grpc.federation.VariableDefinition.map:type_name -> grpc.federation.MapExpr\n\t20, // 19: grpc.federation.VariableDefinition.message:type_name -> grpc.federation.MessageExpr\n\t22, // 20: grpc.federation.VariableDefinition.call:type_name -> grpc.federation.CallExpr\n\t29, // 21: grpc.federation.VariableDefinition.validation:type_name -> grpc.federation.ValidationExpr\n\t21, // 22: grpc.federation.VariableDefinition.enum:type_name -> grpc.federation.EnumExpr\n\t23, // 23: grpc.federation.VariableDefinition.switch:type_name -> grpc.federation.SwitchExpr\n\t19, // 24: grpc.federation.MapExpr.iterator:type_name -> grpc.federation.Iterator\n\t20, // 25: grpc.federation.MapExpr.message:type_name -> grpc.federation.MessageExpr\n\t21, // 26: grpc.federation.MapExpr.enum:type_name -> grpc.federation.EnumExpr\n\t35, // 27: grpc.federation.MessageExpr.args:type_name -> grpc.federation.Argument\n\t33, // 28: grpc.federation.CallExpr.request:type_name -> grpc.federation.MethodRequest\n\t30, // 29: grpc.federation.CallExpr.retry:type_name -> grpc.federation.RetryPolicy\n\t26, // 30: grpc.federation.CallExpr.error:type_name -> grpc.federation.GRPCError\n\t28, // 31: grpc.federation.CallExpr.option:type_name -> grpc.federation.GRPCCallOption\n\t24, // 32: grpc.federation.SwitchExpr.case:type_name -> grpc.federation.SwitchCaseExpr\n\t25, // 33: grpc.federation.SwitchExpr.default:type_name -> grpc.federation.SwitchDefaultExpr\n\t17, // 34: grpc.federation.SwitchCaseExpr.def:type_name -> grpc.federation.VariableDefinition\n\t17, // 35: grpc.federation.SwitchDefaultExpr.def:type_name -> grpc.federation.VariableDefinition\n\t17, // 36: grpc.federation.GRPCError.def:type_name -> grpc.federation.VariableDefinition\n\t50, // 37: grpc.federation.GRPCError.code:type_name -> google.rpc.Code\n\t27, // 38: grpc.federation.GRPCError.details:type_name -> grpc.federation.GRPCErrorDetail\n\t1,  // 39: grpc.federation.GRPCError.log_level:type_name -> grpc.federation.GRPCError.LogLevel\n\t17, // 40: grpc.federation.GRPCErrorDetail.def:type_name -> grpc.federation.VariableDefinition\n\t20, // 41: grpc.federation.GRPCErrorDetail.message:type_name -> grpc.federation.MessageExpr\n\t51, // 42: grpc.federation.GRPCErrorDetail.error_info:type_name -> google.rpc.ErrorInfo\n\t52, // 43: grpc.federation.GRPCErrorDetail.retry_info:type_name -> google.rpc.RetryInfo\n\t53, // 44: grpc.federation.GRPCErrorDetail.debug_info:type_name -> google.rpc.DebugInfo\n\t54, // 45: grpc.federation.GRPCErrorDetail.quota_failure:type_name -> google.rpc.QuotaFailure\n\t55, // 46: grpc.federation.GRPCErrorDetail.precondition_failure:type_name -> google.rpc.PreconditionFailure\n\t56, // 47: grpc.federation.GRPCErrorDetail.bad_request:type_name -> google.rpc.BadRequest\n\t57, // 48: grpc.federation.GRPCErrorDetail.request_info:type_name -> google.rpc.RequestInfo\n\t58, // 49: grpc.federation.GRPCErrorDetail.resource_info:type_name -> google.rpc.ResourceInfo\n\t59, // 50: grpc.federation.GRPCErrorDetail.help:type_name -> google.rpc.Help\n\t60, // 51: grpc.federation.GRPCErrorDetail.localized_message:type_name -> google.rpc.LocalizedMessage\n\t26, // 52: grpc.federation.ValidationExpr.error:type_name -> grpc.federation.GRPCError\n\t31, // 53: grpc.federation.RetryPolicy.constant:type_name -> grpc.federation.RetryPolicyConstant\n\t32, // 54: grpc.federation.RetryPolicy.exponential:type_name -> grpc.federation.RetryPolicyExponential\n\t37, // 55: grpc.federation.FieldRule.oneof:type_name -> grpc.federation.FieldOneof\n\t14, // 56: grpc.federation.FieldRule.env:type_name -> grpc.federation.EnvVarOption\n\t17, // 57: grpc.federation.FieldOneof.def:type_name -> grpc.federation.VariableDefinition\n\t39, // 58: grpc.federation.CELPlugin.export:type_name -> grpc.federation.CELPluginExport\n\t45, // 59: grpc.federation.CELPluginExport.types:type_name -> grpc.federation.CELReceiverType\n\t44, // 60: grpc.federation.CELPluginExport.functions:type_name -> grpc.federation.CELFunction\n\t49, // 61: grpc.federation.CELPluginExport.variables:type_name -> grpc.federation.CELVariable\n\t40, // 62: grpc.federation.CELPluginExport.capability:type_name -> grpc.federation.CELPluginCapability\n\t41, // 63: grpc.federation.CELPluginCapability.env:type_name -> grpc.federation.CELPluginEnvCapability\n\t42, // 64: grpc.federation.CELPluginCapability.file_system:type_name -> grpc.federation.CELPluginFileSystemCapability\n\t43, // 65: grpc.federation.CELPluginCapability.network:type_name -> grpc.federation.CELPluginNetworkCapability\n\t46, // 66: grpc.federation.CELFunction.args:type_name -> grpc.federation.CELFunctionArgument\n\t47, // 67: grpc.federation.CELFunction.return:type_name -> grpc.federation.CELType\n\t44, // 68: grpc.federation.CELReceiverType.methods:type_name -> grpc.federation.CELFunction\n\t47, // 69: grpc.federation.CELFunctionArgument.type:type_name -> grpc.federation.CELType\n\t0,  // 70: grpc.federation.CELType.kind:type_name -> grpc.federation.TypeKind\n\t47, // 71: grpc.federation.CELType.repeated:type_name -> grpc.federation.CELType\n\t48, // 72: grpc.federation.CELType.map:type_name -> grpc.federation.CELMapType\n\t47, // 73: grpc.federation.CELMapType.key:type_name -> grpc.federation.CELType\n\t47, // 74: grpc.federation.CELMapType.value:type_name -> grpc.federation.CELType\n\t47, // 75: grpc.federation.CELVariable.type:type_name -> grpc.federation.CELType\n\t61, // 76: grpc.federation.file:extendee -> google.protobuf.FileOptions\n\t62, // 77: grpc.federation.service:extendee -> google.protobuf.ServiceOptions\n\t63, // 78: grpc.federation.method:extendee -> google.protobuf.MethodOptions\n\t64, // 79: grpc.federation.message:extendee -> google.protobuf.MessageOptions\n\t65, // 80: grpc.federation.field:extendee -> google.protobuf.FieldOptions\n\t66, // 81: grpc.federation.enum:extendee -> google.protobuf.EnumOptions\n\t67, // 82: grpc.federation.enum_value:extendee -> google.protobuf.EnumValueOptions\n\t68, // 83: grpc.federation.oneof:extendee -> google.protobuf.OneofOptions\n\t2,  // 84: grpc.federation.file:type_name -> grpc.federation.FileRule\n\t7,  // 85: grpc.federation.service:type_name -> grpc.federation.ServiceRule\n\t15, // 86: grpc.federation.method:type_name -> grpc.federation.MethodRule\n\t16, // 87: grpc.federation.message:type_name -> grpc.federation.MessageRule\n\t36, // 88: grpc.federation.field:type_name -> grpc.federation.FieldRule\n\t3,  // 89: grpc.federation.enum:type_name -> grpc.federation.EnumRule\n\t4,  // 90: grpc.federation.enum_value:type_name -> grpc.federation.EnumValueRule\n\t6,  // 91: grpc.federation.oneof:type_name -> grpc.federation.OneofRule\n\t92, // [92:92] is the sub-list for method output_type\n\t92, // [92:92] is the sub-list for method input_type\n\t84, // [84:92] is the sub-list for extension type_name\n\t76, // [76:84] is the sub-list for extension extendee\n\t0,  // [0:76] is the sub-list for field type_name\n}\n\nfunc init() { file_grpc_federation_federation_proto_init() }\nfunc file_grpc_federation_federation_proto_init() {\n\tif File_grpc_federation_federation_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_grpc_federation_federation_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*FileRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumValueRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumValueAttribute); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*OneofRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Env); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceVariable); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceVariableValidationExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvVar); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvMapType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvVarOption); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MethodRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MessageRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*VariableDefinition); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MapExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Iterator); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MessageExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CallExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SwitchExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SwitchCaseExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SwitchDefaultExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GRPCError); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GRPCErrorDetail); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GRPCCallOption); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ValidationExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RetryPolicy); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RetryPolicyConstant); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RetryPolicyExponential); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MethodRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MethodResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Argument); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*FieldRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*FieldOneof); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPlugin); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginExport); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginEnvCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginFileSystemCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginNetworkCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELFunction); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELReceiverType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELFunctionArgument); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELMapType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELVariable); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[2].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[7].OneofWrappers = []interface{}{\n\t\t(*ServiceVariable_By)(nil),\n\t\t(*ServiceVariable_Map)(nil),\n\t\t(*ServiceVariable_Message)(nil),\n\t\t(*ServiceVariable_Validation)(nil),\n\t\t(*ServiceVariable_Enum)(nil),\n\t\t(*ServiceVariable_Switch)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[9].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[10].OneofWrappers = []interface{}{\n\t\t(*EnvType_Kind)(nil),\n\t\t(*EnvType_Repeated)(nil),\n\t\t(*EnvType_Map)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[12].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[13].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[14].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[15].OneofWrappers = []interface{}{\n\t\t(*VariableDefinition_By)(nil),\n\t\t(*VariableDefinition_Map)(nil),\n\t\t(*VariableDefinition_Message)(nil),\n\t\t(*VariableDefinition_Call)(nil),\n\t\t(*VariableDefinition_Validation)(nil),\n\t\t(*VariableDefinition_Enum)(nil),\n\t\t(*VariableDefinition_Switch)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[16].OneofWrappers = []interface{}{\n\t\t(*MapExpr_By)(nil),\n\t\t(*MapExpr_Message)(nil),\n\t\t(*MapExpr_Enum)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[20].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[22].OneofWrappers = []interface{}{\n\t\t(*SwitchCaseExpr_By)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[23].OneofWrappers = []interface{}{\n\t\t(*SwitchDefaultExpr_By)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[24].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[26].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[27].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[28].OneofWrappers = []interface{}{\n\t\t(*RetryPolicy_Constant)(nil),\n\t\t(*RetryPolicy_Exponential)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[29].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[30].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[31].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[32].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[33].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[34].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[35].OneofWrappers = []interface{}{\n\t\t(*FieldOneof_If)(nil),\n\t\t(*FieldOneof_Default)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[38].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[45].OneofWrappers = []interface{}{\n\t\t(*CELType_Kind)(nil),\n\t\t(*CELType_Repeated)(nil),\n\t\t(*CELType_Map)(nil),\n\t\t(*CELType_Message)(nil),\n\t\t(*CELType_Enum)(nil),\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_grpc_federation_federation_proto_rawDesc,\n\t\t\tNumEnums:      2,\n\t\t\tNumMessages:   48,\n\t\t\tNumExtensions: 8,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_grpc_federation_federation_proto_goTypes,\n\t\tDependencyIndexes: file_grpc_federation_federation_proto_depIdxs,\n\t\tEnumInfos:         file_grpc_federation_federation_proto_enumTypes,\n\t\tMessageInfos:      file_grpc_federation_federation_proto_msgTypes,\n\t\tExtensionInfos:    file_grpc_federation_federation_proto_extTypes,\n\t}.Build()\n\tFile_grpc_federation_federation_proto = out.File\n\tfile_grpc_federation_federation_proto_rawDesc = nil\n\tfile_grpc_federation_federation_proto_goTypes = nil\n\tfile_grpc_federation_federation_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/05_async/main_test.go",
    "content": "package main_test\n\nimport (\n\t\"context\"\n\t\"log/slog\"\n\t\"net\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\"\n\t\"go.opentelemetry.io/otel/propagation\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\tsdktrace \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.4.0\"\n\t\"go.uber.org/goleak\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/test/bufconn\"\n\n\t\"example/federation\"\n)\n\nconst bufSize = 1024\n\nvar (\n\tlistener *bufconn.Listener\n)\n\nfunc dialer(ctx context.Context, address string) (net.Conn, error) {\n\treturn listener.Dial()\n}\n\nfunc TestFederation(t *testing.T) {\n\tdefer goleak.VerifyNone(t)\n\tctx := context.Background()\n\tlistener = bufconn.Listen(bufSize)\n\n\tif os.Getenv(\"ENABLE_JAEGER\") != \"\" {\n\t\texporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithInsecure())\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttp := sdktrace.NewTracerProvider(\n\t\t\tsdktrace.WithBatcher(exporter),\n\t\t\tsdktrace.WithResource(\n\t\t\t\tresource.NewWithAttributes(\n\t\t\t\t\tsemconv.SchemaURL,\n\t\t\t\t\tsemconv.ServiceNameKey.String(\"example05/async\"),\n\t\t\t\t\tsemconv.ServiceVersionKey.String(\"1.0.0\"),\n\t\t\t\t\tattribute.String(\"environment\", \"dev\"),\n\t\t\t\t),\n\t\t\t),\n\t\t\tsdktrace.WithSampler(sdktrace.AlwaysSample()),\n\t\t)\n\t\tdefer tp.Shutdown(ctx)\n\t\totel.SetTextMapPropagator(propagation.TraceContext{})\n\t\totel.SetTracerProvider(tp)\n\t}\n\n\tconn, err := grpc.DialContext(ctx, \"\", grpc.WithContextDialer(dialer), grpc.WithInsecure())\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer conn.Close()\n\n\tgrpcServer := grpc.NewServer()\n\tdefer grpcServer.Stop()\n\n\tlogger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{\n\t\tLevel: slog.LevelDebug,\n\t}))\n\tfederationServer, err := federation.NewFederationService(federation.FederationServiceConfig{\n\t\tLogger: logger,\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer federation.CleanupFederationService(ctx, federationServer)\n\n\tfederation.RegisterFederationServiceServer(grpcServer, federationServer)\n\n\tgo func() {\n\t\tif err := grpcServer.Serve(listener); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t}()\n\n\tclient := federation.NewFederationServiceClient(conn)\n\tres, err := client.Get(ctx, &federation.GetRequest{})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif diff := cmp.Diff(res, &federation.GetResponse{\n\t\tHname: \"h\",\n\t\tJname: \"j\",\n\t}, cmpopts.IgnoreUnexported(federation.GetResponse{})); diff != \"\" {\n\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t}\n}\n"
  },
  {
    "path": "_examples/05_async/proto/buf.yaml",
    "content": "version: v1\nbreaking:\n  use:\n    - FILE\nlint:\n  use:\n    - DEFAULT\n"
  },
  {
    "path": "_examples/05_async/proto/federation/federation.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc Get(GetRequest) returns (GetResponse) {};\n}\n\nmessage GetRequest {}\n\nmessage GetResponse {\n  option (grpc.federation.message) = {\n    def [\n      { name: \"a\", message { name: \"A\" } },\n      { name: \"b\", message { name: \"B\" } },\n      { name: \"c\", message { name: \"C\", args { name: \"a\", by: \"a.name\" } } },\n      { name: \"d\", message { name: \"D\", args { name: \"b\", by: \"b.name\" } } },\n      { name: \"e\", message { name: \"E\", args: [ { name: \"c\", by: \"c.name\" }, { name: \"d\", by: \"d.name\" } ] } },\n      { name: \"f\", message { name: \"F\", args: [ { name: \"c\", by: \"c.name\" }, { name: \"d\", by: \"d.name\" } ] } },\n      { name: \"g\", message { name: \"G\" } },\n      { name: \"h\", message { name: \"H\", args: [ { name: \"e\", by: \"e.name\" }, { name: \"f\", by: \"f.name\" }, { name: \"g\", by: \"g.name\"} ] } },\n      { name: \"i\", message { name: \"I\" } },\n      { name: \"j\", message { name: \"J\", args { name: \"i\", by: \"i.name\" } } }\n    ]\n  };\n  string hname = 1 [(grpc.federation.field).by = \"h.name\"];\n  string jname = 2 [(grpc.federation.field).by = \"j.name\"];\n}\n\nmessage A {\n  option (grpc.federation.message) = {\n    def [\n      { name: \"aa\", message { name: \"AA\" } },\n      { name: \"ab\", message { name: \"AB\" } }\n    ]\n  };\n  string name = 1 [(grpc.federation.field).by = \"'a'\"];\n}\n\nmessage AA {\n  string name = 1 [(grpc.federation.field).by = \"'aa'\"];\n}\n\nmessage AB {\n  string name = 1 [(grpc.federation.field).by = \"'ab'\"];\n}\n\nmessage B {\n  string name = 1 [(grpc.federation.field).by = \"'b'\"];\n}\n\nmessage C {\n  string name = 1 [(grpc.federation.field).by = \"'c'\"];\n}\n\nmessage D {\n  string name = 1 [(grpc.federation.field).by = \"'d'\"];\n}\n\nmessage E {\n  string name = 1 [(grpc.federation.field).by = \"'e'\"];\n}\n\nmessage F {\n  string name = 1 [(grpc.federation.field).by = \"'f'\"];\n}\n\nmessage G {\n  string name = 1 [(grpc.federation.field).by = \"'g'\"];\n}\n\nmessage H {\n  string name = 1 [(grpc.federation.field).by = \"'h'\"];\n}\n\nmessage I {\n  string name = 1 [(grpc.federation.field).by = \"'i'\"];\n}\n\nmessage J {\n  string name = 1 [(grpc.federation.field).by = \"'j'\"];\n}"
  },
  {
    "path": "_examples/06_alias/.gitignore",
    "content": "grpc/federation\n"
  },
  {
    "path": "_examples/06_alias/Makefile",
    "content": "MAKEFILE_DIR := $(dir $(lastword $(MAKEFILE_LIST)))\nGOBIN := $(MAKEFILE_DIR)/../../bin\nPATH := $(GOBIN):$(PATH)\n\nJAEGER_IMAGE := jaegertracing/all-in-one:latest\n\n.PHONY: generate\ngenerate:\n\t$(GOBIN)/buf generate\n\n.PHONY: lint\nlint:\n\t@$(GOBIN)/grpc-federation-linter -Iproto -Iproto_deps ./proto/federation/federation.proto\n\n.PHONY: test\ntest:\n\tgo test -race ./ -count=1\n\n.PHONY: grpc-federation/generate\ngrpc-federation/generate:\n\t@$(GOBIN)/grpc-federation-generator ./proto/federation/federation.proto\n\n.PHONY: grpc-federation/watch\ngrpc-federation/watch:\n\t@$(GOBIN)/grpc-federation-generator -w\n\n.PHONY: jaeger/start\njaeger/start:\n\t@docker run \\\n\t\t-e COLLECTOR_OTLP_ENABLED=true \\\n\t\t-p 16686:16686 \\\n\t\t-p 4317:4317 \\\n\t\t-p 4318:4318 \\\n\t\t-d \\\n\t\t$(JAEGER_IMAGE)\n\n.PHONY: jaeger/stop\njaeger/stop:\n\t@docker stop $(shell docker ps -q  --filter ancestor=$(JAEGER_IMAGE))\n"
  },
  {
    "path": "_examples/06_alias/buf.gen.yaml",
    "content": "version: v1\nmanaged:\n  enabled: true\nplugins:\n  - plugin: go\n    out: .\n    opt: paths=source_relative\n  - plugin: go-grpc\n    out: .\n    opt: paths=source_relative\n  - plugin: grpc-federation\n    out: .\n    opt:\n    - paths=source_relative\n    - import_paths=proto\n"
  },
  {
    "path": "_examples/06_alias/buf.work.yaml",
    "content": "version: v1\ndirectories:\n  - proto\n  - proto_deps\n"
  },
  {
    "path": "_examples/06_alias/federation/federation.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\tpost \"example/post\"\n\t_ \"github.com/mercari/grpc-federation/grpc/federation\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype PostType int32\n\nconst (\n\tPostType_POST_TYPE_UNKNOWN PostType = 0\n\tPostType_POST_TYPE_FOO     PostType = 1\n\tPostType_POST_TYPE_BAR     PostType = 2\n\tPostType_POST_TYPE_BAZ     PostType = 3\n)\n\n// Enum value maps for PostType.\nvar (\n\tPostType_name = map[int32]string{\n\t\t0: \"POST_TYPE_UNKNOWN\",\n\t\t1: \"POST_TYPE_FOO\",\n\t\t2: \"POST_TYPE_BAR\",\n\t\t3: \"POST_TYPE_BAZ\",\n\t}\n\tPostType_value = map[string]int32{\n\t\t\"POST_TYPE_UNKNOWN\": 0,\n\t\t\"POST_TYPE_FOO\":     1,\n\t\t\"POST_TYPE_BAR\":     2,\n\t\t\"POST_TYPE_BAZ\":     3,\n\t}\n)\n\nfunc (x PostType) Enum() *PostType {\n\tp := new(PostType)\n\t*p = x\n\treturn p\n}\n\nfunc (x PostType) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (PostType) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_federation_federation_proto_enumTypes[0].Descriptor()\n}\n\nfunc (PostType) Type() protoreflect.EnumType {\n\treturn &file_federation_federation_proto_enumTypes[0]\n}\n\nfunc (x PostType) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use PostType.Descriptor instead.\nfunc (PostType) EnumDescriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\ntype PostContent_Category int32\n\nconst (\n\tPostContent_CATEGORY_A PostContent_Category = 0\n\tPostContent_CATEGORY_B PostContent_Category = 1\n\tPostContent_CATEGORY_C PostContent_Category = 2\n)\n\n// Enum value maps for PostContent_Category.\nvar (\n\tPostContent_Category_name = map[int32]string{\n\t\t0: \"CATEGORY_A\",\n\t\t1: \"CATEGORY_B\",\n\t\t2: \"CATEGORY_C\",\n\t}\n\tPostContent_Category_value = map[string]int32{\n\t\t\"CATEGORY_A\": 0,\n\t\t\"CATEGORY_B\": 1,\n\t\t\"CATEGORY_C\": 2,\n\t}\n)\n\nfunc (x PostContent_Category) Enum() *PostContent_Category {\n\tp := new(PostContent_Category)\n\t*p = x\n\treturn p\n}\n\nfunc (x PostContent_Category) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (PostContent_Category) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_federation_federation_proto_enumTypes[1].Descriptor()\n}\n\nfunc (PostContent_Category) Type() protoreflect.EnumType {\n\treturn &file_federation_federation_proto_enumTypes[1]\n}\n\nfunc (x PostContent_Category) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use PostContent_Category.Descriptor instead.\nfunc (PostContent_Category) EnumDescriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{4, 0}\n}\n\ntype GetPostRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\t// Types that are assignable to Condition:\n\t//\n\t//\t*GetPostRequest_A\n\t//\t*GetPostRequest_ConditionB_\n\tCondition isGetPostRequest_Condition `protobuf_oneof:\"condition\"`\n}\n\nfunc (x *GetPostRequest) Reset() {\n\t*x = GetPostRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostRequest) ProtoMessage() {}\n\nfunc (x *GetPostRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostRequest.ProtoReflect.Descriptor instead.\nfunc (*GetPostRequest) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetPostRequest) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (m *GetPostRequest) GetCondition() isGetPostRequest_Condition {\n\tif m != nil {\n\t\treturn m.Condition\n\t}\n\treturn nil\n}\n\nfunc (x *GetPostRequest) GetA() *GetPostRequest_ConditionA {\n\tif x, ok := x.GetCondition().(*GetPostRequest_A); ok {\n\t\treturn x.A\n\t}\n\treturn nil\n}\n\nfunc (x *GetPostRequest) GetConditionB() *GetPostRequest_ConditionB {\n\tif x, ok := x.GetCondition().(*GetPostRequest_ConditionB_); ok {\n\t\treturn x.ConditionB\n\t}\n\treturn nil\n}\n\ntype isGetPostRequest_Condition interface {\n\tisGetPostRequest_Condition()\n}\n\ntype GetPostRequest_A struct {\n\tA *GetPostRequest_ConditionA `protobuf:\"bytes,2,opt,name=a,proto3,oneof\"`\n}\n\ntype GetPostRequest_ConditionB_ struct {\n\tConditionB *GetPostRequest_ConditionB `protobuf:\"bytes,3,opt,name=condition_b,json=conditionB,proto3,oneof\"`\n}\n\nfunc (*GetPostRequest_A) isGetPostRequest_Condition() {}\n\nfunc (*GetPostRequest_ConditionB_) isGetPostRequest_Condition() {}\n\ntype GetPostResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPost *Post `protobuf:\"bytes,1,opt,name=post,proto3\" json:\"post,omitempty\"`\n}\n\nfunc (x *GetPostResponse) Reset() {\n\t*x = GetPostResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostResponse) ProtoMessage() {}\n\nfunc (x *GetPostResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostResponse.ProtoReflect.Descriptor instead.\nfunc (*GetPostResponse) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetPostResponse) GetPost() *Post {\n\tif x != nil {\n\t\treturn x.Post\n\t}\n\treturn nil\n}\n\ntype Post struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId    string    `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tData  *PostData `protobuf:\"bytes,2,opt,name=data,proto3\" json:\"data,omitempty\"`\n\tData2 *PostData `protobuf:\"bytes,3,opt,name=data2,proto3\" json:\"data2,omitempty\"`\n\tType  PostType  `protobuf:\"varint,4,opt,name=type,proto3,enum=org.federation.PostType\" json:\"type,omitempty\"`\n\tType2 PostType  `protobuf:\"varint,5,opt,name=type2,proto3,enum=org.federation.PostType\" json:\"type2,omitempty\"`\n\tType3 PostType  `protobuf:\"varint,6,opt,name=type3,proto3,enum=org.federation.PostType\" json:\"type3,omitempty\"`\n\tType4 PostType  `protobuf:\"varint,7,opt,name=type4,proto3,enum=org.federation.PostType\" json:\"type4,omitempty\"`\n\tM     *post.M   `protobuf:\"bytes,8,opt,name=m,proto3\" json:\"m,omitempty\"`\n}\n\nfunc (x *Post) Reset() {\n\t*x = Post{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Post) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Post) ProtoMessage() {}\n\nfunc (x *Post) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Post.ProtoReflect.Descriptor instead.\nfunc (*Post) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *Post) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetData() *PostData {\n\tif x != nil {\n\t\treturn x.Data\n\t}\n\treturn nil\n}\n\nfunc (x *Post) GetData2() *PostData {\n\tif x != nil {\n\t\treturn x.Data2\n\t}\n\treturn nil\n}\n\nfunc (x *Post) GetType() PostType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn PostType_POST_TYPE_UNKNOWN\n}\n\nfunc (x *Post) GetType2() PostType {\n\tif x != nil {\n\t\treturn x.Type2\n\t}\n\treturn PostType_POST_TYPE_UNKNOWN\n}\n\nfunc (x *Post) GetType3() PostType {\n\tif x != nil {\n\t\treturn x.Type3\n\t}\n\treturn PostType_POST_TYPE_UNKNOWN\n}\n\nfunc (x *Post) GetType4() PostType {\n\tif x != nil {\n\t\treturn x.Type4\n\t}\n\treturn PostType_POST_TYPE_UNKNOWN\n}\n\nfunc (x *Post) GetM() *post.M {\n\tif x != nil {\n\t\treturn x.M\n\t}\n\treturn nil\n}\n\ntype PostData struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tType    PostType     `protobuf:\"varint,1,opt,name=type,proto3,enum=org.federation.PostType\" json:\"type,omitempty\"`\n\tTitle   string       `protobuf:\"bytes,2,opt,name=title,proto3\" json:\"title,omitempty\"`\n\tContent *PostContent `protobuf:\"bytes,3,opt,name=content,proto3\" json:\"content,omitempty\"`\n}\n\nfunc (x *PostData) Reset() {\n\t*x = PostData{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *PostData) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*PostData) ProtoMessage() {}\n\nfunc (x *PostData) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use PostData.ProtoReflect.Descriptor instead.\nfunc (*PostData) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *PostData) GetType() PostType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn PostType_POST_TYPE_UNKNOWN\n}\n\nfunc (x *PostData) GetTitle() string {\n\tif x != nil {\n\t\treturn x.Title\n\t}\n\treturn \"\"\n}\n\nfunc (x *PostData) GetContent() *PostContent {\n\tif x != nil {\n\t\treturn x.Content\n\t}\n\treturn nil\n}\n\ntype PostContent struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tCategory PostContent_Category `protobuf:\"varint,1,opt,name=category,proto3,enum=org.federation.PostContent_Category\" json:\"category,omitempty\"`\n\tHead     string               `protobuf:\"bytes,2,opt,name=head,proto3\" json:\"head,omitempty\"`\n\tBody     string               `protobuf:\"bytes,3,opt,name=body,proto3\" json:\"body,omitempty\"`\n\tDupBody  string               `protobuf:\"bytes,4,opt,name=dup_body,json=dupBody,proto3\" json:\"dup_body,omitempty\"`\n\tCounts   map[int32]int32      `protobuf:\"bytes,5,rep,name=counts,proto3\" json:\"counts,omitempty\" protobuf_key:\"varint,1,opt,name=key,proto3\" protobuf_val:\"varint,2,opt,name=value,proto3\"`\n}\n\nfunc (x *PostContent) Reset() {\n\t*x = PostContent{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *PostContent) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*PostContent) ProtoMessage() {}\n\nfunc (x *PostContent) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use PostContent.ProtoReflect.Descriptor instead.\nfunc (*PostContent) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *PostContent) GetCategory() PostContent_Category {\n\tif x != nil {\n\t\treturn x.Category\n\t}\n\treturn PostContent_CATEGORY_A\n}\n\nfunc (x *PostContent) GetHead() string {\n\tif x != nil {\n\t\treturn x.Head\n\t}\n\treturn \"\"\n}\n\nfunc (x *PostContent) GetBody() string {\n\tif x != nil {\n\t\treturn x.Body\n\t}\n\treturn \"\"\n}\n\nfunc (x *PostContent) GetDupBody() string {\n\tif x != nil {\n\t\treturn x.DupBody\n\t}\n\treturn \"\"\n}\n\nfunc (x *PostContent) GetCounts() map[int32]int32 {\n\tif x != nil {\n\t\treturn x.Counts\n\t}\n\treturn nil\n}\n\ntype M struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tX string `protobuf:\"bytes,1,opt,name=x,proto3\" json:\"x,omitempty\"`\n}\n\nfunc (x *M) Reset() {\n\t*x = M{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *M) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*M) ProtoMessage() {}\n\nfunc (x *M) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use M.ProtoReflect.Descriptor instead.\nfunc (*M) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *M) GetX() string {\n\tif x != nil {\n\t\treturn x.X\n\t}\n\treturn \"\"\n}\n\ntype GetPostRequest_ConditionA struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tProp string `protobuf:\"bytes,1,opt,name=prop,proto3\" json:\"prop,omitempty\"`\n}\n\nfunc (x *GetPostRequest_ConditionA) Reset() {\n\t*x = GetPostRequest_ConditionA{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostRequest_ConditionA) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostRequest_ConditionA) ProtoMessage() {}\n\nfunc (x *GetPostRequest_ConditionA) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostRequest_ConditionA.ProtoReflect.Descriptor instead.\nfunc (*GetPostRequest_ConditionA) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{0, 0}\n}\n\nfunc (x *GetPostRequest_ConditionA) GetProp() string {\n\tif x != nil {\n\t\treturn x.Prop\n\t}\n\treturn \"\"\n}\n\ntype GetPostRequest_ConditionB struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *GetPostRequest_ConditionB) Reset() {\n\t*x = GetPostRequest_ConditionB{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostRequest_ConditionB) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostRequest_ConditionB) ProtoMessage() {}\n\nfunc (x *GetPostRequest_ConditionB) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostRequest_ConditionB.ProtoReflect.Descriptor instead.\nfunc (*GetPostRequest_ConditionB) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{0, 1}\n}\n\nvar File_federation_federation_proto protoreflect.FileDescriptor\n\nvar file_federation_federation_proto_rawDesc = []byte{\n\t0x0a, 0x1b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x6f,\n\t0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x20, 0x67,\n\t0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,\n\t0x0f, 0x70, 0x6f, 0x73, 0x74, 0x2f, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x22, 0xa2, 0x02, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75,\n\t0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x02, 0x69, 0x64, 0x12, 0x39, 0x0a, 0x01, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29,\n\t0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43,\n\t0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x48, 0x00, 0x52, 0x01, 0x61, 0x12, 0x4c,\n\t0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75,\n\t0x65, 0x73, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x48, 0x00,\n\t0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x1a, 0x3e, 0x0a, 0x0a,\n\t0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x72,\n\t0x6f, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x72, 0x6f, 0x70, 0x3a, 0x1c,\n\t0x9a, 0x4a, 0x19, 0x1a, 0x17, 0x6f, 0x72, 0x67, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x50, 0x6f,\n\t0x73, 0x74, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x1a, 0x2a, 0x0a, 0x0a,\n\t0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x3a, 0x1c, 0x9a, 0x4a, 0x19, 0x1a,\n\t0x17, 0x6f, 0x72, 0x67, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x43, 0x6f,\n\t0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x42, 0x0b, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x64,\n\t0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x85, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73,\n\t0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x04, 0x70, 0x6f, 0x73,\n\t0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x42, 0x09, 0x9a,\n\t0x4a, 0x06, 0x12, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x52, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x3a, 0x3d,\n\t0x9a, 0x4a, 0x3a, 0x0a, 0x38, 0x0a, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x6a, 0x30, 0x0a, 0x04, 0x50,\n\t0x6f, 0x73, 0x74, 0x12, 0x0a, 0x0a, 0x02, 0x69, 0x64, 0x12, 0x04, 0x24, 0x2e, 0x69, 0x64, 0x12,\n\t0x08, 0x0a, 0x01, 0x61, 0x12, 0x03, 0x24, 0x2e, 0x61, 0x12, 0x12, 0x0a, 0x01, 0x62, 0x12, 0x0d,\n\t0x24, 0x2e, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x22, 0x9a, 0x08,\n\t0x0a, 0x04, 0x50, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2c, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04,\n\t0x64, 0x61, 0x74, 0x61, 0x12, 0x3a, 0x0a, 0x05, 0x64, 0x61, 0x74, 0x61, 0x32, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x42, 0x0a, 0x9a,\n\t0x4a, 0x07, 0x12, 0x05, 0x64, 0x61, 0x74, 0x61, 0x32, 0x52, 0x05, 0x64, 0x61, 0x74, 0x61, 0x32,\n\t0x12, 0x3d, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18,\n\t0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x50, 0x6f, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x42, 0x0f, 0x9a, 0x4a, 0x0c, 0x12, 0x0a, 0x64,\n\t0x61, 0x74, 0x61, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x32, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12,\n\t0x3d, 0x0a, 0x05, 0x74, 0x79, 0x70, 0x65, 0x32, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18,\n\t0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x50, 0x6f, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x42, 0x0d, 0x9a, 0x4a, 0x0a, 0x12, 0x08, 0x74,\n\t0x79, 0x70, 0x65, 0x5f, 0x66, 0x65, 0x64, 0x52, 0x05, 0x74, 0x79, 0x70, 0x65, 0x32, 0x12, 0x65,\n\t0x0a, 0x05, 0x74, 0x79, 0x70, 0x65, 0x33, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e,\n\t0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50,\n\t0x6f, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x42, 0x35, 0x9a, 0x4a, 0x32, 0x12, 0x30, 0x6f, 0x72,\n\t0x67, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x44, 0x61,\n\t0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x27, 0x50, 0x4f,\n\t0x53, 0x54, 0x5f, 0x56, 0x32, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x27, 0x29, 0x52, 0x05,\n\t0x74, 0x79, 0x70, 0x65, 0x33, 0x12, 0x3e, 0x0a, 0x05, 0x74, 0x79, 0x70, 0x65, 0x34, 0x18, 0x07,\n\t0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x42, 0x0e,\n\t0x9a, 0x4a, 0x0b, 0x12, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x66, 0x65, 0x64, 0x32, 0x52, 0x05,\n\t0x74, 0x79, 0x70, 0x65, 0x34, 0x12, 0x2b, 0x0a, 0x01, 0x6d, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x0b, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x4d, 0x42, 0x10, 0x9a,\n\t0x4a, 0x0d, 0x12, 0x0b, 0x4d, 0x7b, 0x78, 0x3a, 0x20, 0x27, 0x78, 0x78, 0x78, 0x27, 0x7d, 0x52,\n\t0x01, 0x6d, 0x3a, 0xc5, 0x04, 0x9a, 0x4a, 0xc1, 0x04, 0x0a, 0x5f, 0x0a, 0x03, 0x72, 0x65, 0x73,\n\t0x72, 0x58, 0x0a, 0x1c, 0x6f, 0x72, 0x67, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73,\n\t0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74,\n\t0x12, 0x0a, 0x0a, 0x02, 0x69, 0x64, 0x12, 0x04, 0x24, 0x2e, 0x69, 0x64, 0x12, 0x15, 0x0a, 0x01,\n\t0x61, 0x12, 0x03, 0x24, 0x2e, 0x61, 0x1a, 0x0b, 0x24, 0x2e, 0x61, 0x20, 0x21, 0x3d, 0x20, 0x6e,\n\t0x75, 0x6c, 0x6c, 0x12, 0x15, 0x0a, 0x01, 0x62, 0x12, 0x03, 0x24, 0x2e, 0x62, 0x1a, 0x0b, 0x24,\n\t0x2e, 0x62, 0x20, 0x21, 0x3d, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x0a, 0x12, 0x0a, 0x04, 0x70, 0x6f,\n\t0x73, 0x74, 0x18, 0x01, 0x5a, 0x08, 0x72, 0x65, 0x73, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x0a, 0x35,\n\t0x0a, 0x04, 0x72, 0x65, 0x73, 0x32, 0x72, 0x2d, 0x0a, 0x1f, 0x6f, 0x72, 0x67, 0x2e, 0x70, 0x6f,\n\t0x73, 0x74, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,\n\t0x65, 0x2f, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x12, 0x0a, 0x0a, 0x02, 0x69, 0x64, 0x12,\n\t0x04, 0x24, 0x2e, 0x69, 0x64, 0x0a, 0x17, 0x0a, 0x05, 0x64, 0x61, 0x74, 0x61, 0x32, 0x5a, 0x0e,\n\t0x72, 0x65, 0x73, 0x32, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x0a, 0xa0,\n\t0x01, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5a, 0x92, 0x01, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x65,\n\t0x6e, 0x75, 0x6d, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x74, 0x72, 0x75, 0x65, 0x2c,\n\t0x20, 0x6f, 0x72, 0x67, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x44, 0x61,\n\t0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x66, 0x72, 0x6f, 0x6d, 0x28, 0x6f, 0x72, 0x67, 0x2e,\n\t0x70, 0x6f, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70,\n\t0x65, 0x2e, 0x50, 0x4f, 0x53, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x29, 0x2c, 0x20,\n\t0x6f, 0x72, 0x67, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x6f, 0x73, 0x74,\n\t0x44, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x27,\n\t0x50, 0x4f, 0x53, 0x54, 0x5f, 0x56, 0x32, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x27, 0x29,\n\t0x29, 0x0a, 0x6c, 0x0a, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x32, 0x5a,\n\t0x5e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x74, 0x72, 0x75,\n\t0x65, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x6f, 0x72,\n\t0x67, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x44, 0x61,\n\t0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x27, 0x50, 0x4f,\n\t0x53, 0x54, 0x5f, 0x56, 0x32, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x27, 0x29, 0x29, 0x0a,\n\t0x23, 0x0a, 0x08, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x66, 0x65, 0x64, 0x82, 0x01, 0x16, 0x0a, 0x08,\n\t0x50, 0x6f, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74,\n\t0x79, 0x70, 0x65, 0x32, 0x0a, 0x44, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x66, 0x65, 0x64,\n\t0x32, 0x82, 0x01, 0x36, 0x0a, 0x08, 0x50, 0x6f, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2a,\n\t0x6f, 0x72, 0x67, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x44, 0x61, 0x74,\n\t0x61, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x27, 0x50, 0x4f, 0x53,\n\t0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x27, 0x29, 0x22, 0xb3, 0x01, 0x0a, 0x08, 0x50,\n\t0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52,\n\t0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x35, 0x0a, 0x07, 0x63,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6f,\n\t0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x6f,\n\t0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x74, 0x3a, 0x2c, 0x9a, 0x4a, 0x29, 0x1a, 0x11, 0x6f, 0x72, 0x67, 0x2e, 0x70, 0x6f, 0x73,\n\t0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x14, 0x6f, 0x72, 0x67, 0x2e,\n\t0x70, 0x6f, 0x73, 0x74, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61,\n\t0x22, 0xd7, 0x03, 0x0a, 0x0b, 0x50, 0x6f, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,\n\t0x12, 0x40, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0e, 0x32, 0x24, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,\n\t0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f,\n\t0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x65, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x04, 0x68, 0x65, 0x61, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x24, 0x0a, 0x08, 0x64, 0x75,\n\t0x70, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0x9a, 0x4a,\n\t0x06, 0x1a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x52, 0x07, 0x64, 0x75, 0x70, 0x42, 0x6f, 0x64, 0x79,\n\t0x12, 0x3f, 0x0a, 0x06, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x27, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f,\n\t0x75, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x63, 0x6f, 0x75, 0x6e, 0x74,\n\t0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79,\n\t0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b,\n\t0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x87, 0x01, 0x0a,\n\t0x08, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x41, 0x54,\n\t0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x41, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x41, 0x54,\n\t0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x42, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x0a, 0x43, 0x41, 0x54,\n\t0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x43, 0x10, 0x02, 0x1a, 0x05, 0x9a, 0x4a, 0x02, 0x20, 0x01,\n\t0x1a, 0x44, 0x9a, 0x4a, 0x41, 0x0a, 0x1d, 0x6f, 0x72, 0x67, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e,\n\t0x50, 0x6f, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x61, 0x74, 0x65,\n\t0x67, 0x6f, 0x72, 0x79, 0x0a, 0x20, 0x6f, 0x72, 0x67, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x76,\n\t0x32, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x61,\n\t0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x3a, 0x32, 0x9a, 0x4a, 0x2f, 0x1a, 0x14, 0x6f, 0x72, 0x67,\n\t0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x74, 0x1a, 0x17, 0x6f, 0x72, 0x67, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x76, 0x32, 0x2e, 0x50,\n\t0x6f, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x22, 0x0a, 0x01, 0x4d, 0x12,\n\t0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x01, 0x78, 0x3a, 0x0f, 0x9a,\n\t0x4a, 0x0c, 0x1a, 0x0a, 0x6f, 0x72, 0x67, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x4d, 0x2a, 0xd0,\n\t0x02, 0x0a, 0x08, 0x50, 0x6f, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x11, 0x50,\n\t0x4f, 0x53, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e,\n\t0x10, 0x00, 0x1a, 0x05, 0x9a, 0x4a, 0x02, 0x08, 0x01, 0x12, 0x23, 0x0a, 0x0d, 0x50, 0x4f, 0x53,\n\t0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x4f, 0x4f, 0x10, 0x01, 0x1a, 0x10, 0x9a, 0x4a,\n\t0x0d, 0x12, 0x0b, 0x50, 0x4f, 0x53, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x12, 0xb0,\n\t0x01, 0x0a, 0x0d, 0x50, 0x4f, 0x53, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x41, 0x52,\n\t0x10, 0x02, 0x1a, 0x9c, 0x01, 0x9a, 0x4a, 0x98, 0x01, 0x12, 0x21, 0x6f, 0x72, 0x67, 0x2e, 0x70,\n\t0x6f, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65,\n\t0x2e, 0x50, 0x4f, 0x53, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x12, 0x21, 0x6f, 0x72,\n\t0x67, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x54,\n\t0x79, 0x70, 0x65, 0x2e, 0x50, 0x4f, 0x53, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x12,\n\t0x27, 0x6f, 0x72, 0x67, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x6f, 0x73,\n\t0x74, 0x44, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x50, 0x4f, 0x53, 0x54, 0x5f, 0x56,\n\t0x32, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x12, 0x27, 0x6f, 0x72, 0x67, 0x2e, 0x70, 0x6f,\n\t0x73, 0x74, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x54, 0x79,\n\t0x70, 0x65, 0x2e, 0x50, 0x4f, 0x53, 0x54, 0x5f, 0x56, 0x32, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f,\n\t0x43, 0x12, 0x18, 0x0a, 0x0d, 0x50, 0x4f, 0x53, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42,\n\t0x41, 0x5a, 0x10, 0x03, 0x1a, 0x05, 0x9a, 0x4a, 0x02, 0x20, 0x01, 0x1a, 0x34, 0x9a, 0x4a, 0x31,\n\t0x0a, 0x15, 0x6f, 0x72, 0x67, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x44,\n\t0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x0a, 0x18, 0x6f, 0x72, 0x67, 0x2e, 0x70, 0x6f, 0x73,\n\t0x74, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70,\n\t0x65, 0x32, 0x66, 0x0a, 0x11, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4c, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73,\n\t0x74, 0x12, 0x1e, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,\n\t0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,\n\t0x73, 0x65, 0x22, 0x00, 0x1a, 0x03, 0x9a, 0x4a, 0x00, 0x42, 0xc9, 0x01, 0x9a, 0x4a, 0x29, 0x12,\n\t0x12, 0x70, 0x6f, 0x73, 0x74, 0x2f, 0x76, 0x32, 0x2f, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x12, 0x13, 0x70, 0x6f, 0x73, 0x74, 0x2f, 0x76, 0x32, 0x2f, 0x65, 0x78, 0x74,\n\t0x72, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x72,\n\t0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0f, 0x46, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a,\n\t0x1d, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x3b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xa2, 0x02,\n\t0x03, 0x4f, 0x46, 0x58, 0xaa, 0x02, 0x0e, 0x4f, 0x72, 0x67, 0x2e, 0x46, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0xca, 0x02, 0x0e, 0x4f, 0x72, 0x67, 0x5c, 0x46, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xe2, 0x02, 0x1a, 0x4f, 0x72, 0x67, 0x5c, 0x46, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64,\n\t0x61, 0x74, 0x61, 0xea, 0x02, 0x0f, 0x4f, 0x72, 0x67, 0x3a, 0x3a, 0x46, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_federation_federation_proto_rawDescOnce sync.Once\n\tfile_federation_federation_proto_rawDescData = file_federation_federation_proto_rawDesc\n)\n\nfunc file_federation_federation_proto_rawDescGZIP() []byte {\n\tfile_federation_federation_proto_rawDescOnce.Do(func() {\n\t\tfile_federation_federation_proto_rawDescData = protoimpl.X.CompressGZIP(file_federation_federation_proto_rawDescData)\n\t})\n\treturn file_federation_federation_proto_rawDescData\n}\n\nvar file_federation_federation_proto_enumTypes = make([]protoimpl.EnumInfo, 2)\nvar file_federation_federation_proto_msgTypes = make([]protoimpl.MessageInfo, 9)\nvar file_federation_federation_proto_goTypes = []interface{}{\n\t(PostType)(0),                     // 0: org.federation.PostType\n\t(PostContent_Category)(0),         // 1: org.federation.PostContent.Category\n\t(*GetPostRequest)(nil),            // 2: org.federation.GetPostRequest\n\t(*GetPostResponse)(nil),           // 3: org.federation.GetPostResponse\n\t(*Post)(nil),                      // 4: org.federation.Post\n\t(*PostData)(nil),                  // 5: org.federation.PostData\n\t(*PostContent)(nil),               // 6: org.federation.PostContent\n\t(*M)(nil),                         // 7: org.federation.M\n\t(*GetPostRequest_ConditionA)(nil), // 8: org.federation.GetPostRequest.ConditionA\n\t(*GetPostRequest_ConditionB)(nil), // 9: org.federation.GetPostRequest.ConditionB\n\tnil,                               // 10: org.federation.PostContent.CountsEntry\n\t(*post.M)(nil),                    // 11: org.post.M\n}\nvar file_federation_federation_proto_depIdxs = []int32{\n\t8,  // 0: org.federation.GetPostRequest.a:type_name -> org.federation.GetPostRequest.ConditionA\n\t9,  // 1: org.federation.GetPostRequest.condition_b:type_name -> org.federation.GetPostRequest.ConditionB\n\t4,  // 2: org.federation.GetPostResponse.post:type_name -> org.federation.Post\n\t5,  // 3: org.federation.Post.data:type_name -> org.federation.PostData\n\t5,  // 4: org.federation.Post.data2:type_name -> org.federation.PostData\n\t0,  // 5: org.federation.Post.type:type_name -> org.federation.PostType\n\t0,  // 6: org.federation.Post.type2:type_name -> org.federation.PostType\n\t0,  // 7: org.federation.Post.type3:type_name -> org.federation.PostType\n\t0,  // 8: org.federation.Post.type4:type_name -> org.federation.PostType\n\t11, // 9: org.federation.Post.m:type_name -> org.post.M\n\t0,  // 10: org.federation.PostData.type:type_name -> org.federation.PostType\n\t6,  // 11: org.federation.PostData.content:type_name -> org.federation.PostContent\n\t1,  // 12: org.federation.PostContent.category:type_name -> org.federation.PostContent.Category\n\t10, // 13: org.federation.PostContent.counts:type_name -> org.federation.PostContent.CountsEntry\n\t2,  // 14: org.federation.FederationService.GetPost:input_type -> org.federation.GetPostRequest\n\t3,  // 15: org.federation.FederationService.GetPost:output_type -> org.federation.GetPostResponse\n\t15, // [15:16] is the sub-list for method output_type\n\t14, // [14:15] is the sub-list for method input_type\n\t14, // [14:14] is the sub-list for extension type_name\n\t14, // [14:14] is the sub-list for extension extendee\n\t0,  // [0:14] is the sub-list for field type_name\n}\n\nfunc init() { file_federation_federation_proto_init() }\nfunc file_federation_federation_proto_init() {\n\tif File_federation_federation_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_federation_federation_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Post); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*PostData); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*PostContent); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*M); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostRequest_ConditionA); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostRequest_ConditionB); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\tfile_federation_federation_proto_msgTypes[0].OneofWrappers = []interface{}{\n\t\t(*GetPostRequest_A)(nil),\n\t\t(*GetPostRequest_ConditionB_)(nil),\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_federation_federation_proto_rawDesc,\n\t\t\tNumEnums:      2,\n\t\t\tNumMessages:   9,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_federation_federation_proto_goTypes,\n\t\tDependencyIndexes: file_federation_federation_proto_depIdxs,\n\t\tEnumInfos:         file_federation_federation_proto_enumTypes,\n\t\tMessageInfos:      file_federation_federation_proto_msgTypes,\n\t}.Build()\n\tFile_federation_federation_proto = out.File\n\tfile_federation_federation_proto_rawDesc = nil\n\tfile_federation_federation_proto_goTypes = nil\n\tfile_federation_federation_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/06_alias/federation/federation_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tFederationService_GetPost_FullMethodName = \"/org.federation.FederationService/GetPost\"\n)\n\n// FederationServiceClient is the client API for FederationService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype FederationServiceClient interface {\n\tGetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error)\n}\n\ntype federationServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewFederationServiceClient(cc grpc.ClientConnInterface) FederationServiceClient {\n\treturn &federationServiceClient{cc}\n}\n\nfunc (c *federationServiceClient) GetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error) {\n\tout := new(GetPostResponse)\n\terr := c.cc.Invoke(ctx, FederationService_GetPost_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// FederationServiceServer is the server API for FederationService service.\n// All implementations must embed UnimplementedFederationServiceServer\n// for forward compatibility\ntype FederationServiceServer interface {\n\tGetPost(context.Context, *GetPostRequest) (*GetPostResponse, error)\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\n// UnimplementedFederationServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedFederationServiceServer struct {\n}\n\nfunc (UnimplementedFederationServiceServer) GetPost(context.Context, *GetPostRequest) (*GetPostResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetPost not implemented\")\n}\nfunc (UnimplementedFederationServiceServer) mustEmbedUnimplementedFederationServiceServer() {}\n\n// UnsafeFederationServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to FederationServiceServer will\n// result in compilation errors.\ntype UnsafeFederationServiceServer interface {\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\nfunc RegisterFederationServiceServer(s grpc.ServiceRegistrar, srv FederationServiceServer) {\n\ts.RegisterService(&FederationService_ServiceDesc, srv)\n}\n\nfunc _FederationService_GetPost_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetPostRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(FederationServiceServer).GetPost(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: FederationService_GetPost_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(FederationServiceServer).GetPost(ctx, req.(*GetPostRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// FederationService_ServiceDesc is the grpc.ServiceDesc for FederationService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar FederationService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"org.federation.FederationService\",\n\tHandlerType: (*FederationServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetPost\",\n\t\t\tHandler:    _FederationService_GetPost_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"federation/federation.proto\",\n}\n"
  },
  {
    "path": "_examples/06_alias/federation/federation_grpc_federation.pb.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: federation/federation.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n\n\tpost \"example/post\"\n\tpost1 \"example/post/v2\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Org_Federation_GetPostResponseVariable represents variable definitions in \"org.federation.GetPostResponse\".\ntype FederationService_Org_Federation_GetPostResponseVariable struct {\n\tPost *Post\n}\n\n// Org_Federation_GetPostResponseArgument is argument for \"org.federation.GetPostResponse\" message.\ntype FederationService_Org_Federation_GetPostResponseArgument struct {\n\tA          *GetPostRequest_ConditionA\n\tConditionB *GetPostRequest_ConditionB\n\tId         string\n\tFederationService_Org_Federation_GetPostResponseVariable\n}\n\n// Org_Federation_PostVariable represents variable definitions in \"org.federation.Post\".\ntype FederationService_Org_Federation_PostVariable struct {\n\tData2     *post1.PostData\n\tDataType  *grpcfedcel.EnumSelector\n\tDataType2 *grpcfedcel.EnumSelector\n\tPost      *post.Post\n\tRes       *post.GetPostResponse\n\tRes2      *post1.GetPostResponse\n\tTypeFed   PostType\n\tTypeFed2  PostType\n}\n\n// Org_Federation_PostArgument is argument for \"org.federation.Post\" message.\ntype FederationService_Org_Federation_PostArgument struct {\n\tA  *GetPostRequest_ConditionA\n\tB  *GetPostRequest_ConditionB\n\tId string\n\tFederationService_Org_Federation_PostVariable\n}\n\n// FederationServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationServiceConfig struct {\n\t// Client provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\n\t// If this interface is not provided, an error is returned during initialization.\n\tClient FederationServiceClientFactory // required\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationServiceClientFactory interface {\n\t// Org_Post_PostServiceClient create a gRPC Client to be used to call methods in org.post.PostService.\n\tOrg_Post_PostServiceClient(FederationServiceClientConfig) (post.PostServiceClient, error)\n\t// Org_Post_V2_PostServiceClient create a gRPC Client to be used to call methods in org.post.v2.PostService.\n\tOrg_Post_V2_PostServiceClient(FederationServiceClientConfig) (post1.PostServiceClient, error)\n}\n\n// FederationServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationServiceDependentClientSet struct {\n\tOrg_Post_PostServiceClient    post.PostServiceClient\n\tOrg_Post_V2_PostServiceClient post1.PostServiceClient\n}\n\n// FederationServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationServiceResolver interface {\n}\n\n// FederationServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// FederationServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationServiceUnimplementedResolver struct{}\n\nconst (\n\tFederationService_DependentMethod_Org_Post_PostService_GetPost    = \"/org.post.PostService/GetPost\"\n\tFederationService_DependentMethod_Org_Post_V2_PostService_GetPost = \"/org.post.v2.PostService/GetPost\"\n)\n\n// FederationService represents Federation Service.\ntype FederationService struct {\n\tUnimplementedFederationServiceServer\n\tcfg             FederationServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationServiceDependentClientSet\n}\n\n// NewFederationService creates FederationService instance by FederationServiceConfig.\nfunc NewFederationService(cfg FederationServiceConfig) (*FederationService, error) {\n\tif cfg.Client == nil {\n\t\treturn nil, grpcfed.ErrClientConfig\n\t}\n\tOrg_Post_PostServiceClient, err := cfg.Client.Org_Post_PostServiceClient(FederationServiceClientConfig{\n\t\tService: \"org.post.PostService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tOrg_Post_V2_PostServiceClient, err := cfg.Client.Org_Post_V2_PostServiceClient(FederationServiceClientConfig{\n\t\tService: \"org.post.v2.PostService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"org.federation.FederationService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.org.federation.GetPostResponseArgument\": {\n\t\t\t\"id\":          grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t\t\"a\":           grpcfed.NewCELFieldType(grpcfed.NewCELObjectType(\"org.federation.GetPostRequest.ConditionA\"), \"A\"),\n\t\t\t\"condition_b\": grpcfed.NewCELFieldType(grpcfed.NewCELObjectType(\"org.federation.GetPostRequest.ConditionB\"), \"ConditionB\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.PostArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t\t\"a\":  grpcfed.NewCELFieldType(grpcfed.NewCELObjectType(\"org.federation.GetPostRequest.ConditionA\"), \"A\"),\n\t\t\t\"b\":  grpcfed.NewCELFieldType(grpcfed.NewCELObjectType(\"org.federation.GetPostRequest.ConditionB\"), \"B\"),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"org.federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.GRPCErrorAccessorOptions(celTypeHelper, \"org.post.GetPostResponse\")...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.GRPCErrorAccessorOptions(celTypeHelper, \"org.post.v2.GetPostResponse\")...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.federation.PostContent.Category\", PostContent_Category_value, PostContent_Category_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.federation.PostType\", PostType_value, PostType_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.post.PostContent.Category\", post.PostContent_Category_value, post.PostContent_Category_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.post.PostDataType\", post.PostDataType_value, post.PostDataType_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.post.v2.ExtraType\", post1.ExtraType_value, post1.ExtraType_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.post.v2.PostContent.Category\", post1.PostContent_Category_value, post1.PostContent_Category_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.post.v2.PostDataType\", post1.PostDataType_value, post1.PostDataType_name)...)\n\tsvc := &FederationService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tclient: &FederationServiceDependentClientSet{\n\t\t\tOrg_Post_PostServiceClient:    Org_Post_PostServiceClient,\n\t\t\tOrg_Post_V2_PostServiceClient: Org_Post_V2_PostServiceClient,\n\t\t},\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationService(ctx context.Context, svc *FederationService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n// GetPost implements \"org.federation.FederationService/GetPost\" method.\nfunc (s *FederationService) GetPost(ctx context.Context, req *GetPostRequest) (res *GetPostResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.FederationService/GetPost\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Org_Federation_GetPostResponse(ctx, &FederationService_Org_Federation_GetPostResponseArgument{\n\t\tId:         req.GetId(),\n\t\tA:          req.GetA(),\n\t\tConditionB: req.GetConditionB(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Org_Federation_GetPostResponse resolve \"org.federation.GetPostResponse\" message.\nfunc (s *FederationService) resolve_Org_Federation_GetPostResponse(ctx context.Context, req *FederationService_Org_Federation_GetPostResponseArgument) (*GetPostResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.GetPostResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.GetPostResponse\", slog.Any(\"message_args\", s.logvalue_Org_Federation_GetPostResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tPost *Post\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.GetPostResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"post\"\n\t\t  message {\n\t\t    name: \"Post\"\n\t\t    args: [\n\t\t      { name: \"id\", by: \"$.id\" },\n\t\t      { name: \"a\", by: \"$.a\" },\n\t\t      { name: \"b\", by: \"$.condition_b\" }\n\t\t    ]\n\t\t  }\n\t\t}\n\t*/\n\tdef_post := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Post, *localValueType]{\n\t\t\tName: `post`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.Post\"),\n\t\t\tSetter: func(value *localValueType, v *Post) error {\n\t\t\t\tvalue.vars.Post = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_PostArgument{}\n\t\t\t\t// { name: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 1,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { name: \"a\", by: \"$.a\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*GetPostRequest_ConditionA]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.a`,\n\t\t\t\t\tCacheIndex: 2,\n\t\t\t\t\tSetter: func(v *GetPostRequest_ConditionA) error {\n\t\t\t\t\t\targs.A = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { name: \"b\", by: \"$.condition_b\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*GetPostRequest_ConditionB]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.condition_b`,\n\t\t\t\t\tCacheIndex: 3,\n\t\t\t\t\tSetter: func(v *GetPostRequest_ConditionB) error {\n\t\t\t\t\t\targs.B = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_Post(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_post(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_GetPostResponseVariable.Post = value.vars.Post\n\n\t// create a message value to be returned.\n\tret := &GetPostResponse{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"post\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*Post]{\n\t\tValue:      value,\n\t\tExpr:       `post`,\n\t\tCacheIndex: 4,\n\t\tSetter: func(v *Post) error {\n\t\t\tret.Post = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.GetPostResponse\", slog.Any(\"org.federation.GetPostResponse\", s.logvalue_Org_Federation_GetPostResponse(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_Post resolve \"org.federation.Post\" message.\nfunc (s *FederationService) resolve_Org_Federation_Post(ctx context.Context, req *FederationService_Org_Federation_PostArgument) (*Post, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.Post\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.Post\", slog.Any(\"message_args\", s.logvalue_Org_Federation_PostArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tData2     *post1.PostData\n\t\t\tDataType  *grpcfedcel.EnumSelector\n\t\t\tDataType2 *grpcfedcel.EnumSelector\n\t\t\tPost      *post.Post\n\t\t\tRes       *post.GetPostResponse\n\t\t\tRes2      *post1.GetPostResponse\n\t\t\tTypeFed   PostType\n\t\t\tTypeFed2  PostType\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.PostArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"org.post.PostService/GetPost\"\n\t\t    request: [\n\t\t      { field: \"id\", by: \"$.id\" },\n\t\t      { field: \"a\", by: \"$.a\", if: \"$.a != null\" },\n\t\t      { field: \"b\", by: \"$.b\", if: \"$.b != null\" }\n\t\t    ]\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.GetPostResponse, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"org.post.GetPostResponse\"),\n\t\t\tSetter: func(value *localValueType, v *post.GetPostResponse) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &post.GetPostRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 5,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"a\", by: \"$.a\", if: \"$.a != null\" }\n\t\t\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.a != null`,\n\t\t\t\t\tCacheIndex: 6,\n\t\t\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t\t\treturn grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*GetPostRequest_ConditionA]{\n\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\tExpr:       `$.a`,\n\t\t\t\t\t\t\tCacheIndex: 7,\n\t\t\t\t\t\t\tSetter: func(v *GetPostRequest_ConditionA) error {\n\t\t\t\t\t\t\t\taValue, err := s.cast_Org_Federation_GetPostRequest_ConditionA__to__Org_Post_PostConditionA(v)\n\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\targs.Condition = &post.GetPostRequest_A{\n\t\t\t\t\t\t\t\t\tA: aValue,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"b\", by: \"$.b\", if: \"$.b != null\" }\n\t\t\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.b != null`,\n\t\t\t\t\tCacheIndex: 8,\n\t\t\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t\t\treturn grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*GetPostRequest_ConditionB]{\n\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\tExpr:       `$.b`,\n\t\t\t\t\t\t\tCacheIndex: 9,\n\t\t\t\t\t\t\tSetter: func(v *GetPostRequest_ConditionB) error {\n\t\t\t\t\t\t\t\tbValue, err := s.cast_Org_Federation_GetPostRequest_ConditionB__to__Org_Post_PostConditionB(v)\n\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\targs.Condition = &post.GetPostRequest_B{\n\t\t\t\t\t\t\t\t\tB: bValue,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call org.post.PostService/GetPost\", slog.Any(\"org.post.GetPostRequest\", s.logvalue_Org_Post_GetPostRequest(args)))\n\t\t\t\tret, err := s.client.Org_Post_PostServiceClient.GetPost(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Org_Post_PostService_GetPost, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"post\"\n\t\t  autobind: true\n\t\t  by: \"res.post\"\n\t\t}\n\t*/\n\tdef_post := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.Post, *localValueType]{\n\t\t\tName: `post`,\n\t\t\tType: grpcfed.CELObjectType(\"org.post.Post\"),\n\t\t\tSetter: func(value *localValueType, v *post.Post) error {\n\t\t\t\tvalue.vars.Post = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `res.post`,\n\t\t\tByCacheIndex: 10,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"res2\"\n\t\t  call {\n\t\t    method: \"org.post.v2.PostService/GetPost\"\n\t\t    request { field: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res2 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post1.GetPostResponse, *localValueType]{\n\t\t\tName: `res2`,\n\t\t\tType: grpcfed.CELObjectType(\"org.post.v2.GetPostResponse\"),\n\t\t\tSetter: func(value *localValueType, v *post1.GetPostResponse) error {\n\t\t\t\tvalue.vars.Res2 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &post1.GetPostRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 11,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call org.post.v2.PostService/GetPost\", slog.Any(\"org.post.v2.GetPostRequest\", s.logvalue_Org_Post_V2_GetPostRequest(args)))\n\t\t\t\tret, err := s.client.Org_Post_V2_PostServiceClient.GetPost(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Org_Post_V2_PostService_GetPost, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"data2\"\n\t\t  by: \"res2.post.data\"\n\t\t}\n\t*/\n\tdef_data2 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post1.PostData, *localValueType]{\n\t\t\tName: `data2`,\n\t\t\tType: grpcfed.CELObjectType(\"org.post.v2.PostData\"),\n\t\t\tSetter: func(value *localValueType, v *post1.PostData) error {\n\t\t\t\tvalue.vars.Data2 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `res2.post.data`,\n\t\t\tByCacheIndex: 12,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"data_type\"\n\t\t  by: \"grpc.federation.enum.select(true, org.post.PostDataType.from(org.post.PostDataType.POST_TYPE_B), org.post.v2.PostDataType.value('POST_V2_TYPE_B'))\"\n\t\t}\n\t*/\n\tdef_data_type := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*grpcfedcel.EnumSelector, *localValueType]{\n\t\t\tName: `data_type`,\n\t\t\tType: grpcfed.CELObjectType(\"grpc.federation.private.EnumSelector\"),\n\t\t\tSetter: func(value *localValueType, v *grpcfedcel.EnumSelector) error {\n\t\t\t\tvalue.vars.DataType = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `grpc.federation.enum.select(true, org.post.PostDataType.from(org.post.PostDataType.POST_TYPE_B), org.post.v2.PostDataType.value('POST_V2_TYPE_B'))`,\n\t\t\tByCacheIndex: 13,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"data_type2\"\n\t\t  by: \"grpc.federation.enum.select(true, data_type, org.post.v2.PostDataType.value('POST_V2_TYPE_C'))\"\n\t\t}\n\t*/\n\tdef_data_type2 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*grpcfedcel.EnumSelector, *localValueType]{\n\t\t\tName: `data_type2`,\n\t\t\tType: grpcfed.CELObjectType(\"grpc.federation.private.EnumSelector\"),\n\t\t\tSetter: func(value *localValueType, v *grpcfedcel.EnumSelector) error {\n\t\t\t\tvalue.vars.DataType2 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `grpc.federation.enum.select(true, data_type, org.post.v2.PostDataType.value('POST_V2_TYPE_C'))`,\n\t\t\tByCacheIndex: 14,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"type_fed\"\n\t\t  enum {\n\t\t    name: \"org.federation.PostType\"\n\t\t    by: \"data_type2\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_type_fed := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[PostType, *localValueType]{\n\t\t\tName: `type_fed`,\n\t\t\tType: grpcfed.CELIntType,\n\t\t\tSetter: func(value *localValueType, v PostType) error {\n\t\t\t\tvalue.vars.TypeFed = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tEnum: func(ctx context.Context, value *localValueType) (PostType, error) {\n\t\t\t\tsrc, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `data_type2`,\n\t\t\t\t\tOutType:    reflect.TypeOf((*grpcfedcel.EnumSelector)(nil)),\n\t\t\t\t\tCacheIndex: 15,\n\t\t\t\t})\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn 0, err\n\t\t\t\t}\n\t\t\t\tv := src.(*grpcfedcel.EnumSelector)\n\t\t\t\tvar dst PostType\n\t\t\t\tif err := func() error {\n\t\t\t\t\tif v.GetCond() {\n\t\t\t\t\t\tif err := func(v *grpcfedcel.EnumSelector) error {\n\t\t\t\t\t\t\tif v.GetCond() {\n\t\t\t\t\t\t\t\tcasted, err := s.cast_Org_Post_PostDataType__to__Org_Federation_PostType(post.PostDataType(v.GetTrueValue()))\n\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tdst = casted\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcasted, err := s.cast_Org_Post_V2_PostDataType__to__Org_Federation_PostType(post1.PostDataType(v.GetFalseValue()))\n\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tdst = casted\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t}(v.GetTrueSelector()); err != nil {\n\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcasted, err := s.cast_Org_Post_V2_PostDataType__to__Org_Federation_PostType(post1.PostDataType(v.GetFalseValue()))\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdst = casted\n\t\t\t\t\t}\n\t\t\t\t\treturn nil\n\t\t\t\t}(); err != nil {\n\t\t\t\t\treturn 0, err\n\t\t\t\t}\n\t\t\t\treturn dst, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"type_fed2\"\n\t\t  enum {\n\t\t    name: \"org.federation.PostType\"\n\t\t    by: \"org.post.PostDataType.value('POST_TYPE_A')\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_type_fed2 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[PostType, *localValueType]{\n\t\t\tName: `type_fed2`,\n\t\t\tType: grpcfed.CELIntType,\n\t\t\tSetter: func(value *localValueType, v PostType) error {\n\t\t\t\tvalue.vars.TypeFed2 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tEnum: func(ctx context.Context, value *localValueType) (PostType, error) {\n\t\t\t\tsrc, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `org.post.PostDataType.value('POST_TYPE_A')`,\n\t\t\t\t\tOutType:    reflect.TypeOf(post.PostDataType(0)),\n\t\t\t\t\tCacheIndex: 16,\n\t\t\t\t})\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn 0, err\n\t\t\t\t}\n\t\t\t\tv := src.(post.PostDataType)\n\t\t\t\treturn s.cast_Org_Post_PostDataType__to__Org_Federation_PostType(v)\n\t\t\t},\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t                    res2 ─┐\n\t                              data2 ─┐\n\t                     res ─┐          │\n\t                               post ─┤\n\t   data_type ─┐                      │\n\t              data_type2 ─┐          │\n\t                           type_fed ─┤\n\t                          type_fed2 ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res2(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_data2(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_post(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_data_type(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_data_type2(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_type_fed(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_type_fed2(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_PostVariable.Data2 = value.vars.Data2\n\treq.FederationService_Org_Federation_PostVariable.DataType = value.vars.DataType\n\treq.FederationService_Org_Federation_PostVariable.DataType2 = value.vars.DataType2\n\treq.FederationService_Org_Federation_PostVariable.Post = value.vars.Post\n\treq.FederationService_Org_Federation_PostVariable.Res = value.vars.Res\n\treq.FederationService_Org_Federation_PostVariable.Res2 = value.vars.Res2\n\treq.FederationService_Org_Federation_PostVariable.TypeFed = value.vars.TypeFed\n\treq.FederationService_Org_Federation_PostVariable.TypeFed2 = value.vars.TypeFed2\n\n\t// create a message value to be returned.\n\tret := &Post{}\n\n\t// field binding section.\n\tret.Id = value.vars.Post.GetId() // { name: \"post\", autobind: true }\n\t{\n\t\tdataValue, err := s.cast_Org_Post_PostData__to__Org_Federation_PostData(value.vars.Post.GetData()) // { name: \"post\", autobind: true }\n\t\tif err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tret.Data = dataValue\n\t}\n\t// (grpc.federation.field).by = \"data2\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*post1.PostData]{\n\t\tValue:      value,\n\t\tExpr:       `data2`,\n\t\tCacheIndex: 17,\n\t\tSetter: func(v *post1.PostData) error {\n\t\t\tdata2Value, err := s.cast_Org_Post_V2_PostData__to__Org_Federation_PostData(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.Data2 = data2Value\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"data_type2\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*grpcfedcel.EnumSelector]{\n\t\tValue:      value,\n\t\tExpr:       `data_type2`,\n\t\tCacheIndex: 18,\n\t\tSetter: func(v *grpcfedcel.EnumSelector) error {\n\t\t\tvar typeValue PostType\n\t\t\tif v.GetCond() {\n\t\t\t\tif err := func(v *grpcfedcel.EnumSelector) error {\n\t\t\t\t\tif v.GetCond() {\n\t\t\t\t\t\tcasted, err := s.cast_Org_Post_PostDataType__to__Org_Federation_PostType(post.PostDataType(v.GetTrueValue()))\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttypeValue = casted\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcasted, err := s.cast_Org_Post_V2_PostDataType__to__Org_Federation_PostType(post1.PostDataType(v.GetFalseValue()))\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttypeValue = casted\n\t\t\t\t\t}\n\t\t\t\t\treturn nil\n\t\t\t\t}(v.GetTrueSelector()); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcasted, err := s.cast_Org_Post_V2_PostDataType__to__Org_Federation_PostType(post1.PostDataType(v.GetFalseValue()))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\ttypeValue = casted\n\t\t\t}\n\t\t\tret.Type = typeValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"type_fed\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[PostType]{\n\t\tValue:      value,\n\t\tExpr:       `type_fed`,\n\t\tCacheIndex: 19,\n\t\tSetter: func(v PostType) error {\n\t\t\tret.Type2 = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"org.post.v2.PostDataType.value('POST_V2_TYPE_C')\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[post1.PostDataType]{\n\t\tValue:      value,\n\t\tExpr:       `org.post.v2.PostDataType.value('POST_V2_TYPE_C')`,\n\t\tCacheIndex: 20,\n\t\tSetter: func(v post1.PostDataType) error {\n\t\t\ttype3Value, err := s.cast_Org_Post_V2_PostDataType__to__Org_Federation_PostType(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.Type3 = type3Value\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"type_fed2\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[PostType]{\n\t\tValue:      value,\n\t\tExpr:       `type_fed2`,\n\t\tCacheIndex: 21,\n\t\tSetter: func(v PostType) error {\n\t\t\tret.Type4 = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"M{x: 'xxx'}\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*M]{\n\t\tValue:      value,\n\t\tExpr:       `M{x: 'xxx'}`,\n\t\tCacheIndex: 22,\n\t\tSetter: func(v *M) error {\n\t\t\tmValue, err := s.cast_Org_Federation_M__to__Org_Post_M(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.M = mValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.Post\", slog.Any(\"org.federation.Post\", s.logvalue_Org_Federation_Post(ret)))\n\treturn ret, nil\n}\n\n// cast_Org_Federation_GetPostRequest_ConditionA__to__Org_Post_PostConditionA cast from \"org.federation.GetPostRequest.ConditionA\" to \"org.post.PostConditionA\".\nfunc (s *FederationService) cast_Org_Federation_GetPostRequest_ConditionA__to__Org_Post_PostConditionA(from *GetPostRequest_ConditionA) (*post.PostConditionA, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tpropValue := from.GetProp()\n\tret := &post.PostConditionA{\n\t\tProp: propValue,\n\t}\n\n\treturn ret, nil\n}\n\n// cast_Org_Federation_GetPostRequest_ConditionB__to__Org_Post_PostConditionB cast from \"org.federation.GetPostRequest.ConditionB\" to \"org.post.PostConditionB\".\nfunc (s *FederationService) cast_Org_Federation_GetPostRequest_ConditionB__to__Org_Post_PostConditionB(from *GetPostRequest_ConditionB) (*post.PostConditionB, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tret := &post.PostConditionB{}\n\n\treturn ret, nil\n}\n\n// cast_Org_Federation_M__to__Org_Post_M cast from \"org.federation.M\" to \"org.post.M\".\nfunc (s *FederationService) cast_Org_Federation_M__to__Org_Post_M(from *M) (*post.M, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\txValue := from.GetX()\n\tret := &post.M{\n\t\tX: xValue,\n\t}\n\n\treturn ret, nil\n}\n\n// cast_Org_Post_PostContent_Category__to__Org_Federation_PostContent_Category cast from \"org.post.PostContent.Category\" to \"org.federation.PostContent.Category\".\nfunc (s *FederationService) cast_Org_Post_PostContent_Category__to__Org_Federation_PostContent_Category(from post.PostContent_Category) (PostContent_Category, error) {\n\tvar ret PostContent_Category\n\tswitch from {\n\tcase post.PostContent_CATEGORY_A:\n\t\tret = PostContent_CATEGORY_A\n\tcase post.PostContent_CATEGORY_B:\n\t\tret = PostContent_CATEGORY_B\n\tdefault:\n\t\tret = 0\n\t}\n\treturn ret, nil\n}\n\n// cast_Org_Post_PostContent__to__Org_Federation_PostContent cast from \"org.post.PostContent\" to \"org.federation.PostContent\".\nfunc (s *FederationService) cast_Org_Post_PostContent__to__Org_Federation_PostContent(from *post.PostContent) (*PostContent, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tcategoryValue, err := s.cast_Org_Post_PostContent_Category__to__Org_Federation_PostContent_Category(from.GetCategory())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\theadValue := from.GetHead()\n\tbodyValue := from.GetBody()\n\tdupBodyValue := from.GetBody()\n\tcountsValue := from.GetCounts()\n\tret := &PostContent{\n\t\tCategory: categoryValue,\n\t\tHead:     headValue,\n\t\tBody:     bodyValue,\n\t\tDupBody:  dupBodyValue,\n\t\tCounts:   countsValue,\n\t}\n\n\treturn ret, nil\n}\n\n// cast_Org_Post_PostDataType__to__Org_Federation_PostType cast from \"org.post.PostDataType\" to \"org.federation.PostType\".\nfunc (s *FederationService) cast_Org_Post_PostDataType__to__Org_Federation_PostType(from post.PostDataType) (PostType, error) {\n\tvar ret PostType\n\tswitch from {\n\tcase post.PostDataType_POST_TYPE_A:\n\t\tret = PostType_POST_TYPE_FOO\n\tcase post.PostDataType_POST_TYPE_B:\n\t\tret = PostType_POST_TYPE_BAR\n\tcase post.PostDataType_POST_TYPE_C:\n\t\tret = PostType_POST_TYPE_BAR\n\tdefault:\n\t\tret = PostType_POST_TYPE_UNKNOWN\n\t}\n\treturn ret, nil\n}\n\n// cast_Org_Post_PostData__to__Org_Federation_PostData cast from \"org.post.PostData\" to \"org.federation.PostData\".\nfunc (s *FederationService) cast_Org_Post_PostData__to__Org_Federation_PostData(from *post.PostData) (*PostData, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\ttypeValue, err := s.cast_Org_Post_PostDataType__to__Org_Federation_PostType(from.GetType())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\ttitleValue := from.GetTitle()\n\tcontentValue, err := s.cast_Org_Post_PostContent__to__Org_Federation_PostContent(from.GetContent())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret := &PostData{\n\t\tType:    typeValue,\n\t\tTitle:   titleValue,\n\t\tContent: contentValue,\n\t}\n\n\treturn ret, nil\n}\n\n// cast_Org_Post_V2_PostContent_Category__to__Org_Federation_PostContent_Category cast from \"org.post.v2.PostContent.Category\" to \"org.federation.PostContent.Category\".\nfunc (s *FederationService) cast_Org_Post_V2_PostContent_Category__to__Org_Federation_PostContent_Category(from post1.PostContent_Category) (PostContent_Category, error) {\n\tvar ret PostContent_Category\n\tswitch from {\n\tcase post1.PostContent_CATEGORY_A:\n\t\tret = PostContent_CATEGORY_A\n\tcase post1.PostContent_CATEGORY_B:\n\t\tret = PostContent_CATEGORY_B\n\tdefault:\n\t\tret = 0\n\t}\n\treturn ret, nil\n}\n\n// cast_Org_Post_V2_PostContent__to__Org_Federation_PostContent cast from \"org.post.v2.PostContent\" to \"org.federation.PostContent\".\nfunc (s *FederationService) cast_Org_Post_V2_PostContent__to__Org_Federation_PostContent(from *post1.PostContent) (*PostContent, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tcategoryValue, err := s.cast_Org_Post_V2_PostContent_Category__to__Org_Federation_PostContent_Category(from.GetCategory())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\theadValue := from.GetHead()\n\tbodyValue := from.GetBody()\n\tdupBodyValue := from.GetBody()\n\tcountsValue := from.GetCounts()\n\tret := &PostContent{\n\t\tCategory: categoryValue,\n\t\tHead:     headValue,\n\t\tBody:     bodyValue,\n\t\tDupBody:  dupBodyValue,\n\t\tCounts:   countsValue,\n\t}\n\n\treturn ret, nil\n}\n\n// cast_Org_Post_V2_PostDataType__to__Org_Federation_PostType cast from \"org.post.v2.PostDataType\" to \"org.federation.PostType\".\nfunc (s *FederationService) cast_Org_Post_V2_PostDataType__to__Org_Federation_PostType(from post1.PostDataType) (PostType, error) {\n\tvar ret PostType\n\tswitch from {\n\tcase post1.PostDataType_POST_TYPE_A:\n\t\tret = PostType_POST_TYPE_FOO\n\tcase post1.PostDataType_POST_V2_TYPE_B:\n\t\tret = PostType_POST_TYPE_BAR\n\tcase post1.PostDataType_POST_V2_TYPE_C:\n\t\tret = PostType_POST_TYPE_BAR\n\tdefault:\n\t\tret = PostType_POST_TYPE_UNKNOWN\n\t}\n\treturn ret, nil\n}\n\n// cast_Org_Post_V2_PostData__to__Org_Federation_PostData cast from \"org.post.v2.PostData\" to \"org.federation.PostData\".\nfunc (s *FederationService) cast_Org_Post_V2_PostData__to__Org_Federation_PostData(from *post1.PostData) (*PostData, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\ttypeValue, err := s.cast_Org_Post_V2_PostDataType__to__Org_Federation_PostType(from.GetType())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\ttitleValue := from.GetTitle()\n\tcontentValue, err := s.cast_Org_Post_V2_PostContent__to__Org_Federation_PostContent(from.GetContent())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret := &PostData{\n\t\tType:    typeValue,\n\t\tTitle:   titleValue,\n\t\tContent: contentValue,\n\t}\n\n\treturn ret, nil\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostRequest_ConditionA(v *GetPostRequest_ConditionA) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"prop\", v.GetProp()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostRequest_ConditionB(v *GetPostRequest_ConditionB) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostResponse(v *GetPostResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"post\", s.logvalue_Org_Federation_Post(v.GetPost())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostResponseArgument(v *FederationService_Org_Federation_GetPostResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t\tslog.Any(\"a\", s.logvalue_Org_Federation_GetPostRequest_ConditionA(v.A)),\n\t\tslog.Any(\"condition_b\", s.logvalue_Org_Federation_GetPostRequest_ConditionB(v.ConditionB)),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_Post(v *Post) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.Any(\"data\", s.logvalue_Org_Federation_PostData(v.GetData())),\n\t\tslog.Any(\"data2\", s.logvalue_Org_Federation_PostData(v.GetData2())),\n\t\tslog.String(\"type\", s.logvalue_Org_Federation_PostType(v.GetType()).String()),\n\t\tslog.String(\"type2\", s.logvalue_Org_Federation_PostType(v.GetType2()).String()),\n\t\tslog.String(\"type3\", s.logvalue_Org_Federation_PostType(v.GetType3()).String()),\n\t\tslog.String(\"type4\", s.logvalue_Org_Federation_PostType(v.GetType4()).String()),\n\t\tslog.Any(\"m\", s.logvalue_Org_Post_M(v.GetM())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_PostArgument(v *FederationService_Org_Federation_PostArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t\tslog.Any(\"a\", s.logvalue_Org_Federation_GetPostRequest_ConditionA(v.A)),\n\t\tslog.Any(\"b\", s.logvalue_Org_Federation_GetPostRequest_ConditionB(v.B)),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_PostContent(v *PostContent) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"category\", s.logvalue_Org_Federation_PostContent_Category(v.GetCategory()).String()),\n\t\tslog.String(\"head\", v.GetHead()),\n\t\tslog.String(\"body\", v.GetBody()),\n\t\tslog.String(\"dup_body\", v.GetDupBody()),\n\t\tslog.Any(\"counts\", s.logvalue_Org_Federation_PostContent_CountsEntry(v.GetCounts())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_PostContent_Category(v PostContent_Category) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tswitch v {\n\tcase PostContent_CATEGORY_A:\n\t\treturn slog.StringValue(\"CATEGORY_A\")\n\tcase PostContent_CATEGORY_B:\n\t\treturn slog.StringValue(\"CATEGORY_B\")\n\tcase PostContent_CATEGORY_C:\n\t\treturn slog.StringValue(\"CATEGORY_C\")\n\t}\n\treturn slog.StringValue(\"\")\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_PostContent_CountsEntry(v map[int32]int32) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tattrs := make([]slog.Attr, 0, len(v))\n\tfor key, value := range v {\n\t\tattrs = append(attrs, slog.Attr{\n\t\t\tKey:   grpcfed.ToLogAttrKey(key),\n\t\t\tValue: slog.AnyValue(value),\n\t\t})\n\t}\n\treturn slog.GroupValue(attrs...)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_PostData(v *PostData) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"type\", s.logvalue_Org_Federation_PostType(v.GetType()).String()),\n\t\tslog.String(\"title\", v.GetTitle()),\n\t\tslog.Any(\"content\", s.logvalue_Org_Federation_PostContent(v.GetContent())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_PostType(v PostType) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tswitch v {\n\tcase PostType_POST_TYPE_UNKNOWN:\n\t\treturn slog.StringValue(\"POST_TYPE_UNKNOWN\")\n\tcase PostType_POST_TYPE_FOO:\n\t\treturn slog.StringValue(\"POST_TYPE_FOO\")\n\tcase PostType_POST_TYPE_BAR:\n\t\treturn slog.StringValue(\"POST_TYPE_BAR\")\n\tcase PostType_POST_TYPE_BAZ:\n\t\treturn slog.StringValue(\"POST_TYPE_BAZ\")\n\t}\n\treturn slog.StringValue(\"\")\n}\n\nfunc (s *FederationService) logvalue_Org_Post_GetPostRequest(v *post.GetPostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.Any(\"a\", s.logvalue_Org_Post_PostConditionA(v.GetA())),\n\t\tslog.Any(\"b\", s.logvalue_Org_Post_PostConditionB(v.GetB())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_M(v *post.M) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"x\", v.GetX()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_PostConditionA(v *post.PostConditionA) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"prop\", v.GetProp()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_PostConditionB(v *post.PostConditionB) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Post_V2_GetPostRequest(v *post1.GetPostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t)\n}\n"
  },
  {
    "path": "_examples/06_alias/go.mod",
    "content": "module example\n\ngo 1.24.0\n\nreplace github.com/mercari/grpc-federation => ../../\n\nrequire (\n\tgithub.com/google/go-cmp v0.7.0\n\tgithub.com/mercari/grpc-federation v0.0.0-00010101000000-000000000000\n\tgo.opentelemetry.io/otel v1.24.0\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0\n\tgo.opentelemetry.io/otel/sdk v1.24.0\n\tgo.opentelemetry.io/otel/trace v1.24.0\n\tgo.uber.org/goleak v1.3.0\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7\n\tgoogle.golang.org/grpc v1.65.0\n\tgoogle.golang.org/protobuf v1.34.2\n)\n\nrequire (\n\tcel.dev/expr v0.19.1 // indirect\n\tgithub.com/antlr4-go/antlr/v4 v4.13.0 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.2.1 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/goccy/wasi-go v0.3.2 // indirect\n\tgithub.com/google/cel-go v0.23.1 // indirect\n\tgithub.com/google/uuid v1.6.0 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect\n\tgithub.com/kelseyhightower/envconfig v1.4.0 // indirect\n\tgithub.com/stealthrocket/wazergo v0.19.1 // indirect\n\tgithub.com/stoewer/go-strcase v1.3.0 // indirect\n\tgithub.com/tetratelabs/wazero v1.10.1 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.24.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.0.0 // indirect\n\tgolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect\n\tgolang.org/x/net v0.38.0 // indirect\n\tgolang.org/x/sync v0.14.0 // indirect\n\tgolang.org/x/sys v0.37.0 // indirect\n\tgolang.org/x/text v0.23.0 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 // indirect\n)\n"
  },
  {
    "path": "_examples/06_alias/go.sum",
    "content": "cel.dev/expr v0.19.1 h1:NciYrtDRIR0lNCnH1LFJegdjspNx9fI59O7TWcua/W4=\ncel.dev/expr v0.19.1/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw=\ngithub.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=\ngithub.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/goccy/wasi-go v0.3.2 h1:wAvGXmqCkfcp0B0AwIp5Ya53hzDwkKm9W8iuT3nCCz0=\ngithub.com/goccy/wasi-go v0.3.2/go.mod h1:nIKD204n9xa4Z20UV+XA483kIr9TAl2vXr+X5qVAO5M=\ngithub.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4=\ngithub.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=\ngithub.com/google/cel-go v0.23.1 h1:91ThhEZlBcE5rB2adBVXqvDoqdL8BG2oyhd0bK1I/r4=\ngithub.com/google/cel-go v0.23.1/go.mod h1:52Pb6QsDbC5kvgxvZhiL9QX1oZEkcUF/ZqaPx1J5Wwo=\ngithub.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\ngithub.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg=\ngithub.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=\ngithub.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/stealthrocket/wazergo v0.19.1 h1:BPrITETPgSFwiytwmToO0MbUC/+RGC39JScz1JmmG6c=\ngithub.com/stealthrocket/wazergo v0.19.1/go.mod h1:riI0hxw4ndZA5e6z7PesHg2BtTftcZaMxRcoiGGipTs=\ngithub.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs=\ngithub.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tetratelabs/wazero v1.10.1 h1:2DugeJf6VVk58KTPszlNfeeN8AhhpwcZqkJj2wwFuH8=\ngithub.com/tetratelabs/wazero v1.10.1/go.mod h1:DRm5twOQ5Gr1AoEdSi0CLjDQF1J9ZAuyqFIjl1KKfQU=\ngo.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo=\ngo.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0=\ngo.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI=\ngo.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=\ngo.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw=\ngo.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg=\ngo.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=\ngo.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=\ngo.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=\ngo.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=\ngolang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=\ngolang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=\ngolang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=\ngolang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=\ngolang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=\ngolang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=\ngolang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 h1:YcyjlL1PRr2Q17/I0dPk2JmYS5CDXfcdb2Z3YRioEbw=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7 h1:2035KHhUv+EpyB+hWgJnaWKJOdX1E95w2S8Rr4uWKTs=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=\ngoogle.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=\ngoogle.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=\ngoogle.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=\ngoogle.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "_examples/06_alias/grpc/federation/federation.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: grpc/federation/federation.proto\n\npackage federation\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\tcode \"google.golang.org/genproto/googleapis/rpc/code\"\n\terrdetails \"google.golang.org/genproto/googleapis/rpc/errdetails\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tdescriptorpb \"google.golang.org/protobuf/types/descriptorpb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// TypeKind is primitive kind list.\ntype TypeKind int32\n\nconst (\n\t// UNKNOWN represents unexpected value.\n\tTypeKind_UNKNOWN TypeKind = 0\n\t// STRING is used to convert the input value to `string` type.\n\tTypeKind_STRING TypeKind = 1\n\t// BOOL is used to convert the input value to `bool` type.\n\tTypeKind_BOOL TypeKind = 2\n\t// INT64 is used to convert the input value to `int64` type.\n\tTypeKind_INT64 TypeKind = 3\n\t// UINT64 is used to convert the input value to `uint64` type.\n\tTypeKind_UINT64 TypeKind = 4\n\t// DOUBLE is used to convert the input value to `double` type.\n\tTypeKind_DOUBLE TypeKind = 5\n\t// DURATION is used to convert the input value to the `google.protobuf.Duration` type.\n\tTypeKind_DURATION TypeKind = 6\n)\n\n// Enum value maps for TypeKind.\nvar (\n\tTypeKind_name = map[int32]string{\n\t\t0: \"UNKNOWN\",\n\t\t1: \"STRING\",\n\t\t2: \"BOOL\",\n\t\t3: \"INT64\",\n\t\t4: \"UINT64\",\n\t\t5: \"DOUBLE\",\n\t\t6: \"DURATION\",\n\t}\n\tTypeKind_value = map[string]int32{\n\t\t\"UNKNOWN\":  0,\n\t\t\"STRING\":   1,\n\t\t\"BOOL\":     2,\n\t\t\"INT64\":    3,\n\t\t\"UINT64\":   4,\n\t\t\"DOUBLE\":   5,\n\t\t\"DURATION\": 6,\n\t}\n)\n\nfunc (x TypeKind) Enum() *TypeKind {\n\tp := new(TypeKind)\n\t*p = x\n\treturn p\n}\n\nfunc (x TypeKind) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (TypeKind) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_grpc_federation_federation_proto_enumTypes[0].Descriptor()\n}\n\nfunc (TypeKind) Type() protoreflect.EnumType {\n\treturn &file_grpc_federation_federation_proto_enumTypes[0]\n}\n\nfunc (x TypeKind) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use TypeKind.Descriptor instead.\nfunc (TypeKind) EnumDescriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\n// LogLevel is the importance or severity of a log event.\ntype GRPCError_LogLevel int32\n\nconst (\n\t// UNKNOWN represents unexpected value.\n\tGRPCError_UNKNOWN GRPCError_LogLevel = 0\n\t// DEBUG is used for detailed information that is useful during development and debugging.\n\tGRPCError_DEBUG GRPCError_LogLevel = 1\n\t// INFO logs are used to provide information about the normal functioning of the application.\n\tGRPCError_INFO GRPCError_LogLevel = 2\n\t// WARN signifies a potential problem or warning that does not necessarily stop the program from working but may lead to issues in the future.\n\tGRPCError_WARN GRPCError_LogLevel = 3\n\t// ERROR indicates a serious issue that has caused a failure in the application.\n\tGRPCError_ERROR GRPCError_LogLevel = 4\n)\n\n// Enum value maps for GRPCError_LogLevel.\nvar (\n\tGRPCError_LogLevel_name = map[int32]string{\n\t\t0: \"UNKNOWN\",\n\t\t1: \"DEBUG\",\n\t\t2: \"INFO\",\n\t\t3: \"WARN\",\n\t\t4: \"ERROR\",\n\t}\n\tGRPCError_LogLevel_value = map[string]int32{\n\t\t\"UNKNOWN\": 0,\n\t\t\"DEBUG\":   1,\n\t\t\"INFO\":    2,\n\t\t\"WARN\":    3,\n\t\t\"ERROR\":   4,\n\t}\n)\n\nfunc (x GRPCError_LogLevel) Enum() *GRPCError_LogLevel {\n\tp := new(GRPCError_LogLevel)\n\t*p = x\n\treturn p\n}\n\nfunc (x GRPCError_LogLevel) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (GRPCError_LogLevel) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_grpc_federation_federation_proto_enumTypes[1].Descriptor()\n}\n\nfunc (GRPCError_LogLevel) Type() protoreflect.EnumType {\n\treturn &file_grpc_federation_federation_proto_enumTypes[1]\n}\n\nfunc (x GRPCError_LogLevel) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use GRPCError_LogLevel.Descriptor instead.\nfunc (GRPCError_LogLevel) EnumDescriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{24, 0}\n}\n\ntype FileRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPlugin *CELPlugin `protobuf:\"bytes,1,opt,name=plugin,proto3\" json:\"plugin,omitempty\"`\n\t// import can be used to resolve methods, messages, etc. that are referenced in gRPC Federation rules.\n\tImport []string `protobuf:\"bytes,2,rep,name=import,proto3\" json:\"import,omitempty\"`\n}\n\nfunc (x *FileRule) Reset() {\n\t*x = FileRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *FileRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*FileRule) ProtoMessage() {}\n\nfunc (x *FileRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use FileRule.ProtoReflect.Descriptor instead.\nfunc (*FileRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *FileRule) GetPlugin() *CELPlugin {\n\tif x != nil {\n\t\treturn x.Plugin\n\t}\n\treturn nil\n}\n\nfunc (x *FileRule) GetImport() []string {\n\tif x != nil {\n\t\treturn x.Import\n\t}\n\treturn nil\n}\n\ntype EnumRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// alias mapping between enums defined in other packages and enums defined on the federation service side.\n\t// The alias is the FQDN ( <package-name>.<enum-name> ) to the enum.\n\t// If this definition exists, type conversion is automatically performed before the enum value assignment operation.\n\t// If a enum with this option has a value that is not present in the enum specified by alias, and the alias option is not specified for that value, an error is occurred.\n\t// You can specify multiple aliases. In that case, only values common to all aliases will be considered.\n\t// Specifying a value that is not included in either alias will result in an error.\n\tAlias []string `protobuf:\"bytes,1,rep,name=alias,proto3\" json:\"alias,omitempty\"`\n}\n\nfunc (x *EnumRule) Reset() {\n\t*x = EnumRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumRule) ProtoMessage() {}\n\nfunc (x *EnumRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumRule.ProtoReflect.Descriptor instead.\nfunc (*EnumRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *EnumRule) GetAlias() []string {\n\tif x != nil {\n\t\treturn x.Alias\n\t}\n\treturn nil\n}\n\ntype EnumValueRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// specifies the default value of the enum.\n\t// All values other than those specified in alias will be default values.\n\tDefault *bool `protobuf:\"varint,1,opt,name=default,proto3,oneof\" json:\"default,omitempty\"`\n\t// alias can be used when alias is specified in grpc.federation.enum option,\n\t// and specifies the value name to be referenced among the enums specified in alias of enum option.\n\t// multiple value names can be specified for alias.\n\tAlias []string `protobuf:\"bytes,2,rep,name=alias,proto3\" json:\"alias,omitempty\"`\n\t// attr is used to hold multiple name-value pairs corresponding to an enum value.\n\t// The values specified by the name must be consistently specified for all enum values.\n\t// The values stored using this feature can be retrieved using the `attr()` method of the enum API.\n\tAttr []*EnumValueAttribute `protobuf:\"bytes,3,rep,name=attr,proto3\" json:\"attr,omitempty\"`\n\t// noalias exclude from the target of alias.\n\t// This option cannot be specified simultaneously with `default` or `alias`.\n\tNoalias *bool `protobuf:\"varint,4,opt,name=noalias,proto3,oneof\" json:\"noalias,omitempty\"`\n}\n\nfunc (x *EnumValueRule) Reset() {\n\t*x = EnumValueRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumValueRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumValueRule) ProtoMessage() {}\n\nfunc (x *EnumValueRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumValueRule.ProtoReflect.Descriptor instead.\nfunc (*EnumValueRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *EnumValueRule) GetDefault() bool {\n\tif x != nil && x.Default != nil {\n\t\treturn *x.Default\n\t}\n\treturn false\n}\n\nfunc (x *EnumValueRule) GetAlias() []string {\n\tif x != nil {\n\t\treturn x.Alias\n\t}\n\treturn nil\n}\n\nfunc (x *EnumValueRule) GetAttr() []*EnumValueAttribute {\n\tif x != nil {\n\t\treturn x.Attr\n\t}\n\treturn nil\n}\n\nfunc (x *EnumValueRule) GetNoalias() bool {\n\tif x != nil && x.Noalias != nil {\n\t\treturn *x.Noalias\n\t}\n\treturn false\n}\n\ntype EnumValueAttribute struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the attribute key.\n\t// This value is used to search for values using the `attr(<name>)` method.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// value represents the value corresponding to `name`.\n\tValue string `protobuf:\"bytes,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *EnumValueAttribute) Reset() {\n\t*x = EnumValueAttribute{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumValueAttribute) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumValueAttribute) ProtoMessage() {}\n\nfunc (x *EnumValueAttribute) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumValueAttribute.ProtoReflect.Descriptor instead.\nfunc (*EnumValueAttribute) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *EnumValueAttribute) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnumValueAttribute) GetValue() string {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn \"\"\n}\n\ntype OneofRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *OneofRule) Reset() {\n\t*x = OneofRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *OneofRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*OneofRule) ProtoMessage() {}\n\nfunc (x *OneofRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use OneofRule.ProtoReflect.Descriptor instead.\nfunc (*OneofRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{4}\n}\n\n// ServiceRule define gRPC Federation rules for the service.\ntype ServiceRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// env defines the environment variable.\n\tEnv *Env `protobuf:\"bytes,1,opt,name=env,proto3\" json:\"env,omitempty\"`\n\t// var defines the service-level variables.\n\tVar []*ServiceVariable `protobuf:\"bytes,2,rep,name=var,proto3\" json:\"var,omitempty\"`\n}\n\nfunc (x *ServiceRule) Reset() {\n\t*x = ServiceRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceRule) ProtoMessage() {}\n\nfunc (x *ServiceRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceRule.ProtoReflect.Descriptor instead.\nfunc (*ServiceRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *ServiceRule) GetEnv() *Env {\n\tif x != nil {\n\t\treturn x.Env\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceRule) GetVar() []*ServiceVariable {\n\tif x != nil {\n\t\treturn x.Var\n\t}\n\treturn nil\n}\n\n// Env is used when setting environment variables.\n// There are two ways to configure it.\ntype Env struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// var is used to directly list environment variables.\n\tVar []*EnvVar `protobuf:\"bytes,1,rep,name=var,proto3\" json:\"var,omitempty\"`\n\t// message is used to reference an already defined Protocol Buffers' message for defining environment variables.\n\t// If you want to set detailed options for the fields of the message, use the `env` option in FieldRule.\n\tMessage string `protobuf:\"bytes,2,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Env) Reset() {\n\t*x = Env{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Env) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Env) ProtoMessage() {}\n\nfunc (x *Env) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Env.ProtoReflect.Descriptor instead.\nfunc (*Env) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *Env) GetVar() []*EnvVar {\n\tif x != nil {\n\t\treturn x.Var\n\t}\n\treturn nil\n}\n\nfunc (x *Env) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\n// ServiceVariable define variables at the service level.\n// This definition is executed at server startup, after the initialization of Env.\n// The defined variables can be used across all messages that the service depends on.\ntype ServiceVariable struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is a variable name.\n\t// This name can be referenced in all CELs related to the service by using `grpc.federation.var.` prefix.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// if specify the condition for evaluating expr.\n\t// this value evaluated by CEL and it must return a boolean value.\n\t// If the result of evaluation is `false`, the value assigned to name is the default value of the result of evaluation of `expr`.\n\tIf *string `protobuf:\"bytes,2,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n\t// expr specify the value to be assigned to name.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*ServiceVariable_By\n\t//\t*ServiceVariable_Map\n\t//\t*ServiceVariable_Message\n\t//\t*ServiceVariable_Validation\n\t//\t*ServiceVariable_Enum\n\t//\t*ServiceVariable_Switch\n\tExpr isServiceVariable_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *ServiceVariable) Reset() {\n\t*x = ServiceVariable{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceVariable) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceVariable) ProtoMessage() {}\n\nfunc (x *ServiceVariable) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceVariable.ProtoReflect.Descriptor instead.\nfunc (*ServiceVariable) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{7}\n}\n\nfunc (x *ServiceVariable) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *ServiceVariable) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\nfunc (m *ServiceVariable) GetExpr() isServiceVariable_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetBy() string {\n\tif x, ok := x.GetExpr().(*ServiceVariable_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *ServiceVariable) GetMap() *MapExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetMessage() *MessageExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetValidation() *ServiceVariableValidationExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Validation); ok {\n\t\treturn x.Validation\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetEnum() *EnumExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetSwitch() *SwitchExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Switch); ok {\n\t\treturn x.Switch\n\t}\n\treturn nil\n}\n\ntype isServiceVariable_Expr interface {\n\tisServiceVariable_Expr()\n}\n\ntype ServiceVariable_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\ntype ServiceVariable_Map struct {\n\t// map apply map operation for the specified repeated type.\n\tMap *MapExpr `protobuf:\"bytes,12,opt,name=map,proto3,oneof\"`\n}\n\ntype ServiceVariable_Message struct {\n\t// message gets with message arguments.\n\tMessage *MessageExpr `protobuf:\"bytes,13,opt,name=message,proto3,oneof\"`\n}\n\ntype ServiceVariable_Validation struct {\n\t// validation defines the validation rule and message.\n\tValidation *ServiceVariableValidationExpr `protobuf:\"bytes,14,opt,name=validation,proto3,oneof\"`\n}\n\ntype ServiceVariable_Enum struct {\n\t// enum gets with cel value.\n\tEnum *EnumExpr `protobuf:\"bytes,15,opt,name=enum,proto3,oneof\"`\n}\n\ntype ServiceVariable_Switch struct {\n\t// switch provides conditional evaluation with multiple branches.\n\tSwitch *SwitchExpr `protobuf:\"bytes,16,opt,name=switch,proto3,oneof\"`\n}\n\nfunc (*ServiceVariable_By) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Map) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Message) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Validation) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Enum) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Switch) isServiceVariable_Expr() {}\n\n// ServiceVariableValidationExpr represents validation rule and error message.\ntype ServiceVariableValidationExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// if specifies condition in CEL. If the condition is true, it returns error.\n\t// The return value must always be of type boolean.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3\" json:\"if,omitempty\"`\n\t// message is a error message in CEL.\n\tMessage string `protobuf:\"bytes,2,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *ServiceVariableValidationExpr) Reset() {\n\t*x = ServiceVariableValidationExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceVariableValidationExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceVariableValidationExpr) ProtoMessage() {}\n\nfunc (x *ServiceVariableValidationExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceVariableValidationExpr.ProtoReflect.Descriptor instead.\nfunc (*ServiceVariableValidationExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{8}\n}\n\nfunc (x *ServiceVariableValidationExpr) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *ServiceVariableValidationExpr) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\n// EnvVar represents an environment variable.\ntype EnvVar struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is an environment variable name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// type is an environment variable type.\n\tType *EnvType `protobuf:\"bytes,2,opt,name=type,proto3\" json:\"type,omitempty\"`\n\t// option is an additional option for parsing environment variable.\n\tOption *EnvVarOption `protobuf:\"bytes,3,opt,name=option,proto3,oneof\" json:\"option,omitempty\"`\n}\n\nfunc (x *EnvVar) Reset() {\n\t*x = EnvVar{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvVar) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvVar) ProtoMessage() {}\n\nfunc (x *EnvVar) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvVar.ProtoReflect.Descriptor instead.\nfunc (*EnvVar) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{9}\n}\n\nfunc (x *EnvVar) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnvVar) GetType() *EnvType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nfunc (x *EnvVar) GetOption() *EnvVarOption {\n\tif x != nil {\n\t\treturn x.Option\n\t}\n\treturn nil\n}\n\n// EnvType represents type information for environment variable.\ntype EnvType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to Type:\n\t//\n\t//\t*EnvType_Kind\n\t//\t*EnvType_Repeated\n\t//\t*EnvType_Map\n\tType isEnvType_Type `protobuf_oneof:\"type\"`\n}\n\nfunc (x *EnvType) Reset() {\n\t*x = EnvType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[10]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvType) ProtoMessage() {}\n\nfunc (x *EnvType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[10]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvType.ProtoReflect.Descriptor instead.\nfunc (*EnvType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{10}\n}\n\nfunc (m *EnvType) GetType() isEnvType_Type {\n\tif m != nil {\n\t\treturn m.Type\n\t}\n\treturn nil\n}\n\nfunc (x *EnvType) GetKind() TypeKind {\n\tif x, ok := x.GetType().(*EnvType_Kind); ok {\n\t\treturn x.Kind\n\t}\n\treturn TypeKind_UNKNOWN\n}\n\nfunc (x *EnvType) GetRepeated() *EnvType {\n\tif x, ok := x.GetType().(*EnvType_Repeated); ok {\n\t\treturn x.Repeated\n\t}\n\treturn nil\n}\n\nfunc (x *EnvType) GetMap() *EnvMapType {\n\tif x, ok := x.GetType().(*EnvType_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\ntype isEnvType_Type interface {\n\tisEnvType_Type()\n}\n\ntype EnvType_Kind struct {\n\t// kind is used when the type is a primitive type.\n\tKind TypeKind `protobuf:\"varint,1,opt,name=kind,proto3,enum=grpc.federation.TypeKind,oneof\"`\n}\n\ntype EnvType_Repeated struct {\n\t// repeated is used when the type is a repeated type.\n\tRepeated *EnvType `protobuf:\"bytes,2,opt,name=repeated,proto3,oneof\"`\n}\n\ntype EnvType_Map struct {\n\t// map is used when the type is a map type.\n\tMap *EnvMapType `protobuf:\"bytes,3,opt,name=map,proto3,oneof\"`\n}\n\nfunc (*EnvType_Kind) isEnvType_Type() {}\n\nfunc (*EnvType_Repeated) isEnvType_Type() {}\n\nfunc (*EnvType_Map) isEnvType_Type() {}\n\n// EnvMapType represents map type.\ntype EnvMapType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// key represents map's key type.\n\tKey *EnvType `protobuf:\"bytes,1,opt,name=key,proto3\" json:\"key,omitempty\"`\n\t// value represents map's value type.\n\tValue *EnvType `protobuf:\"bytes,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *EnvMapType) Reset() {\n\t*x = EnvMapType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[11]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvMapType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvMapType) ProtoMessage() {}\n\nfunc (x *EnvMapType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[11]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvMapType.ProtoReflect.Descriptor instead.\nfunc (*EnvMapType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{11}\n}\n\nfunc (x *EnvMapType) GetKey() *EnvType {\n\tif x != nil {\n\t\treturn x.Key\n\t}\n\treturn nil\n}\n\nfunc (x *EnvMapType) GetValue() *EnvType {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn nil\n}\n\n// EnvVarOption represents additional option for environment variable.\n// The option work with the `envconfig` library in Go language.\n// For detailed specifications, please refer to the library's documentation ( https://pkg.go.dev/github.com/kelseyhightower/envconfig#section-readme ).\ntype EnvVarOption struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// alternate use this option if you want to use an environment variable with a different name than the value specified in `EnvVar.name`.\n\tAlternate *string `protobuf:\"bytes,1,opt,name=alternate,proto3,oneof\" json:\"alternate,omitempty\"`\n\t// default specify the value to use as a fallback if the specified environment variable is not found.\n\tDefault *string `protobuf:\"bytes,2,opt,name=default,proto3,oneof\" json:\"default,omitempty\"`\n\t// required require the environment variable to exist.\n\t// If it does not exist, an error will occur at startup.\n\tRequired *bool `protobuf:\"varint,3,opt,name=required,proto3,oneof\" json:\"required,omitempty\"`\n\t// ignored if ignored is true, it does nothing even if the environment variable exists.\n\tIgnored *bool `protobuf:\"varint,4,opt,name=ignored,proto3,oneof\" json:\"ignored,omitempty\"`\n}\n\nfunc (x *EnvVarOption) Reset() {\n\t*x = EnvVarOption{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[12]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvVarOption) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvVarOption) ProtoMessage() {}\n\nfunc (x *EnvVarOption) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[12]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvVarOption.ProtoReflect.Descriptor instead.\nfunc (*EnvVarOption) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{12}\n}\n\nfunc (x *EnvVarOption) GetAlternate() string {\n\tif x != nil && x.Alternate != nil {\n\t\treturn *x.Alternate\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnvVarOption) GetDefault() string {\n\tif x != nil && x.Default != nil {\n\t\treturn *x.Default\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnvVarOption) GetRequired() bool {\n\tif x != nil && x.Required != nil {\n\t\treturn *x.Required\n\t}\n\treturn false\n}\n\nfunc (x *EnvVarOption) GetIgnored() bool {\n\tif x != nil && x.Ignored != nil {\n\t\treturn *x.Ignored\n\t}\n\treturn false\n}\n\ntype MethodRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// the time to timeout. If the specified time period elapses, DEADLINE_EXCEEDED status is returned.\n\t// If you want to handle this error, you need to implement a custom error handler in Go.\n\t// The format is the same as Go's time.Duration format. See https://pkg.go.dev/time#ParseDuration.\n\tTimeout *string `protobuf:\"bytes,1,opt,name=timeout,proto3,oneof\" json:\"timeout,omitempty\"`\n\t// response specify the name of the message you want to use to create the response value.\n\t// If you specify a reserved type like `google.protobuf.Empty` as the response, you cannot define gRPC Federation options.\n\t// In such cases, you can specify a separate message to create the response value.\n\t// The specified response message must contain fields with the same names and types as all the fields in the original response.\n\tResponse *string `protobuf:\"bytes,2,opt,name=response,proto3,oneof\" json:\"response,omitempty\"`\n}\n\nfunc (x *MethodRule) Reset() {\n\t*x = MethodRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[13]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MethodRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MethodRule) ProtoMessage() {}\n\nfunc (x *MethodRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[13]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MethodRule.ProtoReflect.Descriptor instead.\nfunc (*MethodRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{13}\n}\n\nfunc (x *MethodRule) GetTimeout() string {\n\tif x != nil && x.Timeout != nil {\n\t\treturn *x.Timeout\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodRule) GetResponse() string {\n\tif x != nil && x.Response != nil {\n\t\treturn *x.Response\n\t}\n\treturn \"\"\n}\n\n// MessageRule define gRPC Federation rules for the message.\ntype MessageRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// def specify variables to be used in field binding by `grpc.federation.field` option.\n\tDef []*VariableDefinition `protobuf:\"bytes,1,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// if custom_resolver is true, the resolver for this message is implemented by Go.\n\t// If there are any values retrieved by resolver or messages, they are passed as arguments for custom resolver.\n\t// Each field of the message returned by the custom resolver is automatically bound.\n\t// If you want to change the binding process for a particular field, set `custom_resolver=true` option for that field.\n\tCustomResolver *bool `protobuf:\"varint,2,opt,name=custom_resolver,json=customResolver,proto3,oneof\" json:\"custom_resolver,omitempty\"`\n\t// alias mapping between messages defined in other packages and messages defined on the federation service side.\n\t// The alias is the FQDN ( <package-name>.<message-name> ) to the message.\n\t// If this definition exists, type conversion is automatically performed before the field assignment operation.\n\t// If a message with this option has a field that is not present in the message specified by alias, and the alias option is not specified for that field, an error is occurred.\n\t// You can specify multiple aliases. In that case, only fields common to all aliases will be considered.\n\t// Specifying a field that is not included in either alias will result in an error.\n\tAlias []string `protobuf:\"bytes,3,rep,name=alias,proto3\" json:\"alias,omitempty\"`\n}\n\nfunc (x *MessageRule) Reset() {\n\t*x = MessageRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[14]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MessageRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MessageRule) ProtoMessage() {}\n\nfunc (x *MessageRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[14]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MessageRule.ProtoReflect.Descriptor instead.\nfunc (*MessageRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{14}\n}\n\nfunc (x *MessageRule) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *MessageRule) GetCustomResolver() bool {\n\tif x != nil && x.CustomResolver != nil {\n\t\treturn *x.CustomResolver\n\t}\n\treturn false\n}\n\nfunc (x *MessageRule) GetAlias() []string {\n\tif x != nil {\n\t\treturn x.Alias\n\t}\n\treturn nil\n}\n\n// VariableDefinition represents variable definition.\ntype VariableDefinition struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is a variable name.\n\t// This name can be referenced in all CELs defined after itself in the same message.\n\t// It can also be referenced in `grpc.federation.field` option.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// if specify the condition for evaluating expr.\n\t// this value evaluated by CEL and it must return a boolean value.\n\t// If the result of evaluation is `false`, the value assigned to name is the default value of the result of evaluation of `expr`.\n\tIf *string `protobuf:\"bytes,2,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n\t// autobind if the result value of `expr` is a message type,\n\t// the value of a field with the same name and type as the field name of its own message is automatically assigned to the value of the field in the message.\n\t// If multiple autobinds are used at the same message,\n\t// you must explicitly use the `grpc.federation.field` option to do the binding yourself, since duplicate field names cannot be correctly determined as one.\n\tAutobind *bool `protobuf:\"varint,3,opt,name=autobind,proto3,oneof\" json:\"autobind,omitempty\"`\n\t// expr specify the value to be assigned to name.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*VariableDefinition_By\n\t//\t*VariableDefinition_Map\n\t//\t*VariableDefinition_Message\n\t//\t*VariableDefinition_Call\n\t//\t*VariableDefinition_Validation\n\t//\t*VariableDefinition_Enum\n\t//\t*VariableDefinition_Switch\n\tExpr isVariableDefinition_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *VariableDefinition) Reset() {\n\t*x = VariableDefinition{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[15]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *VariableDefinition) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*VariableDefinition) ProtoMessage() {}\n\nfunc (x *VariableDefinition) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[15]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use VariableDefinition.ProtoReflect.Descriptor instead.\nfunc (*VariableDefinition) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{15}\n}\n\nfunc (x *VariableDefinition) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *VariableDefinition) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *VariableDefinition) GetAutobind() bool {\n\tif x != nil && x.Autobind != nil {\n\t\treturn *x.Autobind\n\t}\n\treturn false\n}\n\nfunc (m *VariableDefinition) GetExpr() isVariableDefinition_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetBy() string {\n\tif x, ok := x.GetExpr().(*VariableDefinition_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *VariableDefinition) GetMap() *MapExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetMessage() *MessageExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetCall() *CallExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Call); ok {\n\t\treturn x.Call\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetValidation() *ValidationExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Validation); ok {\n\t\treturn x.Validation\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetEnum() *EnumExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetSwitch() *SwitchExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Switch); ok {\n\t\treturn x.Switch\n\t}\n\treturn nil\n}\n\ntype isVariableDefinition_Expr interface {\n\tisVariableDefinition_Expr()\n}\n\ntype VariableDefinition_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\ntype VariableDefinition_Map struct {\n\t// map apply map operation for the specified repeated type.\n\tMap *MapExpr `protobuf:\"bytes,12,opt,name=map,proto3,oneof\"`\n}\n\ntype VariableDefinition_Message struct {\n\t// message gets with message arguments.\n\tMessage *MessageExpr `protobuf:\"bytes,13,opt,name=message,proto3,oneof\"`\n}\n\ntype VariableDefinition_Call struct {\n\t// call specifies how to call gRPC method.\n\tCall *CallExpr `protobuf:\"bytes,14,opt,name=call,proto3,oneof\"`\n}\n\ntype VariableDefinition_Validation struct {\n\t// validation defines the validation rule and error.\n\tValidation *ValidationExpr `protobuf:\"bytes,15,opt,name=validation,proto3,oneof\"`\n}\n\ntype VariableDefinition_Enum struct {\n\t// enum gets with cel value.\n\tEnum *EnumExpr `protobuf:\"bytes,16,opt,name=enum,proto3,oneof\"`\n}\n\ntype VariableDefinition_Switch struct {\n\t// switch provides conditional evaluation with multiple branches.\n\tSwitch *SwitchExpr `protobuf:\"bytes,17,opt,name=switch,proto3,oneof\"`\n}\n\nfunc (*VariableDefinition_By) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Map) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Message) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Call) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Validation) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Enum) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Switch) isVariableDefinition_Expr() {}\n\n// MapExpr apply map operation for the specified repeated type.\ntype MapExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// iterator define iterator variable.\n\t// When evaluating CEL in `expr`, we can refer to the name defined in iterator.\n\tIterator *Iterator `protobuf:\"bytes,1,opt,name=iterator,proto3\" json:\"iterator,omitempty\"`\n\t// expr creates map elements using iterator variable.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*MapExpr_By\n\t//\t*MapExpr_Message\n\t//\t*MapExpr_Enum\n\tExpr isMapExpr_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *MapExpr) Reset() {\n\t*x = MapExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[16]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MapExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MapExpr) ProtoMessage() {}\n\nfunc (x *MapExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[16]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MapExpr.ProtoReflect.Descriptor instead.\nfunc (*MapExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{16}\n}\n\nfunc (x *MapExpr) GetIterator() *Iterator {\n\tif x != nil {\n\t\treturn x.Iterator\n\t}\n\treturn nil\n}\n\nfunc (m *MapExpr) GetExpr() isMapExpr_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *MapExpr) GetBy() string {\n\tif x, ok := x.GetExpr().(*MapExpr_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *MapExpr) GetMessage() *MessageExpr {\n\tif x, ok := x.GetExpr().(*MapExpr_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *MapExpr) GetEnum() *EnumExpr {\n\tif x, ok := x.GetExpr().(*MapExpr_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn nil\n}\n\ntype isMapExpr_Expr interface {\n\tisMapExpr_Expr()\n}\n\ntype MapExpr_By struct {\n\t// `by` evaluates with CEL.\n\t// this can refer to the variable declared by `iterator`.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\ntype MapExpr_Message struct {\n\t// message gets with message arguments, and it is made an element of the map.\n\t// The result type of MapExpr is the repeated type of the specified message.\n\tMessage *MessageExpr `protobuf:\"bytes,12,opt,name=message,proto3,oneof\"`\n}\n\ntype MapExpr_Enum struct {\n\t// enum creates enum value for each element of the map.\n\t// The result type of MapExpr is the repeated type of the specified enum.\n\tEnum *EnumExpr `protobuf:\"bytes,13,opt,name=enum,proto3,oneof\"`\n}\n\nfunc (*MapExpr_By) isMapExpr_Expr() {}\n\nfunc (*MapExpr_Message) isMapExpr_Expr() {}\n\nfunc (*MapExpr_Enum) isMapExpr_Expr() {}\n\n// Iterator represents iterator variable.\ntype Iterator struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// variable name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// src the value that will be the source for creating the iterator.\n\t// src must be a repeated type.\n\tSrc string `protobuf:\"bytes,2,opt,name=src,proto3\" json:\"src,omitempty\"`\n}\n\nfunc (x *Iterator) Reset() {\n\t*x = Iterator{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[17]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Iterator) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Iterator) ProtoMessage() {}\n\nfunc (x *Iterator) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[17]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Iterator.ProtoReflect.Descriptor instead.\nfunc (*Iterator) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{17}\n}\n\nfunc (x *Iterator) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Iterator) GetSrc() string {\n\tif x != nil {\n\t\treturn x.Src\n\t}\n\treturn \"\"\n}\n\n// MessageExpr represents dependent message.\ntype MessageExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name specify the message name by FQDN. format is `<package-name>.<message-name>`.\n\t// <package-name> can be omitted when referring to messages in the same package.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// args specify the parameters needed to get the message. This is called the \"message arguments\".\n\tArgs []*Argument `protobuf:\"bytes,2,rep,name=args,proto3\" json:\"args,omitempty\"`\n}\n\nfunc (x *MessageExpr) Reset() {\n\t*x = MessageExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[18]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MessageExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MessageExpr) ProtoMessage() {}\n\nfunc (x *MessageExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[18]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MessageExpr.ProtoReflect.Descriptor instead.\nfunc (*MessageExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{18}\n}\n\nfunc (x *MessageExpr) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *MessageExpr) GetArgs() []*Argument {\n\tif x != nil {\n\t\treturn x.Args\n\t}\n\treturn nil\n}\n\n// EnumExpr represents dependent enum.\ntype EnumExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name specify the enum name by FQDN. format is `<package-name>.<enum-name>`.\n\t// <package-name> can be omitted when referring to enum in the same package.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,2,opt,name=by,proto3\" json:\"by,omitempty\"`\n}\n\nfunc (x *EnumExpr) Reset() {\n\t*x = EnumExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[19]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumExpr) ProtoMessage() {}\n\nfunc (x *EnumExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[19]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumExpr.ProtoReflect.Descriptor instead.\nfunc (*EnumExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{19}\n}\n\nfunc (x *EnumExpr) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnumExpr) GetBy() string {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\n// CallExpr represents how to call gRPC method.\ntype CallExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// method specify the FQDN for the gRPC method. format is `<package-name>.<service-name>/<method-name>`.\n\tMethod string `protobuf:\"bytes,1,opt,name=method,proto3\" json:\"method,omitempty\"`\n\t// request specify request parameters for the gRPC method.\n\tRequest []*MethodRequest `protobuf:\"bytes,2,rep,name=request,proto3\" json:\"request,omitempty\"`\n\t// the time to timeout. If the specified time period elapses, DEADLINE_EXCEEDED status is returned.\n\t// If you want to handle this error, you need to implement a custom error handler in Go.\n\t// The format is the same as Go's time.Duration format. See https://pkg.go.dev/time#ParseDuration.\n\tTimeout *string `protobuf:\"bytes,3,opt,name=timeout,proto3,oneof\" json:\"timeout,omitempty\"`\n\t// retry specifies the retry policy if the method call fails.\n\tRetry *RetryPolicy `protobuf:\"bytes,4,opt,name=retry,proto3,oneof\" json:\"retry,omitempty\"`\n\t// error evaluated when an error occurs during a method call.\n\t// Multiple errors can be defined and are evaluated in the order in which they are described.\n\t// If an error occurs while creating an gRPC status error, original error will be returned.\n\tError []*GRPCError `protobuf:\"bytes,5,rep,name=error,proto3\" json:\"error,omitempty\"`\n\t// option is the gRPC's call option (https://pkg.go.dev/google.golang.org/grpc#CallOption).\n\tOption *GRPCCallOption `protobuf:\"bytes,6,opt,name=option,proto3,oneof\" json:\"option,omitempty\"`\n\t// metadata specify outgoing metadata with CEL value.\n\t// The specified type must always be of type map<string, repeated string>.\n\tMetadata *string `protobuf:\"bytes,7,opt,name=metadata,proto3,oneof\" json:\"metadata,omitempty\"`\n}\n\nfunc (x *CallExpr) Reset() {\n\t*x = CallExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[20]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CallExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CallExpr) ProtoMessage() {}\n\nfunc (x *CallExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[20]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CallExpr.ProtoReflect.Descriptor instead.\nfunc (*CallExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{20}\n}\n\nfunc (x *CallExpr) GetMethod() string {\n\tif x != nil {\n\t\treturn x.Method\n\t}\n\treturn \"\"\n}\n\nfunc (x *CallExpr) GetRequest() []*MethodRequest {\n\tif x != nil {\n\t\treturn x.Request\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetTimeout() string {\n\tif x != nil && x.Timeout != nil {\n\t\treturn *x.Timeout\n\t}\n\treturn \"\"\n}\n\nfunc (x *CallExpr) GetRetry() *RetryPolicy {\n\tif x != nil {\n\t\treturn x.Retry\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetError() []*GRPCError {\n\tif x != nil {\n\t\treturn x.Error\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetOption() *GRPCCallOption {\n\tif x != nil {\n\t\treturn x.Option\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetMetadata() string {\n\tif x != nil && x.Metadata != nil {\n\t\treturn *x.Metadata\n\t}\n\treturn \"\"\n}\n\n// SwitchExpr represents a switch statement. At least one \"case\", and \"default\", must be defined. All\n// case.if expressions must evaluate to a boolean value. All case.by expressions, and default.by, must\n// evaluate to the same type (the return type of the switch).\n//\n// When executed, the case.if expressions are evaluated in order, and, for the first case whose\n// case.if expression evaluates to true, its case.by is evaluated to make the return value of the\n// SwitchExpr.\n// If no case.if evaluates to true, default.by is evaluated to make the return value.\ntype SwitchExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Cases for the switch expression.\n\tCase []*SwitchCaseExpr `protobuf:\"bytes,1,rep,name=case,proto3\" json:\"case,omitempty\"`\n\t// The default case, if none of the \"case.if\" expressions evaluate to true.\n\tDefault *SwitchDefaultExpr `protobuf:\"bytes,2,opt,name=default,proto3\" json:\"default,omitempty\"`\n}\n\nfunc (x *SwitchExpr) Reset() {\n\t*x = SwitchExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[21]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SwitchExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SwitchExpr) ProtoMessage() {}\n\nfunc (x *SwitchExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[21]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SwitchExpr.ProtoReflect.Descriptor instead.\nfunc (*SwitchExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{21}\n}\n\nfunc (x *SwitchExpr) GetCase() []*SwitchCaseExpr {\n\tif x != nil {\n\t\treturn x.Case\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchExpr) GetDefault() *SwitchDefaultExpr {\n\tif x != nil {\n\t\treturn x.Default\n\t}\n\treturn nil\n}\n\n// SwitchCaseExpr represents a single case for a switch expression.\ntype SwitchCaseExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// if specify the condition for evaluating expr.\n\t// this value evaluated by CEL and it must return a boolean value.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3\" json:\"if,omitempty\"`\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,2,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// expr specify the value to return for the case.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*SwitchCaseExpr_By\n\tExpr isSwitchCaseExpr_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *SwitchCaseExpr) Reset() {\n\t*x = SwitchCaseExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[22]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SwitchCaseExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SwitchCaseExpr) ProtoMessage() {}\n\nfunc (x *SwitchCaseExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[22]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SwitchCaseExpr.ProtoReflect.Descriptor instead.\nfunc (*SwitchCaseExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{22}\n}\n\nfunc (x *SwitchCaseExpr) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *SwitchCaseExpr) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (m *SwitchCaseExpr) GetExpr() isSwitchCaseExpr_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchCaseExpr) GetBy() string {\n\tif x, ok := x.GetExpr().(*SwitchCaseExpr_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\ntype isSwitchCaseExpr_Expr interface {\n\tisSwitchCaseExpr_Expr()\n}\n\ntype SwitchCaseExpr_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\nfunc (*SwitchCaseExpr_By) isSwitchCaseExpr_Expr() {}\n\n// SwitchDefaultExpr represents the default case for a switch expression.\ntype SwitchDefaultExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,1,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// expr specify the value to return for the default case.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*SwitchDefaultExpr_By\n\tExpr isSwitchDefaultExpr_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *SwitchDefaultExpr) Reset() {\n\t*x = SwitchDefaultExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[23]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SwitchDefaultExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SwitchDefaultExpr) ProtoMessage() {}\n\nfunc (x *SwitchDefaultExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[23]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SwitchDefaultExpr.ProtoReflect.Descriptor instead.\nfunc (*SwitchDefaultExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{23}\n}\n\nfunc (x *SwitchDefaultExpr) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (m *SwitchDefaultExpr) GetExpr() isSwitchDefaultExpr_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchDefaultExpr) GetBy() string {\n\tif x, ok := x.GetExpr().(*SwitchDefaultExpr_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\ntype isSwitchDefaultExpr_Expr interface {\n\tisSwitchDefaultExpr_Expr()\n}\n\ntype SwitchDefaultExpr_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\nfunc (*SwitchDefaultExpr_By) isSwitchDefaultExpr_Expr() {}\n\n// GRPCError create gRPC status value.\ntype GRPCError struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,1,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// if specifies condition in CEL. If the condition is true, it returns defined error information.\n\t// If this field is omitted, it is always treated as 'true' and returns defined error information.\n\t// The return value must always be of type boolean.\n\tIf *string `protobuf:\"bytes,2,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n\t// code is a gRPC status code.\n\tCode *code.Code `protobuf:\"varint,3,opt,name=code,proto3,enum=google.rpc.Code,oneof\" json:\"code,omitempty\"`\n\t// message is a gRPC status message.\n\t// If omitted, the message will be auto-generated from the configurations.\n\tMessage *string `protobuf:\"bytes,4,opt,name=message,proto3,oneof\" json:\"message,omitempty\"`\n\t// details is a list of error details.\n\t// If returns error, the corresponding error details are set.\n\tDetails []*GRPCErrorDetail `protobuf:\"bytes,5,rep,name=details,proto3\" json:\"details,omitempty\"`\n\t// ignore ignore the error if the condition in the \"if\" field is true and \"ignore\" field is set to true.\n\t// When an error is ignored, the returned response is always null value.\n\t// If you want to return a response that is not null, please use `ignore_and_response` feature.\n\t// Therefore, `ignore` and `ignore_and_response` cannot be specified same.\n\tIgnore *bool `protobuf:\"varint,6,opt,name=ignore,proto3,oneof\" json:\"ignore,omitempty\"`\n\t// ignore_and_response ignore the error if the condition in the \"if\" field is true and it returns response specified in CEL.\n\t// The evaluation value of CEL must always be the same as the response message type.\n\t// `ignore` and `ignore_and_response` cannot be specified same.\n\tIgnoreAndResponse *string `protobuf:\"bytes,7,opt,name=ignore_and_response,json=ignoreAndResponse,proto3,oneof\" json:\"ignore_and_response,omitempty\"`\n\t// log_level can be configured to output logs as any log level.\n\t// If DEBUG is specified for the log_level, logs are output as debug logs.\n\t// default value is ERROR.\n\tLogLevel *GRPCError_LogLevel `protobuf:\"varint,8,opt,name=log_level,json=logLevel,proto3,enum=grpc.federation.GRPCError_LogLevel,oneof\" json:\"log_level,omitempty\"`\n}\n\nfunc (x *GRPCError) Reset() {\n\t*x = GRPCError{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[24]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GRPCError) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GRPCError) ProtoMessage() {}\n\nfunc (x *GRPCError) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[24]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GRPCError.ProtoReflect.Descriptor instead.\nfunc (*GRPCError) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{24}\n}\n\nfunc (x *GRPCError) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCError) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCError) GetCode() code.Code {\n\tif x != nil && x.Code != nil {\n\t\treturn *x.Code\n\t}\n\treturn code.Code(0)\n}\n\nfunc (x *GRPCError) GetMessage() string {\n\tif x != nil && x.Message != nil {\n\t\treturn *x.Message\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCError) GetDetails() []*GRPCErrorDetail {\n\tif x != nil {\n\t\treturn x.Details\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCError) GetIgnore() bool {\n\tif x != nil && x.Ignore != nil {\n\t\treturn *x.Ignore\n\t}\n\treturn false\n}\n\nfunc (x *GRPCError) GetIgnoreAndResponse() string {\n\tif x != nil && x.IgnoreAndResponse != nil {\n\t\treturn *x.IgnoreAndResponse\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCError) GetLogLevel() GRPCError_LogLevel {\n\tif x != nil && x.LogLevel != nil {\n\t\treturn *x.LogLevel\n\t}\n\treturn GRPCError_UNKNOWN\n}\n\ntype GRPCErrorDetail struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// if specifies condition rule in CEL. If the condition is true, gRPC error detail is added to the error.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3\" json:\"if,omitempty\"`\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,2,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// message represents arbitrary messages to describe the detail of the error.\n\tMessage []*MessageExpr `protobuf:\"bytes,3,rep,name=message,proto3\" json:\"message,omitempty\"`\n\t// error_info describes the cause of the error with structured details.\n\tErrorInfo []*errdetails.ErrorInfo `protobuf:\"bytes,4,rep,name=error_info,json=errorInfo,proto3\" json:\"error_info,omitempty\"`\n\t// retry_info describes when the clients can retry a failed request.\n\tRetryInfo []*errdetails.RetryInfo `protobuf:\"bytes,5,rep,name=retry_info,json=retryInfo,proto3\" json:\"retry_info,omitempty\"`\n\t// debug_info describes additional debugging info.\n\tDebugInfo []*errdetails.DebugInfo `protobuf:\"bytes,6,rep,name=debug_info,json=debugInfo,proto3\" json:\"debug_info,omitempty\"`\n\t// quota_failure describes how a quota check failed.\n\tQuotaFailure []*errdetails.QuotaFailure `protobuf:\"bytes,7,rep,name=quota_failure,json=quotaFailure,proto3\" json:\"quota_failure,omitempty\"`\n\t// precondition_failure describes what preconditions have failed.\n\tPreconditionFailure []*errdetails.PreconditionFailure `protobuf:\"bytes,8,rep,name=precondition_failure,json=preconditionFailure,proto3\" json:\"precondition_failure,omitempty\"`\n\t// bad_request describes violations in a client request.\n\tBadRequest []*errdetails.BadRequest `protobuf:\"bytes,9,rep,name=bad_request,json=badRequest,proto3\" json:\"bad_request,omitempty\"`\n\t// request_info contains metadata about the request that clients can attach.\n\tRequestInfo []*errdetails.RequestInfo `protobuf:\"bytes,10,rep,name=request_info,json=requestInfo,proto3\" json:\"request_info,omitempty\"`\n\t// resource_info describes the resource that is being accessed.\n\tResourceInfo []*errdetails.ResourceInfo `protobuf:\"bytes,11,rep,name=resource_info,json=resourceInfo,proto3\" json:\"resource_info,omitempty\"`\n\t// help provides links to documentation or for performing an out of band action.\n\tHelp []*errdetails.Help `protobuf:\"bytes,12,rep,name=help,proto3\" json:\"help,omitempty\"`\n\t// localized_message provides a localized error message that is safe to return to the user.\n\tLocalizedMessage []*errdetails.LocalizedMessage `protobuf:\"bytes,13,rep,name=localized_message,json=localizedMessage,proto3\" json:\"localized_message,omitempty\"`\n\t// by specify a message in CEL to express the details of the error.\n\tBy []string `protobuf:\"bytes,14,rep,name=by,proto3\" json:\"by,omitempty\"`\n}\n\nfunc (x *GRPCErrorDetail) Reset() {\n\t*x = GRPCErrorDetail{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[25]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GRPCErrorDetail) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GRPCErrorDetail) ProtoMessage() {}\n\nfunc (x *GRPCErrorDetail) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[25]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GRPCErrorDetail.ProtoReflect.Descriptor instead.\nfunc (*GRPCErrorDetail) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{25}\n}\n\nfunc (x *GRPCErrorDetail) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCErrorDetail) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetMessage() []*MessageExpr {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetErrorInfo() []*errdetails.ErrorInfo {\n\tif x != nil {\n\t\treturn x.ErrorInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetRetryInfo() []*errdetails.RetryInfo {\n\tif x != nil {\n\t\treturn x.RetryInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetDebugInfo() []*errdetails.DebugInfo {\n\tif x != nil {\n\t\treturn x.DebugInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetQuotaFailure() []*errdetails.QuotaFailure {\n\tif x != nil {\n\t\treturn x.QuotaFailure\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetPreconditionFailure() []*errdetails.PreconditionFailure {\n\tif x != nil {\n\t\treturn x.PreconditionFailure\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetBadRequest() []*errdetails.BadRequest {\n\tif x != nil {\n\t\treturn x.BadRequest\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetRequestInfo() []*errdetails.RequestInfo {\n\tif x != nil {\n\t\treturn x.RequestInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetResourceInfo() []*errdetails.ResourceInfo {\n\tif x != nil {\n\t\treturn x.ResourceInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetHelp() []*errdetails.Help {\n\tif x != nil {\n\t\treturn x.Help\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetLocalizedMessage() []*errdetails.LocalizedMessage {\n\tif x != nil {\n\t\treturn x.LocalizedMessage\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetBy() []string {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn nil\n}\n\n// GRPCCallOption configures a gRPC Call before it starts or extracts information from a gRPC Call after it completes.\ntype GRPCCallOption struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// set the content-subtype. For example, if content-subtype is \"json\", the Content-Type over the wire will be \"application/grpc+json\".\n\t// The content-subtype is converted to lowercase before being included in Content-Type.\n\t// See Content-Type on https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests for more details.\n\t// If no such codec is found, the call will result in an error with code INTERNAL.\n\tContentSubtype *string `protobuf:\"bytes,1,opt,name=content_subtype,json=contentSubtype,proto3,oneof\" json:\"content_subtype,omitempty\"`\n\t// header retrieves the header metadata for a unary RPC.\n\t// In order to obtain the metadata, you must specify a variable of type map<string, repeated string> in the header.\n\t// e.g.)\n\t// def [\n\t//\n\t//\t{ name: \"hdr\" by: \"grpc.federation.metadata.new()\" }\n\t//\t{ call { method: \"pkg.Method\" option { header: \"hdr\" } } }\n\t//\n\t// ]\n\tHeader *string `protobuf:\"bytes,2,opt,name=header,proto3,oneof\" json:\"header,omitempty\"`\n\t// max_call_recv_msg_size sets the maximum message size in bytes the client can receive.\n\t// If this is not set, gRPC uses the default 4MB.\n\tMaxCallRecvMsgSize *int64 `protobuf:\"varint,3,opt,name=max_call_recv_msg_size,json=maxCallRecvMsgSize,proto3,oneof\" json:\"max_call_recv_msg_size,omitempty\"`\n\t// max_call_send_msg_size sets the maximum message size in bytes the client can send.\n\t// If this is not set, gRPC uses the default maximum number of int32 range.\n\tMaxCallSendMsgSize *int64 `protobuf:\"varint,4,opt,name=max_call_send_msg_size,json=maxCallSendMsgSize,proto3,oneof\" json:\"max_call_send_msg_size,omitempty\"`\n\t// static_method specifies that a call is being made to a method that is static,\n\t// which means the method is known at compile time and doesn't change at runtime.\n\t// This can be used as a signal to stats plugins that this method is safe to include as a key to a measurement.\n\tStaticMethod *bool `protobuf:\"varint,5,opt,name=static_method,json=staticMethod,proto3,oneof\" json:\"static_method,omitempty\"`\n\t// trailer retrieves the trailer metadata for a unary RPC.\n\t// In order to obtain the metadata, you must specify a variable of type map<string, repeated string> in the trailer.\n\t// e.g.)\n\t// def [\n\t//\n\t//\t{ name: \"trl\" by: \"grpc.federation.metadata.new()\" }\n\t//\t{ call { method: \"pkg.Method\" option { trailer: \"trl\" } } }\n\t//\n\t// ]\n\tTrailer *string `protobuf:\"bytes,6,opt,name=trailer,proto3,oneof\" json:\"trailer,omitempty\"`\n\t// wait_for_ready configures the RPC's behavior when the client is in TRANSIENT_FAILURE,\n\t// which occurs when all addresses fail to connect.\n\t// If wait_for_ready is false, the RPC will fail immediately.\n\t// Otherwise, the client will wait until a connection becomes available or the RPC's deadline is reached.\n\t// By default, RPCs do not \"wait for ready\".\n\tWaitForReady *bool `protobuf:\"varint,7,opt,name=wait_for_ready,json=waitForReady,proto3,oneof\" json:\"wait_for_ready,omitempty\"`\n}\n\nfunc (x *GRPCCallOption) Reset() {\n\t*x = GRPCCallOption{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[26]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GRPCCallOption) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GRPCCallOption) ProtoMessage() {}\n\nfunc (x *GRPCCallOption) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[26]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GRPCCallOption.ProtoReflect.Descriptor instead.\nfunc (*GRPCCallOption) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{26}\n}\n\nfunc (x *GRPCCallOption) GetContentSubtype() string {\n\tif x != nil && x.ContentSubtype != nil {\n\t\treturn *x.ContentSubtype\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCCallOption) GetHeader() string {\n\tif x != nil && x.Header != nil {\n\t\treturn *x.Header\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCCallOption) GetMaxCallRecvMsgSize() int64 {\n\tif x != nil && x.MaxCallRecvMsgSize != nil {\n\t\treturn *x.MaxCallRecvMsgSize\n\t}\n\treturn 0\n}\n\nfunc (x *GRPCCallOption) GetMaxCallSendMsgSize() int64 {\n\tif x != nil && x.MaxCallSendMsgSize != nil {\n\t\treturn *x.MaxCallSendMsgSize\n\t}\n\treturn 0\n}\n\nfunc (x *GRPCCallOption) GetStaticMethod() bool {\n\tif x != nil && x.StaticMethod != nil {\n\t\treturn *x.StaticMethod\n\t}\n\treturn false\n}\n\nfunc (x *GRPCCallOption) GetTrailer() string {\n\tif x != nil && x.Trailer != nil {\n\t\treturn *x.Trailer\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCCallOption) GetWaitForReady() bool {\n\tif x != nil && x.WaitForReady != nil {\n\t\treturn *x.WaitForReady\n\t}\n\treturn false\n}\n\n// Validation represents a validation rule against variables defined within the current scope.\ntype ValidationExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is a unique name for the validation.\n\t// If set, the validation error type will be <message-name><name>Error.\n\t// If omitted, the validation error type will be ValidationError.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// error defines the actual validation rules and an error to returned if the validation fails.\n\tError *GRPCError `protobuf:\"bytes,2,opt,name=error,proto3\" json:\"error,omitempty\"`\n}\n\nfunc (x *ValidationExpr) Reset() {\n\t*x = ValidationExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[27]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ValidationExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ValidationExpr) ProtoMessage() {}\n\nfunc (x *ValidationExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[27]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ValidationExpr.ProtoReflect.Descriptor instead.\nfunc (*ValidationExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{27}\n}\n\nfunc (x *ValidationExpr) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *ValidationExpr) GetError() *GRPCError {\n\tif x != nil {\n\t\treturn x.Error\n\t}\n\treturn nil\n}\n\n// RetryPolicy define the retry policy if the method call fails.\ntype RetryPolicy struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to Policy:\n\t//\n\t//\t*RetryPolicy_Constant\n\t//\t*RetryPolicy_Exponential\n\tPolicy isRetryPolicy_Policy `protobuf_oneof:\"policy\"`\n\t// if specifies condition in CEL. If the condition is true, run the retry process according to the policy.\n\t// If this field is omitted, it is always treated as 'true' and run the retry process.\n\t// The return value must always be of type boolean.\n\tIf string `protobuf:\"bytes,3,opt,name=if,proto3\" json:\"if,omitempty\"`\n}\n\nfunc (x *RetryPolicy) Reset() {\n\t*x = RetryPolicy{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[28]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RetryPolicy) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RetryPolicy) ProtoMessage() {}\n\nfunc (x *RetryPolicy) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[28]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RetryPolicy.ProtoReflect.Descriptor instead.\nfunc (*RetryPolicy) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{28}\n}\n\nfunc (m *RetryPolicy) GetPolicy() isRetryPolicy_Policy {\n\tif m != nil {\n\t\treturn m.Policy\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicy) GetConstant() *RetryPolicyConstant {\n\tif x, ok := x.GetPolicy().(*RetryPolicy_Constant); ok {\n\t\treturn x.Constant\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicy) GetExponential() *RetryPolicyExponential {\n\tif x, ok := x.GetPolicy().(*RetryPolicy_Exponential); ok {\n\t\treturn x.Exponential\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicy) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\ntype isRetryPolicy_Policy interface {\n\tisRetryPolicy_Policy()\n}\n\ntype RetryPolicy_Constant struct {\n\t// retry according to the \"constant\" policy.\n\tConstant *RetryPolicyConstant `protobuf:\"bytes,1,opt,name=constant,proto3,oneof\"`\n}\n\ntype RetryPolicy_Exponential struct {\n\t// retry according to the \"exponential backoff\" policy.\n\t// The following Go library is used in the implementation,\n\t// so please refer to the library documentation for how to specify each parameter.\n\t// https://pkg.go.dev/github.com/cenkalti/backoff/v4#section-readme.\n\tExponential *RetryPolicyExponential `protobuf:\"bytes,2,opt,name=exponential,proto3,oneof\"`\n}\n\nfunc (*RetryPolicy_Constant) isRetryPolicy_Policy() {}\n\nfunc (*RetryPolicy_Exponential) isRetryPolicy_Policy() {}\n\n// RetryPolicyConstant define \"constant\" based retry policy.\ntype RetryPolicyConstant struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// interval value. ( default value is 1s ).\n\tInterval *string `protobuf:\"bytes,1,opt,name=interval,proto3,oneof\" json:\"interval,omitempty\"`\n\t// max retry count. ( default value is 5. If zero is specified, it never stops )\n\tMaxRetries *uint64 `protobuf:\"varint,2,opt,name=max_retries,json=maxRetries,proto3,oneof\" json:\"max_retries,omitempty\"`\n}\n\nfunc (x *RetryPolicyConstant) Reset() {\n\t*x = RetryPolicyConstant{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[29]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RetryPolicyConstant) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RetryPolicyConstant) ProtoMessage() {}\n\nfunc (x *RetryPolicyConstant) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[29]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RetryPolicyConstant.ProtoReflect.Descriptor instead.\nfunc (*RetryPolicyConstant) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{29}\n}\n\nfunc (x *RetryPolicyConstant) GetInterval() string {\n\tif x != nil && x.Interval != nil {\n\t\treturn *x.Interval\n\t}\n\treturn \"\"\n}\n\nfunc (x *RetryPolicyConstant) GetMaxRetries() uint64 {\n\tif x != nil && x.MaxRetries != nil {\n\t\treturn *x.MaxRetries\n\t}\n\treturn 0\n}\n\n// RetryPolicyExponential define \"exponential backoff\" based retry policy.\ntype RetryPolicyExponential struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// initial interval value. ( default value is \"500ms\" ).\n\tInitialInterval *string `protobuf:\"bytes,1,opt,name=initial_interval,json=initialInterval,proto3,oneof\" json:\"initial_interval,omitempty\"`\n\t// randomization factor value. ( default value is 0.5 ).\n\tRandomizationFactor *float64 `protobuf:\"fixed64,2,opt,name=randomization_factor,json=randomizationFactor,proto3,oneof\" json:\"randomization_factor,omitempty\"`\n\t// multiplier. ( default value is 1.5 ).\n\tMultiplier *float64 `protobuf:\"fixed64,3,opt,name=multiplier,proto3,oneof\" json:\"multiplier,omitempty\"`\n\t// max interval value. ( default value is \"60s\" ).\n\tMaxInterval *string `protobuf:\"bytes,4,opt,name=max_interval,json=maxInterval,proto3,oneof\" json:\"max_interval,omitempty\"`\n\t// max retry count. ( default value is 5. If zero is specified, it never stops ).\n\tMaxRetries *uint64 `protobuf:\"varint,5,opt,name=max_retries,json=maxRetries,proto3,oneof\" json:\"max_retries,omitempty\"`\n}\n\nfunc (x *RetryPolicyExponential) Reset() {\n\t*x = RetryPolicyExponential{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[30]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RetryPolicyExponential) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RetryPolicyExponential) ProtoMessage() {}\n\nfunc (x *RetryPolicyExponential) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[30]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RetryPolicyExponential.ProtoReflect.Descriptor instead.\nfunc (*RetryPolicyExponential) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{30}\n}\n\nfunc (x *RetryPolicyExponential) GetInitialInterval() string {\n\tif x != nil && x.InitialInterval != nil {\n\t\treturn *x.InitialInterval\n\t}\n\treturn \"\"\n}\n\nfunc (x *RetryPolicyExponential) GetRandomizationFactor() float64 {\n\tif x != nil && x.RandomizationFactor != nil {\n\t\treturn *x.RandomizationFactor\n\t}\n\treturn 0\n}\n\nfunc (x *RetryPolicyExponential) GetMultiplier() float64 {\n\tif x != nil && x.Multiplier != nil {\n\t\treturn *x.Multiplier\n\t}\n\treturn 0\n}\n\nfunc (x *RetryPolicyExponential) GetMaxInterval() string {\n\tif x != nil && x.MaxInterval != nil {\n\t\treturn *x.MaxInterval\n\t}\n\treturn \"\"\n}\n\nfunc (x *RetryPolicyExponential) GetMaxRetries() uint64 {\n\tif x != nil && x.MaxRetries != nil {\n\t\treturn *x.MaxRetries\n\t}\n\treturn 0\n}\n\n// MethodRequest define parameters to be used for gRPC method request.\ntype MethodRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// field name of the request message.\n\tField string `protobuf:\"bytes,1,opt,name=field,proto3\" json:\"field,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tBy *string `protobuf:\"bytes,2,opt,name=by,proto3,oneof\" json:\"by,omitempty\"`\n\t// if describes the condition to be assigned to field.\n\t// The return value must be of type bool.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\t// If the field is a 'oneof' field, it must be specified.\n\tIf *string `protobuf:\"bytes,3,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n}\n\nfunc (x *MethodRequest) Reset() {\n\t*x = MethodRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[31]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MethodRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MethodRequest) ProtoMessage() {}\n\nfunc (x *MethodRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[31]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MethodRequest.ProtoReflect.Descriptor instead.\nfunc (*MethodRequest) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{31}\n}\n\nfunc (x *MethodRequest) GetField() string {\n\tif x != nil {\n\t\treturn x.Field\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodRequest) GetBy() string {\n\tif x != nil && x.By != nil {\n\t\treturn *x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodRequest) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\n// MethodResponse define which value of the method response is referenced.\ntype MethodResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name specify the unique name that can be used in a `MessageRule` / `FieldRule` for the same message for a specific field in the response.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// field name in response message.\n\tField *string `protobuf:\"bytes,2,opt,name=field,proto3,oneof\" json:\"field,omitempty\"`\n\t// autobind if the value referenced by `field` is a message type,\n\t// the value of a field with the same name and type as the field name of its own message is automatically assigned to the value of the field in the message.\n\t// If multiple autobinds are used at the same message,\n\t// you must explicitly use the `grpc.federation.field` option to do the binding yourself, since duplicate field names cannot be correctly determined as one.\n\tAutobind *bool `protobuf:\"varint,3,opt,name=autobind,proto3,oneof\" json:\"autobind,omitempty\"`\n}\n\nfunc (x *MethodResponse) Reset() {\n\t*x = MethodResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[32]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MethodResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MethodResponse) ProtoMessage() {}\n\nfunc (x *MethodResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[32]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MethodResponse.ProtoReflect.Descriptor instead.\nfunc (*MethodResponse) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{32}\n}\n\nfunc (x *MethodResponse) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodResponse) GetField() string {\n\tif x != nil && x.Field != nil {\n\t\treturn *x.Field\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodResponse) GetAutobind() bool {\n\tif x != nil && x.Autobind != nil {\n\t\treturn *x.Autobind\n\t}\n\treturn false\n}\n\n// Argument define message argument.\ntype Argument struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name of the message argument.\n\t// Use this name to refer to the message argument.\n\t// For example, if `foo` is specified as the name, it is referenced by `$.foo`.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tBy *string `protobuf:\"bytes,2,opt,name=by,proto3,oneof\" json:\"by,omitempty\"`\n\t// inline like by, it refers to the specified value and expands all fields beyond it.\n\t// For this reason, the referenced value must always be of message type.\n\tInline *string `protobuf:\"bytes,3,opt,name=inline,proto3,oneof\" json:\"inline,omitempty\"`\n}\n\nfunc (x *Argument) Reset() {\n\t*x = Argument{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[33]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Argument) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Argument) ProtoMessage() {}\n\nfunc (x *Argument) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[33]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Argument.ProtoReflect.Descriptor instead.\nfunc (*Argument) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{33}\n}\n\nfunc (x *Argument) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Argument) GetBy() string {\n\tif x != nil && x.By != nil {\n\t\treturn *x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *Argument) GetInline() string {\n\tif x != nil && x.Inline != nil {\n\t\treturn *x.Inline\n\t}\n\treturn \"\"\n}\n\n// FieldRule define gRPC Federation rules for the field of message.\ntype FieldRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// If custom_resolver is true, the field binding process is to be implemented in Go.\n\t// If there are any values retrieved by grpc.federation.message option, they are passed as arguments for custom resolver.\n\tCustomResolver *bool `protobuf:\"varint,1,opt,name=custom_resolver,json=customResolver,proto3,oneof\" json:\"custom_resolver,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tBy *string `protobuf:\"bytes,2,opt,name=by,proto3,oneof\" json:\"by,omitempty\"`\n\t// alias can be used when alias is specified in grpc.federation.message option,\n\t// and specifies the field name to be referenced among the messages specified in alias of message option.\n\t// If the specified field has the same type or can be converted automatically, its value is assigned.\n\tAlias *string `protobuf:\"bytes,3,opt,name=alias,proto3,oneof\" json:\"alias,omitempty\"`\n\t// use to evaluate any one of fields. this field only available in oneof.\n\tOneof *FieldOneof `protobuf:\"bytes,4,opt,name=oneof,proto3\" json:\"oneof,omitempty\"`\n\t// when defining an environment variable, use it for fields where you want to set additional options.\n\tEnv *EnvVarOption `protobuf:\"bytes,5,opt,name=env,proto3\" json:\"env,omitempty\"`\n}\n\nfunc (x *FieldRule) Reset() {\n\t*x = FieldRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[34]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *FieldRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*FieldRule) ProtoMessage() {}\n\nfunc (x *FieldRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[34]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use FieldRule.ProtoReflect.Descriptor instead.\nfunc (*FieldRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{34}\n}\n\nfunc (x *FieldRule) GetCustomResolver() bool {\n\tif x != nil && x.CustomResolver != nil {\n\t\treturn *x.CustomResolver\n\t}\n\treturn false\n}\n\nfunc (x *FieldRule) GetBy() string {\n\tif x != nil && x.By != nil {\n\t\treturn *x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *FieldRule) GetAlias() string {\n\tif x != nil && x.Alias != nil {\n\t\treturn *x.Alias\n\t}\n\treturn \"\"\n}\n\nfunc (x *FieldRule) GetOneof() *FieldOneof {\n\tif x != nil {\n\t\treturn x.Oneof\n\t}\n\treturn nil\n}\n\nfunc (x *FieldRule) GetEnv() *EnvVarOption {\n\tif x != nil {\n\t\treturn x.Env\n\t}\n\treturn nil\n}\n\n// FieldOneof evaluate \"messages\" or other field only if expr is true and assign to the oneof field.\n// This feature only available in oneof.\ntype FieldOneof struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// cond specify either `expr` or `default`. Only one `default` can be set per oneof.\n\t//\n\t// Types that are assignable to Cond:\n\t//\n\t//\t*FieldOneof_If\n\t//\t*FieldOneof_Default\n\tCond isFieldOneof_Cond `protobuf_oneof:\"cond\"`\n\t// def specify variables to be used in current oneof field's scope for field binding.\n\tDef []*VariableDefinition `protobuf:\"bytes,3,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule and FieldOneOf can be used.\n\tBy string `protobuf:\"bytes,4,opt,name=by,proto3\" json:\"by,omitempty\"`\n}\n\nfunc (x *FieldOneof) Reset() {\n\t*x = FieldOneof{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[35]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *FieldOneof) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*FieldOneof) ProtoMessage() {}\n\nfunc (x *FieldOneof) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[35]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use FieldOneof.ProtoReflect.Descriptor instead.\nfunc (*FieldOneof) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{35}\n}\n\nfunc (m *FieldOneof) GetCond() isFieldOneof_Cond {\n\tif m != nil {\n\t\treturn m.Cond\n\t}\n\treturn nil\n}\n\nfunc (x *FieldOneof) GetIf() string {\n\tif x, ok := x.GetCond().(*FieldOneof_If); ok {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *FieldOneof) GetDefault() bool {\n\tif x, ok := x.GetCond().(*FieldOneof_Default); ok {\n\t\treturn x.Default\n\t}\n\treturn false\n}\n\nfunc (x *FieldOneof) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *FieldOneof) GetBy() string {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\ntype isFieldOneof_Cond interface {\n\tisFieldOneof_Cond()\n}\n\ntype FieldOneof_If struct {\n\t// if describes the condition to be assigned to field.\n\t// The return value must be of type bool.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3,oneof\"`\n}\n\ntype FieldOneof_Default struct {\n\t// default used to assign a value when none of the other fields match any of the specified expressions.\n\t// Only one value can be defined per oneof.\n\tDefault bool `protobuf:\"varint,2,opt,name=default,proto3,oneof\"`\n}\n\nfunc (*FieldOneof_If) isFieldOneof_Cond() {}\n\nfunc (*FieldOneof_Default) isFieldOneof_Cond() {}\n\n// CELPlugin define schema of CEL plugin.\ntype CELPlugin struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tExport []*CELPluginExport `protobuf:\"bytes,1,rep,name=export,proto3\" json:\"export,omitempty\"`\n}\n\nfunc (x *CELPlugin) Reset() {\n\t*x = CELPlugin{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[36]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPlugin) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPlugin) ProtoMessage() {}\n\nfunc (x *CELPlugin) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[36]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPlugin.ProtoReflect.Descriptor instead.\nfunc (*CELPlugin) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{36}\n}\n\nfunc (x *CELPlugin) GetExport() []*CELPluginExport {\n\tif x != nil {\n\t\treturn x.Export\n\t}\n\treturn nil\n}\n\n// CELPluginExport describe the schema to be exposed as a CEL plugin.\ntype CELPluginExport struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the plugin name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// types describe the message type you want to expose.\n\tTypes []*CELReceiverType `protobuf:\"bytes,3,rep,name=types,proto3\" json:\"types,omitempty\"`\n\t// functions describe the definition of the function you want to expose.\n\tFunctions []*CELFunction `protobuf:\"bytes,4,rep,name=functions,proto3\" json:\"functions,omitempty\"`\n\t// variables describe the definition of the variable you want to expose.\n\tVariables  []*CELVariable       `protobuf:\"bytes,5,rep,name=variables,proto3\" json:\"variables,omitempty\"`\n\tCapability *CELPluginCapability `protobuf:\"bytes,6,opt,name=capability,proto3\" json:\"capability,omitempty\"`\n}\n\nfunc (x *CELPluginExport) Reset() {\n\t*x = CELPluginExport{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[37]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginExport) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginExport) ProtoMessage() {}\n\nfunc (x *CELPluginExport) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[37]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginExport.ProtoReflect.Descriptor instead.\nfunc (*CELPluginExport) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{37}\n}\n\nfunc (x *CELPluginExport) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELPluginExport) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELPluginExport) GetTypes() []*CELReceiverType {\n\tif x != nil {\n\t\treturn x.Types\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginExport) GetFunctions() []*CELFunction {\n\tif x != nil {\n\t\treturn x.Functions\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginExport) GetVariables() []*CELVariable {\n\tif x != nil {\n\t\treturn x.Variables\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginExport) GetCapability() *CELPluginCapability {\n\tif x != nil {\n\t\treturn x.Capability\n\t}\n\treturn nil\n}\n\n// CELPluginCapability controls the permissions granted to the WebAssembly plugin.\ntype CELPluginCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// env is the capability for environment variable.\n\tEnv *CELPluginEnvCapability `protobuf:\"bytes,1,opt,name=env,proto3,oneof\" json:\"env,omitempty\"`\n\t// file_system is the capability for file system.\n\tFileSystem *CELPluginFileSystemCapability `protobuf:\"bytes,2,opt,name=file_system,json=fileSystem,proto3,oneof\" json:\"file_system,omitempty\"`\n\t// network is the capability for network.\n\tNetwork *CELPluginNetworkCapability `protobuf:\"bytes,3,opt,name=network,proto3,oneof\" json:\"network,omitempty\"`\n}\n\nfunc (x *CELPluginCapability) Reset() {\n\t*x = CELPluginCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[38]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginCapability) ProtoMessage() {}\n\nfunc (x *CELPluginCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[38]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{38}\n}\n\nfunc (x *CELPluginCapability) GetEnv() *CELPluginEnvCapability {\n\tif x != nil {\n\t\treturn x.Env\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginCapability) GetFileSystem() *CELPluginFileSystemCapability {\n\tif x != nil {\n\t\treturn x.FileSystem\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginCapability) GetNetwork() *CELPluginNetworkCapability {\n\tif x != nil {\n\t\treturn x.Network\n\t}\n\treturn nil\n}\n\n// CELPluginEnvCapability controls access to the environment variable.\ntype CELPluginEnvCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// all allows access to all environment variables.\n\tAll bool `protobuf:\"varint,1,opt,name=all,proto3\" json:\"all,omitempty\"`\n\t// specifies accessible names. If \"all\" is true, it takes precedence.\n\tNames []string `protobuf:\"bytes,2,rep,name=names,proto3\" json:\"names,omitempty\"`\n}\n\nfunc (x *CELPluginEnvCapability) Reset() {\n\t*x = CELPluginEnvCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[39]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginEnvCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginEnvCapability) ProtoMessage() {}\n\nfunc (x *CELPluginEnvCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[39]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginEnvCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginEnvCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{39}\n}\n\nfunc (x *CELPluginEnvCapability) GetAll() bool {\n\tif x != nil {\n\t\treturn x.All\n\t}\n\treturn false\n}\n\nfunc (x *CELPluginEnvCapability) GetNames() []string {\n\tif x != nil {\n\t\treturn x.Names\n\t}\n\treturn nil\n}\n\n// CELPluginFileSystemCapability controls access to the file system.\ntype CELPluginFileSystemCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// mount_path specifies the file path of the host to mount.\n\t// If not specified, the root directory will be used.\n\tMountPath string `protobuf:\"bytes,1,opt,name=mount_path,json=mountPath,proto3\" json:\"mount_path,omitempty\"`\n}\n\nfunc (x *CELPluginFileSystemCapability) Reset() {\n\t*x = CELPluginFileSystemCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[40]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginFileSystemCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginFileSystemCapability) ProtoMessage() {}\n\nfunc (x *CELPluginFileSystemCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[40]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginFileSystemCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginFileSystemCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{40}\n}\n\nfunc (x *CELPluginFileSystemCapability) GetMountPath() string {\n\tif x != nil {\n\t\treturn x.MountPath\n\t}\n\treturn \"\"\n}\n\n// CELPluginNetworkCapability sets permissions related to network access.\n// This is an experimental feature.\ntype CELPluginNetworkCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *CELPluginNetworkCapability) Reset() {\n\t*x = CELPluginNetworkCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[41]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginNetworkCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginNetworkCapability) ProtoMessage() {}\n\nfunc (x *CELPluginNetworkCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[41]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginNetworkCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginNetworkCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{41}\n}\n\n// CELFunction represents the CEL function definition.\ntype CELFunction struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the function name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of function.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// args describe the definition of the function argument.\n\tArgs []*CELFunctionArgument `protobuf:\"bytes,3,rep,name=args,proto3\" json:\"args,omitempty\"`\n\t// return describe the definition of return type of function.\n\tReturn *CELType `protobuf:\"bytes,4,opt,name=return,proto3\" json:\"return,omitempty\"`\n}\n\nfunc (x *CELFunction) Reset() {\n\t*x = CELFunction{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[42]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELFunction) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELFunction) ProtoMessage() {}\n\nfunc (x *CELFunction) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[42]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELFunction.ProtoReflect.Descriptor instead.\nfunc (*CELFunction) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{42}\n}\n\nfunc (x *CELFunction) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunction) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunction) GetArgs() []*CELFunctionArgument {\n\tif x != nil {\n\t\treturn x.Args\n\t}\n\treturn nil\n}\n\nfunc (x *CELFunction) GetReturn() *CELType {\n\tif x != nil {\n\t\treturn x.Return\n\t}\n\treturn nil\n}\n\n// CELReceiverType represents methods tied to the message.\ntype CELReceiverType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the message name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// methods describe the definition of the method for the message.\n\tMethods []*CELFunction `protobuf:\"bytes,3,rep,name=methods,proto3\" json:\"methods,omitempty\"`\n}\n\nfunc (x *CELReceiverType) Reset() {\n\t*x = CELReceiverType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[43]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELReceiverType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELReceiverType) ProtoMessage() {}\n\nfunc (x *CELReceiverType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[43]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELReceiverType.ProtoReflect.Descriptor instead.\nfunc (*CELReceiverType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{43}\n}\n\nfunc (x *CELReceiverType) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELReceiverType) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELReceiverType) GetMethods() []*CELFunction {\n\tif x != nil {\n\t\treturn x.Methods\n\t}\n\treturn nil\n}\n\n// CELFunctionArgument represents the function argument.\ntype CELFunctionArgument struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the argument value name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// type is the argument type.\n\tType *CELType `protobuf:\"bytes,3,opt,name=type,proto3\" json:\"type,omitempty\"`\n}\n\nfunc (x *CELFunctionArgument) Reset() {\n\t*x = CELFunctionArgument{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[44]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELFunctionArgument) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELFunctionArgument) ProtoMessage() {}\n\nfunc (x *CELFunctionArgument) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[44]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELFunctionArgument.ProtoReflect.Descriptor instead.\nfunc (*CELFunctionArgument) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{44}\n}\n\nfunc (x *CELFunctionArgument) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunctionArgument) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunctionArgument) GetType() *CELType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\n// CELType represents type information for CEL plugin interface.\ntype CELType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to Type:\n\t//\n\t//\t*CELType_Kind\n\t//\t*CELType_Repeated\n\t//\t*CELType_Map\n\t//\t*CELType_Message\n\t//\t*CELType_Enum\n\tType isCELType_Type `protobuf_oneof:\"type\"`\n}\n\nfunc (x *CELType) Reset() {\n\t*x = CELType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[45]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELType) ProtoMessage() {}\n\nfunc (x *CELType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[45]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELType.ProtoReflect.Descriptor instead.\nfunc (*CELType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{45}\n}\n\nfunc (m *CELType) GetType() isCELType_Type {\n\tif m != nil {\n\t\treturn m.Type\n\t}\n\treturn nil\n}\n\nfunc (x *CELType) GetKind() TypeKind {\n\tif x, ok := x.GetType().(*CELType_Kind); ok {\n\t\treturn x.Kind\n\t}\n\treturn TypeKind_UNKNOWN\n}\n\nfunc (x *CELType) GetRepeated() *CELType {\n\tif x, ok := x.GetType().(*CELType_Repeated); ok {\n\t\treturn x.Repeated\n\t}\n\treturn nil\n}\n\nfunc (x *CELType) GetMap() *CELMapType {\n\tif x, ok := x.GetType().(*CELType_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\nfunc (x *CELType) GetMessage() string {\n\tif x, ok := x.GetType().(*CELType_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELType) GetEnum() string {\n\tif x, ok := x.GetType().(*CELType_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn \"\"\n}\n\ntype isCELType_Type interface {\n\tisCELType_Type()\n}\n\ntype CELType_Kind struct {\n\t// kind is used when the type is a primitive type.\n\tKind TypeKind `protobuf:\"varint,1,opt,name=kind,proto3,enum=grpc.federation.TypeKind,oneof\"`\n}\n\ntype CELType_Repeated struct {\n\t// repeated is used when the type is a repeated type.\n\tRepeated *CELType `protobuf:\"bytes,2,opt,name=repeated,proto3,oneof\"`\n}\n\ntype CELType_Map struct {\n\t// map is used when the type is a map type.\n\tMap *CELMapType `protobuf:\"bytes,3,opt,name=map,proto3,oneof\"`\n}\n\ntype CELType_Message struct {\n\t// message is a fqdn to the message type.\n\tMessage string `protobuf:\"bytes,4,opt,name=message,proto3,oneof\"`\n}\n\ntype CELType_Enum struct {\n\t// enum is a fqdn to the enum type.\n\tEnum string `protobuf:\"bytes,5,opt,name=enum,proto3,oneof\"`\n}\n\nfunc (*CELType_Kind) isCELType_Type() {}\n\nfunc (*CELType_Repeated) isCELType_Type() {}\n\nfunc (*CELType_Map) isCELType_Type() {}\n\nfunc (*CELType_Message) isCELType_Type() {}\n\nfunc (*CELType_Enum) isCELType_Type() {}\n\n// CELMapType represents map type.\ntype CELMapType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// key represents map's key type.\n\tKey *CELType `protobuf:\"bytes,1,opt,name=key,proto3\" json:\"key,omitempty\"`\n\t// value represents map's value type.\n\tValue *CELType `protobuf:\"bytes,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *CELMapType) Reset() {\n\t*x = CELMapType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[46]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELMapType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELMapType) ProtoMessage() {}\n\nfunc (x *CELMapType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[46]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELMapType.ProtoReflect.Descriptor instead.\nfunc (*CELMapType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{46}\n}\n\nfunc (x *CELMapType) GetKey() *CELType {\n\tif x != nil {\n\t\treturn x.Key\n\t}\n\treturn nil\n}\n\nfunc (x *CELMapType) GetValue() *CELType {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn nil\n}\n\n// CELVariable represents CEL variable.\ntype CELVariable struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the variable name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// type is the variable type.\n\tType *CELType `protobuf:\"bytes,3,opt,name=type,proto3\" json:\"type,omitempty\"`\n}\n\nfunc (x *CELVariable) Reset() {\n\t*x = CELVariable{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[47]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELVariable) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELVariable) ProtoMessage() {}\n\nfunc (x *CELVariable) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[47]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELVariable.ProtoReflect.Descriptor instead.\nfunc (*CELVariable) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{47}\n}\n\nfunc (x *CELVariable) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELVariable) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELVariable) GetType() *CELType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nvar file_grpc_federation_federation_proto_extTypes = []protoimpl.ExtensionInfo{\n\t{\n\t\tExtendedType:  (*descriptorpb.FileOptions)(nil),\n\t\tExtensionType: (*FileRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.file\",\n\t\tTag:           \"bytes,1187,opt,name=file\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*ServiceRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.service\",\n\t\tTag:           \"bytes,1187,opt,name=service\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*MethodRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.method\",\n\t\tTag:           \"bytes,1187,opt,name=method\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MessageOptions)(nil),\n\t\tExtensionType: (*MessageRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.message\",\n\t\tTag:           \"bytes,1187,opt,name=message\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*FieldRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.field\",\n\t\tTag:           \"bytes,1187,opt,name=field\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.EnumOptions)(nil),\n\t\tExtensionType: (*EnumRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.enum\",\n\t\tTag:           \"bytes,1187,opt,name=enum\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.EnumValueOptions)(nil),\n\t\tExtensionType: (*EnumValueRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.enum_value\",\n\t\tTag:           \"bytes,1187,opt,name=enum_value\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.OneofOptions)(nil),\n\t\tExtensionType: (*OneofRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.oneof\",\n\t\tTag:           \"bytes,1187,opt,name=oneof\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n}\n\n// Extension fields to descriptorpb.FileOptions.\nvar (\n\t// optional grpc.federation.FileRule file = 1187;\n\tE_File = &file_grpc_federation_federation_proto_extTypes[0]\n)\n\n// Extension fields to descriptorpb.ServiceOptions.\nvar (\n\t// optional grpc.federation.ServiceRule service = 1187;\n\tE_Service = &file_grpc_federation_federation_proto_extTypes[1]\n)\n\n// Extension fields to descriptorpb.MethodOptions.\nvar (\n\t// optional grpc.federation.MethodRule method = 1187;\n\tE_Method = &file_grpc_federation_federation_proto_extTypes[2]\n)\n\n// Extension fields to descriptorpb.MessageOptions.\nvar (\n\t// optional grpc.federation.MessageRule message = 1187;\n\tE_Message = &file_grpc_federation_federation_proto_extTypes[3]\n)\n\n// Extension fields to descriptorpb.FieldOptions.\nvar (\n\t// optional grpc.federation.FieldRule field = 1187;\n\tE_Field = &file_grpc_federation_federation_proto_extTypes[4]\n)\n\n// Extension fields to descriptorpb.EnumOptions.\nvar (\n\t// optional grpc.federation.EnumRule enum = 1187;\n\tE_Enum = &file_grpc_federation_federation_proto_extTypes[5]\n)\n\n// Extension fields to descriptorpb.EnumValueOptions.\nvar (\n\t// optional grpc.federation.EnumValueRule enum_value = 1187;\n\tE_EnumValue = &file_grpc_federation_federation_proto_extTypes[6]\n)\n\n// Extension fields to descriptorpb.OneofOptions.\nvar (\n\t// optional grpc.federation.OneofRule oneof = 1187;\n\tE_Oneof = &file_grpc_federation_federation_proto_extTypes[7]\n)\n\nvar File_grpc_federation_federation_proto protoreflect.FileDescriptor\n\nvar file_grpc_federation_federation_proto_rawDesc = []byte{\n\t0x0a, 0x20, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x12, 0x0f, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70,\n\t0x63, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x64,\n\t0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x67, 0x72,\n\t0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x70, 0x72,\n\t0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x67, 0x72, 0x70,\n\t0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x74, 0x69, 0x6d,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x56, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x52,\n\t0x75, 0x6c, 0x65, 0x12, 0x32, 0x0a, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52,\n\t0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6d, 0x70, 0x6f, 0x72,\n\t0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x22,\n\t0x20, 0x0a, 0x08, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61,\n\t0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61,\n\t0x73, 0x22, 0xb4, 0x01, 0x0a, 0x0d, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52,\n\t0x75, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x88,\n\t0x01, 0x01, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,\n\t0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x37, 0x0a, 0x04, 0x61, 0x74, 0x74, 0x72,\n\t0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c,\n\t0x75, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, 0x04, 0x61, 0x74, 0x74,\n\t0x72, 0x12, 0x1d, 0x0a, 0x07, 0x6e, 0x6f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x04, 0x20, 0x01,\n\t0x28, 0x08, 0x48, 0x01, 0x52, 0x07, 0x6e, 0x6f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x88, 0x01, 0x01,\n\t0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x42, 0x0a, 0x0a, 0x08,\n\t0x5f, 0x6e, 0x6f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x3e, 0x0a, 0x12, 0x45, 0x6e, 0x75, 0x6d,\n\t0x56, 0x61, 0x6c, 0x75, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x12, 0x12,\n\t0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x0b, 0x0a, 0x09, 0x4f, 0x6e, 0x65, 0x6f,\n\t0x66, 0x52, 0x75, 0x6c, 0x65, 0x22, 0x69, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n\t0x52, 0x75, 0x6c, 0x65, 0x12, 0x26, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x14, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x32, 0x0a, 0x03,\n\t0x76, 0x61, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x03, 0x76, 0x61, 0x72,\n\t0x22, 0x4a, 0x0a, 0x03, 0x45, 0x6e, 0x76, 0x12, 0x29, 0x0a, 0x03, 0x76, 0x61, 0x72, 0x18, 0x01,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x52, 0x03, 0x76,\n\t0x61, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x8b, 0x03, 0x0a,\n\t0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65,\n\t0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01,\n\t0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x66, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x02, 0x69, 0x66, 0x88, 0x01, 0x01, 0x12, 0x10,\n\t0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x62, 0x79,\n\t0x12, 0x2c, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x4d, 0x61, 0x70, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x70, 0x12, 0x38,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52,\n\t0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x50, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x69,\n\t0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x61,\n\t0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x0a,\n\t0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x04, 0x65, 0x6e,\n\t0x75, 0x6d, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x45,\n\t0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x35, 0x0a, 0x06, 0x73,\n\t0x77, 0x69, 0x74, 0x63, 0x68, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x77,\n\t0x69, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x06, 0x73, 0x77, 0x69, 0x74,\n\t0x63, 0x68, 0x42, 0x06, 0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e,\n\t0x61, 0x6d, 0x65, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x66, 0x22, 0x49, 0x0a, 0x1d, 0x53, 0x65,\n\t0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c,\n\t0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69,\n\t0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x66, 0x12, 0x18, 0x0a, 0x07, 0x6d,\n\t0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65,\n\t0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x06, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72,\n\t0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79,\n\t0x70, 0x65, 0x12, 0x3a, 0x0a, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x48, 0x00, 0x52, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x09,\n\t0x0a, 0x07, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xab, 0x01, 0x0a, 0x07, 0x45, 0x6e,\n\t0x76, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2f, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x00,\n\t0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x36, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74,\n\t0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79,\n\t0x70, 0x65, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2f,\n\t0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e,\n\t0x76, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x70, 0x42,\n\t0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x68, 0x0a, 0x0a, 0x45, 0x6e, 0x76, 0x4d, 0x61,\n\t0x70, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2a, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79, 0x70, 0x65, 0x52, 0x03, 0x6b, 0x65,\n\t0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,\n\t0x65, 0x22, 0xc3, 0x01, 0x0a, 0x0c, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x09, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61,\n\t0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c,\n\t0x74, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72,\n\t0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64,\n\t0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x07, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65,\n\t0x64, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61,\n\t0x74, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x42, 0x0b,\n\t0x0a, 0x09, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x5f,\n\t0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x22, 0x65, 0x0a, 0x0a, 0x4d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75,\n\t0x74, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e,\n\t0x73, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75,\n\t0x74, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9c,\n\t0x01, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x35,\n\t0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61,\n\t0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e,\n\t0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f,\n\t0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00,\n\t0x52, 0x0e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72,\n\t0x88, 0x01, 0x01, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x03, 0x20, 0x03,\n\t0x28, 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x75,\n\t0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x22, 0xde, 0x03,\n\t0x0a, 0x12, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69,\n\t0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x48, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x13, 0x0a,\n\t0x02, 0x69, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x02, 0x69, 0x66, 0x88,\n\t0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x18, 0x03,\n\t0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64,\n\t0x88, 0x01, 0x01, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48,\n\t0x00, 0x52, 0x02, 0x62, 0x79, 0x12, 0x2c, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x0c, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x61, 0x70, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x03,\n\t0x6d, 0x61, 0x70, 0x12, 0x38, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0d,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78,\n\t0x70, 0x72, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2f, 0x0a,\n\t0x04, 0x63, 0x61, 0x6c, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x61,\n\t0x6c, 0x6c, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x63, 0x61, 0x6c, 0x6c, 0x12, 0x41,\n\t0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45,\n\t0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x12, 0x2f, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e,\n\t0x75, 0x6d, 0x12, 0x35, 0x0a, 0x06, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x18, 0x11, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x48,\n\t0x00, 0x52, 0x06, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x42, 0x06, 0x0a, 0x04, 0x65, 0x78, 0x70,\n\t0x72, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69,\n\t0x66, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x22, 0xc5,\n\t0x01, 0x0a, 0x07, 0x4d, 0x61, 0x70, 0x45, 0x78, 0x70, 0x72, 0x12, 0x35, 0x0a, 0x08, 0x69, 0x74,\n\t0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49,\n\t0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f,\n\t0x72, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,\n\t0x02, 0x62, 0x79, 0x12, 0x38, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0c,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78,\n\t0x70, 0x72, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2f, 0x0a,\n\t0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e,\n\t0x75, 0x6d, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x42, 0x06,\n\t0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x22, 0x30, 0x0a, 0x08, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74,\n\t0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x72, 0x63, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x72, 0x63, 0x22, 0x50, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x45, 0x78, 0x70, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x04, 0x61,\n\t0x72, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x41, 0x72, 0x67, 0x75,\n\t0x6d, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x22, 0x2e, 0x0a, 0x08, 0x45, 0x6e,\n\t0x75, 0x6d, 0x45, 0x78, 0x70, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x62, 0x79,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x62, 0x79, 0x22, 0xf3, 0x02, 0x0a, 0x08, 0x43,\n\t0x61, 0x6c, 0x6c, 0x45, 0x78, 0x70, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12,\n\t0x38, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x07, 0x74, 0x69, 0x6d,\n\t0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x74, 0x69,\n\t0x6d, 0x65, 0x6f, 0x75, 0x74, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x05, 0x72, 0x65, 0x74, 0x72,\n\t0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50,\n\t0x6f, 0x6c, 0x69, 0x63, 0x79, 0x48, 0x01, 0x52, 0x05, 0x72, 0x65, 0x74, 0x72, 0x79, 0x88, 0x01,\n\t0x01, 0x12, 0x30, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72,\n\t0x72, 0x6f, 0x72, 0x12, 0x3c, 0x0a, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x43, 0x61, 0x6c, 0x6c, 0x4f, 0x70,\n\t0x74, 0x69, 0x6f, 0x6e, 0x48, 0x02, 0x52, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01,\n\t0x01, 0x12, 0x1f, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20,\n\t0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x88,\n\t0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x42, 0x08,\n\t0x0a, 0x06, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x79, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,\n\t0x22, 0x7f, 0x0a, 0x0a, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x12, 0x33,\n\t0x0a, 0x04, 0x63, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53,\n\t0x77, 0x69, 0x74, 0x63, 0x68, 0x43, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x72, 0x52, 0x04, 0x63,\n\t0x61, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x44, 0x65, 0x66,\n\t0x61, 0x75, 0x6c, 0x74, 0x45, 0x78, 0x70, 0x72, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c,\n\t0x74, 0x22, 0x71, 0x0a, 0x0e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x43, 0x61, 0x73, 0x65, 0x45,\n\t0x78, 0x70, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x02, 0x69, 0x66, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e,\n\t0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x79,\n\t0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x62, 0x79, 0x42, 0x06, 0x0a, 0x04,\n\t0x65, 0x78, 0x70, 0x72, 0x22, 0x64, 0x0a, 0x11, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x44, 0x65,\n\t0x66, 0x61, 0x75, 0x6c, 0x74, 0x45, 0x78, 0x70, 0x72, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66,\n\t0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c,\n\t0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66,\n\t0x12, 0x10, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02,\n\t0x62, 0x79, 0x42, 0x06, 0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x22, 0x86, 0x04, 0x0a, 0x09, 0x47,\n\t0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18,\n\t0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65,\n\t0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12,\n\t0x13, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x69,\n\t0x66, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x0e, 0x32, 0x10, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e,\n\t0x43, 0x6f, 0x64, 0x65, 0x48, 0x01, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12,\n\t0x1d, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,\n\t0x48, 0x02, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a,\n\t0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x20, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69,\n\t0x6c, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x69, 0x67,\n\t0x6e, 0x6f, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x06, 0x69, 0x67,\n\t0x6e, 0x6f, 0x72, 0x65, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x67, 0x6e, 0x6f, 0x72,\n\t0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x07,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x11, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x41, 0x6e,\n\t0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x88, 0x01, 0x01, 0x12, 0x45, 0x0a, 0x09,\n\t0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32,\n\t0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x4c, 0x6f, 0x67, 0x4c,\n\t0x65, 0x76, 0x65, 0x6c, 0x48, 0x05, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c,\n\t0x88, 0x01, 0x01, 0x22, 0x41, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12,\n\t0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05,\n\t0x44, 0x45, 0x42, 0x55, 0x47, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x4e, 0x46, 0x4f, 0x10,\n\t0x02, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x41, 0x52, 0x4e, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x45,\n\t0x52, 0x52, 0x4f, 0x52, 0x10, 0x04, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x66, 0x42, 0x07, 0x0a,\n\t0x05, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61,\n\t0x67, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x42, 0x16, 0x0a,\n\t0x14, 0x5f, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x72, 0x65, 0x73,\n\t0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65,\n\t0x76, 0x65, 0x6c, 0x22, 0xfa, 0x05, 0x0a, 0x0f, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f,\n\t0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x66, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x02,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44,\n\t0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x36,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78, 0x70, 0x72, 0x52, 0x07, 0x6d,\n\t0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f,\n\t0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66,\n\t0x6f, 0x52, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x34, 0x0a, 0x0a,\n\t0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65,\n\t0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x72, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e,\n\t0x66, 0x6f, 0x12, 0x34, 0x0a, 0x0a, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x69, 0x6e, 0x66, 0x6f,\n\t0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x64,\n\t0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3d, 0x0a, 0x0d, 0x71, 0x75, 0x6f, 0x74,\n\t0x61, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x6f,\n\t0x74, 0x61, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x0c, 0x71, 0x75, 0x6f, 0x74, 0x61,\n\t0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x52, 0x0a, 0x14, 0x70, 0x72, 0x65, 0x63, 0x6f,\n\t0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18,\n\t0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72,\n\t0x70, 0x63, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x46,\n\t0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x13, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69,\n\t0x74, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x62,\n\t0x61, 0x64, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61,\n\t0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x62, 0x61, 0x64, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f,\n\t0x69, 0x6e, 0x66, 0x6f, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49,\n\t0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f,\n\t0x12, 0x3d, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66,\n\t0x6f, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66,\n\t0x6f, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12,\n\t0x24, 0x0a, 0x04, 0x68, 0x65, 0x6c, 0x70, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x48, 0x65, 0x6c, 0x70, 0x52,\n\t0x04, 0x68, 0x65, 0x6c, 0x70, 0x12, 0x49, 0x0a, 0x11, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a,\n\t0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f,\n\t0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x10,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,\n\t0x12, 0x0e, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x02, 0x62, 0x79,\n\t0x22, 0xc7, 0x03, 0x0a, 0x0e, 0x47, 0x52, 0x50, 0x43, 0x43, 0x61, 0x6c, 0x6c, 0x4f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x73,\n\t0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0e,\n\t0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x88, 0x01,\n\t0x01, 0x12, 0x1b, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x48, 0x01, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x37,\n\t0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x72, 0x65, 0x63, 0x76, 0x5f,\n\t0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02,\n\t0x52, 0x12, 0x6d, 0x61, 0x78, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x63, 0x76, 0x4d, 0x73, 0x67,\n\t0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x63,\n\t0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a,\n\t0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x43, 0x61,\n\t0x6c, 0x6c, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01,\n\t0x12, 0x28, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x48, 0x04, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x69,\n\t0x63, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x74, 0x72,\n\t0x61, 0x69, 0x6c, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x07, 0x74,\n\t0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x0e, 0x77, 0x61, 0x69,\n\t0x74, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28,\n\t0x08, 0x48, 0x06, 0x52, 0x0c, 0x77, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x52, 0x65, 0x61, 0x64,\n\t0x79, 0x88, 0x01, 0x01, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,\n\t0x5f, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x68, 0x65, 0x61,\n\t0x64, 0x65, 0x72, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c,\n\t0x5f, 0x72, 0x65, 0x63, 0x76, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x19,\n\t0x0a, 0x17, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x65, 0x6e, 0x64,\n\t0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x74,\n\t0x61, 0x74, 0x69, 0x63, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x5f,\n\t0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x77, 0x61, 0x69, 0x74,\n\t0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x22, 0x64, 0x0a, 0x0e, 0x56, 0x61,\n\t0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72, 0x12, 0x17, 0x0a, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72,\n\t0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65,\n\t0x22, 0xb8, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,\n\t0x12, 0x42, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,\n\t0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x73,\n\t0x74, 0x61, 0x6e, 0x74, 0x12, 0x4b, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74,\n\t0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x72,\n\t0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x69,\n\t0x61, 0x6c, 0x48, 0x00, 0x52, 0x0b, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x69, 0x61,\n\t0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,\n\t0x66, 0x42, 0x08, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x79, 0x0a, 0x13, 0x52,\n\t0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61,\n\t0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c,\n\t0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69,\n\t0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, 0x01, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x52,\n\t0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x69, 0x6e,\n\t0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x72,\n\t0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0xd1, 0x02, 0x0a, 0x16, 0x52, 0x65, 0x74, 0x72, 0x79,\n\t0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x69, 0x61,\n\t0x6c, 0x12, 0x2e, 0x0a, 0x10, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x74,\n\t0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0f, 0x69,\n\t0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x88, 0x01,\n\t0x01, 0x12, 0x36, 0x0a, 0x14, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x48,\n\t0x01, 0x52, 0x13, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0a, 0x6d, 0x75, 0x6c,\n\t0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x48, 0x02, 0x52,\n\t0x0a, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x26,\n\t0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x04,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x49, 0x6e, 0x74, 0x65, 0x72,\n\t0x76, 0x61, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65,\n\t0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x48, 0x04, 0x52, 0x0a, 0x6d,\n\t0x61, 0x78, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x42, 0x13, 0x0a, 0x11,\n\t0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61,\n\t0x6c, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x6d,\n\t0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6d, 0x61,\n\t0x78, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d,\n\t0x61, 0x78, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x5d, 0x0a, 0x0d, 0x4d, 0x65,\n\t0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x66,\n\t0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c,\n\t0x64, 0x12, 0x13, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,\n\t0x02, 0x62, 0x79, 0x88, 0x01, 0x01, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x48, 0x01, 0x52, 0x02, 0x69, 0x66, 0x88, 0x01, 0x01, 0x42, 0x05, 0x0a, 0x03, 0x5f,\n\t0x62, 0x79, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x66, 0x22, 0x85, 0x01, 0x0a, 0x0e, 0x4d, 0x65,\n\t0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x17, 0x0a, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x88, 0x01, 0x01,\n\t0x12, 0x1f, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x08, 0x48, 0x02, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x88, 0x01,\n\t0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x66,\n\t0x69, 0x65, 0x6c, 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e,\n\t0x64, 0x22, 0x62, 0x0a, 0x08, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x12, 0x13, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,\n\t0x02, 0x62, 0x79, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x06, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65,\n\t0x88, 0x01, 0x01, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x62, 0x79, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x69,\n\t0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0xf2, 0x01, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52,\n\t0x75, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65,\n\t0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0e,\n\t0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x88, 0x01,\n\t0x01, 0x12, 0x13, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52,\n\t0x02, 0x62, 0x79, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x88, 0x01,\n\t0x01, 0x12, 0x31, 0x0a, 0x05, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x52, 0x05, 0x6f,\n\t0x6e, 0x65, 0x6f, 0x66, 0x12, 0x2f, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x05, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x52, 0x03, 0x65, 0x6e, 0x76, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d,\n\t0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x62, 0x79,\n\t0x42, 0x08, 0x0a, 0x06, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x89, 0x01, 0x0a, 0x0a, 0x46,\n\t0x69, 0x65, 0x6c, 0x64, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x12, 0x10, 0x0a, 0x02, 0x69, 0x66, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x69, 0x66, 0x12, 0x1a, 0x0a, 0x07, 0x64,\n\t0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x07,\n\t0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x03,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44,\n\t0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x0e,\n\t0x0a, 0x02, 0x62, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x62, 0x79, 0x42, 0x06,\n\t0x0a, 0x04, 0x63, 0x6f, 0x6e, 0x64, 0x22, 0x45, 0x0a, 0x09, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75,\n\t0x67, 0x69, 0x6e, 0x12, 0x38, 0x0a, 0x06, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20,\n\t0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x45,\n\t0x78, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x06, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x22, 0xaf, 0x02,\n\t0x0a, 0x0f, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x45, 0x78, 0x70, 0x6f, 0x72,\n\t0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x36, 0x0a, 0x05, 0x74, 0x79, 0x70,\n\t0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x52, 0x65,\n\t0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x74, 0x79, 0x70, 0x65,\n\t0x73, 0x12, 0x3a, 0x0a, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69,\n\t0x6f, 0x6e, 0x52, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3a, 0x0a,\n\t0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x09,\n\t0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x44, 0x0a, 0x0a, 0x63, 0x61, 0x70,\n\t0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c,\n\t0x69, 0x74, 0x79, 0x52, 0x0a, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22,\n\t0x9b, 0x02, 0x0a, 0x13, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x70,\n\t0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x3e, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e,\n\t0x45, 0x6e, 0x76, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x48, 0x00, 0x52,\n\t0x03, 0x65, 0x6e, 0x76, 0x88, 0x01, 0x01, 0x12, 0x54, 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x65, 0x5f,\n\t0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43,\n\t0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x73, 0x74,\n\t0x65, 0x6d, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x48, 0x01, 0x52, 0x0a,\n\t0x66, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x4a, 0x0a,\n\t0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b,\n\t0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72,\n\t0x6b, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x48, 0x02, 0x52, 0x07, 0x6e,\n\t0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x88, 0x01, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x65, 0x6e,\n\t0x76, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65,\n\t0x6d, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x40, 0x0a,\n\t0x16, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x45, 0x6e, 0x76, 0x43, 0x61, 0x70,\n\t0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d,\n\t0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22,\n\t0x3e, 0x0a, 0x1d, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65,\n\t0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79,\n\t0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 0x74, 0x68, 0x22,\n\t0x1c, 0x0a, 0x1a, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x4e, 0x65, 0x74, 0x77,\n\t0x6f, 0x72, 0x6b, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22, 0xa1, 0x01,\n\t0x0a, 0x0b, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x38, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x03, 0x20,\n\t0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,\n\t0x6e, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12,\n\t0x30, 0x0a, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72,\n\t0x6e, 0x22, 0x71, 0x0a, 0x0f, 0x43, 0x45, 0x4c, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72,\n\t0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x36, 0x0a, 0x07,\n\t0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x6d, 0x65, 0x74,\n\t0x68, 0x6f, 0x64, 0x73, 0x22, 0x6b, 0x0a, 0x13, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74,\n\t0x69, 0x6f, 0x6e, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,\n\t0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64,\n\t0x65, 0x73, 0x63, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70,\n\t0x65, 0x22, 0xdd, 0x01, 0x0a, 0x07, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2f, 0x0a,\n\t0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x79,\n\t0x70, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x36,\n\t0x0a, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65,\n\t0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2f, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65,\n\t0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x70, 0x12, 0x1a, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61,\n\t0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28,\n\t0x09, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70,\n\t0x65, 0x22, 0x68, 0x0a, 0x0a, 0x43, 0x45, 0x4c, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65, 0x12,\n\t0x2a, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43,\n\t0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76,\n\t0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70,\n\t0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c,\n\t0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x63, 0x0a, 0x0b, 0x43,\n\t0x45, 0x4c, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12,\n\t0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65,\n\t0x73, 0x63, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65,\n\t0x2a, 0x5e, 0x0a, 0x08, 0x54, 0x79, 0x70, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x0b, 0x0a, 0x07,\n\t0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52,\n\t0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x4f, 0x4f, 0x4c, 0x10, 0x02, 0x12,\n\t0x09, 0x0a, 0x05, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x49,\n\t0x4e, 0x54, 0x36, 0x34, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45,\n\t0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x06,\n\t0x3a, 0x4c, 0x0a, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x46, 0x69, 0x6c, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x3a, 0x58,\n\t0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52,\n\t0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x3a, 0x54, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a, 0x58,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52,\n\t0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x50, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c,\n\t0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52,\n\t0x75, 0x6c, 0x65, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x3a, 0x4c, 0x0a, 0x04, 0x65, 0x6e,\n\t0x75, 0x6d, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x75,\n\t0x6c, 0x65, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x3a, 0x61, 0x0a, 0x0a, 0x65, 0x6e, 0x75, 0x6d,\n\t0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c,\n\t0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x1e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x75, 0x6c, 0x65,\n\t0x52, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x50, 0x0a, 0x05, 0x6f,\n\t0x6e, 0x65, 0x6f, 0x66, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70,\n\t0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x6e, 0x65,\n\t0x6f, 0x66, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x42, 0xc2, 0x01,\n\t0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0f, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,\n\t0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x65, 0x72, 0x63, 0x61, 0x72, 0x69, 0x2f, 0x67, 0x72, 0x70,\n\t0x63, 0x2d, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x67, 0x72, 0x70,\n\t0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xa2, 0x02, 0x03, 0x47, 0x46, 0x58, 0xaa, 0x02, 0x0f,\n\t0x47, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xca,\n\t0x02, 0x0f, 0x47, 0x72, 0x70, 0x63, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0xe2, 0x02, 0x1b, 0x47, 0x72, 0x70, 0x63, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea,\n\t0x02, 0x10, 0x47, 0x72, 0x70, 0x63, 0x3a, 0x3a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_grpc_federation_federation_proto_rawDescOnce sync.Once\n\tfile_grpc_federation_federation_proto_rawDescData = file_grpc_federation_federation_proto_rawDesc\n)\n\nfunc file_grpc_federation_federation_proto_rawDescGZIP() []byte {\n\tfile_grpc_federation_federation_proto_rawDescOnce.Do(func() {\n\t\tfile_grpc_federation_federation_proto_rawDescData = protoimpl.X.CompressGZIP(file_grpc_federation_federation_proto_rawDescData)\n\t})\n\treturn file_grpc_federation_federation_proto_rawDescData\n}\n\nvar file_grpc_federation_federation_proto_enumTypes = make([]protoimpl.EnumInfo, 2)\nvar file_grpc_federation_federation_proto_msgTypes = make([]protoimpl.MessageInfo, 48)\nvar file_grpc_federation_federation_proto_goTypes = []interface{}{\n\t(TypeKind)(0),                          // 0: grpc.federation.TypeKind\n\t(GRPCError_LogLevel)(0),                // 1: grpc.federation.GRPCError.LogLevel\n\t(*FileRule)(nil),                       // 2: grpc.federation.FileRule\n\t(*EnumRule)(nil),                       // 3: grpc.federation.EnumRule\n\t(*EnumValueRule)(nil),                  // 4: grpc.federation.EnumValueRule\n\t(*EnumValueAttribute)(nil),             // 5: grpc.federation.EnumValueAttribute\n\t(*OneofRule)(nil),                      // 6: grpc.federation.OneofRule\n\t(*ServiceRule)(nil),                    // 7: grpc.federation.ServiceRule\n\t(*Env)(nil),                            // 8: grpc.federation.Env\n\t(*ServiceVariable)(nil),                // 9: grpc.federation.ServiceVariable\n\t(*ServiceVariableValidationExpr)(nil),  // 10: grpc.federation.ServiceVariableValidationExpr\n\t(*EnvVar)(nil),                         // 11: grpc.federation.EnvVar\n\t(*EnvType)(nil),                        // 12: grpc.federation.EnvType\n\t(*EnvMapType)(nil),                     // 13: grpc.federation.EnvMapType\n\t(*EnvVarOption)(nil),                   // 14: grpc.federation.EnvVarOption\n\t(*MethodRule)(nil),                     // 15: grpc.federation.MethodRule\n\t(*MessageRule)(nil),                    // 16: grpc.federation.MessageRule\n\t(*VariableDefinition)(nil),             // 17: grpc.federation.VariableDefinition\n\t(*MapExpr)(nil),                        // 18: grpc.federation.MapExpr\n\t(*Iterator)(nil),                       // 19: grpc.federation.Iterator\n\t(*MessageExpr)(nil),                    // 20: grpc.federation.MessageExpr\n\t(*EnumExpr)(nil),                       // 21: grpc.federation.EnumExpr\n\t(*CallExpr)(nil),                       // 22: grpc.federation.CallExpr\n\t(*SwitchExpr)(nil),                     // 23: grpc.federation.SwitchExpr\n\t(*SwitchCaseExpr)(nil),                 // 24: grpc.federation.SwitchCaseExpr\n\t(*SwitchDefaultExpr)(nil),              // 25: grpc.federation.SwitchDefaultExpr\n\t(*GRPCError)(nil),                      // 26: grpc.federation.GRPCError\n\t(*GRPCErrorDetail)(nil),                // 27: grpc.federation.GRPCErrorDetail\n\t(*GRPCCallOption)(nil),                 // 28: grpc.federation.GRPCCallOption\n\t(*ValidationExpr)(nil),                 // 29: grpc.federation.ValidationExpr\n\t(*RetryPolicy)(nil),                    // 30: grpc.federation.RetryPolicy\n\t(*RetryPolicyConstant)(nil),            // 31: grpc.federation.RetryPolicyConstant\n\t(*RetryPolicyExponential)(nil),         // 32: grpc.federation.RetryPolicyExponential\n\t(*MethodRequest)(nil),                  // 33: grpc.federation.MethodRequest\n\t(*MethodResponse)(nil),                 // 34: grpc.federation.MethodResponse\n\t(*Argument)(nil),                       // 35: grpc.federation.Argument\n\t(*FieldRule)(nil),                      // 36: grpc.federation.FieldRule\n\t(*FieldOneof)(nil),                     // 37: grpc.federation.FieldOneof\n\t(*CELPlugin)(nil),                      // 38: grpc.federation.CELPlugin\n\t(*CELPluginExport)(nil),                // 39: grpc.federation.CELPluginExport\n\t(*CELPluginCapability)(nil),            // 40: grpc.federation.CELPluginCapability\n\t(*CELPluginEnvCapability)(nil),         // 41: grpc.federation.CELPluginEnvCapability\n\t(*CELPluginFileSystemCapability)(nil),  // 42: grpc.federation.CELPluginFileSystemCapability\n\t(*CELPluginNetworkCapability)(nil),     // 43: grpc.federation.CELPluginNetworkCapability\n\t(*CELFunction)(nil),                    // 44: grpc.federation.CELFunction\n\t(*CELReceiverType)(nil),                // 45: grpc.federation.CELReceiverType\n\t(*CELFunctionArgument)(nil),            // 46: grpc.federation.CELFunctionArgument\n\t(*CELType)(nil),                        // 47: grpc.federation.CELType\n\t(*CELMapType)(nil),                     // 48: grpc.federation.CELMapType\n\t(*CELVariable)(nil),                    // 49: grpc.federation.CELVariable\n\t(code.Code)(0),                         // 50: google.rpc.Code\n\t(*errdetails.ErrorInfo)(nil),           // 51: google.rpc.ErrorInfo\n\t(*errdetails.RetryInfo)(nil),           // 52: google.rpc.RetryInfo\n\t(*errdetails.DebugInfo)(nil),           // 53: google.rpc.DebugInfo\n\t(*errdetails.QuotaFailure)(nil),        // 54: google.rpc.QuotaFailure\n\t(*errdetails.PreconditionFailure)(nil), // 55: google.rpc.PreconditionFailure\n\t(*errdetails.BadRequest)(nil),          // 56: google.rpc.BadRequest\n\t(*errdetails.RequestInfo)(nil),         // 57: google.rpc.RequestInfo\n\t(*errdetails.ResourceInfo)(nil),        // 58: google.rpc.ResourceInfo\n\t(*errdetails.Help)(nil),                // 59: google.rpc.Help\n\t(*errdetails.LocalizedMessage)(nil),    // 60: google.rpc.LocalizedMessage\n\t(*descriptorpb.FileOptions)(nil),       // 61: google.protobuf.FileOptions\n\t(*descriptorpb.ServiceOptions)(nil),    // 62: google.protobuf.ServiceOptions\n\t(*descriptorpb.MethodOptions)(nil),     // 63: google.protobuf.MethodOptions\n\t(*descriptorpb.MessageOptions)(nil),    // 64: google.protobuf.MessageOptions\n\t(*descriptorpb.FieldOptions)(nil),      // 65: google.protobuf.FieldOptions\n\t(*descriptorpb.EnumOptions)(nil),       // 66: google.protobuf.EnumOptions\n\t(*descriptorpb.EnumValueOptions)(nil),  // 67: google.protobuf.EnumValueOptions\n\t(*descriptorpb.OneofOptions)(nil),      // 68: google.protobuf.OneofOptions\n}\nvar file_grpc_federation_federation_proto_depIdxs = []int32{\n\t38, // 0: grpc.federation.FileRule.plugin:type_name -> grpc.federation.CELPlugin\n\t5,  // 1: grpc.federation.EnumValueRule.attr:type_name -> grpc.federation.EnumValueAttribute\n\t8,  // 2: grpc.federation.ServiceRule.env:type_name -> grpc.federation.Env\n\t9,  // 3: grpc.federation.ServiceRule.var:type_name -> grpc.federation.ServiceVariable\n\t11, // 4: grpc.federation.Env.var:type_name -> grpc.federation.EnvVar\n\t18, // 5: grpc.federation.ServiceVariable.map:type_name -> grpc.federation.MapExpr\n\t20, // 6: grpc.federation.ServiceVariable.message:type_name -> grpc.federation.MessageExpr\n\t10, // 7: grpc.federation.ServiceVariable.validation:type_name -> grpc.federation.ServiceVariableValidationExpr\n\t21, // 8: grpc.federation.ServiceVariable.enum:type_name -> grpc.federation.EnumExpr\n\t23, // 9: grpc.federation.ServiceVariable.switch:type_name -> grpc.federation.SwitchExpr\n\t12, // 10: grpc.federation.EnvVar.type:type_name -> grpc.federation.EnvType\n\t14, // 11: grpc.federation.EnvVar.option:type_name -> grpc.federation.EnvVarOption\n\t0,  // 12: grpc.federation.EnvType.kind:type_name -> grpc.federation.TypeKind\n\t12, // 13: grpc.federation.EnvType.repeated:type_name -> grpc.federation.EnvType\n\t13, // 14: grpc.federation.EnvType.map:type_name -> grpc.federation.EnvMapType\n\t12, // 15: grpc.federation.EnvMapType.key:type_name -> grpc.federation.EnvType\n\t12, // 16: grpc.federation.EnvMapType.value:type_name -> grpc.federation.EnvType\n\t17, // 17: grpc.federation.MessageRule.def:type_name -> grpc.federation.VariableDefinition\n\t18, // 18: grpc.federation.VariableDefinition.map:type_name -> grpc.federation.MapExpr\n\t20, // 19: grpc.federation.VariableDefinition.message:type_name -> grpc.federation.MessageExpr\n\t22, // 20: grpc.federation.VariableDefinition.call:type_name -> grpc.federation.CallExpr\n\t29, // 21: grpc.federation.VariableDefinition.validation:type_name -> grpc.federation.ValidationExpr\n\t21, // 22: grpc.federation.VariableDefinition.enum:type_name -> grpc.federation.EnumExpr\n\t23, // 23: grpc.federation.VariableDefinition.switch:type_name -> grpc.federation.SwitchExpr\n\t19, // 24: grpc.federation.MapExpr.iterator:type_name -> grpc.federation.Iterator\n\t20, // 25: grpc.federation.MapExpr.message:type_name -> grpc.federation.MessageExpr\n\t21, // 26: grpc.federation.MapExpr.enum:type_name -> grpc.federation.EnumExpr\n\t35, // 27: grpc.federation.MessageExpr.args:type_name -> grpc.federation.Argument\n\t33, // 28: grpc.federation.CallExpr.request:type_name -> grpc.federation.MethodRequest\n\t30, // 29: grpc.federation.CallExpr.retry:type_name -> grpc.federation.RetryPolicy\n\t26, // 30: grpc.federation.CallExpr.error:type_name -> grpc.federation.GRPCError\n\t28, // 31: grpc.federation.CallExpr.option:type_name -> grpc.federation.GRPCCallOption\n\t24, // 32: grpc.federation.SwitchExpr.case:type_name -> grpc.federation.SwitchCaseExpr\n\t25, // 33: grpc.federation.SwitchExpr.default:type_name -> grpc.federation.SwitchDefaultExpr\n\t17, // 34: grpc.federation.SwitchCaseExpr.def:type_name -> grpc.federation.VariableDefinition\n\t17, // 35: grpc.federation.SwitchDefaultExpr.def:type_name -> grpc.federation.VariableDefinition\n\t17, // 36: grpc.federation.GRPCError.def:type_name -> grpc.federation.VariableDefinition\n\t50, // 37: grpc.federation.GRPCError.code:type_name -> google.rpc.Code\n\t27, // 38: grpc.federation.GRPCError.details:type_name -> grpc.federation.GRPCErrorDetail\n\t1,  // 39: grpc.federation.GRPCError.log_level:type_name -> grpc.federation.GRPCError.LogLevel\n\t17, // 40: grpc.federation.GRPCErrorDetail.def:type_name -> grpc.federation.VariableDefinition\n\t20, // 41: grpc.federation.GRPCErrorDetail.message:type_name -> grpc.federation.MessageExpr\n\t51, // 42: grpc.federation.GRPCErrorDetail.error_info:type_name -> google.rpc.ErrorInfo\n\t52, // 43: grpc.federation.GRPCErrorDetail.retry_info:type_name -> google.rpc.RetryInfo\n\t53, // 44: grpc.federation.GRPCErrorDetail.debug_info:type_name -> google.rpc.DebugInfo\n\t54, // 45: grpc.federation.GRPCErrorDetail.quota_failure:type_name -> google.rpc.QuotaFailure\n\t55, // 46: grpc.federation.GRPCErrorDetail.precondition_failure:type_name -> google.rpc.PreconditionFailure\n\t56, // 47: grpc.federation.GRPCErrorDetail.bad_request:type_name -> google.rpc.BadRequest\n\t57, // 48: grpc.federation.GRPCErrorDetail.request_info:type_name -> google.rpc.RequestInfo\n\t58, // 49: grpc.federation.GRPCErrorDetail.resource_info:type_name -> google.rpc.ResourceInfo\n\t59, // 50: grpc.federation.GRPCErrorDetail.help:type_name -> google.rpc.Help\n\t60, // 51: grpc.federation.GRPCErrorDetail.localized_message:type_name -> google.rpc.LocalizedMessage\n\t26, // 52: grpc.federation.ValidationExpr.error:type_name -> grpc.federation.GRPCError\n\t31, // 53: grpc.federation.RetryPolicy.constant:type_name -> grpc.federation.RetryPolicyConstant\n\t32, // 54: grpc.federation.RetryPolicy.exponential:type_name -> grpc.federation.RetryPolicyExponential\n\t37, // 55: grpc.federation.FieldRule.oneof:type_name -> grpc.federation.FieldOneof\n\t14, // 56: grpc.federation.FieldRule.env:type_name -> grpc.federation.EnvVarOption\n\t17, // 57: grpc.federation.FieldOneof.def:type_name -> grpc.federation.VariableDefinition\n\t39, // 58: grpc.federation.CELPlugin.export:type_name -> grpc.federation.CELPluginExport\n\t45, // 59: grpc.federation.CELPluginExport.types:type_name -> grpc.federation.CELReceiverType\n\t44, // 60: grpc.federation.CELPluginExport.functions:type_name -> grpc.federation.CELFunction\n\t49, // 61: grpc.federation.CELPluginExport.variables:type_name -> grpc.federation.CELVariable\n\t40, // 62: grpc.federation.CELPluginExport.capability:type_name -> grpc.federation.CELPluginCapability\n\t41, // 63: grpc.federation.CELPluginCapability.env:type_name -> grpc.federation.CELPluginEnvCapability\n\t42, // 64: grpc.federation.CELPluginCapability.file_system:type_name -> grpc.federation.CELPluginFileSystemCapability\n\t43, // 65: grpc.federation.CELPluginCapability.network:type_name -> grpc.federation.CELPluginNetworkCapability\n\t46, // 66: grpc.federation.CELFunction.args:type_name -> grpc.federation.CELFunctionArgument\n\t47, // 67: grpc.federation.CELFunction.return:type_name -> grpc.federation.CELType\n\t44, // 68: grpc.federation.CELReceiverType.methods:type_name -> grpc.federation.CELFunction\n\t47, // 69: grpc.federation.CELFunctionArgument.type:type_name -> grpc.federation.CELType\n\t0,  // 70: grpc.federation.CELType.kind:type_name -> grpc.federation.TypeKind\n\t47, // 71: grpc.federation.CELType.repeated:type_name -> grpc.federation.CELType\n\t48, // 72: grpc.federation.CELType.map:type_name -> grpc.federation.CELMapType\n\t47, // 73: grpc.federation.CELMapType.key:type_name -> grpc.federation.CELType\n\t47, // 74: grpc.federation.CELMapType.value:type_name -> grpc.federation.CELType\n\t47, // 75: grpc.federation.CELVariable.type:type_name -> grpc.federation.CELType\n\t61, // 76: grpc.federation.file:extendee -> google.protobuf.FileOptions\n\t62, // 77: grpc.federation.service:extendee -> google.protobuf.ServiceOptions\n\t63, // 78: grpc.federation.method:extendee -> google.protobuf.MethodOptions\n\t64, // 79: grpc.federation.message:extendee -> google.protobuf.MessageOptions\n\t65, // 80: grpc.federation.field:extendee -> google.protobuf.FieldOptions\n\t66, // 81: grpc.federation.enum:extendee -> google.protobuf.EnumOptions\n\t67, // 82: grpc.federation.enum_value:extendee -> google.protobuf.EnumValueOptions\n\t68, // 83: grpc.federation.oneof:extendee -> google.protobuf.OneofOptions\n\t2,  // 84: grpc.federation.file:type_name -> grpc.federation.FileRule\n\t7,  // 85: grpc.federation.service:type_name -> grpc.federation.ServiceRule\n\t15, // 86: grpc.federation.method:type_name -> grpc.federation.MethodRule\n\t16, // 87: grpc.federation.message:type_name -> grpc.federation.MessageRule\n\t36, // 88: grpc.federation.field:type_name -> grpc.federation.FieldRule\n\t3,  // 89: grpc.federation.enum:type_name -> grpc.federation.EnumRule\n\t4,  // 90: grpc.federation.enum_value:type_name -> grpc.federation.EnumValueRule\n\t6,  // 91: grpc.federation.oneof:type_name -> grpc.federation.OneofRule\n\t92, // [92:92] is the sub-list for method output_type\n\t92, // [92:92] is the sub-list for method input_type\n\t84, // [84:92] is the sub-list for extension type_name\n\t76, // [76:84] is the sub-list for extension extendee\n\t0,  // [0:76] is the sub-list for field type_name\n}\n\nfunc init() { file_grpc_federation_federation_proto_init() }\nfunc file_grpc_federation_federation_proto_init() {\n\tif File_grpc_federation_federation_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_grpc_federation_federation_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*FileRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumValueRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumValueAttribute); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*OneofRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Env); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceVariable); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceVariableValidationExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvVar); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvMapType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvVarOption); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MethodRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MessageRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*VariableDefinition); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MapExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Iterator); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MessageExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CallExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SwitchExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SwitchCaseExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SwitchDefaultExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GRPCError); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GRPCErrorDetail); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GRPCCallOption); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ValidationExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RetryPolicy); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RetryPolicyConstant); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RetryPolicyExponential); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MethodRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MethodResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Argument); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*FieldRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*FieldOneof); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPlugin); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginExport); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginEnvCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginFileSystemCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginNetworkCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELFunction); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELReceiverType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELFunctionArgument); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELMapType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELVariable); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[2].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[7].OneofWrappers = []interface{}{\n\t\t(*ServiceVariable_By)(nil),\n\t\t(*ServiceVariable_Map)(nil),\n\t\t(*ServiceVariable_Message)(nil),\n\t\t(*ServiceVariable_Validation)(nil),\n\t\t(*ServiceVariable_Enum)(nil),\n\t\t(*ServiceVariable_Switch)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[9].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[10].OneofWrappers = []interface{}{\n\t\t(*EnvType_Kind)(nil),\n\t\t(*EnvType_Repeated)(nil),\n\t\t(*EnvType_Map)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[12].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[13].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[14].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[15].OneofWrappers = []interface{}{\n\t\t(*VariableDefinition_By)(nil),\n\t\t(*VariableDefinition_Map)(nil),\n\t\t(*VariableDefinition_Message)(nil),\n\t\t(*VariableDefinition_Call)(nil),\n\t\t(*VariableDefinition_Validation)(nil),\n\t\t(*VariableDefinition_Enum)(nil),\n\t\t(*VariableDefinition_Switch)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[16].OneofWrappers = []interface{}{\n\t\t(*MapExpr_By)(nil),\n\t\t(*MapExpr_Message)(nil),\n\t\t(*MapExpr_Enum)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[20].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[22].OneofWrappers = []interface{}{\n\t\t(*SwitchCaseExpr_By)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[23].OneofWrappers = []interface{}{\n\t\t(*SwitchDefaultExpr_By)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[24].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[26].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[27].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[28].OneofWrappers = []interface{}{\n\t\t(*RetryPolicy_Constant)(nil),\n\t\t(*RetryPolicy_Exponential)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[29].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[30].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[31].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[32].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[33].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[34].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[35].OneofWrappers = []interface{}{\n\t\t(*FieldOneof_If)(nil),\n\t\t(*FieldOneof_Default)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[38].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[45].OneofWrappers = []interface{}{\n\t\t(*CELType_Kind)(nil),\n\t\t(*CELType_Repeated)(nil),\n\t\t(*CELType_Map)(nil),\n\t\t(*CELType_Message)(nil),\n\t\t(*CELType_Enum)(nil),\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_grpc_federation_federation_proto_rawDesc,\n\t\t\tNumEnums:      2,\n\t\t\tNumMessages:   48,\n\t\t\tNumExtensions: 8,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_grpc_federation_federation_proto_goTypes,\n\t\tDependencyIndexes: file_grpc_federation_federation_proto_depIdxs,\n\t\tEnumInfos:         file_grpc_federation_federation_proto_enumTypes,\n\t\tMessageInfos:      file_grpc_federation_federation_proto_msgTypes,\n\t\tExtensionInfos:    file_grpc_federation_federation_proto_extTypes,\n\t}.Build()\n\tFile_grpc_federation_federation_proto = out.File\n\tfile_grpc_federation_federation_proto_rawDesc = nil\n\tfile_grpc_federation_federation_proto_goTypes = nil\n\tfile_grpc_federation_federation_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/06_alias/main_test.go",
    "content": "package main_test\n\nimport (\n\t\"context\"\n\t\"log/slog\"\n\t\"net\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\"\n\t\"go.opentelemetry.io/otel/propagation\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\tsdktrace \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.4.0\"\n\t\"go.uber.org/goleak\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/test/bufconn\"\n\n\t\"example/federation\"\n\t\"example/post\"\n\tpostv2 \"example/post/v2\"\n)\n\nconst bufSize = 1024\n\nvar (\n\tlistener     *bufconn.Listener\n\tpostClient   post.PostServiceClient\n\tpostv2Client postv2.PostServiceClient\n)\n\ntype clientConfig struct{}\n\nfunc (c *clientConfig) Org_Post_PostServiceClient(cfg federation.FederationServiceClientConfig) (post.PostServiceClient, error) {\n\treturn postClient, nil\n}\n\nfunc (c *clientConfig) Org_Post_V2_PostServiceClient(cfg federation.FederationServiceClientConfig) (postv2.PostServiceClient, error) {\n\treturn postv2Client, nil\n}\n\ntype PostServer struct {\n\t*post.UnimplementedPostServiceServer\n}\n\nfunc (s *PostServer) GetPost(ctx context.Context, req *post.GetPostRequest) (*post.GetPostResponse, error) {\n\treturn &post.GetPostResponse{\n\t\tPost: &post.Post{\n\t\t\tId: req.Id,\n\t\t\tData: &post.PostData{\n\t\t\t\tType:  post.PostDataType_POST_TYPE_C,\n\t\t\t\tTitle: \"foo\",\n\t\t\t\tContent: &post.PostContent{\n\t\t\t\t\tCategory: post.PostContent_CATEGORY_A,\n\t\t\t\t\tHead:     \"headhead\",\n\t\t\t\t\tBody:     \"bodybody\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}, nil\n}\n\ntype PostV2Server struct {\n\t*postv2.UnimplementedPostServiceServer\n}\n\nfunc (s *PostV2Server) GetPost(ctx context.Context, req *postv2.GetPostRequest) (*postv2.GetPostResponse, error) {\n\treturn &postv2.GetPostResponse{\n\t\tPost: &postv2.Post{\n\t\t\tId: req.Id,\n\t\t\tData: &postv2.PostData{\n\t\t\t\tType:  postv2.PostDataType_POST_V2_TYPE_C,\n\t\t\t\tTitle: \"foo2\",\n\t\t\t\tContent: &postv2.PostContent{\n\t\t\t\t\tCategory: postv2.PostContent_CATEGORY_A,\n\t\t\t\t\tHead:     \"headhead2\",\n\t\t\t\t\tBody:     \"bodybody2\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}, nil\n}\n\nfunc dialer(ctx context.Context, address string) (net.Conn, error) {\n\treturn listener.Dial()\n}\n\nfunc TestFederation(t *testing.T) {\n\tdefer goleak.VerifyNone(t)\n\tctx := context.Background()\n\tlistener = bufconn.Listen(bufSize)\n\n\tif os.Getenv(\"ENABLE_JAEGER\") != \"\" {\n\t\texporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithInsecure())\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttp := sdktrace.NewTracerProvider(\n\t\t\tsdktrace.WithBatcher(exporter),\n\t\t\tsdktrace.WithResource(\n\t\t\t\tresource.NewWithAttributes(\n\t\t\t\t\tsemconv.SchemaURL,\n\t\t\t\t\tsemconv.ServiceNameKey.String(\"example06/alias\"),\n\t\t\t\t\tsemconv.ServiceVersionKey.String(\"1.0.0\"),\n\t\t\t\t\tattribute.String(\"environment\", \"dev\"),\n\t\t\t\t),\n\t\t\t),\n\t\t\tsdktrace.WithSampler(sdktrace.AlwaysSample()),\n\t\t)\n\t\tdefer tp.Shutdown(ctx)\n\t\totel.SetTextMapPropagator(propagation.TraceContext{})\n\t\totel.SetTracerProvider(tp)\n\t}\n\n\tconn, err := grpc.DialContext(ctx, \"\", grpc.WithContextDialer(dialer), grpc.WithInsecure())\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer conn.Close()\n\n\tpostClient = post.NewPostServiceClient(conn)\n\tpostv2Client = postv2.NewPostServiceClient(conn)\n\n\tgrpcServer := grpc.NewServer()\n\tdefer grpcServer.Stop()\n\n\tlogger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{\n\t\tLevel: slog.LevelDebug,\n\t}))\n\tfederationServer, err := federation.NewFederationService(federation.FederationServiceConfig{\n\t\tClient: new(clientConfig),\n\t\tLogger: logger,\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer federation.CleanupFederationService(ctx, federationServer)\n\n\tpost.RegisterPostServiceServer(grpcServer, &PostServer{})\n\tpostv2.RegisterPostServiceServer(grpcServer, &PostV2Server{})\n\tfederation.RegisterFederationServiceServer(grpcServer, federationServer)\n\n\tgo func() {\n\t\tif err := grpcServer.Serve(listener); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t}()\n\n\tclient := federation.NewFederationServiceClient(conn)\n\tres, err := client.GetPost(ctx, &federation.GetPostRequest{\n\t\tId: \"foo\",\n\t\tCondition: &federation.GetPostRequest_A{\n\t\t\tA: &federation.GetPostRequest_ConditionA{\n\t\t\t\tProp: \"bar\",\n\t\t\t},\n\t\t},\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif diff := cmp.Diff(res, &federation.GetPostResponse{\n\t\tPost: &federation.Post{\n\t\t\tId: \"foo\",\n\t\t\tData: &federation.PostData{\n\t\t\t\tType:  federation.PostType_POST_TYPE_BAR,\n\t\t\t\tTitle: \"foo\",\n\t\t\t\tContent: &federation.PostContent{\n\t\t\t\t\tHead:    \"headhead\",\n\t\t\t\t\tBody:    \"bodybody\",\n\t\t\t\t\tDupBody: \"bodybody\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tData2: &federation.PostData{\n\t\t\t\tType:  federation.PostType_POST_TYPE_BAR,\n\t\t\t\tTitle: \"foo2\",\n\t\t\t\tContent: &federation.PostContent{\n\t\t\t\t\tHead:    \"headhead2\",\n\t\t\t\t\tBody:    \"bodybody2\",\n\t\t\t\t\tDupBody: \"bodybody2\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tM:     &post.M{X: \"xxx\"},\n\t\t\tType:  federation.PostType_POST_TYPE_BAR,\n\t\t\tType2: federation.PostType_POST_TYPE_BAR,\n\t\t\tType3: federation.PostType_POST_TYPE_BAR,\n\t\t\tType4: federation.PostType_POST_TYPE_FOO,\n\t\t},\n\t}, cmpopts.IgnoreUnexported(\n\t\tfederation.GetPostResponse{},\n\t\tfederation.Post{},\n\t\tfederation.PostData{},\n\t\tfederation.PostContent{},\n\t\tpost.M{},\n\t)); diff != \"\" {\n\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t}\n}\n"
  },
  {
    "path": "_examples/06_alias/post/post.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: post/post.proto\n\npackage post\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype PostDataType int32\n\nconst (\n\tPostDataType_POST_TYPE_A PostDataType = 0\n\tPostDataType_POST_TYPE_B PostDataType = 1\n\tPostDataType_POST_TYPE_C PostDataType = 2\n\tPostDataType_POST_TYPE_D PostDataType = 3\n)\n\n// Enum value maps for PostDataType.\nvar (\n\tPostDataType_name = map[int32]string{\n\t\t0: \"POST_TYPE_A\",\n\t\t1: \"POST_TYPE_B\",\n\t\t2: \"POST_TYPE_C\",\n\t\t3: \"POST_TYPE_D\",\n\t}\n\tPostDataType_value = map[string]int32{\n\t\t\"POST_TYPE_A\": 0,\n\t\t\"POST_TYPE_B\": 1,\n\t\t\"POST_TYPE_C\": 2,\n\t\t\"POST_TYPE_D\": 3,\n\t}\n)\n\nfunc (x PostDataType) Enum() *PostDataType {\n\tp := new(PostDataType)\n\t*p = x\n\treturn p\n}\n\nfunc (x PostDataType) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (PostDataType) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_post_post_proto_enumTypes[0].Descriptor()\n}\n\nfunc (PostDataType) Type() protoreflect.EnumType {\n\treturn &file_post_post_proto_enumTypes[0]\n}\n\nfunc (x PostDataType) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use PostDataType.Descriptor instead.\nfunc (PostDataType) EnumDescriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{0}\n}\n\ntype PostContent_Category int32\n\nconst (\n\tPostContent_CATEGORY_A PostContent_Category = 0\n\tPostContent_CATEGORY_B PostContent_Category = 1\n)\n\n// Enum value maps for PostContent_Category.\nvar (\n\tPostContent_Category_name = map[int32]string{\n\t\t0: \"CATEGORY_A\",\n\t\t1: \"CATEGORY_B\",\n\t}\n\tPostContent_Category_value = map[string]int32{\n\t\t\"CATEGORY_A\": 0,\n\t\t\"CATEGORY_B\": 1,\n\t}\n)\n\nfunc (x PostContent_Category) Enum() *PostContent_Category {\n\tp := new(PostContent_Category)\n\t*p = x\n\treturn p\n}\n\nfunc (x PostContent_Category) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (PostContent_Category) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_post_post_proto_enumTypes[1].Descriptor()\n}\n\nfunc (PostContent_Category) Type() protoreflect.EnumType {\n\treturn &file_post_post_proto_enumTypes[1]\n}\n\nfunc (x PostContent_Category) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use PostContent_Category.Descriptor instead.\nfunc (PostContent_Category) EnumDescriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{4, 0}\n}\n\ntype GetPostRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\t// Types that are assignable to Condition:\n\t//\n\t//\t*GetPostRequest_A\n\t//\t*GetPostRequest_B\n\tCondition isGetPostRequest_Condition `protobuf_oneof:\"condition\"`\n}\n\nfunc (x *GetPostRequest) Reset() {\n\t*x = GetPostRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostRequest) ProtoMessage() {}\n\nfunc (x *GetPostRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostRequest.ProtoReflect.Descriptor instead.\nfunc (*GetPostRequest) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetPostRequest) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (m *GetPostRequest) GetCondition() isGetPostRequest_Condition {\n\tif m != nil {\n\t\treturn m.Condition\n\t}\n\treturn nil\n}\n\nfunc (x *GetPostRequest) GetA() *PostConditionA {\n\tif x, ok := x.GetCondition().(*GetPostRequest_A); ok {\n\t\treturn x.A\n\t}\n\treturn nil\n}\n\nfunc (x *GetPostRequest) GetB() *PostConditionB {\n\tif x, ok := x.GetCondition().(*GetPostRequest_B); ok {\n\t\treturn x.B\n\t}\n\treturn nil\n}\n\ntype isGetPostRequest_Condition interface {\n\tisGetPostRequest_Condition()\n}\n\ntype GetPostRequest_A struct {\n\tA *PostConditionA `protobuf:\"bytes,2,opt,name=a,proto3,oneof\"`\n}\n\ntype GetPostRequest_B struct {\n\tB *PostConditionB `protobuf:\"bytes,3,opt,name=b,proto3,oneof\"`\n}\n\nfunc (*GetPostRequest_A) isGetPostRequest_Condition() {}\n\nfunc (*GetPostRequest_B) isGetPostRequest_Condition() {}\n\ntype GetPostResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPost *Post `protobuf:\"bytes,1,opt,name=post,proto3\" json:\"post,omitempty\"`\n}\n\nfunc (x *GetPostResponse) Reset() {\n\t*x = GetPostResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostResponse) ProtoMessage() {}\n\nfunc (x *GetPostResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostResponse.ProtoReflect.Descriptor instead.\nfunc (*GetPostResponse) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetPostResponse) GetPost() *Post {\n\tif x != nil {\n\t\treturn x.Post\n\t}\n\treturn nil\n}\n\ntype Post struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId   string    `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tData *PostData `protobuf:\"bytes,2,opt,name=data,proto3\" json:\"data,omitempty\"`\n}\n\nfunc (x *Post) Reset() {\n\t*x = Post{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Post) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Post) ProtoMessage() {}\n\nfunc (x *Post) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Post.ProtoReflect.Descriptor instead.\nfunc (*Post) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *Post) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetData() *PostData {\n\tif x != nil {\n\t\treturn x.Data\n\t}\n\treturn nil\n}\n\ntype PostData struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tType    PostDataType `protobuf:\"varint,1,opt,name=type,proto3,enum=org.post.PostDataType\" json:\"type,omitempty\"`\n\tTitle   string       `protobuf:\"bytes,2,opt,name=title,proto3\" json:\"title,omitempty\"`\n\tContent *PostContent `protobuf:\"bytes,3,opt,name=content,proto3\" json:\"content,omitempty\"`\n\tData    string       `protobuf:\"bytes,4,opt,name=data,proto3\" json:\"data,omitempty\"`\n}\n\nfunc (x *PostData) Reset() {\n\t*x = PostData{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *PostData) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*PostData) ProtoMessage() {}\n\nfunc (x *PostData) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use PostData.ProtoReflect.Descriptor instead.\nfunc (*PostData) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *PostData) GetType() PostDataType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn PostDataType_POST_TYPE_A\n}\n\nfunc (x *PostData) GetTitle() string {\n\tif x != nil {\n\t\treturn x.Title\n\t}\n\treturn \"\"\n}\n\nfunc (x *PostData) GetContent() *PostContent {\n\tif x != nil {\n\t\treturn x.Content\n\t}\n\treturn nil\n}\n\nfunc (x *PostData) GetData() string {\n\tif x != nil {\n\t\treturn x.Data\n\t}\n\treturn \"\"\n}\n\ntype PostContent struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tCategory PostContent_Category `protobuf:\"varint,1,opt,name=category,proto3,enum=org.post.PostContent_Category\" json:\"category,omitempty\"`\n\tHead     string               `protobuf:\"bytes,2,opt,name=head,proto3\" json:\"head,omitempty\"`\n\tBody     string               `protobuf:\"bytes,3,opt,name=body,proto3\" json:\"body,omitempty\"`\n\tCounts   map[int32]int32      `protobuf:\"bytes,4,rep,name=counts,proto3\" json:\"counts,omitempty\" protobuf_key:\"varint,1,opt,name=key,proto3\" protobuf_val:\"varint,2,opt,name=value,proto3\"`\n}\n\nfunc (x *PostContent) Reset() {\n\t*x = PostContent{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *PostContent) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*PostContent) ProtoMessage() {}\n\nfunc (x *PostContent) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use PostContent.ProtoReflect.Descriptor instead.\nfunc (*PostContent) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *PostContent) GetCategory() PostContent_Category {\n\tif x != nil {\n\t\treturn x.Category\n\t}\n\treturn PostContent_CATEGORY_A\n}\n\nfunc (x *PostContent) GetHead() string {\n\tif x != nil {\n\t\treturn x.Head\n\t}\n\treturn \"\"\n}\n\nfunc (x *PostContent) GetBody() string {\n\tif x != nil {\n\t\treturn x.Body\n\t}\n\treturn \"\"\n}\n\nfunc (x *PostContent) GetCounts() map[int32]int32 {\n\tif x != nil {\n\t\treturn x.Counts\n\t}\n\treturn nil\n}\n\ntype PostConditionA struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tProp string `protobuf:\"bytes,1,opt,name=prop,proto3\" json:\"prop,omitempty\"`\n}\n\nfunc (x *PostConditionA) Reset() {\n\t*x = PostConditionA{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *PostConditionA) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*PostConditionA) ProtoMessage() {}\n\nfunc (x *PostConditionA) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use PostConditionA.ProtoReflect.Descriptor instead.\nfunc (*PostConditionA) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *PostConditionA) GetProp() string {\n\tif x != nil {\n\t\treturn x.Prop\n\t}\n\treturn \"\"\n}\n\ntype PostConditionB struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *PostConditionB) Reset() {\n\t*x = PostConditionB{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *PostConditionB) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*PostConditionB) ProtoMessage() {}\n\nfunc (x *PostConditionB) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use PostConditionB.ProtoReflect.Descriptor instead.\nfunc (*PostConditionB) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{6}\n}\n\ntype M struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tX string `protobuf:\"bytes,1,opt,name=x,proto3\" json:\"x,omitempty\"`\n}\n\nfunc (x *M) Reset() {\n\t*x = M{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *M) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*M) ProtoMessage() {}\n\nfunc (x *M) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use M.ProtoReflect.Descriptor instead.\nfunc (*M) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{7}\n}\n\nfunc (x *M) GetX() string {\n\tif x != nil {\n\t\treturn x.X\n\t}\n\treturn \"\"\n}\n\nvar File_post_post_proto protoreflect.FileDescriptor\n\nvar file_post_post_proto_rawDesc = []byte{\n\t0x0a, 0x0f, 0x70, 0x6f, 0x73, 0x74, 0x2f, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x08, 0x6f, 0x72, 0x67, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x81, 0x01, 0x0a, 0x0e,\n\t0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e,\n\t0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x28,\n\t0x0a, 0x01, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x72, 0x67, 0x2e,\n\t0x70, 0x6f, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69,\n\t0x6f, 0x6e, 0x41, 0x48, 0x00, 0x52, 0x01, 0x61, 0x12, 0x28, 0x0a, 0x01, 0x62, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x50,\n\t0x6f, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x48, 0x00, 0x52,\n\t0x01, 0x62, 0x42, 0x0b, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22,\n\t0x35, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,\n\t0x73, 0x65, 0x12, 0x22, 0x0a, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x0e, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74,\n\t0x52, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x3e, 0x0a, 0x04, 0x50, 0x6f, 0x73, 0x74, 0x12, 0x0e,\n\t0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x26,\n\t0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6f,\n\t0x72, 0x67, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61,\n\t0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x91, 0x01, 0x0a, 0x08, 0x50, 0x6f, 0x73, 0x74, 0x44,\n\t0x61, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x0e, 0x32, 0x16, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73,\n\t0x74, 0x44, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12,\n\t0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,\n\t0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x2f, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x70, 0x6f, 0x73,\n\t0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x07, 0x63,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x93, 0x02, 0x0a, 0x0b, 0x50,\n\t0x6f, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x3a, 0x0a, 0x08, 0x63, 0x61,\n\t0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f,\n\t0x72, 0x67, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74,\n\t0x65, 0x6e, 0x74, 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52, 0x08, 0x63, 0x61,\n\t0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x65, 0x61, 0x64, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x65, 0x61, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f,\n\t0x64, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x39,\n\t0x0a, 0x06, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21,\n\t0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x43, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72,\n\t0x79, 0x52, 0x06, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x43, 0x6f, 0x75,\n\t0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61,\n\t0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,\n\t0x3a, 0x02, 0x38, 0x01, 0x22, 0x2a, 0x0a, 0x08, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79,\n\t0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x41, 0x10, 0x00,\n\t0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x42, 0x10, 0x01,\n\t0x22, 0x24, 0x0a, 0x0e, 0x50, 0x6f, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f,\n\t0x6e, 0x41, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x72, 0x6f, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x04, 0x70, 0x72, 0x6f, 0x70, 0x22, 0x10, 0x0a, 0x0e, 0x50, 0x6f, 0x73, 0x74, 0x43, 0x6f,\n\t0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x22, 0x11, 0x0a, 0x01, 0x4d, 0x12, 0x0c, 0x0a,\n\t0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x01, 0x78, 0x2a, 0x52, 0x0a, 0x0c, 0x50,\n\t0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x50,\n\t0x4f, 0x53, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b,\n\t0x50, 0x4f, 0x53, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x10, 0x01, 0x12, 0x0f, 0x0a,\n\t0x0b, 0x50, 0x4f, 0x53, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x10, 0x02, 0x12, 0x0f,\n\t0x0a, 0x0b, 0x50, 0x4f, 0x53, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x10, 0x03, 0x32,\n\t0x4f, 0x0a, 0x0b, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x40,\n\t0x0a, 0x07, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x12, 0x18, 0x2e, 0x6f, 0x72, 0x67, 0x2e,\n\t0x70, 0x6f, 0x73, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75,\n\t0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x47,\n\t0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00,\n\t0x42, 0x6d, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x70, 0x6f, 0x73, 0x74,\n\t0x42, 0x09, 0x50, 0x6f, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x11, 0x65,\n\t0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x70, 0x6f, 0x73, 0x74, 0x3b, 0x70, 0x6f, 0x73, 0x74,\n\t0xa2, 0x02, 0x03, 0x4f, 0x50, 0x58, 0xaa, 0x02, 0x08, 0x4f, 0x72, 0x67, 0x2e, 0x50, 0x6f, 0x73,\n\t0x74, 0xca, 0x02, 0x08, 0x4f, 0x72, 0x67, 0x5c, 0x50, 0x6f, 0x73, 0x74, 0xe2, 0x02, 0x14, 0x4f,\n\t0x72, 0x67, 0x5c, 0x50, 0x6f, 0x73, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64,\n\t0x61, 0x74, 0x61, 0xea, 0x02, 0x09, 0x4f, 0x72, 0x67, 0x3a, 0x3a, 0x50, 0x6f, 0x73, 0x74, 0x62,\n\t0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_post_post_proto_rawDescOnce sync.Once\n\tfile_post_post_proto_rawDescData = file_post_post_proto_rawDesc\n)\n\nfunc file_post_post_proto_rawDescGZIP() []byte {\n\tfile_post_post_proto_rawDescOnce.Do(func() {\n\t\tfile_post_post_proto_rawDescData = protoimpl.X.CompressGZIP(file_post_post_proto_rawDescData)\n\t})\n\treturn file_post_post_proto_rawDescData\n}\n\nvar file_post_post_proto_enumTypes = make([]protoimpl.EnumInfo, 2)\nvar file_post_post_proto_msgTypes = make([]protoimpl.MessageInfo, 9)\nvar file_post_post_proto_goTypes = []interface{}{\n\t(PostDataType)(0),         // 0: org.post.PostDataType\n\t(PostContent_Category)(0), // 1: org.post.PostContent.Category\n\t(*GetPostRequest)(nil),    // 2: org.post.GetPostRequest\n\t(*GetPostResponse)(nil),   // 3: org.post.GetPostResponse\n\t(*Post)(nil),              // 4: org.post.Post\n\t(*PostData)(nil),          // 5: org.post.PostData\n\t(*PostContent)(nil),       // 6: org.post.PostContent\n\t(*PostConditionA)(nil),    // 7: org.post.PostConditionA\n\t(*PostConditionB)(nil),    // 8: org.post.PostConditionB\n\t(*M)(nil),                 // 9: org.post.M\n\tnil,                       // 10: org.post.PostContent.CountsEntry\n}\nvar file_post_post_proto_depIdxs = []int32{\n\t7,  // 0: org.post.GetPostRequest.a:type_name -> org.post.PostConditionA\n\t8,  // 1: org.post.GetPostRequest.b:type_name -> org.post.PostConditionB\n\t4,  // 2: org.post.GetPostResponse.post:type_name -> org.post.Post\n\t5,  // 3: org.post.Post.data:type_name -> org.post.PostData\n\t0,  // 4: org.post.PostData.type:type_name -> org.post.PostDataType\n\t6,  // 5: org.post.PostData.content:type_name -> org.post.PostContent\n\t1,  // 6: org.post.PostContent.category:type_name -> org.post.PostContent.Category\n\t10, // 7: org.post.PostContent.counts:type_name -> org.post.PostContent.CountsEntry\n\t2,  // 8: org.post.PostService.GetPost:input_type -> org.post.GetPostRequest\n\t3,  // 9: org.post.PostService.GetPost:output_type -> org.post.GetPostResponse\n\t9,  // [9:10] is the sub-list for method output_type\n\t8,  // [8:9] is the sub-list for method input_type\n\t8,  // [8:8] is the sub-list for extension type_name\n\t8,  // [8:8] is the sub-list for extension extendee\n\t0,  // [0:8] is the sub-list for field type_name\n}\n\nfunc init() { file_post_post_proto_init() }\nfunc file_post_post_proto_init() {\n\tif File_post_post_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_post_post_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Post); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*PostData); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*PostContent); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*PostConditionA); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*PostConditionB); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*M); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\tfile_post_post_proto_msgTypes[0].OneofWrappers = []interface{}{\n\t\t(*GetPostRequest_A)(nil),\n\t\t(*GetPostRequest_B)(nil),\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_post_post_proto_rawDesc,\n\t\t\tNumEnums:      2,\n\t\t\tNumMessages:   9,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_post_post_proto_goTypes,\n\t\tDependencyIndexes: file_post_post_proto_depIdxs,\n\t\tEnumInfos:         file_post_post_proto_enumTypes,\n\t\tMessageInfos:      file_post_post_proto_msgTypes,\n\t}.Build()\n\tFile_post_post_proto = out.File\n\tfile_post_post_proto_rawDesc = nil\n\tfile_post_post_proto_goTypes = nil\n\tfile_post_post_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/06_alias/post/post_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: post/post.proto\n\npackage post\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tPostService_GetPost_FullMethodName = \"/org.post.PostService/GetPost\"\n)\n\n// PostServiceClient is the client API for PostService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype PostServiceClient interface {\n\tGetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error)\n}\n\ntype postServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewPostServiceClient(cc grpc.ClientConnInterface) PostServiceClient {\n\treturn &postServiceClient{cc}\n}\n\nfunc (c *postServiceClient) GetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error) {\n\tout := new(GetPostResponse)\n\terr := c.cc.Invoke(ctx, PostService_GetPost_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// PostServiceServer is the server API for PostService service.\n// All implementations must embed UnimplementedPostServiceServer\n// for forward compatibility\ntype PostServiceServer interface {\n\tGetPost(context.Context, *GetPostRequest) (*GetPostResponse, error)\n\tmustEmbedUnimplementedPostServiceServer()\n}\n\n// UnimplementedPostServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedPostServiceServer struct {\n}\n\nfunc (UnimplementedPostServiceServer) GetPost(context.Context, *GetPostRequest) (*GetPostResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetPost not implemented\")\n}\nfunc (UnimplementedPostServiceServer) mustEmbedUnimplementedPostServiceServer() {}\n\n// UnsafePostServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to PostServiceServer will\n// result in compilation errors.\ntype UnsafePostServiceServer interface {\n\tmustEmbedUnimplementedPostServiceServer()\n}\n\nfunc RegisterPostServiceServer(s grpc.ServiceRegistrar, srv PostServiceServer) {\n\ts.RegisterService(&PostService_ServiceDesc, srv)\n}\n\nfunc _PostService_GetPost_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetPostRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(PostServiceServer).GetPost(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: PostService_GetPost_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(PostServiceServer).GetPost(ctx, req.(*GetPostRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// PostService_ServiceDesc is the grpc.ServiceDesc for PostService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar PostService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"org.post.PostService\",\n\tHandlerType: (*PostServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetPost\",\n\t\t\tHandler:    _PostService_GetPost_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"post/post.proto\",\n}\n"
  },
  {
    "path": "_examples/06_alias/post/v2/extra.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: post/v2/extra.proto\n\npackage post\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// A second proto file in the v2 package, exercising the case where\n// multiple proto files share the same go_package.\ntype ExtraType int32\n\nconst (\n\tExtraType_EXTRA_TYPE_UNKNOWN ExtraType = 0\n\tExtraType_EXTRA_TYPE_A       ExtraType = 1\n\tExtraType_EXTRA_TYPE_B       ExtraType = 2\n)\n\n// Enum value maps for ExtraType.\nvar (\n\tExtraType_name = map[int32]string{\n\t\t0: \"EXTRA_TYPE_UNKNOWN\",\n\t\t1: \"EXTRA_TYPE_A\",\n\t\t2: \"EXTRA_TYPE_B\",\n\t}\n\tExtraType_value = map[string]int32{\n\t\t\"EXTRA_TYPE_UNKNOWN\": 0,\n\t\t\"EXTRA_TYPE_A\":       1,\n\t\t\"EXTRA_TYPE_B\":       2,\n\t}\n)\n\nfunc (x ExtraType) Enum() *ExtraType {\n\tp := new(ExtraType)\n\t*p = x\n\treturn p\n}\n\nfunc (x ExtraType) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (ExtraType) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_post_v2_extra_proto_enumTypes[0].Descriptor()\n}\n\nfunc (ExtraType) Type() protoreflect.EnumType {\n\treturn &file_post_v2_extra_proto_enumTypes[0]\n}\n\nfunc (x ExtraType) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use ExtraType.Descriptor instead.\nfunc (ExtraType) EnumDescriptor() ([]byte, []int) {\n\treturn file_post_v2_extra_proto_rawDescGZIP(), []int{0}\n}\n\nvar File_post_v2_extra_proto protoreflect.FileDescriptor\n\nvar file_post_v2_extra_proto_rawDesc = []byte{\n\t0x0a, 0x13, 0x70, 0x6f, 0x73, 0x74, 0x2f, 0x76, 0x32, 0x2f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0b, 0x6f, 0x72, 0x67, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e,\n\t0x76, 0x32, 0x2a, 0x47, 0x0a, 0x09, 0x45, 0x78, 0x74, 0x72, 0x61, 0x54, 0x79, 0x70, 0x65, 0x12,\n\t0x16, 0x0a, 0x12, 0x45, 0x58, 0x54, 0x52, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e,\n\t0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x45, 0x58, 0x54, 0x52, 0x41,\n\t0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x45, 0x58, 0x54,\n\t0x52, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x10, 0x02, 0x42, 0x81, 0x01, 0x0a, 0x0f,\n\t0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x76, 0x32, 0x42,\n\t0x0a, 0x45, 0x78, 0x74, 0x72, 0x61, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x14, 0x65,\n\t0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x70, 0x6f, 0x73, 0x74, 0x2f, 0x76, 0x32, 0x3b, 0x70,\n\t0x6f, 0x73, 0x74, 0xa2, 0x02, 0x03, 0x4f, 0x50, 0x58, 0xaa, 0x02, 0x0b, 0x4f, 0x72, 0x67, 0x2e,\n\t0x50, 0x6f, 0x73, 0x74, 0x2e, 0x56, 0x32, 0xca, 0x02, 0x0b, 0x4f, 0x72, 0x67, 0x5c, 0x50, 0x6f,\n\t0x73, 0x74, 0x5c, 0x56, 0x32, 0xe2, 0x02, 0x17, 0x4f, 0x72, 0x67, 0x5c, 0x50, 0x6f, 0x73, 0x74,\n\t0x5c, 0x56, 0x32, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea,\n\t0x02, 0x0d, 0x4f, 0x72, 0x67, 0x3a, 0x3a, 0x50, 0x6f, 0x73, 0x74, 0x3a, 0x3a, 0x56, 0x32, 0x62,\n\t0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_post_v2_extra_proto_rawDescOnce sync.Once\n\tfile_post_v2_extra_proto_rawDescData = file_post_v2_extra_proto_rawDesc\n)\n\nfunc file_post_v2_extra_proto_rawDescGZIP() []byte {\n\tfile_post_v2_extra_proto_rawDescOnce.Do(func() {\n\t\tfile_post_v2_extra_proto_rawDescData = protoimpl.X.CompressGZIP(file_post_v2_extra_proto_rawDescData)\n\t})\n\treturn file_post_v2_extra_proto_rawDescData\n}\n\nvar file_post_v2_extra_proto_enumTypes = make([]protoimpl.EnumInfo, 1)\nvar file_post_v2_extra_proto_goTypes = []interface{}{\n\t(ExtraType)(0), // 0: org.post.v2.ExtraType\n}\nvar file_post_v2_extra_proto_depIdxs = []int32{\n\t0, // [0:0] is the sub-list for method output_type\n\t0, // [0:0] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_post_v2_extra_proto_init() }\nfunc file_post_v2_extra_proto_init() {\n\tif File_post_v2_extra_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_post_v2_extra_proto_rawDesc,\n\t\t\tNumEnums:      1,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_post_v2_extra_proto_goTypes,\n\t\tDependencyIndexes: file_post_v2_extra_proto_depIdxs,\n\t\tEnumInfos:         file_post_v2_extra_proto_enumTypes,\n\t}.Build()\n\tFile_post_v2_extra_proto = out.File\n\tfile_post_v2_extra_proto_rawDesc = nil\n\tfile_post_v2_extra_proto_goTypes = nil\n\tfile_post_v2_extra_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/06_alias/post/v2/post.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: post/v2/post.proto\n\npackage post\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype PostDataType int32\n\nconst (\n\tPostDataType_POST_TYPE_A    PostDataType = 0\n\tPostDataType_POST_V2_TYPE_B PostDataType = 1\n\tPostDataType_POST_V2_TYPE_C PostDataType = 2\n\tPostDataType_POST_V2_TYPE_D PostDataType = 3\n)\n\n// Enum value maps for PostDataType.\nvar (\n\tPostDataType_name = map[int32]string{\n\t\t0: \"POST_TYPE_A\",\n\t\t1: \"POST_V2_TYPE_B\",\n\t\t2: \"POST_V2_TYPE_C\",\n\t\t3: \"POST_V2_TYPE_D\",\n\t}\n\tPostDataType_value = map[string]int32{\n\t\t\"POST_TYPE_A\":    0,\n\t\t\"POST_V2_TYPE_B\": 1,\n\t\t\"POST_V2_TYPE_C\": 2,\n\t\t\"POST_V2_TYPE_D\": 3,\n\t}\n)\n\nfunc (x PostDataType) Enum() *PostDataType {\n\tp := new(PostDataType)\n\t*p = x\n\treturn p\n}\n\nfunc (x PostDataType) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (PostDataType) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_post_v2_post_proto_enumTypes[0].Descriptor()\n}\n\nfunc (PostDataType) Type() protoreflect.EnumType {\n\treturn &file_post_v2_post_proto_enumTypes[0]\n}\n\nfunc (x PostDataType) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use PostDataType.Descriptor instead.\nfunc (PostDataType) EnumDescriptor() ([]byte, []int) {\n\treturn file_post_v2_post_proto_rawDescGZIP(), []int{0}\n}\n\ntype PostContent_Category int32\n\nconst (\n\tPostContent_CATEGORY_A PostContent_Category = 0\n\tPostContent_CATEGORY_B PostContent_Category = 1\n)\n\n// Enum value maps for PostContent_Category.\nvar (\n\tPostContent_Category_name = map[int32]string{\n\t\t0: \"CATEGORY_A\",\n\t\t1: \"CATEGORY_B\",\n\t}\n\tPostContent_Category_value = map[string]int32{\n\t\t\"CATEGORY_A\": 0,\n\t\t\"CATEGORY_B\": 1,\n\t}\n)\n\nfunc (x PostContent_Category) Enum() *PostContent_Category {\n\tp := new(PostContent_Category)\n\t*p = x\n\treturn p\n}\n\nfunc (x PostContent_Category) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (PostContent_Category) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_post_v2_post_proto_enumTypes[1].Descriptor()\n}\n\nfunc (PostContent_Category) Type() protoreflect.EnumType {\n\treturn &file_post_v2_post_proto_enumTypes[1]\n}\n\nfunc (x PostContent_Category) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use PostContent_Category.Descriptor instead.\nfunc (PostContent_Category) EnumDescriptor() ([]byte, []int) {\n\treturn file_post_v2_post_proto_rawDescGZIP(), []int{4, 0}\n}\n\ntype GetPostRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetPostRequest) Reset() {\n\t*x = GetPostRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_v2_post_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostRequest) ProtoMessage() {}\n\nfunc (x *GetPostRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_v2_post_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostRequest.ProtoReflect.Descriptor instead.\nfunc (*GetPostRequest) Descriptor() ([]byte, []int) {\n\treturn file_post_v2_post_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetPostRequest) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\ntype GetPostResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPost *Post `protobuf:\"bytes,1,opt,name=post,proto3\" json:\"post,omitempty\"`\n}\n\nfunc (x *GetPostResponse) Reset() {\n\t*x = GetPostResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_v2_post_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostResponse) ProtoMessage() {}\n\nfunc (x *GetPostResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_v2_post_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostResponse.ProtoReflect.Descriptor instead.\nfunc (*GetPostResponse) Descriptor() ([]byte, []int) {\n\treturn file_post_v2_post_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetPostResponse) GetPost() *Post {\n\tif x != nil {\n\t\treturn x.Post\n\t}\n\treturn nil\n}\n\ntype Post struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId   string    `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tData *PostData `protobuf:\"bytes,2,opt,name=data,proto3\" json:\"data,omitempty\"`\n}\n\nfunc (x *Post) Reset() {\n\t*x = Post{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_v2_post_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Post) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Post) ProtoMessage() {}\n\nfunc (x *Post) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_v2_post_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Post.ProtoReflect.Descriptor instead.\nfunc (*Post) Descriptor() ([]byte, []int) {\n\treturn file_post_v2_post_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *Post) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetData() *PostData {\n\tif x != nil {\n\t\treturn x.Data\n\t}\n\treturn nil\n}\n\ntype PostData struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tType    PostDataType `protobuf:\"varint,1,opt,name=type,proto3,enum=org.post.v2.PostDataType\" json:\"type,omitempty\"`\n\tTitle   string       `protobuf:\"bytes,2,opt,name=title,proto3\" json:\"title,omitempty\"`\n\tContent *PostContent `protobuf:\"bytes,3,opt,name=content,proto3\" json:\"content,omitempty\"`\n\tV2Data  string       `protobuf:\"bytes,4,opt,name=v2_data,json=v2Data,proto3\" json:\"v2_data,omitempty\"`\n}\n\nfunc (x *PostData) Reset() {\n\t*x = PostData{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_v2_post_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *PostData) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*PostData) ProtoMessage() {}\n\nfunc (x *PostData) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_v2_post_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use PostData.ProtoReflect.Descriptor instead.\nfunc (*PostData) Descriptor() ([]byte, []int) {\n\treturn file_post_v2_post_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *PostData) GetType() PostDataType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn PostDataType_POST_TYPE_A\n}\n\nfunc (x *PostData) GetTitle() string {\n\tif x != nil {\n\t\treturn x.Title\n\t}\n\treturn \"\"\n}\n\nfunc (x *PostData) GetContent() *PostContent {\n\tif x != nil {\n\t\treturn x.Content\n\t}\n\treturn nil\n}\n\nfunc (x *PostData) GetV2Data() string {\n\tif x != nil {\n\t\treturn x.V2Data\n\t}\n\treturn \"\"\n}\n\ntype PostContent struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tCategory PostContent_Category `protobuf:\"varint,1,opt,name=category,proto3,enum=org.post.v2.PostContent_Category\" json:\"category,omitempty\"`\n\tHead     string               `protobuf:\"bytes,2,opt,name=head,proto3\" json:\"head,omitempty\"`\n\tBody     string               `protobuf:\"bytes,3,opt,name=body,proto3\" json:\"body,omitempty\"`\n\tCounts   map[int32]int32      `protobuf:\"bytes,4,rep,name=counts,proto3\" json:\"counts,omitempty\" protobuf_key:\"varint,1,opt,name=key,proto3\" protobuf_val:\"varint,2,opt,name=value,proto3\"`\n}\n\nfunc (x *PostContent) Reset() {\n\t*x = PostContent{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_v2_post_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *PostContent) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*PostContent) ProtoMessage() {}\n\nfunc (x *PostContent) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_v2_post_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use PostContent.ProtoReflect.Descriptor instead.\nfunc (*PostContent) Descriptor() ([]byte, []int) {\n\treturn file_post_v2_post_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *PostContent) GetCategory() PostContent_Category {\n\tif x != nil {\n\t\treturn x.Category\n\t}\n\treturn PostContent_CATEGORY_A\n}\n\nfunc (x *PostContent) GetHead() string {\n\tif x != nil {\n\t\treturn x.Head\n\t}\n\treturn \"\"\n}\n\nfunc (x *PostContent) GetBody() string {\n\tif x != nil {\n\t\treturn x.Body\n\t}\n\treturn \"\"\n}\n\nfunc (x *PostContent) GetCounts() map[int32]int32 {\n\tif x != nil {\n\t\treturn x.Counts\n\t}\n\treturn nil\n}\n\nvar File_post_v2_post_proto protoreflect.FileDescriptor\n\nvar file_post_v2_post_proto_rawDesc = []byte{\n\t0x0a, 0x12, 0x70, 0x6f, 0x73, 0x74, 0x2f, 0x76, 0x32, 0x2f, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0b, 0x6f, 0x72, 0x67, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x76,\n\t0x32, 0x22, 0x20, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75,\n\t0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x02, 0x69, 0x64, 0x22, 0x38, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65,\n\t0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e,\n\t0x76, 0x32, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x41, 0x0a,\n\t0x04, 0x50, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x29, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x76,\n\t0x32, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61,\n\t0x22, 0x9c, 0x01, 0x0a, 0x08, 0x50, 0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2d, 0x0a,\n\t0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x6f, 0x72,\n\t0x67, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x44, 0x61,\n\t0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05,\n\t0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74,\n\t0x6c, 0x65, 0x12, 0x32, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x76,\n\t0x32, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x07, 0x63,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x76, 0x32, 0x5f, 0x64, 0x61, 0x74,\n\t0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x76, 0x32, 0x44, 0x61, 0x74, 0x61, 0x22,\n\t0x99, 0x02, 0x0a, 0x0b, 0x50, 0x6f, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12,\n\t0x3d, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x0e, 0x32, 0x21, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x76, 0x32, 0x2e,\n\t0x50, 0x6f, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x61, 0x74, 0x65,\n\t0x67, 0x6f, 0x72, 0x79, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x12,\n\t0x0a, 0x04, 0x68, 0x65, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x65,\n\t0x61, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x3c, 0x0a, 0x06, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73,\n\t0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x70, 0x6f, 0x73,\n\t0x74, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,\n\t0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x63, 0x6f,\n\t0x75, 0x6e, 0x74, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x45, 0x6e,\n\t0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05,\n\t0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22,\n\t0x2a, 0x0a, 0x08, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x0a, 0x43,\n\t0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x41, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x43,\n\t0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x42, 0x10, 0x01, 0x2a, 0x5b, 0x0a, 0x0c, 0x50,\n\t0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x50,\n\t0x4f, 0x53, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e,\n\t0x50, 0x4f, 0x53, 0x54, 0x5f, 0x56, 0x32, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x10, 0x01,\n\t0x12, 0x12, 0x0a, 0x0e, 0x50, 0x4f, 0x53, 0x54, 0x5f, 0x56, 0x32, 0x5f, 0x54, 0x59, 0x50, 0x45,\n\t0x5f, 0x43, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x4f, 0x53, 0x54, 0x5f, 0x56, 0x32, 0x5f,\n\t0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x10, 0x03, 0x32, 0x55, 0x0a, 0x0b, 0x50, 0x6f, 0x73, 0x74,\n\t0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x46, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x50, 0x6f,\n\t0x73, 0x74, 0x12, 0x1b, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x76, 0x32,\n\t0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,\n\t0x1c, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65,\n\t0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42,\n\t0x80, 0x01, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x70, 0x6f, 0x73, 0x74,\n\t0x2e, 0x76, 0x32, 0x42, 0x09, 0x50, 0x6f, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01,\n\t0x5a, 0x14, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x70, 0x6f, 0x73, 0x74, 0x2f, 0x76,\n\t0x32, 0x3b, 0x70, 0x6f, 0x73, 0x74, 0xa2, 0x02, 0x03, 0x4f, 0x50, 0x58, 0xaa, 0x02, 0x0b, 0x4f,\n\t0x72, 0x67, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x2e, 0x56, 0x32, 0xca, 0x02, 0x0b, 0x4f, 0x72, 0x67,\n\t0x5c, 0x50, 0x6f, 0x73, 0x74, 0x5c, 0x56, 0x32, 0xe2, 0x02, 0x17, 0x4f, 0x72, 0x67, 0x5c, 0x50,\n\t0x6f, 0x73, 0x74, 0x5c, 0x56, 0x32, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61,\n\t0x74, 0x61, 0xea, 0x02, 0x0d, 0x4f, 0x72, 0x67, 0x3a, 0x3a, 0x50, 0x6f, 0x73, 0x74, 0x3a, 0x3a,\n\t0x56, 0x32, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_post_v2_post_proto_rawDescOnce sync.Once\n\tfile_post_v2_post_proto_rawDescData = file_post_v2_post_proto_rawDesc\n)\n\nfunc file_post_v2_post_proto_rawDescGZIP() []byte {\n\tfile_post_v2_post_proto_rawDescOnce.Do(func() {\n\t\tfile_post_v2_post_proto_rawDescData = protoimpl.X.CompressGZIP(file_post_v2_post_proto_rawDescData)\n\t})\n\treturn file_post_v2_post_proto_rawDescData\n}\n\nvar file_post_v2_post_proto_enumTypes = make([]protoimpl.EnumInfo, 2)\nvar file_post_v2_post_proto_msgTypes = make([]protoimpl.MessageInfo, 6)\nvar file_post_v2_post_proto_goTypes = []interface{}{\n\t(PostDataType)(0),         // 0: org.post.v2.PostDataType\n\t(PostContent_Category)(0), // 1: org.post.v2.PostContent.Category\n\t(*GetPostRequest)(nil),    // 2: org.post.v2.GetPostRequest\n\t(*GetPostResponse)(nil),   // 3: org.post.v2.GetPostResponse\n\t(*Post)(nil),              // 4: org.post.v2.Post\n\t(*PostData)(nil),          // 5: org.post.v2.PostData\n\t(*PostContent)(nil),       // 6: org.post.v2.PostContent\n\tnil,                       // 7: org.post.v2.PostContent.CountsEntry\n}\nvar file_post_v2_post_proto_depIdxs = []int32{\n\t4, // 0: org.post.v2.GetPostResponse.post:type_name -> org.post.v2.Post\n\t5, // 1: org.post.v2.Post.data:type_name -> org.post.v2.PostData\n\t0, // 2: org.post.v2.PostData.type:type_name -> org.post.v2.PostDataType\n\t6, // 3: org.post.v2.PostData.content:type_name -> org.post.v2.PostContent\n\t1, // 4: org.post.v2.PostContent.category:type_name -> org.post.v2.PostContent.Category\n\t7, // 5: org.post.v2.PostContent.counts:type_name -> org.post.v2.PostContent.CountsEntry\n\t2, // 6: org.post.v2.PostService.GetPost:input_type -> org.post.v2.GetPostRequest\n\t3, // 7: org.post.v2.PostService.GetPost:output_type -> org.post.v2.GetPostResponse\n\t7, // [7:8] is the sub-list for method output_type\n\t6, // [6:7] is the sub-list for method input_type\n\t6, // [6:6] is the sub-list for extension type_name\n\t6, // [6:6] is the sub-list for extension extendee\n\t0, // [0:6] is the sub-list for field type_name\n}\n\nfunc init() { file_post_v2_post_proto_init() }\nfunc file_post_v2_post_proto_init() {\n\tif File_post_v2_post_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_post_v2_post_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_v2_post_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_v2_post_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Post); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_v2_post_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*PostData); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_v2_post_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*PostContent); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_post_v2_post_proto_rawDesc,\n\t\t\tNumEnums:      2,\n\t\t\tNumMessages:   6,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_post_v2_post_proto_goTypes,\n\t\tDependencyIndexes: file_post_v2_post_proto_depIdxs,\n\t\tEnumInfos:         file_post_v2_post_proto_enumTypes,\n\t\tMessageInfos:      file_post_v2_post_proto_msgTypes,\n\t}.Build()\n\tFile_post_v2_post_proto = out.File\n\tfile_post_v2_post_proto_rawDesc = nil\n\tfile_post_v2_post_proto_goTypes = nil\n\tfile_post_v2_post_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/06_alias/post/v2/post_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: post/v2/post.proto\n\npackage post\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tPostService_GetPost_FullMethodName = \"/org.post.v2.PostService/GetPost\"\n)\n\n// PostServiceClient is the client API for PostService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype PostServiceClient interface {\n\tGetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error)\n}\n\ntype postServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewPostServiceClient(cc grpc.ClientConnInterface) PostServiceClient {\n\treturn &postServiceClient{cc}\n}\n\nfunc (c *postServiceClient) GetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error) {\n\tout := new(GetPostResponse)\n\terr := c.cc.Invoke(ctx, PostService_GetPost_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// PostServiceServer is the server API for PostService service.\n// All implementations must embed UnimplementedPostServiceServer\n// for forward compatibility\ntype PostServiceServer interface {\n\tGetPost(context.Context, *GetPostRequest) (*GetPostResponse, error)\n\tmustEmbedUnimplementedPostServiceServer()\n}\n\n// UnimplementedPostServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedPostServiceServer struct {\n}\n\nfunc (UnimplementedPostServiceServer) GetPost(context.Context, *GetPostRequest) (*GetPostResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetPost not implemented\")\n}\nfunc (UnimplementedPostServiceServer) mustEmbedUnimplementedPostServiceServer() {}\n\n// UnsafePostServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to PostServiceServer will\n// result in compilation errors.\ntype UnsafePostServiceServer interface {\n\tmustEmbedUnimplementedPostServiceServer()\n}\n\nfunc RegisterPostServiceServer(s grpc.ServiceRegistrar, srv PostServiceServer) {\n\ts.RegisterService(&PostService_ServiceDesc, srv)\n}\n\nfunc _PostService_GetPost_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetPostRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(PostServiceServer).GetPost(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: PostService_GetPost_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(PostServiceServer).GetPost(ctx, req.(*GetPostRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// PostService_ServiceDesc is the grpc.ServiceDesc for PostService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar PostService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"org.post.v2.PostService\",\n\tHandlerType: (*PostServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetPost\",\n\t\t\tHandler:    _PostService_GetPost_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"post/v2/post.proto\",\n}\n"
  },
  {
    "path": "_examples/06_alias/proto/buf.yaml",
    "content": "version: v1\nbreaking:\n  use:\n    - FILE\nlint:\n  use:\n    - DEFAULT\n"
  },
  {
    "path": "_examples/06_alias/proto/federation/federation.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\nimport \"post/post.proto\";\n\noption go_package = \"example/federation;federation\";\n\noption (grpc.federation.file)= {\n  import: [\"post/v2/post.proto\", \"post/v2/extra.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n\n  message ConditionA {\n    option (grpc.federation.message).alias = \"org.post.PostConditionA\";\n    string prop = 1;\n  }\n  message ConditionB {\n    option (grpc.federation.message).alias = \"org.post.PostConditionB\";\n  }\n  oneof condition {\n    ConditionA a = 2;\n    ConditionB condition_b = 3;\n  }\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"post\"\n        message {\n          name: \"Post\"\n          args [\n            { name: \"id\", by: \"$.id\" },\n            { name: \"a\", by: \"$.a\" },\n            { name: \"b\", by: \"$.condition_b\" }\n          ]\n        }\n      }\n    ]\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"org.post.PostService/GetPost\"\n        request [\n          { field: \"id\", by: \"$.id\" },\n          { field: \"a\", by: \"$.a\", if : \"$.a != null\" },\n          { field: \"b\", by: \"$.b\", if : \"$.b != null\" }\n        ]\n      }\n    }\n    def { name: \"post\", by: \"res.post\", autobind: true }\n    def {\n      name: \"res2\"\n      call {\n        method: \"org.post.v2.PostService/GetPost\"\n        request { field: \"id\", by: \"$.id\" }\n      }\n    }\n    def { name: \"data2\", by: \"res2.post.data\" }\n    def { name: \"data_type\" by: \"grpc.federation.enum.select(true, org.post.PostDataType.from(org.post.PostDataType.POST_TYPE_B), org.post.v2.PostDataType.value('POST_V2_TYPE_B'))\" }\n    def { name: \"data_type2\" by: \"grpc.federation.enum.select(true, data_type, org.post.v2.PostDataType.value('POST_V2_TYPE_C'))\" }\n    def { name: \"type_fed\" enum { name: \"PostType\" by: \"data_type2\" }}\n    def { name: \"type_fed2\" enum { name: \"PostType\" by: \"org.post.PostDataType.value('POST_TYPE_A')\" } }\n  };\n  string id = 1;\n  PostData data = 2;\n  PostData data2 = 3 [(grpc.federation.field).by = \"data2\"];\n  PostType type = 4 [(grpc.federation.field).by = \"data_type2\"];\n  PostType type2 = 5 [(grpc.federation.field).by = \"type_fed\"];\n  PostType type3 = 6 [(grpc.federation.field).by = \"org.post.v2.PostDataType.value('POST_V2_TYPE_C')\"];\n  PostType type4 = 7 [(grpc.federation.field).by = \"type_fed2\"];\n  org.post.M m = 8 [(grpc.federation.field).by = \"M{x: 'xxx'}\"];\n}\n\nenum PostType {\n  option (grpc.federation.enum) = {\n    alias: [ \"org.post.PostDataType\", \"org.post.v2.PostDataType\" ]\n  };\n\n  POST_TYPE_UNKNOWN = 0 [(grpc.federation.enum_value).default = true];\n  POST_TYPE_FOO = 1 [(grpc.federation.enum_value) = { alias: [\"POST_TYPE_A\"] }];\n  POST_TYPE_BAR = 2 [(grpc.federation.enum_value) = { \n    alias: [\n      \"org.post.PostDataType.POST_TYPE_B\",\n      \"org.post.PostDataType.POST_TYPE_C\",\n      \"org.post.v2.PostDataType.POST_V2_TYPE_B\",\n      \"org.post.v2.PostDataType.POST_V2_TYPE_C\"\n    ]\n  }];\n  POST_TYPE_BAZ = 3 [(grpc.federation.enum_value).noalias = true];\n}\n\nmessage PostData {\n  option (grpc.federation.message) = {\n    alias: [ \"org.post.PostData\", \"org.post.v2.PostData\" ]\n  };\n\n  PostType type = 1;\n  string title = 2;\n  PostContent content = 3;\n}\n\nmessage PostContent {\n  option (grpc.federation.message) = {\n    alias: [ \"org.post.PostContent\", \"org.post.v2.PostContent\" ]\n  };\n\n  enum Category {\n    option (grpc.federation.enum) = {\n      alias: [ \"org.post.PostContent.Category\", \"org.post.v2.PostContent.Category\" ]\n    };\n  \n    CATEGORY_A = 0;\n    CATEGORY_B = 1;\n    CATEGORY_C = 2 [(grpc.federation.enum_value).noalias = true];\n  };\n\n  Category category = 1;\n  string head = 2;\n  string body = 3;\n  string dup_body = 4 [(grpc.federation.field).alias = \"body\"];\n  map<int32, int32> counts = 5;\n}\n\nmessage M {\n  option (grpc.federation.message).alias = \"org.post.M\";\n\n  string x = 1;\n}"
  },
  {
    "path": "_examples/06_alias/proto/post/post.proto",
    "content": "syntax = \"proto3\";\n\npackage org.post;\n\noption go_package = \"example/post;post\";\n\nservice PostService {\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n  oneof condition {\n    PostConditionA a = 2;\n    PostConditionB b = 3;\n  }\n}\n\nmessage GetPostResponse {\n  Post post = 1;\n}\n\nmessage Post {\n  string id = 1;\n  PostData data = 2;\n}\n\nenum PostDataType {\n  POST_TYPE_A = 0;\n  POST_TYPE_B = 1;\n  POST_TYPE_C = 2;\n  POST_TYPE_D = 3;\n}\n  \nmessage PostData {\n  PostDataType type = 1;\n  string title = 2;\n  PostContent content = 3;\n  string data = 4;\n}\n  \nmessage PostContent {\n  enum Category {\n    CATEGORY_A = 0;\n    CATEGORY_B = 1;\n  }\n  Category category = 1;\n  string head = 2;\n  string body = 3;\n  map<int32, int32> counts = 4;\n}\n\nmessage PostConditionA {\n  string prop = 1;\n}\n\nmessage PostConditionB {}\n\nmessage M {\n  string x = 1;\n}"
  },
  {
    "path": "_examples/06_alias/proto/post/v2/extra.proto",
    "content": "syntax = \"proto3\";\n\npackage org.post.v2;\n\noption go_package = \"example/post/v2;post\";\n\n// A second proto file in the v2 package, exercising the case where\n// multiple proto files share the same go_package.\nenum ExtraType {\n  EXTRA_TYPE_UNKNOWN = 0;\n  EXTRA_TYPE_A = 1;\n  EXTRA_TYPE_B = 2;\n}\n"
  },
  {
    "path": "_examples/06_alias/proto/post/v2/post.proto",
    "content": "syntax = \"proto3\";\n\npackage org.post.v2;\n\noption go_package = \"example/post/v2;post\";\n\nservice PostService {\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  Post post = 1;\n}\n\nmessage Post {\n  string id = 1;\n  PostData data = 2;\n}\n\nenum PostDataType {\n  POST_TYPE_A = 0;\n  POST_V2_TYPE_B = 1;\n  POST_V2_TYPE_C = 2;\n  POST_V2_TYPE_D = 3;\n}\n  \nmessage PostData {\n  PostDataType type = 1;\n  string title = 2;\n  PostContent content = 3;\n  string v2_data = 4;\n}\n  \nmessage PostContent {\n  enum Category {\n    CATEGORY_A = 0;\n    CATEGORY_B = 1;\n  }\n  Category category = 1;\n  string head = 2;\n  string body = 3;\n  map<int32, int32> counts = 4;\n}"
  },
  {
    "path": "_examples/07_autobind/.gitignore",
    "content": "grpc/federation\n"
  },
  {
    "path": "_examples/07_autobind/.vscode/settings.json",
    "content": "{\n    \"protoc\": {\n        \"options\": [\n            \"--proto_path=proto\",\n            \"--proto_path=proto_deps\"\n        ]\n    },\n    \"grpc-federation\": {\n        \"path\": \"../../bin/grpc-federation-language-server\",\n        \"import-paths\": [\n            \"proto\",\n            \"proto_deps\"\n        ]\n    }\n}\n"
  },
  {
    "path": "_examples/07_autobind/Makefile",
    "content": "MAKEFILE_DIR := $(dir $(lastword $(MAKEFILE_LIST)))\nGOBIN := $(MAKEFILE_DIR)/../../bin\nPATH := $(GOBIN):$(PATH)\n\nJAEGER_IMAGE := jaegertracing/all-in-one:latest\n\n.PHONY: generate\ngenerate:\n\t$(GOBIN)/buf generate\n\n.PHONY: lint\nlint:\n\t@$(GOBIN)/grpc-federation-linter -Iproto -Iproto_deps ./proto/federation/federation.proto\n\n.PHONY: test\ntest:\n\tgo test -race ./ -count=1\n\n.PHONY: grpc-federation/generate\ngrpc-federation/generate:\n\t@$(GOBIN)/grpc-federation-generator ./proto/federation/federation.proto\n\n.PHONY: grpc-federation/watch\ngrpc-federation/watch:\n\t@$(GOBIN)/grpc-federation-generator -w\n\n.PHONY: jaeger/start\njaeger/start:\n\t@docker run \\\n\t\t-e COLLECTOR_OTLP_ENABLED=true \\\n\t\t-p 16686:16686 \\\n\t\t-p 4317:4317 \\\n\t\t-p 4318:4318 \\\n\t\t-d \\\n\t\t$(JAEGER_IMAGE)\n\n.PHONY: jaeger/stop\njaeger/stop:\n\t@docker stop $(shell docker ps -q  --filter ancestor=$(JAEGER_IMAGE))\n"
  },
  {
    "path": "_examples/07_autobind/buf.gen.yaml",
    "content": "version: v1\nmanaged:\n  enabled: true\nplugins:\n  - plugin: go\n    out: .\n    opt: paths=source_relative\n  - plugin: go-grpc\n    out: .\n    opt: paths=source_relative\n  - plugin: grpc-federation\n    out: .\n    opt:\n    - paths=source_relative\n    - import_paths=proto\n"
  },
  {
    "path": "_examples/07_autobind/buf.work.yaml",
    "content": "version: v1\ndirectories:\n  - proto\n  - proto_deps\n"
  },
  {
    "path": "_examples/07_autobind/federation/federation.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\t_ \"google.golang.org/protobuf/types/known/anypb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype GetPostRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetPostRequest) Reset() {\n\t*x = GetPostRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostRequest) ProtoMessage() {}\n\nfunc (x *GetPostRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostRequest.ProtoReflect.Descriptor instead.\nfunc (*GetPostRequest) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetPostRequest) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\ntype GetPostResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId      string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tTitle   string `protobuf:\"bytes,2,opt,name=title,proto3\" json:\"title,omitempty\"`\n\tContent string `protobuf:\"bytes,3,opt,name=content,proto3\" json:\"content,omitempty\"`\n\tUid     string `protobuf:\"bytes,4,opt,name=uid,proto3\" json:\"uid,omitempty\"`\n}\n\nfunc (x *GetPostResponse) Reset() {\n\t*x = GetPostResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostResponse) ProtoMessage() {}\n\nfunc (x *GetPostResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostResponse.ProtoReflect.Descriptor instead.\nfunc (*GetPostResponse) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetPostResponse) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetPostResponse) GetTitle() string {\n\tif x != nil {\n\t\treturn x.Title\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetPostResponse) GetContent() string {\n\tif x != nil {\n\t\treturn x.Content\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetPostResponse) GetUid() string {\n\tif x != nil {\n\t\treturn x.Uid\n\t}\n\treturn \"\"\n}\n\ntype Post struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId      string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tTitle   string `protobuf:\"bytes,2,opt,name=title,proto3\" json:\"title,omitempty\"`\n\tContent string `protobuf:\"bytes,3,opt,name=content,proto3\" json:\"content,omitempty\"`\n\tUid     string `protobuf:\"bytes,4,opt,name=uid,proto3\" json:\"uid,omitempty\"`\n}\n\nfunc (x *Post) Reset() {\n\t*x = Post{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Post) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Post) ProtoMessage() {}\n\nfunc (x *Post) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Post.ProtoReflect.Descriptor instead.\nfunc (*Post) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *Post) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetTitle() string {\n\tif x != nil {\n\t\treturn x.Title\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetContent() string {\n\tif x != nil {\n\t\treturn x.Content\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetUid() string {\n\tif x != nil {\n\t\treturn x.Uid\n\t}\n\treturn \"\"\n}\n\ntype User struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUid string `protobuf:\"bytes,1,opt,name=uid,proto3\" json:\"uid,omitempty\"`\n}\n\nfunc (x *User) Reset() {\n\t*x = User{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *User) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*User) ProtoMessage() {}\n\nfunc (x *User) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use User.ProtoReflect.Descriptor instead.\nfunc (*User) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *User) GetUid() string {\n\tif x != nil {\n\t\treturn x.Uid\n\t}\n\treturn \"\"\n}\n\nvar File_federation_federation_proto protoreflect.FileDescriptor\n\nvar file_federation_federation_proto_rawDesc = []byte{\n\t0x0a, 0x1b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x6f,\n\t0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x19, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61,\n\t0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x20, 0x0a, 0x0e, 0x47, 0x65,\n\t0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02,\n\t0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x80, 0x01, 0x0a,\n\t0x0f, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64,\n\t0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,\n\t0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75,\n\t0x69, 0x64, 0x3a, 0x1b, 0x9a, 0x4a, 0x18, 0x0a, 0x16, 0x18, 0x01, 0x6a, 0x12, 0x0a, 0x04, 0x50,\n\t0x6f, 0x73, 0x74, 0x12, 0x0a, 0x0a, 0x02, 0x69, 0x64, 0x12, 0x04, 0x24, 0x2e, 0x69, 0x64, 0x22,\n\t0xb8, 0x01, 0x0a, 0x04, 0x50, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c,\n\t0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x18,\n\t0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18,\n\t0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x3a, 0x5e, 0x9a, 0x4a, 0x5b, 0x0a,\n\t0x2d, 0x0a, 0x03, 0x72, 0x65, 0x73, 0x72, 0x26, 0x0a, 0x18, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x50,\n\t0x6f, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x47, 0x65, 0x74, 0x50, 0x6f,\n\t0x73, 0x74, 0x12, 0x0a, 0x0a, 0x02, 0x69, 0x64, 0x12, 0x04, 0x24, 0x2e, 0x69, 0x64, 0x0a, 0x0c,\n\t0x18, 0x01, 0x5a, 0x08, 0x72, 0x65, 0x73, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x0a, 0x1c, 0x18, 0x01,\n\t0x6a, 0x18, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72,\n\t0x5f, 0x69, 0x64, 0x12, 0x05, 0x27, 0x66, 0x6f, 0x6f, 0x27, 0x22, 0x28, 0x0a, 0x04, 0x55, 0x73,\n\t0x65, 0x72, 0x12, 0x20, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42,\n\t0x0e, 0x9a, 0x4a, 0x0b, 0x12, 0x09, 0x24, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x52,\n\t0x03, 0x75, 0x69, 0x64, 0x32, 0x66, 0x0a, 0x11, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4c, 0x0a, 0x07, 0x47, 0x65, 0x74,\n\t0x50, 0x6f, 0x73, 0x74, 0x12, 0x1e, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73,\n\t0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x1a, 0x03, 0x9a, 0x4a, 0x00, 0x42, 0xb1, 0x01, 0x9a,\n\t0x4a, 0x11, 0x12, 0x0f, 0x70, 0x6f, 0x73, 0x74, 0x2f, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0f, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x1d, 0x65, 0x78, 0x61, 0x6d,\n\t0x70, 0x6c, 0x65, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xa2, 0x02, 0x03, 0x4f, 0x46, 0x58, 0xaa,\n\t0x02, 0x0e, 0x4f, 0x72, 0x67, 0x2e, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0xca, 0x02, 0x0e, 0x4f, 0x72, 0x67, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0xe2, 0x02, 0x1a, 0x4f, 0x72, 0x67, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02,\n\t0x0f, 0x4f, 0x72, 0x67, 0x3a, 0x3a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_federation_federation_proto_rawDescOnce sync.Once\n\tfile_federation_federation_proto_rawDescData = file_federation_federation_proto_rawDesc\n)\n\nfunc file_federation_federation_proto_rawDescGZIP() []byte {\n\tfile_federation_federation_proto_rawDescOnce.Do(func() {\n\t\tfile_federation_federation_proto_rawDescData = protoimpl.X.CompressGZIP(file_federation_federation_proto_rawDescData)\n\t})\n\treturn file_federation_federation_proto_rawDescData\n}\n\nvar file_federation_federation_proto_msgTypes = make([]protoimpl.MessageInfo, 4)\nvar file_federation_federation_proto_goTypes = []interface{}{\n\t(*GetPostRequest)(nil),  // 0: org.federation.GetPostRequest\n\t(*GetPostResponse)(nil), // 1: org.federation.GetPostResponse\n\t(*Post)(nil),            // 2: org.federation.Post\n\t(*User)(nil),            // 3: org.federation.User\n}\nvar file_federation_federation_proto_depIdxs = []int32{\n\t0, // 0: org.federation.FederationService.GetPost:input_type -> org.federation.GetPostRequest\n\t1, // 1: org.federation.FederationService.GetPost:output_type -> org.federation.GetPostResponse\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_federation_federation_proto_init() }\nfunc file_federation_federation_proto_init() {\n\tif File_federation_federation_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_federation_federation_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Post); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*User); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_federation_federation_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   4,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_federation_federation_proto_goTypes,\n\t\tDependencyIndexes: file_federation_federation_proto_depIdxs,\n\t\tMessageInfos:      file_federation_federation_proto_msgTypes,\n\t}.Build()\n\tFile_federation_federation_proto = out.File\n\tfile_federation_federation_proto_rawDesc = nil\n\tfile_federation_federation_proto_goTypes = nil\n\tfile_federation_federation_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/07_autobind/federation/federation_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tFederationService_GetPost_FullMethodName = \"/org.federation.FederationService/GetPost\"\n)\n\n// FederationServiceClient is the client API for FederationService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype FederationServiceClient interface {\n\tGetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error)\n}\n\ntype federationServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewFederationServiceClient(cc grpc.ClientConnInterface) FederationServiceClient {\n\treturn &federationServiceClient{cc}\n}\n\nfunc (c *federationServiceClient) GetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error) {\n\tout := new(GetPostResponse)\n\terr := c.cc.Invoke(ctx, FederationService_GetPost_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// FederationServiceServer is the server API for FederationService service.\n// All implementations must embed UnimplementedFederationServiceServer\n// for forward compatibility\ntype FederationServiceServer interface {\n\tGetPost(context.Context, *GetPostRequest) (*GetPostResponse, error)\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\n// UnimplementedFederationServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedFederationServiceServer struct {\n}\n\nfunc (UnimplementedFederationServiceServer) GetPost(context.Context, *GetPostRequest) (*GetPostResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetPost not implemented\")\n}\nfunc (UnimplementedFederationServiceServer) mustEmbedUnimplementedFederationServiceServer() {}\n\n// UnsafeFederationServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to FederationServiceServer will\n// result in compilation errors.\ntype UnsafeFederationServiceServer interface {\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\nfunc RegisterFederationServiceServer(s grpc.ServiceRegistrar, srv FederationServiceServer) {\n\ts.RegisterService(&FederationService_ServiceDesc, srv)\n}\n\nfunc _FederationService_GetPost_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetPostRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(FederationServiceServer).GetPost(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: FederationService_GetPost_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(FederationServiceServer).GetPost(ctx, req.(*GetPostRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// FederationService_ServiceDesc is the grpc.ServiceDesc for FederationService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar FederationService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"org.federation.FederationService\",\n\tHandlerType: (*FederationServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetPost\",\n\t\t\tHandler:    _FederationService_GetPost_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"federation/federation.proto\",\n}\n"
  },
  {
    "path": "_examples/07_autobind/federation/federation_grpc_federation.pb.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: federation/federation.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n\n\tpost \"example/post\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Org_Federation_GetPostResponseVariable represents variable definitions in \"org.federation.GetPostResponse\".\ntype FederationService_Org_Federation_GetPostResponseVariable struct {\n\tXDef0 *Post\n}\n\n// Org_Federation_GetPostResponseArgument is argument for \"org.federation.GetPostResponse\" message.\ntype FederationService_Org_Federation_GetPostResponseArgument struct {\n\tId string\n\tFederationService_Org_Federation_GetPostResponseVariable\n}\n\n// Org_Federation_PostVariable represents variable definitions in \"org.federation.Post\".\ntype FederationService_Org_Federation_PostVariable struct {\n\tRes   *post.GetPostResponse\n\tXDef1 *post.Post\n\tXDef2 *User\n}\n\n// Org_Federation_PostArgument is argument for \"org.federation.Post\" message.\ntype FederationService_Org_Federation_PostArgument struct {\n\tId string\n\tFederationService_Org_Federation_PostVariable\n}\n\n// Org_Federation_UserVariable represents variable definitions in \"org.federation.User\".\ntype FederationService_Org_Federation_UserVariable struct {\n}\n\n// Org_Federation_UserArgument is argument for \"org.federation.User\" message.\ntype FederationService_Org_Federation_UserArgument struct {\n\tUserId string\n\tFederationService_Org_Federation_UserVariable\n}\n\n// FederationServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationServiceConfig struct {\n\t// Client provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\n\t// If this interface is not provided, an error is returned during initialization.\n\tClient FederationServiceClientFactory // required\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationServiceClientFactory interface {\n\t// Post_PostServiceClient create a gRPC Client to be used to call methods in post.PostService.\n\tPost_PostServiceClient(FederationServiceClientConfig) (post.PostServiceClient, error)\n}\n\n// FederationServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationServiceDependentClientSet struct {\n\tPost_PostServiceClient post.PostServiceClient\n}\n\n// FederationServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationServiceResolver interface {\n}\n\n// FederationServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// FederationServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationServiceUnimplementedResolver struct{}\n\nconst (\n\tFederationService_DependentMethod_Post_PostService_GetPost = \"/post.PostService/GetPost\"\n)\n\n// FederationService represents Federation Service.\ntype FederationService struct {\n\tUnimplementedFederationServiceServer\n\tcfg             FederationServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationServiceDependentClientSet\n}\n\n// NewFederationService creates FederationService instance by FederationServiceConfig.\nfunc NewFederationService(cfg FederationServiceConfig) (*FederationService, error) {\n\tif cfg.Client == nil {\n\t\treturn nil, grpcfed.ErrClientConfig\n\t}\n\tPost_PostServiceClient, err := cfg.Client.Post_PostServiceClient(FederationServiceClientConfig{\n\t\tService: \"post.PostService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"org.federation.FederationService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.org.federation.GetPostResponseArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.PostArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.UserArgument\": {\n\t\t\t\"user_id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"UserId\"),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"org.federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.GRPCErrorAccessorOptions(celTypeHelper, \"post.GetPostResponse\")...)\n\tsvc := &FederationService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tclient: &FederationServiceDependentClientSet{\n\t\t\tPost_PostServiceClient: Post_PostServiceClient,\n\t\t},\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationService(ctx context.Context, svc *FederationService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n// GetPost implements \"org.federation.FederationService/GetPost\" method.\nfunc (s *FederationService) GetPost(ctx context.Context, req *GetPostRequest) (res *GetPostResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.FederationService/GetPost\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Org_Federation_GetPostResponse(ctx, &FederationService_Org_Federation_GetPostResponseArgument{\n\t\tId: req.GetId(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Org_Federation_GetPostResponse resolve \"org.federation.GetPostResponse\" message.\nfunc (s *FederationService) resolve_Org_Federation_GetPostResponse(ctx context.Context, req *FederationService_Org_Federation_GetPostResponseArgument) (*GetPostResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.GetPostResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.GetPostResponse\", slog.Any(\"message_args\", s.logvalue_Org_Federation_GetPostResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tXDef0 *Post\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.GetPostResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"_def0\"\n\t\t  autobind: true\n\t\t  message {\n\t\t    name: \"Post\"\n\t\t    args { name: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef__def0 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Post, *localValueType]{\n\t\t\tName: `_def0`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.Post\"),\n\t\t\tSetter: func(value *localValueType, v *Post) error {\n\t\t\t\tvalue.vars.XDef0 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_PostArgument{}\n\t\t\t\t// { name: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 1,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_Post(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def__def0(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_GetPostResponseVariable.XDef0 = value.vars.XDef0\n\n\t// create a message value to be returned.\n\tret := &GetPostResponse{}\n\n\t// field binding section.\n\tret.Id = value.vars.XDef0.GetId()           // { name: \"_def0\", autobind: true }\n\tret.Title = value.vars.XDef0.GetTitle()     // { name: \"_def0\", autobind: true }\n\tret.Content = value.vars.XDef0.GetContent() // { name: \"_def0\", autobind: true }\n\tret.Uid = value.vars.XDef0.GetUid()         // { name: \"_def0\", autobind: true }\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.GetPostResponse\", slog.Any(\"org.federation.GetPostResponse\", s.logvalue_Org_Federation_GetPostResponse(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_Post resolve \"org.federation.Post\" message.\nfunc (s *FederationService) resolve_Org_Federation_Post(ctx context.Context, req *FederationService_Org_Federation_PostArgument) (*Post, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.Post\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.Post\", slog.Any(\"message_args\", s.logvalue_Org_Federation_PostArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tRes   *post.GetPostResponse\n\t\t\tXDef1 *post.Post\n\t\t\tXDef2 *User\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.PostArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"post.PostService/GetPost\"\n\t\t    request { field: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.GetPostResponse, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"post.GetPostResponse\"),\n\t\t\tSetter: func(value *localValueType, v *post.GetPostResponse) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &post.GetPostRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 2,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call post.PostService/GetPost\", slog.Any(\"post.GetPostRequest\", s.logvalue_Post_GetPostRequest(args)))\n\t\t\t\tret, err := s.client.Post_PostServiceClient.GetPost(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Post_PostService_GetPost, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"_def1\"\n\t\t  autobind: true\n\t\t  by: \"res.post\"\n\t\t}\n\t*/\n\tdef__def1 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.Post, *localValueType]{\n\t\t\tName: `_def1`,\n\t\t\tType: grpcfed.CELObjectType(\"post.Post\"),\n\t\t\tSetter: func(value *localValueType, v *post.Post) error {\n\t\t\t\tvalue.vars.XDef1 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `res.post`,\n\t\t\tByCacheIndex: 3,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"_def2\"\n\t\t  autobind: true\n\t\t  message {\n\t\t    name: \"User\"\n\t\t    args { name: \"user_id\", by: \"'foo'\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef__def2 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*User, *localValueType]{\n\t\t\tName: `_def2`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.User\"),\n\t\t\tSetter: func(value *localValueType, v *User) error {\n\t\t\t\tvalue.vars.XDef2 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_UserArgument{}\n\t\t\t\t// { name: \"user_id\", by: \"'foo'\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `'foo'`,\n\t\t\t\t\tCacheIndex: 4,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.UserId = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_User(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t   res ─┐\n\t        _def1 ─┐\n\t        _def2 ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def__def1(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def__def2(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_PostVariable.Res = value.vars.Res\n\treq.FederationService_Org_Federation_PostVariable.XDef1 = value.vars.XDef1\n\treq.FederationService_Org_Federation_PostVariable.XDef2 = value.vars.XDef2\n\n\t// create a message value to be returned.\n\tret := &Post{}\n\n\t// field binding section.\n\tret.Id = value.vars.XDef1.GetId()           // { name: \"_def1\", autobind: true }\n\tret.Title = value.vars.XDef1.GetTitle()     // { name: \"_def1\", autobind: true }\n\tret.Content = value.vars.XDef1.GetContent() // { name: \"_def1\", autobind: true }\n\tret.Uid = value.vars.XDef2.GetUid()         // { name: \"_def2\", autobind: true }\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.Post\", slog.Any(\"org.federation.Post\", s.logvalue_Org_Federation_Post(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_User resolve \"org.federation.User\" message.\nfunc (s *FederationService) resolve_Org_Federation_User(ctx context.Context, req *FederationService_Org_Federation_UserArgument) (*User, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.User\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.User\", slog.Any(\"message_args\", s.logvalue_Org_Federation_UserArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.UserArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &User{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"$.user_id\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `$.user_id`,\n\t\tCacheIndex: 5,\n\t\tSetter: func(v string) error {\n\t\t\tret.Uid = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.User\", slog.Any(\"org.federation.User\", s.logvalue_Org_Federation_User(ret)))\n\treturn ret, nil\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostResponse(v *GetPostResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.String(\"title\", v.GetTitle()),\n\t\tslog.String(\"content\", v.GetContent()),\n\t\tslog.String(\"uid\", v.GetUid()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostResponseArgument(v *FederationService_Org_Federation_GetPostResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_Post(v *Post) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.String(\"title\", v.GetTitle()),\n\t\tslog.String(\"content\", v.GetContent()),\n\t\tslog.String(\"uid\", v.GetUid()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_PostArgument(v *FederationService_Org_Federation_PostArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_User(v *User) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"uid\", v.GetUid()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_UserArgument(v *FederationService_Org_Federation_UserArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"user_id\", v.UserId),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Post_GetPostRequest(v *post.GetPostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t)\n}\n"
  },
  {
    "path": "_examples/07_autobind/go.mod",
    "content": "module example\n\ngo 1.24.0\n\nreplace github.com/mercari/grpc-federation => ../../\n\nrequire (\n\tgithub.com/google/go-cmp v0.7.0\n\tgithub.com/mercari/grpc-federation v0.0.0-00010101000000-000000000000\n\tgo.opentelemetry.io/otel v1.24.0\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0\n\tgo.opentelemetry.io/otel/sdk v1.24.0\n\tgo.opentelemetry.io/otel/trace v1.24.0\n\tgo.uber.org/goleak v1.3.0\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7\n\tgoogle.golang.org/grpc v1.65.0\n\tgoogle.golang.org/protobuf v1.34.2\n)\n\nrequire (\n\tcel.dev/expr v0.19.1 // indirect\n\tgithub.com/antlr4-go/antlr/v4 v4.13.0 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.2.1 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/goccy/wasi-go v0.3.2 // indirect\n\tgithub.com/google/cel-go v0.23.1 // indirect\n\tgithub.com/google/uuid v1.6.0 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect\n\tgithub.com/kelseyhightower/envconfig v1.4.0 // indirect\n\tgithub.com/stealthrocket/wazergo v0.19.1 // indirect\n\tgithub.com/stoewer/go-strcase v1.3.0 // indirect\n\tgithub.com/tetratelabs/wazero v1.10.1 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.24.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.0.0 // indirect\n\tgolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect\n\tgolang.org/x/net v0.38.0 // indirect\n\tgolang.org/x/sync v0.14.0 // indirect\n\tgolang.org/x/sys v0.37.0 // indirect\n\tgolang.org/x/text v0.23.0 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 // indirect\n)\n"
  },
  {
    "path": "_examples/07_autobind/go.sum",
    "content": "cel.dev/expr v0.19.1 h1:NciYrtDRIR0lNCnH1LFJegdjspNx9fI59O7TWcua/W4=\ncel.dev/expr v0.19.1/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw=\ngithub.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=\ngithub.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/goccy/wasi-go v0.3.2 h1:wAvGXmqCkfcp0B0AwIp5Ya53hzDwkKm9W8iuT3nCCz0=\ngithub.com/goccy/wasi-go v0.3.2/go.mod h1:nIKD204n9xa4Z20UV+XA483kIr9TAl2vXr+X5qVAO5M=\ngithub.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4=\ngithub.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=\ngithub.com/google/cel-go v0.23.1 h1:91ThhEZlBcE5rB2adBVXqvDoqdL8BG2oyhd0bK1I/r4=\ngithub.com/google/cel-go v0.23.1/go.mod h1:52Pb6QsDbC5kvgxvZhiL9QX1oZEkcUF/ZqaPx1J5Wwo=\ngithub.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\ngithub.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg=\ngithub.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=\ngithub.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/stealthrocket/wazergo v0.19.1 h1:BPrITETPgSFwiytwmToO0MbUC/+RGC39JScz1JmmG6c=\ngithub.com/stealthrocket/wazergo v0.19.1/go.mod h1:riI0hxw4ndZA5e6z7PesHg2BtTftcZaMxRcoiGGipTs=\ngithub.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs=\ngithub.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tetratelabs/wazero v1.10.1 h1:2DugeJf6VVk58KTPszlNfeeN8AhhpwcZqkJj2wwFuH8=\ngithub.com/tetratelabs/wazero v1.10.1/go.mod h1:DRm5twOQ5Gr1AoEdSi0CLjDQF1J9ZAuyqFIjl1KKfQU=\ngo.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo=\ngo.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0=\ngo.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI=\ngo.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=\ngo.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw=\ngo.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg=\ngo.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=\ngo.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=\ngo.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=\ngo.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=\ngolang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=\ngolang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=\ngolang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=\ngolang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=\ngolang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=\ngolang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=\ngolang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 h1:YcyjlL1PRr2Q17/I0dPk2JmYS5CDXfcdb2Z3YRioEbw=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7 h1:2035KHhUv+EpyB+hWgJnaWKJOdX1E95w2S8Rr4uWKTs=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=\ngoogle.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=\ngoogle.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=\ngoogle.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=\ngoogle.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "_examples/07_autobind/main_test.go",
    "content": "package main_test\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"net\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\"\n\t\"go.opentelemetry.io/otel/propagation\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\tsdktrace \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.4.0\"\n\t\"go.uber.org/goleak\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/test/bufconn\"\n\n\t\"example/federation\"\n\t\"example/post\"\n)\n\nconst bufSize = 1024\n\nvar (\n\tlistener   *bufconn.Listener\n\tpostClient post.PostServiceClient\n)\n\ntype clientConfig struct{}\n\nfunc (c *clientConfig) Post_PostServiceClient(cfg federation.FederationServiceClientConfig) (post.PostServiceClient, error) {\n\treturn postClient, nil\n}\n\ntype PostServer struct {\n\t*post.UnimplementedPostServiceServer\n}\n\nfunc (s *PostServer) GetPost(ctx context.Context, req *post.GetPostRequest) (*post.GetPostResponse, error) {\n\treturn &post.GetPostResponse{\n\t\tPost: &post.Post{\n\t\t\tId:      req.Id,\n\t\t\tTitle:   \"foo\",\n\t\t\tContent: \"bar\",\n\t\t\tUserId:  fmt.Sprintf(\"user:%s\", req.Id),\n\t\t},\n\t}, nil\n}\n\nfunc dialer(ctx context.Context, address string) (net.Conn, error) {\n\treturn listener.Dial()\n}\n\nfunc TestFederation(t *testing.T) {\n\tdefer goleak.VerifyNone(t)\n\tctx := context.Background()\n\tlistener = bufconn.Listen(bufSize)\n\n\tif os.Getenv(\"ENABLE_JAEGER\") != \"\" {\n\t\texporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithInsecure())\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttp := sdktrace.NewTracerProvider(\n\t\t\tsdktrace.WithBatcher(exporter),\n\t\t\tsdktrace.WithResource(\n\t\t\t\tresource.NewWithAttributes(\n\t\t\t\t\tsemconv.SchemaURL,\n\t\t\t\t\tsemconv.ServiceNameKey.String(\"example07/autobind\"),\n\t\t\t\t\tsemconv.ServiceVersionKey.String(\"1.0.0\"),\n\t\t\t\t\tattribute.String(\"environment\", \"dev\"),\n\t\t\t\t),\n\t\t\t),\n\t\t\tsdktrace.WithSampler(sdktrace.AlwaysSample()),\n\t\t)\n\t\tdefer tp.Shutdown(ctx)\n\t\totel.SetTextMapPropagator(propagation.TraceContext{})\n\t\totel.SetTracerProvider(tp)\n\t}\n\n\tconn, err := grpc.DialContext(ctx, \"\", grpc.WithContextDialer(dialer), grpc.WithInsecure())\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer conn.Close()\n\n\tpostClient = post.NewPostServiceClient(conn)\n\n\tgrpcServer := grpc.NewServer()\n\tdefer grpcServer.Stop()\n\n\tlogger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{\n\t\tLevel: slog.LevelDebug,\n\t}))\n\tfederationServer, err := federation.NewFederationService(federation.FederationServiceConfig{\n\t\tClient: new(clientConfig),\n\t\tLogger: logger,\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer federation.CleanupFederationService(ctx, federationServer)\n\n\tpost.RegisterPostServiceServer(grpcServer, &PostServer{})\n\tfederation.RegisterFederationServiceServer(grpcServer, federationServer)\n\n\tgo func() {\n\t\tif err := grpcServer.Serve(listener); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t}()\n\n\tclient := federation.NewFederationServiceClient(conn)\n\tres, err := client.GetPost(ctx, &federation.GetPostRequest{\n\t\tId: \"foo\",\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif diff := cmp.Diff(res, &federation.GetPostResponse{\n\t\tId:      \"foo\",\n\t\tTitle:   \"foo\",\n\t\tContent: \"bar\",\n\t\tUid:     \"foo\",\n\t}, cmpopts.IgnoreUnexported(\n\t\tfederation.GetPostResponse{},\n\t\tfederation.Post{},\n\t\tfederation.User{},\n\t)); diff != \"\" {\n\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t}\n}\n"
  },
  {
    "path": "_examples/07_autobind/post/post.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: post/post.proto\n\npackage post\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype GetPostRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetPostRequest) Reset() {\n\t*x = GetPostRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostRequest) ProtoMessage() {}\n\nfunc (x *GetPostRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostRequest.ProtoReflect.Descriptor instead.\nfunc (*GetPostRequest) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetPostRequest) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\ntype GetPostResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPost *Post `protobuf:\"bytes,1,opt,name=post,proto3\" json:\"post,omitempty\"`\n}\n\nfunc (x *GetPostResponse) Reset() {\n\t*x = GetPostResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostResponse) ProtoMessage() {}\n\nfunc (x *GetPostResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostResponse.ProtoReflect.Descriptor instead.\nfunc (*GetPostResponse) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetPostResponse) GetPost() *Post {\n\tif x != nil {\n\t\treturn x.Post\n\t}\n\treturn nil\n}\n\ntype Post struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId      string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tTitle   string `protobuf:\"bytes,2,opt,name=title,proto3\" json:\"title,omitempty\"`\n\tContent string `protobuf:\"bytes,3,opt,name=content,proto3\" json:\"content,omitempty\"`\n\tUserId  string `protobuf:\"bytes,4,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *Post) Reset() {\n\t*x = Post{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Post) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Post) ProtoMessage() {}\n\nfunc (x *Post) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Post.ProtoReflect.Descriptor instead.\nfunc (*Post) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *Post) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetTitle() string {\n\tif x != nil {\n\t\treturn x.Title\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetContent() string {\n\tif x != nil {\n\t\treturn x.Content\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetUserId() string {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn \"\"\n}\n\nvar File_post_post_proto protoreflect.FileDescriptor\n\nvar file_post_post_proto_rawDesc = []byte{\n\t0x0a, 0x0f, 0x70, 0x6f, 0x73, 0x74, 0x2f, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x20, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x6f,\n\t0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x31, 0x0a, 0x0f, 0x47, 0x65, 0x74,\n\t0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x04,\n\t0x70, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x6f, 0x73,\n\t0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x5f, 0x0a, 0x04,\n\t0x50, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18,\n\t0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x32, 0x47, 0x0a,\n\t0x0b, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x38, 0x0a, 0x07,\n\t0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x47,\n\t0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e,\n\t0x70, 0x6f, 0x73, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70,\n\t0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x58, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x6f,\n\t0x73, 0x74, 0x42, 0x09, 0x50, 0x6f, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a,\n\t0x11, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x70, 0x6f, 0x73, 0x74, 0x3b, 0x70, 0x6f,\n\t0x73, 0x74, 0xa2, 0x02, 0x03, 0x50, 0x58, 0x58, 0xaa, 0x02, 0x04, 0x50, 0x6f, 0x73, 0x74, 0xca,\n\t0x02, 0x04, 0x50, 0x6f, 0x73, 0x74, 0xe2, 0x02, 0x10, 0x50, 0x6f, 0x73, 0x74, 0x5c, 0x47, 0x50,\n\t0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x04, 0x50, 0x6f, 0x73, 0x74,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_post_post_proto_rawDescOnce sync.Once\n\tfile_post_post_proto_rawDescData = file_post_post_proto_rawDesc\n)\n\nfunc file_post_post_proto_rawDescGZIP() []byte {\n\tfile_post_post_proto_rawDescOnce.Do(func() {\n\t\tfile_post_post_proto_rawDescData = protoimpl.X.CompressGZIP(file_post_post_proto_rawDescData)\n\t})\n\treturn file_post_post_proto_rawDescData\n}\n\nvar file_post_post_proto_msgTypes = make([]protoimpl.MessageInfo, 3)\nvar file_post_post_proto_goTypes = []interface{}{\n\t(*GetPostRequest)(nil),  // 0: post.GetPostRequest\n\t(*GetPostResponse)(nil), // 1: post.GetPostResponse\n\t(*Post)(nil),            // 2: post.Post\n}\nvar file_post_post_proto_depIdxs = []int32{\n\t2, // 0: post.GetPostResponse.post:type_name -> post.Post\n\t0, // 1: post.PostService.GetPost:input_type -> post.GetPostRequest\n\t1, // 2: post.PostService.GetPost:output_type -> post.GetPostResponse\n\t2, // [2:3] is the sub-list for method output_type\n\t1, // [1:2] is the sub-list for method input_type\n\t1, // [1:1] is the sub-list for extension type_name\n\t1, // [1:1] is the sub-list for extension extendee\n\t0, // [0:1] is the sub-list for field type_name\n}\n\nfunc init() { file_post_post_proto_init() }\nfunc file_post_post_proto_init() {\n\tif File_post_post_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_post_post_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Post); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_post_post_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   3,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_post_post_proto_goTypes,\n\t\tDependencyIndexes: file_post_post_proto_depIdxs,\n\t\tMessageInfos:      file_post_post_proto_msgTypes,\n\t}.Build()\n\tFile_post_post_proto = out.File\n\tfile_post_post_proto_rawDesc = nil\n\tfile_post_post_proto_goTypes = nil\n\tfile_post_post_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/07_autobind/post/post_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: post/post.proto\n\npackage post\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tPostService_GetPost_FullMethodName = \"/post.PostService/GetPost\"\n)\n\n// PostServiceClient is the client API for PostService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype PostServiceClient interface {\n\tGetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error)\n}\n\ntype postServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewPostServiceClient(cc grpc.ClientConnInterface) PostServiceClient {\n\treturn &postServiceClient{cc}\n}\n\nfunc (c *postServiceClient) GetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error) {\n\tout := new(GetPostResponse)\n\terr := c.cc.Invoke(ctx, PostService_GetPost_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// PostServiceServer is the server API for PostService service.\n// All implementations must embed UnimplementedPostServiceServer\n// for forward compatibility\ntype PostServiceServer interface {\n\tGetPost(context.Context, *GetPostRequest) (*GetPostResponse, error)\n\tmustEmbedUnimplementedPostServiceServer()\n}\n\n// UnimplementedPostServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedPostServiceServer struct {\n}\n\nfunc (UnimplementedPostServiceServer) GetPost(context.Context, *GetPostRequest) (*GetPostResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetPost not implemented\")\n}\nfunc (UnimplementedPostServiceServer) mustEmbedUnimplementedPostServiceServer() {}\n\n// UnsafePostServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to PostServiceServer will\n// result in compilation errors.\ntype UnsafePostServiceServer interface {\n\tmustEmbedUnimplementedPostServiceServer()\n}\n\nfunc RegisterPostServiceServer(s grpc.ServiceRegistrar, srv PostServiceServer) {\n\ts.RegisterService(&PostService_ServiceDesc, srv)\n}\n\nfunc _PostService_GetPost_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetPostRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(PostServiceServer).GetPost(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: PostService_GetPost_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(PostServiceServer).GetPost(ctx, req.(*GetPostRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// PostService_ServiceDesc is the grpc.ServiceDesc for PostService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar PostService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"post.PostService\",\n\tHandlerType: (*PostServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetPost\",\n\t\t\tHandler:    _PostService_GetPost_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"post/post.proto\",\n}\n"
  },
  {
    "path": "_examples/07_autobind/proto/buf.yaml",
    "content": "version: v1\nbreaking:\n  use:\n    - FILE\nlint:\n  use:\n    - DEFAULT\n"
  },
  {
    "path": "_examples/07_autobind/proto/federation/federation.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"google/protobuf/any.proto\";\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\noption (grpc.federation.file)= {\n  import: [\"post/post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n      autobind: true\n    }\n  };\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  string uid = 4;\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"res\"\n        call {\n          method: \"post.PostService/GetPost\"\n          request { field: \"id\", by: \"$.id\" }\n        }\n      },\n      { by: \"res.post\", autobind: true },\n      {\n        message {\n          name: \"User\"\n          args { name: \"user_id\", by: \"'foo'\" }\n        }\n        autobind: true\n      }\n    ]\n  };\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  string uid = 4;\n}\n\nmessage User {\n  string uid = 1 [(grpc.federation.field).by = \"$.user_id\"];\n}"
  },
  {
    "path": "_examples/07_autobind/proto/post/post.proto",
    "content": "syntax = \"proto3\";\n\npackage post;\n\noption go_package = \"example/post;post\";\n\nservice PostService {\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  Post post = 1;\n}\n\nmessage Post {\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  string user_id = 4;\n}\n"
  },
  {
    "path": "_examples/08_literal/.gitignore",
    "content": "grpc/federation\n"
  },
  {
    "path": "_examples/08_literal/.vscode/settings.json",
    "content": "{\n    \"protoc\": {\n        \"options\": [\n            \"--proto_path=proto\",\n            \"--proto_path=proto_deps\"\n        ]\n    },\n    \"grpc-federation\": {\n        \"path\": \"../../bin/grpc-federation-language-server\",\n        \"import-paths\": [\n            \"proto\",\n            \"proto_deps\"\n        ]\n    }\n}\n"
  },
  {
    "path": "_examples/08_literal/Makefile",
    "content": "MAKEFILE_DIR := $(dir $(lastword $(MAKEFILE_LIST)))\nGOBIN := $(MAKEFILE_DIR)/../../bin\nPATH := $(GOBIN):$(PATH)\n\nJAEGER_IMAGE := jaegertracing/all-in-one:latest\n\n.PHONY: generate\ngenerate:\n\t$(GOBIN)/buf generate\n\n.PHONY: lint\nlint:\n\t@$(GOBIN)/grpc-federation-linter -Iproto -Iproto_deps ./proto/federation/federation.proto\n\n.PHONY: test\ntest:\n\tgo test -race ./ -count=1\n\n.PHONY: grpc-federation/generate\ngrpc-federation/generate:\n\t@$(GOBIN)/grpc-federation-generator ./proto/federation/federation.proto\n\n.PHONY: grpc-federation/watch\ngrpc-federation/watch:\n\t@$(GOBIN)/grpc-federation-generator -w\n\n.PHONY: jaeger/start\njaeger/start:\n\t@docker run \\\n\t\t-e COLLECTOR_OTLP_ENABLED=true \\\n\t\t-p 16686:16686 \\\n\t\t-p 4317:4317 \\\n\t\t-p 4318:4318 \\\n\t\t-d \\\n\t\t$(JAEGER_IMAGE)\n\n.PHONY: jaeger/stop\njaeger/stop:\n\t@docker stop $(shell docker ps -q  --filter ancestor=$(JAEGER_IMAGE))\n"
  },
  {
    "path": "_examples/08_literal/buf.gen.yaml",
    "content": "version: v1\nmanaged:\n  enabled: true\nplugins:\n  - plugin: go\n    out: .\n    opt: paths=source_relative\n  - plugin: go-grpc\n    out: .\n    opt: paths=source_relative\n  - plugin: grpc-federation\n    out: .\n    opt:\n    - paths=source_relative\n    - import_paths=proto\n"
  },
  {
    "path": "_examples/08_literal/buf.work.yaml",
    "content": "version: v1\ndirectories:\n  - proto\n  - proto_deps\n"
  },
  {
    "path": "_examples/08_literal/content/content.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: content/content.proto\n\npackage content\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype ContentType int32\n\nconst (\n\tContentType_CONTENT_TYPE_1 ContentType = 0\n\tContentType_CONTENT_TYPE_2 ContentType = 1\n\tContentType_CONTENT_TYPE_3 ContentType = 2\n)\n\n// Enum value maps for ContentType.\nvar (\n\tContentType_name = map[int32]string{\n\t\t0: \"CONTENT_TYPE_1\",\n\t\t1: \"CONTENT_TYPE_2\",\n\t\t2: \"CONTENT_TYPE_3\",\n\t}\n\tContentType_value = map[string]int32{\n\t\t\"CONTENT_TYPE_1\": 0,\n\t\t\"CONTENT_TYPE_2\": 1,\n\t\t\"CONTENT_TYPE_3\": 2,\n\t}\n)\n\nfunc (x ContentType) Enum() *ContentType {\n\tp := new(ContentType)\n\t*p = x\n\treturn p\n}\n\nfunc (x ContentType) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (ContentType) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_content_content_proto_enumTypes[0].Descriptor()\n}\n\nfunc (ContentType) Type() protoreflect.EnumType {\n\treturn &file_content_content_proto_enumTypes[0]\n}\n\nfunc (x ContentType) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use ContentType.Descriptor instead.\nfunc (ContentType) EnumDescriptor() ([]byte, []int) {\n\treturn file_content_content_proto_rawDescGZIP(), []int{0}\n}\n\ntype GetContentRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tByField          string        `protobuf:\"bytes,1,opt,name=by_field,json=byField,proto3\" json:\"by_field,omitempty\"`\n\tDoubleField      float64       `protobuf:\"fixed64,2,opt,name=double_field,json=doubleField,proto3\" json:\"double_field,omitempty\"`\n\tDoublesField     []float64     `protobuf:\"fixed64,3,rep,packed,name=doubles_field,json=doublesField,proto3\" json:\"doubles_field,omitempty\"`\n\tFloatField       float32       `protobuf:\"fixed32,4,opt,name=float_field,json=floatField,proto3\" json:\"float_field,omitempty\"`\n\tFloatsField      []float32     `protobuf:\"fixed32,5,rep,packed,name=floats_field,json=floatsField,proto3\" json:\"floats_field,omitempty\"`\n\tInt32Field       int32         `protobuf:\"varint,6,opt,name=int32_field,json=int32Field,proto3\" json:\"int32_field,omitempty\"`\n\tInt32SField      []int32       `protobuf:\"varint,7,rep,packed,name=int32s_field,json=int32sField,proto3\" json:\"int32s_field,omitempty\"`\n\tInt64Field       int64         `protobuf:\"varint,8,opt,name=int64_field,json=int64Field,proto3\" json:\"int64_field,omitempty\"`\n\tInt64SField      []int64       `protobuf:\"varint,9,rep,packed,name=int64s_field,json=int64sField,proto3\" json:\"int64s_field,omitempty\"`\n\tUint32Field      uint32        `protobuf:\"varint,10,opt,name=uint32_field,json=uint32Field,proto3\" json:\"uint32_field,omitempty\"`\n\tUint32SField     []uint32      `protobuf:\"varint,11,rep,packed,name=uint32s_field,json=uint32sField,proto3\" json:\"uint32s_field,omitempty\"`\n\tUint64Field      uint64        `protobuf:\"varint,12,opt,name=uint64_field,json=uint64Field,proto3\" json:\"uint64_field,omitempty\"`\n\tUint64SField     []uint64      `protobuf:\"varint,13,rep,packed,name=uint64s_field,json=uint64sField,proto3\" json:\"uint64s_field,omitempty\"`\n\tSint32Field      int32         `protobuf:\"zigzag32,14,opt,name=sint32_field,json=sint32Field,proto3\" json:\"sint32_field,omitempty\"`\n\tSint32SField     []int32       `protobuf:\"zigzag32,15,rep,packed,name=sint32s_field,json=sint32sField,proto3\" json:\"sint32s_field,omitempty\"`\n\tSint64Field      int64         `protobuf:\"zigzag64,16,opt,name=sint64_field,json=sint64Field,proto3\" json:\"sint64_field,omitempty\"`\n\tSint64SField     []int64       `protobuf:\"zigzag64,17,rep,packed,name=sint64s_field,json=sint64sField,proto3\" json:\"sint64s_field,omitempty\"`\n\tFixed32Field     uint32        `protobuf:\"fixed32,18,opt,name=fixed32_field,json=fixed32Field,proto3\" json:\"fixed32_field,omitempty\"`\n\tFixed32SField    []uint32      `protobuf:\"fixed32,19,rep,packed,name=fixed32s_field,json=fixed32sField,proto3\" json:\"fixed32s_field,omitempty\"`\n\tFixed64Field     uint64        `protobuf:\"fixed64,20,opt,name=fixed64_field,json=fixed64Field,proto3\" json:\"fixed64_field,omitempty\"`\n\tFixed64SField    []uint64      `protobuf:\"fixed64,21,rep,packed,name=fixed64s_field,json=fixed64sField,proto3\" json:\"fixed64s_field,omitempty\"`\n\tSfixed32Field    int32         `protobuf:\"fixed32,22,opt,name=sfixed32_field,json=sfixed32Field,proto3\" json:\"sfixed32_field,omitempty\"`\n\tSfixed32SField   []int32       `protobuf:\"fixed32,23,rep,packed,name=sfixed32s_field,json=sfixed32sField,proto3\" json:\"sfixed32s_field,omitempty\"`\n\tSfixed64Field    int64         `protobuf:\"fixed64,24,opt,name=sfixed64_field,json=sfixed64Field,proto3\" json:\"sfixed64_field,omitempty\"`\n\tSfixed64SField   []int64       `protobuf:\"fixed64,25,rep,packed,name=sfixed64s_field,json=sfixed64sField,proto3\" json:\"sfixed64s_field,omitempty\"`\n\tBoolField        bool          `protobuf:\"varint,26,opt,name=bool_field,json=boolField,proto3\" json:\"bool_field,omitempty\"`\n\tBoolsField       []bool        `protobuf:\"varint,27,rep,packed,name=bools_field,json=boolsField,proto3\" json:\"bools_field,omitempty\"`\n\tStringField      string        `protobuf:\"bytes,28,opt,name=string_field,json=stringField,proto3\" json:\"string_field,omitempty\"`\n\tStringsField     []string      `protobuf:\"bytes,29,rep,name=strings_field,json=stringsField,proto3\" json:\"strings_field,omitempty\"`\n\tByteStringField  []byte        `protobuf:\"bytes,30,opt,name=byte_string_field,json=byteStringField,proto3\" json:\"byte_string_field,omitempty\"`\n\tByteStringsField [][]byte      `protobuf:\"bytes,31,rep,name=byte_strings_field,json=byteStringsField,proto3\" json:\"byte_strings_field,omitempty\"`\n\tEnumField        ContentType   `protobuf:\"varint,32,opt,name=enum_field,json=enumField,proto3,enum=content.ContentType\" json:\"enum_field,omitempty\"`\n\tEnumsField       []ContentType `protobuf:\"varint,33,rep,packed,name=enums_field,json=enumsField,proto3,enum=content.ContentType\" json:\"enums_field,omitempty\"`\n\tEnvField         string        `protobuf:\"bytes,34,opt,name=env_field,json=envField,proto3\" json:\"env_field,omitempty\"`\n\tEnvsField        []string      `protobuf:\"bytes,35,rep,name=envs_field,json=envsField,proto3\" json:\"envs_field,omitempty\"`\n\tMessageField     *Content      `protobuf:\"bytes,36,opt,name=message_field,json=messageField,proto3\" json:\"message_field,omitempty\"`\n\tMessagesField    []*Content    `protobuf:\"bytes,37,rep,name=messages_field,json=messagesField,proto3\" json:\"messages_field,omitempty\"`\n}\n\nfunc (x *GetContentRequest) Reset() {\n\t*x = GetContentRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_content_content_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetContentRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetContentRequest) ProtoMessage() {}\n\nfunc (x *GetContentRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_content_content_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetContentRequest.ProtoReflect.Descriptor instead.\nfunc (*GetContentRequest) Descriptor() ([]byte, []int) {\n\treturn file_content_content_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetContentRequest) GetByField() string {\n\tif x != nil {\n\t\treturn x.ByField\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetContentRequest) GetDoubleField() float64 {\n\tif x != nil {\n\t\treturn x.DoubleField\n\t}\n\treturn 0\n}\n\nfunc (x *GetContentRequest) GetDoublesField() []float64 {\n\tif x != nil {\n\t\treturn x.DoublesField\n\t}\n\treturn nil\n}\n\nfunc (x *GetContentRequest) GetFloatField() float32 {\n\tif x != nil {\n\t\treturn x.FloatField\n\t}\n\treturn 0\n}\n\nfunc (x *GetContentRequest) GetFloatsField() []float32 {\n\tif x != nil {\n\t\treturn x.FloatsField\n\t}\n\treturn nil\n}\n\nfunc (x *GetContentRequest) GetInt32Field() int32 {\n\tif x != nil {\n\t\treturn x.Int32Field\n\t}\n\treturn 0\n}\n\nfunc (x *GetContentRequest) GetInt32SField() []int32 {\n\tif x != nil {\n\t\treturn x.Int32SField\n\t}\n\treturn nil\n}\n\nfunc (x *GetContentRequest) GetInt64Field() int64 {\n\tif x != nil {\n\t\treturn x.Int64Field\n\t}\n\treturn 0\n}\n\nfunc (x *GetContentRequest) GetInt64SField() []int64 {\n\tif x != nil {\n\t\treturn x.Int64SField\n\t}\n\treturn nil\n}\n\nfunc (x *GetContentRequest) GetUint32Field() uint32 {\n\tif x != nil {\n\t\treturn x.Uint32Field\n\t}\n\treturn 0\n}\n\nfunc (x *GetContentRequest) GetUint32SField() []uint32 {\n\tif x != nil {\n\t\treturn x.Uint32SField\n\t}\n\treturn nil\n}\n\nfunc (x *GetContentRequest) GetUint64Field() uint64 {\n\tif x != nil {\n\t\treturn x.Uint64Field\n\t}\n\treturn 0\n}\n\nfunc (x *GetContentRequest) GetUint64SField() []uint64 {\n\tif x != nil {\n\t\treturn x.Uint64SField\n\t}\n\treturn nil\n}\n\nfunc (x *GetContentRequest) GetSint32Field() int32 {\n\tif x != nil {\n\t\treturn x.Sint32Field\n\t}\n\treturn 0\n}\n\nfunc (x *GetContentRequest) GetSint32SField() []int32 {\n\tif x != nil {\n\t\treturn x.Sint32SField\n\t}\n\treturn nil\n}\n\nfunc (x *GetContentRequest) GetSint64Field() int64 {\n\tif x != nil {\n\t\treturn x.Sint64Field\n\t}\n\treturn 0\n}\n\nfunc (x *GetContentRequest) GetSint64SField() []int64 {\n\tif x != nil {\n\t\treturn x.Sint64SField\n\t}\n\treturn nil\n}\n\nfunc (x *GetContentRequest) GetFixed32Field() uint32 {\n\tif x != nil {\n\t\treturn x.Fixed32Field\n\t}\n\treturn 0\n}\n\nfunc (x *GetContentRequest) GetFixed32SField() []uint32 {\n\tif x != nil {\n\t\treturn x.Fixed32SField\n\t}\n\treturn nil\n}\n\nfunc (x *GetContentRequest) GetFixed64Field() uint64 {\n\tif x != nil {\n\t\treturn x.Fixed64Field\n\t}\n\treturn 0\n}\n\nfunc (x *GetContentRequest) GetFixed64SField() []uint64 {\n\tif x != nil {\n\t\treturn x.Fixed64SField\n\t}\n\treturn nil\n}\n\nfunc (x *GetContentRequest) GetSfixed32Field() int32 {\n\tif x != nil {\n\t\treturn x.Sfixed32Field\n\t}\n\treturn 0\n}\n\nfunc (x *GetContentRequest) GetSfixed32SField() []int32 {\n\tif x != nil {\n\t\treturn x.Sfixed32SField\n\t}\n\treturn nil\n}\n\nfunc (x *GetContentRequest) GetSfixed64Field() int64 {\n\tif x != nil {\n\t\treturn x.Sfixed64Field\n\t}\n\treturn 0\n}\n\nfunc (x *GetContentRequest) GetSfixed64SField() []int64 {\n\tif x != nil {\n\t\treturn x.Sfixed64SField\n\t}\n\treturn nil\n}\n\nfunc (x *GetContentRequest) GetBoolField() bool {\n\tif x != nil {\n\t\treturn x.BoolField\n\t}\n\treturn false\n}\n\nfunc (x *GetContentRequest) GetBoolsField() []bool {\n\tif x != nil {\n\t\treturn x.BoolsField\n\t}\n\treturn nil\n}\n\nfunc (x *GetContentRequest) GetStringField() string {\n\tif x != nil {\n\t\treturn x.StringField\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetContentRequest) GetStringsField() []string {\n\tif x != nil {\n\t\treturn x.StringsField\n\t}\n\treturn nil\n}\n\nfunc (x *GetContentRequest) GetByteStringField() []byte {\n\tif x != nil {\n\t\treturn x.ByteStringField\n\t}\n\treturn nil\n}\n\nfunc (x *GetContentRequest) GetByteStringsField() [][]byte {\n\tif x != nil {\n\t\treturn x.ByteStringsField\n\t}\n\treturn nil\n}\n\nfunc (x *GetContentRequest) GetEnumField() ContentType {\n\tif x != nil {\n\t\treturn x.EnumField\n\t}\n\treturn ContentType_CONTENT_TYPE_1\n}\n\nfunc (x *GetContentRequest) GetEnumsField() []ContentType {\n\tif x != nil {\n\t\treturn x.EnumsField\n\t}\n\treturn nil\n}\n\nfunc (x *GetContentRequest) GetEnvField() string {\n\tif x != nil {\n\t\treturn x.EnvField\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetContentRequest) GetEnvsField() []string {\n\tif x != nil {\n\t\treturn x.EnvsField\n\t}\n\treturn nil\n}\n\nfunc (x *GetContentRequest) GetMessageField() *Content {\n\tif x != nil {\n\t\treturn x.MessageField\n\t}\n\treturn nil\n}\n\nfunc (x *GetContentRequest) GetMessagesField() []*Content {\n\tif x != nil {\n\t\treturn x.MessagesField\n\t}\n\treturn nil\n}\n\ntype GetContentResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tContent *Content `protobuf:\"bytes,1,opt,name=content,proto3\" json:\"content,omitempty\"`\n}\n\nfunc (x *GetContentResponse) Reset() {\n\t*x = GetContentResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_content_content_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetContentResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetContentResponse) ProtoMessage() {}\n\nfunc (x *GetContentResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_content_content_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetContentResponse.ProtoReflect.Descriptor instead.\nfunc (*GetContentResponse) Descriptor() ([]byte, []int) {\n\treturn file_content_content_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetContentResponse) GetContent() *Content {\n\tif x != nil {\n\t\treturn x.Content\n\t}\n\treturn nil\n}\n\ntype Content struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tByField          string        `protobuf:\"bytes,1,opt,name=by_field,json=byField,proto3\" json:\"by_field,omitempty\"`\n\tDoubleField      float64       `protobuf:\"fixed64,2,opt,name=double_field,json=doubleField,proto3\" json:\"double_field,omitempty\"`\n\tDoublesField     []float64     `protobuf:\"fixed64,3,rep,packed,name=doubles_field,json=doublesField,proto3\" json:\"doubles_field,omitempty\"`\n\tFloatField       float32       `protobuf:\"fixed32,4,opt,name=float_field,json=floatField,proto3\" json:\"float_field,omitempty\"`\n\tFloatsField      []float32     `protobuf:\"fixed32,5,rep,packed,name=floats_field,json=floatsField,proto3\" json:\"floats_field,omitempty\"`\n\tInt32Field       int32         `protobuf:\"varint,6,opt,name=int32_field,json=int32Field,proto3\" json:\"int32_field,omitempty\"`\n\tInt32SField      []int32       `protobuf:\"varint,7,rep,packed,name=int32s_field,json=int32sField,proto3\" json:\"int32s_field,omitempty\"`\n\tInt64Field       int64         `protobuf:\"varint,8,opt,name=int64_field,json=int64Field,proto3\" json:\"int64_field,omitempty\"`\n\tInt64SField      []int64       `protobuf:\"varint,9,rep,packed,name=int64s_field,json=int64sField,proto3\" json:\"int64s_field,omitempty\"`\n\tUint32Field      uint32        `protobuf:\"varint,10,opt,name=uint32_field,json=uint32Field,proto3\" json:\"uint32_field,omitempty\"`\n\tUint32SField     []uint32      `protobuf:\"varint,11,rep,packed,name=uint32s_field,json=uint32sField,proto3\" json:\"uint32s_field,omitempty\"`\n\tUint64Field      uint64        `protobuf:\"varint,12,opt,name=uint64_field,json=uint64Field,proto3\" json:\"uint64_field,omitempty\"`\n\tUint64SField     []uint64      `protobuf:\"varint,13,rep,packed,name=uint64s_field,json=uint64sField,proto3\" json:\"uint64s_field,omitempty\"`\n\tSint32Field      int32         `protobuf:\"zigzag32,14,opt,name=sint32_field,json=sint32Field,proto3\" json:\"sint32_field,omitempty\"`\n\tSint32SField     []int32       `protobuf:\"zigzag32,15,rep,packed,name=sint32s_field,json=sint32sField,proto3\" json:\"sint32s_field,omitempty\"`\n\tSint64Field      int64         `protobuf:\"zigzag64,16,opt,name=sint64_field,json=sint64Field,proto3\" json:\"sint64_field,omitempty\"`\n\tSint64SField     []int64       `protobuf:\"zigzag64,17,rep,packed,name=sint64s_field,json=sint64sField,proto3\" json:\"sint64s_field,omitempty\"`\n\tFixed32Field     uint32        `protobuf:\"fixed32,18,opt,name=fixed32_field,json=fixed32Field,proto3\" json:\"fixed32_field,omitempty\"`\n\tFixed32SField    []uint32      `protobuf:\"fixed32,19,rep,packed,name=fixed32s_field,json=fixed32sField,proto3\" json:\"fixed32s_field,omitempty\"`\n\tFixed64Field     uint64        `protobuf:\"fixed64,20,opt,name=fixed64_field,json=fixed64Field,proto3\" json:\"fixed64_field,omitempty\"`\n\tFixed64SField    []uint64      `protobuf:\"fixed64,21,rep,packed,name=fixed64s_field,json=fixed64sField,proto3\" json:\"fixed64s_field,omitempty\"`\n\tSfixed32Field    int32         `protobuf:\"fixed32,22,opt,name=sfixed32_field,json=sfixed32Field,proto3\" json:\"sfixed32_field,omitempty\"`\n\tSfixed32SField   []int32       `protobuf:\"fixed32,23,rep,packed,name=sfixed32s_field,json=sfixed32sField,proto3\" json:\"sfixed32s_field,omitempty\"`\n\tSfixed64Field    int64         `protobuf:\"fixed64,24,opt,name=sfixed64_field,json=sfixed64Field,proto3\" json:\"sfixed64_field,omitempty\"`\n\tSfixed64SField   []int64       `protobuf:\"fixed64,25,rep,packed,name=sfixed64s_field,json=sfixed64sField,proto3\" json:\"sfixed64s_field,omitempty\"`\n\tBoolField        bool          `protobuf:\"varint,26,opt,name=bool_field,json=boolField,proto3\" json:\"bool_field,omitempty\"`\n\tBoolsField       []bool        `protobuf:\"varint,27,rep,packed,name=bools_field,json=boolsField,proto3\" json:\"bools_field,omitempty\"`\n\tStringField      string        `protobuf:\"bytes,28,opt,name=string_field,json=stringField,proto3\" json:\"string_field,omitempty\"`\n\tStringsField     []string      `protobuf:\"bytes,29,rep,name=strings_field,json=stringsField,proto3\" json:\"strings_field,omitempty\"`\n\tByteStringField  []byte        `protobuf:\"bytes,30,opt,name=byte_string_field,json=byteStringField,proto3\" json:\"byte_string_field,omitempty\"`\n\tByteStringsField [][]byte      `protobuf:\"bytes,31,rep,name=byte_strings_field,json=byteStringsField,proto3\" json:\"byte_strings_field,omitempty\"`\n\tEnumField        ContentType   `protobuf:\"varint,32,opt,name=enum_field,json=enumField,proto3,enum=content.ContentType\" json:\"enum_field,omitempty\"`\n\tEnumsField       []ContentType `protobuf:\"varint,33,rep,packed,name=enums_field,json=enumsField,proto3,enum=content.ContentType\" json:\"enums_field,omitempty\"`\n\tEnvField         string        `protobuf:\"bytes,34,opt,name=env_field,json=envField,proto3\" json:\"env_field,omitempty\"`\n\tEnvsField        []string      `protobuf:\"bytes,35,rep,name=envs_field,json=envsField,proto3\" json:\"envs_field,omitempty\"`\n\tMessageField     *Content      `protobuf:\"bytes,36,opt,name=message_field,json=messageField,proto3\" json:\"message_field,omitempty\"`\n\tMessagesField    []*Content    `protobuf:\"bytes,37,rep,name=messages_field,json=messagesField,proto3\" json:\"messages_field,omitempty\"`\n}\n\nfunc (x *Content) Reset() {\n\t*x = Content{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_content_content_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Content) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Content) ProtoMessage() {}\n\nfunc (x *Content) ProtoReflect() protoreflect.Message {\n\tmi := &file_content_content_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Content.ProtoReflect.Descriptor instead.\nfunc (*Content) Descriptor() ([]byte, []int) {\n\treturn file_content_content_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *Content) GetByField() string {\n\tif x != nil {\n\t\treturn x.ByField\n\t}\n\treturn \"\"\n}\n\nfunc (x *Content) GetDoubleField() float64 {\n\tif x != nil {\n\t\treturn x.DoubleField\n\t}\n\treturn 0\n}\n\nfunc (x *Content) GetDoublesField() []float64 {\n\tif x != nil {\n\t\treturn x.DoublesField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetFloatField() float32 {\n\tif x != nil {\n\t\treturn x.FloatField\n\t}\n\treturn 0\n}\n\nfunc (x *Content) GetFloatsField() []float32 {\n\tif x != nil {\n\t\treturn x.FloatsField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetInt32Field() int32 {\n\tif x != nil {\n\t\treturn x.Int32Field\n\t}\n\treturn 0\n}\n\nfunc (x *Content) GetInt32SField() []int32 {\n\tif x != nil {\n\t\treturn x.Int32SField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetInt64Field() int64 {\n\tif x != nil {\n\t\treturn x.Int64Field\n\t}\n\treturn 0\n}\n\nfunc (x *Content) GetInt64SField() []int64 {\n\tif x != nil {\n\t\treturn x.Int64SField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetUint32Field() uint32 {\n\tif x != nil {\n\t\treturn x.Uint32Field\n\t}\n\treturn 0\n}\n\nfunc (x *Content) GetUint32SField() []uint32 {\n\tif x != nil {\n\t\treturn x.Uint32SField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetUint64Field() uint64 {\n\tif x != nil {\n\t\treturn x.Uint64Field\n\t}\n\treturn 0\n}\n\nfunc (x *Content) GetUint64SField() []uint64 {\n\tif x != nil {\n\t\treturn x.Uint64SField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetSint32Field() int32 {\n\tif x != nil {\n\t\treturn x.Sint32Field\n\t}\n\treturn 0\n}\n\nfunc (x *Content) GetSint32SField() []int32 {\n\tif x != nil {\n\t\treturn x.Sint32SField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetSint64Field() int64 {\n\tif x != nil {\n\t\treturn x.Sint64Field\n\t}\n\treturn 0\n}\n\nfunc (x *Content) GetSint64SField() []int64 {\n\tif x != nil {\n\t\treturn x.Sint64SField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetFixed32Field() uint32 {\n\tif x != nil {\n\t\treturn x.Fixed32Field\n\t}\n\treturn 0\n}\n\nfunc (x *Content) GetFixed32SField() []uint32 {\n\tif x != nil {\n\t\treturn x.Fixed32SField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetFixed64Field() uint64 {\n\tif x != nil {\n\t\treturn x.Fixed64Field\n\t}\n\treturn 0\n}\n\nfunc (x *Content) GetFixed64SField() []uint64 {\n\tif x != nil {\n\t\treturn x.Fixed64SField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetSfixed32Field() int32 {\n\tif x != nil {\n\t\treturn x.Sfixed32Field\n\t}\n\treturn 0\n}\n\nfunc (x *Content) GetSfixed32SField() []int32 {\n\tif x != nil {\n\t\treturn x.Sfixed32SField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetSfixed64Field() int64 {\n\tif x != nil {\n\t\treturn x.Sfixed64Field\n\t}\n\treturn 0\n}\n\nfunc (x *Content) GetSfixed64SField() []int64 {\n\tif x != nil {\n\t\treturn x.Sfixed64SField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetBoolField() bool {\n\tif x != nil {\n\t\treturn x.BoolField\n\t}\n\treturn false\n}\n\nfunc (x *Content) GetBoolsField() []bool {\n\tif x != nil {\n\t\treturn x.BoolsField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetStringField() string {\n\tif x != nil {\n\t\treturn x.StringField\n\t}\n\treturn \"\"\n}\n\nfunc (x *Content) GetStringsField() []string {\n\tif x != nil {\n\t\treturn x.StringsField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetByteStringField() []byte {\n\tif x != nil {\n\t\treturn x.ByteStringField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetByteStringsField() [][]byte {\n\tif x != nil {\n\t\treturn x.ByteStringsField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetEnumField() ContentType {\n\tif x != nil {\n\t\treturn x.EnumField\n\t}\n\treturn ContentType_CONTENT_TYPE_1\n}\n\nfunc (x *Content) GetEnumsField() []ContentType {\n\tif x != nil {\n\t\treturn x.EnumsField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetEnvField() string {\n\tif x != nil {\n\t\treturn x.EnvField\n\t}\n\treturn \"\"\n}\n\nfunc (x *Content) GetEnvsField() []string {\n\tif x != nil {\n\t\treturn x.EnvsField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetMessageField() *Content {\n\tif x != nil {\n\t\treturn x.MessageField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetMessagesField() []*Content {\n\tif x != nil {\n\t\treturn x.MessagesField\n\t}\n\treturn nil\n}\n\nvar File_content_content_proto protoreflect.FileDescriptor\n\nvar file_content_content_proto_rawDesc = []byte{\n\t0x0a, 0x15, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,\n\t0x22, 0x94, 0x0b, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52,\n\t0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x79, 0x5f, 0x66, 0x69, 0x65,\n\t0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x79, 0x46, 0x69, 0x65, 0x6c,\n\t0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x65, 0x6c,\n\t0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x46,\n\t0x69, 0x65, 0x6c, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x73, 0x5f,\n\t0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x01, 0x52, 0x0c, 0x64, 0x6f, 0x75,\n\t0x62, 0x6c, 0x65, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x6c, 0x6f,\n\t0x61, 0x74, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a,\n\t0x66, 0x6c, 0x6f, 0x61, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x6c,\n\t0x6f, 0x61, 0x74, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x05, 0x20, 0x03, 0x28, 0x02,\n\t0x52, 0x0b, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a,\n\t0x0b, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x06, 0x20, 0x01,\n\t0x28, 0x05, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21,\n\t0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x07,\n\t0x20, 0x03, 0x28, 0x05, 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x73, 0x46, 0x69, 0x65, 0x6c,\n\t0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64,\n\t0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x65,\n\t0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x73, 0x5f, 0x66, 0x69, 0x65,\n\t0x6c, 0x64, 0x18, 0x09, 0x20, 0x03, 0x28, 0x03, 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x73,\n\t0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f,\n\t0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x69, 0x6e,\n\t0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x75, 0x69, 0x6e, 0x74,\n\t0x33, 0x32, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0d, 0x52,\n\t0x0c, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a,\n\t0x0c, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0c, 0x20,\n\t0x01, 0x28, 0x04, 0x52, 0x0b, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x12, 0x23, 0x0a, 0x0d, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c,\n\t0x64, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x04, 0x52, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x73,\n\t0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f,\n\t0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x11, 0x52, 0x0b, 0x73, 0x69, 0x6e,\n\t0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x69, 0x6e, 0x74,\n\t0x33, 0x32, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x11, 0x52,\n\t0x0c, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a,\n\t0x0c, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x10, 0x20,\n\t0x01, 0x28, 0x12, 0x52, 0x0b, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x12, 0x23, 0x0a, 0x0d, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c,\n\t0x64, 0x18, 0x11, 0x20, 0x03, 0x28, 0x12, 0x52, 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x73,\n\t0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32,\n\t0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x07, 0x52, 0x0c, 0x66, 0x69,\n\t0x78, 0x65, 0x64, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x66, 0x69,\n\t0x78, 0x65, 0x64, 0x33, 0x32, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x13, 0x20, 0x03,\n\t0x28, 0x07, 0x52, 0x0d, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x73, 0x46, 0x69, 0x65, 0x6c,\n\t0x64, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65,\n\t0x6c, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x06, 0x52, 0x0c, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36,\n\t0x34, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36,\n\t0x34, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x15, 0x20, 0x03, 0x28, 0x06, 0x52, 0x0d,\n\t0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x25, 0x0a,\n\t0x0e, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18,\n\t0x16, 0x20, 0x01, 0x28, 0x0f, 0x52, 0x0d, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x46,\n\t0x69, 0x65, 0x6c, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32,\n\t0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x17, 0x20, 0x03, 0x28, 0x0f, 0x52, 0x0e, 0x73,\n\t0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x25, 0x0a,\n\t0x0e, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18,\n\t0x18, 0x20, 0x01, 0x28, 0x10, 0x52, 0x0d, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x46,\n\t0x69, 0x65, 0x6c, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34,\n\t0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x19, 0x20, 0x03, 0x28, 0x10, 0x52, 0x0e, 0x73,\n\t0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x0a,\n\t0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x1a, 0x20, 0x01, 0x28,\n\t0x08, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b,\n\t0x62, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x1b, 0x20, 0x03, 0x28,\n\t0x08, 0x52, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a,\n\t0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x1c, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c,\n\t0x64, 0x18, 0x1d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73,\n\t0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x73, 0x74,\n\t0x72, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0c,\n\t0x52, 0x0f, 0x62, 0x79, 0x74, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c,\n\t0x64, 0x12, 0x2c, 0x0a, 0x12, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,\n\t0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x1f, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x10, 0x62,\n\t0x79, 0x74, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12,\n\t0x33, 0x0a, 0x0a, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x20, 0x20,\n\t0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x46,\n\t0x69, 0x65, 0x6c, 0x64, 0x12, 0x35, 0x0a, 0x0b, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x5f, 0x66, 0x69,\n\t0x65, 0x6c, 0x64, 0x18, 0x21, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x63, 0x6f, 0x6e, 0x74,\n\t0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52,\n\t0x0a, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x65,\n\t0x6e, 0x76, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x22, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,\n\t0x65, 0x6e, 0x76, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6e, 0x76, 0x73,\n\t0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x23, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e,\n\t0x76, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x35, 0x0a, 0x0d, 0x6d, 0x65, 0x73, 0x73, 0x61,\n\t0x67, 0x65, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x24, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10,\n\t0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,\n\t0x52, 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x37,\n\t0x0a, 0x0e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64,\n\t0x18, 0x25, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,\n\t0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x0d, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,\n\t0x65, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x22, 0x40, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a,\n\t0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10,\n\t0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,\n\t0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x8a, 0x0b, 0x0a, 0x07, 0x43, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x79, 0x5f, 0x66, 0x69, 0x65, 0x6c,\n\t0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x79, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x12, 0x21, 0x0a, 0x0c, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x46, 0x69,\n\t0x65, 0x6c, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x73, 0x5f, 0x66,\n\t0x69, 0x65, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x01, 0x52, 0x0c, 0x64, 0x6f, 0x75, 0x62,\n\t0x6c, 0x65, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x6c, 0x6f, 0x61,\n\t0x74, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a, 0x66,\n\t0x6c, 0x6f, 0x61, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x6c, 0x6f,\n\t0x61, 0x74, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x05, 0x20, 0x03, 0x28, 0x02, 0x52,\n\t0x0b, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b,\n\t0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28,\n\t0x05, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a,\n\t0x0c, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x07, 0x20,\n\t0x03, 0x28, 0x05, 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18,\n\t0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c,\n\t0x64, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c,\n\t0x64, 0x18, 0x09, 0x20, 0x03, 0x28, 0x03, 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x73, 0x46,\n\t0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66,\n\t0x69, 0x65, 0x6c, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x69, 0x6e, 0x74,\n\t0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x75, 0x69, 0x6e, 0x74, 0x33,\n\t0x32, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0c,\n\t0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c,\n\t0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0c, 0x20, 0x01,\n\t0x28, 0x04, 0x52, 0x0b, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12,\n\t0x23, 0x0a, 0x0d, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64,\n\t0x18, 0x0d, 0x20, 0x03, 0x28, 0x04, 0x52, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x73, 0x46,\n\t0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66,\n\t0x69, 0x65, 0x6c, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x11, 0x52, 0x0b, 0x73, 0x69, 0x6e, 0x74,\n\t0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x69, 0x6e, 0x74, 0x33,\n\t0x32, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x11, 0x52, 0x0c,\n\t0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c,\n\t0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x10, 0x20, 0x01,\n\t0x28, 0x12, 0x52, 0x0b, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12,\n\t0x23, 0x0a, 0x0d, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64,\n\t0x18, 0x11, 0x20, 0x03, 0x28, 0x12, 0x52, 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x73, 0x46,\n\t0x69, 0x65, 0x6c, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f,\n\t0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x07, 0x52, 0x0c, 0x66, 0x69, 0x78,\n\t0x65, 0x64, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x66, 0x69, 0x78,\n\t0x65, 0x64, 0x33, 0x32, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x13, 0x20, 0x03, 0x28,\n\t0x07, 0x52, 0x0d, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x12, 0x23, 0x0a, 0x0d, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c,\n\t0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x06, 0x52, 0x0c, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34,\n\t0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34,\n\t0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x15, 0x20, 0x03, 0x28, 0x06, 0x52, 0x0d, 0x66,\n\t0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x25, 0x0a, 0x0e,\n\t0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x16,\n\t0x20, 0x01, 0x28, 0x0f, 0x52, 0x0d, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x46, 0x69,\n\t0x65, 0x6c, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x73,\n\t0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x17, 0x20, 0x03, 0x28, 0x0f, 0x52, 0x0e, 0x73, 0x66,\n\t0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x25, 0x0a, 0x0e,\n\t0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x18,\n\t0x20, 0x01, 0x28, 0x10, 0x52, 0x0d, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x46, 0x69,\n\t0x65, 0x6c, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x73,\n\t0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x19, 0x20, 0x03, 0x28, 0x10, 0x52, 0x0e, 0x73, 0x66,\n\t0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x0a, 0x0a,\n\t0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x08,\n\t0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x62,\n\t0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x1b, 0x20, 0x03, 0x28, 0x08,\n\t0x52, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c,\n\t0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x1c, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12,\n\t0x23, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64,\n\t0x18, 0x1d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x46,\n\t0x69, 0x65, 0x6c, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x72,\n\t0x69, 0x6e, 0x67, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0c, 0x52,\n\t0x0f, 0x62, 0x79, 0x74, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x12, 0x2c, 0x0a, 0x12, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73,\n\t0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x1f, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x10, 0x62, 0x79,\n\t0x74, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x33,\n\t0x0a, 0x0a, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x20, 0x20, 0x01,\n\t0x28, 0x0e, 0x32, 0x14, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x46, 0x69,\n\t0x65, 0x6c, 0x64, 0x12, 0x35, 0x0a, 0x0b, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x5f, 0x66, 0x69, 0x65,\n\t0x6c, 0x64, 0x18, 0x21, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a,\n\t0x65, 0x6e, 0x75, 0x6d, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x6e,\n\t0x76, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x22, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65,\n\t0x6e, 0x76, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6e, 0x76, 0x73, 0x5f,\n\t0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x23, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x76,\n\t0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x35, 0x0a, 0x0d, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,\n\t0x65, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x24, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e,\n\t0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52,\n\t0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x37, 0x0a,\n\t0x0e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18,\n\t0x25, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,\n\t0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x0d, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,\n\t0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x2a, 0x49, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x4e, 0x54,\n\t0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x31, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x4f, 0x4e,\n\t0x54, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x32, 0x10, 0x01, 0x12, 0x12, 0x0a,\n\t0x0e, 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x33, 0x10,\n\t0x02, 0x32, 0x59, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x12, 0x47, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x74, 0x12, 0x1a, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x43,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e,\n\t0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x70, 0x0a, 0x0b,\n\t0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x42, 0x0c, 0x43, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x17, 0x65, 0x78, 0x61,\n\t0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3b, 0x63, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x74, 0xa2, 0x02, 0x03, 0x43, 0x58, 0x58, 0xaa, 0x02, 0x07, 0x43, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x74, 0xca, 0x02, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0xe2, 0x02,\n\t0x13, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61,\n\t0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x62, 0x06,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_content_content_proto_rawDescOnce sync.Once\n\tfile_content_content_proto_rawDescData = file_content_content_proto_rawDesc\n)\n\nfunc file_content_content_proto_rawDescGZIP() []byte {\n\tfile_content_content_proto_rawDescOnce.Do(func() {\n\t\tfile_content_content_proto_rawDescData = protoimpl.X.CompressGZIP(file_content_content_proto_rawDescData)\n\t})\n\treturn file_content_content_proto_rawDescData\n}\n\nvar file_content_content_proto_enumTypes = make([]protoimpl.EnumInfo, 1)\nvar file_content_content_proto_msgTypes = make([]protoimpl.MessageInfo, 3)\nvar file_content_content_proto_goTypes = []interface{}{\n\t(ContentType)(0),           // 0: content.ContentType\n\t(*GetContentRequest)(nil),  // 1: content.GetContentRequest\n\t(*GetContentResponse)(nil), // 2: content.GetContentResponse\n\t(*Content)(nil),            // 3: content.Content\n}\nvar file_content_content_proto_depIdxs = []int32{\n\t0,  // 0: content.GetContentRequest.enum_field:type_name -> content.ContentType\n\t0,  // 1: content.GetContentRequest.enums_field:type_name -> content.ContentType\n\t3,  // 2: content.GetContentRequest.message_field:type_name -> content.Content\n\t3,  // 3: content.GetContentRequest.messages_field:type_name -> content.Content\n\t3,  // 4: content.GetContentResponse.content:type_name -> content.Content\n\t0,  // 5: content.Content.enum_field:type_name -> content.ContentType\n\t0,  // 6: content.Content.enums_field:type_name -> content.ContentType\n\t3,  // 7: content.Content.message_field:type_name -> content.Content\n\t3,  // 8: content.Content.messages_field:type_name -> content.Content\n\t1,  // 9: content.ContentService.GetContent:input_type -> content.GetContentRequest\n\t2,  // 10: content.ContentService.GetContent:output_type -> content.GetContentResponse\n\t10, // [10:11] is the sub-list for method output_type\n\t9,  // [9:10] is the sub-list for method input_type\n\t9,  // [9:9] is the sub-list for extension type_name\n\t9,  // [9:9] is the sub-list for extension extendee\n\t0,  // [0:9] is the sub-list for field type_name\n}\n\nfunc init() { file_content_content_proto_init() }\nfunc file_content_content_proto_init() {\n\tif File_content_content_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_content_content_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetContentRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_content_content_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetContentResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_content_content_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Content); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_content_content_proto_rawDesc,\n\t\t\tNumEnums:      1,\n\t\t\tNumMessages:   3,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_content_content_proto_goTypes,\n\t\tDependencyIndexes: file_content_content_proto_depIdxs,\n\t\tEnumInfos:         file_content_content_proto_enumTypes,\n\t\tMessageInfos:      file_content_content_proto_msgTypes,\n\t}.Build()\n\tFile_content_content_proto = out.File\n\tfile_content_content_proto_rawDesc = nil\n\tfile_content_content_proto_goTypes = nil\n\tfile_content_content_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/08_literal/content/content_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: content/content.proto\n\npackage content\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tContentService_GetContent_FullMethodName = \"/content.ContentService/GetContent\"\n)\n\n// ContentServiceClient is the client API for ContentService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype ContentServiceClient interface {\n\tGetContent(ctx context.Context, in *GetContentRequest, opts ...grpc.CallOption) (*GetContentResponse, error)\n}\n\ntype contentServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewContentServiceClient(cc grpc.ClientConnInterface) ContentServiceClient {\n\treturn &contentServiceClient{cc}\n}\n\nfunc (c *contentServiceClient) GetContent(ctx context.Context, in *GetContentRequest, opts ...grpc.CallOption) (*GetContentResponse, error) {\n\tout := new(GetContentResponse)\n\terr := c.cc.Invoke(ctx, ContentService_GetContent_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// ContentServiceServer is the server API for ContentService service.\n// All implementations must embed UnimplementedContentServiceServer\n// for forward compatibility\ntype ContentServiceServer interface {\n\tGetContent(context.Context, *GetContentRequest) (*GetContentResponse, error)\n\tmustEmbedUnimplementedContentServiceServer()\n}\n\n// UnimplementedContentServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedContentServiceServer struct {\n}\n\nfunc (UnimplementedContentServiceServer) GetContent(context.Context, *GetContentRequest) (*GetContentResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetContent not implemented\")\n}\nfunc (UnimplementedContentServiceServer) mustEmbedUnimplementedContentServiceServer() {}\n\n// UnsafeContentServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to ContentServiceServer will\n// result in compilation errors.\ntype UnsafeContentServiceServer interface {\n\tmustEmbedUnimplementedContentServiceServer()\n}\n\nfunc RegisterContentServiceServer(s grpc.ServiceRegistrar, srv ContentServiceServer) {\n\ts.RegisterService(&ContentService_ServiceDesc, srv)\n}\n\nfunc _ContentService_GetContent_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetContentRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(ContentServiceServer).GetContent(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: ContentService_GetContent_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(ContentServiceServer).GetContent(ctx, req.(*GetContentRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// ContentService_ServiceDesc is the grpc.ServiceDesc for ContentService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar ContentService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"content.ContentService\",\n\tHandlerType: (*ContentServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetContent\",\n\t\t\tHandler:    _ContentService_GetContent_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"content/content.proto\",\n}\n"
  },
  {
    "path": "_examples/08_literal/federation/federation.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype ContentType int32\n\nconst (\n\tContentType_CONTENT_TYPE_1 ContentType = 0\n\tContentType_CONTENT_TYPE_2 ContentType = 1\n\tContentType_CONTENT_TYPE_3 ContentType = 2\n)\n\n// Enum value maps for ContentType.\nvar (\n\tContentType_name = map[int32]string{\n\t\t0: \"CONTENT_TYPE_1\",\n\t\t1: \"CONTENT_TYPE_2\",\n\t\t2: \"CONTENT_TYPE_3\",\n\t}\n\tContentType_value = map[string]int32{\n\t\t\"CONTENT_TYPE_1\": 0,\n\t\t\"CONTENT_TYPE_2\": 1,\n\t\t\"CONTENT_TYPE_3\": 2,\n\t}\n)\n\nfunc (x ContentType) Enum() *ContentType {\n\tp := new(ContentType)\n\t*p = x\n\treturn p\n}\n\nfunc (x ContentType) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (ContentType) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_federation_federation_proto_enumTypes[0].Descriptor()\n}\n\nfunc (ContentType) Type() protoreflect.EnumType {\n\treturn &file_federation_federation_proto_enumTypes[0]\n}\n\nfunc (x ContentType) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use ContentType.Descriptor instead.\nfunc (ContentType) EnumDescriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\ntype GetRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetRequest) Reset() {\n\t*x = GetRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetRequest) ProtoMessage() {}\n\nfunc (x *GetRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetRequest.ProtoReflect.Descriptor instead.\nfunc (*GetRequest) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetRequest) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\ntype GetResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tContent *Content `protobuf:\"bytes,1,opt,name=content,proto3\" json:\"content,omitempty\"`\n\tCelExpr int64    `protobuf:\"varint,2,opt,name=cel_expr,json=celExpr,proto3\" json:\"cel_expr,omitempty\"`\n}\n\nfunc (x *GetResponse) Reset() {\n\t*x = GetResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetResponse) ProtoMessage() {}\n\nfunc (x *GetResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetResponse.ProtoReflect.Descriptor instead.\nfunc (*GetResponse) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetResponse) GetContent() *Content {\n\tif x != nil {\n\t\treturn x.Content\n\t}\n\treturn nil\n}\n\nfunc (x *GetResponse) GetCelExpr() int64 {\n\tif x != nil {\n\t\treturn x.CelExpr\n\t}\n\treturn 0\n}\n\ntype Content struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tByField          string        `protobuf:\"bytes,1,opt,name=by_field,json=byField,proto3\" json:\"by_field,omitempty\"`\n\tDoubleField      float64       `protobuf:\"fixed64,2,opt,name=double_field,json=doubleField,proto3\" json:\"double_field,omitempty\"`\n\tDoublesField     []float64     `protobuf:\"fixed64,3,rep,packed,name=doubles_field,json=doublesField,proto3\" json:\"doubles_field,omitempty\"`\n\tFloatField       float32       `protobuf:\"fixed32,4,opt,name=float_field,json=floatField,proto3\" json:\"float_field,omitempty\"`\n\tFloatsField      []float32     `protobuf:\"fixed32,5,rep,packed,name=floats_field,json=floatsField,proto3\" json:\"floats_field,omitempty\"`\n\tInt32Field       int32         `protobuf:\"varint,6,opt,name=int32_field,json=int32Field,proto3\" json:\"int32_field,omitempty\"`\n\tInt32SField      []int32       `protobuf:\"varint,7,rep,packed,name=int32s_field,json=int32sField,proto3\" json:\"int32s_field,omitempty\"`\n\tInt64Field       int64         `protobuf:\"varint,8,opt,name=int64_field,json=int64Field,proto3\" json:\"int64_field,omitempty\"`\n\tInt64SField      []int64       `protobuf:\"varint,9,rep,packed,name=int64s_field,json=int64sField,proto3\" json:\"int64s_field,omitempty\"`\n\tUint32Field      uint32        `protobuf:\"varint,10,opt,name=uint32_field,json=uint32Field,proto3\" json:\"uint32_field,omitempty\"`\n\tUint32SField     []uint32      `protobuf:\"varint,11,rep,packed,name=uint32s_field,json=uint32sField,proto3\" json:\"uint32s_field,omitempty\"`\n\tUint64Field      uint64        `protobuf:\"varint,12,opt,name=uint64_field,json=uint64Field,proto3\" json:\"uint64_field,omitempty\"`\n\tUint64SField     []uint64      `protobuf:\"varint,13,rep,packed,name=uint64s_field,json=uint64sField,proto3\" json:\"uint64s_field,omitempty\"`\n\tSint32Field      int32         `protobuf:\"zigzag32,14,opt,name=sint32_field,json=sint32Field,proto3\" json:\"sint32_field,omitempty\"`\n\tSint32SField     []int32       `protobuf:\"zigzag32,15,rep,packed,name=sint32s_field,json=sint32sField,proto3\" json:\"sint32s_field,omitempty\"`\n\tSint64Field      int64         `protobuf:\"zigzag64,16,opt,name=sint64_field,json=sint64Field,proto3\" json:\"sint64_field,omitempty\"`\n\tSint64SField     []int64       `protobuf:\"zigzag64,17,rep,packed,name=sint64s_field,json=sint64sField,proto3\" json:\"sint64s_field,omitempty\"`\n\tFixed32Field     uint32        `protobuf:\"fixed32,18,opt,name=fixed32_field,json=fixed32Field,proto3\" json:\"fixed32_field,omitempty\"`\n\tFixed32SField    []uint32      `protobuf:\"fixed32,19,rep,packed,name=fixed32s_field,json=fixed32sField,proto3\" json:\"fixed32s_field,omitempty\"`\n\tFixed64Field     uint64        `protobuf:\"fixed64,20,opt,name=fixed64_field,json=fixed64Field,proto3\" json:\"fixed64_field,omitempty\"`\n\tFixed64SField    []uint64      `protobuf:\"fixed64,21,rep,packed,name=fixed64s_field,json=fixed64sField,proto3\" json:\"fixed64s_field,omitempty\"`\n\tSfixed32Field    int32         `protobuf:\"fixed32,22,opt,name=sfixed32_field,json=sfixed32Field,proto3\" json:\"sfixed32_field,omitempty\"`\n\tSfixed32SField   []int32       `protobuf:\"fixed32,23,rep,packed,name=sfixed32s_field,json=sfixed32sField,proto3\" json:\"sfixed32s_field,omitempty\"`\n\tSfixed64Field    int64         `protobuf:\"fixed64,24,opt,name=sfixed64_field,json=sfixed64Field,proto3\" json:\"sfixed64_field,omitempty\"`\n\tSfixed64SField   []int64       `protobuf:\"fixed64,25,rep,packed,name=sfixed64s_field,json=sfixed64sField,proto3\" json:\"sfixed64s_field,omitempty\"`\n\tBoolField        bool          `protobuf:\"varint,26,opt,name=bool_field,json=boolField,proto3\" json:\"bool_field,omitempty\"`\n\tBoolsField       []bool        `protobuf:\"varint,27,rep,packed,name=bools_field,json=boolsField,proto3\" json:\"bools_field,omitempty\"`\n\tStringField      string        `protobuf:\"bytes,28,opt,name=string_field,json=stringField,proto3\" json:\"string_field,omitempty\"`\n\tStringsField     []string      `protobuf:\"bytes,29,rep,name=strings_field,json=stringsField,proto3\" json:\"strings_field,omitempty\"`\n\tByteStringField  []byte        `protobuf:\"bytes,30,opt,name=byte_string_field,json=byteStringField,proto3\" json:\"byte_string_field,omitempty\"`\n\tByteStringsField [][]byte      `protobuf:\"bytes,31,rep,name=byte_strings_field,json=byteStringsField,proto3\" json:\"byte_strings_field,omitempty\"`\n\tEnumField        ContentType   `protobuf:\"varint,32,opt,name=enum_field,json=enumField,proto3,enum=org.federation.ContentType\" json:\"enum_field,omitempty\"`\n\tEnumsField       []ContentType `protobuf:\"varint,33,rep,packed,name=enums_field,json=enumsField,proto3,enum=org.federation.ContentType\" json:\"enums_field,omitempty\"`\n\tEnvField         string        `protobuf:\"bytes,34,opt,name=env_field,json=envField,proto3\" json:\"env_field,omitempty\"`\n\tEnvsField        []string      `protobuf:\"bytes,35,rep,name=envs_field,json=envsField,proto3\" json:\"envs_field,omitempty\"`\n\tMessageField     *Content      `protobuf:\"bytes,36,opt,name=message_field,json=messageField,proto3\" json:\"message_field,omitempty\"`\n\tMessagesField    []*Content    `protobuf:\"bytes,37,rep,name=messages_field,json=messagesField,proto3\" json:\"messages_field,omitempty\"`\n}\n\nfunc (x *Content) Reset() {\n\t*x = Content{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Content) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Content) ProtoMessage() {}\n\nfunc (x *Content) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Content.ProtoReflect.Descriptor instead.\nfunc (*Content) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *Content) GetByField() string {\n\tif x != nil {\n\t\treturn x.ByField\n\t}\n\treturn \"\"\n}\n\nfunc (x *Content) GetDoubleField() float64 {\n\tif x != nil {\n\t\treturn x.DoubleField\n\t}\n\treturn 0\n}\n\nfunc (x *Content) GetDoublesField() []float64 {\n\tif x != nil {\n\t\treturn x.DoublesField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetFloatField() float32 {\n\tif x != nil {\n\t\treturn x.FloatField\n\t}\n\treturn 0\n}\n\nfunc (x *Content) GetFloatsField() []float32 {\n\tif x != nil {\n\t\treturn x.FloatsField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetInt32Field() int32 {\n\tif x != nil {\n\t\treturn x.Int32Field\n\t}\n\treturn 0\n}\n\nfunc (x *Content) GetInt32SField() []int32 {\n\tif x != nil {\n\t\treturn x.Int32SField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetInt64Field() int64 {\n\tif x != nil {\n\t\treturn x.Int64Field\n\t}\n\treturn 0\n}\n\nfunc (x *Content) GetInt64SField() []int64 {\n\tif x != nil {\n\t\treturn x.Int64SField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetUint32Field() uint32 {\n\tif x != nil {\n\t\treturn x.Uint32Field\n\t}\n\treturn 0\n}\n\nfunc (x *Content) GetUint32SField() []uint32 {\n\tif x != nil {\n\t\treturn x.Uint32SField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetUint64Field() uint64 {\n\tif x != nil {\n\t\treturn x.Uint64Field\n\t}\n\treturn 0\n}\n\nfunc (x *Content) GetUint64SField() []uint64 {\n\tif x != nil {\n\t\treturn x.Uint64SField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetSint32Field() int32 {\n\tif x != nil {\n\t\treturn x.Sint32Field\n\t}\n\treturn 0\n}\n\nfunc (x *Content) GetSint32SField() []int32 {\n\tif x != nil {\n\t\treturn x.Sint32SField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetSint64Field() int64 {\n\tif x != nil {\n\t\treturn x.Sint64Field\n\t}\n\treturn 0\n}\n\nfunc (x *Content) GetSint64SField() []int64 {\n\tif x != nil {\n\t\treturn x.Sint64SField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetFixed32Field() uint32 {\n\tif x != nil {\n\t\treturn x.Fixed32Field\n\t}\n\treturn 0\n}\n\nfunc (x *Content) GetFixed32SField() []uint32 {\n\tif x != nil {\n\t\treturn x.Fixed32SField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetFixed64Field() uint64 {\n\tif x != nil {\n\t\treturn x.Fixed64Field\n\t}\n\treturn 0\n}\n\nfunc (x *Content) GetFixed64SField() []uint64 {\n\tif x != nil {\n\t\treturn x.Fixed64SField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetSfixed32Field() int32 {\n\tif x != nil {\n\t\treturn x.Sfixed32Field\n\t}\n\treturn 0\n}\n\nfunc (x *Content) GetSfixed32SField() []int32 {\n\tif x != nil {\n\t\treturn x.Sfixed32SField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetSfixed64Field() int64 {\n\tif x != nil {\n\t\treturn x.Sfixed64Field\n\t}\n\treturn 0\n}\n\nfunc (x *Content) GetSfixed64SField() []int64 {\n\tif x != nil {\n\t\treturn x.Sfixed64SField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetBoolField() bool {\n\tif x != nil {\n\t\treturn x.BoolField\n\t}\n\treturn false\n}\n\nfunc (x *Content) GetBoolsField() []bool {\n\tif x != nil {\n\t\treturn x.BoolsField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetStringField() string {\n\tif x != nil {\n\t\treturn x.StringField\n\t}\n\treturn \"\"\n}\n\nfunc (x *Content) GetStringsField() []string {\n\tif x != nil {\n\t\treturn x.StringsField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetByteStringField() []byte {\n\tif x != nil {\n\t\treturn x.ByteStringField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetByteStringsField() [][]byte {\n\tif x != nil {\n\t\treturn x.ByteStringsField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetEnumField() ContentType {\n\tif x != nil {\n\t\treturn x.EnumField\n\t}\n\treturn ContentType_CONTENT_TYPE_1\n}\n\nfunc (x *Content) GetEnumsField() []ContentType {\n\tif x != nil {\n\t\treturn x.EnumsField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetEnvField() string {\n\tif x != nil {\n\t\treturn x.EnvField\n\t}\n\treturn \"\"\n}\n\nfunc (x *Content) GetEnvsField() []string {\n\tif x != nil {\n\t\treturn x.EnvsField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetMessageField() *Content {\n\tif x != nil {\n\t\treturn x.MessageField\n\t}\n\treturn nil\n}\n\nfunc (x *Content) GetMessagesField() []*Content {\n\tif x != nil {\n\t\treturn x.MessagesField\n\t}\n\treturn nil\n}\n\nvar File_federation_federation_proto protoreflect.FileDescriptor\n\nvar file_federation_federation_proto_rawDesc = []byte{\n\t0x0a, 0x1b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x6f,\n\t0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x20, 0x67,\n\t0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22,\n\t0x1c, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a,\n\t0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x99, 0x0a,\n\t0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a,\n\t0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17,\n\t0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x42, 0x0c, 0x9a, 0x4a, 0x09, 0x12, 0x07, 0x63, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x4a,\n\t0x0a, 0x08, 0x63, 0x65, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03,\n\t0x42, 0x2f, 0x9a, 0x4a, 0x2c, 0x12, 0x2a, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69,\n\t0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x2b, 0x20, 0x63, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c,\n\t0x64, 0x52, 0x07, 0x63, 0x65, 0x6c, 0x45, 0x78, 0x70, 0x72, 0x3a, 0xfc, 0x08, 0x9a, 0x4a, 0xf8,\n\t0x08, 0x0a, 0xdd, 0x08, 0x0a, 0x03, 0x72, 0x65, 0x73, 0x72, 0xd5, 0x08, 0x0a, 0x21, 0x63, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72,\n\t0x76, 0x69, 0x63, 0x65, 0x2f, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12,\n\t0x10, 0x0a, 0x08, 0x62, 0x79, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x04, 0x24, 0x2e, 0x69,\n\t0x64, 0x12, 0x14, 0x0a, 0x0c, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x65, 0x6c,\n\t0x64, 0x12, 0x04, 0x31, 0x2e, 0x32, 0x33, 0x12, 0x1d, 0x0a, 0x0d, 0x64, 0x6f, 0x75, 0x62, 0x6c,\n\t0x65, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x0c, 0x5b, 0x34, 0x2e, 0x35, 0x36, 0x2c,\n\t0x20, 0x37, 0x2e, 0x38, 0x39, 0x5d, 0x12, 0x13, 0x0a, 0x0b, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5f,\n\t0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x04, 0x34, 0x2e, 0x35, 0x36, 0x12, 0x1c, 0x0a, 0x0c, 0x66,\n\t0x6c, 0x6f, 0x61, 0x74, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x0c, 0x5b, 0x37, 0x2e,\n\t0x38, 0x39, 0x2c, 0x20, 0x31, 0x2e, 0x32, 0x33, 0x5d, 0x12, 0x11, 0x0a, 0x0b, 0x69, 0x6e, 0x74,\n\t0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x02, 0x2d, 0x31, 0x12, 0x18, 0x0a, 0x0c,\n\t0x69, 0x6e, 0x74, 0x33, 0x32, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x08, 0x5b, 0x2d,\n\t0x32, 0x2c, 0x20, 0x2d, 0x33, 0x5d, 0x12, 0x11, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f,\n\t0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x02, 0x2d, 0x34, 0x12, 0x18, 0x0a, 0x0c, 0x69, 0x6e, 0x74,\n\t0x36, 0x34, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x08, 0x5b, 0x2d, 0x35, 0x2c, 0x20,\n\t0x2d, 0x36, 0x5d, 0x12, 0x12, 0x0a, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69,\n\t0x65, 0x6c, 0x64, 0x12, 0x02, 0x31, 0x75, 0x12, 0x19, 0x0a, 0x0d, 0x75, 0x69, 0x6e, 0x74, 0x33,\n\t0x32, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x08, 0x5b, 0x32, 0x75, 0x2c, 0x20, 0x33,\n\t0x75, 0x5d, 0x12, 0x12, 0x0a, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65,\n\t0x6c, 0x64, 0x12, 0x02, 0x34, 0x75, 0x12, 0x19, 0x0a, 0x0d, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34,\n\t0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x08, 0x5b, 0x35, 0x75, 0x2c, 0x20, 0x36, 0x75,\n\t0x5d, 0x12, 0x12, 0x0a, 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c,\n\t0x64, 0x12, 0x02, 0x2d, 0x37, 0x12, 0x19, 0x0a, 0x0d, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x73,\n\t0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x08, 0x5b, 0x2d, 0x38, 0x2c, 0x20, 0x2d, 0x39, 0x5d,\n\t0x12, 0x13, 0x0a, 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64,\n\t0x12, 0x03, 0x2d, 0x31, 0x30, 0x12, 0x1b, 0x0a, 0x0d, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x73,\n\t0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x0a, 0x5b, 0x2d, 0x31, 0x31, 0x2c, 0x20, 0x2d, 0x31,\n\t0x32, 0x5d, 0x12, 0x14, 0x0a, 0x0d, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x66, 0x69,\n\t0x65, 0x6c, 0x64, 0x12, 0x03, 0x31, 0x30, 0x75, 0x12, 0x1c, 0x0a, 0x0e, 0x66, 0x69, 0x78, 0x65,\n\t0x64, 0x33, 0x32, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x0a, 0x5b, 0x31, 0x31, 0x75,\n\t0x2c, 0x20, 0x31, 0x32, 0x75, 0x5d, 0x12, 0x14, 0x0a, 0x0d, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36,\n\t0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x03, 0x31, 0x33, 0x75, 0x12, 0x1c, 0x0a, 0x0e,\n\t0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x0a,\n\t0x5b, 0x31, 0x34, 0x75, 0x2c, 0x20, 0x31, 0x35, 0x75, 0x5d, 0x12, 0x15, 0x0a, 0x0e, 0x73, 0x66,\n\t0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x03, 0x2d, 0x31,\n\t0x34, 0x12, 0x1d, 0x0a, 0x0f, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x73, 0x5f, 0x66,\n\t0x69, 0x65, 0x6c, 0x64, 0x12, 0x0a, 0x5b, 0x2d, 0x31, 0x35, 0x2c, 0x20, 0x2d, 0x31, 0x36, 0x5d,\n\t0x12, 0x15, 0x0a, 0x0e, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65,\n\t0x6c, 0x64, 0x12, 0x03, 0x2d, 0x31, 0x37, 0x12, 0x1d, 0x0a, 0x0f, 0x73, 0x66, 0x69, 0x78, 0x65,\n\t0x64, 0x36, 0x34, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x0a, 0x5b, 0x2d, 0x31, 0x38,\n\t0x2c, 0x20, 0x2d, 0x31, 0x39, 0x5d, 0x12, 0x12, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x66,\n\t0x69, 0x65, 0x6c, 0x64, 0x12, 0x04, 0x74, 0x72, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x0b, 0x62, 0x6f,\n\t0x6f, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x0d, 0x5b, 0x74, 0x72, 0x75, 0x65,\n\t0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x5d, 0x12, 0x15, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69,\n\t0x6e, 0x67, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x05, 0x27, 0x66, 0x6f, 0x6f, 0x27, 0x12,\n\t0x23, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64,\n\t0x12, 0x12, 0x5b, 0x27, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x27, 0x2c, 0x20, 0x27, 0x77, 0x6f, 0x72,\n\t0x6c, 0x64, 0x27, 0x5d, 0x12, 0x1b, 0x0a, 0x11, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x72,\n\t0x69, 0x6e, 0x67, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x06, 0x62, 0x27, 0x66, 0x6f, 0x6f,\n\t0x27, 0x12, 0x26, 0x0a, 0x12, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,\n\t0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x10, 0x5b, 0x62, 0x27, 0x66, 0x6f, 0x6f, 0x27,\n\t0x2c, 0x20, 0x62, 0x27, 0x62, 0x61, 0x72, 0x27, 0x5d, 0x12, 0x30, 0x0a, 0x0a, 0x65, 0x6e, 0x75,\n\t0x6d, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,\n\t0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x43, 0x4f, 0x4e,\n\t0x54, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x31, 0x12, 0x57, 0x0a, 0x0b, 0x65,\n\t0x6e, 0x75, 0x6d, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x48, 0x5b, 0x63, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65,\n\t0x2e, 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x32, 0x2c,\n\t0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,\n\t0x54, 0x79, 0x70, 0x65, 0x2e, 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50,\n\t0x45, 0x5f, 0x33, 0x5d, 0x12, 0x51, 0x0a, 0x0d, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f,\n\t0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x40, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x43,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x7b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x66, 0x69,\n\t0x65, 0x6c, 0x64, 0x3a, 0x20, 0x31, 0x2e, 0x32, 0x33, 0x2c, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,\n\t0x65, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x3a, 0x20, 0x5b, 0x34, 0x2e, 0x35, 0x36, 0x2c,\n\t0x20, 0x37, 0x2e, 0x38, 0x39, 0x5d, 0x7d, 0x12, 0x38, 0x0a, 0x0e, 0x6d, 0x65, 0x73, 0x73, 0x61,\n\t0x67, 0x65, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x26, 0x5b, 0x63, 0x6f, 0x6e, 0x74,\n\t0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x7b, 0x7d, 0x2c, 0x20, 0x63,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x7b, 0x7d,\n\t0x5d, 0x0a, 0x16, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5a, 0x0b, 0x72, 0x65,\n\t0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0xbc, 0x0b, 0x0a, 0x07, 0x43, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x79, 0x5f, 0x66, 0x69, 0x65, 0x6c,\n\t0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x79, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x12, 0x21, 0x0a, 0x0c, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x46, 0x69,\n\t0x65, 0x6c, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x73, 0x5f, 0x66,\n\t0x69, 0x65, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x01, 0x52, 0x0c, 0x64, 0x6f, 0x75, 0x62,\n\t0x6c, 0x65, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x6c, 0x6f, 0x61,\n\t0x74, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a, 0x66,\n\t0x6c, 0x6f, 0x61, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x6c, 0x6f,\n\t0x61, 0x74, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x05, 0x20, 0x03, 0x28, 0x02, 0x52,\n\t0x0b, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b,\n\t0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28,\n\t0x05, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a,\n\t0x0c, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x07, 0x20,\n\t0x03, 0x28, 0x05, 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18,\n\t0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c,\n\t0x64, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c,\n\t0x64, 0x18, 0x09, 0x20, 0x03, 0x28, 0x03, 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x73, 0x46,\n\t0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66,\n\t0x69, 0x65, 0x6c, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x69, 0x6e, 0x74,\n\t0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x75, 0x69, 0x6e, 0x74, 0x33,\n\t0x32, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0c,\n\t0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c,\n\t0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0c, 0x20, 0x01,\n\t0x28, 0x04, 0x52, 0x0b, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12,\n\t0x23, 0x0a, 0x0d, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64,\n\t0x18, 0x0d, 0x20, 0x03, 0x28, 0x04, 0x52, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x73, 0x46,\n\t0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66,\n\t0x69, 0x65, 0x6c, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x11, 0x52, 0x0b, 0x73, 0x69, 0x6e, 0x74,\n\t0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x69, 0x6e, 0x74, 0x33,\n\t0x32, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x11, 0x52, 0x0c,\n\t0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c,\n\t0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x10, 0x20, 0x01,\n\t0x28, 0x12, 0x52, 0x0b, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12,\n\t0x23, 0x0a, 0x0d, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64,\n\t0x18, 0x11, 0x20, 0x03, 0x28, 0x12, 0x52, 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x73, 0x46,\n\t0x69, 0x65, 0x6c, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f,\n\t0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x07, 0x52, 0x0c, 0x66, 0x69, 0x78,\n\t0x65, 0x64, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x66, 0x69, 0x78,\n\t0x65, 0x64, 0x33, 0x32, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x13, 0x20, 0x03, 0x28,\n\t0x07, 0x52, 0x0d, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x12, 0x23, 0x0a, 0x0d, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c,\n\t0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x06, 0x52, 0x0c, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34,\n\t0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34,\n\t0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x15, 0x20, 0x03, 0x28, 0x06, 0x52, 0x0d, 0x66,\n\t0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x25, 0x0a, 0x0e,\n\t0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x16,\n\t0x20, 0x01, 0x28, 0x0f, 0x52, 0x0d, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x46, 0x69,\n\t0x65, 0x6c, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x73,\n\t0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x17, 0x20, 0x03, 0x28, 0x0f, 0x52, 0x0e, 0x73, 0x66,\n\t0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x25, 0x0a, 0x0e,\n\t0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x18,\n\t0x20, 0x01, 0x28, 0x10, 0x52, 0x0d, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x46, 0x69,\n\t0x65, 0x6c, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x73,\n\t0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x19, 0x20, 0x03, 0x28, 0x10, 0x52, 0x0e, 0x73, 0x66,\n\t0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x0a, 0x0a,\n\t0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x08,\n\t0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x62,\n\t0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x1b, 0x20, 0x03, 0x28, 0x08,\n\t0x52, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c,\n\t0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x1c, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12,\n\t0x23, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64,\n\t0x18, 0x1d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x46,\n\t0x69, 0x65, 0x6c, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x72,\n\t0x69, 0x6e, 0x67, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0c, 0x52,\n\t0x0f, 0x62, 0x79, 0x74, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x12, 0x2c, 0x0a, 0x12, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73,\n\t0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x1f, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x10, 0x62, 0x79,\n\t0x74, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x3a,\n\t0x0a, 0x0a, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x20, 0x20, 0x01,\n\t0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52,\n\t0x09, 0x65, 0x6e, 0x75, 0x6d, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e,\n\t0x75, 0x6d, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x21, 0x20, 0x03, 0x28, 0x0e, 0x32,\n\t0x1b, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x65, 0x6e,\n\t0x75, 0x6d, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x6e, 0x76, 0x5f,\n\t0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x22, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x76,\n\t0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6e, 0x76, 0x73, 0x5f, 0x66, 0x69,\n\t0x65, 0x6c, 0x64, 0x18, 0x23, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x76, 0x73, 0x46,\n\t0x69, 0x65, 0x6c, 0x64, 0x12, 0x3c, 0x0a, 0x0d, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f,\n\t0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x24, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6f, 0x72,\n\t0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x74, 0x52, 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x46, 0x69, 0x65,\n\t0x6c, 0x64, 0x12, 0x3e, 0x0a, 0x0e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x5f, 0x66,\n\t0x69, 0x65, 0x6c, 0x64, 0x18, 0x25, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6f, 0x72, 0x67,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74,\n\t0x65, 0x6e, 0x74, 0x52, 0x0d, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x46, 0x69, 0x65,\n\t0x6c, 0x64, 0x3a, 0x14, 0x9a, 0x4a, 0x11, 0x1a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,\n\t0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2a, 0x63, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74,\n\t0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x4f, 0x4e, 0x54, 0x45,\n\t0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x31, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x43,\n\t0x4f, 0x4e, 0x54, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x32, 0x10, 0x01, 0x12,\n\t0x12, 0x0a, 0x0e, 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f,\n\t0x33, 0x10, 0x02, 0x1a, 0x18, 0x9a, 0x4a, 0x15, 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x32, 0x5a, 0x0a,\n\t0x11, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69,\n\t0x63, 0x65, 0x12, 0x40, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x1a, 0x2e, 0x6f, 0x72, 0x67, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65,\n\t0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,\n\t0x73, 0x65, 0x22, 0x00, 0x1a, 0x03, 0x9a, 0x4a, 0x00, 0x42, 0xb7, 0x01, 0x9a, 0x4a, 0x17, 0x12,\n\t0x15, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0f, 0x46, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x1d, 0x65,\n\t0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x3b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xa2, 0x02, 0x03, 0x4f,\n\t0x46, 0x58, 0xaa, 0x02, 0x0e, 0x4f, 0x72, 0x67, 0x2e, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0xca, 0x02, 0x0e, 0x4f, 0x72, 0x67, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0xe2, 0x02, 0x1a, 0x4f, 0x72, 0x67, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,\n\t0x61, 0xea, 0x02, 0x0f, 0x4f, 0x72, 0x67, 0x3a, 0x3a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_federation_federation_proto_rawDescOnce sync.Once\n\tfile_federation_federation_proto_rawDescData = file_federation_federation_proto_rawDesc\n)\n\nfunc file_federation_federation_proto_rawDescGZIP() []byte {\n\tfile_federation_federation_proto_rawDescOnce.Do(func() {\n\t\tfile_federation_federation_proto_rawDescData = protoimpl.X.CompressGZIP(file_federation_federation_proto_rawDescData)\n\t})\n\treturn file_federation_federation_proto_rawDescData\n}\n\nvar file_federation_federation_proto_enumTypes = make([]protoimpl.EnumInfo, 1)\nvar file_federation_federation_proto_msgTypes = make([]protoimpl.MessageInfo, 3)\nvar file_federation_federation_proto_goTypes = []interface{}{\n\t(ContentType)(0),    // 0: org.federation.ContentType\n\t(*GetRequest)(nil),  // 1: org.federation.GetRequest\n\t(*GetResponse)(nil), // 2: org.federation.GetResponse\n\t(*Content)(nil),     // 3: org.federation.Content\n}\nvar file_federation_federation_proto_depIdxs = []int32{\n\t3, // 0: org.federation.GetResponse.content:type_name -> org.federation.Content\n\t0, // 1: org.federation.Content.enum_field:type_name -> org.federation.ContentType\n\t0, // 2: org.federation.Content.enums_field:type_name -> org.federation.ContentType\n\t3, // 3: org.federation.Content.message_field:type_name -> org.federation.Content\n\t3, // 4: org.federation.Content.messages_field:type_name -> org.federation.Content\n\t1, // 5: org.federation.FederationService.Get:input_type -> org.federation.GetRequest\n\t2, // 6: org.federation.FederationService.Get:output_type -> org.federation.GetResponse\n\t6, // [6:7] is the sub-list for method output_type\n\t5, // [5:6] is the sub-list for method input_type\n\t5, // [5:5] is the sub-list for extension type_name\n\t5, // [5:5] is the sub-list for extension extendee\n\t0, // [0:5] is the sub-list for field type_name\n}\n\nfunc init() { file_federation_federation_proto_init() }\nfunc file_federation_federation_proto_init() {\n\tif File_federation_federation_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_federation_federation_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Content); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_federation_federation_proto_rawDesc,\n\t\t\tNumEnums:      1,\n\t\t\tNumMessages:   3,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_federation_federation_proto_goTypes,\n\t\tDependencyIndexes: file_federation_federation_proto_depIdxs,\n\t\tEnumInfos:         file_federation_federation_proto_enumTypes,\n\t\tMessageInfos:      file_federation_federation_proto_msgTypes,\n\t}.Build()\n\tFile_federation_federation_proto = out.File\n\tfile_federation_federation_proto_rawDesc = nil\n\tfile_federation_federation_proto_goTypes = nil\n\tfile_federation_federation_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/08_literal/federation/federation_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tFederationService_Get_FullMethodName = \"/org.federation.FederationService/Get\"\n)\n\n// FederationServiceClient is the client API for FederationService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype FederationServiceClient interface {\n\tGet(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error)\n}\n\ntype federationServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewFederationServiceClient(cc grpc.ClientConnInterface) FederationServiceClient {\n\treturn &federationServiceClient{cc}\n}\n\nfunc (c *federationServiceClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) {\n\tout := new(GetResponse)\n\terr := c.cc.Invoke(ctx, FederationService_Get_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// FederationServiceServer is the server API for FederationService service.\n// All implementations must embed UnimplementedFederationServiceServer\n// for forward compatibility\ntype FederationServiceServer interface {\n\tGet(context.Context, *GetRequest) (*GetResponse, error)\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\n// UnimplementedFederationServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedFederationServiceServer struct {\n}\n\nfunc (UnimplementedFederationServiceServer) Get(context.Context, *GetRequest) (*GetResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method Get not implemented\")\n}\nfunc (UnimplementedFederationServiceServer) mustEmbedUnimplementedFederationServiceServer() {}\n\n// UnsafeFederationServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to FederationServiceServer will\n// result in compilation errors.\ntype UnsafeFederationServiceServer interface {\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\nfunc RegisterFederationServiceServer(s grpc.ServiceRegistrar, srv FederationServiceServer) {\n\ts.RegisterService(&FederationService_ServiceDesc, srv)\n}\n\nfunc _FederationService_Get_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(FederationServiceServer).Get(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: FederationService_Get_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(FederationServiceServer).Get(ctx, req.(*GetRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// FederationService_ServiceDesc is the grpc.ServiceDesc for FederationService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar FederationService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"org.federation.FederationService\",\n\tHandlerType: (*FederationServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"Get\",\n\t\t\tHandler:    _FederationService_Get_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"federation/federation.proto\",\n}\n"
  },
  {
    "path": "_examples/08_literal/federation/federation_grpc_federation.pb.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: federation/federation.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n\n\tcontent \"example/content\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Org_Federation_GetResponseVariable represents variable definitions in \"org.federation.GetResponse\".\ntype FederationService_Org_Federation_GetResponseVariable struct {\n\tContent *content.Content\n\tRes     *content.GetContentResponse\n}\n\n// Org_Federation_GetResponseArgument is argument for \"org.federation.GetResponse\" message.\ntype FederationService_Org_Federation_GetResponseArgument struct {\n\tId string\n\tFederationService_Org_Federation_GetResponseVariable\n}\n\n// FederationServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationServiceConfig struct {\n\t// Client provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\n\t// If this interface is not provided, an error is returned during initialization.\n\tClient FederationServiceClientFactory // required\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationServiceClientFactory interface {\n\t// Content_ContentServiceClient create a gRPC Client to be used to call methods in content.ContentService.\n\tContent_ContentServiceClient(FederationServiceClientConfig) (content.ContentServiceClient, error)\n}\n\n// FederationServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationServiceDependentClientSet struct {\n\tContent_ContentServiceClient content.ContentServiceClient\n}\n\n// FederationServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationServiceResolver interface {\n}\n\n// FederationServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// FederationServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationServiceUnimplementedResolver struct{}\n\nconst (\n\tFederationService_DependentMethod_Content_ContentService_GetContent = \"/content.ContentService/GetContent\"\n)\n\n// FederationService represents Federation Service.\ntype FederationService struct {\n\tUnimplementedFederationServiceServer\n\tcfg             FederationServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationServiceDependentClientSet\n}\n\n// NewFederationService creates FederationService instance by FederationServiceConfig.\nfunc NewFederationService(cfg FederationServiceConfig) (*FederationService, error) {\n\tif cfg.Client == nil {\n\t\treturn nil, grpcfed.ErrClientConfig\n\t}\n\tContent_ContentServiceClient, err := cfg.Client.Content_ContentServiceClient(FederationServiceClientConfig{\n\t\tService: \"content.ContentService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"org.federation.FederationService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.org.federation.GetResponseArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"org.federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.GRPCErrorAccessorOptions(celTypeHelper, \"content.GetContentResponse\")...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"content.ContentType\", content.ContentType_value, content.ContentType_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.federation.ContentType\", ContentType_value, ContentType_name)...)\n\tsvc := &FederationService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tclient: &FederationServiceDependentClientSet{\n\t\t\tContent_ContentServiceClient: Content_ContentServiceClient,\n\t\t},\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationService(ctx context.Context, svc *FederationService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n// Get implements \"org.federation.FederationService/Get\" method.\nfunc (s *FederationService) Get(ctx context.Context, req *GetRequest) (res *GetResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.FederationService/Get\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Org_Federation_GetResponse(ctx, &FederationService_Org_Federation_GetResponseArgument{\n\t\tId: req.GetId(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Org_Federation_GetResponse resolve \"org.federation.GetResponse\" message.\nfunc (s *FederationService) resolve_Org_Federation_GetResponse(ctx context.Context, req *FederationService_Org_Federation_GetResponseArgument) (*GetResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.GetResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.GetResponse\", slog.Any(\"message_args\", s.logvalue_Org_Federation_GetResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tContent *content.Content\n\t\t\tRes     *content.GetContentResponse\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.GetResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"content.ContentService/GetContent\"\n\t\t    request: [\n\t\t      { field: \"by_field\", by: \"$.id\" },\n\t\t      { field: \"double_field\", by: \"1.23\" },\n\t\t      { field: \"doubles_field\", by: \"[4.56, 7.89]\" },\n\t\t      { field: \"float_field\", by: \"4.56\" },\n\t\t      { field: \"floats_field\", by: \"[7.89, 1.23]\" },\n\t\t      { field: \"int32_field\", by: \"-1\" },\n\t\t      { field: \"int32s_field\", by: \"[-2, -3]\" },\n\t\t      { field: \"int64_field\", by: \"-4\" },\n\t\t      { field: \"int64s_field\", by: \"[-5, -6]\" },\n\t\t      { field: \"uint32_field\", by: \"1u\" },\n\t\t      { field: \"uint32s_field\", by: \"[2u, 3u]\" },\n\t\t      { field: \"uint64_field\", by: \"4u\" },\n\t\t      { field: \"uint64s_field\", by: \"[5u, 6u]\" },\n\t\t      { field: \"sint32_field\", by: \"-7\" },\n\t\t      { field: \"sint32s_field\", by: \"[-8, -9]\" },\n\t\t      { field: \"sint64_field\", by: \"-10\" },\n\t\t      { field: \"sint64s_field\", by: \"[-11, -12]\" },\n\t\t      { field: \"fixed32_field\", by: \"10u\" },\n\t\t      { field: \"fixed32s_field\", by: \"[11u, 12u]\" },\n\t\t      { field: \"fixed64_field\", by: \"13u\" },\n\t\t      { field: \"fixed64s_field\", by: \"[14u, 15u]\" },\n\t\t      { field: \"sfixed32_field\", by: \"-14\" },\n\t\t      { field: \"sfixed32s_field\", by: \"[-15, -16]\" },\n\t\t      { field: \"sfixed64_field\", by: \"-17\" },\n\t\t      { field: \"sfixed64s_field\", by: \"[-18, -19]\" },\n\t\t      { field: \"bool_field\", by: \"true\" },\n\t\t      { field: \"bools_field\", by: \"[true, false]\" },\n\t\t      { field: \"string_field\", by: \"'foo'\" },\n\t\t      { field: \"strings_field\", by: \"['hello', 'world']\" },\n\t\t      { field: \"byte_string_field\", by: \"b'foo'\" },\n\t\t      { field: \"byte_strings_field\", by: \"[b'foo', b'bar']\" },\n\t\t      { field: \"enum_field\", by: \"content.ContentType.CONTENT_TYPE_1\" },\n\t\t      { field: \"enums_field\", by: \"[content.ContentType.CONTENT_TYPE_2, content.ContentType.CONTENT_TYPE_3]\" },\n\t\t      { field: \"message_field\", by: \"content.Content{double_field: 1.23, doubles_field: [4.56, 7.89]}\" },\n\t\t      { field: \"messages_field\", by: \"[content.Content{}, content.Content{}]\" }\n\t\t    ]\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*content.GetContentResponse, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"content.GetContentResponse\"),\n\t\t\tSetter: func(value *localValueType, v *content.GetContentResponse) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &content.GetContentRequest{}\n\t\t\t\t// { field: \"by_field\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 1,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.ByField = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"double_field\", by: \"1.23\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[float64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `1.23`,\n\t\t\t\t\tCacheIndex: 2,\n\t\t\t\t\tSetter: func(v float64) error {\n\t\t\t\t\t\targs.DoubleField = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"doubles_field\", by: \"[4.56, 7.89]\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]float64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `[4.56, 7.89]`,\n\t\t\t\t\tCacheIndex: 3,\n\t\t\t\t\tSetter: func(v []float64) error {\n\t\t\t\t\t\targs.DoublesField = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"float_field\", by: \"4.56\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[float32]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `4.56`,\n\t\t\t\t\tCacheIndex: 4,\n\t\t\t\t\tSetter: func(v float32) error {\n\t\t\t\t\t\targs.FloatField = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"floats_field\", by: \"[7.89, 1.23]\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]float32]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `[7.89, 1.23]`,\n\t\t\t\t\tCacheIndex: 5,\n\t\t\t\t\tSetter: func(v []float32) error {\n\t\t\t\t\t\targs.FloatsField = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"int32_field\", by: \"-1\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[int32]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `-1`,\n\t\t\t\t\tCacheIndex: 6,\n\t\t\t\t\tSetter: func(v int32) error {\n\t\t\t\t\t\targs.Int32Field = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"int32s_field\", by: \"[-2, -3]\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]int32]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `[-2, -3]`,\n\t\t\t\t\tCacheIndex: 7,\n\t\t\t\t\tSetter: func(v []int32) error {\n\t\t\t\t\t\targs.Int32SField = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"int64_field\", by: \"-4\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `-4`,\n\t\t\t\t\tCacheIndex: 8,\n\t\t\t\t\tSetter: func(v int64) error {\n\t\t\t\t\t\targs.Int64Field = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"int64s_field\", by: \"[-5, -6]\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `[-5, -6]`,\n\t\t\t\t\tCacheIndex: 9,\n\t\t\t\t\tSetter: func(v []int64) error {\n\t\t\t\t\t\targs.Int64SField = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"uint32_field\", by: \"1u\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[uint32]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `1u`,\n\t\t\t\t\tCacheIndex: 10,\n\t\t\t\t\tSetter: func(v uint32) error {\n\t\t\t\t\t\targs.Uint32Field = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"uint32s_field\", by: \"[2u, 3u]\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]uint32]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `[2u, 3u]`,\n\t\t\t\t\tCacheIndex: 11,\n\t\t\t\t\tSetter: func(v []uint32) error {\n\t\t\t\t\t\targs.Uint32SField = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"uint64_field\", by: \"4u\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[uint64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `4u`,\n\t\t\t\t\tCacheIndex: 12,\n\t\t\t\t\tSetter: func(v uint64) error {\n\t\t\t\t\t\targs.Uint64Field = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"uint64s_field\", by: \"[5u, 6u]\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]uint64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `[5u, 6u]`,\n\t\t\t\t\tCacheIndex: 13,\n\t\t\t\t\tSetter: func(v []uint64) error {\n\t\t\t\t\t\targs.Uint64SField = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"sint32_field\", by: \"-7\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[int32]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `-7`,\n\t\t\t\t\tCacheIndex: 14,\n\t\t\t\t\tSetter: func(v int32) error {\n\t\t\t\t\t\targs.Sint32Field = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"sint32s_field\", by: \"[-8, -9]\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]int32]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `[-8, -9]`,\n\t\t\t\t\tCacheIndex: 15,\n\t\t\t\t\tSetter: func(v []int32) error {\n\t\t\t\t\t\targs.Sint32SField = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"sint64_field\", by: \"-10\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `-10`,\n\t\t\t\t\tCacheIndex: 16,\n\t\t\t\t\tSetter: func(v int64) error {\n\t\t\t\t\t\targs.Sint64Field = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"sint64s_field\", by: \"[-11, -12]\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `[-11, -12]`,\n\t\t\t\t\tCacheIndex: 17,\n\t\t\t\t\tSetter: func(v []int64) error {\n\t\t\t\t\t\targs.Sint64SField = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"fixed32_field\", by: \"10u\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[uint32]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `10u`,\n\t\t\t\t\tCacheIndex: 18,\n\t\t\t\t\tSetter: func(v uint32) error {\n\t\t\t\t\t\targs.Fixed32Field = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"fixed32s_field\", by: \"[11u, 12u]\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]uint32]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `[11u, 12u]`,\n\t\t\t\t\tCacheIndex: 19,\n\t\t\t\t\tSetter: func(v []uint32) error {\n\t\t\t\t\t\targs.Fixed32SField = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"fixed64_field\", by: \"13u\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[uint64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `13u`,\n\t\t\t\t\tCacheIndex: 20,\n\t\t\t\t\tSetter: func(v uint64) error {\n\t\t\t\t\t\targs.Fixed64Field = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"fixed64s_field\", by: \"[14u, 15u]\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]uint64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `[14u, 15u]`,\n\t\t\t\t\tCacheIndex: 21,\n\t\t\t\t\tSetter: func(v []uint64) error {\n\t\t\t\t\t\targs.Fixed64SField = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"sfixed32_field\", by: \"-14\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[int32]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `-14`,\n\t\t\t\t\tCacheIndex: 22,\n\t\t\t\t\tSetter: func(v int32) error {\n\t\t\t\t\t\targs.Sfixed32Field = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"sfixed32s_field\", by: \"[-15, -16]\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]int32]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `[-15, -16]`,\n\t\t\t\t\tCacheIndex: 23,\n\t\t\t\t\tSetter: func(v []int32) error {\n\t\t\t\t\t\targs.Sfixed32SField = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"sfixed64_field\", by: \"-17\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `-17`,\n\t\t\t\t\tCacheIndex: 24,\n\t\t\t\t\tSetter: func(v int64) error {\n\t\t\t\t\t\targs.Sfixed64Field = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"sfixed64s_field\", by: \"[-18, -19]\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `[-18, -19]`,\n\t\t\t\t\tCacheIndex: 25,\n\t\t\t\t\tSetter: func(v []int64) error {\n\t\t\t\t\t\targs.Sfixed64SField = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"bool_field\", by: \"true\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[bool]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `true`,\n\t\t\t\t\tCacheIndex: 26,\n\t\t\t\t\tSetter: func(v bool) error {\n\t\t\t\t\t\targs.BoolField = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"bools_field\", by: \"[true, false]\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]bool]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `[true, false]`,\n\t\t\t\t\tCacheIndex: 27,\n\t\t\t\t\tSetter: func(v []bool) error {\n\t\t\t\t\t\targs.BoolsField = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"string_field\", by: \"'foo'\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `'foo'`,\n\t\t\t\t\tCacheIndex: 28,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.StringField = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"strings_field\", by: \"['hello', 'world']\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `['hello', 'world']`,\n\t\t\t\t\tCacheIndex: 29,\n\t\t\t\t\tSetter: func(v []string) error {\n\t\t\t\t\t\targs.StringsField = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"byte_string_field\", by: \"b'foo'\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]byte]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `b'foo'`,\n\t\t\t\t\tCacheIndex: 30,\n\t\t\t\t\tSetter: func(v []byte) error {\n\t\t\t\t\t\targs.ByteStringField = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"byte_strings_field\", by: \"[b'foo', b'bar']\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[][]byte]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `[b'foo', b'bar']`,\n\t\t\t\t\tCacheIndex: 31,\n\t\t\t\t\tSetter: func(v [][]byte) error {\n\t\t\t\t\t\targs.ByteStringsField = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"enum_field\", by: \"content.ContentType.CONTENT_TYPE_1\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[content.ContentType]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `content.ContentType.CONTENT_TYPE_1`,\n\t\t\t\t\tCacheIndex: 32,\n\t\t\t\t\tSetter: func(v content.ContentType) error {\n\t\t\t\t\t\targs.EnumField = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"enums_field\", by: \"[content.ContentType.CONTENT_TYPE_2, content.ContentType.CONTENT_TYPE_3]\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]content.ContentType]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `[content.ContentType.CONTENT_TYPE_2, content.ContentType.CONTENT_TYPE_3]`,\n\t\t\t\t\tCacheIndex: 33,\n\t\t\t\t\tSetter: func(v []content.ContentType) error {\n\t\t\t\t\t\targs.EnumsField = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"message_field\", by: \"content.Content{double_field: 1.23, doubles_field: [4.56, 7.89]}\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*content.Content]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `content.Content{double_field: 1.23, doubles_field: [4.56, 7.89]}`,\n\t\t\t\t\tCacheIndex: 34,\n\t\t\t\t\tSetter: func(v *content.Content) error {\n\t\t\t\t\t\targs.MessageField = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"messages_field\", by: \"[content.Content{}, content.Content{}]\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]*content.Content]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `[content.Content{}, content.Content{}]`,\n\t\t\t\t\tCacheIndex: 35,\n\t\t\t\t\tSetter: func(v []*content.Content) error {\n\t\t\t\t\t\targs.MessagesField = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call content.ContentService/GetContent\", slog.Any(\"content.GetContentRequest\", s.logvalue_Content_GetContentRequest(args)))\n\t\t\t\tret, err := s.client.Content_ContentServiceClient.GetContent(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Content_ContentService_GetContent, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"content\"\n\t\t  by: \"res.content\"\n\t\t}\n\t*/\n\tdef_content := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*content.Content, *localValueType]{\n\t\t\tName: `content`,\n\t\t\tType: grpcfed.CELObjectType(\"content.Content\"),\n\t\t\tSetter: func(value *localValueType, v *content.Content) error {\n\t\t\t\tvalue.vars.Content = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `res.content`,\n\t\t\tByCacheIndex: 36,\n\t\t})\n\t}\n\n\tif err := def_res(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\tif err := def_content(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_GetResponseVariable.Content = value.vars.Content\n\treq.FederationService_Org_Federation_GetResponseVariable.Res = value.vars.Res\n\n\t// create a message value to be returned.\n\tret := &GetResponse{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"content\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*content.Content]{\n\t\tValue:      value,\n\t\tExpr:       `content`,\n\t\tCacheIndex: 37,\n\t\tSetter: func(v *content.Content) error {\n\t\t\tcontentValue, err := s.cast_Content_Content__to__Org_Federation_Content(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.Content = contentValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"content.int32_field + content.sint32_field\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[int64]{\n\t\tValue:      value,\n\t\tExpr:       `content.int32_field + content.sint32_field`,\n\t\tCacheIndex: 38,\n\t\tSetter: func(v int64) error {\n\t\t\tret.CelExpr = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.GetResponse\", slog.Any(\"org.federation.GetResponse\", s.logvalue_Org_Federation_GetResponse(ret)))\n\treturn ret, nil\n}\n\n// cast_Content_ContentType__to__Org_Federation_ContentType cast from \"content.ContentType\" to \"org.federation.ContentType\".\nfunc (s *FederationService) cast_Content_ContentType__to__Org_Federation_ContentType(from content.ContentType) (ContentType, error) {\n\tvar ret ContentType\n\tswitch from {\n\tcase content.ContentType_CONTENT_TYPE_1:\n\t\tret = ContentType_CONTENT_TYPE_1\n\tcase content.ContentType_CONTENT_TYPE_2:\n\t\tret = ContentType_CONTENT_TYPE_2\n\tcase content.ContentType_CONTENT_TYPE_3:\n\t\tret = ContentType_CONTENT_TYPE_3\n\tdefault:\n\t\tret = 0\n\t}\n\treturn ret, nil\n}\n\n// cast_Content_Content__to__Org_Federation_Content cast from \"content.Content\" to \"org.federation.Content\".\nfunc (s *FederationService) cast_Content_Content__to__Org_Federation_Content(from *content.Content) (*Content, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tbyFieldValue := from.GetByField()\n\tdoubleFieldValue := from.GetDoubleField()\n\tdoublesFieldValue := from.GetDoublesField()\n\tfloatFieldValue := from.GetFloatField()\n\tfloatsFieldValue := from.GetFloatsField()\n\tint32FieldValue := from.GetInt32Field()\n\tint32SFieldValue := from.GetInt32SField()\n\tint64FieldValue := from.GetInt64Field()\n\tint64SFieldValue := from.GetInt64SField()\n\tuint32FieldValue := from.GetUint32Field()\n\tuint32SFieldValue := from.GetUint32SField()\n\tuint64FieldValue := from.GetUint64Field()\n\tuint64SFieldValue := from.GetUint64SField()\n\tsint32FieldValue := from.GetSint32Field()\n\tsint32SFieldValue := from.GetSint32SField()\n\tsint64FieldValue := from.GetSint64Field()\n\tsint64SFieldValue := from.GetSint64SField()\n\tfixed32FieldValue := from.GetFixed32Field()\n\tfixed32SFieldValue := from.GetFixed32SField()\n\tfixed64FieldValue := from.GetFixed64Field()\n\tfixed64SFieldValue := from.GetFixed64SField()\n\tsfixed32FieldValue := from.GetSfixed32Field()\n\tsfixed32SFieldValue := from.GetSfixed32SField()\n\tsfixed64FieldValue := from.GetSfixed64Field()\n\tsfixed64SFieldValue := from.GetSfixed64SField()\n\tboolFieldValue := from.GetBoolField()\n\tboolsFieldValue := from.GetBoolsField()\n\tstringFieldValue := from.GetStringField()\n\tstringsFieldValue := from.GetStringsField()\n\tbyteStringFieldValue := from.GetByteStringField()\n\tbyteStringsFieldValue := from.GetByteStringsField()\n\tenumFieldValue, err := s.cast_Content_ContentType__to__Org_Federation_ContentType(from.GetEnumField())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tenumsFieldValue, err := s.cast_repeated_Content_ContentType__to__repeated_Org_Federation_ContentType(from.GetEnumsField())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tenvFieldValue := from.GetEnvField()\n\tenvsFieldValue := from.GetEnvsField()\n\tmessageFieldValue, err := s.cast_Content_Content__to__Org_Federation_Content(from.GetMessageField())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tmessagesFieldValue, err := s.cast_repeated_Content_Content__to__repeated_Org_Federation_Content(from.GetMessagesField())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret := &Content{\n\t\tByField:          byFieldValue,\n\t\tDoubleField:      doubleFieldValue,\n\t\tDoublesField:     doublesFieldValue,\n\t\tFloatField:       floatFieldValue,\n\t\tFloatsField:      floatsFieldValue,\n\t\tInt32Field:       int32FieldValue,\n\t\tInt32SField:      int32SFieldValue,\n\t\tInt64Field:       int64FieldValue,\n\t\tInt64SField:      int64SFieldValue,\n\t\tUint32Field:      uint32FieldValue,\n\t\tUint32SField:     uint32SFieldValue,\n\t\tUint64Field:      uint64FieldValue,\n\t\tUint64SField:     uint64SFieldValue,\n\t\tSint32Field:      sint32FieldValue,\n\t\tSint32SField:     sint32SFieldValue,\n\t\tSint64Field:      sint64FieldValue,\n\t\tSint64SField:     sint64SFieldValue,\n\t\tFixed32Field:     fixed32FieldValue,\n\t\tFixed32SField:    fixed32SFieldValue,\n\t\tFixed64Field:     fixed64FieldValue,\n\t\tFixed64SField:    fixed64SFieldValue,\n\t\tSfixed32Field:    sfixed32FieldValue,\n\t\tSfixed32SField:   sfixed32SFieldValue,\n\t\tSfixed64Field:    sfixed64FieldValue,\n\t\tSfixed64SField:   sfixed64SFieldValue,\n\t\tBoolField:        boolFieldValue,\n\t\tBoolsField:       boolsFieldValue,\n\t\tStringField:      stringFieldValue,\n\t\tStringsField:     stringsFieldValue,\n\t\tByteStringField:  byteStringFieldValue,\n\t\tByteStringsField: byteStringsFieldValue,\n\t\tEnumField:        enumFieldValue,\n\t\tEnumsField:       enumsFieldValue,\n\t\tEnvField:         envFieldValue,\n\t\tEnvsField:        envsFieldValue,\n\t\tMessageField:     messageFieldValue,\n\t\tMessagesField:    messagesFieldValue,\n\t}\n\n\treturn ret, nil\n}\n\n// cast_float64__to__float32 cast from \"double\" to \"float\".\nfunc (s *FederationService) cast_float64__to__float32(from float64) (float32, error) {\n\treturn float32(from), nil\n}\n\n// cast_int64__to__Content_ContentType cast from \"int64\" to \"content.ContentType\".\nfunc (s *FederationService) cast_int64__to__Content_ContentType(from int64) (content.ContentType, error) {\n\treturn content.ContentType(from), nil\n}\n\n// cast_int64__to__int32 cast from \"int64\" to \"sint32\".\nfunc (s *FederationService) cast_int64__to__int32(from int64) (int32, error) {\n\treturn int32(from), nil\n}\n\n// cast_int64__to__int64 cast from \"int64\" to \"sint64\".\nfunc (s *FederationService) cast_int64__to__int64(from int64) (int64, error) {\n\treturn int64(from), nil\n}\n\n// cast_repeated_Content_ContentType__to__repeated_Org_Federation_ContentType cast from \"repeated content.ContentType\" to \"repeated org.federation.ContentType\".\nfunc (s *FederationService) cast_repeated_Content_ContentType__to__repeated_Org_Federation_ContentType(from []content.ContentType) ([]ContentType, error) {\n\tret := make([]ContentType, 0, len(from))\n\tfor _, v := range from {\n\t\tcasted, err := s.cast_Content_ContentType__to__Org_Federation_ContentType(v)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret = append(ret, casted)\n\t}\n\treturn ret, nil\n}\n\n// cast_repeated_Content_Content__to__repeated_Org_Federation_Content cast from \"repeated content.Content\" to \"repeated org.federation.Content\".\nfunc (s *FederationService) cast_repeated_Content_Content__to__repeated_Org_Federation_Content(from []*content.Content) ([]*Content, error) {\n\tret := make([]*Content, 0, len(from))\n\tfor _, v := range from {\n\t\tcasted, err := s.cast_Content_Content__to__Org_Federation_Content(v)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret = append(ret, casted)\n\t}\n\treturn ret, nil\n}\n\n// cast_repeated_float64__to__repeated_float32 cast from \"repeated double\" to \"repeated float\".\nfunc (s *FederationService) cast_repeated_float64__to__repeated_float32(from []float64) ([]float32, error) {\n\tret := make([]float32, 0, len(from))\n\tfor _, v := range from {\n\t\tcasted, err := s.cast_float64__to__float32(v)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret = append(ret, casted)\n\t}\n\treturn ret, nil\n}\n\n// cast_repeated_int64__to__repeated_Content_ContentType cast from \"repeated int64\" to \"repeated content.ContentType\".\nfunc (s *FederationService) cast_repeated_int64__to__repeated_Content_ContentType(from []int64) ([]content.ContentType, error) {\n\tret := make([]content.ContentType, 0, len(from))\n\tfor _, v := range from {\n\t\tcasted, err := s.cast_int64__to__Content_ContentType(v)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret = append(ret, casted)\n\t}\n\treturn ret, nil\n}\n\n// cast_repeated_int64__to__repeated_int32 cast from \"repeated int64\" to \"repeated sint32\".\nfunc (s *FederationService) cast_repeated_int64__to__repeated_int32(from []int64) ([]int32, error) {\n\tret := make([]int32, 0, len(from))\n\tfor _, v := range from {\n\t\tcasted, err := s.cast_int64__to__int32(v)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret = append(ret, casted)\n\t}\n\treturn ret, nil\n}\n\n// cast_repeated_int64__to__repeated_int64 cast from \"repeated int64\" to \"repeated sint64\".\nfunc (s *FederationService) cast_repeated_int64__to__repeated_int64(from []int64) ([]int64, error) {\n\tret := make([]int64, 0, len(from))\n\tfor _, v := range from {\n\t\tcasted, err := s.cast_int64__to__int64(v)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret = append(ret, casted)\n\t}\n\treturn ret, nil\n}\n\n// cast_repeated_uint64__to__repeated_uint32 cast from \"repeated uint64\" to \"repeated uint32\".\nfunc (s *FederationService) cast_repeated_uint64__to__repeated_uint32(from []uint64) ([]uint32, error) {\n\tret := make([]uint32, 0, len(from))\n\tfor _, v := range from {\n\t\tcasted, err := s.cast_uint64__to__uint32(v)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret = append(ret, casted)\n\t}\n\treturn ret, nil\n}\n\n// cast_repeated_uint64__to__repeated_uint64 cast from \"repeated uint64\" to \"repeated fixed64\".\nfunc (s *FederationService) cast_repeated_uint64__to__repeated_uint64(from []uint64) ([]uint64, error) {\n\tret := make([]uint64, 0, len(from))\n\tfor _, v := range from {\n\t\tcasted, err := s.cast_uint64__to__uint64(v)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret = append(ret, casted)\n\t}\n\treturn ret, nil\n}\n\n// cast_uint64__to__uint32 cast from \"uint64\" to \"uint32\".\nfunc (s *FederationService) cast_uint64__to__uint32(from uint64) (uint32, error) {\n\tret, err := grpcfed.Uint64ToUint32(from)\n\tif err != nil {\n\t\treturn ret, err\n\t}\n\treturn ret, nil\n}\n\n// cast_uint64__to__uint64 cast from \"uint64\" to \"fixed64\".\nfunc (s *FederationService) cast_uint64__to__uint64(from uint64) (uint64, error) {\n\treturn uint64(from), nil\n}\n\nfunc (s *FederationService) logvalue_Content_Content(v *content.Content) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"by_field\", v.GetByField()),\n\t\tslog.Float64(\"double_field\", v.GetDoubleField()),\n\t\tslog.Any(\"doubles_field\", v.GetDoublesField()),\n\t\tslog.Float64(\"float_field\", float64(v.GetFloatField())),\n\t\tslog.Any(\"floats_field\", v.GetFloatsField()),\n\t\tslog.Int64(\"int32_field\", int64(v.GetInt32Field())),\n\t\tslog.Any(\"int32s_field\", v.GetInt32SField()),\n\t\tslog.Int64(\"int64_field\", v.GetInt64Field()),\n\t\tslog.Any(\"int64s_field\", v.GetInt64SField()),\n\t\tslog.Uint64(\"uint32_field\", uint64(v.GetUint32Field())),\n\t\tslog.Any(\"uint32s_field\", v.GetUint32SField()),\n\t\tslog.Uint64(\"uint64_field\", v.GetUint64Field()),\n\t\tslog.Any(\"uint64s_field\", v.GetUint64SField()),\n\t\tslog.Int64(\"sint32_field\", int64(v.GetSint32Field())),\n\t\tslog.Any(\"sint32s_field\", v.GetSint32SField()),\n\t\tslog.Int64(\"sint64_field\", v.GetSint64Field()),\n\t\tslog.Any(\"sint64s_field\", v.GetSint64SField()),\n\t\tslog.Uint64(\"fixed32_field\", uint64(v.GetFixed32Field())),\n\t\tslog.Any(\"fixed32s_field\", v.GetFixed32SField()),\n\t\tslog.Uint64(\"fixed64_field\", v.GetFixed64Field()),\n\t\tslog.Any(\"fixed64s_field\", v.GetFixed64SField()),\n\t\tslog.Int64(\"sfixed32_field\", int64(v.GetSfixed32Field())),\n\t\tslog.Any(\"sfixed32s_field\", v.GetSfixed32SField()),\n\t\tslog.Int64(\"sfixed64_field\", v.GetSfixed64Field()),\n\t\tslog.Any(\"sfixed64s_field\", v.GetSfixed64SField()),\n\t\tslog.Bool(\"bool_field\", v.GetBoolField()),\n\t\tslog.Any(\"bools_field\", v.GetBoolsField()),\n\t\tslog.String(\"string_field\", v.GetStringField()),\n\t\tslog.Any(\"strings_field\", v.GetStringsField()),\n\t\tslog.String(\"byte_string_field\", string(v.GetByteStringField())),\n\t\tslog.Any(\"byte_strings_field\", v.GetByteStringsField()),\n\t\tslog.String(\"enum_field\", s.logvalue_Content_ContentType(v.GetEnumField()).String()),\n\t\tslog.Any(\"enums_field\", s.logvalue_repeated_Content_ContentType(v.GetEnumsField())),\n\t\tslog.String(\"env_field\", v.GetEnvField()),\n\t\tslog.Any(\"envs_field\", v.GetEnvsField()),\n\t\tslog.Any(\"message_field\", s.logvalue_Content_Content(v.GetMessageField())),\n\t\tslog.Any(\"messages_field\", s.logvalue_repeated_Content_Content(v.GetMessagesField())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Content_ContentType(v content.ContentType) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tswitch v {\n\tcase content.ContentType_CONTENT_TYPE_1:\n\t\treturn slog.StringValue(\"CONTENT_TYPE_1\")\n\tcase content.ContentType_CONTENT_TYPE_2:\n\t\treturn slog.StringValue(\"CONTENT_TYPE_2\")\n\tcase content.ContentType_CONTENT_TYPE_3:\n\t\treturn slog.StringValue(\"CONTENT_TYPE_3\")\n\t}\n\treturn slog.StringValue(\"\")\n}\n\nfunc (s *FederationService) logvalue_Content_GetContentRequest(v *content.GetContentRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"by_field\", v.GetByField()),\n\t\tslog.Float64(\"double_field\", v.GetDoubleField()),\n\t\tslog.Any(\"doubles_field\", v.GetDoublesField()),\n\t\tslog.Float64(\"float_field\", float64(v.GetFloatField())),\n\t\tslog.Any(\"floats_field\", v.GetFloatsField()),\n\t\tslog.Int64(\"int32_field\", int64(v.GetInt32Field())),\n\t\tslog.Any(\"int32s_field\", v.GetInt32SField()),\n\t\tslog.Int64(\"int64_field\", v.GetInt64Field()),\n\t\tslog.Any(\"int64s_field\", v.GetInt64SField()),\n\t\tslog.Uint64(\"uint32_field\", uint64(v.GetUint32Field())),\n\t\tslog.Any(\"uint32s_field\", v.GetUint32SField()),\n\t\tslog.Uint64(\"uint64_field\", v.GetUint64Field()),\n\t\tslog.Any(\"uint64s_field\", v.GetUint64SField()),\n\t\tslog.Int64(\"sint32_field\", int64(v.GetSint32Field())),\n\t\tslog.Any(\"sint32s_field\", v.GetSint32SField()),\n\t\tslog.Int64(\"sint64_field\", v.GetSint64Field()),\n\t\tslog.Any(\"sint64s_field\", v.GetSint64SField()),\n\t\tslog.Uint64(\"fixed32_field\", uint64(v.GetFixed32Field())),\n\t\tslog.Any(\"fixed32s_field\", v.GetFixed32SField()),\n\t\tslog.Uint64(\"fixed64_field\", v.GetFixed64Field()),\n\t\tslog.Any(\"fixed64s_field\", v.GetFixed64SField()),\n\t\tslog.Int64(\"sfixed32_field\", int64(v.GetSfixed32Field())),\n\t\tslog.Any(\"sfixed32s_field\", v.GetSfixed32SField()),\n\t\tslog.Int64(\"sfixed64_field\", v.GetSfixed64Field()),\n\t\tslog.Any(\"sfixed64s_field\", v.GetSfixed64SField()),\n\t\tslog.Bool(\"bool_field\", v.GetBoolField()),\n\t\tslog.Any(\"bools_field\", v.GetBoolsField()),\n\t\tslog.String(\"string_field\", v.GetStringField()),\n\t\tslog.Any(\"strings_field\", v.GetStringsField()),\n\t\tslog.String(\"byte_string_field\", string(v.GetByteStringField())),\n\t\tslog.Any(\"byte_strings_field\", v.GetByteStringsField()),\n\t\tslog.String(\"enum_field\", s.logvalue_Content_ContentType(v.GetEnumField()).String()),\n\t\tslog.Any(\"enums_field\", s.logvalue_repeated_Content_ContentType(v.GetEnumsField())),\n\t\tslog.String(\"env_field\", v.GetEnvField()),\n\t\tslog.Any(\"envs_field\", v.GetEnvsField()),\n\t\tslog.Any(\"message_field\", s.logvalue_Content_Content(v.GetMessageField())),\n\t\tslog.Any(\"messages_field\", s.logvalue_repeated_Content_Content(v.GetMessagesField())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_Content(v *Content) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"by_field\", v.GetByField()),\n\t\tslog.Float64(\"double_field\", v.GetDoubleField()),\n\t\tslog.Any(\"doubles_field\", v.GetDoublesField()),\n\t\tslog.Float64(\"float_field\", float64(v.GetFloatField())),\n\t\tslog.Any(\"floats_field\", v.GetFloatsField()),\n\t\tslog.Int64(\"int32_field\", int64(v.GetInt32Field())),\n\t\tslog.Any(\"int32s_field\", v.GetInt32SField()),\n\t\tslog.Int64(\"int64_field\", v.GetInt64Field()),\n\t\tslog.Any(\"int64s_field\", v.GetInt64SField()),\n\t\tslog.Uint64(\"uint32_field\", uint64(v.GetUint32Field())),\n\t\tslog.Any(\"uint32s_field\", v.GetUint32SField()),\n\t\tslog.Uint64(\"uint64_field\", v.GetUint64Field()),\n\t\tslog.Any(\"uint64s_field\", v.GetUint64SField()),\n\t\tslog.Int64(\"sint32_field\", int64(v.GetSint32Field())),\n\t\tslog.Any(\"sint32s_field\", v.GetSint32SField()),\n\t\tslog.Int64(\"sint64_field\", v.GetSint64Field()),\n\t\tslog.Any(\"sint64s_field\", v.GetSint64SField()),\n\t\tslog.Uint64(\"fixed32_field\", uint64(v.GetFixed32Field())),\n\t\tslog.Any(\"fixed32s_field\", v.GetFixed32SField()),\n\t\tslog.Uint64(\"fixed64_field\", v.GetFixed64Field()),\n\t\tslog.Any(\"fixed64s_field\", v.GetFixed64SField()),\n\t\tslog.Int64(\"sfixed32_field\", int64(v.GetSfixed32Field())),\n\t\tslog.Any(\"sfixed32s_field\", v.GetSfixed32SField()),\n\t\tslog.Int64(\"sfixed64_field\", v.GetSfixed64Field()),\n\t\tslog.Any(\"sfixed64s_field\", v.GetSfixed64SField()),\n\t\tslog.Bool(\"bool_field\", v.GetBoolField()),\n\t\tslog.Any(\"bools_field\", v.GetBoolsField()),\n\t\tslog.String(\"string_field\", v.GetStringField()),\n\t\tslog.Any(\"strings_field\", v.GetStringsField()),\n\t\tslog.String(\"byte_string_field\", string(v.GetByteStringField())),\n\t\tslog.Any(\"byte_strings_field\", v.GetByteStringsField()),\n\t\tslog.String(\"enum_field\", s.logvalue_Org_Federation_ContentType(v.GetEnumField()).String()),\n\t\tslog.Any(\"enums_field\", s.logvalue_repeated_Org_Federation_ContentType(v.GetEnumsField())),\n\t\tslog.String(\"env_field\", v.GetEnvField()),\n\t\tslog.Any(\"envs_field\", v.GetEnvsField()),\n\t\tslog.Any(\"message_field\", s.logvalue_Org_Federation_Content(v.GetMessageField())),\n\t\tslog.Any(\"messages_field\", s.logvalue_repeated_Org_Federation_Content(v.GetMessagesField())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_ContentType(v ContentType) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tswitch v {\n\tcase ContentType_CONTENT_TYPE_1:\n\t\treturn slog.StringValue(\"CONTENT_TYPE_1\")\n\tcase ContentType_CONTENT_TYPE_2:\n\t\treturn slog.StringValue(\"CONTENT_TYPE_2\")\n\tcase ContentType_CONTENT_TYPE_3:\n\t\treturn slog.StringValue(\"CONTENT_TYPE_3\")\n\t}\n\treturn slog.StringValue(\"\")\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetResponse(v *GetResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"content\", s.logvalue_Org_Federation_Content(v.GetContent())),\n\t\tslog.Int64(\"cel_expr\", v.GetCelExpr()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetResponseArgument(v *FederationService_Org_Federation_GetResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_repeated_Content_Content(v []*content.Content) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tattrs := make([]slog.Attr, 0, len(v))\n\tfor idx, vv := range v {\n\t\tattrs = append(attrs, slog.Attr{\n\t\t\tKey:   grpcfed.ToLogAttrKey(idx),\n\t\t\tValue: s.logvalue_Content_Content(vv),\n\t\t})\n\t}\n\treturn slog.GroupValue(attrs...)\n}\n\nfunc (s *FederationService) logvalue_repeated_Content_ContentType(v []content.ContentType) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tattrs := make([]slog.Attr, 0, len(v))\n\tfor idx, vv := range v {\n\t\tattrs = append(attrs, slog.Attr{\n\t\t\tKey:   grpcfed.ToLogAttrKey(idx),\n\t\t\tValue: s.logvalue_Content_ContentType(vv),\n\t\t})\n\t}\n\treturn slog.GroupValue(attrs...)\n}\n\nfunc (s *FederationService) logvalue_repeated_Org_Federation_Content(v []*Content) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tattrs := make([]slog.Attr, 0, len(v))\n\tfor idx, vv := range v {\n\t\tattrs = append(attrs, slog.Attr{\n\t\t\tKey:   grpcfed.ToLogAttrKey(idx),\n\t\t\tValue: s.logvalue_Org_Federation_Content(vv),\n\t\t})\n\t}\n\treturn slog.GroupValue(attrs...)\n}\n\nfunc (s *FederationService) logvalue_repeated_Org_Federation_ContentType(v []ContentType) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tattrs := make([]slog.Attr, 0, len(v))\n\tfor idx, vv := range v {\n\t\tattrs = append(attrs, slog.Attr{\n\t\t\tKey:   grpcfed.ToLogAttrKey(idx),\n\t\t\tValue: s.logvalue_Org_Federation_ContentType(vv),\n\t\t})\n\t}\n\treturn slog.GroupValue(attrs...)\n}\n"
  },
  {
    "path": "_examples/08_literal/go.mod",
    "content": "module example\n\ngo 1.24.0\n\nreplace github.com/mercari/grpc-federation => ../../\n\nrequire (\n\tgithub.com/google/go-cmp v0.7.0\n\tgithub.com/mercari/grpc-federation v0.0.0-00010101000000-000000000000\n\tgo.opentelemetry.io/otel v1.24.0\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0\n\tgo.opentelemetry.io/otel/sdk v1.24.0\n\tgo.opentelemetry.io/otel/trace v1.24.0\n\tgo.uber.org/goleak v1.3.0\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7\n\tgoogle.golang.org/grpc v1.65.0\n\tgoogle.golang.org/protobuf v1.34.2\n)\n\nrequire (\n\tcel.dev/expr v0.19.1 // indirect\n\tgithub.com/antlr4-go/antlr/v4 v4.13.0 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.2.1 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/goccy/wasi-go v0.3.2 // indirect\n\tgithub.com/google/cel-go v0.23.1 // indirect\n\tgithub.com/google/uuid v1.6.0 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect\n\tgithub.com/kelseyhightower/envconfig v1.4.0 // indirect\n\tgithub.com/stealthrocket/wazergo v0.19.1 // indirect\n\tgithub.com/stoewer/go-strcase v1.3.0 // indirect\n\tgithub.com/tetratelabs/wazero v1.10.1 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.24.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.0.0 // indirect\n\tgolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect\n\tgolang.org/x/net v0.38.0 // indirect\n\tgolang.org/x/sync v0.14.0 // indirect\n\tgolang.org/x/sys v0.37.0 // indirect\n\tgolang.org/x/text v0.23.0 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 // indirect\n)\n"
  },
  {
    "path": "_examples/08_literal/go.sum",
    "content": "cel.dev/expr v0.19.1 h1:NciYrtDRIR0lNCnH1LFJegdjspNx9fI59O7TWcua/W4=\ncel.dev/expr v0.19.1/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw=\ngithub.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=\ngithub.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/goccy/wasi-go v0.3.2 h1:wAvGXmqCkfcp0B0AwIp5Ya53hzDwkKm9W8iuT3nCCz0=\ngithub.com/goccy/wasi-go v0.3.2/go.mod h1:nIKD204n9xa4Z20UV+XA483kIr9TAl2vXr+X5qVAO5M=\ngithub.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4=\ngithub.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=\ngithub.com/google/cel-go v0.23.1 h1:91ThhEZlBcE5rB2adBVXqvDoqdL8BG2oyhd0bK1I/r4=\ngithub.com/google/cel-go v0.23.1/go.mod h1:52Pb6QsDbC5kvgxvZhiL9QX1oZEkcUF/ZqaPx1J5Wwo=\ngithub.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\ngithub.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg=\ngithub.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=\ngithub.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/stealthrocket/wazergo v0.19.1 h1:BPrITETPgSFwiytwmToO0MbUC/+RGC39JScz1JmmG6c=\ngithub.com/stealthrocket/wazergo v0.19.1/go.mod h1:riI0hxw4ndZA5e6z7PesHg2BtTftcZaMxRcoiGGipTs=\ngithub.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs=\ngithub.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tetratelabs/wazero v1.10.1 h1:2DugeJf6VVk58KTPszlNfeeN8AhhpwcZqkJj2wwFuH8=\ngithub.com/tetratelabs/wazero v1.10.1/go.mod h1:DRm5twOQ5Gr1AoEdSi0CLjDQF1J9ZAuyqFIjl1KKfQU=\ngo.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo=\ngo.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0=\ngo.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI=\ngo.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=\ngo.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw=\ngo.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg=\ngo.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=\ngo.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=\ngo.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=\ngo.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=\ngolang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=\ngolang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=\ngolang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=\ngolang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=\ngolang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=\ngolang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=\ngolang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 h1:YcyjlL1PRr2Q17/I0dPk2JmYS5CDXfcdb2Z3YRioEbw=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7 h1:2035KHhUv+EpyB+hWgJnaWKJOdX1E95w2S8Rr4uWKTs=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=\ngoogle.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=\ngoogle.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=\ngoogle.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=\ngoogle.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "_examples/08_literal/main_test.go",
    "content": "package main_test\n\nimport (\n\t\"context\"\n\t\"log/slog\"\n\t\"net\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\"\n\t\"go.opentelemetry.io/otel/propagation\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\tsdktrace \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.4.0\"\n\t\"go.uber.org/goleak\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/test/bufconn\"\n\n\t\"example/content\"\n\t\"example/federation\"\n)\n\nconst bufSize = 1024\n\nvar (\n\tlistener      *bufconn.Listener\n\tcontentClient content.ContentServiceClient\n)\n\ntype clientConfig struct{}\n\nfunc (c *clientConfig) Content_ContentServiceClient(cfg federation.FederationServiceClientConfig) (content.ContentServiceClient, error) {\n\treturn contentClient, nil\n}\n\ntype ContentServer struct {\n\t*content.UnimplementedContentServiceServer\n}\n\nfunc (s *ContentServer) GetContent(ctx context.Context, req *content.GetContentRequest) (*content.GetContentResponse, error) {\n\treturn &content.GetContentResponse{\n\t\tContent: &content.Content{\n\t\t\tByField:          req.GetByField(),\n\t\t\tDoubleField:      req.GetDoubleField(),\n\t\t\tDoublesField:     req.GetDoublesField(),\n\t\t\tFloatField:       req.GetFloatField(),\n\t\t\tFloatsField:      req.GetFloatsField(),\n\t\t\tInt32Field:       req.GetInt32Field(),\n\t\t\tInt32SField:      req.GetInt32SField(),\n\t\t\tInt64Field:       req.GetInt64Field(),\n\t\t\tInt64SField:      req.GetInt64SField(),\n\t\t\tUint32Field:      req.GetUint32Field(),\n\t\t\tUint32SField:     req.GetUint32SField(),\n\t\t\tUint64Field:      req.GetUint64Field(),\n\t\t\tUint64SField:     req.GetUint64SField(),\n\t\t\tSint32Field:      req.GetSint32Field(),\n\t\t\tSint32SField:     req.GetSint32SField(),\n\t\t\tSint64Field:      req.GetSint64Field(),\n\t\t\tSint64SField:     req.GetSint64SField(),\n\t\t\tFixed32Field:     req.GetFixed32Field(),\n\t\t\tFixed32SField:    req.GetFixed32SField(),\n\t\t\tFixed64Field:     req.GetFixed64Field(),\n\t\t\tFixed64SField:    req.GetFixed64SField(),\n\t\t\tSfixed32Field:    req.GetSfixed32Field(),\n\t\t\tSfixed32SField:   req.GetSfixed32SField(),\n\t\t\tSfixed64Field:    req.GetSfixed64Field(),\n\t\t\tSfixed64SField:   req.GetSfixed64SField(),\n\t\t\tBoolField:        req.GetBoolField(),\n\t\t\tBoolsField:       req.GetBoolsField(),\n\t\t\tStringField:      req.GetStringField(),\n\t\t\tStringsField:     req.GetStringsField(),\n\t\t\tByteStringField:  req.GetByteStringField(),\n\t\t\tByteStringsField: req.GetByteStringsField(),\n\t\t\tEnumField:        req.GetEnumField(),\n\t\t\tEnumsField:       req.GetEnumsField(),\n\t\t\tEnvField:         req.GetEnvField(),\n\t\t\tEnvsField:        req.GetEnvsField(),\n\t\t\tMessageField:     req.GetMessageField(),\n\t\t\tMessagesField:    req.GetMessagesField(),\n\t\t},\n\t}, nil\n}\n\nfunc dialer(ctx context.Context, address string) (net.Conn, error) {\n\treturn listener.Dial()\n}\n\nfunc TestFederation(t *testing.T) {\n\tdefer goleak.VerifyNone(t)\n\tctx := context.Background()\n\tlistener = bufconn.Listen(bufSize)\n\n\tif os.Getenv(\"ENABLE_JAEGER\") != \"\" {\n\t\texporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithInsecure())\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttp := sdktrace.NewTracerProvider(\n\t\t\tsdktrace.WithBatcher(exporter),\n\t\t\tsdktrace.WithResource(\n\t\t\t\tresource.NewWithAttributes(\n\t\t\t\t\tsemconv.SchemaURL,\n\t\t\t\t\tsemconv.ServiceNameKey.String(\"example08/literal\"),\n\t\t\t\t\tsemconv.ServiceVersionKey.String(\"1.0.0\"),\n\t\t\t\t\tattribute.String(\"environment\", \"dev\"),\n\t\t\t\t),\n\t\t\t),\n\t\t\tsdktrace.WithSampler(sdktrace.AlwaysSample()),\n\t\t)\n\t\tdefer tp.Shutdown(ctx)\n\t\totel.SetTextMapPropagator(propagation.TraceContext{})\n\t\totel.SetTracerProvider(tp)\n\t}\n\n\tconn, err := grpc.DialContext(ctx, \"\", grpc.WithContextDialer(dialer), grpc.WithInsecure())\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer conn.Close()\n\n\tcontentClient = content.NewContentServiceClient(conn)\n\n\tgrpcServer := grpc.NewServer()\n\tdefer grpcServer.Stop()\n\n\tlogger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{\n\t\tLevel: slog.LevelDebug,\n\t}))\n\tfederationServer, err := federation.NewFederationService(federation.FederationServiceConfig{\n\t\tClient: new(clientConfig),\n\t\tLogger: logger,\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer federation.CleanupFederationService(ctx, federationServer)\n\n\tcontent.RegisterContentServiceServer(grpcServer, &ContentServer{})\n\tfederation.RegisterFederationServiceServer(grpcServer, federationServer)\n\n\tgo func() {\n\t\tif err := grpcServer.Serve(listener); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t}()\n\n\tt.Setenv(\"foo\", \"foo-value\")\n\tt.Setenv(\"bar\", \"bar-value\")\n\n\tclient := federation.NewFederationServiceClient(conn)\n\tres, err := client.Get(ctx, &federation.GetRequest{\n\t\tId: \"foo\",\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif diff := cmp.Diff(res, &federation.GetResponse{\n\t\tContent: &federation.Content{\n\t\t\tByField:          \"foo\",\n\t\t\tDoubleField:      1.23,\n\t\t\tDoublesField:     []float64{4.56, 7.89},\n\t\t\tFloatField:       4.56,\n\t\t\tFloatsField:      []float32{7.89, 1.23},\n\t\t\tInt32Field:       -1,\n\t\t\tInt32SField:      []int32{-2, -3},\n\t\t\tInt64Field:       -4,\n\t\t\tInt64SField:      []int64{-5, -6},\n\t\t\tUint32Field:      1,\n\t\t\tUint32SField:     []uint32{2, 3},\n\t\t\tUint64Field:      4,\n\t\t\tUint64SField:     []uint64{5, 6},\n\t\t\tSint32Field:      -7,\n\t\t\tSint32SField:     []int32{-8, -9},\n\t\t\tSint64Field:      -10,\n\t\t\tSint64SField:     []int64{-11, -12},\n\t\t\tFixed32Field:     10,\n\t\t\tFixed32SField:    []uint32{11, 12},\n\t\t\tFixed64Field:     13,\n\t\t\tFixed64SField:    []uint64{14, 15},\n\t\t\tSfixed32Field:    -14,\n\t\t\tSfixed32SField:   []int32{-15, -16},\n\t\t\tSfixed64Field:    -17,\n\t\t\tSfixed64SField:   []int64{-18, -19},\n\t\t\tBoolField:        true,\n\t\t\tBoolsField:       []bool{true, false},\n\t\t\tStringField:      \"foo\",\n\t\t\tStringsField:     []string{\"hello\", \"world\"},\n\t\t\tByteStringField:  []byte(\"foo\"),\n\t\t\tByteStringsField: [][]byte{[]byte(\"foo\"), []byte(\"bar\")},\n\t\t\tEnumField:        federation.ContentType_CONTENT_TYPE_1,\n\t\t\tEnumsField:       []federation.ContentType{federation.ContentType_CONTENT_TYPE_2, federation.ContentType_CONTENT_TYPE_3},\n\t\t\tMessageField: &federation.Content{\n\t\t\t\tDoubleField:  1.23,\n\t\t\t\tDoublesField: []float64{4.56, 7.89},\n\t\t\t},\n\t\t\tMessagesField: []*federation.Content{{}, {}},\n\t\t},\n\t\tCelExpr: -8,\n\t}, cmpopts.IgnoreUnexported(\n\t\tfederation.GetResponse{},\n\t\tfederation.Content{},\n\t)); diff != \"\" {\n\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t}\n}\n"
  },
  {
    "path": "_examples/08_literal/proto/buf.yaml",
    "content": "version: v1\nbreaking:\n  use:\n    - FILE\nlint:\n  use:\n    - DEFAULT\n"
  },
  {
    "path": "_examples/08_literal/proto/content/content.proto",
    "content": "syntax = \"proto3\";\n\npackage content;\n\noption go_package = \"example/content;content\";\n\nservice ContentService {\n  rpc GetContent(GetContentRequest) returns (GetContentResponse) {};\n}\n\nmessage GetContentRequest {\n  string by_field                   = 1;\n  double double_field               = 2;\n  repeated double doubles_field     = 3;\n  float float_field                 = 4;\n  repeated float floats_field       = 5;\n  int32 int32_field                 = 6;\n  repeated int32 int32s_field       = 7;\n  int64 int64_field                 = 8;\n  repeated int64 int64s_field       = 9;\n  uint32 uint32_field               = 10;\n  repeated uint32 uint32s_field     = 11;\n  uint64 uint64_field               = 12;\n  repeated uint64 uint64s_field     = 13;\n  sint32 sint32_field               = 14;\n  repeated sint32 sint32s_field     = 15;\n  sint64 sint64_field               = 16;\n  repeated sint64 sint64s_field     = 17;\n  fixed32 fixed32_field             = 18;\n  repeated fixed32 fixed32s_field   = 19;\n  fixed64 fixed64_field             = 20;\n  repeated fixed64 fixed64s_field   = 21;\n  sfixed32 sfixed32_field           = 22;\n  repeated sfixed32 sfixed32s_field = 23;\n  sfixed64 sfixed64_field           = 24;\n  repeated sfixed64 sfixed64s_field = 25;\n  bool bool_field                   = 26;\n  repeated bool bools_field         = 27;\n  string string_field               = 28;\n  repeated string strings_field     = 29;\n  bytes byte_string_field           = 30;\n  repeated bytes byte_strings_field = 31;\n  ContentType enum_field            = 32;\n  repeated ContentType enums_field  = 33;\n  string env_field                  = 34;\n  repeated string envs_field        = 35;\n  Content message_field           = 36;\n  repeated Content messages_field = 37;\n}\n\nmessage GetContentResponse {\n  Content content = 1;\n}\n\nenum ContentType {\n  CONTENT_TYPE_1 = 0;\n  CONTENT_TYPE_2 = 1;\n  CONTENT_TYPE_3 = 2;\n}\n\nmessage Content {\n  string by_field                   = 1;\n  double double_field               = 2;\n  repeated double doubles_field     = 3;\n  float float_field                 = 4;\n  repeated float floats_field       = 5;\n  int32 int32_field                 = 6;\n  repeated int32 int32s_field       = 7;\n  int64 int64_field                 = 8;\n  repeated int64 int64s_field       = 9;\n  uint32 uint32_field               = 10;\n  repeated uint32 uint32s_field     = 11;\n  uint64 uint64_field               = 12;\n  repeated uint64 uint64s_field     = 13;\n  sint32 sint32_field               = 14;\n  repeated sint32 sint32s_field     = 15;\n  sint64 sint64_field               = 16;\n  repeated sint64 sint64s_field     = 17;\n  fixed32 fixed32_field             = 18;\n  repeated fixed32 fixed32s_field   = 19;\n  fixed64 fixed64_field             = 20;\n  repeated fixed64 fixed64s_field   = 21;\n  sfixed32 sfixed32_field           = 22;\n  repeated sfixed32 sfixed32s_field = 23;\n  sfixed64 sfixed64_field           = 24;\n  repeated sfixed64 sfixed64s_field = 25;\n  bool bool_field                   = 26;\n  repeated bool bools_field         = 27;\n  string string_field               = 28;\n  repeated string strings_field     = 29;\n  bytes byte_string_field           = 30;\n  repeated bytes byte_strings_field = 31;\n  ContentType enum_field            = 32;\n  repeated ContentType enums_field  = 33;\n  string env_field                  = 34;\n  repeated string envs_field        = 35;\n  Content message_field           = 36;\n  repeated Content messages_field = 37;\n}\n"
  },
  {
    "path": "_examples/08_literal/proto/federation/federation.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\noption (grpc.federation.file)= {\n  import: [\"content/content.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc Get(GetRequest) returns (GetResponse) {};\n}\n\nmessage GetRequest {\n  string id = 1;\n}\n\nmessage GetResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"content.ContentService/GetContent\"\n        request: [\n          { field: \"by_field\",           by: \"$.id\" },\n          { field: \"double_field\",       by: \"1.23\" },\n          { field: \"doubles_field\",      by: \"[4.56, 7.89]\"},\n          { field: \"float_field\",        by: \"4.56\" },\n          { field: \"floats_field\",       by: \"[7.89, 1.23]\"},\n          { field: \"int32_field\",        by: \"-1\" },\n          { field: \"int32s_field\",       by: \"[-2, -3]\"},\n          { field: \"int64_field\",        by: \"-4\"},\n          { field: \"int64s_field\",       by: \"[-5, -6]\"},\n          { field: \"uint32_field\",       by: \"1u\" },\n          { field: \"uint32s_field\",      by: \"[2u, 3u]\"},\n          { field: \"uint64_field\",       by: \"4u\" },\n          { field: \"uint64s_field\",      by: \"[5u, 6u]\"},\n          { field: \"sint32_field\",       by: \"-7\" },\n          { field: \"sint32s_field\",      by: \"[-8, -9]\"},\n          { field: \"sint64_field\",       by: \"-10\" },\n          { field: \"sint64s_field\",      by: \"[-11, -12]\"},\n          { field: \"fixed32_field\",      by: \"10u\" },\n          { field: \"fixed32s_field\",     by: \"[11u, 12u]\"},\n          { field: \"fixed64_field\",      by: \"13u\" },\n          { field: \"fixed64s_field\",     by: \"[14u, 15u]\"},\n          { field: \"sfixed32_field\",     by: \"-14\" },\n          { field: \"sfixed32s_field\",    by: \"[-15, -16]\"},\n          { field: \"sfixed64_field\",     by: \"-17\" },\n          { field: \"sfixed64s_field\",    by: \"[-18, -19]\"},\n          { field: \"bool_field\",         by: \"true\" },\n          { field: \"bools_field\",        by: \"[true, false]\"},\n          { field: \"string_field\",       by: \"'foo'\" },\n          { field: \"strings_field\",      by: \"['hello', 'world']\"},\n          { field: \"byte_string_field\",  by: \"b'foo'\" },\n          { field: \"byte_strings_field\", by: \"[b'foo', b'bar']\"},\n          { field: \"enum_field\",         by: \"content.ContentType.CONTENT_TYPE_1\" },\n          { field: \"enums_field\",        by: \"[content.ContentType.CONTENT_TYPE_2, content.ContentType.CONTENT_TYPE_3]\"},\n          { field: \"message_field\",       by: \"content.Content{double_field: 1.23, doubles_field: [4.56, 7.89]}\"},\n          { field: \"messages_field\",     by: \"[content.Content{}, content.Content{}]\"}\n        ]\n      }\n    }\n    def { name: \"content\", by: \"res.content\" }\n  };\n  Content content  = 1 [(grpc.federation.field).by = \"content\"];\n  int64 cel_expr = 2 [(grpc.federation.field).by = \"content.int32_field + content.sint32_field\"];\n}\n\nenum ContentType {\n  option (grpc.federation.enum).alias = \"content.ContentType\";\n\n  CONTENT_TYPE_1 = 0;\n  CONTENT_TYPE_2 = 1;\n  CONTENT_TYPE_3 = 2;\n}\n\nmessage Content {\n  option (grpc.federation.message).alias = \"content.Content\";\n\n  string by_field                   = 1;\n  double double_field               = 2;\n  repeated double doubles_field     = 3;\n  float float_field                 = 4;\n  repeated float floats_field       = 5;\n  int32 int32_field                 = 6;\n  repeated int32 int32s_field       = 7;\n  int64 int64_field                 = 8;\n  repeated int64 int64s_field       = 9;\n  uint32 uint32_field               = 10;\n  repeated uint32 uint32s_field     = 11;\n  uint64 uint64_field               = 12;\n  repeated uint64 uint64s_field     = 13;\n  sint32 sint32_field               = 14;\n  repeated sint32 sint32s_field     = 15;\n  sint64 sint64_field               = 16;\n  repeated sint64 sint64s_field     = 17;\n  fixed32 fixed32_field             = 18;\n  repeated fixed32 fixed32s_field   = 19;\n  fixed64 fixed64_field             = 20;\n  repeated fixed64 fixed64s_field   = 21;\n  sfixed32 sfixed32_field           = 22;\n  repeated sfixed32 sfixed32s_field = 23;\n  sfixed64 sfixed64_field           = 24;\n  repeated sfixed64 sfixed64s_field = 25;\n  bool bool_field                   = 26;\n  repeated bool bools_field         = 27;\n  string string_field               = 28;\n  repeated string strings_field     = 29;\n  bytes byte_string_field           = 30;\n  repeated bytes byte_strings_field = 31;\n  ContentType enum_field            = 32;\n  repeated ContentType enums_field  = 33;\n  string env_field                  = 34;\n  repeated string envs_field        = 35;\n  Content message_field             = 36;\n  repeated Content messages_field   = 37;\n}\n"
  },
  {
    "path": "_examples/09_multi_user/.gitignore",
    "content": "grpc/federation\n"
  },
  {
    "path": "_examples/09_multi_user/Makefile",
    "content": "MAKEFILE_DIR := $(dir $(lastword $(MAKEFILE_LIST)))\nGOBIN := $(MAKEFILE_DIR)/../../bin\nPATH := $(GOBIN):$(PATH)\n\nJAEGER_IMAGE := jaegertracing/all-in-one:latest\n\n.PHONY: generate\ngenerate:\n\t$(GOBIN)/buf generate\n\n.PHONY: lint\nlint:\n\t@$(GOBIN)/grpc-federation-linter -Iproto -Iproto_deps ./proto/federation/federation.proto\n\n.PHONY: test\ntest:\n\tgo test -race ./ -count=1\n\n.PHONY: grpc-federation/generate\ngrpc-federation/generate:\n\t@$(GOBIN)/grpc-federation-generator ./proto/federation/federation.proto\n\n.PHONY: grpc-federation/watch\ngrpc-federation/watch:\n\t@$(GOBIN)/grpc-federation-generator -w\n\n.PHONY: jaeger/start\njaeger/start:\n\t@docker run \\\n\t\t-e COLLECTOR_OTLP_ENABLED=true \\\n\t\t-p 16686:16686 \\\n\t\t-p 4317:4317 \\\n\t\t-p 4318:4318 \\\n\t\t-d \\\n\t\t$(JAEGER_IMAGE)\n\n.PHONY: jaeger/stop\njaeger/stop:\n\t@docker stop $(shell docker ps -q  --filter ancestor=$(JAEGER_IMAGE))\n"
  },
  {
    "path": "_examples/09_multi_user/buf.gen.yaml",
    "content": "version: v1\nmanaged:\n  enabled: true\nplugins:\n  - plugin: go\n    out: .\n    opt: paths=source_relative\n  - plugin: go-grpc\n    out: .\n    opt: paths=source_relative\n  - plugin: grpc-federation\n    out: .\n    opt:\n    - paths=source_relative\n    - import_paths=proto\n"
  },
  {
    "path": "_examples/09_multi_user/buf.work.yaml",
    "content": "version: v1\ndirectories:\n  - proto\n  - proto_deps\n"
  },
  {
    "path": "_examples/09_multi_user/federation/federation.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype GetRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *GetRequest) Reset() {\n\t*x = GetRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetRequest) ProtoMessage() {}\n\nfunc (x *GetRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetRequest.ProtoReflect.Descriptor instead.\nfunc (*GetRequest) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\ntype GetResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUser  *User `protobuf:\"bytes,1,opt,name=user,proto3\" json:\"user,omitempty\"`\n\tUser2 *User `protobuf:\"bytes,2,opt,name=user2,proto3\" json:\"user2,omitempty\"`\n}\n\nfunc (x *GetResponse) Reset() {\n\t*x = GetResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetResponse) ProtoMessage() {}\n\nfunc (x *GetResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetResponse.ProtoReflect.Descriptor instead.\nfunc (*GetResponse) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetResponse) GetUser() *User {\n\tif x != nil {\n\t\treturn x.User\n\t}\n\treturn nil\n}\n\nfunc (x *GetResponse) GetUser2() *User {\n\tif x != nil {\n\t\treturn x.User2\n\t}\n\treturn nil\n}\n\ntype User struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId   string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName string `protobuf:\"bytes,3,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *User) Reset() {\n\t*x = User{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *User) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*User) ProtoMessage() {}\n\nfunc (x *User) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use User.ProtoReflect.Descriptor instead.\nfunc (*User) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *User) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *User) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\ntype UserID struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tValue string `protobuf:\"bytes,1,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *UserID) Reset() {\n\t*x = UserID{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *UserID) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UserID) ProtoMessage() {}\n\nfunc (x *UserID) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UserID.ProtoReflect.Descriptor instead.\nfunc (*UserID) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *UserID) GetValue() string {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn \"\"\n}\n\ntype Sub struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *Sub) Reset() {\n\t*x = Sub{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Sub) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Sub) ProtoMessage() {}\n\nfunc (x *Sub) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Sub.ProtoReflect.Descriptor instead.\nfunc (*Sub) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{4}\n}\n\nvar File_federation_federation_proto protoreflect.FileDescriptor\n\nvar file_federation_federation_proto_rawDesc = []byte{\n\t0x0a, 0x1b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x6f,\n\t0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x20, 0x67,\n\t0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22,\n\t0x0c, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xdd, 0x01,\n\t0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a,\n\t0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x72,\n\t0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x55, 0x73, 0x65,\n\t0x72, 0x42, 0x09, 0x9a, 0x4a, 0x06, 0x12, 0x04, 0x75, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73,\n\t0x65, 0x72, 0x12, 0x36, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x32, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x42, 0x0a, 0x9a, 0x4a, 0x07, 0x12, 0x05, 0x75, 0x73,\n\t0x65, 0x72, 0x32, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x32, 0x3a, 0x61, 0x9a, 0x4a, 0x5e, 0x0a,\n\t0x0f, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x6a, 0x08, 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44,\n\t0x0a, 0x24, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x6a, 0x1c, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72,\n\t0x12, 0x14, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x12, 0x09, 0x75, 0x69, 0x64,\n\t0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x0a, 0x25, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x32, 0x6a,\n\t0x1c, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f,\n\t0x69, 0x64, 0x12, 0x09, 0x75, 0x69, 0x64, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x87, 0x01,\n\t0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x42, 0x05, 0x9a, 0x4a, 0x02, 0x08, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x3a, 0x54, 0x9a, 0x4a, 0x51, 0x0a, 0x32, 0x0a, 0x03, 0x72, 0x65, 0x73, 0x72, 0x2b, 0x0a,\n\t0x18, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,\n\t0x65, 0x2f, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x0f, 0x0a, 0x02, 0x69, 0x64, 0x12,\n\t0x09, 0x24, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x0a, 0x12, 0x0a, 0x04, 0x75, 0x73,\n\t0x65, 0x72, 0x18, 0x01, 0x5a, 0x08, 0x72, 0x65, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x0a, 0x07,\n\t0x6a, 0x05, 0x0a, 0x03, 0x53, 0x75, 0x62, 0x22, 0x38, 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49,\n\t0x44, 0x12, 0x20, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x42, 0x0a, 0x9a, 0x4a, 0x07, 0x12, 0x05, 0x27, 0x78, 0x78, 0x78, 0x27, 0x52, 0x05, 0x76, 0x61,\n\t0x6c, 0x75, 0x65, 0x3a, 0x0c, 0x9a, 0x4a, 0x09, 0x0a, 0x07, 0x6a, 0x05, 0x0a, 0x03, 0x53, 0x75,\n\t0x62, 0x22, 0x0c, 0x0a, 0x03, 0x53, 0x75, 0x62, 0x3a, 0x05, 0x9a, 0x4a, 0x02, 0x10, 0x01, 0x32,\n\t0x5a, 0x0a, 0x11, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72,\n\t0x76, 0x69, 0x63, 0x65, 0x12, 0x40, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x1a, 0x2e, 0x6f, 0x72,\n\t0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74,\n\t0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70,\n\t0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x1a, 0x03, 0x9a, 0x4a, 0x00, 0x42, 0xb1, 0x01, 0x9a, 0x4a,\n\t0x11, 0x12, 0x0f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0f, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x1d, 0x65, 0x78, 0x61, 0x6d, 0x70,\n\t0x6c, 0x65, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xa2, 0x02, 0x03, 0x4f, 0x46, 0x58, 0xaa, 0x02,\n\t0x0e, 0x4f, 0x72, 0x67, 0x2e, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xca,\n\t0x02, 0x0e, 0x4f, 0x72, 0x67, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0xe2, 0x02, 0x1a, 0x4f, 0x72, 0x67, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0f,\n\t0x4f, 0x72, 0x67, 0x3a, 0x3a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62,\n\t0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_federation_federation_proto_rawDescOnce sync.Once\n\tfile_federation_federation_proto_rawDescData = file_federation_federation_proto_rawDesc\n)\n\nfunc file_federation_federation_proto_rawDescGZIP() []byte {\n\tfile_federation_federation_proto_rawDescOnce.Do(func() {\n\t\tfile_federation_federation_proto_rawDescData = protoimpl.X.CompressGZIP(file_federation_federation_proto_rawDescData)\n\t})\n\treturn file_federation_federation_proto_rawDescData\n}\n\nvar file_federation_federation_proto_msgTypes = make([]protoimpl.MessageInfo, 5)\nvar file_federation_federation_proto_goTypes = []interface{}{\n\t(*GetRequest)(nil),  // 0: org.federation.GetRequest\n\t(*GetResponse)(nil), // 1: org.federation.GetResponse\n\t(*User)(nil),        // 2: org.federation.User\n\t(*UserID)(nil),      // 3: org.federation.UserID\n\t(*Sub)(nil),         // 4: org.federation.Sub\n}\nvar file_federation_federation_proto_depIdxs = []int32{\n\t2, // 0: org.federation.GetResponse.user:type_name -> org.federation.User\n\t2, // 1: org.federation.GetResponse.user2:type_name -> org.federation.User\n\t0, // 2: org.federation.FederationService.Get:input_type -> org.federation.GetRequest\n\t1, // 3: org.federation.FederationService.Get:output_type -> org.federation.GetResponse\n\t3, // [3:4] is the sub-list for method output_type\n\t2, // [2:3] is the sub-list for method input_type\n\t2, // [2:2] is the sub-list for extension type_name\n\t2, // [2:2] is the sub-list for extension extendee\n\t0, // [0:2] is the sub-list for field type_name\n}\n\nfunc init() { file_federation_federation_proto_init() }\nfunc file_federation_federation_proto_init() {\n\tif File_federation_federation_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_federation_federation_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*User); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*UserID); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Sub); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_federation_federation_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   5,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_federation_federation_proto_goTypes,\n\t\tDependencyIndexes: file_federation_federation_proto_depIdxs,\n\t\tMessageInfos:      file_federation_federation_proto_msgTypes,\n\t}.Build()\n\tFile_federation_federation_proto = out.File\n\tfile_federation_federation_proto_rawDesc = nil\n\tfile_federation_federation_proto_goTypes = nil\n\tfile_federation_federation_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/09_multi_user/federation/federation_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tFederationService_Get_FullMethodName = \"/org.federation.FederationService/Get\"\n)\n\n// FederationServiceClient is the client API for FederationService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype FederationServiceClient interface {\n\tGet(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error)\n}\n\ntype federationServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewFederationServiceClient(cc grpc.ClientConnInterface) FederationServiceClient {\n\treturn &federationServiceClient{cc}\n}\n\nfunc (c *federationServiceClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) {\n\tout := new(GetResponse)\n\terr := c.cc.Invoke(ctx, FederationService_Get_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// FederationServiceServer is the server API for FederationService service.\n// All implementations must embed UnimplementedFederationServiceServer\n// for forward compatibility\ntype FederationServiceServer interface {\n\tGet(context.Context, *GetRequest) (*GetResponse, error)\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\n// UnimplementedFederationServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedFederationServiceServer struct {\n}\n\nfunc (UnimplementedFederationServiceServer) Get(context.Context, *GetRequest) (*GetResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method Get not implemented\")\n}\nfunc (UnimplementedFederationServiceServer) mustEmbedUnimplementedFederationServiceServer() {}\n\n// UnsafeFederationServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to FederationServiceServer will\n// result in compilation errors.\ntype UnsafeFederationServiceServer interface {\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\nfunc RegisterFederationServiceServer(s grpc.ServiceRegistrar, srv FederationServiceServer) {\n\ts.RegisterService(&FederationService_ServiceDesc, srv)\n}\n\nfunc _FederationService_Get_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(FederationServiceServer).Get(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: FederationService_Get_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(FederationServiceServer).Get(ctx, req.(*GetRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// FederationService_ServiceDesc is the grpc.ServiceDesc for FederationService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar FederationService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"org.federation.FederationService\",\n\tHandlerType: (*FederationServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"Get\",\n\t\t\tHandler:    _FederationService_Get_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"federation/federation.proto\",\n}\n"
  },
  {
    "path": "_examples/09_multi_user/federation/federation_grpc_federation.pb.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: federation/federation.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n\n\tuser \"example/user\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Org_Federation_GetResponseVariable represents variable definitions in \"org.federation.GetResponse\".\ntype FederationService_Org_Federation_GetResponseVariable struct {\n\tUid   *UserID\n\tUser  *User\n\tUser2 *User\n}\n\n// Org_Federation_GetResponseArgument is argument for \"org.federation.GetResponse\" message.\ntype FederationService_Org_Federation_GetResponseArgument struct {\n\tFederationService_Org_Federation_GetResponseVariable\n}\n\n// Org_Federation_SubVariable represents variable definitions in \"org.federation.Sub\".\ntype FederationService_Org_Federation_SubVariable struct {\n}\n\n// Org_Federation_SubArgument is argument for \"org.federation.Sub\" message.\ntype FederationService_Org_Federation_SubArgument struct {\n\tFederationService_Org_Federation_SubVariable\n}\n\n// Org_Federation_UserVariable represents variable definitions in \"org.federation.User\".\ntype FederationService_Org_Federation_UserVariable struct {\n\tRes   *user.GetUserResponse\n\tUser  *user.User\n\tXDef2 *Sub\n}\n\n// Org_Federation_UserArgument is argument for \"org.federation.User\" message.\ntype FederationService_Org_Federation_UserArgument struct {\n\tUserId string\n\tFederationService_Org_Federation_UserVariable\n}\n\n// Org_Federation_UserIDVariable represents variable definitions in \"org.federation.UserID\".\ntype FederationService_Org_Federation_UserIDVariable struct {\n}\n\n// Org_Federation_UserIDArgument is argument for \"org.federation.UserID\" message.\ntype FederationService_Org_Federation_UserIDArgument struct {\n\tFederationService_Org_Federation_UserIDVariable\n}\n\n// Org_Federation_User_NameArgument is custom resolver's argument for \"name\" field of \"org.federation.User\" message.\ntype FederationService_Org_Federation_User_NameArgument struct {\n\t*FederationService_Org_Federation_UserArgument\n}\n\n// FederationServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationServiceConfig struct {\n\t// Client provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\n\t// If this interface is not provided, an error is returned during initialization.\n\tClient FederationServiceClientFactory // required\n\t// Resolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\n\t// If this interface is not provided, an error is returned during initialization.\n\tResolver FederationServiceResolver // required\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationServiceClientFactory interface {\n\t// User_UserServiceClient create a gRPC Client to be used to call methods in user.UserService.\n\tUser_UserServiceClient(FederationServiceClientConfig) (user.UserServiceClient, error)\n}\n\n// FederationServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationServiceDependentClientSet struct {\n\tUser_UserServiceClient user.UserServiceClient\n}\n\n// FederationServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationServiceResolver interface {\n\t// Resolve_Org_Federation_Sub implements resolver for \"org.federation.Sub\".\n\tResolve_Org_Federation_Sub(context.Context, *FederationService_Org_Federation_SubArgument) (*Sub, error)\n\t// Resolve_Org_Federation_User_Name implements resolver for \"org.federation.User.name\".\n\tResolve_Org_Federation_User_Name(context.Context, *FederationService_Org_Federation_User_NameArgument) (string, error)\n}\n\n// FederationServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// FederationServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationServiceUnimplementedResolver struct{}\n\n// Resolve_Org_Federation_Sub resolve \"org.federation.Sub\".\n// This method always returns Unimplemented error.\nfunc (FederationServiceUnimplementedResolver) Resolve_Org_Federation_Sub(context.Context, *FederationService_Org_Federation_SubArgument) (ret *Sub, e error) {\n\te = grpcfed.GRPCErrorf(grpcfed.UnimplementedCode, \"method Resolve_Org_Federation_Sub not implemented\")\n\treturn\n}\n\n// Resolve_Org_Federation_User_Name resolve \"org.federation.User.name\".\n// This method always returns Unimplemented error.\nfunc (FederationServiceUnimplementedResolver) Resolve_Org_Federation_User_Name(context.Context, *FederationService_Org_Federation_User_NameArgument) (ret string, e error) {\n\te = grpcfed.GRPCErrorf(grpcfed.UnimplementedCode, \"method Resolve_Org_Federation_User_Name not implemented\")\n\treturn\n}\n\nconst (\n\tFederationService_DependentMethod_User_UserService_GetUser = \"/user.UserService/GetUser\"\n)\n\n// FederationService represents Federation Service.\ntype FederationService struct {\n\tUnimplementedFederationServiceServer\n\tcfg             FederationServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tresolver        FederationServiceResolver\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationServiceDependentClientSet\n}\n\n// NewFederationService creates FederationService instance by FederationServiceConfig.\nfunc NewFederationService(cfg FederationServiceConfig) (*FederationService, error) {\n\tif cfg.Client == nil {\n\t\treturn nil, grpcfed.ErrClientConfig\n\t}\n\tif cfg.Resolver == nil {\n\t\treturn nil, grpcfed.ErrResolverConfig\n\t}\n\tUser_UserServiceClient, err := cfg.Client.User_UserServiceClient(FederationServiceClientConfig{\n\t\tService: \"user.UserService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"org.federation.FederationService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.org.federation.GetResponseArgument\": {},\n\t\t\"grpc.federation.private.org.federation.SubArgument\":         {},\n\t\t\"grpc.federation.private.org.federation.UserArgument\": {\n\t\t\t\"user_id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"UserId\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.UserIDArgument\": {},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"org.federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.GRPCErrorAccessorOptions(celTypeHelper, \"user.GetUserResponse\")...)\n\tsvc := &FederationService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tresolver:        cfg.Resolver,\n\t\tclient: &FederationServiceDependentClientSet{\n\t\t\tUser_UserServiceClient: User_UserServiceClient,\n\t\t},\n\t}\n\tif resolver, ok := cfg.Resolver.(grpcfed.CustomResolverInitializer); ok {\n\t\tctx := context.Background()\n\t\tif err := resolver.Init(ctx); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationService(ctx context.Context, svc *FederationService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n// Get implements \"org.federation.FederationService/Get\" method.\nfunc (s *FederationService) Get(ctx context.Context, req *GetRequest) (res *GetResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.FederationService/Get\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Org_Federation_GetResponse(ctx, &FederationService_Org_Federation_GetResponseArgument{})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Org_Federation_GetResponse resolve \"org.federation.GetResponse\" message.\nfunc (s *FederationService) resolve_Org_Federation_GetResponse(ctx context.Context, req *FederationService_Org_Federation_GetResponseArgument) (*GetResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.GetResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.GetResponse\", slog.Any(\"message_args\", s.logvalue_Org_Federation_GetResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tUid   *UserID\n\t\t\tUser  *User\n\t\t\tUser2 *User\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.GetResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"uid\"\n\t\t  message {\n\t\t    name: \"UserID\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_uid := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*UserID, *localValueType]{\n\t\t\tName: `uid`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.UserID\"),\n\t\t\tSetter: func(value *localValueType, v *UserID) error {\n\t\t\t\tvalue.vars.Uid = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_UserIDArgument{}\n\t\t\t\tret, err := s.resolve_Org_Federation_UserID(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"user\"\n\t\t  message {\n\t\t    name: \"User\"\n\t\t    args { name: \"user_id\", by: \"uid.value\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_user := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*User, *localValueType]{\n\t\t\tName: `user`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.User\"),\n\t\t\tSetter: func(value *localValueType, v *User) error {\n\t\t\t\tvalue.vars.User = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_UserArgument{}\n\t\t\t\t// { name: \"user_id\", by: \"uid.value\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `uid.value`,\n\t\t\t\t\tCacheIndex: 1,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.UserId = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_User(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"user2\"\n\t\t  message {\n\t\t    name: \"User\"\n\t\t    args { name: \"user_id\", by: \"uid.value\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_user2 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*User, *localValueType]{\n\t\t\tName: `user2`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.User\"),\n\t\t\tSetter: func(value *localValueType, v *User) error {\n\t\t\t\tvalue.vars.User2 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_UserArgument{}\n\t\t\t\t// { name: \"user_id\", by: \"uid.value\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `uid.value`,\n\t\t\t\t\tCacheIndex: 2,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.UserId = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_User(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t   uid ─┐\n\t         user ─┐\n\t   uid ─┐      │\n\t        user2 ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_uid(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_user(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_uid(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_user2(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_GetResponseVariable.Uid = value.vars.Uid\n\treq.FederationService_Org_Federation_GetResponseVariable.User = value.vars.User\n\treq.FederationService_Org_Federation_GetResponseVariable.User2 = value.vars.User2\n\n\t// create a message value to be returned.\n\tret := &GetResponse{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"user\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*User]{\n\t\tValue:      value,\n\t\tExpr:       `user`,\n\t\tCacheIndex: 3,\n\t\tSetter: func(v *User) error {\n\t\t\tret.User = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"user2\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*User]{\n\t\tValue:      value,\n\t\tExpr:       `user2`,\n\t\tCacheIndex: 4,\n\t\tSetter: func(v *User) error {\n\t\t\tret.User2 = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.GetResponse\", slog.Any(\"org.federation.GetResponse\", s.logvalue_Org_Federation_GetResponse(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_Sub resolve \"org.federation.Sub\" message.\nfunc (s *FederationService) resolve_Org_Federation_Sub(ctx context.Context, req *FederationService_Org_Federation_SubArgument) (*Sub, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.Sub\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.Sub\", slog.Any(\"message_args\", s.logvalue_Org_Federation_SubArgument(req)))\n\n\t// create a message value to be returned.\n\t// `custom_resolver = true` in \"grpc.federation.message\" option.\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx)) // create a new reference to logger.\n\tret, err := s.resolver.Resolve_Org_Federation_Sub(ctx, req)\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.Sub\", slog.Any(\"org.federation.Sub\", s.logvalue_Org_Federation_Sub(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_User resolve \"org.federation.User\" message.\nfunc (s *FederationService) resolve_Org_Federation_User(ctx context.Context, req *FederationService_Org_Federation_UserArgument) (*User, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.User\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.User\", slog.Any(\"message_args\", s.logvalue_Org_Federation_UserArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tRes   *user.GetUserResponse\n\t\t\tUser  *user.User\n\t\t\tXDef2 *Sub\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.UserArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"user.UserService/GetUser\"\n\t\t    request { field: \"id\", by: \"$.user_id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*user.GetUserResponse, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"user.GetUserResponse\"),\n\t\t\tSetter: func(value *localValueType, v *user.GetUserResponse) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &user.GetUserRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.user_id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.user_id`,\n\t\t\t\t\tCacheIndex: 5,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call user.UserService/GetUser\", slog.Any(\"user.GetUserRequest\", s.logvalue_User_GetUserRequest(args)))\n\t\t\t\tret, err := s.client.User_UserServiceClient.GetUser(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_User_UserService_GetUser, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"user\"\n\t\t  autobind: true\n\t\t  by: \"res.user\"\n\t\t}\n\t*/\n\tdef_user := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*user.User, *localValueType]{\n\t\t\tName: `user`,\n\t\t\tType: grpcfed.CELObjectType(\"user.User\"),\n\t\t\tSetter: func(value *localValueType, v *user.User) error {\n\t\t\t\tvalue.vars.User = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `res.user`,\n\t\t\tByCacheIndex: 6,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"_def2\"\n\t\t  message {\n\t\t    name: \"Sub\"\n\t\t  }\n\t\t}\n\t*/\n\tdef__def2 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Sub, *localValueType]{\n\t\t\tName: `_def2`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.Sub\"),\n\t\t\tSetter: func(value *localValueType, v *Sub) error {\n\t\t\t\tvalue.vars.XDef2 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_SubArgument{}\n\t\t\t\tret, err := s.resolve_Org_Federation_Sub(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t        _def2 ─┐\n\t   res ─┐      │\n\t         user ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def__def2(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_user(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_UserVariable.Res = value.vars.Res\n\treq.FederationService_Org_Federation_UserVariable.User = value.vars.User\n\treq.FederationService_Org_Federation_UserVariable.XDef2 = value.vars.XDef2\n\n\t// create a message value to be returned.\n\tret := &User{}\n\n\t// field binding section.\n\tret.Id = value.vars.User.GetId() // { name: \"user\", autobind: true }\n\t{\n\t\t// (grpc.federation.field).custom_resolver = true\n\t\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx)) // create a new reference to logger.\n\t\tvar err error\n\t\tret.Name, err = s.resolver.Resolve_Org_Federation_User_Name(ctx, &FederationService_Org_Federation_User_NameArgument{\n\t\t\tFederationService_Org_Federation_UserArgument: req,\n\t\t})\n\t\tif err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.User\", slog.Any(\"org.federation.User\", s.logvalue_Org_Federation_User(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_UserID resolve \"org.federation.UserID\" message.\nfunc (s *FederationService) resolve_Org_Federation_UserID(ctx context.Context, req *FederationService_Org_Federation_UserIDArgument) (*UserID, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.UserID\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.UserID\", slog.Any(\"message_args\", s.logvalue_Org_Federation_UserIDArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tXDef0 *Sub\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.UserIDArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"_def0\"\n\t\t  message {\n\t\t    name: \"Sub\"\n\t\t  }\n\t\t}\n\t*/\n\tdef__def0 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Sub, *localValueType]{\n\t\t\tName: `_def0`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.Sub\"),\n\t\t\tSetter: func(value *localValueType, v *Sub) error {\n\t\t\t\tvalue.vars.XDef0 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_SubArgument{}\n\t\t\t\tret, err := s.resolve_Org_Federation_Sub(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def__def0(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// create a message value to be returned.\n\tret := &UserID{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'xxx'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'xxx'`,\n\t\tCacheIndex: 7,\n\t\tSetter: func(v string) error {\n\t\t\tret.Value = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.UserID\", slog.Any(\"org.federation.UserID\", s.logvalue_Org_Federation_UserID(ret)))\n\treturn ret, nil\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetResponse(v *GetResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"user\", s.logvalue_Org_Federation_User(v.GetUser())),\n\t\tslog.Any(\"user2\", s.logvalue_Org_Federation_User(v.GetUser2())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetResponseArgument(v *FederationService_Org_Federation_GetResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_Sub(v *Sub) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_SubArgument(v *FederationService_Org_Federation_SubArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_User(v *User) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_UserArgument(v *FederationService_Org_Federation_UserArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"user_id\", v.UserId),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_UserID(v *UserID) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"value\", v.GetValue()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_UserIDArgument(v *FederationService_Org_Federation_UserIDArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_User_GetUserRequest(v *user.GetUserRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t)\n}\n"
  },
  {
    "path": "_examples/09_multi_user/go.mod",
    "content": "module example\n\ngo 1.24.0\n\nreplace github.com/mercari/grpc-federation => ../../\n\nrequire (\n\tgithub.com/google/go-cmp v0.7.0\n\tgithub.com/mercari/grpc-federation v0.0.0-00010101000000-000000000000\n\tgo.opentelemetry.io/otel v1.24.0\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0\n\tgo.opentelemetry.io/otel/sdk v1.24.0\n\tgo.opentelemetry.io/otel/trace v1.24.0\n\tgo.uber.org/goleak v1.3.0\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7\n\tgoogle.golang.org/grpc v1.65.0\n\tgoogle.golang.org/protobuf v1.34.2\n)\n\nrequire (\n\tcel.dev/expr v0.19.1 // indirect\n\tgithub.com/antlr4-go/antlr/v4 v4.13.0 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.2.1 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/goccy/wasi-go v0.3.2 // indirect\n\tgithub.com/google/cel-go v0.23.1 // indirect\n\tgithub.com/google/uuid v1.6.0 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect\n\tgithub.com/kelseyhightower/envconfig v1.4.0 // indirect\n\tgithub.com/stealthrocket/wazergo v0.19.1 // indirect\n\tgithub.com/stoewer/go-strcase v1.3.0 // indirect\n\tgithub.com/tetratelabs/wazero v1.10.1 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.24.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.0.0 // indirect\n\tgolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect\n\tgolang.org/x/net v0.38.0 // indirect\n\tgolang.org/x/sync v0.14.0 // indirect\n\tgolang.org/x/sys v0.37.0 // indirect\n\tgolang.org/x/text v0.23.0 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 // indirect\n)\n"
  },
  {
    "path": "_examples/09_multi_user/go.sum",
    "content": "cel.dev/expr v0.19.1 h1:NciYrtDRIR0lNCnH1LFJegdjspNx9fI59O7TWcua/W4=\ncel.dev/expr v0.19.1/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw=\ngithub.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=\ngithub.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/goccy/wasi-go v0.3.2 h1:wAvGXmqCkfcp0B0AwIp5Ya53hzDwkKm9W8iuT3nCCz0=\ngithub.com/goccy/wasi-go v0.3.2/go.mod h1:nIKD204n9xa4Z20UV+XA483kIr9TAl2vXr+X5qVAO5M=\ngithub.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4=\ngithub.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=\ngithub.com/google/cel-go v0.23.1 h1:91ThhEZlBcE5rB2adBVXqvDoqdL8BG2oyhd0bK1I/r4=\ngithub.com/google/cel-go v0.23.1/go.mod h1:52Pb6QsDbC5kvgxvZhiL9QX1oZEkcUF/ZqaPx1J5Wwo=\ngithub.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\ngithub.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg=\ngithub.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=\ngithub.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/stealthrocket/wazergo v0.19.1 h1:BPrITETPgSFwiytwmToO0MbUC/+RGC39JScz1JmmG6c=\ngithub.com/stealthrocket/wazergo v0.19.1/go.mod h1:riI0hxw4ndZA5e6z7PesHg2BtTftcZaMxRcoiGGipTs=\ngithub.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs=\ngithub.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tetratelabs/wazero v1.10.1 h1:2DugeJf6VVk58KTPszlNfeeN8AhhpwcZqkJj2wwFuH8=\ngithub.com/tetratelabs/wazero v1.10.1/go.mod h1:DRm5twOQ5Gr1AoEdSi0CLjDQF1J9ZAuyqFIjl1KKfQU=\ngo.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo=\ngo.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0=\ngo.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI=\ngo.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=\ngo.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw=\ngo.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg=\ngo.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=\ngo.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=\ngo.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=\ngo.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=\ngolang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=\ngolang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=\ngolang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=\ngolang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=\ngolang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=\ngolang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=\ngolang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 h1:YcyjlL1PRr2Q17/I0dPk2JmYS5CDXfcdb2Z3YRioEbw=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7 h1:2035KHhUv+EpyB+hWgJnaWKJOdX1E95w2S8Rr4uWKTs=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=\ngoogle.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=\ngoogle.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=\ngoogle.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=\ngoogle.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "_examples/09_multi_user/grpc/federation/federation.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: grpc/federation/federation.proto\n\npackage federation\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\tcode \"google.golang.org/genproto/googleapis/rpc/code\"\n\terrdetails \"google.golang.org/genproto/googleapis/rpc/errdetails\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tdescriptorpb \"google.golang.org/protobuf/types/descriptorpb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// TypeKind is primitive kind list.\ntype TypeKind int32\n\nconst (\n\t// UNKNOWN represents unexpected value.\n\tTypeKind_UNKNOWN TypeKind = 0\n\t// STRING is used to convert the input value to `string` type.\n\tTypeKind_STRING TypeKind = 1\n\t// BOOL is used to convert the input value to `bool` type.\n\tTypeKind_BOOL TypeKind = 2\n\t// INT64 is used to convert the input value to `int64` type.\n\tTypeKind_INT64 TypeKind = 3\n\t// UINT64 is used to convert the input value to `uint64` type.\n\tTypeKind_UINT64 TypeKind = 4\n\t// DOUBLE is used to convert the input value to `double` type.\n\tTypeKind_DOUBLE TypeKind = 5\n\t// DURATION is used to convert the input value to the `google.protobuf.Duration` type.\n\tTypeKind_DURATION TypeKind = 6\n)\n\n// Enum value maps for TypeKind.\nvar (\n\tTypeKind_name = map[int32]string{\n\t\t0: \"UNKNOWN\",\n\t\t1: \"STRING\",\n\t\t2: \"BOOL\",\n\t\t3: \"INT64\",\n\t\t4: \"UINT64\",\n\t\t5: \"DOUBLE\",\n\t\t6: \"DURATION\",\n\t}\n\tTypeKind_value = map[string]int32{\n\t\t\"UNKNOWN\":  0,\n\t\t\"STRING\":   1,\n\t\t\"BOOL\":     2,\n\t\t\"INT64\":    3,\n\t\t\"UINT64\":   4,\n\t\t\"DOUBLE\":   5,\n\t\t\"DURATION\": 6,\n\t}\n)\n\nfunc (x TypeKind) Enum() *TypeKind {\n\tp := new(TypeKind)\n\t*p = x\n\treturn p\n}\n\nfunc (x TypeKind) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (TypeKind) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_grpc_federation_federation_proto_enumTypes[0].Descriptor()\n}\n\nfunc (TypeKind) Type() protoreflect.EnumType {\n\treturn &file_grpc_federation_federation_proto_enumTypes[0]\n}\n\nfunc (x TypeKind) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use TypeKind.Descriptor instead.\nfunc (TypeKind) EnumDescriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\n// LogLevel is the importance or severity of a log event.\ntype GRPCError_LogLevel int32\n\nconst (\n\t// UNKNOWN represents unexpected value.\n\tGRPCError_UNKNOWN GRPCError_LogLevel = 0\n\t// DEBUG is used for detailed information that is useful during development and debugging.\n\tGRPCError_DEBUG GRPCError_LogLevel = 1\n\t// INFO logs are used to provide information about the normal functioning of the application.\n\tGRPCError_INFO GRPCError_LogLevel = 2\n\t// WARN signifies a potential problem or warning that does not necessarily stop the program from working but may lead to issues in the future.\n\tGRPCError_WARN GRPCError_LogLevel = 3\n\t// ERROR indicates a serious issue that has caused a failure in the application.\n\tGRPCError_ERROR GRPCError_LogLevel = 4\n)\n\n// Enum value maps for GRPCError_LogLevel.\nvar (\n\tGRPCError_LogLevel_name = map[int32]string{\n\t\t0: \"UNKNOWN\",\n\t\t1: \"DEBUG\",\n\t\t2: \"INFO\",\n\t\t3: \"WARN\",\n\t\t4: \"ERROR\",\n\t}\n\tGRPCError_LogLevel_value = map[string]int32{\n\t\t\"UNKNOWN\": 0,\n\t\t\"DEBUG\":   1,\n\t\t\"INFO\":    2,\n\t\t\"WARN\":    3,\n\t\t\"ERROR\":   4,\n\t}\n)\n\nfunc (x GRPCError_LogLevel) Enum() *GRPCError_LogLevel {\n\tp := new(GRPCError_LogLevel)\n\t*p = x\n\treturn p\n}\n\nfunc (x GRPCError_LogLevel) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (GRPCError_LogLevel) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_grpc_federation_federation_proto_enumTypes[1].Descriptor()\n}\n\nfunc (GRPCError_LogLevel) Type() protoreflect.EnumType {\n\treturn &file_grpc_federation_federation_proto_enumTypes[1]\n}\n\nfunc (x GRPCError_LogLevel) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use GRPCError_LogLevel.Descriptor instead.\nfunc (GRPCError_LogLevel) EnumDescriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{24, 0}\n}\n\ntype FileRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPlugin *CELPlugin `protobuf:\"bytes,1,opt,name=plugin,proto3\" json:\"plugin,omitempty\"`\n\t// import can be used to resolve methods, messages, etc. that are referenced in gRPC Federation rules.\n\tImport []string `protobuf:\"bytes,2,rep,name=import,proto3\" json:\"import,omitempty\"`\n}\n\nfunc (x *FileRule) Reset() {\n\t*x = FileRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *FileRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*FileRule) ProtoMessage() {}\n\nfunc (x *FileRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use FileRule.ProtoReflect.Descriptor instead.\nfunc (*FileRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *FileRule) GetPlugin() *CELPlugin {\n\tif x != nil {\n\t\treturn x.Plugin\n\t}\n\treturn nil\n}\n\nfunc (x *FileRule) GetImport() []string {\n\tif x != nil {\n\t\treturn x.Import\n\t}\n\treturn nil\n}\n\ntype EnumRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// alias mapping between enums defined in other packages and enums defined on the federation service side.\n\t// The alias is the FQDN ( <package-name>.<enum-name> ) to the enum.\n\t// If this definition exists, type conversion is automatically performed before the enum value assignment operation.\n\t// If a enum with this option has a value that is not present in the enum specified by alias, and the alias option is not specified for that value, an error is occurred.\n\t// You can specify multiple aliases. In that case, only values common to all aliases will be considered.\n\t// Specifying a value that is not included in either alias will result in an error.\n\tAlias []string `protobuf:\"bytes,1,rep,name=alias,proto3\" json:\"alias,omitempty\"`\n}\n\nfunc (x *EnumRule) Reset() {\n\t*x = EnumRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumRule) ProtoMessage() {}\n\nfunc (x *EnumRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumRule.ProtoReflect.Descriptor instead.\nfunc (*EnumRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *EnumRule) GetAlias() []string {\n\tif x != nil {\n\t\treturn x.Alias\n\t}\n\treturn nil\n}\n\ntype EnumValueRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// specifies the default value of the enum.\n\t// All values other than those specified in alias will be default values.\n\tDefault *bool `protobuf:\"varint,1,opt,name=default,proto3,oneof\" json:\"default,omitempty\"`\n\t// alias can be used when alias is specified in grpc.federation.enum option,\n\t// and specifies the value name to be referenced among the enums specified in alias of enum option.\n\t// multiple value names can be specified for alias.\n\tAlias []string `protobuf:\"bytes,2,rep,name=alias,proto3\" json:\"alias,omitempty\"`\n\t// attr is used to hold multiple name-value pairs corresponding to an enum value.\n\t// The values specified by the name must be consistently specified for all enum values.\n\t// The values stored using this feature can be retrieved using the `attr()` method of the enum API.\n\tAttr []*EnumValueAttribute `protobuf:\"bytes,3,rep,name=attr,proto3\" json:\"attr,omitempty\"`\n\t// noalias exclude from the target of alias.\n\t// This option cannot be specified simultaneously with `default` or `alias`.\n\tNoalias *bool `protobuf:\"varint,4,opt,name=noalias,proto3,oneof\" json:\"noalias,omitempty\"`\n}\n\nfunc (x *EnumValueRule) Reset() {\n\t*x = EnumValueRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumValueRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumValueRule) ProtoMessage() {}\n\nfunc (x *EnumValueRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumValueRule.ProtoReflect.Descriptor instead.\nfunc (*EnumValueRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *EnumValueRule) GetDefault() bool {\n\tif x != nil && x.Default != nil {\n\t\treturn *x.Default\n\t}\n\treturn false\n}\n\nfunc (x *EnumValueRule) GetAlias() []string {\n\tif x != nil {\n\t\treturn x.Alias\n\t}\n\treturn nil\n}\n\nfunc (x *EnumValueRule) GetAttr() []*EnumValueAttribute {\n\tif x != nil {\n\t\treturn x.Attr\n\t}\n\treturn nil\n}\n\nfunc (x *EnumValueRule) GetNoalias() bool {\n\tif x != nil && x.Noalias != nil {\n\t\treturn *x.Noalias\n\t}\n\treturn false\n}\n\ntype EnumValueAttribute struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the attribute key.\n\t// This value is used to search for values using the `attr(<name>)` method.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// value represents the value corresponding to `name`.\n\tValue string `protobuf:\"bytes,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *EnumValueAttribute) Reset() {\n\t*x = EnumValueAttribute{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumValueAttribute) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumValueAttribute) ProtoMessage() {}\n\nfunc (x *EnumValueAttribute) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumValueAttribute.ProtoReflect.Descriptor instead.\nfunc (*EnumValueAttribute) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *EnumValueAttribute) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnumValueAttribute) GetValue() string {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn \"\"\n}\n\ntype OneofRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *OneofRule) Reset() {\n\t*x = OneofRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *OneofRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*OneofRule) ProtoMessage() {}\n\nfunc (x *OneofRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use OneofRule.ProtoReflect.Descriptor instead.\nfunc (*OneofRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{4}\n}\n\n// ServiceRule define gRPC Federation rules for the service.\ntype ServiceRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// env defines the environment variable.\n\tEnv *Env `protobuf:\"bytes,1,opt,name=env,proto3\" json:\"env,omitempty\"`\n\t// var defines the service-level variables.\n\tVar []*ServiceVariable `protobuf:\"bytes,2,rep,name=var,proto3\" json:\"var,omitempty\"`\n}\n\nfunc (x *ServiceRule) Reset() {\n\t*x = ServiceRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceRule) ProtoMessage() {}\n\nfunc (x *ServiceRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceRule.ProtoReflect.Descriptor instead.\nfunc (*ServiceRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *ServiceRule) GetEnv() *Env {\n\tif x != nil {\n\t\treturn x.Env\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceRule) GetVar() []*ServiceVariable {\n\tif x != nil {\n\t\treturn x.Var\n\t}\n\treturn nil\n}\n\n// Env is used when setting environment variables.\n// There are two ways to configure it.\ntype Env struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// var is used to directly list environment variables.\n\tVar []*EnvVar `protobuf:\"bytes,1,rep,name=var,proto3\" json:\"var,omitempty\"`\n\t// message is used to reference an already defined Protocol Buffers' message for defining environment variables.\n\t// If you want to set detailed options for the fields of the message, use the `env` option in FieldRule.\n\tMessage string `protobuf:\"bytes,2,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Env) Reset() {\n\t*x = Env{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Env) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Env) ProtoMessage() {}\n\nfunc (x *Env) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Env.ProtoReflect.Descriptor instead.\nfunc (*Env) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *Env) GetVar() []*EnvVar {\n\tif x != nil {\n\t\treturn x.Var\n\t}\n\treturn nil\n}\n\nfunc (x *Env) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\n// ServiceVariable define variables at the service level.\n// This definition is executed at server startup, after the initialization of Env.\n// The defined variables can be used across all messages that the service depends on.\ntype ServiceVariable struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is a variable name.\n\t// This name can be referenced in all CELs related to the service by using `grpc.federation.var.` prefix.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// if specify the condition for evaluating expr.\n\t// this value evaluated by CEL and it must return a boolean value.\n\t// If the result of evaluation is `false`, the value assigned to name is the default value of the result of evaluation of `expr`.\n\tIf *string `protobuf:\"bytes,2,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n\t// expr specify the value to be assigned to name.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*ServiceVariable_By\n\t//\t*ServiceVariable_Map\n\t//\t*ServiceVariable_Message\n\t//\t*ServiceVariable_Validation\n\t//\t*ServiceVariable_Enum\n\t//\t*ServiceVariable_Switch\n\tExpr isServiceVariable_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *ServiceVariable) Reset() {\n\t*x = ServiceVariable{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceVariable) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceVariable) ProtoMessage() {}\n\nfunc (x *ServiceVariable) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceVariable.ProtoReflect.Descriptor instead.\nfunc (*ServiceVariable) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{7}\n}\n\nfunc (x *ServiceVariable) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *ServiceVariable) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\nfunc (m *ServiceVariable) GetExpr() isServiceVariable_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetBy() string {\n\tif x, ok := x.GetExpr().(*ServiceVariable_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *ServiceVariable) GetMap() *MapExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetMessage() *MessageExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetValidation() *ServiceVariableValidationExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Validation); ok {\n\t\treturn x.Validation\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetEnum() *EnumExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetSwitch() *SwitchExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Switch); ok {\n\t\treturn x.Switch\n\t}\n\treturn nil\n}\n\ntype isServiceVariable_Expr interface {\n\tisServiceVariable_Expr()\n}\n\ntype ServiceVariable_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\ntype ServiceVariable_Map struct {\n\t// map apply map operation for the specified repeated type.\n\tMap *MapExpr `protobuf:\"bytes,12,opt,name=map,proto3,oneof\"`\n}\n\ntype ServiceVariable_Message struct {\n\t// message gets with message arguments.\n\tMessage *MessageExpr `protobuf:\"bytes,13,opt,name=message,proto3,oneof\"`\n}\n\ntype ServiceVariable_Validation struct {\n\t// validation defines the validation rule and message.\n\tValidation *ServiceVariableValidationExpr `protobuf:\"bytes,14,opt,name=validation,proto3,oneof\"`\n}\n\ntype ServiceVariable_Enum struct {\n\t// enum gets with cel value.\n\tEnum *EnumExpr `protobuf:\"bytes,15,opt,name=enum,proto3,oneof\"`\n}\n\ntype ServiceVariable_Switch struct {\n\t// switch provides conditional evaluation with multiple branches.\n\tSwitch *SwitchExpr `protobuf:\"bytes,16,opt,name=switch,proto3,oneof\"`\n}\n\nfunc (*ServiceVariable_By) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Map) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Message) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Validation) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Enum) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Switch) isServiceVariable_Expr() {}\n\n// ServiceVariableValidationExpr represents validation rule and error message.\ntype ServiceVariableValidationExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// if specifies condition in CEL. If the condition is true, it returns error.\n\t// The return value must always be of type boolean.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3\" json:\"if,omitempty\"`\n\t// message is a error message in CEL.\n\tMessage string `protobuf:\"bytes,2,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *ServiceVariableValidationExpr) Reset() {\n\t*x = ServiceVariableValidationExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceVariableValidationExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceVariableValidationExpr) ProtoMessage() {}\n\nfunc (x *ServiceVariableValidationExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceVariableValidationExpr.ProtoReflect.Descriptor instead.\nfunc (*ServiceVariableValidationExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{8}\n}\n\nfunc (x *ServiceVariableValidationExpr) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *ServiceVariableValidationExpr) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\n// EnvVar represents an environment variable.\ntype EnvVar struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is an environment variable name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// type is an environment variable type.\n\tType *EnvType `protobuf:\"bytes,2,opt,name=type,proto3\" json:\"type,omitempty\"`\n\t// option is an additional option for parsing environment variable.\n\tOption *EnvVarOption `protobuf:\"bytes,3,opt,name=option,proto3,oneof\" json:\"option,omitempty\"`\n}\n\nfunc (x *EnvVar) Reset() {\n\t*x = EnvVar{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvVar) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvVar) ProtoMessage() {}\n\nfunc (x *EnvVar) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvVar.ProtoReflect.Descriptor instead.\nfunc (*EnvVar) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{9}\n}\n\nfunc (x *EnvVar) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnvVar) GetType() *EnvType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nfunc (x *EnvVar) GetOption() *EnvVarOption {\n\tif x != nil {\n\t\treturn x.Option\n\t}\n\treturn nil\n}\n\n// EnvType represents type information for environment variable.\ntype EnvType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to Type:\n\t//\n\t//\t*EnvType_Kind\n\t//\t*EnvType_Repeated\n\t//\t*EnvType_Map\n\tType isEnvType_Type `protobuf_oneof:\"type\"`\n}\n\nfunc (x *EnvType) Reset() {\n\t*x = EnvType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[10]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvType) ProtoMessage() {}\n\nfunc (x *EnvType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[10]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvType.ProtoReflect.Descriptor instead.\nfunc (*EnvType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{10}\n}\n\nfunc (m *EnvType) GetType() isEnvType_Type {\n\tif m != nil {\n\t\treturn m.Type\n\t}\n\treturn nil\n}\n\nfunc (x *EnvType) GetKind() TypeKind {\n\tif x, ok := x.GetType().(*EnvType_Kind); ok {\n\t\treturn x.Kind\n\t}\n\treturn TypeKind_UNKNOWN\n}\n\nfunc (x *EnvType) GetRepeated() *EnvType {\n\tif x, ok := x.GetType().(*EnvType_Repeated); ok {\n\t\treturn x.Repeated\n\t}\n\treturn nil\n}\n\nfunc (x *EnvType) GetMap() *EnvMapType {\n\tif x, ok := x.GetType().(*EnvType_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\ntype isEnvType_Type interface {\n\tisEnvType_Type()\n}\n\ntype EnvType_Kind struct {\n\t// kind is used when the type is a primitive type.\n\tKind TypeKind `protobuf:\"varint,1,opt,name=kind,proto3,enum=grpc.federation.TypeKind,oneof\"`\n}\n\ntype EnvType_Repeated struct {\n\t// repeated is used when the type is a repeated type.\n\tRepeated *EnvType `protobuf:\"bytes,2,opt,name=repeated,proto3,oneof\"`\n}\n\ntype EnvType_Map struct {\n\t// map is used when the type is a map type.\n\tMap *EnvMapType `protobuf:\"bytes,3,opt,name=map,proto3,oneof\"`\n}\n\nfunc (*EnvType_Kind) isEnvType_Type() {}\n\nfunc (*EnvType_Repeated) isEnvType_Type() {}\n\nfunc (*EnvType_Map) isEnvType_Type() {}\n\n// EnvMapType represents map type.\ntype EnvMapType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// key represents map's key type.\n\tKey *EnvType `protobuf:\"bytes,1,opt,name=key,proto3\" json:\"key,omitempty\"`\n\t// value represents map's value type.\n\tValue *EnvType `protobuf:\"bytes,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *EnvMapType) Reset() {\n\t*x = EnvMapType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[11]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvMapType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvMapType) ProtoMessage() {}\n\nfunc (x *EnvMapType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[11]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvMapType.ProtoReflect.Descriptor instead.\nfunc (*EnvMapType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{11}\n}\n\nfunc (x *EnvMapType) GetKey() *EnvType {\n\tif x != nil {\n\t\treturn x.Key\n\t}\n\treturn nil\n}\n\nfunc (x *EnvMapType) GetValue() *EnvType {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn nil\n}\n\n// EnvVarOption represents additional option for environment variable.\n// The option work with the `envconfig` library in Go language.\n// For detailed specifications, please refer to the library's documentation ( https://pkg.go.dev/github.com/kelseyhightower/envconfig#section-readme ).\ntype EnvVarOption struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// alternate use this option if you want to use an environment variable with a different name than the value specified in `EnvVar.name`.\n\tAlternate *string `protobuf:\"bytes,1,opt,name=alternate,proto3,oneof\" json:\"alternate,omitempty\"`\n\t// default specify the value to use as a fallback if the specified environment variable is not found.\n\tDefault *string `protobuf:\"bytes,2,opt,name=default,proto3,oneof\" json:\"default,omitempty\"`\n\t// required require the environment variable to exist.\n\t// If it does not exist, an error will occur at startup.\n\tRequired *bool `protobuf:\"varint,3,opt,name=required,proto3,oneof\" json:\"required,omitempty\"`\n\t// ignored if ignored is true, it does nothing even if the environment variable exists.\n\tIgnored *bool `protobuf:\"varint,4,opt,name=ignored,proto3,oneof\" json:\"ignored,omitempty\"`\n}\n\nfunc (x *EnvVarOption) Reset() {\n\t*x = EnvVarOption{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[12]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvVarOption) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvVarOption) ProtoMessage() {}\n\nfunc (x *EnvVarOption) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[12]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvVarOption.ProtoReflect.Descriptor instead.\nfunc (*EnvVarOption) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{12}\n}\n\nfunc (x *EnvVarOption) GetAlternate() string {\n\tif x != nil && x.Alternate != nil {\n\t\treturn *x.Alternate\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnvVarOption) GetDefault() string {\n\tif x != nil && x.Default != nil {\n\t\treturn *x.Default\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnvVarOption) GetRequired() bool {\n\tif x != nil && x.Required != nil {\n\t\treturn *x.Required\n\t}\n\treturn false\n}\n\nfunc (x *EnvVarOption) GetIgnored() bool {\n\tif x != nil && x.Ignored != nil {\n\t\treturn *x.Ignored\n\t}\n\treturn false\n}\n\ntype MethodRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// the time to timeout. If the specified time period elapses, DEADLINE_EXCEEDED status is returned.\n\t// If you want to handle this error, you need to implement a custom error handler in Go.\n\t// The format is the same as Go's time.Duration format. See https://pkg.go.dev/time#ParseDuration.\n\tTimeout *string `protobuf:\"bytes,1,opt,name=timeout,proto3,oneof\" json:\"timeout,omitempty\"`\n\t// response specify the name of the message you want to use to create the response value.\n\t// If you specify a reserved type like `google.protobuf.Empty` as the response, you cannot define gRPC Federation options.\n\t// In such cases, you can specify a separate message to create the response value.\n\t// The specified response message must contain fields with the same names and types as all the fields in the original response.\n\tResponse *string `protobuf:\"bytes,2,opt,name=response,proto3,oneof\" json:\"response,omitempty\"`\n}\n\nfunc (x *MethodRule) Reset() {\n\t*x = MethodRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[13]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MethodRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MethodRule) ProtoMessage() {}\n\nfunc (x *MethodRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[13]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MethodRule.ProtoReflect.Descriptor instead.\nfunc (*MethodRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{13}\n}\n\nfunc (x *MethodRule) GetTimeout() string {\n\tif x != nil && x.Timeout != nil {\n\t\treturn *x.Timeout\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodRule) GetResponse() string {\n\tif x != nil && x.Response != nil {\n\t\treturn *x.Response\n\t}\n\treturn \"\"\n}\n\n// MessageRule define gRPC Federation rules for the message.\ntype MessageRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// def specify variables to be used in field binding by `grpc.federation.field` option.\n\tDef []*VariableDefinition `protobuf:\"bytes,1,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// if custom_resolver is true, the resolver for this message is implemented by Go.\n\t// If there are any values retrieved by resolver or messages, they are passed as arguments for custom resolver.\n\t// Each field of the message returned by the custom resolver is automatically bound.\n\t// If you want to change the binding process for a particular field, set `custom_resolver=true` option for that field.\n\tCustomResolver *bool `protobuf:\"varint,2,opt,name=custom_resolver,json=customResolver,proto3,oneof\" json:\"custom_resolver,omitempty\"`\n\t// alias mapping between messages defined in other packages and messages defined on the federation service side.\n\t// The alias is the FQDN ( <package-name>.<message-name> ) to the message.\n\t// If this definition exists, type conversion is automatically performed before the field assignment operation.\n\t// If a message with this option has a field that is not present in the message specified by alias, and the alias option is not specified for that field, an error is occurred.\n\t// You can specify multiple aliases. In that case, only fields common to all aliases will be considered.\n\t// Specifying a field that is not included in either alias will result in an error.\n\tAlias []string `protobuf:\"bytes,3,rep,name=alias,proto3\" json:\"alias,omitempty\"`\n}\n\nfunc (x *MessageRule) Reset() {\n\t*x = MessageRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[14]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MessageRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MessageRule) ProtoMessage() {}\n\nfunc (x *MessageRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[14]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MessageRule.ProtoReflect.Descriptor instead.\nfunc (*MessageRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{14}\n}\n\nfunc (x *MessageRule) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *MessageRule) GetCustomResolver() bool {\n\tif x != nil && x.CustomResolver != nil {\n\t\treturn *x.CustomResolver\n\t}\n\treturn false\n}\n\nfunc (x *MessageRule) GetAlias() []string {\n\tif x != nil {\n\t\treturn x.Alias\n\t}\n\treturn nil\n}\n\n// VariableDefinition represents variable definition.\ntype VariableDefinition struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is a variable name.\n\t// This name can be referenced in all CELs defined after itself in the same message.\n\t// It can also be referenced in `grpc.federation.field` option.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// if specify the condition for evaluating expr.\n\t// this value evaluated by CEL and it must return a boolean value.\n\t// If the result of evaluation is `false`, the value assigned to name is the default value of the result of evaluation of `expr`.\n\tIf *string `protobuf:\"bytes,2,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n\t// autobind if the result value of `expr` is a message type,\n\t// the value of a field with the same name and type as the field name of its own message is automatically assigned to the value of the field in the message.\n\t// If multiple autobinds are used at the same message,\n\t// you must explicitly use the `grpc.federation.field` option to do the binding yourself, since duplicate field names cannot be correctly determined as one.\n\tAutobind *bool `protobuf:\"varint,3,opt,name=autobind,proto3,oneof\" json:\"autobind,omitempty\"`\n\t// expr specify the value to be assigned to name.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*VariableDefinition_By\n\t//\t*VariableDefinition_Map\n\t//\t*VariableDefinition_Message\n\t//\t*VariableDefinition_Call\n\t//\t*VariableDefinition_Validation\n\t//\t*VariableDefinition_Enum\n\t//\t*VariableDefinition_Switch\n\tExpr isVariableDefinition_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *VariableDefinition) Reset() {\n\t*x = VariableDefinition{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[15]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *VariableDefinition) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*VariableDefinition) ProtoMessage() {}\n\nfunc (x *VariableDefinition) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[15]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use VariableDefinition.ProtoReflect.Descriptor instead.\nfunc (*VariableDefinition) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{15}\n}\n\nfunc (x *VariableDefinition) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *VariableDefinition) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *VariableDefinition) GetAutobind() bool {\n\tif x != nil && x.Autobind != nil {\n\t\treturn *x.Autobind\n\t}\n\treturn false\n}\n\nfunc (m *VariableDefinition) GetExpr() isVariableDefinition_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetBy() string {\n\tif x, ok := x.GetExpr().(*VariableDefinition_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *VariableDefinition) GetMap() *MapExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetMessage() *MessageExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetCall() *CallExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Call); ok {\n\t\treturn x.Call\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetValidation() *ValidationExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Validation); ok {\n\t\treturn x.Validation\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetEnum() *EnumExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetSwitch() *SwitchExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Switch); ok {\n\t\treturn x.Switch\n\t}\n\treturn nil\n}\n\ntype isVariableDefinition_Expr interface {\n\tisVariableDefinition_Expr()\n}\n\ntype VariableDefinition_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\ntype VariableDefinition_Map struct {\n\t// map apply map operation for the specified repeated type.\n\tMap *MapExpr `protobuf:\"bytes,12,opt,name=map,proto3,oneof\"`\n}\n\ntype VariableDefinition_Message struct {\n\t// message gets with message arguments.\n\tMessage *MessageExpr `protobuf:\"bytes,13,opt,name=message,proto3,oneof\"`\n}\n\ntype VariableDefinition_Call struct {\n\t// call specifies how to call gRPC method.\n\tCall *CallExpr `protobuf:\"bytes,14,opt,name=call,proto3,oneof\"`\n}\n\ntype VariableDefinition_Validation struct {\n\t// validation defines the validation rule and error.\n\tValidation *ValidationExpr `protobuf:\"bytes,15,opt,name=validation,proto3,oneof\"`\n}\n\ntype VariableDefinition_Enum struct {\n\t// enum gets with cel value.\n\tEnum *EnumExpr `protobuf:\"bytes,16,opt,name=enum,proto3,oneof\"`\n}\n\ntype VariableDefinition_Switch struct {\n\t// switch provides conditional evaluation with multiple branches.\n\tSwitch *SwitchExpr `protobuf:\"bytes,17,opt,name=switch,proto3,oneof\"`\n}\n\nfunc (*VariableDefinition_By) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Map) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Message) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Call) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Validation) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Enum) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Switch) isVariableDefinition_Expr() {}\n\n// MapExpr apply map operation for the specified repeated type.\ntype MapExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// iterator define iterator variable.\n\t// When evaluating CEL in `expr`, we can refer to the name defined in iterator.\n\tIterator *Iterator `protobuf:\"bytes,1,opt,name=iterator,proto3\" json:\"iterator,omitempty\"`\n\t// expr creates map elements using iterator variable.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*MapExpr_By\n\t//\t*MapExpr_Message\n\t//\t*MapExpr_Enum\n\tExpr isMapExpr_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *MapExpr) Reset() {\n\t*x = MapExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[16]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MapExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MapExpr) ProtoMessage() {}\n\nfunc (x *MapExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[16]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MapExpr.ProtoReflect.Descriptor instead.\nfunc (*MapExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{16}\n}\n\nfunc (x *MapExpr) GetIterator() *Iterator {\n\tif x != nil {\n\t\treturn x.Iterator\n\t}\n\treturn nil\n}\n\nfunc (m *MapExpr) GetExpr() isMapExpr_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *MapExpr) GetBy() string {\n\tif x, ok := x.GetExpr().(*MapExpr_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *MapExpr) GetMessage() *MessageExpr {\n\tif x, ok := x.GetExpr().(*MapExpr_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *MapExpr) GetEnum() *EnumExpr {\n\tif x, ok := x.GetExpr().(*MapExpr_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn nil\n}\n\ntype isMapExpr_Expr interface {\n\tisMapExpr_Expr()\n}\n\ntype MapExpr_By struct {\n\t// `by` evaluates with CEL.\n\t// this can refer to the variable declared by `iterator`.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\ntype MapExpr_Message struct {\n\t// message gets with message arguments, and it is made an element of the map.\n\t// The result type of MapExpr is the repeated type of the specified message.\n\tMessage *MessageExpr `protobuf:\"bytes,12,opt,name=message,proto3,oneof\"`\n}\n\ntype MapExpr_Enum struct {\n\t// enum creates enum value for each element of the map.\n\t// The result type of MapExpr is the repeated type of the specified enum.\n\tEnum *EnumExpr `protobuf:\"bytes,13,opt,name=enum,proto3,oneof\"`\n}\n\nfunc (*MapExpr_By) isMapExpr_Expr() {}\n\nfunc (*MapExpr_Message) isMapExpr_Expr() {}\n\nfunc (*MapExpr_Enum) isMapExpr_Expr() {}\n\n// Iterator represents iterator variable.\ntype Iterator struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// variable name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// src the value that will be the source for creating the iterator.\n\t// src must be a repeated type.\n\tSrc string `protobuf:\"bytes,2,opt,name=src,proto3\" json:\"src,omitempty\"`\n}\n\nfunc (x *Iterator) Reset() {\n\t*x = Iterator{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[17]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Iterator) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Iterator) ProtoMessage() {}\n\nfunc (x *Iterator) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[17]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Iterator.ProtoReflect.Descriptor instead.\nfunc (*Iterator) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{17}\n}\n\nfunc (x *Iterator) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Iterator) GetSrc() string {\n\tif x != nil {\n\t\treturn x.Src\n\t}\n\treturn \"\"\n}\n\n// MessageExpr represents dependent message.\ntype MessageExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name specify the message name by FQDN. format is `<package-name>.<message-name>`.\n\t// <package-name> can be omitted when referring to messages in the same package.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// args specify the parameters needed to get the message. This is called the \"message arguments\".\n\tArgs []*Argument `protobuf:\"bytes,2,rep,name=args,proto3\" json:\"args,omitempty\"`\n}\n\nfunc (x *MessageExpr) Reset() {\n\t*x = MessageExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[18]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MessageExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MessageExpr) ProtoMessage() {}\n\nfunc (x *MessageExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[18]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MessageExpr.ProtoReflect.Descriptor instead.\nfunc (*MessageExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{18}\n}\n\nfunc (x *MessageExpr) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *MessageExpr) GetArgs() []*Argument {\n\tif x != nil {\n\t\treturn x.Args\n\t}\n\treturn nil\n}\n\n// EnumExpr represents dependent enum.\ntype EnumExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name specify the enum name by FQDN. format is `<package-name>.<enum-name>`.\n\t// <package-name> can be omitted when referring to enum in the same package.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,2,opt,name=by,proto3\" json:\"by,omitempty\"`\n}\n\nfunc (x *EnumExpr) Reset() {\n\t*x = EnumExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[19]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumExpr) ProtoMessage() {}\n\nfunc (x *EnumExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[19]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumExpr.ProtoReflect.Descriptor instead.\nfunc (*EnumExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{19}\n}\n\nfunc (x *EnumExpr) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnumExpr) GetBy() string {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\n// CallExpr represents how to call gRPC method.\ntype CallExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// method specify the FQDN for the gRPC method. format is `<package-name>.<service-name>/<method-name>`.\n\tMethod string `protobuf:\"bytes,1,opt,name=method,proto3\" json:\"method,omitempty\"`\n\t// request specify request parameters for the gRPC method.\n\tRequest []*MethodRequest `protobuf:\"bytes,2,rep,name=request,proto3\" json:\"request,omitempty\"`\n\t// the time to timeout. If the specified time period elapses, DEADLINE_EXCEEDED status is returned.\n\t// If you want to handle this error, you need to implement a custom error handler in Go.\n\t// The format is the same as Go's time.Duration format. See https://pkg.go.dev/time#ParseDuration.\n\tTimeout *string `protobuf:\"bytes,3,opt,name=timeout,proto3,oneof\" json:\"timeout,omitempty\"`\n\t// retry specifies the retry policy if the method call fails.\n\tRetry *RetryPolicy `protobuf:\"bytes,4,opt,name=retry,proto3,oneof\" json:\"retry,omitempty\"`\n\t// error evaluated when an error occurs during a method call.\n\t// Multiple errors can be defined and are evaluated in the order in which they are described.\n\t// If an error occurs while creating an gRPC status error, original error will be returned.\n\tError []*GRPCError `protobuf:\"bytes,5,rep,name=error,proto3\" json:\"error,omitempty\"`\n\t// option is the gRPC's call option (https://pkg.go.dev/google.golang.org/grpc#CallOption).\n\tOption *GRPCCallOption `protobuf:\"bytes,6,opt,name=option,proto3,oneof\" json:\"option,omitempty\"`\n\t// metadata specify outgoing metadata with CEL value.\n\t// The specified type must always be of type map<string, repeated string>.\n\tMetadata *string `protobuf:\"bytes,7,opt,name=metadata,proto3,oneof\" json:\"metadata,omitempty\"`\n}\n\nfunc (x *CallExpr) Reset() {\n\t*x = CallExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[20]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CallExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CallExpr) ProtoMessage() {}\n\nfunc (x *CallExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[20]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CallExpr.ProtoReflect.Descriptor instead.\nfunc (*CallExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{20}\n}\n\nfunc (x *CallExpr) GetMethod() string {\n\tif x != nil {\n\t\treturn x.Method\n\t}\n\treturn \"\"\n}\n\nfunc (x *CallExpr) GetRequest() []*MethodRequest {\n\tif x != nil {\n\t\treturn x.Request\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetTimeout() string {\n\tif x != nil && x.Timeout != nil {\n\t\treturn *x.Timeout\n\t}\n\treturn \"\"\n}\n\nfunc (x *CallExpr) GetRetry() *RetryPolicy {\n\tif x != nil {\n\t\treturn x.Retry\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetError() []*GRPCError {\n\tif x != nil {\n\t\treturn x.Error\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetOption() *GRPCCallOption {\n\tif x != nil {\n\t\treturn x.Option\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetMetadata() string {\n\tif x != nil && x.Metadata != nil {\n\t\treturn *x.Metadata\n\t}\n\treturn \"\"\n}\n\n// SwitchExpr represents a switch statement. At least one \"case\", and \"default\", must be defined. All\n// case.if expressions must evaluate to a boolean value. All case.by expressions, and default.by, must\n// evaluate to the same type (the return type of the switch).\n//\n// When executed, the case.if expressions are evaluated in order, and, for the first case whose\n// case.if expression evaluates to true, its case.by is evaluated to make the return value of the\n// SwitchExpr.\n// If no case.if evaluates to true, default.by is evaluated to make the return value.\ntype SwitchExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Cases for the switch expression.\n\tCase []*SwitchCaseExpr `protobuf:\"bytes,1,rep,name=case,proto3\" json:\"case,omitempty\"`\n\t// The default case, if none of the \"case.if\" expressions evaluate to true.\n\tDefault *SwitchDefaultExpr `protobuf:\"bytes,2,opt,name=default,proto3\" json:\"default,omitempty\"`\n}\n\nfunc (x *SwitchExpr) Reset() {\n\t*x = SwitchExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[21]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SwitchExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SwitchExpr) ProtoMessage() {}\n\nfunc (x *SwitchExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[21]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SwitchExpr.ProtoReflect.Descriptor instead.\nfunc (*SwitchExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{21}\n}\n\nfunc (x *SwitchExpr) GetCase() []*SwitchCaseExpr {\n\tif x != nil {\n\t\treturn x.Case\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchExpr) GetDefault() *SwitchDefaultExpr {\n\tif x != nil {\n\t\treturn x.Default\n\t}\n\treturn nil\n}\n\n// SwitchCaseExpr represents a single case for a switch expression.\ntype SwitchCaseExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// if specify the condition for evaluating expr.\n\t// this value evaluated by CEL and it must return a boolean value.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3\" json:\"if,omitempty\"`\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,2,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// expr specify the value to return for the case.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*SwitchCaseExpr_By\n\tExpr isSwitchCaseExpr_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *SwitchCaseExpr) Reset() {\n\t*x = SwitchCaseExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[22]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SwitchCaseExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SwitchCaseExpr) ProtoMessage() {}\n\nfunc (x *SwitchCaseExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[22]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SwitchCaseExpr.ProtoReflect.Descriptor instead.\nfunc (*SwitchCaseExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{22}\n}\n\nfunc (x *SwitchCaseExpr) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *SwitchCaseExpr) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (m *SwitchCaseExpr) GetExpr() isSwitchCaseExpr_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchCaseExpr) GetBy() string {\n\tif x, ok := x.GetExpr().(*SwitchCaseExpr_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\ntype isSwitchCaseExpr_Expr interface {\n\tisSwitchCaseExpr_Expr()\n}\n\ntype SwitchCaseExpr_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\nfunc (*SwitchCaseExpr_By) isSwitchCaseExpr_Expr() {}\n\n// SwitchDefaultExpr represents the default case for a switch expression.\ntype SwitchDefaultExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,1,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// expr specify the value to return for the default case.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*SwitchDefaultExpr_By\n\tExpr isSwitchDefaultExpr_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *SwitchDefaultExpr) Reset() {\n\t*x = SwitchDefaultExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[23]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SwitchDefaultExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SwitchDefaultExpr) ProtoMessage() {}\n\nfunc (x *SwitchDefaultExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[23]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SwitchDefaultExpr.ProtoReflect.Descriptor instead.\nfunc (*SwitchDefaultExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{23}\n}\n\nfunc (x *SwitchDefaultExpr) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (m *SwitchDefaultExpr) GetExpr() isSwitchDefaultExpr_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchDefaultExpr) GetBy() string {\n\tif x, ok := x.GetExpr().(*SwitchDefaultExpr_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\ntype isSwitchDefaultExpr_Expr interface {\n\tisSwitchDefaultExpr_Expr()\n}\n\ntype SwitchDefaultExpr_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\nfunc (*SwitchDefaultExpr_By) isSwitchDefaultExpr_Expr() {}\n\n// GRPCError create gRPC status value.\ntype GRPCError struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,1,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// if specifies condition in CEL. If the condition is true, it returns defined error information.\n\t// If this field is omitted, it is always treated as 'true' and returns defined error information.\n\t// The return value must always be of type boolean.\n\tIf *string `protobuf:\"bytes,2,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n\t// code is a gRPC status code.\n\tCode *code.Code `protobuf:\"varint,3,opt,name=code,proto3,enum=google.rpc.Code,oneof\" json:\"code,omitempty\"`\n\t// message is a gRPC status message.\n\t// If omitted, the message will be auto-generated from the configurations.\n\tMessage *string `protobuf:\"bytes,4,opt,name=message,proto3,oneof\" json:\"message,omitempty\"`\n\t// details is a list of error details.\n\t// If returns error, the corresponding error details are set.\n\tDetails []*GRPCErrorDetail `protobuf:\"bytes,5,rep,name=details,proto3\" json:\"details,omitempty\"`\n\t// ignore ignore the error if the condition in the \"if\" field is true and \"ignore\" field is set to true.\n\t// When an error is ignored, the returned response is always null value.\n\t// If you want to return a response that is not null, please use `ignore_and_response` feature.\n\t// Therefore, `ignore` and `ignore_and_response` cannot be specified same.\n\tIgnore *bool `protobuf:\"varint,6,opt,name=ignore,proto3,oneof\" json:\"ignore,omitempty\"`\n\t// ignore_and_response ignore the error if the condition in the \"if\" field is true and it returns response specified in CEL.\n\t// The evaluation value of CEL must always be the same as the response message type.\n\t// `ignore` and `ignore_and_response` cannot be specified same.\n\tIgnoreAndResponse *string `protobuf:\"bytes,7,opt,name=ignore_and_response,json=ignoreAndResponse,proto3,oneof\" json:\"ignore_and_response,omitempty\"`\n\t// log_level can be configured to output logs as any log level.\n\t// If DEBUG is specified for the log_level, logs are output as debug logs.\n\t// default value is ERROR.\n\tLogLevel *GRPCError_LogLevel `protobuf:\"varint,8,opt,name=log_level,json=logLevel,proto3,enum=grpc.federation.GRPCError_LogLevel,oneof\" json:\"log_level,omitempty\"`\n}\n\nfunc (x *GRPCError) Reset() {\n\t*x = GRPCError{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[24]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GRPCError) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GRPCError) ProtoMessage() {}\n\nfunc (x *GRPCError) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[24]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GRPCError.ProtoReflect.Descriptor instead.\nfunc (*GRPCError) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{24}\n}\n\nfunc (x *GRPCError) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCError) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCError) GetCode() code.Code {\n\tif x != nil && x.Code != nil {\n\t\treturn *x.Code\n\t}\n\treturn code.Code(0)\n}\n\nfunc (x *GRPCError) GetMessage() string {\n\tif x != nil && x.Message != nil {\n\t\treturn *x.Message\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCError) GetDetails() []*GRPCErrorDetail {\n\tif x != nil {\n\t\treturn x.Details\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCError) GetIgnore() bool {\n\tif x != nil && x.Ignore != nil {\n\t\treturn *x.Ignore\n\t}\n\treturn false\n}\n\nfunc (x *GRPCError) GetIgnoreAndResponse() string {\n\tif x != nil && x.IgnoreAndResponse != nil {\n\t\treturn *x.IgnoreAndResponse\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCError) GetLogLevel() GRPCError_LogLevel {\n\tif x != nil && x.LogLevel != nil {\n\t\treturn *x.LogLevel\n\t}\n\treturn GRPCError_UNKNOWN\n}\n\ntype GRPCErrorDetail struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// if specifies condition rule in CEL. If the condition is true, gRPC error detail is added to the error.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3\" json:\"if,omitempty\"`\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,2,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// message represents arbitrary messages to describe the detail of the error.\n\tMessage []*MessageExpr `protobuf:\"bytes,3,rep,name=message,proto3\" json:\"message,omitempty\"`\n\t// error_info describes the cause of the error with structured details.\n\tErrorInfo []*errdetails.ErrorInfo `protobuf:\"bytes,4,rep,name=error_info,json=errorInfo,proto3\" json:\"error_info,omitempty\"`\n\t// retry_info describes when the clients can retry a failed request.\n\tRetryInfo []*errdetails.RetryInfo `protobuf:\"bytes,5,rep,name=retry_info,json=retryInfo,proto3\" json:\"retry_info,omitempty\"`\n\t// debug_info describes additional debugging info.\n\tDebugInfo []*errdetails.DebugInfo `protobuf:\"bytes,6,rep,name=debug_info,json=debugInfo,proto3\" json:\"debug_info,omitempty\"`\n\t// quota_failure describes how a quota check failed.\n\tQuotaFailure []*errdetails.QuotaFailure `protobuf:\"bytes,7,rep,name=quota_failure,json=quotaFailure,proto3\" json:\"quota_failure,omitempty\"`\n\t// precondition_failure describes what preconditions have failed.\n\tPreconditionFailure []*errdetails.PreconditionFailure `protobuf:\"bytes,8,rep,name=precondition_failure,json=preconditionFailure,proto3\" json:\"precondition_failure,omitempty\"`\n\t// bad_request describes violations in a client request.\n\tBadRequest []*errdetails.BadRequest `protobuf:\"bytes,9,rep,name=bad_request,json=badRequest,proto3\" json:\"bad_request,omitempty\"`\n\t// request_info contains metadata about the request that clients can attach.\n\tRequestInfo []*errdetails.RequestInfo `protobuf:\"bytes,10,rep,name=request_info,json=requestInfo,proto3\" json:\"request_info,omitempty\"`\n\t// resource_info describes the resource that is being accessed.\n\tResourceInfo []*errdetails.ResourceInfo `protobuf:\"bytes,11,rep,name=resource_info,json=resourceInfo,proto3\" json:\"resource_info,omitempty\"`\n\t// help provides links to documentation or for performing an out of band action.\n\tHelp []*errdetails.Help `protobuf:\"bytes,12,rep,name=help,proto3\" json:\"help,omitempty\"`\n\t// localized_message provides a localized error message that is safe to return to the user.\n\tLocalizedMessage []*errdetails.LocalizedMessage `protobuf:\"bytes,13,rep,name=localized_message,json=localizedMessage,proto3\" json:\"localized_message,omitempty\"`\n\t// by specify a message in CEL to express the details of the error.\n\tBy []string `protobuf:\"bytes,14,rep,name=by,proto3\" json:\"by,omitempty\"`\n}\n\nfunc (x *GRPCErrorDetail) Reset() {\n\t*x = GRPCErrorDetail{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[25]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GRPCErrorDetail) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GRPCErrorDetail) ProtoMessage() {}\n\nfunc (x *GRPCErrorDetail) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[25]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GRPCErrorDetail.ProtoReflect.Descriptor instead.\nfunc (*GRPCErrorDetail) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{25}\n}\n\nfunc (x *GRPCErrorDetail) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCErrorDetail) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetMessage() []*MessageExpr {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetErrorInfo() []*errdetails.ErrorInfo {\n\tif x != nil {\n\t\treturn x.ErrorInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetRetryInfo() []*errdetails.RetryInfo {\n\tif x != nil {\n\t\treturn x.RetryInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetDebugInfo() []*errdetails.DebugInfo {\n\tif x != nil {\n\t\treturn x.DebugInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetQuotaFailure() []*errdetails.QuotaFailure {\n\tif x != nil {\n\t\treturn x.QuotaFailure\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetPreconditionFailure() []*errdetails.PreconditionFailure {\n\tif x != nil {\n\t\treturn x.PreconditionFailure\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetBadRequest() []*errdetails.BadRequest {\n\tif x != nil {\n\t\treturn x.BadRequest\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetRequestInfo() []*errdetails.RequestInfo {\n\tif x != nil {\n\t\treturn x.RequestInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetResourceInfo() []*errdetails.ResourceInfo {\n\tif x != nil {\n\t\treturn x.ResourceInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetHelp() []*errdetails.Help {\n\tif x != nil {\n\t\treturn x.Help\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetLocalizedMessage() []*errdetails.LocalizedMessage {\n\tif x != nil {\n\t\treturn x.LocalizedMessage\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetBy() []string {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn nil\n}\n\n// GRPCCallOption configures a gRPC Call before it starts or extracts information from a gRPC Call after it completes.\ntype GRPCCallOption struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// set the content-subtype. For example, if content-subtype is \"json\", the Content-Type over the wire will be \"application/grpc+json\".\n\t// The content-subtype is converted to lowercase before being included in Content-Type.\n\t// See Content-Type on https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests for more details.\n\t// If no such codec is found, the call will result in an error with code INTERNAL.\n\tContentSubtype *string `protobuf:\"bytes,1,opt,name=content_subtype,json=contentSubtype,proto3,oneof\" json:\"content_subtype,omitempty\"`\n\t// header retrieves the header metadata for a unary RPC.\n\t// In order to obtain the metadata, you must specify a variable of type map<string, repeated string> in the header.\n\t// e.g.)\n\t// def [\n\t//\n\t//\t{ name: \"hdr\" by: \"grpc.federation.metadata.new()\" }\n\t//\t{ call { method: \"pkg.Method\" option { header: \"hdr\" } } }\n\t//\n\t// ]\n\tHeader *string `protobuf:\"bytes,2,opt,name=header,proto3,oneof\" json:\"header,omitempty\"`\n\t// max_call_recv_msg_size sets the maximum message size in bytes the client can receive.\n\t// If this is not set, gRPC uses the default 4MB.\n\tMaxCallRecvMsgSize *int64 `protobuf:\"varint,3,opt,name=max_call_recv_msg_size,json=maxCallRecvMsgSize,proto3,oneof\" json:\"max_call_recv_msg_size,omitempty\"`\n\t// max_call_send_msg_size sets the maximum message size in bytes the client can send.\n\t// If this is not set, gRPC uses the default maximum number of int32 range.\n\tMaxCallSendMsgSize *int64 `protobuf:\"varint,4,opt,name=max_call_send_msg_size,json=maxCallSendMsgSize,proto3,oneof\" json:\"max_call_send_msg_size,omitempty\"`\n\t// static_method specifies that a call is being made to a method that is static,\n\t// which means the method is known at compile time and doesn't change at runtime.\n\t// This can be used as a signal to stats plugins that this method is safe to include as a key to a measurement.\n\tStaticMethod *bool `protobuf:\"varint,5,opt,name=static_method,json=staticMethod,proto3,oneof\" json:\"static_method,omitempty\"`\n\t// trailer retrieves the trailer metadata for a unary RPC.\n\t// In order to obtain the metadata, you must specify a variable of type map<string, repeated string> in the trailer.\n\t// e.g.)\n\t// def [\n\t//\n\t//\t{ name: \"trl\" by: \"grpc.federation.metadata.new()\" }\n\t//\t{ call { method: \"pkg.Method\" option { trailer: \"trl\" } } }\n\t//\n\t// ]\n\tTrailer *string `protobuf:\"bytes,6,opt,name=trailer,proto3,oneof\" json:\"trailer,omitempty\"`\n\t// wait_for_ready configures the RPC's behavior when the client is in TRANSIENT_FAILURE,\n\t// which occurs when all addresses fail to connect.\n\t// If wait_for_ready is false, the RPC will fail immediately.\n\t// Otherwise, the client will wait until a connection becomes available or the RPC's deadline is reached.\n\t// By default, RPCs do not \"wait for ready\".\n\tWaitForReady *bool `protobuf:\"varint,7,opt,name=wait_for_ready,json=waitForReady,proto3,oneof\" json:\"wait_for_ready,omitempty\"`\n}\n\nfunc (x *GRPCCallOption) Reset() {\n\t*x = GRPCCallOption{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[26]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GRPCCallOption) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GRPCCallOption) ProtoMessage() {}\n\nfunc (x *GRPCCallOption) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[26]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GRPCCallOption.ProtoReflect.Descriptor instead.\nfunc (*GRPCCallOption) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{26}\n}\n\nfunc (x *GRPCCallOption) GetContentSubtype() string {\n\tif x != nil && x.ContentSubtype != nil {\n\t\treturn *x.ContentSubtype\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCCallOption) GetHeader() string {\n\tif x != nil && x.Header != nil {\n\t\treturn *x.Header\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCCallOption) GetMaxCallRecvMsgSize() int64 {\n\tif x != nil && x.MaxCallRecvMsgSize != nil {\n\t\treturn *x.MaxCallRecvMsgSize\n\t}\n\treturn 0\n}\n\nfunc (x *GRPCCallOption) GetMaxCallSendMsgSize() int64 {\n\tif x != nil && x.MaxCallSendMsgSize != nil {\n\t\treturn *x.MaxCallSendMsgSize\n\t}\n\treturn 0\n}\n\nfunc (x *GRPCCallOption) GetStaticMethod() bool {\n\tif x != nil && x.StaticMethod != nil {\n\t\treturn *x.StaticMethod\n\t}\n\treturn false\n}\n\nfunc (x *GRPCCallOption) GetTrailer() string {\n\tif x != nil && x.Trailer != nil {\n\t\treturn *x.Trailer\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCCallOption) GetWaitForReady() bool {\n\tif x != nil && x.WaitForReady != nil {\n\t\treturn *x.WaitForReady\n\t}\n\treturn false\n}\n\n// Validation represents a validation rule against variables defined within the current scope.\ntype ValidationExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is a unique name for the validation.\n\t// If set, the validation error type will be <message-name><name>Error.\n\t// If omitted, the validation error type will be ValidationError.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// error defines the actual validation rules and an error to returned if the validation fails.\n\tError *GRPCError `protobuf:\"bytes,2,opt,name=error,proto3\" json:\"error,omitempty\"`\n}\n\nfunc (x *ValidationExpr) Reset() {\n\t*x = ValidationExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[27]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ValidationExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ValidationExpr) ProtoMessage() {}\n\nfunc (x *ValidationExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[27]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ValidationExpr.ProtoReflect.Descriptor instead.\nfunc (*ValidationExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{27}\n}\n\nfunc (x *ValidationExpr) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *ValidationExpr) GetError() *GRPCError {\n\tif x != nil {\n\t\treturn x.Error\n\t}\n\treturn nil\n}\n\n// RetryPolicy define the retry policy if the method call fails.\ntype RetryPolicy struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to Policy:\n\t//\n\t//\t*RetryPolicy_Constant\n\t//\t*RetryPolicy_Exponential\n\tPolicy isRetryPolicy_Policy `protobuf_oneof:\"policy\"`\n\t// if specifies condition in CEL. If the condition is true, run the retry process according to the policy.\n\t// If this field is omitted, it is always treated as 'true' and run the retry process.\n\t// The return value must always be of type boolean.\n\tIf string `protobuf:\"bytes,3,opt,name=if,proto3\" json:\"if,omitempty\"`\n}\n\nfunc (x *RetryPolicy) Reset() {\n\t*x = RetryPolicy{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[28]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RetryPolicy) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RetryPolicy) ProtoMessage() {}\n\nfunc (x *RetryPolicy) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[28]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RetryPolicy.ProtoReflect.Descriptor instead.\nfunc (*RetryPolicy) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{28}\n}\n\nfunc (m *RetryPolicy) GetPolicy() isRetryPolicy_Policy {\n\tif m != nil {\n\t\treturn m.Policy\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicy) GetConstant() *RetryPolicyConstant {\n\tif x, ok := x.GetPolicy().(*RetryPolicy_Constant); ok {\n\t\treturn x.Constant\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicy) GetExponential() *RetryPolicyExponential {\n\tif x, ok := x.GetPolicy().(*RetryPolicy_Exponential); ok {\n\t\treturn x.Exponential\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicy) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\ntype isRetryPolicy_Policy interface {\n\tisRetryPolicy_Policy()\n}\n\ntype RetryPolicy_Constant struct {\n\t// retry according to the \"constant\" policy.\n\tConstant *RetryPolicyConstant `protobuf:\"bytes,1,opt,name=constant,proto3,oneof\"`\n}\n\ntype RetryPolicy_Exponential struct {\n\t// retry according to the \"exponential backoff\" policy.\n\t// The following Go library is used in the implementation,\n\t// so please refer to the library documentation for how to specify each parameter.\n\t// https://pkg.go.dev/github.com/cenkalti/backoff/v4#section-readme.\n\tExponential *RetryPolicyExponential `protobuf:\"bytes,2,opt,name=exponential,proto3,oneof\"`\n}\n\nfunc (*RetryPolicy_Constant) isRetryPolicy_Policy() {}\n\nfunc (*RetryPolicy_Exponential) isRetryPolicy_Policy() {}\n\n// RetryPolicyConstant define \"constant\" based retry policy.\ntype RetryPolicyConstant struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// interval value. ( default value is 1s ).\n\tInterval *string `protobuf:\"bytes,1,opt,name=interval,proto3,oneof\" json:\"interval,omitempty\"`\n\t// max retry count. ( default value is 5. If zero is specified, it never stops )\n\tMaxRetries *uint64 `protobuf:\"varint,2,opt,name=max_retries,json=maxRetries,proto3,oneof\" json:\"max_retries,omitempty\"`\n}\n\nfunc (x *RetryPolicyConstant) Reset() {\n\t*x = RetryPolicyConstant{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[29]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RetryPolicyConstant) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RetryPolicyConstant) ProtoMessage() {}\n\nfunc (x *RetryPolicyConstant) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[29]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RetryPolicyConstant.ProtoReflect.Descriptor instead.\nfunc (*RetryPolicyConstant) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{29}\n}\n\nfunc (x *RetryPolicyConstant) GetInterval() string {\n\tif x != nil && x.Interval != nil {\n\t\treturn *x.Interval\n\t}\n\treturn \"\"\n}\n\nfunc (x *RetryPolicyConstant) GetMaxRetries() uint64 {\n\tif x != nil && x.MaxRetries != nil {\n\t\treturn *x.MaxRetries\n\t}\n\treturn 0\n}\n\n// RetryPolicyExponential define \"exponential backoff\" based retry policy.\ntype RetryPolicyExponential struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// initial interval value. ( default value is \"500ms\" ).\n\tInitialInterval *string `protobuf:\"bytes,1,opt,name=initial_interval,json=initialInterval,proto3,oneof\" json:\"initial_interval,omitempty\"`\n\t// randomization factor value. ( default value is 0.5 ).\n\tRandomizationFactor *float64 `protobuf:\"fixed64,2,opt,name=randomization_factor,json=randomizationFactor,proto3,oneof\" json:\"randomization_factor,omitempty\"`\n\t// multiplier. ( default value is 1.5 ).\n\tMultiplier *float64 `protobuf:\"fixed64,3,opt,name=multiplier,proto3,oneof\" json:\"multiplier,omitempty\"`\n\t// max interval value. ( default value is \"60s\" ).\n\tMaxInterval *string `protobuf:\"bytes,4,opt,name=max_interval,json=maxInterval,proto3,oneof\" json:\"max_interval,omitempty\"`\n\t// max retry count. ( default value is 5. If zero is specified, it never stops ).\n\tMaxRetries *uint64 `protobuf:\"varint,5,opt,name=max_retries,json=maxRetries,proto3,oneof\" json:\"max_retries,omitempty\"`\n}\n\nfunc (x *RetryPolicyExponential) Reset() {\n\t*x = RetryPolicyExponential{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[30]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RetryPolicyExponential) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RetryPolicyExponential) ProtoMessage() {}\n\nfunc (x *RetryPolicyExponential) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[30]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RetryPolicyExponential.ProtoReflect.Descriptor instead.\nfunc (*RetryPolicyExponential) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{30}\n}\n\nfunc (x *RetryPolicyExponential) GetInitialInterval() string {\n\tif x != nil && x.InitialInterval != nil {\n\t\treturn *x.InitialInterval\n\t}\n\treturn \"\"\n}\n\nfunc (x *RetryPolicyExponential) GetRandomizationFactor() float64 {\n\tif x != nil && x.RandomizationFactor != nil {\n\t\treturn *x.RandomizationFactor\n\t}\n\treturn 0\n}\n\nfunc (x *RetryPolicyExponential) GetMultiplier() float64 {\n\tif x != nil && x.Multiplier != nil {\n\t\treturn *x.Multiplier\n\t}\n\treturn 0\n}\n\nfunc (x *RetryPolicyExponential) GetMaxInterval() string {\n\tif x != nil && x.MaxInterval != nil {\n\t\treturn *x.MaxInterval\n\t}\n\treturn \"\"\n}\n\nfunc (x *RetryPolicyExponential) GetMaxRetries() uint64 {\n\tif x != nil && x.MaxRetries != nil {\n\t\treturn *x.MaxRetries\n\t}\n\treturn 0\n}\n\n// MethodRequest define parameters to be used for gRPC method request.\ntype MethodRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// field name of the request message.\n\tField string `protobuf:\"bytes,1,opt,name=field,proto3\" json:\"field,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tBy *string `protobuf:\"bytes,2,opt,name=by,proto3,oneof\" json:\"by,omitempty\"`\n\t// if describes the condition to be assigned to field.\n\t// The return value must be of type bool.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\t// If the field is a 'oneof' field, it must be specified.\n\tIf *string `protobuf:\"bytes,3,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n}\n\nfunc (x *MethodRequest) Reset() {\n\t*x = MethodRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[31]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MethodRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MethodRequest) ProtoMessage() {}\n\nfunc (x *MethodRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[31]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MethodRequest.ProtoReflect.Descriptor instead.\nfunc (*MethodRequest) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{31}\n}\n\nfunc (x *MethodRequest) GetField() string {\n\tif x != nil {\n\t\treturn x.Field\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodRequest) GetBy() string {\n\tif x != nil && x.By != nil {\n\t\treturn *x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodRequest) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\n// MethodResponse define which value of the method response is referenced.\ntype MethodResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name specify the unique name that can be used in a `MessageRule` / `FieldRule` for the same message for a specific field in the response.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// field name in response message.\n\tField *string `protobuf:\"bytes,2,opt,name=field,proto3,oneof\" json:\"field,omitempty\"`\n\t// autobind if the value referenced by `field` is a message type,\n\t// the value of a field with the same name and type as the field name of its own message is automatically assigned to the value of the field in the message.\n\t// If multiple autobinds are used at the same message,\n\t// you must explicitly use the `grpc.federation.field` option to do the binding yourself, since duplicate field names cannot be correctly determined as one.\n\tAutobind *bool `protobuf:\"varint,3,opt,name=autobind,proto3,oneof\" json:\"autobind,omitempty\"`\n}\n\nfunc (x *MethodResponse) Reset() {\n\t*x = MethodResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[32]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MethodResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MethodResponse) ProtoMessage() {}\n\nfunc (x *MethodResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[32]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MethodResponse.ProtoReflect.Descriptor instead.\nfunc (*MethodResponse) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{32}\n}\n\nfunc (x *MethodResponse) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodResponse) GetField() string {\n\tif x != nil && x.Field != nil {\n\t\treturn *x.Field\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodResponse) GetAutobind() bool {\n\tif x != nil && x.Autobind != nil {\n\t\treturn *x.Autobind\n\t}\n\treturn false\n}\n\n// Argument define message argument.\ntype Argument struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name of the message argument.\n\t// Use this name to refer to the message argument.\n\t// For example, if `foo` is specified as the name, it is referenced by `$.foo`.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tBy *string `protobuf:\"bytes,2,opt,name=by,proto3,oneof\" json:\"by,omitempty\"`\n\t// inline like by, it refers to the specified value and expands all fields beyond it.\n\t// For this reason, the referenced value must always be of message type.\n\tInline *string `protobuf:\"bytes,3,opt,name=inline,proto3,oneof\" json:\"inline,omitempty\"`\n}\n\nfunc (x *Argument) Reset() {\n\t*x = Argument{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[33]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Argument) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Argument) ProtoMessage() {}\n\nfunc (x *Argument) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[33]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Argument.ProtoReflect.Descriptor instead.\nfunc (*Argument) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{33}\n}\n\nfunc (x *Argument) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Argument) GetBy() string {\n\tif x != nil && x.By != nil {\n\t\treturn *x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *Argument) GetInline() string {\n\tif x != nil && x.Inline != nil {\n\t\treturn *x.Inline\n\t}\n\treturn \"\"\n}\n\n// FieldRule define gRPC Federation rules for the field of message.\ntype FieldRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// If custom_resolver is true, the field binding process is to be implemented in Go.\n\t// If there are any values retrieved by grpc.federation.message option, they are passed as arguments for custom resolver.\n\tCustomResolver *bool `protobuf:\"varint,1,opt,name=custom_resolver,json=customResolver,proto3,oneof\" json:\"custom_resolver,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tBy *string `protobuf:\"bytes,2,opt,name=by,proto3,oneof\" json:\"by,omitempty\"`\n\t// alias can be used when alias is specified in grpc.federation.message option,\n\t// and specifies the field name to be referenced among the messages specified in alias of message option.\n\t// If the specified field has the same type or can be converted automatically, its value is assigned.\n\tAlias *string `protobuf:\"bytes,3,opt,name=alias,proto3,oneof\" json:\"alias,omitempty\"`\n\t// use to evaluate any one of fields. this field only available in oneof.\n\tOneof *FieldOneof `protobuf:\"bytes,4,opt,name=oneof,proto3\" json:\"oneof,omitempty\"`\n\t// when defining an environment variable, use it for fields where you want to set additional options.\n\tEnv *EnvVarOption `protobuf:\"bytes,5,opt,name=env,proto3\" json:\"env,omitempty\"`\n}\n\nfunc (x *FieldRule) Reset() {\n\t*x = FieldRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[34]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *FieldRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*FieldRule) ProtoMessage() {}\n\nfunc (x *FieldRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[34]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use FieldRule.ProtoReflect.Descriptor instead.\nfunc (*FieldRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{34}\n}\n\nfunc (x *FieldRule) GetCustomResolver() bool {\n\tif x != nil && x.CustomResolver != nil {\n\t\treturn *x.CustomResolver\n\t}\n\treturn false\n}\n\nfunc (x *FieldRule) GetBy() string {\n\tif x != nil && x.By != nil {\n\t\treturn *x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *FieldRule) GetAlias() string {\n\tif x != nil && x.Alias != nil {\n\t\treturn *x.Alias\n\t}\n\treturn \"\"\n}\n\nfunc (x *FieldRule) GetOneof() *FieldOneof {\n\tif x != nil {\n\t\treturn x.Oneof\n\t}\n\treturn nil\n}\n\nfunc (x *FieldRule) GetEnv() *EnvVarOption {\n\tif x != nil {\n\t\treturn x.Env\n\t}\n\treturn nil\n}\n\n// FieldOneof evaluate \"messages\" or other field only if expr is true and assign to the oneof field.\n// This feature only available in oneof.\ntype FieldOneof struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// cond specify either `expr` or `default`. Only one `default` can be set per oneof.\n\t//\n\t// Types that are assignable to Cond:\n\t//\n\t//\t*FieldOneof_If\n\t//\t*FieldOneof_Default\n\tCond isFieldOneof_Cond `protobuf_oneof:\"cond\"`\n\t// def specify variables to be used in current oneof field's scope for field binding.\n\tDef []*VariableDefinition `protobuf:\"bytes,3,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule and FieldOneOf can be used.\n\tBy string `protobuf:\"bytes,4,opt,name=by,proto3\" json:\"by,omitempty\"`\n}\n\nfunc (x *FieldOneof) Reset() {\n\t*x = FieldOneof{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[35]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *FieldOneof) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*FieldOneof) ProtoMessage() {}\n\nfunc (x *FieldOneof) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[35]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use FieldOneof.ProtoReflect.Descriptor instead.\nfunc (*FieldOneof) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{35}\n}\n\nfunc (m *FieldOneof) GetCond() isFieldOneof_Cond {\n\tif m != nil {\n\t\treturn m.Cond\n\t}\n\treturn nil\n}\n\nfunc (x *FieldOneof) GetIf() string {\n\tif x, ok := x.GetCond().(*FieldOneof_If); ok {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *FieldOneof) GetDefault() bool {\n\tif x, ok := x.GetCond().(*FieldOneof_Default); ok {\n\t\treturn x.Default\n\t}\n\treturn false\n}\n\nfunc (x *FieldOneof) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *FieldOneof) GetBy() string {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\ntype isFieldOneof_Cond interface {\n\tisFieldOneof_Cond()\n}\n\ntype FieldOneof_If struct {\n\t// if describes the condition to be assigned to field.\n\t// The return value must be of type bool.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3,oneof\"`\n}\n\ntype FieldOneof_Default struct {\n\t// default used to assign a value when none of the other fields match any of the specified expressions.\n\t// Only one value can be defined per oneof.\n\tDefault bool `protobuf:\"varint,2,opt,name=default,proto3,oneof\"`\n}\n\nfunc (*FieldOneof_If) isFieldOneof_Cond() {}\n\nfunc (*FieldOneof_Default) isFieldOneof_Cond() {}\n\n// CELPlugin define schema of CEL plugin.\ntype CELPlugin struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tExport []*CELPluginExport `protobuf:\"bytes,1,rep,name=export,proto3\" json:\"export,omitempty\"`\n}\n\nfunc (x *CELPlugin) Reset() {\n\t*x = CELPlugin{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[36]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPlugin) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPlugin) ProtoMessage() {}\n\nfunc (x *CELPlugin) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[36]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPlugin.ProtoReflect.Descriptor instead.\nfunc (*CELPlugin) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{36}\n}\n\nfunc (x *CELPlugin) GetExport() []*CELPluginExport {\n\tif x != nil {\n\t\treturn x.Export\n\t}\n\treturn nil\n}\n\n// CELPluginExport describe the schema to be exposed as a CEL plugin.\ntype CELPluginExport struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the plugin name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// types describe the message type you want to expose.\n\tTypes []*CELReceiverType `protobuf:\"bytes,3,rep,name=types,proto3\" json:\"types,omitempty\"`\n\t// functions describe the definition of the function you want to expose.\n\tFunctions []*CELFunction `protobuf:\"bytes,4,rep,name=functions,proto3\" json:\"functions,omitempty\"`\n\t// variables describe the definition of the variable you want to expose.\n\tVariables  []*CELVariable       `protobuf:\"bytes,5,rep,name=variables,proto3\" json:\"variables,omitempty\"`\n\tCapability *CELPluginCapability `protobuf:\"bytes,6,opt,name=capability,proto3\" json:\"capability,omitempty\"`\n}\n\nfunc (x *CELPluginExport) Reset() {\n\t*x = CELPluginExport{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[37]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginExport) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginExport) ProtoMessage() {}\n\nfunc (x *CELPluginExport) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[37]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginExport.ProtoReflect.Descriptor instead.\nfunc (*CELPluginExport) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{37}\n}\n\nfunc (x *CELPluginExport) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELPluginExport) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELPluginExport) GetTypes() []*CELReceiverType {\n\tif x != nil {\n\t\treturn x.Types\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginExport) GetFunctions() []*CELFunction {\n\tif x != nil {\n\t\treturn x.Functions\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginExport) GetVariables() []*CELVariable {\n\tif x != nil {\n\t\treturn x.Variables\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginExport) GetCapability() *CELPluginCapability {\n\tif x != nil {\n\t\treturn x.Capability\n\t}\n\treturn nil\n}\n\n// CELPluginCapability controls the permissions granted to the WebAssembly plugin.\ntype CELPluginCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// env is the capability for environment variable.\n\tEnv *CELPluginEnvCapability `protobuf:\"bytes,1,opt,name=env,proto3,oneof\" json:\"env,omitempty\"`\n\t// file_system is the capability for file system.\n\tFileSystem *CELPluginFileSystemCapability `protobuf:\"bytes,2,opt,name=file_system,json=fileSystem,proto3,oneof\" json:\"file_system,omitempty\"`\n\t// network is the capability for network.\n\tNetwork *CELPluginNetworkCapability `protobuf:\"bytes,3,opt,name=network,proto3,oneof\" json:\"network,omitempty\"`\n}\n\nfunc (x *CELPluginCapability) Reset() {\n\t*x = CELPluginCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[38]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginCapability) ProtoMessage() {}\n\nfunc (x *CELPluginCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[38]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{38}\n}\n\nfunc (x *CELPluginCapability) GetEnv() *CELPluginEnvCapability {\n\tif x != nil {\n\t\treturn x.Env\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginCapability) GetFileSystem() *CELPluginFileSystemCapability {\n\tif x != nil {\n\t\treturn x.FileSystem\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginCapability) GetNetwork() *CELPluginNetworkCapability {\n\tif x != nil {\n\t\treturn x.Network\n\t}\n\treturn nil\n}\n\n// CELPluginEnvCapability controls access to the environment variable.\ntype CELPluginEnvCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// all allows access to all environment variables.\n\tAll bool `protobuf:\"varint,1,opt,name=all,proto3\" json:\"all,omitempty\"`\n\t// specifies accessible names. If \"all\" is true, it takes precedence.\n\tNames []string `protobuf:\"bytes,2,rep,name=names,proto3\" json:\"names,omitempty\"`\n}\n\nfunc (x *CELPluginEnvCapability) Reset() {\n\t*x = CELPluginEnvCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[39]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginEnvCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginEnvCapability) ProtoMessage() {}\n\nfunc (x *CELPluginEnvCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[39]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginEnvCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginEnvCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{39}\n}\n\nfunc (x *CELPluginEnvCapability) GetAll() bool {\n\tif x != nil {\n\t\treturn x.All\n\t}\n\treturn false\n}\n\nfunc (x *CELPluginEnvCapability) GetNames() []string {\n\tif x != nil {\n\t\treturn x.Names\n\t}\n\treturn nil\n}\n\n// CELPluginFileSystemCapability controls access to the file system.\ntype CELPluginFileSystemCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// mount_path specifies the file path of the host to mount.\n\t// If not specified, the root directory will be used.\n\tMountPath string `protobuf:\"bytes,1,opt,name=mount_path,json=mountPath,proto3\" json:\"mount_path,omitempty\"`\n}\n\nfunc (x *CELPluginFileSystemCapability) Reset() {\n\t*x = CELPluginFileSystemCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[40]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginFileSystemCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginFileSystemCapability) ProtoMessage() {}\n\nfunc (x *CELPluginFileSystemCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[40]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginFileSystemCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginFileSystemCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{40}\n}\n\nfunc (x *CELPluginFileSystemCapability) GetMountPath() string {\n\tif x != nil {\n\t\treturn x.MountPath\n\t}\n\treturn \"\"\n}\n\n// CELPluginNetworkCapability sets permissions related to network access.\n// This is an experimental feature.\ntype CELPluginNetworkCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *CELPluginNetworkCapability) Reset() {\n\t*x = CELPluginNetworkCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[41]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginNetworkCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginNetworkCapability) ProtoMessage() {}\n\nfunc (x *CELPluginNetworkCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[41]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginNetworkCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginNetworkCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{41}\n}\n\n// CELFunction represents the CEL function definition.\ntype CELFunction struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the function name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of function.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// args describe the definition of the function argument.\n\tArgs []*CELFunctionArgument `protobuf:\"bytes,3,rep,name=args,proto3\" json:\"args,omitempty\"`\n\t// return describe the definition of return type of function.\n\tReturn *CELType `protobuf:\"bytes,4,opt,name=return,proto3\" json:\"return,omitempty\"`\n}\n\nfunc (x *CELFunction) Reset() {\n\t*x = CELFunction{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[42]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELFunction) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELFunction) ProtoMessage() {}\n\nfunc (x *CELFunction) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[42]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELFunction.ProtoReflect.Descriptor instead.\nfunc (*CELFunction) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{42}\n}\n\nfunc (x *CELFunction) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunction) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunction) GetArgs() []*CELFunctionArgument {\n\tif x != nil {\n\t\treturn x.Args\n\t}\n\treturn nil\n}\n\nfunc (x *CELFunction) GetReturn() *CELType {\n\tif x != nil {\n\t\treturn x.Return\n\t}\n\treturn nil\n}\n\n// CELReceiverType represents methods tied to the message.\ntype CELReceiverType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the message name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// methods describe the definition of the method for the message.\n\tMethods []*CELFunction `protobuf:\"bytes,3,rep,name=methods,proto3\" json:\"methods,omitempty\"`\n}\n\nfunc (x *CELReceiverType) Reset() {\n\t*x = CELReceiverType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[43]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELReceiverType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELReceiverType) ProtoMessage() {}\n\nfunc (x *CELReceiverType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[43]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELReceiverType.ProtoReflect.Descriptor instead.\nfunc (*CELReceiverType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{43}\n}\n\nfunc (x *CELReceiverType) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELReceiverType) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELReceiverType) GetMethods() []*CELFunction {\n\tif x != nil {\n\t\treturn x.Methods\n\t}\n\treturn nil\n}\n\n// CELFunctionArgument represents the function argument.\ntype CELFunctionArgument struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the argument value name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// type is the argument type.\n\tType *CELType `protobuf:\"bytes,3,opt,name=type,proto3\" json:\"type,omitempty\"`\n}\n\nfunc (x *CELFunctionArgument) Reset() {\n\t*x = CELFunctionArgument{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[44]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELFunctionArgument) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELFunctionArgument) ProtoMessage() {}\n\nfunc (x *CELFunctionArgument) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[44]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELFunctionArgument.ProtoReflect.Descriptor instead.\nfunc (*CELFunctionArgument) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{44}\n}\n\nfunc (x *CELFunctionArgument) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunctionArgument) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunctionArgument) GetType() *CELType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\n// CELType represents type information for CEL plugin interface.\ntype CELType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to Type:\n\t//\n\t//\t*CELType_Kind\n\t//\t*CELType_Repeated\n\t//\t*CELType_Map\n\t//\t*CELType_Message\n\t//\t*CELType_Enum\n\tType isCELType_Type `protobuf_oneof:\"type\"`\n}\n\nfunc (x *CELType) Reset() {\n\t*x = CELType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[45]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELType) ProtoMessage() {}\n\nfunc (x *CELType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[45]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELType.ProtoReflect.Descriptor instead.\nfunc (*CELType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{45}\n}\n\nfunc (m *CELType) GetType() isCELType_Type {\n\tif m != nil {\n\t\treturn m.Type\n\t}\n\treturn nil\n}\n\nfunc (x *CELType) GetKind() TypeKind {\n\tif x, ok := x.GetType().(*CELType_Kind); ok {\n\t\treturn x.Kind\n\t}\n\treturn TypeKind_UNKNOWN\n}\n\nfunc (x *CELType) GetRepeated() *CELType {\n\tif x, ok := x.GetType().(*CELType_Repeated); ok {\n\t\treturn x.Repeated\n\t}\n\treturn nil\n}\n\nfunc (x *CELType) GetMap() *CELMapType {\n\tif x, ok := x.GetType().(*CELType_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\nfunc (x *CELType) GetMessage() string {\n\tif x, ok := x.GetType().(*CELType_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELType) GetEnum() string {\n\tif x, ok := x.GetType().(*CELType_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn \"\"\n}\n\ntype isCELType_Type interface {\n\tisCELType_Type()\n}\n\ntype CELType_Kind struct {\n\t// kind is used when the type is a primitive type.\n\tKind TypeKind `protobuf:\"varint,1,opt,name=kind,proto3,enum=grpc.federation.TypeKind,oneof\"`\n}\n\ntype CELType_Repeated struct {\n\t// repeated is used when the type is a repeated type.\n\tRepeated *CELType `protobuf:\"bytes,2,opt,name=repeated,proto3,oneof\"`\n}\n\ntype CELType_Map struct {\n\t// map is used when the type is a map type.\n\tMap *CELMapType `protobuf:\"bytes,3,opt,name=map,proto3,oneof\"`\n}\n\ntype CELType_Message struct {\n\t// message is a fqdn to the message type.\n\tMessage string `protobuf:\"bytes,4,opt,name=message,proto3,oneof\"`\n}\n\ntype CELType_Enum struct {\n\t// enum is a fqdn to the enum type.\n\tEnum string `protobuf:\"bytes,5,opt,name=enum,proto3,oneof\"`\n}\n\nfunc (*CELType_Kind) isCELType_Type() {}\n\nfunc (*CELType_Repeated) isCELType_Type() {}\n\nfunc (*CELType_Map) isCELType_Type() {}\n\nfunc (*CELType_Message) isCELType_Type() {}\n\nfunc (*CELType_Enum) isCELType_Type() {}\n\n// CELMapType represents map type.\ntype CELMapType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// key represents map's key type.\n\tKey *CELType `protobuf:\"bytes,1,opt,name=key,proto3\" json:\"key,omitempty\"`\n\t// value represents map's value type.\n\tValue *CELType `protobuf:\"bytes,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *CELMapType) Reset() {\n\t*x = CELMapType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[46]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELMapType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELMapType) ProtoMessage() {}\n\nfunc (x *CELMapType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[46]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELMapType.ProtoReflect.Descriptor instead.\nfunc (*CELMapType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{46}\n}\n\nfunc (x *CELMapType) GetKey() *CELType {\n\tif x != nil {\n\t\treturn x.Key\n\t}\n\treturn nil\n}\n\nfunc (x *CELMapType) GetValue() *CELType {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn nil\n}\n\n// CELVariable represents CEL variable.\ntype CELVariable struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the variable name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// type is the variable type.\n\tType *CELType `protobuf:\"bytes,3,opt,name=type,proto3\" json:\"type,omitempty\"`\n}\n\nfunc (x *CELVariable) Reset() {\n\t*x = CELVariable{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[47]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELVariable) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELVariable) ProtoMessage() {}\n\nfunc (x *CELVariable) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[47]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELVariable.ProtoReflect.Descriptor instead.\nfunc (*CELVariable) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{47}\n}\n\nfunc (x *CELVariable) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELVariable) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELVariable) GetType() *CELType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nvar file_grpc_federation_federation_proto_extTypes = []protoimpl.ExtensionInfo{\n\t{\n\t\tExtendedType:  (*descriptorpb.FileOptions)(nil),\n\t\tExtensionType: (*FileRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.file\",\n\t\tTag:           \"bytes,1187,opt,name=file\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*ServiceRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.service\",\n\t\tTag:           \"bytes,1187,opt,name=service\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*MethodRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.method\",\n\t\tTag:           \"bytes,1187,opt,name=method\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MessageOptions)(nil),\n\t\tExtensionType: (*MessageRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.message\",\n\t\tTag:           \"bytes,1187,opt,name=message\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*FieldRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.field\",\n\t\tTag:           \"bytes,1187,opt,name=field\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.EnumOptions)(nil),\n\t\tExtensionType: (*EnumRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.enum\",\n\t\tTag:           \"bytes,1187,opt,name=enum\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.EnumValueOptions)(nil),\n\t\tExtensionType: (*EnumValueRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.enum_value\",\n\t\tTag:           \"bytes,1187,opt,name=enum_value\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.OneofOptions)(nil),\n\t\tExtensionType: (*OneofRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.oneof\",\n\t\tTag:           \"bytes,1187,opt,name=oneof\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n}\n\n// Extension fields to descriptorpb.FileOptions.\nvar (\n\t// optional grpc.federation.FileRule file = 1187;\n\tE_File = &file_grpc_federation_federation_proto_extTypes[0]\n)\n\n// Extension fields to descriptorpb.ServiceOptions.\nvar (\n\t// optional grpc.federation.ServiceRule service = 1187;\n\tE_Service = &file_grpc_federation_federation_proto_extTypes[1]\n)\n\n// Extension fields to descriptorpb.MethodOptions.\nvar (\n\t// optional grpc.federation.MethodRule method = 1187;\n\tE_Method = &file_grpc_federation_federation_proto_extTypes[2]\n)\n\n// Extension fields to descriptorpb.MessageOptions.\nvar (\n\t// optional grpc.federation.MessageRule message = 1187;\n\tE_Message = &file_grpc_federation_federation_proto_extTypes[3]\n)\n\n// Extension fields to descriptorpb.FieldOptions.\nvar (\n\t// optional grpc.federation.FieldRule field = 1187;\n\tE_Field = &file_grpc_federation_federation_proto_extTypes[4]\n)\n\n// Extension fields to descriptorpb.EnumOptions.\nvar (\n\t// optional grpc.federation.EnumRule enum = 1187;\n\tE_Enum = &file_grpc_federation_federation_proto_extTypes[5]\n)\n\n// Extension fields to descriptorpb.EnumValueOptions.\nvar (\n\t// optional grpc.federation.EnumValueRule enum_value = 1187;\n\tE_EnumValue = &file_grpc_federation_federation_proto_extTypes[6]\n)\n\n// Extension fields to descriptorpb.OneofOptions.\nvar (\n\t// optional grpc.federation.OneofRule oneof = 1187;\n\tE_Oneof = &file_grpc_federation_federation_proto_extTypes[7]\n)\n\nvar File_grpc_federation_federation_proto protoreflect.FileDescriptor\n\nvar file_grpc_federation_federation_proto_rawDesc = []byte{\n\t0x0a, 0x20, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x12, 0x0f, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70,\n\t0x63, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x64,\n\t0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x67, 0x72,\n\t0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x70, 0x72,\n\t0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x67, 0x72, 0x70,\n\t0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x74, 0x69, 0x6d,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x56, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x52,\n\t0x75, 0x6c, 0x65, 0x12, 0x32, 0x0a, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52,\n\t0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6d, 0x70, 0x6f, 0x72,\n\t0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x22,\n\t0x20, 0x0a, 0x08, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61,\n\t0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61,\n\t0x73, 0x22, 0xb4, 0x01, 0x0a, 0x0d, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52,\n\t0x75, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x88,\n\t0x01, 0x01, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,\n\t0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x37, 0x0a, 0x04, 0x61, 0x74, 0x74, 0x72,\n\t0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c,\n\t0x75, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, 0x04, 0x61, 0x74, 0x74,\n\t0x72, 0x12, 0x1d, 0x0a, 0x07, 0x6e, 0x6f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x04, 0x20, 0x01,\n\t0x28, 0x08, 0x48, 0x01, 0x52, 0x07, 0x6e, 0x6f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x88, 0x01, 0x01,\n\t0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x42, 0x0a, 0x0a, 0x08,\n\t0x5f, 0x6e, 0x6f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x3e, 0x0a, 0x12, 0x45, 0x6e, 0x75, 0x6d,\n\t0x56, 0x61, 0x6c, 0x75, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x12, 0x12,\n\t0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x0b, 0x0a, 0x09, 0x4f, 0x6e, 0x65, 0x6f,\n\t0x66, 0x52, 0x75, 0x6c, 0x65, 0x22, 0x69, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n\t0x52, 0x75, 0x6c, 0x65, 0x12, 0x26, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x14, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x32, 0x0a, 0x03,\n\t0x76, 0x61, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x03, 0x76, 0x61, 0x72,\n\t0x22, 0x4a, 0x0a, 0x03, 0x45, 0x6e, 0x76, 0x12, 0x29, 0x0a, 0x03, 0x76, 0x61, 0x72, 0x18, 0x01,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x52, 0x03, 0x76,\n\t0x61, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x8b, 0x03, 0x0a,\n\t0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65,\n\t0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01,\n\t0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x66, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x02, 0x69, 0x66, 0x88, 0x01, 0x01, 0x12, 0x10,\n\t0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x62, 0x79,\n\t0x12, 0x2c, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x4d, 0x61, 0x70, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x70, 0x12, 0x38,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52,\n\t0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x50, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x69,\n\t0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x61,\n\t0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x0a,\n\t0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x04, 0x65, 0x6e,\n\t0x75, 0x6d, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x45,\n\t0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x35, 0x0a, 0x06, 0x73,\n\t0x77, 0x69, 0x74, 0x63, 0x68, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x77,\n\t0x69, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x06, 0x73, 0x77, 0x69, 0x74,\n\t0x63, 0x68, 0x42, 0x06, 0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e,\n\t0x61, 0x6d, 0x65, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x66, 0x22, 0x49, 0x0a, 0x1d, 0x53, 0x65,\n\t0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c,\n\t0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69,\n\t0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x66, 0x12, 0x18, 0x0a, 0x07, 0x6d,\n\t0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65,\n\t0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x06, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72,\n\t0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79,\n\t0x70, 0x65, 0x12, 0x3a, 0x0a, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x48, 0x00, 0x52, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x09,\n\t0x0a, 0x07, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xab, 0x01, 0x0a, 0x07, 0x45, 0x6e,\n\t0x76, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2f, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x00,\n\t0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x36, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74,\n\t0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79,\n\t0x70, 0x65, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2f,\n\t0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e,\n\t0x76, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x70, 0x42,\n\t0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x68, 0x0a, 0x0a, 0x45, 0x6e, 0x76, 0x4d, 0x61,\n\t0x70, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2a, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79, 0x70, 0x65, 0x52, 0x03, 0x6b, 0x65,\n\t0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,\n\t0x65, 0x22, 0xc3, 0x01, 0x0a, 0x0c, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x09, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61,\n\t0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c,\n\t0x74, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72,\n\t0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64,\n\t0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x07, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65,\n\t0x64, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61,\n\t0x74, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x42, 0x0b,\n\t0x0a, 0x09, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x5f,\n\t0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x22, 0x65, 0x0a, 0x0a, 0x4d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75,\n\t0x74, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e,\n\t0x73, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75,\n\t0x74, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9c,\n\t0x01, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x35,\n\t0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61,\n\t0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e,\n\t0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f,\n\t0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00,\n\t0x52, 0x0e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72,\n\t0x88, 0x01, 0x01, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x03, 0x20, 0x03,\n\t0x28, 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x75,\n\t0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x22, 0xde, 0x03,\n\t0x0a, 0x12, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69,\n\t0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x48, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x13, 0x0a,\n\t0x02, 0x69, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x02, 0x69, 0x66, 0x88,\n\t0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x18, 0x03,\n\t0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64,\n\t0x88, 0x01, 0x01, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48,\n\t0x00, 0x52, 0x02, 0x62, 0x79, 0x12, 0x2c, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x0c, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x61, 0x70, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x03,\n\t0x6d, 0x61, 0x70, 0x12, 0x38, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0d,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78,\n\t0x70, 0x72, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2f, 0x0a,\n\t0x04, 0x63, 0x61, 0x6c, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x61,\n\t0x6c, 0x6c, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x63, 0x61, 0x6c, 0x6c, 0x12, 0x41,\n\t0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45,\n\t0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x12, 0x2f, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e,\n\t0x75, 0x6d, 0x12, 0x35, 0x0a, 0x06, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x18, 0x11, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x48,\n\t0x00, 0x52, 0x06, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x42, 0x06, 0x0a, 0x04, 0x65, 0x78, 0x70,\n\t0x72, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69,\n\t0x66, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x22, 0xc5,\n\t0x01, 0x0a, 0x07, 0x4d, 0x61, 0x70, 0x45, 0x78, 0x70, 0x72, 0x12, 0x35, 0x0a, 0x08, 0x69, 0x74,\n\t0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49,\n\t0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f,\n\t0x72, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,\n\t0x02, 0x62, 0x79, 0x12, 0x38, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0c,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78,\n\t0x70, 0x72, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2f, 0x0a,\n\t0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e,\n\t0x75, 0x6d, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x42, 0x06,\n\t0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x22, 0x30, 0x0a, 0x08, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74,\n\t0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x72, 0x63, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x72, 0x63, 0x22, 0x50, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x45, 0x78, 0x70, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x04, 0x61,\n\t0x72, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x41, 0x72, 0x67, 0x75,\n\t0x6d, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x22, 0x2e, 0x0a, 0x08, 0x45, 0x6e,\n\t0x75, 0x6d, 0x45, 0x78, 0x70, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x62, 0x79,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x62, 0x79, 0x22, 0xf3, 0x02, 0x0a, 0x08, 0x43,\n\t0x61, 0x6c, 0x6c, 0x45, 0x78, 0x70, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12,\n\t0x38, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x07, 0x74, 0x69, 0x6d,\n\t0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x74, 0x69,\n\t0x6d, 0x65, 0x6f, 0x75, 0x74, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x05, 0x72, 0x65, 0x74, 0x72,\n\t0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50,\n\t0x6f, 0x6c, 0x69, 0x63, 0x79, 0x48, 0x01, 0x52, 0x05, 0x72, 0x65, 0x74, 0x72, 0x79, 0x88, 0x01,\n\t0x01, 0x12, 0x30, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72,\n\t0x72, 0x6f, 0x72, 0x12, 0x3c, 0x0a, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x43, 0x61, 0x6c, 0x6c, 0x4f, 0x70,\n\t0x74, 0x69, 0x6f, 0x6e, 0x48, 0x02, 0x52, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01,\n\t0x01, 0x12, 0x1f, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20,\n\t0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x88,\n\t0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x42, 0x08,\n\t0x0a, 0x06, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x79, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,\n\t0x22, 0x7f, 0x0a, 0x0a, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x12, 0x33,\n\t0x0a, 0x04, 0x63, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53,\n\t0x77, 0x69, 0x74, 0x63, 0x68, 0x43, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x72, 0x52, 0x04, 0x63,\n\t0x61, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x44, 0x65, 0x66,\n\t0x61, 0x75, 0x6c, 0x74, 0x45, 0x78, 0x70, 0x72, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c,\n\t0x74, 0x22, 0x71, 0x0a, 0x0e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x43, 0x61, 0x73, 0x65, 0x45,\n\t0x78, 0x70, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x02, 0x69, 0x66, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e,\n\t0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x79,\n\t0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x62, 0x79, 0x42, 0x06, 0x0a, 0x04,\n\t0x65, 0x78, 0x70, 0x72, 0x22, 0x64, 0x0a, 0x11, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x44, 0x65,\n\t0x66, 0x61, 0x75, 0x6c, 0x74, 0x45, 0x78, 0x70, 0x72, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66,\n\t0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c,\n\t0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66,\n\t0x12, 0x10, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02,\n\t0x62, 0x79, 0x42, 0x06, 0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x22, 0x86, 0x04, 0x0a, 0x09, 0x47,\n\t0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18,\n\t0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65,\n\t0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12,\n\t0x13, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x69,\n\t0x66, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x0e, 0x32, 0x10, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e,\n\t0x43, 0x6f, 0x64, 0x65, 0x48, 0x01, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12,\n\t0x1d, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,\n\t0x48, 0x02, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a,\n\t0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x20, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69,\n\t0x6c, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x69, 0x67,\n\t0x6e, 0x6f, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x06, 0x69, 0x67,\n\t0x6e, 0x6f, 0x72, 0x65, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x67, 0x6e, 0x6f, 0x72,\n\t0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x07,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x11, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x41, 0x6e,\n\t0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x88, 0x01, 0x01, 0x12, 0x45, 0x0a, 0x09,\n\t0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32,\n\t0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x4c, 0x6f, 0x67, 0x4c,\n\t0x65, 0x76, 0x65, 0x6c, 0x48, 0x05, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c,\n\t0x88, 0x01, 0x01, 0x22, 0x41, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12,\n\t0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05,\n\t0x44, 0x45, 0x42, 0x55, 0x47, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x4e, 0x46, 0x4f, 0x10,\n\t0x02, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x41, 0x52, 0x4e, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x45,\n\t0x52, 0x52, 0x4f, 0x52, 0x10, 0x04, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x66, 0x42, 0x07, 0x0a,\n\t0x05, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61,\n\t0x67, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x42, 0x16, 0x0a,\n\t0x14, 0x5f, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x72, 0x65, 0x73,\n\t0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65,\n\t0x76, 0x65, 0x6c, 0x22, 0xfa, 0x05, 0x0a, 0x0f, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f,\n\t0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x66, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x02,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44,\n\t0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x36,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78, 0x70, 0x72, 0x52, 0x07, 0x6d,\n\t0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f,\n\t0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66,\n\t0x6f, 0x52, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x34, 0x0a, 0x0a,\n\t0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65,\n\t0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x72, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e,\n\t0x66, 0x6f, 0x12, 0x34, 0x0a, 0x0a, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x69, 0x6e, 0x66, 0x6f,\n\t0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x64,\n\t0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3d, 0x0a, 0x0d, 0x71, 0x75, 0x6f, 0x74,\n\t0x61, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x6f,\n\t0x74, 0x61, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x0c, 0x71, 0x75, 0x6f, 0x74, 0x61,\n\t0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x52, 0x0a, 0x14, 0x70, 0x72, 0x65, 0x63, 0x6f,\n\t0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18,\n\t0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72,\n\t0x70, 0x63, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x46,\n\t0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x13, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69,\n\t0x74, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x62,\n\t0x61, 0x64, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61,\n\t0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x62, 0x61, 0x64, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f,\n\t0x69, 0x6e, 0x66, 0x6f, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49,\n\t0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f,\n\t0x12, 0x3d, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66,\n\t0x6f, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66,\n\t0x6f, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12,\n\t0x24, 0x0a, 0x04, 0x68, 0x65, 0x6c, 0x70, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x48, 0x65, 0x6c, 0x70, 0x52,\n\t0x04, 0x68, 0x65, 0x6c, 0x70, 0x12, 0x49, 0x0a, 0x11, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a,\n\t0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f,\n\t0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x10,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,\n\t0x12, 0x0e, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x02, 0x62, 0x79,\n\t0x22, 0xc7, 0x03, 0x0a, 0x0e, 0x47, 0x52, 0x50, 0x43, 0x43, 0x61, 0x6c, 0x6c, 0x4f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x73,\n\t0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0e,\n\t0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x88, 0x01,\n\t0x01, 0x12, 0x1b, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x48, 0x01, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x37,\n\t0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x72, 0x65, 0x63, 0x76, 0x5f,\n\t0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02,\n\t0x52, 0x12, 0x6d, 0x61, 0x78, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x63, 0x76, 0x4d, 0x73, 0x67,\n\t0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x63,\n\t0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a,\n\t0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x43, 0x61,\n\t0x6c, 0x6c, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01,\n\t0x12, 0x28, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x48, 0x04, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x69,\n\t0x63, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x74, 0x72,\n\t0x61, 0x69, 0x6c, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x07, 0x74,\n\t0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x0e, 0x77, 0x61, 0x69,\n\t0x74, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28,\n\t0x08, 0x48, 0x06, 0x52, 0x0c, 0x77, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x52, 0x65, 0x61, 0x64,\n\t0x79, 0x88, 0x01, 0x01, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,\n\t0x5f, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x68, 0x65, 0x61,\n\t0x64, 0x65, 0x72, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c,\n\t0x5f, 0x72, 0x65, 0x63, 0x76, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x19,\n\t0x0a, 0x17, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x65, 0x6e, 0x64,\n\t0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x74,\n\t0x61, 0x74, 0x69, 0x63, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x5f,\n\t0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x77, 0x61, 0x69, 0x74,\n\t0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x22, 0x64, 0x0a, 0x0e, 0x56, 0x61,\n\t0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72, 0x12, 0x17, 0x0a, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72,\n\t0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65,\n\t0x22, 0xb8, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,\n\t0x12, 0x42, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,\n\t0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x73,\n\t0x74, 0x61, 0x6e, 0x74, 0x12, 0x4b, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74,\n\t0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x72,\n\t0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x69,\n\t0x61, 0x6c, 0x48, 0x00, 0x52, 0x0b, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x69, 0x61,\n\t0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,\n\t0x66, 0x42, 0x08, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x79, 0x0a, 0x13, 0x52,\n\t0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61,\n\t0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c,\n\t0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69,\n\t0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, 0x01, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x52,\n\t0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x69, 0x6e,\n\t0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x72,\n\t0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0xd1, 0x02, 0x0a, 0x16, 0x52, 0x65, 0x74, 0x72, 0x79,\n\t0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x69, 0x61,\n\t0x6c, 0x12, 0x2e, 0x0a, 0x10, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x74,\n\t0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0f, 0x69,\n\t0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x88, 0x01,\n\t0x01, 0x12, 0x36, 0x0a, 0x14, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x48,\n\t0x01, 0x52, 0x13, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0a, 0x6d, 0x75, 0x6c,\n\t0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x48, 0x02, 0x52,\n\t0x0a, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x26,\n\t0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x04,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x49, 0x6e, 0x74, 0x65, 0x72,\n\t0x76, 0x61, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65,\n\t0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x48, 0x04, 0x52, 0x0a, 0x6d,\n\t0x61, 0x78, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x42, 0x13, 0x0a, 0x11,\n\t0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61,\n\t0x6c, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x6d,\n\t0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6d, 0x61,\n\t0x78, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d,\n\t0x61, 0x78, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x5d, 0x0a, 0x0d, 0x4d, 0x65,\n\t0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x66,\n\t0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c,\n\t0x64, 0x12, 0x13, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,\n\t0x02, 0x62, 0x79, 0x88, 0x01, 0x01, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x48, 0x01, 0x52, 0x02, 0x69, 0x66, 0x88, 0x01, 0x01, 0x42, 0x05, 0x0a, 0x03, 0x5f,\n\t0x62, 0x79, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x66, 0x22, 0x85, 0x01, 0x0a, 0x0e, 0x4d, 0x65,\n\t0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x17, 0x0a, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x88, 0x01, 0x01,\n\t0x12, 0x1f, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x08, 0x48, 0x02, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x88, 0x01,\n\t0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x66,\n\t0x69, 0x65, 0x6c, 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e,\n\t0x64, 0x22, 0x62, 0x0a, 0x08, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x12, 0x13, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,\n\t0x02, 0x62, 0x79, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x06, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65,\n\t0x88, 0x01, 0x01, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x62, 0x79, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x69,\n\t0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0xf2, 0x01, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52,\n\t0x75, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65,\n\t0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0e,\n\t0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x88, 0x01,\n\t0x01, 0x12, 0x13, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52,\n\t0x02, 0x62, 0x79, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x88, 0x01,\n\t0x01, 0x12, 0x31, 0x0a, 0x05, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x52, 0x05, 0x6f,\n\t0x6e, 0x65, 0x6f, 0x66, 0x12, 0x2f, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x05, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x52, 0x03, 0x65, 0x6e, 0x76, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d,\n\t0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x62, 0x79,\n\t0x42, 0x08, 0x0a, 0x06, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x89, 0x01, 0x0a, 0x0a, 0x46,\n\t0x69, 0x65, 0x6c, 0x64, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x12, 0x10, 0x0a, 0x02, 0x69, 0x66, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x69, 0x66, 0x12, 0x1a, 0x0a, 0x07, 0x64,\n\t0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x07,\n\t0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x03,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44,\n\t0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x0e,\n\t0x0a, 0x02, 0x62, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x62, 0x79, 0x42, 0x06,\n\t0x0a, 0x04, 0x63, 0x6f, 0x6e, 0x64, 0x22, 0x45, 0x0a, 0x09, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75,\n\t0x67, 0x69, 0x6e, 0x12, 0x38, 0x0a, 0x06, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20,\n\t0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x45,\n\t0x78, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x06, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x22, 0xaf, 0x02,\n\t0x0a, 0x0f, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x45, 0x78, 0x70, 0x6f, 0x72,\n\t0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x36, 0x0a, 0x05, 0x74, 0x79, 0x70,\n\t0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x52, 0x65,\n\t0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x74, 0x79, 0x70, 0x65,\n\t0x73, 0x12, 0x3a, 0x0a, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69,\n\t0x6f, 0x6e, 0x52, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3a, 0x0a,\n\t0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x09,\n\t0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x44, 0x0a, 0x0a, 0x63, 0x61, 0x70,\n\t0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c,\n\t0x69, 0x74, 0x79, 0x52, 0x0a, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22,\n\t0x9b, 0x02, 0x0a, 0x13, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x70,\n\t0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x3e, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e,\n\t0x45, 0x6e, 0x76, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x48, 0x00, 0x52,\n\t0x03, 0x65, 0x6e, 0x76, 0x88, 0x01, 0x01, 0x12, 0x54, 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x65, 0x5f,\n\t0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43,\n\t0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x73, 0x74,\n\t0x65, 0x6d, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x48, 0x01, 0x52, 0x0a,\n\t0x66, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x4a, 0x0a,\n\t0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b,\n\t0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72,\n\t0x6b, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x48, 0x02, 0x52, 0x07, 0x6e,\n\t0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x88, 0x01, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x65, 0x6e,\n\t0x76, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65,\n\t0x6d, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x40, 0x0a,\n\t0x16, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x45, 0x6e, 0x76, 0x43, 0x61, 0x70,\n\t0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d,\n\t0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22,\n\t0x3e, 0x0a, 0x1d, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65,\n\t0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79,\n\t0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 0x74, 0x68, 0x22,\n\t0x1c, 0x0a, 0x1a, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x4e, 0x65, 0x74, 0x77,\n\t0x6f, 0x72, 0x6b, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22, 0xa1, 0x01,\n\t0x0a, 0x0b, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x38, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x03, 0x20,\n\t0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,\n\t0x6e, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12,\n\t0x30, 0x0a, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72,\n\t0x6e, 0x22, 0x71, 0x0a, 0x0f, 0x43, 0x45, 0x4c, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72,\n\t0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x36, 0x0a, 0x07,\n\t0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x6d, 0x65, 0x74,\n\t0x68, 0x6f, 0x64, 0x73, 0x22, 0x6b, 0x0a, 0x13, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74,\n\t0x69, 0x6f, 0x6e, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,\n\t0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64,\n\t0x65, 0x73, 0x63, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70,\n\t0x65, 0x22, 0xdd, 0x01, 0x0a, 0x07, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2f, 0x0a,\n\t0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x79,\n\t0x70, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x36,\n\t0x0a, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65,\n\t0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2f, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65,\n\t0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x70, 0x12, 0x1a, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61,\n\t0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28,\n\t0x09, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70,\n\t0x65, 0x22, 0x68, 0x0a, 0x0a, 0x43, 0x45, 0x4c, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65, 0x12,\n\t0x2a, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43,\n\t0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76,\n\t0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70,\n\t0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c,\n\t0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x63, 0x0a, 0x0b, 0x43,\n\t0x45, 0x4c, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12,\n\t0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65,\n\t0x73, 0x63, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65,\n\t0x2a, 0x5e, 0x0a, 0x08, 0x54, 0x79, 0x70, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x0b, 0x0a, 0x07,\n\t0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52,\n\t0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x4f, 0x4f, 0x4c, 0x10, 0x02, 0x12,\n\t0x09, 0x0a, 0x05, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x49,\n\t0x4e, 0x54, 0x36, 0x34, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45,\n\t0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x06,\n\t0x3a, 0x4c, 0x0a, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x46, 0x69, 0x6c, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x3a, 0x58,\n\t0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52,\n\t0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x3a, 0x54, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a, 0x58,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52,\n\t0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x50, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c,\n\t0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52,\n\t0x75, 0x6c, 0x65, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x3a, 0x4c, 0x0a, 0x04, 0x65, 0x6e,\n\t0x75, 0x6d, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x75,\n\t0x6c, 0x65, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x3a, 0x61, 0x0a, 0x0a, 0x65, 0x6e, 0x75, 0x6d,\n\t0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c,\n\t0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x1e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x75, 0x6c, 0x65,\n\t0x52, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x50, 0x0a, 0x05, 0x6f,\n\t0x6e, 0x65, 0x6f, 0x66, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70,\n\t0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x6e, 0x65,\n\t0x6f, 0x66, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x42, 0xc2, 0x01,\n\t0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0f, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,\n\t0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x65, 0x72, 0x63, 0x61, 0x72, 0x69, 0x2f, 0x67, 0x72, 0x70,\n\t0x63, 0x2d, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x67, 0x72, 0x70,\n\t0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xa2, 0x02, 0x03, 0x47, 0x46, 0x58, 0xaa, 0x02, 0x0f,\n\t0x47, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xca,\n\t0x02, 0x0f, 0x47, 0x72, 0x70, 0x63, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0xe2, 0x02, 0x1b, 0x47, 0x72, 0x70, 0x63, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea,\n\t0x02, 0x10, 0x47, 0x72, 0x70, 0x63, 0x3a, 0x3a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_grpc_federation_federation_proto_rawDescOnce sync.Once\n\tfile_grpc_federation_federation_proto_rawDescData = file_grpc_federation_federation_proto_rawDesc\n)\n\nfunc file_grpc_federation_federation_proto_rawDescGZIP() []byte {\n\tfile_grpc_federation_federation_proto_rawDescOnce.Do(func() {\n\t\tfile_grpc_federation_federation_proto_rawDescData = protoimpl.X.CompressGZIP(file_grpc_federation_federation_proto_rawDescData)\n\t})\n\treturn file_grpc_federation_federation_proto_rawDescData\n}\n\nvar file_grpc_federation_federation_proto_enumTypes = make([]protoimpl.EnumInfo, 2)\nvar file_grpc_federation_federation_proto_msgTypes = make([]protoimpl.MessageInfo, 48)\nvar file_grpc_federation_federation_proto_goTypes = []interface{}{\n\t(TypeKind)(0),                          // 0: grpc.federation.TypeKind\n\t(GRPCError_LogLevel)(0),                // 1: grpc.federation.GRPCError.LogLevel\n\t(*FileRule)(nil),                       // 2: grpc.federation.FileRule\n\t(*EnumRule)(nil),                       // 3: grpc.federation.EnumRule\n\t(*EnumValueRule)(nil),                  // 4: grpc.federation.EnumValueRule\n\t(*EnumValueAttribute)(nil),             // 5: grpc.federation.EnumValueAttribute\n\t(*OneofRule)(nil),                      // 6: grpc.federation.OneofRule\n\t(*ServiceRule)(nil),                    // 7: grpc.federation.ServiceRule\n\t(*Env)(nil),                            // 8: grpc.federation.Env\n\t(*ServiceVariable)(nil),                // 9: grpc.federation.ServiceVariable\n\t(*ServiceVariableValidationExpr)(nil),  // 10: grpc.federation.ServiceVariableValidationExpr\n\t(*EnvVar)(nil),                         // 11: grpc.federation.EnvVar\n\t(*EnvType)(nil),                        // 12: grpc.federation.EnvType\n\t(*EnvMapType)(nil),                     // 13: grpc.federation.EnvMapType\n\t(*EnvVarOption)(nil),                   // 14: grpc.federation.EnvVarOption\n\t(*MethodRule)(nil),                     // 15: grpc.federation.MethodRule\n\t(*MessageRule)(nil),                    // 16: grpc.federation.MessageRule\n\t(*VariableDefinition)(nil),             // 17: grpc.federation.VariableDefinition\n\t(*MapExpr)(nil),                        // 18: grpc.federation.MapExpr\n\t(*Iterator)(nil),                       // 19: grpc.federation.Iterator\n\t(*MessageExpr)(nil),                    // 20: grpc.federation.MessageExpr\n\t(*EnumExpr)(nil),                       // 21: grpc.federation.EnumExpr\n\t(*CallExpr)(nil),                       // 22: grpc.federation.CallExpr\n\t(*SwitchExpr)(nil),                     // 23: grpc.federation.SwitchExpr\n\t(*SwitchCaseExpr)(nil),                 // 24: grpc.federation.SwitchCaseExpr\n\t(*SwitchDefaultExpr)(nil),              // 25: grpc.federation.SwitchDefaultExpr\n\t(*GRPCError)(nil),                      // 26: grpc.federation.GRPCError\n\t(*GRPCErrorDetail)(nil),                // 27: grpc.federation.GRPCErrorDetail\n\t(*GRPCCallOption)(nil),                 // 28: grpc.federation.GRPCCallOption\n\t(*ValidationExpr)(nil),                 // 29: grpc.federation.ValidationExpr\n\t(*RetryPolicy)(nil),                    // 30: grpc.federation.RetryPolicy\n\t(*RetryPolicyConstant)(nil),            // 31: grpc.federation.RetryPolicyConstant\n\t(*RetryPolicyExponential)(nil),         // 32: grpc.federation.RetryPolicyExponential\n\t(*MethodRequest)(nil),                  // 33: grpc.federation.MethodRequest\n\t(*MethodResponse)(nil),                 // 34: grpc.federation.MethodResponse\n\t(*Argument)(nil),                       // 35: grpc.federation.Argument\n\t(*FieldRule)(nil),                      // 36: grpc.federation.FieldRule\n\t(*FieldOneof)(nil),                     // 37: grpc.federation.FieldOneof\n\t(*CELPlugin)(nil),                      // 38: grpc.federation.CELPlugin\n\t(*CELPluginExport)(nil),                // 39: grpc.federation.CELPluginExport\n\t(*CELPluginCapability)(nil),            // 40: grpc.federation.CELPluginCapability\n\t(*CELPluginEnvCapability)(nil),         // 41: grpc.federation.CELPluginEnvCapability\n\t(*CELPluginFileSystemCapability)(nil),  // 42: grpc.federation.CELPluginFileSystemCapability\n\t(*CELPluginNetworkCapability)(nil),     // 43: grpc.federation.CELPluginNetworkCapability\n\t(*CELFunction)(nil),                    // 44: grpc.federation.CELFunction\n\t(*CELReceiverType)(nil),                // 45: grpc.federation.CELReceiverType\n\t(*CELFunctionArgument)(nil),            // 46: grpc.federation.CELFunctionArgument\n\t(*CELType)(nil),                        // 47: grpc.federation.CELType\n\t(*CELMapType)(nil),                     // 48: grpc.federation.CELMapType\n\t(*CELVariable)(nil),                    // 49: grpc.federation.CELVariable\n\t(code.Code)(0),                         // 50: google.rpc.Code\n\t(*errdetails.ErrorInfo)(nil),           // 51: google.rpc.ErrorInfo\n\t(*errdetails.RetryInfo)(nil),           // 52: google.rpc.RetryInfo\n\t(*errdetails.DebugInfo)(nil),           // 53: google.rpc.DebugInfo\n\t(*errdetails.QuotaFailure)(nil),        // 54: google.rpc.QuotaFailure\n\t(*errdetails.PreconditionFailure)(nil), // 55: google.rpc.PreconditionFailure\n\t(*errdetails.BadRequest)(nil),          // 56: google.rpc.BadRequest\n\t(*errdetails.RequestInfo)(nil),         // 57: google.rpc.RequestInfo\n\t(*errdetails.ResourceInfo)(nil),        // 58: google.rpc.ResourceInfo\n\t(*errdetails.Help)(nil),                // 59: google.rpc.Help\n\t(*errdetails.LocalizedMessage)(nil),    // 60: google.rpc.LocalizedMessage\n\t(*descriptorpb.FileOptions)(nil),       // 61: google.protobuf.FileOptions\n\t(*descriptorpb.ServiceOptions)(nil),    // 62: google.protobuf.ServiceOptions\n\t(*descriptorpb.MethodOptions)(nil),     // 63: google.protobuf.MethodOptions\n\t(*descriptorpb.MessageOptions)(nil),    // 64: google.protobuf.MessageOptions\n\t(*descriptorpb.FieldOptions)(nil),      // 65: google.protobuf.FieldOptions\n\t(*descriptorpb.EnumOptions)(nil),       // 66: google.protobuf.EnumOptions\n\t(*descriptorpb.EnumValueOptions)(nil),  // 67: google.protobuf.EnumValueOptions\n\t(*descriptorpb.OneofOptions)(nil),      // 68: google.protobuf.OneofOptions\n}\nvar file_grpc_federation_federation_proto_depIdxs = []int32{\n\t38, // 0: grpc.federation.FileRule.plugin:type_name -> grpc.federation.CELPlugin\n\t5,  // 1: grpc.federation.EnumValueRule.attr:type_name -> grpc.federation.EnumValueAttribute\n\t8,  // 2: grpc.federation.ServiceRule.env:type_name -> grpc.federation.Env\n\t9,  // 3: grpc.federation.ServiceRule.var:type_name -> grpc.federation.ServiceVariable\n\t11, // 4: grpc.federation.Env.var:type_name -> grpc.federation.EnvVar\n\t18, // 5: grpc.federation.ServiceVariable.map:type_name -> grpc.federation.MapExpr\n\t20, // 6: grpc.federation.ServiceVariable.message:type_name -> grpc.federation.MessageExpr\n\t10, // 7: grpc.federation.ServiceVariable.validation:type_name -> grpc.federation.ServiceVariableValidationExpr\n\t21, // 8: grpc.federation.ServiceVariable.enum:type_name -> grpc.federation.EnumExpr\n\t23, // 9: grpc.federation.ServiceVariable.switch:type_name -> grpc.federation.SwitchExpr\n\t12, // 10: grpc.federation.EnvVar.type:type_name -> grpc.federation.EnvType\n\t14, // 11: grpc.federation.EnvVar.option:type_name -> grpc.federation.EnvVarOption\n\t0,  // 12: grpc.federation.EnvType.kind:type_name -> grpc.federation.TypeKind\n\t12, // 13: grpc.federation.EnvType.repeated:type_name -> grpc.federation.EnvType\n\t13, // 14: grpc.federation.EnvType.map:type_name -> grpc.federation.EnvMapType\n\t12, // 15: grpc.federation.EnvMapType.key:type_name -> grpc.federation.EnvType\n\t12, // 16: grpc.federation.EnvMapType.value:type_name -> grpc.federation.EnvType\n\t17, // 17: grpc.federation.MessageRule.def:type_name -> grpc.federation.VariableDefinition\n\t18, // 18: grpc.federation.VariableDefinition.map:type_name -> grpc.federation.MapExpr\n\t20, // 19: grpc.federation.VariableDefinition.message:type_name -> grpc.federation.MessageExpr\n\t22, // 20: grpc.federation.VariableDefinition.call:type_name -> grpc.federation.CallExpr\n\t29, // 21: grpc.federation.VariableDefinition.validation:type_name -> grpc.federation.ValidationExpr\n\t21, // 22: grpc.federation.VariableDefinition.enum:type_name -> grpc.federation.EnumExpr\n\t23, // 23: grpc.federation.VariableDefinition.switch:type_name -> grpc.federation.SwitchExpr\n\t19, // 24: grpc.federation.MapExpr.iterator:type_name -> grpc.federation.Iterator\n\t20, // 25: grpc.federation.MapExpr.message:type_name -> grpc.federation.MessageExpr\n\t21, // 26: grpc.federation.MapExpr.enum:type_name -> grpc.federation.EnumExpr\n\t35, // 27: grpc.federation.MessageExpr.args:type_name -> grpc.federation.Argument\n\t33, // 28: grpc.federation.CallExpr.request:type_name -> grpc.federation.MethodRequest\n\t30, // 29: grpc.federation.CallExpr.retry:type_name -> grpc.federation.RetryPolicy\n\t26, // 30: grpc.federation.CallExpr.error:type_name -> grpc.federation.GRPCError\n\t28, // 31: grpc.federation.CallExpr.option:type_name -> grpc.federation.GRPCCallOption\n\t24, // 32: grpc.federation.SwitchExpr.case:type_name -> grpc.federation.SwitchCaseExpr\n\t25, // 33: grpc.federation.SwitchExpr.default:type_name -> grpc.federation.SwitchDefaultExpr\n\t17, // 34: grpc.federation.SwitchCaseExpr.def:type_name -> grpc.federation.VariableDefinition\n\t17, // 35: grpc.federation.SwitchDefaultExpr.def:type_name -> grpc.federation.VariableDefinition\n\t17, // 36: grpc.federation.GRPCError.def:type_name -> grpc.federation.VariableDefinition\n\t50, // 37: grpc.federation.GRPCError.code:type_name -> google.rpc.Code\n\t27, // 38: grpc.federation.GRPCError.details:type_name -> grpc.federation.GRPCErrorDetail\n\t1,  // 39: grpc.federation.GRPCError.log_level:type_name -> grpc.federation.GRPCError.LogLevel\n\t17, // 40: grpc.federation.GRPCErrorDetail.def:type_name -> grpc.federation.VariableDefinition\n\t20, // 41: grpc.federation.GRPCErrorDetail.message:type_name -> grpc.federation.MessageExpr\n\t51, // 42: grpc.federation.GRPCErrorDetail.error_info:type_name -> google.rpc.ErrorInfo\n\t52, // 43: grpc.federation.GRPCErrorDetail.retry_info:type_name -> google.rpc.RetryInfo\n\t53, // 44: grpc.federation.GRPCErrorDetail.debug_info:type_name -> google.rpc.DebugInfo\n\t54, // 45: grpc.federation.GRPCErrorDetail.quota_failure:type_name -> google.rpc.QuotaFailure\n\t55, // 46: grpc.federation.GRPCErrorDetail.precondition_failure:type_name -> google.rpc.PreconditionFailure\n\t56, // 47: grpc.federation.GRPCErrorDetail.bad_request:type_name -> google.rpc.BadRequest\n\t57, // 48: grpc.federation.GRPCErrorDetail.request_info:type_name -> google.rpc.RequestInfo\n\t58, // 49: grpc.federation.GRPCErrorDetail.resource_info:type_name -> google.rpc.ResourceInfo\n\t59, // 50: grpc.federation.GRPCErrorDetail.help:type_name -> google.rpc.Help\n\t60, // 51: grpc.federation.GRPCErrorDetail.localized_message:type_name -> google.rpc.LocalizedMessage\n\t26, // 52: grpc.federation.ValidationExpr.error:type_name -> grpc.federation.GRPCError\n\t31, // 53: grpc.federation.RetryPolicy.constant:type_name -> grpc.federation.RetryPolicyConstant\n\t32, // 54: grpc.federation.RetryPolicy.exponential:type_name -> grpc.federation.RetryPolicyExponential\n\t37, // 55: grpc.federation.FieldRule.oneof:type_name -> grpc.federation.FieldOneof\n\t14, // 56: grpc.federation.FieldRule.env:type_name -> grpc.federation.EnvVarOption\n\t17, // 57: grpc.federation.FieldOneof.def:type_name -> grpc.federation.VariableDefinition\n\t39, // 58: grpc.federation.CELPlugin.export:type_name -> grpc.federation.CELPluginExport\n\t45, // 59: grpc.federation.CELPluginExport.types:type_name -> grpc.federation.CELReceiverType\n\t44, // 60: grpc.federation.CELPluginExport.functions:type_name -> grpc.federation.CELFunction\n\t49, // 61: grpc.federation.CELPluginExport.variables:type_name -> grpc.federation.CELVariable\n\t40, // 62: grpc.federation.CELPluginExport.capability:type_name -> grpc.federation.CELPluginCapability\n\t41, // 63: grpc.federation.CELPluginCapability.env:type_name -> grpc.federation.CELPluginEnvCapability\n\t42, // 64: grpc.federation.CELPluginCapability.file_system:type_name -> grpc.federation.CELPluginFileSystemCapability\n\t43, // 65: grpc.federation.CELPluginCapability.network:type_name -> grpc.federation.CELPluginNetworkCapability\n\t46, // 66: grpc.federation.CELFunction.args:type_name -> grpc.federation.CELFunctionArgument\n\t47, // 67: grpc.federation.CELFunction.return:type_name -> grpc.federation.CELType\n\t44, // 68: grpc.federation.CELReceiverType.methods:type_name -> grpc.federation.CELFunction\n\t47, // 69: grpc.federation.CELFunctionArgument.type:type_name -> grpc.federation.CELType\n\t0,  // 70: grpc.federation.CELType.kind:type_name -> grpc.federation.TypeKind\n\t47, // 71: grpc.federation.CELType.repeated:type_name -> grpc.federation.CELType\n\t48, // 72: grpc.federation.CELType.map:type_name -> grpc.federation.CELMapType\n\t47, // 73: grpc.federation.CELMapType.key:type_name -> grpc.federation.CELType\n\t47, // 74: grpc.federation.CELMapType.value:type_name -> grpc.federation.CELType\n\t47, // 75: grpc.federation.CELVariable.type:type_name -> grpc.federation.CELType\n\t61, // 76: grpc.federation.file:extendee -> google.protobuf.FileOptions\n\t62, // 77: grpc.federation.service:extendee -> google.protobuf.ServiceOptions\n\t63, // 78: grpc.federation.method:extendee -> google.protobuf.MethodOptions\n\t64, // 79: grpc.federation.message:extendee -> google.protobuf.MessageOptions\n\t65, // 80: grpc.federation.field:extendee -> google.protobuf.FieldOptions\n\t66, // 81: grpc.federation.enum:extendee -> google.protobuf.EnumOptions\n\t67, // 82: grpc.federation.enum_value:extendee -> google.protobuf.EnumValueOptions\n\t68, // 83: grpc.federation.oneof:extendee -> google.protobuf.OneofOptions\n\t2,  // 84: grpc.federation.file:type_name -> grpc.federation.FileRule\n\t7,  // 85: grpc.federation.service:type_name -> grpc.federation.ServiceRule\n\t15, // 86: grpc.federation.method:type_name -> grpc.federation.MethodRule\n\t16, // 87: grpc.federation.message:type_name -> grpc.federation.MessageRule\n\t36, // 88: grpc.federation.field:type_name -> grpc.federation.FieldRule\n\t3,  // 89: grpc.federation.enum:type_name -> grpc.federation.EnumRule\n\t4,  // 90: grpc.federation.enum_value:type_name -> grpc.federation.EnumValueRule\n\t6,  // 91: grpc.federation.oneof:type_name -> grpc.federation.OneofRule\n\t92, // [92:92] is the sub-list for method output_type\n\t92, // [92:92] is the sub-list for method input_type\n\t84, // [84:92] is the sub-list for extension type_name\n\t76, // [76:84] is the sub-list for extension extendee\n\t0,  // [0:76] is the sub-list for field type_name\n}\n\nfunc init() { file_grpc_federation_federation_proto_init() }\nfunc file_grpc_federation_federation_proto_init() {\n\tif File_grpc_federation_federation_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_grpc_federation_federation_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*FileRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumValueRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumValueAttribute); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*OneofRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Env); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceVariable); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceVariableValidationExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvVar); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvMapType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvVarOption); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MethodRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MessageRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*VariableDefinition); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MapExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Iterator); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MessageExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CallExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SwitchExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SwitchCaseExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SwitchDefaultExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GRPCError); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GRPCErrorDetail); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GRPCCallOption); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ValidationExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RetryPolicy); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RetryPolicyConstant); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RetryPolicyExponential); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MethodRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MethodResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Argument); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*FieldRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*FieldOneof); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPlugin); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginExport); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginEnvCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginFileSystemCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginNetworkCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELFunction); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELReceiverType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELFunctionArgument); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELMapType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELVariable); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[2].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[7].OneofWrappers = []interface{}{\n\t\t(*ServiceVariable_By)(nil),\n\t\t(*ServiceVariable_Map)(nil),\n\t\t(*ServiceVariable_Message)(nil),\n\t\t(*ServiceVariable_Validation)(nil),\n\t\t(*ServiceVariable_Enum)(nil),\n\t\t(*ServiceVariable_Switch)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[9].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[10].OneofWrappers = []interface{}{\n\t\t(*EnvType_Kind)(nil),\n\t\t(*EnvType_Repeated)(nil),\n\t\t(*EnvType_Map)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[12].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[13].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[14].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[15].OneofWrappers = []interface{}{\n\t\t(*VariableDefinition_By)(nil),\n\t\t(*VariableDefinition_Map)(nil),\n\t\t(*VariableDefinition_Message)(nil),\n\t\t(*VariableDefinition_Call)(nil),\n\t\t(*VariableDefinition_Validation)(nil),\n\t\t(*VariableDefinition_Enum)(nil),\n\t\t(*VariableDefinition_Switch)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[16].OneofWrappers = []interface{}{\n\t\t(*MapExpr_By)(nil),\n\t\t(*MapExpr_Message)(nil),\n\t\t(*MapExpr_Enum)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[20].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[22].OneofWrappers = []interface{}{\n\t\t(*SwitchCaseExpr_By)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[23].OneofWrappers = []interface{}{\n\t\t(*SwitchDefaultExpr_By)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[24].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[26].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[27].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[28].OneofWrappers = []interface{}{\n\t\t(*RetryPolicy_Constant)(nil),\n\t\t(*RetryPolicy_Exponential)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[29].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[30].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[31].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[32].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[33].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[34].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[35].OneofWrappers = []interface{}{\n\t\t(*FieldOneof_If)(nil),\n\t\t(*FieldOneof_Default)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[38].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[45].OneofWrappers = []interface{}{\n\t\t(*CELType_Kind)(nil),\n\t\t(*CELType_Repeated)(nil),\n\t\t(*CELType_Map)(nil),\n\t\t(*CELType_Message)(nil),\n\t\t(*CELType_Enum)(nil),\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_grpc_federation_federation_proto_rawDesc,\n\t\t\tNumEnums:      2,\n\t\t\tNumMessages:   48,\n\t\t\tNumExtensions: 8,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_grpc_federation_federation_proto_goTypes,\n\t\tDependencyIndexes: file_grpc_federation_federation_proto_depIdxs,\n\t\tEnumInfos:         file_grpc_federation_federation_proto_enumTypes,\n\t\tMessageInfos:      file_grpc_federation_federation_proto_msgTypes,\n\t\tExtensionInfos:    file_grpc_federation_federation_proto_extTypes,\n\t}.Build()\n\tFile_grpc_federation_federation_proto = out.File\n\tfile_grpc_federation_federation_proto_rawDesc = nil\n\tfile_grpc_federation_federation_proto_goTypes = nil\n\tfile_grpc_federation_federation_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/09_multi_user/main_test.go",
    "content": "package main_test\n\nimport (\n\t\"context\"\n\t\"log/slog\"\n\t\"net\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\"\n\t\"go.opentelemetry.io/otel/propagation\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\tsdktrace \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.4.0\"\n\t\"go.uber.org/goleak\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/test/bufconn\"\n\n\t\"example/federation\"\n\t\"example/user\"\n)\n\nconst bufSize = 1024\n\nvar (\n\tlistener   *bufconn.Listener\n\tuserClient user.UserServiceClient\n)\n\ntype clientConfig struct{}\n\nfunc (c *clientConfig) User_UserServiceClient(cfg federation.FederationServiceClientConfig) (user.UserServiceClient, error) {\n\treturn userClient, nil\n}\n\ntype UserServer struct {\n\t*user.UnimplementedUserServiceServer\n}\n\nvar nameMap = map[string]string{\n\t\"xxx\": \"foo\",\n}\n\nfunc (s *UserServer) GetUser(ctx context.Context, req *user.GetUserRequest) (*user.GetUserResponse, error) {\n\treturn &user.GetUserResponse{\n\t\tUser: &user.User{\n\t\t\tId:   req.Id,\n\t\t\tName: nameMap[req.Id],\n\t\t},\n\t}, nil\n}\n\ntype resolver struct{}\n\nfunc (r *resolver) Resolve_Org_Federation_Sub(_ context.Context, _ *federation.FederationService_Org_Federation_SubArgument) (*federation.Sub, error) {\n\treturn &federation.Sub{}, nil\n}\n\nfunc (r *resolver) Resolve_Org_Federation_User_Name(_ context.Context, arg *federation.FederationService_Org_Federation_User_NameArgument) (string, error) {\n\treturn arg.User.Name, nil\n}\n\nfunc dialer(ctx context.Context, address string) (net.Conn, error) {\n\treturn listener.Dial()\n}\n\nfunc TestFederation(t *testing.T) {\n\tdefer goleak.VerifyNone(t)\n\tctx := context.Background()\n\tlistener = bufconn.Listen(bufSize)\n\n\tif os.Getenv(\"ENABLE_JAEGER\") != \"\" {\n\t\texporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithInsecure())\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttp := sdktrace.NewTracerProvider(\n\t\t\tsdktrace.WithBatcher(exporter),\n\t\t\tsdktrace.WithResource(\n\t\t\t\tresource.NewWithAttributes(\n\t\t\t\t\tsemconv.SchemaURL,\n\t\t\t\t\tsemconv.ServiceNameKey.String(\"example09/multi_user\"),\n\t\t\t\t\tsemconv.ServiceVersionKey.String(\"1.0.0\"),\n\t\t\t\t\tattribute.String(\"environment\", \"dev\"),\n\t\t\t\t),\n\t\t\t),\n\t\t\tsdktrace.WithSampler(sdktrace.AlwaysSample()),\n\t\t)\n\t\tdefer tp.Shutdown(ctx)\n\t\totel.SetTextMapPropagator(propagation.TraceContext{})\n\t\totel.SetTracerProvider(tp)\n\t}\n\n\tconn, err := grpc.DialContext(ctx, \"\", grpc.WithContextDialer(dialer), grpc.WithInsecure())\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer conn.Close()\n\n\tuserClient = user.NewUserServiceClient(conn)\n\n\tgrpcServer := grpc.NewServer()\n\tdefer grpcServer.Stop()\n\n\tlogger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{\n\t\tLevel: slog.LevelDebug,\n\t}))\n\tfederationServer, err := federation.NewFederationService(federation.FederationServiceConfig{\n\t\tClient:   new(clientConfig),\n\t\tLogger:   logger,\n\t\tResolver: new(resolver),\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer federation.CleanupFederationService(ctx, federationServer)\n\n\tuser.RegisterUserServiceServer(grpcServer, &UserServer{})\n\tfederation.RegisterFederationServiceServer(grpcServer, federationServer)\n\n\tgo func() {\n\t\tif err := grpcServer.Serve(listener); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t}()\n\n\tclient := federation.NewFederationServiceClient(conn)\n\tres, err := client.Get(ctx, &federation.GetRequest{})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif diff := cmp.Diff(res, &federation.GetResponse{\n\t\tUser: &federation.User{\n\t\t\tId:   \"xxx\",\n\t\t\tName: \"foo\",\n\t\t},\n\t\tUser2: &federation.User{\n\t\t\tId:   \"xxx\",\n\t\t\tName: \"foo\",\n\t\t},\n\t}, cmpopts.IgnoreUnexported(\n\t\tfederation.GetResponse{},\n\t\tfederation.User{},\n\t)); diff != \"\" {\n\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t}\n}\n"
  },
  {
    "path": "_examples/09_multi_user/proto/buf.yaml",
    "content": "version: v1\nbreaking:\n  use:\n    - FILE\nlint:\n  use:\n    - DEFAULT\n"
  },
  {
    "path": "_examples/09_multi_user/proto/federation/federation.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\noption (grpc.federation.file)= {\n  import: [\"user/user.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc Get(GetRequest) returns (GetResponse) {};\n}\n\nmessage GetRequest {}\n\nmessage GetResponse {\n  option (grpc.federation.message) = {\n    def { name: \"uid\", message { name: \"UserID\" } }\n    def { name: \"user\", message { name: \"User\", args { name: \"user_id\", by: \"uid.value\" } } }\n    def { name: \"user2\", message { name: \"User\", args { name: \"user_id\", by: \"uid.value\" } } }\n  };\n  User user = 1 [(grpc.federation.field).by = \"user\"];\n  User user2 = 2 [(grpc.federation.field).by = \"user2\"];\n}\n\nmessage User {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"user.UserService/GetUser\"\n        request { field: \"id\", by: \"$.user_id\" }\n      }\n    }\n    def { name: \"user\", by: \"res.user\", autobind: true }\n    def { message { name: \"Sub\" } }\n  };\n  string id = 1;\n  string name = 3 [(grpc.federation.field).custom_resolver = true];\n}\n\nmessage UserID {\n  option (grpc.federation.message) = {\n    def { message { name: \"Sub\" } }\n  };\n\n  string value = 1 [(grpc.federation.field).by = \"'xxx'\"];\n}\n\nmessage Sub {\n  option (grpc.federation.message).custom_resolver = true;\n}\n"
  },
  {
    "path": "_examples/09_multi_user/proto/user/user.proto",
    "content": "syntax = \"proto3\";\n\npackage user;\n\noption go_package = \"example/user;user\";\n\nservice UserService {\n  rpc GetUser(GetUserRequest) returns (GetUserResponse) {};\n}\n\nmessage GetUserRequest {\n  string id = 1;\n}\n\nmessage GetUserResponse {\n  User user = 1;\n}\n\nmessage User {\n  string id = 1;\n  string name = 2;\n}\n"
  },
  {
    "path": "_examples/09_multi_user/user/user.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: user/user.proto\n\npackage user\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype GetUserRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetUserRequest) Reset() {\n\t*x = GetUserRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_user_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetUserRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetUserRequest) ProtoMessage() {}\n\nfunc (x *GetUserRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_user_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetUserRequest.ProtoReflect.Descriptor instead.\nfunc (*GetUserRequest) Descriptor() ([]byte, []int) {\n\treturn file_user_user_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetUserRequest) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\ntype GetUserResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUser *User `protobuf:\"bytes,1,opt,name=user,proto3\" json:\"user,omitempty\"`\n}\n\nfunc (x *GetUserResponse) Reset() {\n\t*x = GetUserResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_user_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetUserResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetUserResponse) ProtoMessage() {}\n\nfunc (x *GetUserResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_user_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetUserResponse.ProtoReflect.Descriptor instead.\nfunc (*GetUserResponse) Descriptor() ([]byte, []int) {\n\treturn file_user_user_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetUserResponse) GetUser() *User {\n\tif x != nil {\n\t\treturn x.User\n\t}\n\treturn nil\n}\n\ntype User struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId   string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *User) Reset() {\n\t*x = User{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_user_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *User) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*User) ProtoMessage() {}\n\nfunc (x *User) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_user_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use User.ProtoReflect.Descriptor instead.\nfunc (*User) Descriptor() ([]byte, []int) {\n\treturn file_user_user_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *User) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *User) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nvar File_user_user_proto protoreflect.FileDescriptor\n\nvar file_user_user_proto_rawDesc = []byte{\n\t0x0a, 0x0f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x20, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x55, 0x73,\n\t0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x31, 0x0a, 0x0f, 0x47, 0x65, 0x74,\n\t0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x04,\n\t0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x75, 0x73, 0x65,\n\t0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x2a, 0x0a, 0x04,\n\t0x55, 0x73, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x32, 0x47, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72,\n\t0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x38, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x55, 0x73,\n\t0x65, 0x72, 0x12, 0x14, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65,\n\t0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e,\n\t0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,\n\t0x00, 0x42, 0x58, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x42, 0x09, 0x55,\n\t0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x11, 0x65, 0x78, 0x61, 0x6d,\n\t0x70, 0x6c, 0x65, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x3b, 0x75, 0x73, 0x65, 0x72, 0xa2, 0x02, 0x03,\n\t0x55, 0x58, 0x58, 0xaa, 0x02, 0x04, 0x55, 0x73, 0x65, 0x72, 0xca, 0x02, 0x04, 0x55, 0x73, 0x65,\n\t0x72, 0xe2, 0x02, 0x10, 0x55, 0x73, 0x65, 0x72, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61,\n\t0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x04, 0x55, 0x73, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_user_user_proto_rawDescOnce sync.Once\n\tfile_user_user_proto_rawDescData = file_user_user_proto_rawDesc\n)\n\nfunc file_user_user_proto_rawDescGZIP() []byte {\n\tfile_user_user_proto_rawDescOnce.Do(func() {\n\t\tfile_user_user_proto_rawDescData = protoimpl.X.CompressGZIP(file_user_user_proto_rawDescData)\n\t})\n\treturn file_user_user_proto_rawDescData\n}\n\nvar file_user_user_proto_msgTypes = make([]protoimpl.MessageInfo, 3)\nvar file_user_user_proto_goTypes = []interface{}{\n\t(*GetUserRequest)(nil),  // 0: user.GetUserRequest\n\t(*GetUserResponse)(nil), // 1: user.GetUserResponse\n\t(*User)(nil),            // 2: user.User\n}\nvar file_user_user_proto_depIdxs = []int32{\n\t2, // 0: user.GetUserResponse.user:type_name -> user.User\n\t0, // 1: user.UserService.GetUser:input_type -> user.GetUserRequest\n\t1, // 2: user.UserService.GetUser:output_type -> user.GetUserResponse\n\t2, // [2:3] is the sub-list for method output_type\n\t1, // [1:2] is the sub-list for method input_type\n\t1, // [1:1] is the sub-list for extension type_name\n\t1, // [1:1] is the sub-list for extension extendee\n\t0, // [0:1] is the sub-list for field type_name\n}\n\nfunc init() { file_user_user_proto_init() }\nfunc file_user_user_proto_init() {\n\tif File_user_user_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_user_user_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetUserRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_user_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetUserResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_user_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*User); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_user_user_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   3,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_user_user_proto_goTypes,\n\t\tDependencyIndexes: file_user_user_proto_depIdxs,\n\t\tMessageInfos:      file_user_user_proto_msgTypes,\n\t}.Build()\n\tFile_user_user_proto = out.File\n\tfile_user_user_proto_rawDesc = nil\n\tfile_user_user_proto_goTypes = nil\n\tfile_user_user_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/09_multi_user/user/user_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: user/user.proto\n\npackage user\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tUserService_GetUser_FullMethodName = \"/user.UserService/GetUser\"\n)\n\n// UserServiceClient is the client API for UserService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype UserServiceClient interface {\n\tGetUser(ctx context.Context, in *GetUserRequest, opts ...grpc.CallOption) (*GetUserResponse, error)\n}\n\ntype userServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewUserServiceClient(cc grpc.ClientConnInterface) UserServiceClient {\n\treturn &userServiceClient{cc}\n}\n\nfunc (c *userServiceClient) GetUser(ctx context.Context, in *GetUserRequest, opts ...grpc.CallOption) (*GetUserResponse, error) {\n\tout := new(GetUserResponse)\n\terr := c.cc.Invoke(ctx, UserService_GetUser_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// UserServiceServer is the server API for UserService service.\n// All implementations must embed UnimplementedUserServiceServer\n// for forward compatibility\ntype UserServiceServer interface {\n\tGetUser(context.Context, *GetUserRequest) (*GetUserResponse, error)\n\tmustEmbedUnimplementedUserServiceServer()\n}\n\n// UnimplementedUserServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedUserServiceServer struct {\n}\n\nfunc (UnimplementedUserServiceServer) GetUser(context.Context, *GetUserRequest) (*GetUserResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetUser not implemented\")\n}\nfunc (UnimplementedUserServiceServer) mustEmbedUnimplementedUserServiceServer() {}\n\n// UnsafeUserServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to UserServiceServer will\n// result in compilation errors.\ntype UnsafeUserServiceServer interface {\n\tmustEmbedUnimplementedUserServiceServer()\n}\n\nfunc RegisterUserServiceServer(s grpc.ServiceRegistrar, srv UserServiceServer) {\n\ts.RegisterService(&UserService_ServiceDesc, srv)\n}\n\nfunc _UserService_GetUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetUserRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServiceServer).GetUser(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: UserService_GetUser_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServiceServer).GetUser(ctx, req.(*GetUserRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// UserService_ServiceDesc is the grpc.ServiceDesc for UserService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar UserService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"user.UserService\",\n\tHandlerType: (*UserServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetUser\",\n\t\t\tHandler:    _UserService_GetUser_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"user/user.proto\",\n}\n"
  },
  {
    "path": "_examples/10_oneof/.gitignore",
    "content": "grpc/federation\n"
  },
  {
    "path": "_examples/10_oneof/Makefile",
    "content": "MAKEFILE_DIR := $(dir $(lastword $(MAKEFILE_LIST)))\nGOBIN := $(MAKEFILE_DIR)/../../bin\nPATH := $(GOBIN):$(PATH)\n\nJAEGER_IMAGE := jaegertracing/all-in-one:latest\n\n.PHONY: generate\ngenerate:\n\t$(GOBIN)/buf generate\n\n.PHONY: lint\nlint:\n\t@$(GOBIN)/grpc-federation-linter -Iproto -Iproto_deps ./proto/federation/federation.proto\n\n.PHONY: test\ntest:\n\tgo test -race ./ -count=1\n\n.PHONY: grpc-federation/generate\ngrpc-federation/generate:\n\t@$(GOBIN)/grpc-federation-generator ./proto/federation/federation.proto\n\n.PHONY: grpc-federation/watch\ngrpc-federation/watch:\n\t@$(GOBIN)/grpc-federation-generator -w\n\n.PHONY: jaeger/start\njaeger/start:\n\t@docker run \\\n\t\t-e COLLECTOR_OTLP_ENABLED=true \\\n\t\t-p 16686:16686 \\\n\t\t-p 4317:4317 \\\n\t\t-p 4318:4318 \\\n\t\t-d \\\n\t\t$(JAEGER_IMAGE)\n\n.PHONY: jaeger/stop\njaeger/stop:\n\t@docker stop $(shell docker ps -q  --filter ancestor=$(JAEGER_IMAGE))\n"
  },
  {
    "path": "_examples/10_oneof/buf.gen.yaml",
    "content": "version: v1\nmanaged:\n  enabled: true\nplugins:\n  - plugin: go\n    out: .\n    opt: paths=source_relative\n  - plugin: go-grpc\n    out: .\n    opt: paths=source_relative\n  - plugin: grpc-federation\n    out: .\n    opt:\n    - paths=source_relative\n    - import_paths=proto\n"
  },
  {
    "path": "_examples/10_oneof/buf.work.yaml",
    "content": "version: v1\ndirectories:\n  - proto\n  - proto_deps\n"
  },
  {
    "path": "_examples/10_oneof/federation/federation.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype UserType int32\n\nconst (\n\tUserType_USER_TYPE_UNSPECIFIED UserType = 0\n\tUserType_USER_TYPE_ANONYMOUS   UserType = 1\n)\n\n// Enum value maps for UserType.\nvar (\n\tUserType_name = map[int32]string{\n\t\t0: \"USER_TYPE_UNSPECIFIED\",\n\t\t1: \"USER_TYPE_ANONYMOUS\",\n\t}\n\tUserType_value = map[string]int32{\n\t\t\"USER_TYPE_UNSPECIFIED\": 0,\n\t\t\"USER_TYPE_ANONYMOUS\":   1,\n\t}\n)\n\nfunc (x UserType) Enum() *UserType {\n\tp := new(UserType)\n\t*p = x\n\treturn p\n}\n\nfunc (x UserType) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (UserType) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_federation_federation_proto_enumTypes[0].Descriptor()\n}\n\nfunc (UserType) Type() protoreflect.EnumType {\n\treturn &file_federation_federation_proto_enumTypes[0]\n}\n\nfunc (x UserType) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use UserType.Descriptor instead.\nfunc (UserType) EnumDescriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\ntype GetRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *GetRequest) Reset() {\n\t*x = GetRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetRequest) ProtoMessage() {}\n\nfunc (x *GetRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetRequest.ProtoReflect.Descriptor instead.\nfunc (*GetRequest) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\ntype GetResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUser      *User                        `protobuf:\"bytes,1,opt,name=user,proto3\" json:\"user,omitempty\"`\n\tMsg       string                       `protobuf:\"bytes,2,opt,name=msg,proto3\" json:\"msg,omitempty\"`\n\tNestedMsg *NestedMessageSelection_Nest `protobuf:\"bytes,3,opt,name=nested_msg,json=nestedMsg,proto3\" json:\"nested_msg,omitempty\"`\n\tCastOneof *CastOneof                   `protobuf:\"bytes,4,opt,name=cast_oneof,json=castOneof,proto3\" json:\"cast_oneof,omitempty\"`\n}\n\nfunc (x *GetResponse) Reset() {\n\t*x = GetResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetResponse) ProtoMessage() {}\n\nfunc (x *GetResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetResponse.ProtoReflect.Descriptor instead.\nfunc (*GetResponse) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetResponse) GetUser() *User {\n\tif x != nil {\n\t\treturn x.User\n\t}\n\treturn nil\n}\n\nfunc (x *GetResponse) GetMsg() string {\n\tif x != nil {\n\t\treturn x.Msg\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetResponse) GetNestedMsg() *NestedMessageSelection_Nest {\n\tif x != nil {\n\t\treturn x.NestedMsg\n\t}\n\treturn nil\n}\n\nfunc (x *GetResponse) GetCastOneof() *CastOneof {\n\tif x != nil {\n\t\treturn x.CastOneof\n\t}\n\treturn nil\n}\n\ntype GetNoValueRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *GetNoValueRequest) Reset() {\n\t*x = GetNoValueRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetNoValueRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetNoValueRequest) ProtoMessage() {}\n\nfunc (x *GetNoValueRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetNoValueRequest.ProtoReflect.Descriptor instead.\nfunc (*GetNoValueRequest) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{2}\n}\n\ntype GetNoValueResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tNoValue *M `protobuf:\"bytes,1,opt,name=no_value,json=noValue,proto3\" json:\"no_value,omitempty\"`\n}\n\nfunc (x *GetNoValueResponse) Reset() {\n\t*x = GetNoValueResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetNoValueResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetNoValueResponse) ProtoMessage() {}\n\nfunc (x *GetNoValueResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetNoValueResponse.ProtoReflect.Descriptor instead.\nfunc (*GetNoValueResponse) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *GetNoValueResponse) GetNoValue() *M {\n\tif x != nil {\n\t\treturn x.NoValue\n\t}\n\treturn nil\n}\n\ntype UserSelection struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to User:\n\t//\n\t//\t*UserSelection_UserA\n\t//\t*UserSelection_UserB\n\t//\t*UserSelection_UserC\n\tUser isUserSelection_User `protobuf_oneof:\"user\"`\n}\n\nfunc (x *UserSelection) Reset() {\n\t*x = UserSelection{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *UserSelection) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UserSelection) ProtoMessage() {}\n\nfunc (x *UserSelection) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UserSelection.ProtoReflect.Descriptor instead.\nfunc (*UserSelection) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (m *UserSelection) GetUser() isUserSelection_User {\n\tif m != nil {\n\t\treturn m.User\n\t}\n\treturn nil\n}\n\nfunc (x *UserSelection) GetUserA() *User {\n\tif x, ok := x.GetUser().(*UserSelection_UserA); ok {\n\t\treturn x.UserA\n\t}\n\treturn nil\n}\n\nfunc (x *UserSelection) GetUserB() *User {\n\tif x, ok := x.GetUser().(*UserSelection_UserB); ok {\n\t\treturn x.UserB\n\t}\n\treturn nil\n}\n\nfunc (x *UserSelection) GetUserC() *User {\n\tif x, ok := x.GetUser().(*UserSelection_UserC); ok {\n\t\treturn x.UserC\n\t}\n\treturn nil\n}\n\ntype isUserSelection_User interface {\n\tisUserSelection_User()\n}\n\ntype UserSelection_UserA struct {\n\tUserA *User `protobuf:\"bytes,1,opt,name=user_a,json=userA,proto3,oneof\"`\n}\n\ntype UserSelection_UserB struct {\n\tUserB *User `protobuf:\"bytes,2,opt,name=user_b,json=userB,proto3,oneof\"`\n}\n\ntype UserSelection_UserC struct {\n\tUserC *User `protobuf:\"bytes,3,opt,name=user_c,json=userC,proto3,oneof\"`\n}\n\nfunc (*UserSelection_UserA) isUserSelection_User() {}\n\nfunc (*UserSelection_UserB) isUserSelection_User() {}\n\nfunc (*UserSelection_UserC) isUserSelection_User() {}\n\ntype MessageSelection struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to Message:\n\t//\n\t//\t*MessageSelection_MsgA\n\t//\t*MessageSelection_MsgB\n\t//\t*MessageSelection_MsgC\n\tMessage isMessageSelection_Message `protobuf_oneof:\"message\"`\n}\n\nfunc (x *MessageSelection) Reset() {\n\t*x = MessageSelection{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MessageSelection) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MessageSelection) ProtoMessage() {}\n\nfunc (x *MessageSelection) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MessageSelection.ProtoReflect.Descriptor instead.\nfunc (*MessageSelection) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (m *MessageSelection) GetMessage() isMessageSelection_Message {\n\tif m != nil {\n\t\treturn m.Message\n\t}\n\treturn nil\n}\n\nfunc (x *MessageSelection) GetMsgA() string {\n\tif x, ok := x.GetMessage().(*MessageSelection_MsgA); ok {\n\t\treturn x.MsgA\n\t}\n\treturn \"\"\n}\n\nfunc (x *MessageSelection) GetMsgB() string {\n\tif x, ok := x.GetMessage().(*MessageSelection_MsgB); ok {\n\t\treturn x.MsgB\n\t}\n\treturn \"\"\n}\n\nfunc (x *MessageSelection) GetMsgC() string {\n\tif x, ok := x.GetMessage().(*MessageSelection_MsgC); ok {\n\t\treturn x.MsgC\n\t}\n\treturn \"\"\n}\n\ntype isMessageSelection_Message interface {\n\tisMessageSelection_Message()\n}\n\ntype MessageSelection_MsgA struct {\n\tMsgA string `protobuf:\"bytes,1,opt,name=msg_a,json=msgA,proto3,oneof\"`\n}\n\ntype MessageSelection_MsgB struct {\n\tMsgB string `protobuf:\"bytes,2,opt,name=msg_b,json=msgB,proto3,oneof\"`\n}\n\ntype MessageSelection_MsgC struct {\n\tMsgC string `protobuf:\"bytes,3,opt,name=msg_c,json=msgC,proto3,oneof\"`\n}\n\nfunc (*MessageSelection_MsgA) isMessageSelection_Message() {}\n\nfunc (*MessageSelection_MsgB) isMessageSelection_Message() {}\n\nfunc (*MessageSelection_MsgC) isMessageSelection_Message() {}\n\ntype NoValueSelection struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to NoValue:\n\t//\n\t//\t*NoValueSelection_MA\n\t//\t*NoValueSelection_MB\n\tNoValue isNoValueSelection_NoValue `protobuf_oneof:\"no_value\"`\n}\n\nfunc (x *NoValueSelection) Reset() {\n\t*x = NoValueSelection{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *NoValueSelection) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*NoValueSelection) ProtoMessage() {}\n\nfunc (x *NoValueSelection) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use NoValueSelection.ProtoReflect.Descriptor instead.\nfunc (*NoValueSelection) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (m *NoValueSelection) GetNoValue() isNoValueSelection_NoValue {\n\tif m != nil {\n\t\treturn m.NoValue\n\t}\n\treturn nil\n}\n\nfunc (x *NoValueSelection) GetMA() *M {\n\tif x, ok := x.GetNoValue().(*NoValueSelection_MA); ok {\n\t\treturn x.MA\n\t}\n\treturn nil\n}\n\nfunc (x *NoValueSelection) GetMB() *M {\n\tif x, ok := x.GetNoValue().(*NoValueSelection_MB); ok {\n\t\treturn x.MB\n\t}\n\treturn nil\n}\n\ntype isNoValueSelection_NoValue interface {\n\tisNoValueSelection_NoValue()\n}\n\ntype NoValueSelection_MA struct {\n\tMA *M `protobuf:\"bytes,1,opt,name=m_a,json=mA,proto3,oneof\"`\n}\n\ntype NoValueSelection_MB struct {\n\tMB *M `protobuf:\"bytes,2,opt,name=m_b,json=mB,proto3,oneof\"`\n}\n\nfunc (*NoValueSelection_MA) isNoValueSelection_NoValue() {}\n\nfunc (*NoValueSelection_MB) isNoValueSelection_NoValue() {}\n\ntype NestedMessageSelection struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *NestedMessageSelection) Reset() {\n\t*x = NestedMessageSelection{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *NestedMessageSelection) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*NestedMessageSelection) ProtoMessage() {}\n\nfunc (x *NestedMessageSelection) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use NestedMessageSelection.ProtoReflect.Descriptor instead.\nfunc (*NestedMessageSelection) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{7}\n}\n\ntype CastOneof struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to CastOneof:\n\t//\n\t//\t*CastOneof_Num\n\t//\t*CastOneof_User\n\t//\t*CastOneof_Type\n\tCastOneof isCastOneof_CastOneof `protobuf_oneof:\"cast_oneof\"`\n}\n\nfunc (x *CastOneof) Reset() {\n\t*x = CastOneof{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CastOneof) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CastOneof) ProtoMessage() {}\n\nfunc (x *CastOneof) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CastOneof.ProtoReflect.Descriptor instead.\nfunc (*CastOneof) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{8}\n}\n\nfunc (m *CastOneof) GetCastOneof() isCastOneof_CastOneof {\n\tif m != nil {\n\t\treturn m.CastOneof\n\t}\n\treturn nil\n}\n\nfunc (x *CastOneof) GetNum() int64 {\n\tif x, ok := x.GetCastOneof().(*CastOneof_Num); ok {\n\t\treturn x.Num\n\t}\n\treturn 0\n}\n\nfunc (x *CastOneof) GetUser() *User {\n\tif x, ok := x.GetCastOneof().(*CastOneof_User); ok {\n\t\treturn x.User\n\t}\n\treturn nil\n}\n\nfunc (x *CastOneof) GetType() UserType {\n\tif x, ok := x.GetCastOneof().(*CastOneof_Type); ok {\n\t\treturn x.Type\n\t}\n\treturn UserType_USER_TYPE_UNSPECIFIED\n}\n\ntype isCastOneof_CastOneof interface {\n\tisCastOneof_CastOneof()\n}\n\ntype CastOneof_Num struct {\n\tNum int64 `protobuf:\"varint,1,opt,name=num,proto3,oneof\"`\n}\n\ntype CastOneof_User struct {\n\tUser *User `protobuf:\"bytes,2,opt,name=user,proto3,oneof\"`\n}\n\ntype CastOneof_Type struct {\n\tType UserType `protobuf:\"varint,3,opt,name=type,proto3,enum=org.federation.UserType,oneof\"`\n}\n\nfunc (*CastOneof_Num) isCastOneof_CastOneof() {}\n\nfunc (*CastOneof_User) isCastOneof_CastOneof() {}\n\nfunc (*CastOneof_Type) isCastOneof_CastOneof() {}\n\ntype M struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tValue string `protobuf:\"bytes,1,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *M) Reset() {\n\t*x = M{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *M) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*M) ProtoMessage() {}\n\nfunc (x *M) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use M.ProtoReflect.Descriptor instead.\nfunc (*M) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{9}\n}\n\nfunc (x *M) GetValue() string {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn \"\"\n}\n\ntype User struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *User) Reset() {\n\t*x = User{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[10]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *User) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*User) ProtoMessage() {}\n\nfunc (x *User) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[10]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use User.ProtoReflect.Descriptor instead.\nfunc (*User) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{10}\n}\n\nfunc (x *User) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\ntype NestedMessageSelection_Nest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to Value:\n\t//\n\t//\t*NestedMessageSelection_Nest_Int\n\t//\t*NestedMessageSelection_Nest_Text\n\tValue isNestedMessageSelection_Nest_Value `protobuf_oneof:\"value\"`\n}\n\nfunc (x *NestedMessageSelection_Nest) Reset() {\n\t*x = NestedMessageSelection_Nest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[11]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *NestedMessageSelection_Nest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*NestedMessageSelection_Nest) ProtoMessage() {}\n\nfunc (x *NestedMessageSelection_Nest) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[11]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use NestedMessageSelection_Nest.ProtoReflect.Descriptor instead.\nfunc (*NestedMessageSelection_Nest) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{7, 0}\n}\n\nfunc (m *NestedMessageSelection_Nest) GetValue() isNestedMessageSelection_Nest_Value {\n\tif m != nil {\n\t\treturn m.Value\n\t}\n\treturn nil\n}\n\nfunc (x *NestedMessageSelection_Nest) GetInt() int64 {\n\tif x, ok := x.GetValue().(*NestedMessageSelection_Nest_Int); ok {\n\t\treturn x.Int\n\t}\n\treturn 0\n}\n\nfunc (x *NestedMessageSelection_Nest) GetText() string {\n\tif x, ok := x.GetValue().(*NestedMessageSelection_Nest_Text); ok {\n\t\treturn x.Text\n\t}\n\treturn \"\"\n}\n\ntype isNestedMessageSelection_Nest_Value interface {\n\tisNestedMessageSelection_Nest_Value()\n}\n\ntype NestedMessageSelection_Nest_Int struct {\n\tInt int64 `protobuf:\"varint,1,opt,name=int,proto3,oneof\"`\n}\n\ntype NestedMessageSelection_Nest_Text struct {\n\tText string `protobuf:\"bytes,2,opt,name=text,proto3,oneof\"`\n}\n\nfunc (*NestedMessageSelection_Nest_Int) isNestedMessageSelection_Nest_Value() {}\n\nfunc (*NestedMessageSelection_Nest_Text) isNestedMessageSelection_Nest_Value() {}\n\nvar File_federation_federation_proto protoreflect.FileDescriptor\n\nvar file_federation_federation_proto_rawDesc = []byte{\n\t0x0a, 0x1b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x6f,\n\t0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x20, 0x67,\n\t0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22,\n\t0x0c, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xac, 0x03,\n\t0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a,\n\t0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x72,\n\t0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x55, 0x73, 0x65,\n\t0x72, 0x42, 0x0d, 0x9a, 0x4a, 0x0a, 0x12, 0x08, 0x73, 0x65, 0x6c, 0x2e, 0x75, 0x73, 0x65, 0x72,\n\t0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x42, 0x14, 0x9a, 0x4a, 0x11, 0x12, 0x0f, 0x6d, 0x73, 0x67, 0x5f, 0x73, 0x65,\n\t0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x5b,\n\t0x0a, 0x0a, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67,\n\t0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x42,\n\t0x0f, 0x9a, 0x4a, 0x0c, 0x12, 0x0a, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x73, 0x67,\n\t0x52, 0x09, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x73, 0x67, 0x12, 0x49, 0x0a, 0x0a, 0x63,\n\t0x61, 0x73, 0x74, 0x5f, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x19, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x43, 0x61, 0x73, 0x74, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x42, 0x0f, 0x9a, 0x4a, 0x0c, 0x12,\n\t0x0a, 0x63, 0x61, 0x73, 0x74, 0x5f, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x52, 0x09, 0x63, 0x61, 0x73,\n\t0x74, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x3a, 0x93, 0x01, 0x9a, 0x4a, 0x8f, 0x01, 0x0a, 0x26, 0x0a,\n\t0x03, 0x73, 0x65, 0x6c, 0x6a, 0x1f, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x6c, 0x65,\n\t0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x05,\n\t0x27, 0x66, 0x6f, 0x6f, 0x27, 0x0a, 0x1d, 0x0a, 0x07, 0x6d, 0x73, 0x67, 0x5f, 0x73, 0x65, 0x6c,\n\t0x6a, 0x12, 0x0a, 0x10, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63,\n\t0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x2b, 0x0a, 0x0a, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x6d,\n\t0x73, 0x67, 0x6a, 0x1d, 0x0a, 0x1b, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4e, 0x65, 0x73,\n\t0x74, 0x0a, 0x19, 0x0a, 0x0a, 0x63, 0x61, 0x73, 0x74, 0x5f, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x6a,\n\t0x0b, 0x0a, 0x09, 0x43, 0x61, 0x73, 0x74, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x22, 0x13, 0x0a, 0x11,\n\t0x47, 0x65, 0x74, 0x4e, 0x6f, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,\n\t0x74, 0x22, 0x87, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x56, 0x61, 0x6c, 0x75, 0x65,\n\t0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x08, 0x6e, 0x6f, 0x5f, 0x76,\n\t0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x72, 0x67,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x42, 0x1a, 0x9a,\n\t0x4a, 0x17, 0x12, 0x15, 0x6e, 0x6f, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x73, 0x65, 0x6c,\n\t0x2e, 0x6e, 0x6f, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x6e, 0x6f, 0x56, 0x61, 0x6c,\n\t0x75, 0x65, 0x3a, 0x27, 0x9a, 0x4a, 0x24, 0x0a, 0x22, 0x0a, 0x0c, 0x6e, 0x6f, 0x5f, 0x76, 0x61,\n\t0x6c, 0x75, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x6a, 0x12, 0x0a, 0x10, 0x4e, 0x6f, 0x56, 0x61, 0x6c,\n\t0x75, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x80, 0x03, 0x0a, 0x0d,\n\t0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x77, 0x0a,\n\t0x06, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e,\n\t0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x55,\n\t0x73, 0x65, 0x72, 0x42, 0x48, 0x9a, 0x4a, 0x45, 0x22, 0x43, 0x1a, 0x36, 0x0a, 0x02, 0x75, 0x61,\n\t0x6a, 0x30, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72,\n\t0x5f, 0x69, 0x64, 0x12, 0x03, 0x27, 0x61, 0x27, 0x12, 0x08, 0x0a, 0x03, 0x66, 0x6f, 0x6f, 0x12,\n\t0x01, 0x30, 0x12, 0x0e, 0x0a, 0x03, 0x62, 0x61, 0x72, 0x12, 0x07, 0x27, 0x68, 0x65, 0x6c, 0x6c,\n\t0x6f, 0x27, 0x22, 0x02, 0x75, 0x61, 0x0a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x48, 0x00, 0x52,\n\t0x05, 0x75, 0x73, 0x65, 0x72, 0x41, 0x12, 0x76, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x62,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x42, 0x47, 0x9a, 0x4a,\n\t0x44, 0x22, 0x42, 0x1a, 0x36, 0x0a, 0x02, 0x75, 0x62, 0x6a, 0x30, 0x0a, 0x04, 0x55, 0x73, 0x65,\n\t0x72, 0x12, 0x0e, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x12, 0x03, 0x27, 0x62,\n\t0x27, 0x12, 0x08, 0x0a, 0x03, 0x66, 0x6f, 0x6f, 0x12, 0x01, 0x30, 0x12, 0x0e, 0x0a, 0x03, 0x62,\n\t0x61, 0x72, 0x12, 0x07, 0x27, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x27, 0x22, 0x02, 0x75, 0x62, 0x0a,\n\t0x04, 0x74, 0x72, 0x75, 0x65, 0x48, 0x00, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x42, 0x12, 0x76,\n\t0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14,\n\t0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x55, 0x73, 0x65, 0x72, 0x42, 0x47, 0x9a, 0x4a, 0x44, 0x22, 0x42, 0x1a, 0x3a, 0x0a, 0x02, 0x75,\n\t0x63, 0x6a, 0x34, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x07, 0x75, 0x73, 0x65,\n\t0x72, 0x5f, 0x69, 0x64, 0x12, 0x07, 0x24, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x08, 0x0a,\n\t0x03, 0x66, 0x6f, 0x6f, 0x12, 0x01, 0x30, 0x12, 0x0e, 0x0a, 0x03, 0x62, 0x61, 0x72, 0x12, 0x07,\n\t0x27, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x27, 0x22, 0x02, 0x75, 0x63, 0x10, 0x01, 0x48, 0x00, 0x52,\n\t0x05, 0x75, 0x73, 0x65, 0x72, 0x43, 0x42, 0x06, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x9b,\n\t0x01, 0x0a, 0x10, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74,\n\t0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x05, 0x6d, 0x73, 0x67, 0x5f, 0x61, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x42, 0x13, 0x9a, 0x4a, 0x10, 0x22, 0x0e, 0x22, 0x05, 0x27, 0x61, 0x61, 0x61, 0x27,\n\t0x0a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x48, 0x00, 0x52, 0x04, 0x6d, 0x73, 0x67, 0x41, 0x12,\n\t0x29, 0x0a, 0x05, 0x6d, 0x73, 0x67, 0x5f, 0x62, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x12,\n\t0x9a, 0x4a, 0x0f, 0x22, 0x0d, 0x22, 0x05, 0x27, 0x62, 0x62, 0x62, 0x27, 0x0a, 0x04, 0x74, 0x72,\n\t0x75, 0x65, 0x48, 0x00, 0x52, 0x04, 0x6d, 0x73, 0x67, 0x42, 0x12, 0x25, 0x0a, 0x05, 0x6d, 0x73,\n\t0x67, 0x5f, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0e, 0x9a, 0x4a, 0x0b, 0x22, 0x09,\n\t0x22, 0x05, 0x27, 0x63, 0x63, 0x63, 0x27, 0x10, 0x01, 0x48, 0x00, 0x52, 0x04, 0x6d, 0x73, 0x67,\n\t0x43, 0x42, 0x09, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xa4, 0x01, 0x0a,\n\t0x10, 0x4e, 0x6f, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f,\n\t0x6e, 0x12, 0x41, 0x0a, 0x03, 0x6d, 0x5f, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11,\n\t0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x4d, 0x42, 0x1b, 0x9a, 0x4a, 0x18, 0x22, 0x16, 0x22, 0x0d, 0x4d, 0x7b, 0x76, 0x61, 0x6c, 0x75,\n\t0x65, 0x3a, 0x20, 0x27, 0x61, 0x27, 0x7d, 0x0a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x48, 0x00,\n\t0x52, 0x02, 0x6d, 0x41, 0x12, 0x41, 0x0a, 0x03, 0x6d, 0x5f, 0x62, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x4d, 0x42, 0x1b, 0x9a, 0x4a, 0x18, 0x22, 0x16, 0x22, 0x0d, 0x4d, 0x7b, 0x76,\n\t0x61, 0x6c, 0x75, 0x65, 0x3a, 0x20, 0x27, 0x62, 0x27, 0x7d, 0x0a, 0x05, 0x66, 0x61, 0x6c, 0x73,\n\t0x65, 0x48, 0x00, 0x52, 0x02, 0x6d, 0x42, 0x42, 0x0a, 0x0a, 0x08, 0x6e, 0x6f, 0x5f, 0x76, 0x61,\n\t0x6c, 0x75, 0x65, 0x22, 0x78, 0x0a, 0x16, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73,\n\t0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x5e, 0x0a,\n\t0x04, 0x4e, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x03, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x03, 0x42, 0x0e, 0x9a, 0x4a, 0x0b, 0x22, 0x09, 0x22, 0x01, 0x31, 0x0a, 0x04, 0x74, 0x72,\n\t0x75, 0x65, 0x48, 0x00, 0x52, 0x03, 0x69, 0x6e, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x74, 0x65, 0x78,\n\t0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x13, 0x9a, 0x4a, 0x10, 0x22, 0x0e, 0x22, 0x05,\n\t0x27, 0x66, 0x6f, 0x6f, 0x27, 0x0a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x48, 0x00, 0x52, 0x04,\n\t0x74, 0x65, 0x78, 0x74, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xfd, 0x01,\n\t0x0a, 0x09, 0x43, 0x61, 0x73, 0x74, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x12, 0x29, 0x0a, 0x03, 0x6e,\n\t0x75, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x42, 0x15, 0x9a, 0x4a, 0x12, 0x22, 0x10, 0x22,\n\t0x07, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x31, 0x29, 0x0a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x48,\n\t0x00, 0x52, 0x03, 0x6e, 0x75, 0x6d, 0x12, 0x4e, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x42, 0x22, 0x9a, 0x4a, 0x1f, 0x22,\n\t0x1d, 0x22, 0x14, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x7b, 0x69, 0x64, 0x3a,\n\t0x20, 0x27, 0x66, 0x6f, 0x6f, 0x27, 0x7d, 0x0a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x48, 0x00,\n\t0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x67, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03,\n\t0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x42, 0x37,\n\t0x9a, 0x4a, 0x34, 0x22, 0x32, 0x22, 0x2a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72,\n\t0x54, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x27, 0x55, 0x53, 0x45, 0x52,\n\t0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x4e, 0x4f, 0x4e, 0x59, 0x4d, 0x4f, 0x55, 0x53, 0x27,\n\t0x29, 0x0a, 0x04, 0x74, 0x72, 0x75, 0x65, 0x48, 0x00, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x42,\n\t0x0c, 0x0a, 0x0a, 0x63, 0x61, 0x73, 0x74, 0x5f, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x22, 0x25, 0x0a,\n\t0x01, 0x4d, 0x12, 0x20, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x42, 0x0a, 0x9a, 0x4a, 0x07, 0x12, 0x05, 0x27, 0x66, 0x6f, 0x6f, 0x27, 0x52, 0x05, 0x76,\n\t0x61, 0x6c, 0x75, 0x65, 0x22, 0x9a, 0x01, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x0a,\n\t0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0e, 0x9a, 0x4a, 0x0b, 0x12, 0x09,\n\t0x24, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x52, 0x02, 0x69, 0x64, 0x3a, 0x72, 0x9a,\n\t0x4a, 0x6f, 0x0a, 0x62, 0x72, 0x60, 0x0a, 0x18, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65,\n\t0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72,\n\t0x12, 0x0f, 0x0a, 0x02, 0x69, 0x64, 0x12, 0x09, 0x24, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69,\n\t0x64, 0x12, 0x18, 0x0a, 0x03, 0x66, 0x6f, 0x6f, 0x12, 0x05, 0x24, 0x2e, 0x66, 0x6f, 0x6f, 0x1a,\n\t0x0a, 0x24, 0x2e, 0x66, 0x6f, 0x6f, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x12, 0x19, 0x0a, 0x03, 0x62,\n\t0x61, 0x72, 0x12, 0x05, 0x24, 0x2e, 0x62, 0x61, 0x72, 0x1a, 0x0b, 0x24, 0x2e, 0x62, 0x61, 0x72,\n\t0x20, 0x21, 0x3d, 0x20, 0x27, 0x27, 0x1a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65,\n\t0x72, 0x2a, 0x52, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a,\n\t0x15, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45,\n\t0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x53, 0x45, 0x52,\n\t0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x4e, 0x4f, 0x4e, 0x59, 0x4d, 0x4f, 0x55, 0x53, 0x10,\n\t0x01, 0x1a, 0x12, 0x9a, 0x4a, 0x0f, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65,\n\t0x72, 0x54, 0x79, 0x70, 0x65, 0x32, 0xb1, 0x01, 0x0a, 0x11, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x40, 0x0a, 0x03, 0x47,\n\t0x65, 0x74, 0x12, 0x1a, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b,\n\t0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a,\n\t0x0a, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x2e, 0x6f, 0x72,\n\t0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74,\n\t0x4e, 0x6f, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22,\n\t0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x47, 0x65, 0x74, 0x4e, 0x6f, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,\n\t0x73, 0x65, 0x22, 0x00, 0x1a, 0x03, 0x9a, 0x4a, 0x00, 0x42, 0xb1, 0x01, 0x9a, 0x4a, 0x11, 0x12,\n\t0x0f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0f, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x1d, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,\n\t0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xa2, 0x02, 0x03, 0x4f, 0x46, 0x58, 0xaa, 0x02, 0x0e, 0x4f,\n\t0x72, 0x67, 0x2e, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xca, 0x02, 0x0e,\n\t0x4f, 0x72, 0x67, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xe2, 0x02,\n\t0x1a, 0x4f, 0x72, 0x67, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5c,\n\t0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0f, 0x4f, 0x72,\n\t0x67, 0x3a, 0x3a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x06, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_federation_federation_proto_rawDescOnce sync.Once\n\tfile_federation_federation_proto_rawDescData = file_federation_federation_proto_rawDesc\n)\n\nfunc file_federation_federation_proto_rawDescGZIP() []byte {\n\tfile_federation_federation_proto_rawDescOnce.Do(func() {\n\t\tfile_federation_federation_proto_rawDescData = protoimpl.X.CompressGZIP(file_federation_federation_proto_rawDescData)\n\t})\n\treturn file_federation_federation_proto_rawDescData\n}\n\nvar file_federation_federation_proto_enumTypes = make([]protoimpl.EnumInfo, 1)\nvar file_federation_federation_proto_msgTypes = make([]protoimpl.MessageInfo, 12)\nvar file_federation_federation_proto_goTypes = []interface{}{\n\t(UserType)(0),                       // 0: org.federation.UserType\n\t(*GetRequest)(nil),                  // 1: org.federation.GetRequest\n\t(*GetResponse)(nil),                 // 2: org.federation.GetResponse\n\t(*GetNoValueRequest)(nil),           // 3: org.federation.GetNoValueRequest\n\t(*GetNoValueResponse)(nil),          // 4: org.federation.GetNoValueResponse\n\t(*UserSelection)(nil),               // 5: org.federation.UserSelection\n\t(*MessageSelection)(nil),            // 6: org.federation.MessageSelection\n\t(*NoValueSelection)(nil),            // 7: org.federation.NoValueSelection\n\t(*NestedMessageSelection)(nil),      // 8: org.federation.NestedMessageSelection\n\t(*CastOneof)(nil),                   // 9: org.federation.CastOneof\n\t(*M)(nil),                           // 10: org.federation.M\n\t(*User)(nil),                        // 11: org.federation.User\n\t(*NestedMessageSelection_Nest)(nil), // 12: org.federation.NestedMessageSelection.Nest\n}\nvar file_federation_federation_proto_depIdxs = []int32{\n\t11, // 0: org.federation.GetResponse.user:type_name -> org.federation.User\n\t12, // 1: org.federation.GetResponse.nested_msg:type_name -> org.federation.NestedMessageSelection.Nest\n\t9,  // 2: org.federation.GetResponse.cast_oneof:type_name -> org.federation.CastOneof\n\t10, // 3: org.federation.GetNoValueResponse.no_value:type_name -> org.federation.M\n\t11, // 4: org.federation.UserSelection.user_a:type_name -> org.federation.User\n\t11, // 5: org.federation.UserSelection.user_b:type_name -> org.federation.User\n\t11, // 6: org.federation.UserSelection.user_c:type_name -> org.federation.User\n\t10, // 7: org.federation.NoValueSelection.m_a:type_name -> org.federation.M\n\t10, // 8: org.federation.NoValueSelection.m_b:type_name -> org.federation.M\n\t11, // 9: org.federation.CastOneof.user:type_name -> org.federation.User\n\t0,  // 10: org.federation.CastOneof.type:type_name -> org.federation.UserType\n\t1,  // 11: org.federation.FederationService.Get:input_type -> org.federation.GetRequest\n\t3,  // 12: org.federation.FederationService.GetNoValue:input_type -> org.federation.GetNoValueRequest\n\t2,  // 13: org.federation.FederationService.Get:output_type -> org.federation.GetResponse\n\t4,  // 14: org.federation.FederationService.GetNoValue:output_type -> org.federation.GetNoValueResponse\n\t13, // [13:15] is the sub-list for method output_type\n\t11, // [11:13] is the sub-list for method input_type\n\t11, // [11:11] is the sub-list for extension type_name\n\t11, // [11:11] is the sub-list for extension extendee\n\t0,  // [0:11] is the sub-list for field type_name\n}\n\nfunc init() { file_federation_federation_proto_init() }\nfunc file_federation_federation_proto_init() {\n\tif File_federation_federation_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_federation_federation_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetNoValueRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetNoValueResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*UserSelection); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MessageSelection); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*NoValueSelection); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*NestedMessageSelection); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CastOneof); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*M); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*User); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*NestedMessageSelection_Nest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\tfile_federation_federation_proto_msgTypes[4].OneofWrappers = []interface{}{\n\t\t(*UserSelection_UserA)(nil),\n\t\t(*UserSelection_UserB)(nil),\n\t\t(*UserSelection_UserC)(nil),\n\t}\n\tfile_federation_federation_proto_msgTypes[5].OneofWrappers = []interface{}{\n\t\t(*MessageSelection_MsgA)(nil),\n\t\t(*MessageSelection_MsgB)(nil),\n\t\t(*MessageSelection_MsgC)(nil),\n\t}\n\tfile_federation_federation_proto_msgTypes[6].OneofWrappers = []interface{}{\n\t\t(*NoValueSelection_MA)(nil),\n\t\t(*NoValueSelection_MB)(nil),\n\t}\n\tfile_federation_federation_proto_msgTypes[8].OneofWrappers = []interface{}{\n\t\t(*CastOneof_Num)(nil),\n\t\t(*CastOneof_User)(nil),\n\t\t(*CastOneof_Type)(nil),\n\t}\n\tfile_federation_federation_proto_msgTypes[11].OneofWrappers = []interface{}{\n\t\t(*NestedMessageSelection_Nest_Int)(nil),\n\t\t(*NestedMessageSelection_Nest_Text)(nil),\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_federation_federation_proto_rawDesc,\n\t\t\tNumEnums:      1,\n\t\t\tNumMessages:   12,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_federation_federation_proto_goTypes,\n\t\tDependencyIndexes: file_federation_federation_proto_depIdxs,\n\t\tEnumInfos:         file_federation_federation_proto_enumTypes,\n\t\tMessageInfos:      file_federation_federation_proto_msgTypes,\n\t}.Build()\n\tFile_federation_federation_proto = out.File\n\tfile_federation_federation_proto_rawDesc = nil\n\tfile_federation_federation_proto_goTypes = nil\n\tfile_federation_federation_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/10_oneof/federation/federation_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tFederationService_Get_FullMethodName        = \"/org.federation.FederationService/Get\"\n\tFederationService_GetNoValue_FullMethodName = \"/org.federation.FederationService/GetNoValue\"\n)\n\n// FederationServiceClient is the client API for FederationService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype FederationServiceClient interface {\n\tGet(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error)\n\tGetNoValue(ctx context.Context, in *GetNoValueRequest, opts ...grpc.CallOption) (*GetNoValueResponse, error)\n}\n\ntype federationServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewFederationServiceClient(cc grpc.ClientConnInterface) FederationServiceClient {\n\treturn &federationServiceClient{cc}\n}\n\nfunc (c *federationServiceClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) {\n\tout := new(GetResponse)\n\terr := c.cc.Invoke(ctx, FederationService_Get_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *federationServiceClient) GetNoValue(ctx context.Context, in *GetNoValueRequest, opts ...grpc.CallOption) (*GetNoValueResponse, error) {\n\tout := new(GetNoValueResponse)\n\terr := c.cc.Invoke(ctx, FederationService_GetNoValue_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// FederationServiceServer is the server API for FederationService service.\n// All implementations must embed UnimplementedFederationServiceServer\n// for forward compatibility\ntype FederationServiceServer interface {\n\tGet(context.Context, *GetRequest) (*GetResponse, error)\n\tGetNoValue(context.Context, *GetNoValueRequest) (*GetNoValueResponse, error)\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\n// UnimplementedFederationServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedFederationServiceServer struct {\n}\n\nfunc (UnimplementedFederationServiceServer) Get(context.Context, *GetRequest) (*GetResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method Get not implemented\")\n}\nfunc (UnimplementedFederationServiceServer) GetNoValue(context.Context, *GetNoValueRequest) (*GetNoValueResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetNoValue not implemented\")\n}\nfunc (UnimplementedFederationServiceServer) mustEmbedUnimplementedFederationServiceServer() {}\n\n// UnsafeFederationServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to FederationServiceServer will\n// result in compilation errors.\ntype UnsafeFederationServiceServer interface {\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\nfunc RegisterFederationServiceServer(s grpc.ServiceRegistrar, srv FederationServiceServer) {\n\ts.RegisterService(&FederationService_ServiceDesc, srv)\n}\n\nfunc _FederationService_Get_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(FederationServiceServer).Get(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: FederationService_Get_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(FederationServiceServer).Get(ctx, req.(*GetRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _FederationService_GetNoValue_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetNoValueRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(FederationServiceServer).GetNoValue(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: FederationService_GetNoValue_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(FederationServiceServer).GetNoValue(ctx, req.(*GetNoValueRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// FederationService_ServiceDesc is the grpc.ServiceDesc for FederationService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar FederationService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"org.federation.FederationService\",\n\tHandlerType: (*FederationServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"Get\",\n\t\t\tHandler:    _FederationService_Get_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetNoValue\",\n\t\t\tHandler:    _FederationService_GetNoValue_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"federation/federation.proto\",\n}\n"
  },
  {
    "path": "_examples/10_oneof/federation/federation_grpc_federation.pb.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: federation/federation.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n\n\tuser \"example/user\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Org_Federation_CastOneofVariable represents variable definitions in \"org.federation.CastOneof\".\ntype FederationService_Org_Federation_CastOneofVariable struct {\n}\n\n// Org_Federation_CastOneofArgument is argument for \"org.federation.CastOneof\" message.\ntype FederationService_Org_Federation_CastOneofArgument struct {\n\tFederationService_Org_Federation_CastOneofVariable\n}\n\n// Org_Federation_GetNoValueResponseVariable represents variable definitions in \"org.federation.GetNoValueResponse\".\ntype FederationService_Org_Federation_GetNoValueResponseVariable struct {\n\tNoValueSel *NoValueSelection\n}\n\n// Org_Federation_GetNoValueResponseArgument is argument for \"org.federation.GetNoValueResponse\" message.\ntype FederationService_Org_Federation_GetNoValueResponseArgument struct {\n\tFederationService_Org_Federation_GetNoValueResponseVariable\n}\n\n// Org_Federation_GetResponseVariable represents variable definitions in \"org.federation.GetResponse\".\ntype FederationService_Org_Federation_GetResponseVariable struct {\n\tCastOneof *CastOneof\n\tMsgSel    *MessageSelection\n\tNestedMsg *NestedMessageSelection_Nest\n\tSel       *UserSelection\n}\n\n// Org_Federation_GetResponseArgument is argument for \"org.federation.GetResponse\" message.\ntype FederationService_Org_Federation_GetResponseArgument struct {\n\tFederationService_Org_Federation_GetResponseVariable\n}\n\n// Org_Federation_MessageSelectionVariable represents variable definitions in \"org.federation.MessageSelection\".\ntype FederationService_Org_Federation_MessageSelectionVariable struct {\n}\n\n// Org_Federation_MessageSelectionArgument is argument for \"org.federation.MessageSelection\" message.\ntype FederationService_Org_Federation_MessageSelectionArgument struct {\n\tFederationService_Org_Federation_MessageSelectionVariable\n}\n\n// Org_Federation_NestedMessageSelection_NestVariable represents variable definitions in \"org.federation.Nest\".\ntype FederationService_Org_Federation_NestedMessageSelection_NestVariable struct {\n}\n\n// Org_Federation_NestedMessageSelection_NestArgument is argument for \"org.federation.Nest\" message.\ntype FederationService_Org_Federation_NestedMessageSelection_NestArgument struct {\n\tFederationService_Org_Federation_NestedMessageSelection_NestVariable\n}\n\n// Org_Federation_NoValueSelectionVariable represents variable definitions in \"org.federation.NoValueSelection\".\ntype FederationService_Org_Federation_NoValueSelectionVariable struct {\n}\n\n// Org_Federation_NoValueSelectionArgument is argument for \"org.federation.NoValueSelection\" message.\ntype FederationService_Org_Federation_NoValueSelectionArgument struct {\n\tFederationService_Org_Federation_NoValueSelectionVariable\n}\n\n// Org_Federation_UserVariable represents variable definitions in \"org.federation.User\".\ntype FederationService_Org_Federation_UserVariable struct {\n}\n\n// Org_Federation_UserArgument is argument for \"org.federation.User\" message.\ntype FederationService_Org_Federation_UserArgument struct {\n\tBar    string\n\tFoo    int64\n\tUserId string\n\tFederationService_Org_Federation_UserVariable\n}\n\n// Org_Federation_UserSelectionVariable represents variable definitions in \"org.federation.UserSelection\".\ntype FederationService_Org_Federation_UserSelectionVariable struct {\n\tUa *User\n\tUb *User\n\tUc *User\n}\n\n// Org_Federation_UserSelectionArgument is argument for \"org.federation.UserSelection\" message.\ntype FederationService_Org_Federation_UserSelectionArgument struct {\n\tValue string\n\tFederationService_Org_Federation_UserSelectionVariable\n}\n\n// FederationServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationServiceConfig struct {\n\t// Client provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\n\t// If this interface is not provided, an error is returned during initialization.\n\tClient FederationServiceClientFactory // required\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationServiceClientFactory interface {\n\t// User_UserServiceClient create a gRPC Client to be used to call methods in user.UserService.\n\tUser_UserServiceClient(FederationServiceClientConfig) (user.UserServiceClient, error)\n}\n\n// FederationServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationServiceDependentClientSet struct {\n\tUser_UserServiceClient user.UserServiceClient\n}\n\n// FederationServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationServiceResolver interface {\n}\n\n// FederationServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// FederationServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationServiceUnimplementedResolver struct{}\n\nconst (\n\tFederationService_DependentMethod_User_UserService_GetUser = \"/user.UserService/GetUser\"\n)\n\n// FederationService represents Federation Service.\ntype FederationService struct {\n\tUnimplementedFederationServiceServer\n\tcfg             FederationServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationServiceDependentClientSet\n}\n\n// NewFederationService creates FederationService instance by FederationServiceConfig.\nfunc NewFederationService(cfg FederationServiceConfig) (*FederationService, error) {\n\tif cfg.Client == nil {\n\t\treturn nil, grpcfed.ErrClientConfig\n\t}\n\tUser_UserServiceClient, err := cfg.Client.User_UserServiceClient(FederationServiceClientConfig{\n\t\tService: \"user.UserService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"org.federation.FederationService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.org.federation.CastOneofArgument\":                   {},\n\t\t\"grpc.federation.private.org.federation.GetNoValueResponseArgument\":          {},\n\t\t\"grpc.federation.private.org.federation.GetResponseArgument\":                 {},\n\t\t\"grpc.federation.private.org.federation.MessageSelectionArgument\":            {},\n\t\t\"grpc.federation.private.org.federation.NestedMessageSelection_NestArgument\": {},\n\t\t\"grpc.federation.private.org.federation.NoValueSelectionArgument\":            {},\n\t\t\"grpc.federation.private.org.federation.UserArgument\": {\n\t\t\t\"user_id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"UserId\"),\n\t\t\t\"foo\":     grpcfed.NewCELFieldType(grpcfed.CELIntType, \"Foo\"),\n\t\t\t\"bar\":     grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Bar\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.UserSelectionArgument\": {\n\t\t\t\"value\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Value\"),\n\t\t},\n\t\t\"org.federation.MessageSelection\": {\n\t\t\t\"message\": grpcfed.NewOneofSelectorFieldType(\n\t\t\t\tgrpcfed.CELStringType, \"Message\",\n\t\t\t\t[]reflect.Type{reflect.TypeOf((*MessageSelection_MsgA)(nil)), reflect.TypeOf((*MessageSelection_MsgB)(nil)), reflect.TypeOf((*MessageSelection_MsgC)(nil))},\n\t\t\t\t[]string{\"GetMsgA\", \"GetMsgB\", \"GetMsgC\"},\n\t\t\t\treflect.Zero(reflect.TypeOf(\"\")),\n\t\t\t),\n\t\t},\n\t\t\"org.federation.NoValueSelection\": {\n\t\t\t\"no_value\": grpcfed.NewOneofSelectorFieldType(\n\t\t\t\tgrpcfed.NewCELObjectType(\"org.federation.M\"), \"NoValue\",\n\t\t\t\t[]reflect.Type{reflect.TypeOf((*NoValueSelection_MA)(nil)), reflect.TypeOf((*NoValueSelection_MB)(nil))},\n\t\t\t\t[]string{\"GetMA\", \"GetMB\"},\n\t\t\t\treflect.Zero(reflect.TypeOf((*M)(nil))),\n\t\t\t),\n\t\t},\n\t\t\"org.federation.UserSelection\": {\n\t\t\t\"user\": grpcfed.NewOneofSelectorFieldType(\n\t\t\t\tgrpcfed.NewCELObjectType(\"org.federation.User\"), \"User\",\n\t\t\t\t[]reflect.Type{reflect.TypeOf((*UserSelection_UserA)(nil)), reflect.TypeOf((*UserSelection_UserB)(nil)), reflect.TypeOf((*UserSelection_UserC)(nil))},\n\t\t\t\t[]string{\"GetUserA\", \"GetUserB\", \"GetUserC\"},\n\t\t\t\treflect.Zero(reflect.TypeOf((*User)(nil))),\n\t\t\t),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"org.federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.GRPCErrorAccessorOptions(celTypeHelper, \"user.GetUserResponse\")...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.federation.UserType\", UserType_value, UserType_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"user.UserType\", user.UserType_value, user.UserType_name)...)\n\tsvc := &FederationService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tclient: &FederationServiceDependentClientSet{\n\t\t\tUser_UserServiceClient: User_UserServiceClient,\n\t\t},\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationService(ctx context.Context, svc *FederationService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n// Get implements \"org.federation.FederationService/Get\" method.\nfunc (s *FederationService) Get(ctx context.Context, req *GetRequest) (res *GetResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.FederationService/Get\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Org_Federation_GetResponse(ctx, &FederationService_Org_Federation_GetResponseArgument{})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// GetNoValue implements \"org.federation.FederationService/GetNoValue\" method.\nfunc (s *FederationService) GetNoValue(ctx context.Context, req *GetNoValueRequest) (res *GetNoValueResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.FederationService/GetNoValue\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Org_Federation_GetNoValueResponse(ctx, &FederationService_Org_Federation_GetNoValueResponseArgument{})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Org_Federation_CastOneof resolve \"org.federation.CastOneof\" message.\nfunc (s *FederationService) resolve_Org_Federation_CastOneof(ctx context.Context, req *FederationService_Org_Federation_CastOneofArgument) (*CastOneof, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.CastOneof\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.CastOneof\", slog.Any(\"message_args\", s.logvalue_Org_Federation_CastOneofArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.CastOneofArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &CastOneof{}\n\n\t// field binding section.\n\toneof_Num, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\tValue:      value,\n\t\tExpr:       `false`,\n\t\tOutType:    reflect.TypeOf(true),\n\t\tCacheIndex: 1,\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\toneof_User, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\tValue:      value,\n\t\tExpr:       `false`,\n\t\tOutType:    reflect.TypeOf(true),\n\t\tCacheIndex: 2,\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\toneof_Type, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\tValue:      value,\n\t\tExpr:       `true`,\n\t\tOutType:    reflect.TypeOf(true),\n\t\tCacheIndex: 3,\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\tif false {\n\t\t// For code generation reasons, we're using a loop to generate the oneof conditional branches,\n\t\t// so to avoid treating the first element specially, we always generate if branch with false condition.\n\t} else if oneof_Num.(bool) {\n\n\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[uint64]{\n\t\t\tValue:      value,\n\t\t\tExpr:       `uint(1)`,\n\t\t\tCacheIndex: 4,\n\t\t\tSetter: func(v uint64) error {\n\t\t\t\tcastOneofValue, err := s.cast_uint64__to__Org_Federation_CastOneof_Num(v)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tret.CastOneof = castOneofValue\n\t\t\t\treturn nil\n\t\t\t},\n\t\t}); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t} else if oneof_User.(bool) {\n\n\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*user.User]{\n\t\t\tValue:      value,\n\t\t\tExpr:       `user.User{id: 'foo'}`,\n\t\t\tCacheIndex: 5,\n\t\t\tSetter: func(v *user.User) error {\n\t\t\t\tcastOneofValue, err := s.cast_User_User__to__Org_Federation_CastOneof_User(v)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tret.CastOneof = castOneofValue\n\t\t\t\treturn nil\n\t\t\t},\n\t\t}); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t} else if oneof_Type.(bool) {\n\n\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[user.UserType]{\n\t\t\tValue:      value,\n\t\t\tExpr:       `user.UserType.value('USER_TYPE_ANONYMOUS')`,\n\t\t\tCacheIndex: 6,\n\t\t\tSetter: func(v user.UserType) error {\n\t\t\t\tcastOneofValue, err := s.cast_User_UserType__to__Org_Federation_CastOneof_Type(v)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tret.CastOneof = castOneofValue\n\t\t\t\treturn nil\n\t\t\t},\n\t\t}); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.CastOneof\", slog.Any(\"org.federation.CastOneof\", s.logvalue_Org_Federation_CastOneof(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_GetNoValueResponse resolve \"org.federation.GetNoValueResponse\" message.\nfunc (s *FederationService) resolve_Org_Federation_GetNoValueResponse(ctx context.Context, req *FederationService_Org_Federation_GetNoValueResponseArgument) (*GetNoValueResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.GetNoValueResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.GetNoValueResponse\", slog.Any(\"message_args\", s.logvalue_Org_Federation_GetNoValueResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tNoValueSel *NoValueSelection\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.GetNoValueResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"no_value_sel\"\n\t\t  message {\n\t\t    name: \"NoValueSelection\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_no_value_sel := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*NoValueSelection, *localValueType]{\n\t\t\tName: `no_value_sel`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.NoValueSelection\"),\n\t\t\tSetter: func(value *localValueType, v *NoValueSelection) error {\n\t\t\t\tvalue.vars.NoValueSel = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_NoValueSelectionArgument{}\n\t\t\t\tret, err := s.resolve_Org_Federation_NoValueSelection(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_no_value_sel(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_GetNoValueResponseVariable.NoValueSel = value.vars.NoValueSel\n\n\t// create a message value to be returned.\n\tret := &GetNoValueResponse{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"no_value_sel.no_value\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*M]{\n\t\tValue:      value,\n\t\tExpr:       `no_value_sel.no_value`,\n\t\tCacheIndex: 7,\n\t\tSetter: func(v *M) error {\n\t\t\tret.NoValue = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.GetNoValueResponse\", slog.Any(\"org.federation.GetNoValueResponse\", s.logvalue_Org_Federation_GetNoValueResponse(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_GetResponse resolve \"org.federation.GetResponse\" message.\nfunc (s *FederationService) resolve_Org_Federation_GetResponse(ctx context.Context, req *FederationService_Org_Federation_GetResponseArgument) (*GetResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.GetResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.GetResponse\", slog.Any(\"message_args\", s.logvalue_Org_Federation_GetResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tCastOneof *CastOneof\n\t\t\tMsgSel    *MessageSelection\n\t\t\tNestedMsg *NestedMessageSelection_Nest\n\t\t\tSel       *UserSelection\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.GetResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"sel\"\n\t\t  message {\n\t\t    name: \"UserSelection\"\n\t\t    args { name: \"value\", by: \"'foo'\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_sel := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*UserSelection, *localValueType]{\n\t\t\tName: `sel`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.UserSelection\"),\n\t\t\tSetter: func(value *localValueType, v *UserSelection) error {\n\t\t\t\tvalue.vars.Sel = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_UserSelectionArgument{}\n\t\t\t\t// { name: \"value\", by: \"'foo'\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `'foo'`,\n\t\t\t\t\tCacheIndex: 8,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Value = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_UserSelection(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"msg_sel\"\n\t\t  message {\n\t\t    name: \"MessageSelection\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_msg_sel := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*MessageSelection, *localValueType]{\n\t\t\tName: `msg_sel`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.MessageSelection\"),\n\t\t\tSetter: func(value *localValueType, v *MessageSelection) error {\n\t\t\t\tvalue.vars.MsgSel = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_MessageSelectionArgument{}\n\t\t\t\tret, err := s.resolve_Org_Federation_MessageSelection(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"nested_msg\"\n\t\t  message {\n\t\t    name: \"Nest\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_nested_msg := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*NestedMessageSelection_Nest, *localValueType]{\n\t\t\tName: `nested_msg`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.NestedMessageSelection.Nest\"),\n\t\t\tSetter: func(value *localValueType, v *NestedMessageSelection_Nest) error {\n\t\t\t\tvalue.vars.NestedMsg = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_NestedMessageSelection_NestArgument{}\n\t\t\t\tret, err := s.resolve_Org_Federation_NestedMessageSelection_Nest(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"cast_oneof\"\n\t\t  message {\n\t\t    name: \"CastOneof\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_cast_oneof := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*CastOneof, *localValueType]{\n\t\t\tName: `cast_oneof`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.CastOneof\"),\n\t\t\tSetter: func(value *localValueType, v *CastOneof) error {\n\t\t\t\tvalue.vars.CastOneof = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_CastOneofArgument{}\n\t\t\t\tret, err := s.resolve_Org_Federation_CastOneof(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t   cast_oneof ─┐\n\t      msg_sel ─┤\n\t   nested_msg ─┤\n\t          sel ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_cast_oneof(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_msg_sel(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_nested_msg(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_sel(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_GetResponseVariable.CastOneof = value.vars.CastOneof\n\treq.FederationService_Org_Federation_GetResponseVariable.MsgSel = value.vars.MsgSel\n\treq.FederationService_Org_Federation_GetResponseVariable.NestedMsg = value.vars.NestedMsg\n\treq.FederationService_Org_Federation_GetResponseVariable.Sel = value.vars.Sel\n\n\t// create a message value to be returned.\n\tret := &GetResponse{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"sel.user\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*User]{\n\t\tValue:      value,\n\t\tExpr:       `sel.user`,\n\t\tCacheIndex: 9,\n\t\tSetter: func(v *User) error {\n\t\t\tret.User = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"msg_sel.message\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `msg_sel.message`,\n\t\tCacheIndex: 10,\n\t\tSetter: func(v string) error {\n\t\t\tret.Msg = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"nested_msg\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*NestedMessageSelection_Nest]{\n\t\tValue:      value,\n\t\tExpr:       `nested_msg`,\n\t\tCacheIndex: 11,\n\t\tSetter: func(v *NestedMessageSelection_Nest) error {\n\t\t\tret.NestedMsg = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"cast_oneof\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*CastOneof]{\n\t\tValue:      value,\n\t\tExpr:       `cast_oneof`,\n\t\tCacheIndex: 12,\n\t\tSetter: func(v *CastOneof) error {\n\t\t\tret.CastOneof = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.GetResponse\", slog.Any(\"org.federation.GetResponse\", s.logvalue_Org_Federation_GetResponse(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_MessageSelection resolve \"org.federation.MessageSelection\" message.\nfunc (s *FederationService) resolve_Org_Federation_MessageSelection(ctx context.Context, req *FederationService_Org_Federation_MessageSelectionArgument) (*MessageSelection, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.MessageSelection\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.MessageSelection\", slog.Any(\"message_args\", s.logvalue_Org_Federation_MessageSelectionArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.MessageSelectionArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &MessageSelection{}\n\n\t// field binding section.\n\toneof_MsgA, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\tValue:      value,\n\t\tExpr:       `false`,\n\t\tOutType:    reflect.TypeOf(true),\n\t\tCacheIndex: 13,\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\toneof_MsgB, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\tValue:      value,\n\t\tExpr:       `true`,\n\t\tOutType:    reflect.TypeOf(true),\n\t\tCacheIndex: 14,\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\tif false {\n\t\t// For code generation reasons, we're using a loop to generate the oneof conditional branches,\n\t\t// so to avoid treating the first element specially, we always generate if branch with false condition.\n\t} else if oneof_MsgA.(bool) {\n\n\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\tValue:      value,\n\t\t\tExpr:       `'aaa'`,\n\t\t\tCacheIndex: 15,\n\t\t\tSetter: func(v string) error {\n\t\t\t\tmessageValue, err := s.cast_string__to__Org_Federation_MessageSelection_MsgA(v)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tret.Message = messageValue\n\t\t\t\treturn nil\n\t\t\t},\n\t\t}); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t} else if oneof_MsgB.(bool) {\n\n\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\tValue:      value,\n\t\t\tExpr:       `'bbb'`,\n\t\t\tCacheIndex: 16,\n\t\t\tSetter: func(v string) error {\n\t\t\t\tmessageValue, err := s.cast_string__to__Org_Federation_MessageSelection_MsgB(v)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tret.Message = messageValue\n\t\t\t\treturn nil\n\t\t\t},\n\t\t}); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t} else {\n\n\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\tValue:      value,\n\t\t\tExpr:       `'ccc'`,\n\t\t\tCacheIndex: 17,\n\t\t\tSetter: func(v string) error {\n\t\t\t\tmessageValue, err := s.cast_string__to__Org_Federation_MessageSelection_MsgC(v)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tret.Message = messageValue\n\t\t\t\treturn nil\n\t\t\t},\n\t\t}); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.MessageSelection\", slog.Any(\"org.federation.MessageSelection\", s.logvalue_Org_Federation_MessageSelection(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_NestedMessageSelection_Nest resolve \"org.federation.NestedMessageSelection.Nest\" message.\nfunc (s *FederationService) resolve_Org_Federation_NestedMessageSelection_Nest(ctx context.Context, req *FederationService_Org_Federation_NestedMessageSelection_NestArgument) (*NestedMessageSelection_Nest, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.NestedMessageSelection.Nest\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.NestedMessageSelection.Nest\", slog.Any(\"message_args\", s.logvalue_Org_Federation_NestedMessageSelection_NestArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.NestedMessageSelection_NestArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &NestedMessageSelection_Nest{}\n\n\t// field binding section.\n\toneof_Int, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\tValue:      value,\n\t\tExpr:       `true`,\n\t\tOutType:    reflect.TypeOf(true),\n\t\tCacheIndex: 18,\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\toneof_Text, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\tValue:      value,\n\t\tExpr:       `false`,\n\t\tOutType:    reflect.TypeOf(true),\n\t\tCacheIndex: 19,\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\tif false {\n\t\t// For code generation reasons, we're using a loop to generate the oneof conditional branches,\n\t\t// so to avoid treating the first element specially, we always generate if branch with false condition.\n\t} else if oneof_Int.(bool) {\n\n\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[int64]{\n\t\t\tValue:      value,\n\t\t\tExpr:       `1`,\n\t\t\tCacheIndex: 20,\n\t\t\tSetter: func(v int64) error {\n\t\t\t\tvalueValue, err := s.cast_int64__to__Org_Federation_NestedMessageSelection_Nest_Int(v)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tret.Value = valueValue\n\t\t\t\treturn nil\n\t\t\t},\n\t\t}); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t} else if oneof_Text.(bool) {\n\n\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\tValue:      value,\n\t\t\tExpr:       `'foo'`,\n\t\t\tCacheIndex: 21,\n\t\t\tSetter: func(v string) error {\n\t\t\t\tvalueValue, err := s.cast_string__to__Org_Federation_NestedMessageSelection_Nest_Text(v)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tret.Value = valueValue\n\t\t\t\treturn nil\n\t\t\t},\n\t\t}); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.NestedMessageSelection.Nest\", slog.Any(\"org.federation.NestedMessageSelection.Nest\", s.logvalue_Org_Federation_NestedMessageSelection_Nest(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_NoValueSelection resolve \"org.federation.NoValueSelection\" message.\nfunc (s *FederationService) resolve_Org_Federation_NoValueSelection(ctx context.Context, req *FederationService_Org_Federation_NoValueSelectionArgument) (*NoValueSelection, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.NoValueSelection\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.NoValueSelection\", slog.Any(\"message_args\", s.logvalue_Org_Federation_NoValueSelectionArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.NoValueSelectionArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &NoValueSelection{}\n\n\t// field binding section.\n\toneof_MA, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\tValue:      value,\n\t\tExpr:       `false`,\n\t\tOutType:    reflect.TypeOf(true),\n\t\tCacheIndex: 22,\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\toneof_MB, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\tValue:      value,\n\t\tExpr:       `false`,\n\t\tOutType:    reflect.TypeOf(true),\n\t\tCacheIndex: 23,\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\tif false {\n\t\t// For code generation reasons, we're using a loop to generate the oneof conditional branches,\n\t\t// so to avoid treating the first element specially, we always generate if branch with false condition.\n\t} else if oneof_MA.(bool) {\n\n\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*M]{\n\t\t\tValue:      value,\n\t\t\tExpr:       `M{value: 'a'}`,\n\t\t\tCacheIndex: 24,\n\t\t\tSetter: func(v *M) error {\n\t\t\t\tnoValueValue, err := s.cast_Org_Federation_M__to__Org_Federation_NoValueSelection_MA(v)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tret.NoValue = noValueValue\n\t\t\t\treturn nil\n\t\t\t},\n\t\t}); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t} else if oneof_MB.(bool) {\n\n\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*M]{\n\t\t\tValue:      value,\n\t\t\tExpr:       `M{value: 'b'}`,\n\t\t\tCacheIndex: 25,\n\t\t\tSetter: func(v *M) error {\n\t\t\t\tnoValueValue, err := s.cast_Org_Federation_M__to__Org_Federation_NoValueSelection_MB(v)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tret.NoValue = noValueValue\n\t\t\t\treturn nil\n\t\t\t},\n\t\t}); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.NoValueSelection\", slog.Any(\"org.federation.NoValueSelection\", s.logvalue_Org_Federation_NoValueSelection(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_User resolve \"org.federation.User\" message.\nfunc (s *FederationService) resolve_Org_Federation_User(ctx context.Context, req *FederationService_Org_Federation_UserArgument) (*User, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.User\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.User\", slog.Any(\"message_args\", s.logvalue_Org_Federation_UserArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tXDef0 *user.GetUserResponse\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.UserArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"_def0\"\n\t\t  call {\n\t\t    method: \"user.UserService/GetUser\"\n\t\t    request: [\n\t\t      { field: \"id\", by: \"$.user_id\" },\n\t\t      { field: \"foo\", by: \"$.foo\", if: \"$.foo != 0\" },\n\t\t      { field: \"bar\", by: \"$.bar\", if: \"$.bar != ''\" }\n\t\t    ]\n\t\t  }\n\t\t}\n\t*/\n\tdef__def0 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*user.GetUserResponse, *localValueType]{\n\t\t\tName: `_def0`,\n\t\t\tType: grpcfed.CELObjectType(\"user.GetUserResponse\"),\n\t\t\tSetter: func(value *localValueType, v *user.GetUserResponse) error {\n\t\t\t\tvalue.vars.XDef0 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &user.GetUserRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.user_id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.user_id`,\n\t\t\t\t\tCacheIndex: 26,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"foo\", by: \"$.foo\", if: \"$.foo != 0\" }\n\t\t\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.foo != 0`,\n\t\t\t\t\tCacheIndex: 27,\n\t\t\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t\t\treturn grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[int64]{\n\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\tExpr:       `$.foo`,\n\t\t\t\t\t\t\tCacheIndex: 28,\n\t\t\t\t\t\t\tSetter: func(v int64) error {\n\t\t\t\t\t\t\t\targs.Foobar = &user.GetUserRequest_Foo{\n\t\t\t\t\t\t\t\t\tFoo: v,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"bar\", by: \"$.bar\", if: \"$.bar != ”\" }\n\t\t\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.bar != ''`,\n\t\t\t\t\tCacheIndex: 29,\n\t\t\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t\t\treturn grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\tExpr:       `$.bar`,\n\t\t\t\t\t\t\tCacheIndex: 30,\n\t\t\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\t\t\targs.Foobar = &user.GetUserRequest_Bar{\n\t\t\t\t\t\t\t\t\tBar: v,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call user.UserService/GetUser\", slog.Any(\"user.GetUserRequest\", s.logvalue_User_GetUserRequest(args)))\n\t\t\t\tret, err := s.client.User_UserServiceClient.GetUser(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_User_UserService_GetUser, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def__def0(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// create a message value to be returned.\n\tret := &User{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"$.user_id\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `$.user_id`,\n\t\tCacheIndex: 31,\n\t\tSetter: func(v string) error {\n\t\t\tret.Id = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.User\", slog.Any(\"org.federation.User\", s.logvalue_Org_Federation_User(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_UserSelection resolve \"org.federation.UserSelection\" message.\nfunc (s *FederationService) resolve_Org_Federation_UserSelection(ctx context.Context, req *FederationService_Org_Federation_UserSelectionArgument) (*UserSelection, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.UserSelection\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.UserSelection\", slog.Any(\"message_args\", s.logvalue_Org_Federation_UserSelectionArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tUa *User\n\t\t\tUb *User\n\t\t\tUc *User\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.UserSelectionArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_UserSelectionVariable.Ua = value.vars.Ua\n\treq.FederationService_Org_Federation_UserSelectionVariable.Ub = value.vars.Ub\n\treq.FederationService_Org_Federation_UserSelectionVariable.Uc = value.vars.Uc\n\n\t// create a message value to be returned.\n\tret := &UserSelection{}\n\n\t// field binding section.\n\toneof_UserA, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\tValue:      value,\n\t\tExpr:       `false`,\n\t\tOutType:    reflect.TypeOf(true),\n\t\tCacheIndex: 32,\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\toneof_UserB, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\tValue:      value,\n\t\tExpr:       `true`,\n\t\tOutType:    reflect.TypeOf(true),\n\t\tCacheIndex: 33,\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\tif false {\n\t\t// For code generation reasons, we're using a loop to generate the oneof conditional branches,\n\t\t// so to avoid treating the first element specially, we always generate if branch with false condition.\n\t} else if oneof_UserA.(bool) {\n\t\t/*\n\t\t\tdef {\n\t\t\t  name: \"ua\"\n\t\t\t  message {\n\t\t\t    name: \"User\"\n\t\t\t    args: [\n\t\t\t      { name: \"user_id\", by: \"'a'\" },\n\t\t\t      { name: \"foo\", by: \"0\" },\n\t\t\t      { name: \"bar\", by: \"'hello'\" }\n\t\t\t    ]\n\t\t\t  }\n\t\t\t}\n\t\t*/\n\t\tdef_ua := func(ctx context.Context) error {\n\t\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*User, *localValueType]{\n\t\t\t\tName: `ua`,\n\t\t\t\tType: grpcfed.CELObjectType(\"org.federation.User\"),\n\t\t\t\tSetter: func(value *localValueType, v *User) error {\n\t\t\t\t\tvalue.vars.Ua = v\n\t\t\t\t\treturn nil\n\t\t\t\t},\n\t\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\t\targs := &FederationService_Org_Federation_UserArgument{}\n\t\t\t\t\t// { name: \"user_id\", by: \"'a'\" }\n\t\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\tExpr:       `'a'`,\n\t\t\t\t\t\tCacheIndex: 34,\n\t\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\t\targs.UserId = v\n\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t},\n\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t}\n\t\t\t\t\t// { name: \"foo\", by: \"0\" }\n\t\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[int64]{\n\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\tExpr:       `0`,\n\t\t\t\t\t\tCacheIndex: 35,\n\t\t\t\t\t\tSetter: func(v int64) error {\n\t\t\t\t\t\t\targs.Foo = v\n\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t},\n\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t}\n\t\t\t\t\t// { name: \"bar\", by: \"'hello'\" }\n\t\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\tExpr:       `'hello'`,\n\t\t\t\t\t\tCacheIndex: 36,\n\t\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\t\targs.Bar = v\n\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t},\n\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t}\n\t\t\t\t\tret, err := s.resolve_Org_Federation_User(ctx, args)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t}\n\t\t\t\t\treturn ret, nil\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\n\t\tif err := def_ua(ctx); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*User]{\n\t\t\tValue:      value,\n\t\t\tExpr:       `ua`,\n\t\t\tCacheIndex: 37,\n\t\t\tSetter: func(v *User) error {\n\t\t\t\tuserValue, err := s.cast_Org_Federation_User__to__Org_Federation_UserSelection_UserA(v)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tret.User = userValue\n\t\t\t\treturn nil\n\t\t\t},\n\t\t}); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t} else if oneof_UserB.(bool) {\n\t\t/*\n\t\t\tdef {\n\t\t\t  name: \"ub\"\n\t\t\t  message {\n\t\t\t    name: \"User\"\n\t\t\t    args: [\n\t\t\t      { name: \"user_id\", by: \"'b'\" },\n\t\t\t      { name: \"foo\", by: \"0\" },\n\t\t\t      { name: \"bar\", by: \"'hello'\" }\n\t\t\t    ]\n\t\t\t  }\n\t\t\t}\n\t\t*/\n\t\tdef_ub := func(ctx context.Context) error {\n\t\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*User, *localValueType]{\n\t\t\t\tName: `ub`,\n\t\t\t\tType: grpcfed.CELObjectType(\"org.federation.User\"),\n\t\t\t\tSetter: func(value *localValueType, v *User) error {\n\t\t\t\t\tvalue.vars.Ub = v\n\t\t\t\t\treturn nil\n\t\t\t\t},\n\t\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\t\targs := &FederationService_Org_Federation_UserArgument{}\n\t\t\t\t\t// { name: \"user_id\", by: \"'b'\" }\n\t\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\tExpr:       `'b'`,\n\t\t\t\t\t\tCacheIndex: 38,\n\t\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\t\targs.UserId = v\n\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t},\n\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t}\n\t\t\t\t\t// { name: \"foo\", by: \"0\" }\n\t\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[int64]{\n\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\tExpr:       `0`,\n\t\t\t\t\t\tCacheIndex: 39,\n\t\t\t\t\t\tSetter: func(v int64) error {\n\t\t\t\t\t\t\targs.Foo = v\n\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t},\n\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t}\n\t\t\t\t\t// { name: \"bar\", by: \"'hello'\" }\n\t\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\tExpr:       `'hello'`,\n\t\t\t\t\t\tCacheIndex: 40,\n\t\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\t\targs.Bar = v\n\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t},\n\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t}\n\t\t\t\t\tret, err := s.resolve_Org_Federation_User(ctx, args)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t}\n\t\t\t\t\treturn ret, nil\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\n\t\tif err := def_ub(ctx); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*User]{\n\t\t\tValue:      value,\n\t\t\tExpr:       `ub`,\n\t\t\tCacheIndex: 41,\n\t\t\tSetter: func(v *User) error {\n\t\t\t\tuserValue, err := s.cast_Org_Federation_User__to__Org_Federation_UserSelection_UserB(v)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tret.User = userValue\n\t\t\t\treturn nil\n\t\t\t},\n\t\t}); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t} else {\n\t\t/*\n\t\t\tdef {\n\t\t\t  name: \"uc\"\n\t\t\t  message {\n\t\t\t    name: \"User\"\n\t\t\t    args: [\n\t\t\t      { name: \"user_id\", by: \"$.value\" },\n\t\t\t      { name: \"foo\", by: \"0\" },\n\t\t\t      { name: \"bar\", by: \"'hello'\" }\n\t\t\t    ]\n\t\t\t  }\n\t\t\t}\n\t\t*/\n\t\tdef_uc := func(ctx context.Context) error {\n\t\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*User, *localValueType]{\n\t\t\t\tName: `uc`,\n\t\t\t\tType: grpcfed.CELObjectType(\"org.federation.User\"),\n\t\t\t\tSetter: func(value *localValueType, v *User) error {\n\t\t\t\t\tvalue.vars.Uc = v\n\t\t\t\t\treturn nil\n\t\t\t\t},\n\t\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\t\targs := &FederationService_Org_Federation_UserArgument{}\n\t\t\t\t\t// { name: \"user_id\", by: \"$.value\" }\n\t\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\tExpr:       `$.value`,\n\t\t\t\t\t\tCacheIndex: 42,\n\t\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\t\targs.UserId = v\n\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t},\n\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t}\n\t\t\t\t\t// { name: \"foo\", by: \"0\" }\n\t\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[int64]{\n\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\tExpr:       `0`,\n\t\t\t\t\t\tCacheIndex: 43,\n\t\t\t\t\t\tSetter: func(v int64) error {\n\t\t\t\t\t\t\targs.Foo = v\n\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t},\n\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t}\n\t\t\t\t\t// { name: \"bar\", by: \"'hello'\" }\n\t\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\tExpr:       `'hello'`,\n\t\t\t\t\t\tCacheIndex: 44,\n\t\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\t\targs.Bar = v\n\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t},\n\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t}\n\t\t\t\t\tret, err := s.resolve_Org_Federation_User(ctx, args)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t}\n\t\t\t\t\treturn ret, nil\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\n\t\tif err := def_uc(ctx); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*User]{\n\t\t\tValue:      value,\n\t\t\tExpr:       `uc`,\n\t\t\tCacheIndex: 45,\n\t\t\tSetter: func(v *User) error {\n\t\t\t\tuserValue, err := s.cast_Org_Federation_User__to__Org_Federation_UserSelection_UserC(v)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tret.User = userValue\n\t\t\t\treturn nil\n\t\t\t},\n\t\t}); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.UserSelection\", slog.Any(\"org.federation.UserSelection\", s.logvalue_Org_Federation_UserSelection(ret)))\n\treturn ret, nil\n}\n\n// cast_Org_Federation_M__to__Org_Federation_NoValueSelection_MA cast from \"org.federation.M\" to \"org.federation.NoValueSelection.m_a\".\nfunc (s *FederationService) cast_Org_Federation_M__to__Org_Federation_NoValueSelection_MA(from *M) (*NoValueSelection_MA, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tvalueValue := from.GetValue()\n\tret := &M{\n\t\tValue: valueValue,\n\t}\n\n\treturn &NoValueSelection_MA{\n\t\tMA: ret,\n\t}, nil\n}\n\n// cast_Org_Federation_M__to__Org_Federation_NoValueSelection_MB cast from \"org.federation.M\" to \"org.federation.NoValueSelection.m_b\".\nfunc (s *FederationService) cast_Org_Federation_M__to__Org_Federation_NoValueSelection_MB(from *M) (*NoValueSelection_MB, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tvalueValue := from.GetValue()\n\tret := &M{\n\t\tValue: valueValue,\n\t}\n\n\treturn &NoValueSelection_MB{\n\t\tMB: ret,\n\t}, nil\n}\n\n// cast_Org_Federation_User__to__Org_Federation_UserSelection_UserA cast from \"org.federation.User\" to \"org.federation.UserSelection.user_a\".\nfunc (s *FederationService) cast_Org_Federation_User__to__Org_Federation_UserSelection_UserA(from *User) (*UserSelection_UserA, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tidValue := from.GetId()\n\tret := &User{\n\t\tId: idValue,\n\t}\n\n\treturn &UserSelection_UserA{\n\t\tUserA: ret,\n\t}, nil\n}\n\n// cast_Org_Federation_User__to__Org_Federation_UserSelection_UserB cast from \"org.federation.User\" to \"org.federation.UserSelection.user_b\".\nfunc (s *FederationService) cast_Org_Federation_User__to__Org_Federation_UserSelection_UserB(from *User) (*UserSelection_UserB, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tidValue := from.GetId()\n\tret := &User{\n\t\tId: idValue,\n\t}\n\n\treturn &UserSelection_UserB{\n\t\tUserB: ret,\n\t}, nil\n}\n\n// cast_Org_Federation_User__to__Org_Federation_UserSelection_UserC cast from \"org.federation.User\" to \"org.federation.UserSelection.user_c\".\nfunc (s *FederationService) cast_Org_Federation_User__to__Org_Federation_UserSelection_UserC(from *User) (*UserSelection_UserC, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tidValue := from.GetId()\n\tret := &User{\n\t\tId: idValue,\n\t}\n\n\treturn &UserSelection_UserC{\n\t\tUserC: ret,\n\t}, nil\n}\n\n// cast_User_UserType__to__Org_Federation_CastOneof_Type cast from \"user.UserType\" to \"org.federation.CastOneof.type\".\nfunc (s *FederationService) cast_User_UserType__to__Org_Federation_CastOneof_Type(from user.UserType) (*CastOneof_Type, error) {\n\tvar ret UserType\n\tswitch from {\n\tcase user.UserType_USER_TYPE_UNSPECIFIED:\n\t\tret = UserType_USER_TYPE_UNSPECIFIED\n\tcase user.UserType_USER_TYPE_ANONYMOUS:\n\t\tret = UserType_USER_TYPE_ANONYMOUS\n\tdefault:\n\t\tret = 0\n\t}\n\treturn &CastOneof_Type{\n\t\tType: ret,\n\t}, nil\n}\n\n// cast_User_User__to__Org_Federation_CastOneof_User cast from \"user.User\" to \"org.federation.CastOneof.user\".\nfunc (s *FederationService) cast_User_User__to__Org_Federation_CastOneof_User(from *user.User) (*CastOneof_User, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tidValue := from.GetId()\n\tret := &User{\n\t\tId: idValue,\n\t}\n\n\treturn &CastOneof_User{\n\t\tUser: ret,\n\t}, nil\n}\n\n// cast_int64__to__Org_Federation_NestedMessageSelection_Nest_Int cast from \"int64\" to \"org.federation.NestedMessageSelection.Nest.int\".\nfunc (s *FederationService) cast_int64__to__Org_Federation_NestedMessageSelection_Nest_Int(from int64) (*NestedMessageSelection_Nest_Int, error) {\n\treturn &NestedMessageSelection_Nest_Int{\n\t\tInt: int64(from),\n\t}, nil\n}\n\n// cast_string__to__Org_Federation_MessageSelection_MsgA cast from \"string\" to \"org.federation.MessageSelection.msg_a\".\nfunc (s *FederationService) cast_string__to__Org_Federation_MessageSelection_MsgA(from string) (*MessageSelection_MsgA, error) {\n\treturn &MessageSelection_MsgA{\n\t\tMsgA: string(from),\n\t}, nil\n}\n\n// cast_string__to__Org_Federation_MessageSelection_MsgB cast from \"string\" to \"org.federation.MessageSelection.msg_b\".\nfunc (s *FederationService) cast_string__to__Org_Federation_MessageSelection_MsgB(from string) (*MessageSelection_MsgB, error) {\n\treturn &MessageSelection_MsgB{\n\t\tMsgB: string(from),\n\t}, nil\n}\n\n// cast_string__to__Org_Federation_MessageSelection_MsgC cast from \"string\" to \"org.federation.MessageSelection.msg_c\".\nfunc (s *FederationService) cast_string__to__Org_Federation_MessageSelection_MsgC(from string) (*MessageSelection_MsgC, error) {\n\treturn &MessageSelection_MsgC{\n\t\tMsgC: string(from),\n\t}, nil\n}\n\n// cast_string__to__Org_Federation_NestedMessageSelection_Nest_Text cast from \"string\" to \"org.federation.NestedMessageSelection.Nest.text\".\nfunc (s *FederationService) cast_string__to__Org_Federation_NestedMessageSelection_Nest_Text(from string) (*NestedMessageSelection_Nest_Text, error) {\n\treturn &NestedMessageSelection_Nest_Text{\n\t\tText: string(from),\n\t}, nil\n}\n\n// cast_uint64__to__Org_Federation_CastOneof_Num cast from \"uint64\" to \"org.federation.CastOneof.num\".\nfunc (s *FederationService) cast_uint64__to__Org_Federation_CastOneof_Num(from uint64) (*CastOneof_Num, error) {\n\tret, err := grpcfed.Uint64ToInt64(from)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &CastOneof_Num{\n\t\tNum: ret,\n\t}, nil\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_CastOneof(v *CastOneof) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Int64(\"num\", v.GetNum()),\n\t\tslog.Any(\"user\", s.logvalue_Org_Federation_User(v.GetUser())),\n\t\tslog.String(\"type\", s.logvalue_Org_Federation_UserType(v.GetType()).String()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_CastOneofArgument(v *FederationService_Org_Federation_CastOneofArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetNoValueResponse(v *GetNoValueResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"no_value\", s.logvalue_Org_Federation_M(v.GetNoValue())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetNoValueResponseArgument(v *FederationService_Org_Federation_GetNoValueResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetResponse(v *GetResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"user\", s.logvalue_Org_Federation_User(v.GetUser())),\n\t\tslog.String(\"msg\", v.GetMsg()),\n\t\tslog.Any(\"nested_msg\", s.logvalue_Org_Federation_NestedMessageSelection_Nest(v.GetNestedMsg())),\n\t\tslog.Any(\"cast_oneof\", s.logvalue_Org_Federation_CastOneof(v.GetCastOneof())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetResponseArgument(v *FederationService_Org_Federation_GetResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_M(v *M) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"value\", v.GetValue()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_MessageSelection(v *MessageSelection) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"msg_a\", v.GetMsgA()),\n\t\tslog.String(\"msg_b\", v.GetMsgB()),\n\t\tslog.String(\"msg_c\", v.GetMsgC()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_MessageSelectionArgument(v *FederationService_Org_Federation_MessageSelectionArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_NestedMessageSelection_Nest(v *NestedMessageSelection_Nest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Int64(\"int\", v.GetInt()),\n\t\tslog.String(\"text\", v.GetText()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_NestedMessageSelection_NestArgument(v *FederationService_Org_Federation_NestedMessageSelection_NestArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_NoValueSelection(v *NoValueSelection) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"m_a\", s.logvalue_Org_Federation_M(v.GetMA())),\n\t\tslog.Any(\"m_b\", s.logvalue_Org_Federation_M(v.GetMB())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_NoValueSelectionArgument(v *FederationService_Org_Federation_NoValueSelectionArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_User(v *User) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_UserArgument(v *FederationService_Org_Federation_UserArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"user_id\", v.UserId),\n\t\tslog.Int64(\"foo\", v.Foo),\n\t\tslog.String(\"bar\", v.Bar),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_UserSelection(v *UserSelection) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"user_a\", s.logvalue_Org_Federation_User(v.GetUserA())),\n\t\tslog.Any(\"user_b\", s.logvalue_Org_Federation_User(v.GetUserB())),\n\t\tslog.Any(\"user_c\", s.logvalue_Org_Federation_User(v.GetUserC())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_UserSelectionArgument(v *FederationService_Org_Federation_UserSelectionArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"value\", v.Value),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_UserType(v UserType) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tswitch v {\n\tcase UserType_USER_TYPE_UNSPECIFIED:\n\t\treturn slog.StringValue(\"USER_TYPE_UNSPECIFIED\")\n\tcase UserType_USER_TYPE_ANONYMOUS:\n\t\treturn slog.StringValue(\"USER_TYPE_ANONYMOUS\")\n\t}\n\treturn slog.StringValue(\"\")\n}\n\nfunc (s *FederationService) logvalue_User_GetUserRequest(v *user.GetUserRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.Int64(\"foo\", v.GetFoo()),\n\t\tslog.String(\"bar\", v.GetBar()),\n\t)\n}\n"
  },
  {
    "path": "_examples/10_oneof/go.mod",
    "content": "module example\n\ngo 1.24.0\n\nreplace github.com/mercari/grpc-federation => ../../\n\nrequire (\n\tgithub.com/google/go-cmp v0.7.0\n\tgithub.com/mercari/grpc-federation v0.0.0-00010101000000-000000000000\n\tgo.opentelemetry.io/otel v1.24.0\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0\n\tgo.opentelemetry.io/otel/sdk v1.24.0\n\tgo.opentelemetry.io/otel/trace v1.24.0\n\tgo.uber.org/goleak v1.3.0\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7\n\tgoogle.golang.org/grpc v1.65.0\n\tgoogle.golang.org/protobuf v1.34.2\n)\n\nrequire (\n\tcel.dev/expr v0.19.1 // indirect\n\tgithub.com/antlr4-go/antlr/v4 v4.13.0 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.2.1 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/goccy/wasi-go v0.3.2 // indirect\n\tgithub.com/google/cel-go v0.23.1 // indirect\n\tgithub.com/google/uuid v1.6.0 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect\n\tgithub.com/kelseyhightower/envconfig v1.4.0 // indirect\n\tgithub.com/stealthrocket/wazergo v0.19.1 // indirect\n\tgithub.com/stoewer/go-strcase v1.3.0 // indirect\n\tgithub.com/tetratelabs/wazero v1.10.1 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.24.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.0.0 // indirect\n\tgolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect\n\tgolang.org/x/net v0.38.0 // indirect\n\tgolang.org/x/sync v0.14.0 // indirect\n\tgolang.org/x/sys v0.37.0 // indirect\n\tgolang.org/x/text v0.23.0 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 // indirect\n)\n"
  },
  {
    "path": "_examples/10_oneof/go.sum",
    "content": "cel.dev/expr v0.19.1 h1:NciYrtDRIR0lNCnH1LFJegdjspNx9fI59O7TWcua/W4=\ncel.dev/expr v0.19.1/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw=\ngithub.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=\ngithub.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/goccy/wasi-go v0.3.2 h1:wAvGXmqCkfcp0B0AwIp5Ya53hzDwkKm9W8iuT3nCCz0=\ngithub.com/goccy/wasi-go v0.3.2/go.mod h1:nIKD204n9xa4Z20UV+XA483kIr9TAl2vXr+X5qVAO5M=\ngithub.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4=\ngithub.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=\ngithub.com/google/cel-go v0.23.1 h1:91ThhEZlBcE5rB2adBVXqvDoqdL8BG2oyhd0bK1I/r4=\ngithub.com/google/cel-go v0.23.1/go.mod h1:52Pb6QsDbC5kvgxvZhiL9QX1oZEkcUF/ZqaPx1J5Wwo=\ngithub.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\ngithub.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg=\ngithub.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=\ngithub.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/stealthrocket/wazergo v0.19.1 h1:BPrITETPgSFwiytwmToO0MbUC/+RGC39JScz1JmmG6c=\ngithub.com/stealthrocket/wazergo v0.19.1/go.mod h1:riI0hxw4ndZA5e6z7PesHg2BtTftcZaMxRcoiGGipTs=\ngithub.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs=\ngithub.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tetratelabs/wazero v1.10.1 h1:2DugeJf6VVk58KTPszlNfeeN8AhhpwcZqkJj2wwFuH8=\ngithub.com/tetratelabs/wazero v1.10.1/go.mod h1:DRm5twOQ5Gr1AoEdSi0CLjDQF1J9ZAuyqFIjl1KKfQU=\ngo.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo=\ngo.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0=\ngo.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI=\ngo.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=\ngo.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw=\ngo.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg=\ngo.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=\ngo.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=\ngo.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=\ngo.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=\ngolang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=\ngolang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=\ngolang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=\ngolang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=\ngolang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=\ngolang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=\ngolang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 h1:YcyjlL1PRr2Q17/I0dPk2JmYS5CDXfcdb2Z3YRioEbw=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7 h1:2035KHhUv+EpyB+hWgJnaWKJOdX1E95w2S8Rr4uWKTs=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=\ngoogle.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=\ngoogle.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=\ngoogle.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=\ngoogle.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "_examples/10_oneof/grpc/federation/federation.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: grpc/federation/federation.proto\n\npackage federation\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\tcode \"google.golang.org/genproto/googleapis/rpc/code\"\n\terrdetails \"google.golang.org/genproto/googleapis/rpc/errdetails\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tdescriptorpb \"google.golang.org/protobuf/types/descriptorpb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// TypeKind is primitive kind list.\ntype TypeKind int32\n\nconst (\n\t// UNKNOWN represents unexpected value.\n\tTypeKind_UNKNOWN TypeKind = 0\n\t// STRING is used to convert the input value to `string` type.\n\tTypeKind_STRING TypeKind = 1\n\t// BOOL is used to convert the input value to `bool` type.\n\tTypeKind_BOOL TypeKind = 2\n\t// INT64 is used to convert the input value to `int64` type.\n\tTypeKind_INT64 TypeKind = 3\n\t// UINT64 is used to convert the input value to `uint64` type.\n\tTypeKind_UINT64 TypeKind = 4\n\t// DOUBLE is used to convert the input value to `double` type.\n\tTypeKind_DOUBLE TypeKind = 5\n\t// DURATION is used to convert the input value to the `google.protobuf.Duration` type.\n\tTypeKind_DURATION TypeKind = 6\n)\n\n// Enum value maps for TypeKind.\nvar (\n\tTypeKind_name = map[int32]string{\n\t\t0: \"UNKNOWN\",\n\t\t1: \"STRING\",\n\t\t2: \"BOOL\",\n\t\t3: \"INT64\",\n\t\t4: \"UINT64\",\n\t\t5: \"DOUBLE\",\n\t\t6: \"DURATION\",\n\t}\n\tTypeKind_value = map[string]int32{\n\t\t\"UNKNOWN\":  0,\n\t\t\"STRING\":   1,\n\t\t\"BOOL\":     2,\n\t\t\"INT64\":    3,\n\t\t\"UINT64\":   4,\n\t\t\"DOUBLE\":   5,\n\t\t\"DURATION\": 6,\n\t}\n)\n\nfunc (x TypeKind) Enum() *TypeKind {\n\tp := new(TypeKind)\n\t*p = x\n\treturn p\n}\n\nfunc (x TypeKind) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (TypeKind) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_grpc_federation_federation_proto_enumTypes[0].Descriptor()\n}\n\nfunc (TypeKind) Type() protoreflect.EnumType {\n\treturn &file_grpc_federation_federation_proto_enumTypes[0]\n}\n\nfunc (x TypeKind) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use TypeKind.Descriptor instead.\nfunc (TypeKind) EnumDescriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\n// LogLevel is the importance or severity of a log event.\ntype GRPCError_LogLevel int32\n\nconst (\n\t// UNKNOWN represents unexpected value.\n\tGRPCError_UNKNOWN GRPCError_LogLevel = 0\n\t// DEBUG is used for detailed information that is useful during development and debugging.\n\tGRPCError_DEBUG GRPCError_LogLevel = 1\n\t// INFO logs are used to provide information about the normal functioning of the application.\n\tGRPCError_INFO GRPCError_LogLevel = 2\n\t// WARN signifies a potential problem or warning that does not necessarily stop the program from working but may lead to issues in the future.\n\tGRPCError_WARN GRPCError_LogLevel = 3\n\t// ERROR indicates a serious issue that has caused a failure in the application.\n\tGRPCError_ERROR GRPCError_LogLevel = 4\n)\n\n// Enum value maps for GRPCError_LogLevel.\nvar (\n\tGRPCError_LogLevel_name = map[int32]string{\n\t\t0: \"UNKNOWN\",\n\t\t1: \"DEBUG\",\n\t\t2: \"INFO\",\n\t\t3: \"WARN\",\n\t\t4: \"ERROR\",\n\t}\n\tGRPCError_LogLevel_value = map[string]int32{\n\t\t\"UNKNOWN\": 0,\n\t\t\"DEBUG\":   1,\n\t\t\"INFO\":    2,\n\t\t\"WARN\":    3,\n\t\t\"ERROR\":   4,\n\t}\n)\n\nfunc (x GRPCError_LogLevel) Enum() *GRPCError_LogLevel {\n\tp := new(GRPCError_LogLevel)\n\t*p = x\n\treturn p\n}\n\nfunc (x GRPCError_LogLevel) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (GRPCError_LogLevel) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_grpc_federation_federation_proto_enumTypes[1].Descriptor()\n}\n\nfunc (GRPCError_LogLevel) Type() protoreflect.EnumType {\n\treturn &file_grpc_federation_federation_proto_enumTypes[1]\n}\n\nfunc (x GRPCError_LogLevel) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use GRPCError_LogLevel.Descriptor instead.\nfunc (GRPCError_LogLevel) EnumDescriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{24, 0}\n}\n\ntype FileRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPlugin *CELPlugin `protobuf:\"bytes,1,opt,name=plugin,proto3\" json:\"plugin,omitempty\"`\n\t// import can be used to resolve methods, messages, etc. that are referenced in gRPC Federation rules.\n\tImport []string `protobuf:\"bytes,2,rep,name=import,proto3\" json:\"import,omitempty\"`\n}\n\nfunc (x *FileRule) Reset() {\n\t*x = FileRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *FileRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*FileRule) ProtoMessage() {}\n\nfunc (x *FileRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use FileRule.ProtoReflect.Descriptor instead.\nfunc (*FileRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *FileRule) GetPlugin() *CELPlugin {\n\tif x != nil {\n\t\treturn x.Plugin\n\t}\n\treturn nil\n}\n\nfunc (x *FileRule) GetImport() []string {\n\tif x != nil {\n\t\treturn x.Import\n\t}\n\treturn nil\n}\n\ntype EnumRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// alias mapping between enums defined in other packages and enums defined on the federation service side.\n\t// The alias is the FQDN ( <package-name>.<enum-name> ) to the enum.\n\t// If this definition exists, type conversion is automatically performed before the enum value assignment operation.\n\t// If a enum with this option has a value that is not present in the enum specified by alias, and the alias option is not specified for that value, an error is occurred.\n\t// You can specify multiple aliases. In that case, only values common to all aliases will be considered.\n\t// Specifying a value that is not included in either alias will result in an error.\n\tAlias []string `protobuf:\"bytes,1,rep,name=alias,proto3\" json:\"alias,omitempty\"`\n}\n\nfunc (x *EnumRule) Reset() {\n\t*x = EnumRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumRule) ProtoMessage() {}\n\nfunc (x *EnumRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumRule.ProtoReflect.Descriptor instead.\nfunc (*EnumRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *EnumRule) GetAlias() []string {\n\tif x != nil {\n\t\treturn x.Alias\n\t}\n\treturn nil\n}\n\ntype EnumValueRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// specifies the default value of the enum.\n\t// All values other than those specified in alias will be default values.\n\tDefault *bool `protobuf:\"varint,1,opt,name=default,proto3,oneof\" json:\"default,omitempty\"`\n\t// alias can be used when alias is specified in grpc.federation.enum option,\n\t// and specifies the value name to be referenced among the enums specified in alias of enum option.\n\t// multiple value names can be specified for alias.\n\tAlias []string `protobuf:\"bytes,2,rep,name=alias,proto3\" json:\"alias,omitempty\"`\n\t// attr is used to hold multiple name-value pairs corresponding to an enum value.\n\t// The values specified by the name must be consistently specified for all enum values.\n\t// The values stored using this feature can be retrieved using the `attr()` method of the enum API.\n\tAttr []*EnumValueAttribute `protobuf:\"bytes,3,rep,name=attr,proto3\" json:\"attr,omitempty\"`\n\t// noalias exclude from the target of alias.\n\t// This option cannot be specified simultaneously with `default` or `alias`.\n\tNoalias *bool `protobuf:\"varint,4,opt,name=noalias,proto3,oneof\" json:\"noalias,omitempty\"`\n}\n\nfunc (x *EnumValueRule) Reset() {\n\t*x = EnumValueRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumValueRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumValueRule) ProtoMessage() {}\n\nfunc (x *EnumValueRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumValueRule.ProtoReflect.Descriptor instead.\nfunc (*EnumValueRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *EnumValueRule) GetDefault() bool {\n\tif x != nil && x.Default != nil {\n\t\treturn *x.Default\n\t}\n\treturn false\n}\n\nfunc (x *EnumValueRule) GetAlias() []string {\n\tif x != nil {\n\t\treturn x.Alias\n\t}\n\treturn nil\n}\n\nfunc (x *EnumValueRule) GetAttr() []*EnumValueAttribute {\n\tif x != nil {\n\t\treturn x.Attr\n\t}\n\treturn nil\n}\n\nfunc (x *EnumValueRule) GetNoalias() bool {\n\tif x != nil && x.Noalias != nil {\n\t\treturn *x.Noalias\n\t}\n\treturn false\n}\n\ntype EnumValueAttribute struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the attribute key.\n\t// This value is used to search for values using the `attr(<name>)` method.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// value represents the value corresponding to `name`.\n\tValue string `protobuf:\"bytes,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *EnumValueAttribute) Reset() {\n\t*x = EnumValueAttribute{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumValueAttribute) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumValueAttribute) ProtoMessage() {}\n\nfunc (x *EnumValueAttribute) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumValueAttribute.ProtoReflect.Descriptor instead.\nfunc (*EnumValueAttribute) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *EnumValueAttribute) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnumValueAttribute) GetValue() string {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn \"\"\n}\n\ntype OneofRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *OneofRule) Reset() {\n\t*x = OneofRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *OneofRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*OneofRule) ProtoMessage() {}\n\nfunc (x *OneofRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use OneofRule.ProtoReflect.Descriptor instead.\nfunc (*OneofRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{4}\n}\n\n// ServiceRule define gRPC Federation rules for the service.\ntype ServiceRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// env defines the environment variable.\n\tEnv *Env `protobuf:\"bytes,1,opt,name=env,proto3\" json:\"env,omitempty\"`\n\t// var defines the service-level variables.\n\tVar []*ServiceVariable `protobuf:\"bytes,2,rep,name=var,proto3\" json:\"var,omitempty\"`\n}\n\nfunc (x *ServiceRule) Reset() {\n\t*x = ServiceRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceRule) ProtoMessage() {}\n\nfunc (x *ServiceRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceRule.ProtoReflect.Descriptor instead.\nfunc (*ServiceRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *ServiceRule) GetEnv() *Env {\n\tif x != nil {\n\t\treturn x.Env\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceRule) GetVar() []*ServiceVariable {\n\tif x != nil {\n\t\treturn x.Var\n\t}\n\treturn nil\n}\n\n// Env is used when setting environment variables.\n// There are two ways to configure it.\ntype Env struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// var is used to directly list environment variables.\n\tVar []*EnvVar `protobuf:\"bytes,1,rep,name=var,proto3\" json:\"var,omitempty\"`\n\t// message is used to reference an already defined Protocol Buffers' message for defining environment variables.\n\t// If you want to set detailed options for the fields of the message, use the `env` option in FieldRule.\n\tMessage string `protobuf:\"bytes,2,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Env) Reset() {\n\t*x = Env{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Env) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Env) ProtoMessage() {}\n\nfunc (x *Env) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Env.ProtoReflect.Descriptor instead.\nfunc (*Env) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *Env) GetVar() []*EnvVar {\n\tif x != nil {\n\t\treturn x.Var\n\t}\n\treturn nil\n}\n\nfunc (x *Env) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\n// ServiceVariable define variables at the service level.\n// This definition is executed at server startup, after the initialization of Env.\n// The defined variables can be used across all messages that the service depends on.\ntype ServiceVariable struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is a variable name.\n\t// This name can be referenced in all CELs related to the service by using `grpc.federation.var.` prefix.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// if specify the condition for evaluating expr.\n\t// this value evaluated by CEL and it must return a boolean value.\n\t// If the result of evaluation is `false`, the value assigned to name is the default value of the result of evaluation of `expr`.\n\tIf *string `protobuf:\"bytes,2,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n\t// expr specify the value to be assigned to name.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*ServiceVariable_By\n\t//\t*ServiceVariable_Map\n\t//\t*ServiceVariable_Message\n\t//\t*ServiceVariable_Validation\n\t//\t*ServiceVariable_Enum\n\t//\t*ServiceVariable_Switch\n\tExpr isServiceVariable_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *ServiceVariable) Reset() {\n\t*x = ServiceVariable{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceVariable) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceVariable) ProtoMessage() {}\n\nfunc (x *ServiceVariable) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceVariable.ProtoReflect.Descriptor instead.\nfunc (*ServiceVariable) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{7}\n}\n\nfunc (x *ServiceVariable) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *ServiceVariable) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\nfunc (m *ServiceVariable) GetExpr() isServiceVariable_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetBy() string {\n\tif x, ok := x.GetExpr().(*ServiceVariable_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *ServiceVariable) GetMap() *MapExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetMessage() *MessageExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetValidation() *ServiceVariableValidationExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Validation); ok {\n\t\treturn x.Validation\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetEnum() *EnumExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetSwitch() *SwitchExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Switch); ok {\n\t\treturn x.Switch\n\t}\n\treturn nil\n}\n\ntype isServiceVariable_Expr interface {\n\tisServiceVariable_Expr()\n}\n\ntype ServiceVariable_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\ntype ServiceVariable_Map struct {\n\t// map apply map operation for the specified repeated type.\n\tMap *MapExpr `protobuf:\"bytes,12,opt,name=map,proto3,oneof\"`\n}\n\ntype ServiceVariable_Message struct {\n\t// message gets with message arguments.\n\tMessage *MessageExpr `protobuf:\"bytes,13,opt,name=message,proto3,oneof\"`\n}\n\ntype ServiceVariable_Validation struct {\n\t// validation defines the validation rule and message.\n\tValidation *ServiceVariableValidationExpr `protobuf:\"bytes,14,opt,name=validation,proto3,oneof\"`\n}\n\ntype ServiceVariable_Enum struct {\n\t// enum gets with cel value.\n\tEnum *EnumExpr `protobuf:\"bytes,15,opt,name=enum,proto3,oneof\"`\n}\n\ntype ServiceVariable_Switch struct {\n\t// switch provides conditional evaluation with multiple branches.\n\tSwitch *SwitchExpr `protobuf:\"bytes,16,opt,name=switch,proto3,oneof\"`\n}\n\nfunc (*ServiceVariable_By) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Map) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Message) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Validation) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Enum) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Switch) isServiceVariable_Expr() {}\n\n// ServiceVariableValidationExpr represents validation rule and error message.\ntype ServiceVariableValidationExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// if specifies condition in CEL. If the condition is true, it returns error.\n\t// The return value must always be of type boolean.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3\" json:\"if,omitempty\"`\n\t// message is a error message in CEL.\n\tMessage string `protobuf:\"bytes,2,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *ServiceVariableValidationExpr) Reset() {\n\t*x = ServiceVariableValidationExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceVariableValidationExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceVariableValidationExpr) ProtoMessage() {}\n\nfunc (x *ServiceVariableValidationExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceVariableValidationExpr.ProtoReflect.Descriptor instead.\nfunc (*ServiceVariableValidationExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{8}\n}\n\nfunc (x *ServiceVariableValidationExpr) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *ServiceVariableValidationExpr) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\n// EnvVar represents an environment variable.\ntype EnvVar struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is an environment variable name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// type is an environment variable type.\n\tType *EnvType `protobuf:\"bytes,2,opt,name=type,proto3\" json:\"type,omitempty\"`\n\t// option is an additional option for parsing environment variable.\n\tOption *EnvVarOption `protobuf:\"bytes,3,opt,name=option,proto3,oneof\" json:\"option,omitempty\"`\n}\n\nfunc (x *EnvVar) Reset() {\n\t*x = EnvVar{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvVar) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvVar) ProtoMessage() {}\n\nfunc (x *EnvVar) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvVar.ProtoReflect.Descriptor instead.\nfunc (*EnvVar) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{9}\n}\n\nfunc (x *EnvVar) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnvVar) GetType() *EnvType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nfunc (x *EnvVar) GetOption() *EnvVarOption {\n\tif x != nil {\n\t\treturn x.Option\n\t}\n\treturn nil\n}\n\n// EnvType represents type information for environment variable.\ntype EnvType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to Type:\n\t//\n\t//\t*EnvType_Kind\n\t//\t*EnvType_Repeated\n\t//\t*EnvType_Map\n\tType isEnvType_Type `protobuf_oneof:\"type\"`\n}\n\nfunc (x *EnvType) Reset() {\n\t*x = EnvType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[10]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvType) ProtoMessage() {}\n\nfunc (x *EnvType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[10]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvType.ProtoReflect.Descriptor instead.\nfunc (*EnvType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{10}\n}\n\nfunc (m *EnvType) GetType() isEnvType_Type {\n\tif m != nil {\n\t\treturn m.Type\n\t}\n\treturn nil\n}\n\nfunc (x *EnvType) GetKind() TypeKind {\n\tif x, ok := x.GetType().(*EnvType_Kind); ok {\n\t\treturn x.Kind\n\t}\n\treturn TypeKind_UNKNOWN\n}\n\nfunc (x *EnvType) GetRepeated() *EnvType {\n\tif x, ok := x.GetType().(*EnvType_Repeated); ok {\n\t\treturn x.Repeated\n\t}\n\treturn nil\n}\n\nfunc (x *EnvType) GetMap() *EnvMapType {\n\tif x, ok := x.GetType().(*EnvType_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\ntype isEnvType_Type interface {\n\tisEnvType_Type()\n}\n\ntype EnvType_Kind struct {\n\t// kind is used when the type is a primitive type.\n\tKind TypeKind `protobuf:\"varint,1,opt,name=kind,proto3,enum=grpc.federation.TypeKind,oneof\"`\n}\n\ntype EnvType_Repeated struct {\n\t// repeated is used when the type is a repeated type.\n\tRepeated *EnvType `protobuf:\"bytes,2,opt,name=repeated,proto3,oneof\"`\n}\n\ntype EnvType_Map struct {\n\t// map is used when the type is a map type.\n\tMap *EnvMapType `protobuf:\"bytes,3,opt,name=map,proto3,oneof\"`\n}\n\nfunc (*EnvType_Kind) isEnvType_Type() {}\n\nfunc (*EnvType_Repeated) isEnvType_Type() {}\n\nfunc (*EnvType_Map) isEnvType_Type() {}\n\n// EnvMapType represents map type.\ntype EnvMapType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// key represents map's key type.\n\tKey *EnvType `protobuf:\"bytes,1,opt,name=key,proto3\" json:\"key,omitempty\"`\n\t// value represents map's value type.\n\tValue *EnvType `protobuf:\"bytes,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *EnvMapType) Reset() {\n\t*x = EnvMapType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[11]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvMapType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvMapType) ProtoMessage() {}\n\nfunc (x *EnvMapType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[11]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvMapType.ProtoReflect.Descriptor instead.\nfunc (*EnvMapType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{11}\n}\n\nfunc (x *EnvMapType) GetKey() *EnvType {\n\tif x != nil {\n\t\treturn x.Key\n\t}\n\treturn nil\n}\n\nfunc (x *EnvMapType) GetValue() *EnvType {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn nil\n}\n\n// EnvVarOption represents additional option for environment variable.\n// The option work with the `envconfig` library in Go language.\n// For detailed specifications, please refer to the library's documentation ( https://pkg.go.dev/github.com/kelseyhightower/envconfig#section-readme ).\ntype EnvVarOption struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// alternate use this option if you want to use an environment variable with a different name than the value specified in `EnvVar.name`.\n\tAlternate *string `protobuf:\"bytes,1,opt,name=alternate,proto3,oneof\" json:\"alternate,omitempty\"`\n\t// default specify the value to use as a fallback if the specified environment variable is not found.\n\tDefault *string `protobuf:\"bytes,2,opt,name=default,proto3,oneof\" json:\"default,omitempty\"`\n\t// required require the environment variable to exist.\n\t// If it does not exist, an error will occur at startup.\n\tRequired *bool `protobuf:\"varint,3,opt,name=required,proto3,oneof\" json:\"required,omitempty\"`\n\t// ignored if ignored is true, it does nothing even if the environment variable exists.\n\tIgnored *bool `protobuf:\"varint,4,opt,name=ignored,proto3,oneof\" json:\"ignored,omitempty\"`\n}\n\nfunc (x *EnvVarOption) Reset() {\n\t*x = EnvVarOption{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[12]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvVarOption) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvVarOption) ProtoMessage() {}\n\nfunc (x *EnvVarOption) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[12]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvVarOption.ProtoReflect.Descriptor instead.\nfunc (*EnvVarOption) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{12}\n}\n\nfunc (x *EnvVarOption) GetAlternate() string {\n\tif x != nil && x.Alternate != nil {\n\t\treturn *x.Alternate\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnvVarOption) GetDefault() string {\n\tif x != nil && x.Default != nil {\n\t\treturn *x.Default\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnvVarOption) GetRequired() bool {\n\tif x != nil && x.Required != nil {\n\t\treturn *x.Required\n\t}\n\treturn false\n}\n\nfunc (x *EnvVarOption) GetIgnored() bool {\n\tif x != nil && x.Ignored != nil {\n\t\treturn *x.Ignored\n\t}\n\treturn false\n}\n\ntype MethodRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// the time to timeout. If the specified time period elapses, DEADLINE_EXCEEDED status is returned.\n\t// If you want to handle this error, you need to implement a custom error handler in Go.\n\t// The format is the same as Go's time.Duration format. See https://pkg.go.dev/time#ParseDuration.\n\tTimeout *string `protobuf:\"bytes,1,opt,name=timeout,proto3,oneof\" json:\"timeout,omitempty\"`\n\t// response specify the name of the message you want to use to create the response value.\n\t// If you specify a reserved type like `google.protobuf.Empty` as the response, you cannot define gRPC Federation options.\n\t// In such cases, you can specify a separate message to create the response value.\n\t// The specified response message must contain fields with the same names and types as all the fields in the original response.\n\tResponse *string `protobuf:\"bytes,2,opt,name=response,proto3,oneof\" json:\"response,omitempty\"`\n}\n\nfunc (x *MethodRule) Reset() {\n\t*x = MethodRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[13]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MethodRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MethodRule) ProtoMessage() {}\n\nfunc (x *MethodRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[13]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MethodRule.ProtoReflect.Descriptor instead.\nfunc (*MethodRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{13}\n}\n\nfunc (x *MethodRule) GetTimeout() string {\n\tif x != nil && x.Timeout != nil {\n\t\treturn *x.Timeout\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodRule) GetResponse() string {\n\tif x != nil && x.Response != nil {\n\t\treturn *x.Response\n\t}\n\treturn \"\"\n}\n\n// MessageRule define gRPC Federation rules for the message.\ntype MessageRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// def specify variables to be used in field binding by `grpc.federation.field` option.\n\tDef []*VariableDefinition `protobuf:\"bytes,1,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// if custom_resolver is true, the resolver for this message is implemented by Go.\n\t// If there are any values retrieved by resolver or messages, they are passed as arguments for custom resolver.\n\t// Each field of the message returned by the custom resolver is automatically bound.\n\t// If you want to change the binding process for a particular field, set `custom_resolver=true` option for that field.\n\tCustomResolver *bool `protobuf:\"varint,2,opt,name=custom_resolver,json=customResolver,proto3,oneof\" json:\"custom_resolver,omitempty\"`\n\t// alias mapping between messages defined in other packages and messages defined on the federation service side.\n\t// The alias is the FQDN ( <package-name>.<message-name> ) to the message.\n\t// If this definition exists, type conversion is automatically performed before the field assignment operation.\n\t// If a message with this option has a field that is not present in the message specified by alias, and the alias option is not specified for that field, an error is occurred.\n\t// You can specify multiple aliases. In that case, only fields common to all aliases will be considered.\n\t// Specifying a field that is not included in either alias will result in an error.\n\tAlias []string `protobuf:\"bytes,3,rep,name=alias,proto3\" json:\"alias,omitempty\"`\n}\n\nfunc (x *MessageRule) Reset() {\n\t*x = MessageRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[14]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MessageRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MessageRule) ProtoMessage() {}\n\nfunc (x *MessageRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[14]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MessageRule.ProtoReflect.Descriptor instead.\nfunc (*MessageRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{14}\n}\n\nfunc (x *MessageRule) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *MessageRule) GetCustomResolver() bool {\n\tif x != nil && x.CustomResolver != nil {\n\t\treturn *x.CustomResolver\n\t}\n\treturn false\n}\n\nfunc (x *MessageRule) GetAlias() []string {\n\tif x != nil {\n\t\treturn x.Alias\n\t}\n\treturn nil\n}\n\n// VariableDefinition represents variable definition.\ntype VariableDefinition struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is a variable name.\n\t// This name can be referenced in all CELs defined after itself in the same message.\n\t// It can also be referenced in `grpc.federation.field` option.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// if specify the condition for evaluating expr.\n\t// this value evaluated by CEL and it must return a boolean value.\n\t// If the result of evaluation is `false`, the value assigned to name is the default value of the result of evaluation of `expr`.\n\tIf *string `protobuf:\"bytes,2,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n\t// autobind if the result value of `expr` is a message type,\n\t// the value of a field with the same name and type as the field name of its own message is automatically assigned to the value of the field in the message.\n\t// If multiple autobinds are used at the same message,\n\t// you must explicitly use the `grpc.federation.field` option to do the binding yourself, since duplicate field names cannot be correctly determined as one.\n\tAutobind *bool `protobuf:\"varint,3,opt,name=autobind,proto3,oneof\" json:\"autobind,omitempty\"`\n\t// expr specify the value to be assigned to name.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*VariableDefinition_By\n\t//\t*VariableDefinition_Map\n\t//\t*VariableDefinition_Message\n\t//\t*VariableDefinition_Call\n\t//\t*VariableDefinition_Validation\n\t//\t*VariableDefinition_Enum\n\t//\t*VariableDefinition_Switch\n\tExpr isVariableDefinition_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *VariableDefinition) Reset() {\n\t*x = VariableDefinition{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[15]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *VariableDefinition) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*VariableDefinition) ProtoMessage() {}\n\nfunc (x *VariableDefinition) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[15]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use VariableDefinition.ProtoReflect.Descriptor instead.\nfunc (*VariableDefinition) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{15}\n}\n\nfunc (x *VariableDefinition) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *VariableDefinition) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *VariableDefinition) GetAutobind() bool {\n\tif x != nil && x.Autobind != nil {\n\t\treturn *x.Autobind\n\t}\n\treturn false\n}\n\nfunc (m *VariableDefinition) GetExpr() isVariableDefinition_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetBy() string {\n\tif x, ok := x.GetExpr().(*VariableDefinition_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *VariableDefinition) GetMap() *MapExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetMessage() *MessageExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetCall() *CallExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Call); ok {\n\t\treturn x.Call\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetValidation() *ValidationExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Validation); ok {\n\t\treturn x.Validation\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetEnum() *EnumExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetSwitch() *SwitchExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Switch); ok {\n\t\treturn x.Switch\n\t}\n\treturn nil\n}\n\ntype isVariableDefinition_Expr interface {\n\tisVariableDefinition_Expr()\n}\n\ntype VariableDefinition_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\ntype VariableDefinition_Map struct {\n\t// map apply map operation for the specified repeated type.\n\tMap *MapExpr `protobuf:\"bytes,12,opt,name=map,proto3,oneof\"`\n}\n\ntype VariableDefinition_Message struct {\n\t// message gets with message arguments.\n\tMessage *MessageExpr `protobuf:\"bytes,13,opt,name=message,proto3,oneof\"`\n}\n\ntype VariableDefinition_Call struct {\n\t// call specifies how to call gRPC method.\n\tCall *CallExpr `protobuf:\"bytes,14,opt,name=call,proto3,oneof\"`\n}\n\ntype VariableDefinition_Validation struct {\n\t// validation defines the validation rule and error.\n\tValidation *ValidationExpr `protobuf:\"bytes,15,opt,name=validation,proto3,oneof\"`\n}\n\ntype VariableDefinition_Enum struct {\n\t// enum gets with cel value.\n\tEnum *EnumExpr `protobuf:\"bytes,16,opt,name=enum,proto3,oneof\"`\n}\n\ntype VariableDefinition_Switch struct {\n\t// switch provides conditional evaluation with multiple branches.\n\tSwitch *SwitchExpr `protobuf:\"bytes,17,opt,name=switch,proto3,oneof\"`\n}\n\nfunc (*VariableDefinition_By) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Map) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Message) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Call) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Validation) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Enum) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Switch) isVariableDefinition_Expr() {}\n\n// MapExpr apply map operation for the specified repeated type.\ntype MapExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// iterator define iterator variable.\n\t// When evaluating CEL in `expr`, we can refer to the name defined in iterator.\n\tIterator *Iterator `protobuf:\"bytes,1,opt,name=iterator,proto3\" json:\"iterator,omitempty\"`\n\t// expr creates map elements using iterator variable.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*MapExpr_By\n\t//\t*MapExpr_Message\n\t//\t*MapExpr_Enum\n\tExpr isMapExpr_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *MapExpr) Reset() {\n\t*x = MapExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[16]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MapExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MapExpr) ProtoMessage() {}\n\nfunc (x *MapExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[16]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MapExpr.ProtoReflect.Descriptor instead.\nfunc (*MapExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{16}\n}\n\nfunc (x *MapExpr) GetIterator() *Iterator {\n\tif x != nil {\n\t\treturn x.Iterator\n\t}\n\treturn nil\n}\n\nfunc (m *MapExpr) GetExpr() isMapExpr_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *MapExpr) GetBy() string {\n\tif x, ok := x.GetExpr().(*MapExpr_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *MapExpr) GetMessage() *MessageExpr {\n\tif x, ok := x.GetExpr().(*MapExpr_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *MapExpr) GetEnum() *EnumExpr {\n\tif x, ok := x.GetExpr().(*MapExpr_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn nil\n}\n\ntype isMapExpr_Expr interface {\n\tisMapExpr_Expr()\n}\n\ntype MapExpr_By struct {\n\t// `by` evaluates with CEL.\n\t// this can refer to the variable declared by `iterator`.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\ntype MapExpr_Message struct {\n\t// message gets with message arguments, and it is made an element of the map.\n\t// The result type of MapExpr is the repeated type of the specified message.\n\tMessage *MessageExpr `protobuf:\"bytes,12,opt,name=message,proto3,oneof\"`\n}\n\ntype MapExpr_Enum struct {\n\t// enum creates enum value for each element of the map.\n\t// The result type of MapExpr is the repeated type of the specified enum.\n\tEnum *EnumExpr `protobuf:\"bytes,13,opt,name=enum,proto3,oneof\"`\n}\n\nfunc (*MapExpr_By) isMapExpr_Expr() {}\n\nfunc (*MapExpr_Message) isMapExpr_Expr() {}\n\nfunc (*MapExpr_Enum) isMapExpr_Expr() {}\n\n// Iterator represents iterator variable.\ntype Iterator struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// variable name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// src the value that will be the source for creating the iterator.\n\t// src must be a repeated type.\n\tSrc string `protobuf:\"bytes,2,opt,name=src,proto3\" json:\"src,omitempty\"`\n}\n\nfunc (x *Iterator) Reset() {\n\t*x = Iterator{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[17]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Iterator) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Iterator) ProtoMessage() {}\n\nfunc (x *Iterator) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[17]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Iterator.ProtoReflect.Descriptor instead.\nfunc (*Iterator) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{17}\n}\n\nfunc (x *Iterator) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Iterator) GetSrc() string {\n\tif x != nil {\n\t\treturn x.Src\n\t}\n\treturn \"\"\n}\n\n// MessageExpr represents dependent message.\ntype MessageExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name specify the message name by FQDN. format is `<package-name>.<message-name>`.\n\t// <package-name> can be omitted when referring to messages in the same package.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// args specify the parameters needed to get the message. This is called the \"message arguments\".\n\tArgs []*Argument `protobuf:\"bytes,2,rep,name=args,proto3\" json:\"args,omitempty\"`\n}\n\nfunc (x *MessageExpr) Reset() {\n\t*x = MessageExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[18]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MessageExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MessageExpr) ProtoMessage() {}\n\nfunc (x *MessageExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[18]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MessageExpr.ProtoReflect.Descriptor instead.\nfunc (*MessageExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{18}\n}\n\nfunc (x *MessageExpr) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *MessageExpr) GetArgs() []*Argument {\n\tif x != nil {\n\t\treturn x.Args\n\t}\n\treturn nil\n}\n\n// EnumExpr represents dependent enum.\ntype EnumExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name specify the enum name by FQDN. format is `<package-name>.<enum-name>`.\n\t// <package-name> can be omitted when referring to enum in the same package.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,2,opt,name=by,proto3\" json:\"by,omitempty\"`\n}\n\nfunc (x *EnumExpr) Reset() {\n\t*x = EnumExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[19]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumExpr) ProtoMessage() {}\n\nfunc (x *EnumExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[19]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumExpr.ProtoReflect.Descriptor instead.\nfunc (*EnumExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{19}\n}\n\nfunc (x *EnumExpr) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnumExpr) GetBy() string {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\n// CallExpr represents how to call gRPC method.\ntype CallExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// method specify the FQDN for the gRPC method. format is `<package-name>.<service-name>/<method-name>`.\n\tMethod string `protobuf:\"bytes,1,opt,name=method,proto3\" json:\"method,omitempty\"`\n\t// request specify request parameters for the gRPC method.\n\tRequest []*MethodRequest `protobuf:\"bytes,2,rep,name=request,proto3\" json:\"request,omitempty\"`\n\t// the time to timeout. If the specified time period elapses, DEADLINE_EXCEEDED status is returned.\n\t// If you want to handle this error, you need to implement a custom error handler in Go.\n\t// The format is the same as Go's time.Duration format. See https://pkg.go.dev/time#ParseDuration.\n\tTimeout *string `protobuf:\"bytes,3,opt,name=timeout,proto3,oneof\" json:\"timeout,omitempty\"`\n\t// retry specifies the retry policy if the method call fails.\n\tRetry *RetryPolicy `protobuf:\"bytes,4,opt,name=retry,proto3,oneof\" json:\"retry,omitempty\"`\n\t// error evaluated when an error occurs during a method call.\n\t// Multiple errors can be defined and are evaluated in the order in which they are described.\n\t// If an error occurs while creating an gRPC status error, original error will be returned.\n\tError []*GRPCError `protobuf:\"bytes,5,rep,name=error,proto3\" json:\"error,omitempty\"`\n\t// option is the gRPC's call option (https://pkg.go.dev/google.golang.org/grpc#CallOption).\n\tOption *GRPCCallOption `protobuf:\"bytes,6,opt,name=option,proto3,oneof\" json:\"option,omitempty\"`\n\t// metadata specify outgoing metadata with CEL value.\n\t// The specified type must always be of type map<string, repeated string>.\n\tMetadata *string `protobuf:\"bytes,7,opt,name=metadata,proto3,oneof\" json:\"metadata,omitempty\"`\n}\n\nfunc (x *CallExpr) Reset() {\n\t*x = CallExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[20]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CallExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CallExpr) ProtoMessage() {}\n\nfunc (x *CallExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[20]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CallExpr.ProtoReflect.Descriptor instead.\nfunc (*CallExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{20}\n}\n\nfunc (x *CallExpr) GetMethod() string {\n\tif x != nil {\n\t\treturn x.Method\n\t}\n\treturn \"\"\n}\n\nfunc (x *CallExpr) GetRequest() []*MethodRequest {\n\tif x != nil {\n\t\treturn x.Request\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetTimeout() string {\n\tif x != nil && x.Timeout != nil {\n\t\treturn *x.Timeout\n\t}\n\treturn \"\"\n}\n\nfunc (x *CallExpr) GetRetry() *RetryPolicy {\n\tif x != nil {\n\t\treturn x.Retry\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetError() []*GRPCError {\n\tif x != nil {\n\t\treturn x.Error\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetOption() *GRPCCallOption {\n\tif x != nil {\n\t\treturn x.Option\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetMetadata() string {\n\tif x != nil && x.Metadata != nil {\n\t\treturn *x.Metadata\n\t}\n\treturn \"\"\n}\n\n// SwitchExpr represents a switch statement. At least one \"case\", and \"default\", must be defined. All\n// case.if expressions must evaluate to a boolean value. All case.by expressions, and default.by, must\n// evaluate to the same type (the return type of the switch).\n//\n// When executed, the case.if expressions are evaluated in order, and, for the first case whose\n// case.if expression evaluates to true, its case.by is evaluated to make the return value of the\n// SwitchExpr.\n// If no case.if evaluates to true, default.by is evaluated to make the return value.\ntype SwitchExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Cases for the switch expression.\n\tCase []*SwitchCaseExpr `protobuf:\"bytes,1,rep,name=case,proto3\" json:\"case,omitempty\"`\n\t// The default case, if none of the \"case.if\" expressions evaluate to true.\n\tDefault *SwitchDefaultExpr `protobuf:\"bytes,2,opt,name=default,proto3\" json:\"default,omitempty\"`\n}\n\nfunc (x *SwitchExpr) Reset() {\n\t*x = SwitchExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[21]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SwitchExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SwitchExpr) ProtoMessage() {}\n\nfunc (x *SwitchExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[21]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SwitchExpr.ProtoReflect.Descriptor instead.\nfunc (*SwitchExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{21}\n}\n\nfunc (x *SwitchExpr) GetCase() []*SwitchCaseExpr {\n\tif x != nil {\n\t\treturn x.Case\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchExpr) GetDefault() *SwitchDefaultExpr {\n\tif x != nil {\n\t\treturn x.Default\n\t}\n\treturn nil\n}\n\n// SwitchCaseExpr represents a single case for a switch expression.\ntype SwitchCaseExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// if specify the condition for evaluating expr.\n\t// this value evaluated by CEL and it must return a boolean value.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3\" json:\"if,omitempty\"`\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,2,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// expr specify the value to return for the case.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*SwitchCaseExpr_By\n\tExpr isSwitchCaseExpr_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *SwitchCaseExpr) Reset() {\n\t*x = SwitchCaseExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[22]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SwitchCaseExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SwitchCaseExpr) ProtoMessage() {}\n\nfunc (x *SwitchCaseExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[22]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SwitchCaseExpr.ProtoReflect.Descriptor instead.\nfunc (*SwitchCaseExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{22}\n}\n\nfunc (x *SwitchCaseExpr) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *SwitchCaseExpr) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (m *SwitchCaseExpr) GetExpr() isSwitchCaseExpr_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchCaseExpr) GetBy() string {\n\tif x, ok := x.GetExpr().(*SwitchCaseExpr_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\ntype isSwitchCaseExpr_Expr interface {\n\tisSwitchCaseExpr_Expr()\n}\n\ntype SwitchCaseExpr_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\nfunc (*SwitchCaseExpr_By) isSwitchCaseExpr_Expr() {}\n\n// SwitchDefaultExpr represents the default case for a switch expression.\ntype SwitchDefaultExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,1,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// expr specify the value to return for the default case.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*SwitchDefaultExpr_By\n\tExpr isSwitchDefaultExpr_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *SwitchDefaultExpr) Reset() {\n\t*x = SwitchDefaultExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[23]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SwitchDefaultExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SwitchDefaultExpr) ProtoMessage() {}\n\nfunc (x *SwitchDefaultExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[23]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SwitchDefaultExpr.ProtoReflect.Descriptor instead.\nfunc (*SwitchDefaultExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{23}\n}\n\nfunc (x *SwitchDefaultExpr) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (m *SwitchDefaultExpr) GetExpr() isSwitchDefaultExpr_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchDefaultExpr) GetBy() string {\n\tif x, ok := x.GetExpr().(*SwitchDefaultExpr_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\ntype isSwitchDefaultExpr_Expr interface {\n\tisSwitchDefaultExpr_Expr()\n}\n\ntype SwitchDefaultExpr_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\nfunc (*SwitchDefaultExpr_By) isSwitchDefaultExpr_Expr() {}\n\n// GRPCError create gRPC status value.\ntype GRPCError struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,1,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// if specifies condition in CEL. If the condition is true, it returns defined error information.\n\t// If this field is omitted, it is always treated as 'true' and returns defined error information.\n\t// The return value must always be of type boolean.\n\tIf *string `protobuf:\"bytes,2,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n\t// code is a gRPC status code.\n\tCode *code.Code `protobuf:\"varint,3,opt,name=code,proto3,enum=google.rpc.Code,oneof\" json:\"code,omitempty\"`\n\t// message is a gRPC status message.\n\t// If omitted, the message will be auto-generated from the configurations.\n\tMessage *string `protobuf:\"bytes,4,opt,name=message,proto3,oneof\" json:\"message,omitempty\"`\n\t// details is a list of error details.\n\t// If returns error, the corresponding error details are set.\n\tDetails []*GRPCErrorDetail `protobuf:\"bytes,5,rep,name=details,proto3\" json:\"details,omitempty\"`\n\t// ignore ignore the error if the condition in the \"if\" field is true and \"ignore\" field is set to true.\n\t// When an error is ignored, the returned response is always null value.\n\t// If you want to return a response that is not null, please use `ignore_and_response` feature.\n\t// Therefore, `ignore` and `ignore_and_response` cannot be specified same.\n\tIgnore *bool `protobuf:\"varint,6,opt,name=ignore,proto3,oneof\" json:\"ignore,omitempty\"`\n\t// ignore_and_response ignore the error if the condition in the \"if\" field is true and it returns response specified in CEL.\n\t// The evaluation value of CEL must always be the same as the response message type.\n\t// `ignore` and `ignore_and_response` cannot be specified same.\n\tIgnoreAndResponse *string `protobuf:\"bytes,7,opt,name=ignore_and_response,json=ignoreAndResponse,proto3,oneof\" json:\"ignore_and_response,omitempty\"`\n\t// log_level can be configured to output logs as any log level.\n\t// If DEBUG is specified for the log_level, logs are output as debug logs.\n\t// default value is ERROR.\n\tLogLevel *GRPCError_LogLevel `protobuf:\"varint,8,opt,name=log_level,json=logLevel,proto3,enum=grpc.federation.GRPCError_LogLevel,oneof\" json:\"log_level,omitempty\"`\n}\n\nfunc (x *GRPCError) Reset() {\n\t*x = GRPCError{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[24]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GRPCError) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GRPCError) ProtoMessage() {}\n\nfunc (x *GRPCError) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[24]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GRPCError.ProtoReflect.Descriptor instead.\nfunc (*GRPCError) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{24}\n}\n\nfunc (x *GRPCError) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCError) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCError) GetCode() code.Code {\n\tif x != nil && x.Code != nil {\n\t\treturn *x.Code\n\t}\n\treturn code.Code(0)\n}\n\nfunc (x *GRPCError) GetMessage() string {\n\tif x != nil && x.Message != nil {\n\t\treturn *x.Message\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCError) GetDetails() []*GRPCErrorDetail {\n\tif x != nil {\n\t\treturn x.Details\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCError) GetIgnore() bool {\n\tif x != nil && x.Ignore != nil {\n\t\treturn *x.Ignore\n\t}\n\treturn false\n}\n\nfunc (x *GRPCError) GetIgnoreAndResponse() string {\n\tif x != nil && x.IgnoreAndResponse != nil {\n\t\treturn *x.IgnoreAndResponse\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCError) GetLogLevel() GRPCError_LogLevel {\n\tif x != nil && x.LogLevel != nil {\n\t\treturn *x.LogLevel\n\t}\n\treturn GRPCError_UNKNOWN\n}\n\ntype GRPCErrorDetail struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// if specifies condition rule in CEL. If the condition is true, gRPC error detail is added to the error.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3\" json:\"if,omitempty\"`\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,2,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// message represents arbitrary messages to describe the detail of the error.\n\tMessage []*MessageExpr `protobuf:\"bytes,3,rep,name=message,proto3\" json:\"message,omitempty\"`\n\t// error_info describes the cause of the error with structured details.\n\tErrorInfo []*errdetails.ErrorInfo `protobuf:\"bytes,4,rep,name=error_info,json=errorInfo,proto3\" json:\"error_info,omitempty\"`\n\t// retry_info describes when the clients can retry a failed request.\n\tRetryInfo []*errdetails.RetryInfo `protobuf:\"bytes,5,rep,name=retry_info,json=retryInfo,proto3\" json:\"retry_info,omitempty\"`\n\t// debug_info describes additional debugging info.\n\tDebugInfo []*errdetails.DebugInfo `protobuf:\"bytes,6,rep,name=debug_info,json=debugInfo,proto3\" json:\"debug_info,omitempty\"`\n\t// quota_failure describes how a quota check failed.\n\tQuotaFailure []*errdetails.QuotaFailure `protobuf:\"bytes,7,rep,name=quota_failure,json=quotaFailure,proto3\" json:\"quota_failure,omitempty\"`\n\t// precondition_failure describes what preconditions have failed.\n\tPreconditionFailure []*errdetails.PreconditionFailure `protobuf:\"bytes,8,rep,name=precondition_failure,json=preconditionFailure,proto3\" json:\"precondition_failure,omitempty\"`\n\t// bad_request describes violations in a client request.\n\tBadRequest []*errdetails.BadRequest `protobuf:\"bytes,9,rep,name=bad_request,json=badRequest,proto3\" json:\"bad_request,omitempty\"`\n\t// request_info contains metadata about the request that clients can attach.\n\tRequestInfo []*errdetails.RequestInfo `protobuf:\"bytes,10,rep,name=request_info,json=requestInfo,proto3\" json:\"request_info,omitempty\"`\n\t// resource_info describes the resource that is being accessed.\n\tResourceInfo []*errdetails.ResourceInfo `protobuf:\"bytes,11,rep,name=resource_info,json=resourceInfo,proto3\" json:\"resource_info,omitempty\"`\n\t// help provides links to documentation or for performing an out of band action.\n\tHelp []*errdetails.Help `protobuf:\"bytes,12,rep,name=help,proto3\" json:\"help,omitempty\"`\n\t// localized_message provides a localized error message that is safe to return to the user.\n\tLocalizedMessage []*errdetails.LocalizedMessage `protobuf:\"bytes,13,rep,name=localized_message,json=localizedMessage,proto3\" json:\"localized_message,omitempty\"`\n\t// by specify a message in CEL to express the details of the error.\n\tBy []string `protobuf:\"bytes,14,rep,name=by,proto3\" json:\"by,omitempty\"`\n}\n\nfunc (x *GRPCErrorDetail) Reset() {\n\t*x = GRPCErrorDetail{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[25]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GRPCErrorDetail) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GRPCErrorDetail) ProtoMessage() {}\n\nfunc (x *GRPCErrorDetail) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[25]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GRPCErrorDetail.ProtoReflect.Descriptor instead.\nfunc (*GRPCErrorDetail) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{25}\n}\n\nfunc (x *GRPCErrorDetail) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCErrorDetail) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetMessage() []*MessageExpr {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetErrorInfo() []*errdetails.ErrorInfo {\n\tif x != nil {\n\t\treturn x.ErrorInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetRetryInfo() []*errdetails.RetryInfo {\n\tif x != nil {\n\t\treturn x.RetryInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetDebugInfo() []*errdetails.DebugInfo {\n\tif x != nil {\n\t\treturn x.DebugInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetQuotaFailure() []*errdetails.QuotaFailure {\n\tif x != nil {\n\t\treturn x.QuotaFailure\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetPreconditionFailure() []*errdetails.PreconditionFailure {\n\tif x != nil {\n\t\treturn x.PreconditionFailure\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetBadRequest() []*errdetails.BadRequest {\n\tif x != nil {\n\t\treturn x.BadRequest\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetRequestInfo() []*errdetails.RequestInfo {\n\tif x != nil {\n\t\treturn x.RequestInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetResourceInfo() []*errdetails.ResourceInfo {\n\tif x != nil {\n\t\treturn x.ResourceInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetHelp() []*errdetails.Help {\n\tif x != nil {\n\t\treturn x.Help\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetLocalizedMessage() []*errdetails.LocalizedMessage {\n\tif x != nil {\n\t\treturn x.LocalizedMessage\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetBy() []string {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn nil\n}\n\n// GRPCCallOption configures a gRPC Call before it starts or extracts information from a gRPC Call after it completes.\ntype GRPCCallOption struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// set the content-subtype. For example, if content-subtype is \"json\", the Content-Type over the wire will be \"application/grpc+json\".\n\t// The content-subtype is converted to lowercase before being included in Content-Type.\n\t// See Content-Type on https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests for more details.\n\t// If no such codec is found, the call will result in an error with code INTERNAL.\n\tContentSubtype *string `protobuf:\"bytes,1,opt,name=content_subtype,json=contentSubtype,proto3,oneof\" json:\"content_subtype,omitempty\"`\n\t// header retrieves the header metadata for a unary RPC.\n\t// In order to obtain the metadata, you must specify a variable of type map<string, repeated string> in the header.\n\t// e.g.)\n\t// def [\n\t//\n\t//\t{ name: \"hdr\" by: \"grpc.federation.metadata.new()\" }\n\t//\t{ call { method: \"pkg.Method\" option { header: \"hdr\" } } }\n\t//\n\t// ]\n\tHeader *string `protobuf:\"bytes,2,opt,name=header,proto3,oneof\" json:\"header,omitempty\"`\n\t// max_call_recv_msg_size sets the maximum message size in bytes the client can receive.\n\t// If this is not set, gRPC uses the default 4MB.\n\tMaxCallRecvMsgSize *int64 `protobuf:\"varint,3,opt,name=max_call_recv_msg_size,json=maxCallRecvMsgSize,proto3,oneof\" json:\"max_call_recv_msg_size,omitempty\"`\n\t// max_call_send_msg_size sets the maximum message size in bytes the client can send.\n\t// If this is not set, gRPC uses the default maximum number of int32 range.\n\tMaxCallSendMsgSize *int64 `protobuf:\"varint,4,opt,name=max_call_send_msg_size,json=maxCallSendMsgSize,proto3,oneof\" json:\"max_call_send_msg_size,omitempty\"`\n\t// static_method specifies that a call is being made to a method that is static,\n\t// which means the method is known at compile time and doesn't change at runtime.\n\t// This can be used as a signal to stats plugins that this method is safe to include as a key to a measurement.\n\tStaticMethod *bool `protobuf:\"varint,5,opt,name=static_method,json=staticMethod,proto3,oneof\" json:\"static_method,omitempty\"`\n\t// trailer retrieves the trailer metadata for a unary RPC.\n\t// In order to obtain the metadata, you must specify a variable of type map<string, repeated string> in the trailer.\n\t// e.g.)\n\t// def [\n\t//\n\t//\t{ name: \"trl\" by: \"grpc.federation.metadata.new()\" }\n\t//\t{ call { method: \"pkg.Method\" option { trailer: \"trl\" } } }\n\t//\n\t// ]\n\tTrailer *string `protobuf:\"bytes,6,opt,name=trailer,proto3,oneof\" json:\"trailer,omitempty\"`\n\t// wait_for_ready configures the RPC's behavior when the client is in TRANSIENT_FAILURE,\n\t// which occurs when all addresses fail to connect.\n\t// If wait_for_ready is false, the RPC will fail immediately.\n\t// Otherwise, the client will wait until a connection becomes available or the RPC's deadline is reached.\n\t// By default, RPCs do not \"wait for ready\".\n\tWaitForReady *bool `protobuf:\"varint,7,opt,name=wait_for_ready,json=waitForReady,proto3,oneof\" json:\"wait_for_ready,omitempty\"`\n}\n\nfunc (x *GRPCCallOption) Reset() {\n\t*x = GRPCCallOption{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[26]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GRPCCallOption) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GRPCCallOption) ProtoMessage() {}\n\nfunc (x *GRPCCallOption) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[26]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GRPCCallOption.ProtoReflect.Descriptor instead.\nfunc (*GRPCCallOption) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{26}\n}\n\nfunc (x *GRPCCallOption) GetContentSubtype() string {\n\tif x != nil && x.ContentSubtype != nil {\n\t\treturn *x.ContentSubtype\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCCallOption) GetHeader() string {\n\tif x != nil && x.Header != nil {\n\t\treturn *x.Header\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCCallOption) GetMaxCallRecvMsgSize() int64 {\n\tif x != nil && x.MaxCallRecvMsgSize != nil {\n\t\treturn *x.MaxCallRecvMsgSize\n\t}\n\treturn 0\n}\n\nfunc (x *GRPCCallOption) GetMaxCallSendMsgSize() int64 {\n\tif x != nil && x.MaxCallSendMsgSize != nil {\n\t\treturn *x.MaxCallSendMsgSize\n\t}\n\treturn 0\n}\n\nfunc (x *GRPCCallOption) GetStaticMethod() bool {\n\tif x != nil && x.StaticMethod != nil {\n\t\treturn *x.StaticMethod\n\t}\n\treturn false\n}\n\nfunc (x *GRPCCallOption) GetTrailer() string {\n\tif x != nil && x.Trailer != nil {\n\t\treturn *x.Trailer\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCCallOption) GetWaitForReady() bool {\n\tif x != nil && x.WaitForReady != nil {\n\t\treturn *x.WaitForReady\n\t}\n\treturn false\n}\n\n// Validation represents a validation rule against variables defined within the current scope.\ntype ValidationExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is a unique name for the validation.\n\t// If set, the validation error type will be <message-name><name>Error.\n\t// If omitted, the validation error type will be ValidationError.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// error defines the actual validation rules and an error to returned if the validation fails.\n\tError *GRPCError `protobuf:\"bytes,2,opt,name=error,proto3\" json:\"error,omitempty\"`\n}\n\nfunc (x *ValidationExpr) Reset() {\n\t*x = ValidationExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[27]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ValidationExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ValidationExpr) ProtoMessage() {}\n\nfunc (x *ValidationExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[27]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ValidationExpr.ProtoReflect.Descriptor instead.\nfunc (*ValidationExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{27}\n}\n\nfunc (x *ValidationExpr) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *ValidationExpr) GetError() *GRPCError {\n\tif x != nil {\n\t\treturn x.Error\n\t}\n\treturn nil\n}\n\n// RetryPolicy define the retry policy if the method call fails.\ntype RetryPolicy struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to Policy:\n\t//\n\t//\t*RetryPolicy_Constant\n\t//\t*RetryPolicy_Exponential\n\tPolicy isRetryPolicy_Policy `protobuf_oneof:\"policy\"`\n\t// if specifies condition in CEL. If the condition is true, run the retry process according to the policy.\n\t// If this field is omitted, it is always treated as 'true' and run the retry process.\n\t// The return value must always be of type boolean.\n\tIf string `protobuf:\"bytes,3,opt,name=if,proto3\" json:\"if,omitempty\"`\n}\n\nfunc (x *RetryPolicy) Reset() {\n\t*x = RetryPolicy{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[28]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RetryPolicy) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RetryPolicy) ProtoMessage() {}\n\nfunc (x *RetryPolicy) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[28]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RetryPolicy.ProtoReflect.Descriptor instead.\nfunc (*RetryPolicy) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{28}\n}\n\nfunc (m *RetryPolicy) GetPolicy() isRetryPolicy_Policy {\n\tif m != nil {\n\t\treturn m.Policy\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicy) GetConstant() *RetryPolicyConstant {\n\tif x, ok := x.GetPolicy().(*RetryPolicy_Constant); ok {\n\t\treturn x.Constant\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicy) GetExponential() *RetryPolicyExponential {\n\tif x, ok := x.GetPolicy().(*RetryPolicy_Exponential); ok {\n\t\treturn x.Exponential\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicy) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\ntype isRetryPolicy_Policy interface {\n\tisRetryPolicy_Policy()\n}\n\ntype RetryPolicy_Constant struct {\n\t// retry according to the \"constant\" policy.\n\tConstant *RetryPolicyConstant `protobuf:\"bytes,1,opt,name=constant,proto3,oneof\"`\n}\n\ntype RetryPolicy_Exponential struct {\n\t// retry according to the \"exponential backoff\" policy.\n\t// The following Go library is used in the implementation,\n\t// so please refer to the library documentation for how to specify each parameter.\n\t// https://pkg.go.dev/github.com/cenkalti/backoff/v4#section-readme.\n\tExponential *RetryPolicyExponential `protobuf:\"bytes,2,opt,name=exponential,proto3,oneof\"`\n}\n\nfunc (*RetryPolicy_Constant) isRetryPolicy_Policy() {}\n\nfunc (*RetryPolicy_Exponential) isRetryPolicy_Policy() {}\n\n// RetryPolicyConstant define \"constant\" based retry policy.\ntype RetryPolicyConstant struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// interval value. ( default value is 1s ).\n\tInterval *string `protobuf:\"bytes,1,opt,name=interval,proto3,oneof\" json:\"interval,omitempty\"`\n\t// max retry count. ( default value is 5. If zero is specified, it never stops )\n\tMaxRetries *uint64 `protobuf:\"varint,2,opt,name=max_retries,json=maxRetries,proto3,oneof\" json:\"max_retries,omitempty\"`\n}\n\nfunc (x *RetryPolicyConstant) Reset() {\n\t*x = RetryPolicyConstant{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[29]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RetryPolicyConstant) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RetryPolicyConstant) ProtoMessage() {}\n\nfunc (x *RetryPolicyConstant) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[29]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RetryPolicyConstant.ProtoReflect.Descriptor instead.\nfunc (*RetryPolicyConstant) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{29}\n}\n\nfunc (x *RetryPolicyConstant) GetInterval() string {\n\tif x != nil && x.Interval != nil {\n\t\treturn *x.Interval\n\t}\n\treturn \"\"\n}\n\nfunc (x *RetryPolicyConstant) GetMaxRetries() uint64 {\n\tif x != nil && x.MaxRetries != nil {\n\t\treturn *x.MaxRetries\n\t}\n\treturn 0\n}\n\n// RetryPolicyExponential define \"exponential backoff\" based retry policy.\ntype RetryPolicyExponential struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// initial interval value. ( default value is \"500ms\" ).\n\tInitialInterval *string `protobuf:\"bytes,1,opt,name=initial_interval,json=initialInterval,proto3,oneof\" json:\"initial_interval,omitempty\"`\n\t// randomization factor value. ( default value is 0.5 ).\n\tRandomizationFactor *float64 `protobuf:\"fixed64,2,opt,name=randomization_factor,json=randomizationFactor,proto3,oneof\" json:\"randomization_factor,omitempty\"`\n\t// multiplier. ( default value is 1.5 ).\n\tMultiplier *float64 `protobuf:\"fixed64,3,opt,name=multiplier,proto3,oneof\" json:\"multiplier,omitempty\"`\n\t// max interval value. ( default value is \"60s\" ).\n\tMaxInterval *string `protobuf:\"bytes,4,opt,name=max_interval,json=maxInterval,proto3,oneof\" json:\"max_interval,omitempty\"`\n\t// max retry count. ( default value is 5. If zero is specified, it never stops ).\n\tMaxRetries *uint64 `protobuf:\"varint,5,opt,name=max_retries,json=maxRetries,proto3,oneof\" json:\"max_retries,omitempty\"`\n}\n\nfunc (x *RetryPolicyExponential) Reset() {\n\t*x = RetryPolicyExponential{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[30]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RetryPolicyExponential) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RetryPolicyExponential) ProtoMessage() {}\n\nfunc (x *RetryPolicyExponential) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[30]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RetryPolicyExponential.ProtoReflect.Descriptor instead.\nfunc (*RetryPolicyExponential) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{30}\n}\n\nfunc (x *RetryPolicyExponential) GetInitialInterval() string {\n\tif x != nil && x.InitialInterval != nil {\n\t\treturn *x.InitialInterval\n\t}\n\treturn \"\"\n}\n\nfunc (x *RetryPolicyExponential) GetRandomizationFactor() float64 {\n\tif x != nil && x.RandomizationFactor != nil {\n\t\treturn *x.RandomizationFactor\n\t}\n\treturn 0\n}\n\nfunc (x *RetryPolicyExponential) GetMultiplier() float64 {\n\tif x != nil && x.Multiplier != nil {\n\t\treturn *x.Multiplier\n\t}\n\treturn 0\n}\n\nfunc (x *RetryPolicyExponential) GetMaxInterval() string {\n\tif x != nil && x.MaxInterval != nil {\n\t\treturn *x.MaxInterval\n\t}\n\treturn \"\"\n}\n\nfunc (x *RetryPolicyExponential) GetMaxRetries() uint64 {\n\tif x != nil && x.MaxRetries != nil {\n\t\treturn *x.MaxRetries\n\t}\n\treturn 0\n}\n\n// MethodRequest define parameters to be used for gRPC method request.\ntype MethodRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// field name of the request message.\n\tField string `protobuf:\"bytes,1,opt,name=field,proto3\" json:\"field,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tBy *string `protobuf:\"bytes,2,opt,name=by,proto3,oneof\" json:\"by,omitempty\"`\n\t// if describes the condition to be assigned to field.\n\t// The return value must be of type bool.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\t// If the field is a 'oneof' field, it must be specified.\n\tIf *string `protobuf:\"bytes,3,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n}\n\nfunc (x *MethodRequest) Reset() {\n\t*x = MethodRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[31]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MethodRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MethodRequest) ProtoMessage() {}\n\nfunc (x *MethodRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[31]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MethodRequest.ProtoReflect.Descriptor instead.\nfunc (*MethodRequest) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{31}\n}\n\nfunc (x *MethodRequest) GetField() string {\n\tif x != nil {\n\t\treturn x.Field\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodRequest) GetBy() string {\n\tif x != nil && x.By != nil {\n\t\treturn *x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodRequest) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\n// MethodResponse define which value of the method response is referenced.\ntype MethodResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name specify the unique name that can be used in a `MessageRule` / `FieldRule` for the same message for a specific field in the response.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// field name in response message.\n\tField *string `protobuf:\"bytes,2,opt,name=field,proto3,oneof\" json:\"field,omitempty\"`\n\t// autobind if the value referenced by `field` is a message type,\n\t// the value of a field with the same name and type as the field name of its own message is automatically assigned to the value of the field in the message.\n\t// If multiple autobinds are used at the same message,\n\t// you must explicitly use the `grpc.federation.field` option to do the binding yourself, since duplicate field names cannot be correctly determined as one.\n\tAutobind *bool `protobuf:\"varint,3,opt,name=autobind,proto3,oneof\" json:\"autobind,omitempty\"`\n}\n\nfunc (x *MethodResponse) Reset() {\n\t*x = MethodResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[32]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MethodResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MethodResponse) ProtoMessage() {}\n\nfunc (x *MethodResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[32]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MethodResponse.ProtoReflect.Descriptor instead.\nfunc (*MethodResponse) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{32}\n}\n\nfunc (x *MethodResponse) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodResponse) GetField() string {\n\tif x != nil && x.Field != nil {\n\t\treturn *x.Field\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodResponse) GetAutobind() bool {\n\tif x != nil && x.Autobind != nil {\n\t\treturn *x.Autobind\n\t}\n\treturn false\n}\n\n// Argument define message argument.\ntype Argument struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name of the message argument.\n\t// Use this name to refer to the message argument.\n\t// For example, if `foo` is specified as the name, it is referenced by `$.foo`.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tBy *string `protobuf:\"bytes,2,opt,name=by,proto3,oneof\" json:\"by,omitempty\"`\n\t// inline like by, it refers to the specified value and expands all fields beyond it.\n\t// For this reason, the referenced value must always be of message type.\n\tInline *string `protobuf:\"bytes,3,opt,name=inline,proto3,oneof\" json:\"inline,omitempty\"`\n}\n\nfunc (x *Argument) Reset() {\n\t*x = Argument{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[33]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Argument) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Argument) ProtoMessage() {}\n\nfunc (x *Argument) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[33]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Argument.ProtoReflect.Descriptor instead.\nfunc (*Argument) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{33}\n}\n\nfunc (x *Argument) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Argument) GetBy() string {\n\tif x != nil && x.By != nil {\n\t\treturn *x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *Argument) GetInline() string {\n\tif x != nil && x.Inline != nil {\n\t\treturn *x.Inline\n\t}\n\treturn \"\"\n}\n\n// FieldRule define gRPC Federation rules for the field of message.\ntype FieldRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// If custom_resolver is true, the field binding process is to be implemented in Go.\n\t// If there are any values retrieved by grpc.federation.message option, they are passed as arguments for custom resolver.\n\tCustomResolver *bool `protobuf:\"varint,1,opt,name=custom_resolver,json=customResolver,proto3,oneof\" json:\"custom_resolver,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tBy *string `protobuf:\"bytes,2,opt,name=by,proto3,oneof\" json:\"by,omitempty\"`\n\t// alias can be used when alias is specified in grpc.federation.message option,\n\t// and specifies the field name to be referenced among the messages specified in alias of message option.\n\t// If the specified field has the same type or can be converted automatically, its value is assigned.\n\tAlias *string `protobuf:\"bytes,3,opt,name=alias,proto3,oneof\" json:\"alias,omitempty\"`\n\t// use to evaluate any one of fields. this field only available in oneof.\n\tOneof *FieldOneof `protobuf:\"bytes,4,opt,name=oneof,proto3\" json:\"oneof,omitempty\"`\n\t// when defining an environment variable, use it for fields where you want to set additional options.\n\tEnv *EnvVarOption `protobuf:\"bytes,5,opt,name=env,proto3\" json:\"env,omitempty\"`\n}\n\nfunc (x *FieldRule) Reset() {\n\t*x = FieldRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[34]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *FieldRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*FieldRule) ProtoMessage() {}\n\nfunc (x *FieldRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[34]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use FieldRule.ProtoReflect.Descriptor instead.\nfunc (*FieldRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{34}\n}\n\nfunc (x *FieldRule) GetCustomResolver() bool {\n\tif x != nil && x.CustomResolver != nil {\n\t\treturn *x.CustomResolver\n\t}\n\treturn false\n}\n\nfunc (x *FieldRule) GetBy() string {\n\tif x != nil && x.By != nil {\n\t\treturn *x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *FieldRule) GetAlias() string {\n\tif x != nil && x.Alias != nil {\n\t\treturn *x.Alias\n\t}\n\treturn \"\"\n}\n\nfunc (x *FieldRule) GetOneof() *FieldOneof {\n\tif x != nil {\n\t\treturn x.Oneof\n\t}\n\treturn nil\n}\n\nfunc (x *FieldRule) GetEnv() *EnvVarOption {\n\tif x != nil {\n\t\treturn x.Env\n\t}\n\treturn nil\n}\n\n// FieldOneof evaluate \"messages\" or other field only if expr is true and assign to the oneof field.\n// This feature only available in oneof.\ntype FieldOneof struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// cond specify either `expr` or `default`. Only one `default` can be set per oneof.\n\t//\n\t// Types that are assignable to Cond:\n\t//\n\t//\t*FieldOneof_If\n\t//\t*FieldOneof_Default\n\tCond isFieldOneof_Cond `protobuf_oneof:\"cond\"`\n\t// def specify variables to be used in current oneof field's scope for field binding.\n\tDef []*VariableDefinition `protobuf:\"bytes,3,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule and FieldOneOf can be used.\n\tBy string `protobuf:\"bytes,4,opt,name=by,proto3\" json:\"by,omitempty\"`\n}\n\nfunc (x *FieldOneof) Reset() {\n\t*x = FieldOneof{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[35]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *FieldOneof) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*FieldOneof) ProtoMessage() {}\n\nfunc (x *FieldOneof) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[35]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use FieldOneof.ProtoReflect.Descriptor instead.\nfunc (*FieldOneof) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{35}\n}\n\nfunc (m *FieldOneof) GetCond() isFieldOneof_Cond {\n\tif m != nil {\n\t\treturn m.Cond\n\t}\n\treturn nil\n}\n\nfunc (x *FieldOneof) GetIf() string {\n\tif x, ok := x.GetCond().(*FieldOneof_If); ok {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *FieldOneof) GetDefault() bool {\n\tif x, ok := x.GetCond().(*FieldOneof_Default); ok {\n\t\treturn x.Default\n\t}\n\treturn false\n}\n\nfunc (x *FieldOneof) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *FieldOneof) GetBy() string {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\ntype isFieldOneof_Cond interface {\n\tisFieldOneof_Cond()\n}\n\ntype FieldOneof_If struct {\n\t// if describes the condition to be assigned to field.\n\t// The return value must be of type bool.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3,oneof\"`\n}\n\ntype FieldOneof_Default struct {\n\t// default used to assign a value when none of the other fields match any of the specified expressions.\n\t// Only one value can be defined per oneof.\n\tDefault bool `protobuf:\"varint,2,opt,name=default,proto3,oneof\"`\n}\n\nfunc (*FieldOneof_If) isFieldOneof_Cond() {}\n\nfunc (*FieldOneof_Default) isFieldOneof_Cond() {}\n\n// CELPlugin define schema of CEL plugin.\ntype CELPlugin struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tExport []*CELPluginExport `protobuf:\"bytes,1,rep,name=export,proto3\" json:\"export,omitempty\"`\n}\n\nfunc (x *CELPlugin) Reset() {\n\t*x = CELPlugin{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[36]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPlugin) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPlugin) ProtoMessage() {}\n\nfunc (x *CELPlugin) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[36]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPlugin.ProtoReflect.Descriptor instead.\nfunc (*CELPlugin) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{36}\n}\n\nfunc (x *CELPlugin) GetExport() []*CELPluginExport {\n\tif x != nil {\n\t\treturn x.Export\n\t}\n\treturn nil\n}\n\n// CELPluginExport describe the schema to be exposed as a CEL plugin.\ntype CELPluginExport struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the plugin name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// types describe the message type you want to expose.\n\tTypes []*CELReceiverType `protobuf:\"bytes,3,rep,name=types,proto3\" json:\"types,omitempty\"`\n\t// functions describe the definition of the function you want to expose.\n\tFunctions []*CELFunction `protobuf:\"bytes,4,rep,name=functions,proto3\" json:\"functions,omitempty\"`\n\t// variables describe the definition of the variable you want to expose.\n\tVariables  []*CELVariable       `protobuf:\"bytes,5,rep,name=variables,proto3\" json:\"variables,omitempty\"`\n\tCapability *CELPluginCapability `protobuf:\"bytes,6,opt,name=capability,proto3\" json:\"capability,omitempty\"`\n}\n\nfunc (x *CELPluginExport) Reset() {\n\t*x = CELPluginExport{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[37]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginExport) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginExport) ProtoMessage() {}\n\nfunc (x *CELPluginExport) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[37]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginExport.ProtoReflect.Descriptor instead.\nfunc (*CELPluginExport) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{37}\n}\n\nfunc (x *CELPluginExport) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELPluginExport) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELPluginExport) GetTypes() []*CELReceiverType {\n\tif x != nil {\n\t\treturn x.Types\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginExport) GetFunctions() []*CELFunction {\n\tif x != nil {\n\t\treturn x.Functions\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginExport) GetVariables() []*CELVariable {\n\tif x != nil {\n\t\treturn x.Variables\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginExport) GetCapability() *CELPluginCapability {\n\tif x != nil {\n\t\treturn x.Capability\n\t}\n\treturn nil\n}\n\n// CELPluginCapability controls the permissions granted to the WebAssembly plugin.\ntype CELPluginCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// env is the capability for environment variable.\n\tEnv *CELPluginEnvCapability `protobuf:\"bytes,1,opt,name=env,proto3,oneof\" json:\"env,omitempty\"`\n\t// file_system is the capability for file system.\n\tFileSystem *CELPluginFileSystemCapability `protobuf:\"bytes,2,opt,name=file_system,json=fileSystem,proto3,oneof\" json:\"file_system,omitempty\"`\n\t// network is the capability for network.\n\tNetwork *CELPluginNetworkCapability `protobuf:\"bytes,3,opt,name=network,proto3,oneof\" json:\"network,omitempty\"`\n}\n\nfunc (x *CELPluginCapability) Reset() {\n\t*x = CELPluginCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[38]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginCapability) ProtoMessage() {}\n\nfunc (x *CELPluginCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[38]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{38}\n}\n\nfunc (x *CELPluginCapability) GetEnv() *CELPluginEnvCapability {\n\tif x != nil {\n\t\treturn x.Env\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginCapability) GetFileSystem() *CELPluginFileSystemCapability {\n\tif x != nil {\n\t\treturn x.FileSystem\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginCapability) GetNetwork() *CELPluginNetworkCapability {\n\tif x != nil {\n\t\treturn x.Network\n\t}\n\treturn nil\n}\n\n// CELPluginEnvCapability controls access to the environment variable.\ntype CELPluginEnvCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// all allows access to all environment variables.\n\tAll bool `protobuf:\"varint,1,opt,name=all,proto3\" json:\"all,omitempty\"`\n\t// specifies accessible names. If \"all\" is true, it takes precedence.\n\tNames []string `protobuf:\"bytes,2,rep,name=names,proto3\" json:\"names,omitempty\"`\n}\n\nfunc (x *CELPluginEnvCapability) Reset() {\n\t*x = CELPluginEnvCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[39]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginEnvCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginEnvCapability) ProtoMessage() {}\n\nfunc (x *CELPluginEnvCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[39]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginEnvCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginEnvCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{39}\n}\n\nfunc (x *CELPluginEnvCapability) GetAll() bool {\n\tif x != nil {\n\t\treturn x.All\n\t}\n\treturn false\n}\n\nfunc (x *CELPluginEnvCapability) GetNames() []string {\n\tif x != nil {\n\t\treturn x.Names\n\t}\n\treturn nil\n}\n\n// CELPluginFileSystemCapability controls access to the file system.\ntype CELPluginFileSystemCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// mount_path specifies the file path of the host to mount.\n\t// If not specified, the root directory will be used.\n\tMountPath string `protobuf:\"bytes,1,opt,name=mount_path,json=mountPath,proto3\" json:\"mount_path,omitempty\"`\n}\n\nfunc (x *CELPluginFileSystemCapability) Reset() {\n\t*x = CELPluginFileSystemCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[40]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginFileSystemCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginFileSystemCapability) ProtoMessage() {}\n\nfunc (x *CELPluginFileSystemCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[40]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginFileSystemCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginFileSystemCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{40}\n}\n\nfunc (x *CELPluginFileSystemCapability) GetMountPath() string {\n\tif x != nil {\n\t\treturn x.MountPath\n\t}\n\treturn \"\"\n}\n\n// CELPluginNetworkCapability sets permissions related to network access.\n// This is an experimental feature.\ntype CELPluginNetworkCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *CELPluginNetworkCapability) Reset() {\n\t*x = CELPluginNetworkCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[41]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginNetworkCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginNetworkCapability) ProtoMessage() {}\n\nfunc (x *CELPluginNetworkCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[41]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginNetworkCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginNetworkCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{41}\n}\n\n// CELFunction represents the CEL function definition.\ntype CELFunction struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the function name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of function.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// args describe the definition of the function argument.\n\tArgs []*CELFunctionArgument `protobuf:\"bytes,3,rep,name=args,proto3\" json:\"args,omitempty\"`\n\t// return describe the definition of return type of function.\n\tReturn *CELType `protobuf:\"bytes,4,opt,name=return,proto3\" json:\"return,omitempty\"`\n}\n\nfunc (x *CELFunction) Reset() {\n\t*x = CELFunction{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[42]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELFunction) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELFunction) ProtoMessage() {}\n\nfunc (x *CELFunction) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[42]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELFunction.ProtoReflect.Descriptor instead.\nfunc (*CELFunction) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{42}\n}\n\nfunc (x *CELFunction) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunction) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunction) GetArgs() []*CELFunctionArgument {\n\tif x != nil {\n\t\treturn x.Args\n\t}\n\treturn nil\n}\n\nfunc (x *CELFunction) GetReturn() *CELType {\n\tif x != nil {\n\t\treturn x.Return\n\t}\n\treturn nil\n}\n\n// CELReceiverType represents methods tied to the message.\ntype CELReceiverType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the message name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// methods describe the definition of the method for the message.\n\tMethods []*CELFunction `protobuf:\"bytes,3,rep,name=methods,proto3\" json:\"methods,omitempty\"`\n}\n\nfunc (x *CELReceiverType) Reset() {\n\t*x = CELReceiverType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[43]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELReceiverType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELReceiverType) ProtoMessage() {}\n\nfunc (x *CELReceiverType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[43]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELReceiverType.ProtoReflect.Descriptor instead.\nfunc (*CELReceiverType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{43}\n}\n\nfunc (x *CELReceiverType) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELReceiverType) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELReceiverType) GetMethods() []*CELFunction {\n\tif x != nil {\n\t\treturn x.Methods\n\t}\n\treturn nil\n}\n\n// CELFunctionArgument represents the function argument.\ntype CELFunctionArgument struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the argument value name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// type is the argument type.\n\tType *CELType `protobuf:\"bytes,3,opt,name=type,proto3\" json:\"type,omitempty\"`\n}\n\nfunc (x *CELFunctionArgument) Reset() {\n\t*x = CELFunctionArgument{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[44]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELFunctionArgument) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELFunctionArgument) ProtoMessage() {}\n\nfunc (x *CELFunctionArgument) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[44]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELFunctionArgument.ProtoReflect.Descriptor instead.\nfunc (*CELFunctionArgument) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{44}\n}\n\nfunc (x *CELFunctionArgument) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunctionArgument) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunctionArgument) GetType() *CELType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\n// CELType represents type information for CEL plugin interface.\ntype CELType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to Type:\n\t//\n\t//\t*CELType_Kind\n\t//\t*CELType_Repeated\n\t//\t*CELType_Map\n\t//\t*CELType_Message\n\t//\t*CELType_Enum\n\tType isCELType_Type `protobuf_oneof:\"type\"`\n}\n\nfunc (x *CELType) Reset() {\n\t*x = CELType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[45]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELType) ProtoMessage() {}\n\nfunc (x *CELType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[45]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELType.ProtoReflect.Descriptor instead.\nfunc (*CELType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{45}\n}\n\nfunc (m *CELType) GetType() isCELType_Type {\n\tif m != nil {\n\t\treturn m.Type\n\t}\n\treturn nil\n}\n\nfunc (x *CELType) GetKind() TypeKind {\n\tif x, ok := x.GetType().(*CELType_Kind); ok {\n\t\treturn x.Kind\n\t}\n\treturn TypeKind_UNKNOWN\n}\n\nfunc (x *CELType) GetRepeated() *CELType {\n\tif x, ok := x.GetType().(*CELType_Repeated); ok {\n\t\treturn x.Repeated\n\t}\n\treturn nil\n}\n\nfunc (x *CELType) GetMap() *CELMapType {\n\tif x, ok := x.GetType().(*CELType_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\nfunc (x *CELType) GetMessage() string {\n\tif x, ok := x.GetType().(*CELType_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELType) GetEnum() string {\n\tif x, ok := x.GetType().(*CELType_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn \"\"\n}\n\ntype isCELType_Type interface {\n\tisCELType_Type()\n}\n\ntype CELType_Kind struct {\n\t// kind is used when the type is a primitive type.\n\tKind TypeKind `protobuf:\"varint,1,opt,name=kind,proto3,enum=grpc.federation.TypeKind,oneof\"`\n}\n\ntype CELType_Repeated struct {\n\t// repeated is used when the type is a repeated type.\n\tRepeated *CELType `protobuf:\"bytes,2,opt,name=repeated,proto3,oneof\"`\n}\n\ntype CELType_Map struct {\n\t// map is used when the type is a map type.\n\tMap *CELMapType `protobuf:\"bytes,3,opt,name=map,proto3,oneof\"`\n}\n\ntype CELType_Message struct {\n\t// message is a fqdn to the message type.\n\tMessage string `protobuf:\"bytes,4,opt,name=message,proto3,oneof\"`\n}\n\ntype CELType_Enum struct {\n\t// enum is a fqdn to the enum type.\n\tEnum string `protobuf:\"bytes,5,opt,name=enum,proto3,oneof\"`\n}\n\nfunc (*CELType_Kind) isCELType_Type() {}\n\nfunc (*CELType_Repeated) isCELType_Type() {}\n\nfunc (*CELType_Map) isCELType_Type() {}\n\nfunc (*CELType_Message) isCELType_Type() {}\n\nfunc (*CELType_Enum) isCELType_Type() {}\n\n// CELMapType represents map type.\ntype CELMapType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// key represents map's key type.\n\tKey *CELType `protobuf:\"bytes,1,opt,name=key,proto3\" json:\"key,omitempty\"`\n\t// value represents map's value type.\n\tValue *CELType `protobuf:\"bytes,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *CELMapType) Reset() {\n\t*x = CELMapType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[46]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELMapType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELMapType) ProtoMessage() {}\n\nfunc (x *CELMapType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[46]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELMapType.ProtoReflect.Descriptor instead.\nfunc (*CELMapType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{46}\n}\n\nfunc (x *CELMapType) GetKey() *CELType {\n\tif x != nil {\n\t\treturn x.Key\n\t}\n\treturn nil\n}\n\nfunc (x *CELMapType) GetValue() *CELType {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn nil\n}\n\n// CELVariable represents CEL variable.\ntype CELVariable struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the variable name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// type is the variable type.\n\tType *CELType `protobuf:\"bytes,3,opt,name=type,proto3\" json:\"type,omitempty\"`\n}\n\nfunc (x *CELVariable) Reset() {\n\t*x = CELVariable{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[47]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELVariable) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELVariable) ProtoMessage() {}\n\nfunc (x *CELVariable) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[47]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELVariable.ProtoReflect.Descriptor instead.\nfunc (*CELVariable) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{47}\n}\n\nfunc (x *CELVariable) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELVariable) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELVariable) GetType() *CELType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nvar file_grpc_federation_federation_proto_extTypes = []protoimpl.ExtensionInfo{\n\t{\n\t\tExtendedType:  (*descriptorpb.FileOptions)(nil),\n\t\tExtensionType: (*FileRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.file\",\n\t\tTag:           \"bytes,1187,opt,name=file\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*ServiceRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.service\",\n\t\tTag:           \"bytes,1187,opt,name=service\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*MethodRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.method\",\n\t\tTag:           \"bytes,1187,opt,name=method\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MessageOptions)(nil),\n\t\tExtensionType: (*MessageRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.message\",\n\t\tTag:           \"bytes,1187,opt,name=message\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*FieldRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.field\",\n\t\tTag:           \"bytes,1187,opt,name=field\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.EnumOptions)(nil),\n\t\tExtensionType: (*EnumRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.enum\",\n\t\tTag:           \"bytes,1187,opt,name=enum\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.EnumValueOptions)(nil),\n\t\tExtensionType: (*EnumValueRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.enum_value\",\n\t\tTag:           \"bytes,1187,opt,name=enum_value\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.OneofOptions)(nil),\n\t\tExtensionType: (*OneofRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.oneof\",\n\t\tTag:           \"bytes,1187,opt,name=oneof\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n}\n\n// Extension fields to descriptorpb.FileOptions.\nvar (\n\t// optional grpc.federation.FileRule file = 1187;\n\tE_File = &file_grpc_federation_federation_proto_extTypes[0]\n)\n\n// Extension fields to descriptorpb.ServiceOptions.\nvar (\n\t// optional grpc.federation.ServiceRule service = 1187;\n\tE_Service = &file_grpc_federation_federation_proto_extTypes[1]\n)\n\n// Extension fields to descriptorpb.MethodOptions.\nvar (\n\t// optional grpc.federation.MethodRule method = 1187;\n\tE_Method = &file_grpc_federation_federation_proto_extTypes[2]\n)\n\n// Extension fields to descriptorpb.MessageOptions.\nvar (\n\t// optional grpc.federation.MessageRule message = 1187;\n\tE_Message = &file_grpc_federation_federation_proto_extTypes[3]\n)\n\n// Extension fields to descriptorpb.FieldOptions.\nvar (\n\t// optional grpc.federation.FieldRule field = 1187;\n\tE_Field = &file_grpc_federation_federation_proto_extTypes[4]\n)\n\n// Extension fields to descriptorpb.EnumOptions.\nvar (\n\t// optional grpc.federation.EnumRule enum = 1187;\n\tE_Enum = &file_grpc_federation_federation_proto_extTypes[5]\n)\n\n// Extension fields to descriptorpb.EnumValueOptions.\nvar (\n\t// optional grpc.federation.EnumValueRule enum_value = 1187;\n\tE_EnumValue = &file_grpc_federation_federation_proto_extTypes[6]\n)\n\n// Extension fields to descriptorpb.OneofOptions.\nvar (\n\t// optional grpc.federation.OneofRule oneof = 1187;\n\tE_Oneof = &file_grpc_federation_federation_proto_extTypes[7]\n)\n\nvar File_grpc_federation_federation_proto protoreflect.FileDescriptor\n\nvar file_grpc_federation_federation_proto_rawDesc = []byte{\n\t0x0a, 0x20, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x12, 0x0f, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70,\n\t0x63, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x64,\n\t0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x67, 0x72,\n\t0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x70, 0x72,\n\t0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x67, 0x72, 0x70,\n\t0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x74, 0x69, 0x6d,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x56, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x52,\n\t0x75, 0x6c, 0x65, 0x12, 0x32, 0x0a, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52,\n\t0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6d, 0x70, 0x6f, 0x72,\n\t0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x22,\n\t0x20, 0x0a, 0x08, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61,\n\t0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61,\n\t0x73, 0x22, 0xb4, 0x01, 0x0a, 0x0d, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52,\n\t0x75, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x88,\n\t0x01, 0x01, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,\n\t0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x37, 0x0a, 0x04, 0x61, 0x74, 0x74, 0x72,\n\t0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c,\n\t0x75, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, 0x04, 0x61, 0x74, 0x74,\n\t0x72, 0x12, 0x1d, 0x0a, 0x07, 0x6e, 0x6f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x04, 0x20, 0x01,\n\t0x28, 0x08, 0x48, 0x01, 0x52, 0x07, 0x6e, 0x6f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x88, 0x01, 0x01,\n\t0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x42, 0x0a, 0x0a, 0x08,\n\t0x5f, 0x6e, 0x6f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x3e, 0x0a, 0x12, 0x45, 0x6e, 0x75, 0x6d,\n\t0x56, 0x61, 0x6c, 0x75, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x12, 0x12,\n\t0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x0b, 0x0a, 0x09, 0x4f, 0x6e, 0x65, 0x6f,\n\t0x66, 0x52, 0x75, 0x6c, 0x65, 0x22, 0x69, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n\t0x52, 0x75, 0x6c, 0x65, 0x12, 0x26, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x14, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x32, 0x0a, 0x03,\n\t0x76, 0x61, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x03, 0x76, 0x61, 0x72,\n\t0x22, 0x4a, 0x0a, 0x03, 0x45, 0x6e, 0x76, 0x12, 0x29, 0x0a, 0x03, 0x76, 0x61, 0x72, 0x18, 0x01,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x52, 0x03, 0x76,\n\t0x61, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x8b, 0x03, 0x0a,\n\t0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65,\n\t0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01,\n\t0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x66, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x02, 0x69, 0x66, 0x88, 0x01, 0x01, 0x12, 0x10,\n\t0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x62, 0x79,\n\t0x12, 0x2c, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x4d, 0x61, 0x70, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x70, 0x12, 0x38,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52,\n\t0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x50, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x69,\n\t0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x61,\n\t0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x0a,\n\t0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x04, 0x65, 0x6e,\n\t0x75, 0x6d, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x45,\n\t0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x35, 0x0a, 0x06, 0x73,\n\t0x77, 0x69, 0x74, 0x63, 0x68, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x77,\n\t0x69, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x06, 0x73, 0x77, 0x69, 0x74,\n\t0x63, 0x68, 0x42, 0x06, 0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e,\n\t0x61, 0x6d, 0x65, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x66, 0x22, 0x49, 0x0a, 0x1d, 0x53, 0x65,\n\t0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c,\n\t0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69,\n\t0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x66, 0x12, 0x18, 0x0a, 0x07, 0x6d,\n\t0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65,\n\t0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x06, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72,\n\t0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79,\n\t0x70, 0x65, 0x12, 0x3a, 0x0a, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x48, 0x00, 0x52, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x09,\n\t0x0a, 0x07, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xab, 0x01, 0x0a, 0x07, 0x45, 0x6e,\n\t0x76, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2f, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x00,\n\t0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x36, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74,\n\t0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79,\n\t0x70, 0x65, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2f,\n\t0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e,\n\t0x76, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x70, 0x42,\n\t0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x68, 0x0a, 0x0a, 0x45, 0x6e, 0x76, 0x4d, 0x61,\n\t0x70, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2a, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79, 0x70, 0x65, 0x52, 0x03, 0x6b, 0x65,\n\t0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,\n\t0x65, 0x22, 0xc3, 0x01, 0x0a, 0x0c, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x09, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61,\n\t0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c,\n\t0x74, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72,\n\t0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64,\n\t0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x07, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65,\n\t0x64, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61,\n\t0x74, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x42, 0x0b,\n\t0x0a, 0x09, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x5f,\n\t0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x22, 0x65, 0x0a, 0x0a, 0x4d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75,\n\t0x74, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e,\n\t0x73, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75,\n\t0x74, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9c,\n\t0x01, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x35,\n\t0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61,\n\t0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e,\n\t0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f,\n\t0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00,\n\t0x52, 0x0e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72,\n\t0x88, 0x01, 0x01, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x03, 0x20, 0x03,\n\t0x28, 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x75,\n\t0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x22, 0xde, 0x03,\n\t0x0a, 0x12, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69,\n\t0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x48, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x13, 0x0a,\n\t0x02, 0x69, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x02, 0x69, 0x66, 0x88,\n\t0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x18, 0x03,\n\t0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64,\n\t0x88, 0x01, 0x01, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48,\n\t0x00, 0x52, 0x02, 0x62, 0x79, 0x12, 0x2c, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x0c, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x61, 0x70, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x03,\n\t0x6d, 0x61, 0x70, 0x12, 0x38, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0d,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78,\n\t0x70, 0x72, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2f, 0x0a,\n\t0x04, 0x63, 0x61, 0x6c, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x61,\n\t0x6c, 0x6c, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x63, 0x61, 0x6c, 0x6c, 0x12, 0x41,\n\t0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45,\n\t0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x12, 0x2f, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e,\n\t0x75, 0x6d, 0x12, 0x35, 0x0a, 0x06, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x18, 0x11, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x48,\n\t0x00, 0x52, 0x06, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x42, 0x06, 0x0a, 0x04, 0x65, 0x78, 0x70,\n\t0x72, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69,\n\t0x66, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x22, 0xc5,\n\t0x01, 0x0a, 0x07, 0x4d, 0x61, 0x70, 0x45, 0x78, 0x70, 0x72, 0x12, 0x35, 0x0a, 0x08, 0x69, 0x74,\n\t0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49,\n\t0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f,\n\t0x72, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,\n\t0x02, 0x62, 0x79, 0x12, 0x38, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0c,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78,\n\t0x70, 0x72, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2f, 0x0a,\n\t0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e,\n\t0x75, 0x6d, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x42, 0x06,\n\t0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x22, 0x30, 0x0a, 0x08, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74,\n\t0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x72, 0x63, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x72, 0x63, 0x22, 0x50, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x45, 0x78, 0x70, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x04, 0x61,\n\t0x72, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x41, 0x72, 0x67, 0x75,\n\t0x6d, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x22, 0x2e, 0x0a, 0x08, 0x45, 0x6e,\n\t0x75, 0x6d, 0x45, 0x78, 0x70, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x62, 0x79,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x62, 0x79, 0x22, 0xf3, 0x02, 0x0a, 0x08, 0x43,\n\t0x61, 0x6c, 0x6c, 0x45, 0x78, 0x70, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12,\n\t0x38, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x07, 0x74, 0x69, 0x6d,\n\t0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x74, 0x69,\n\t0x6d, 0x65, 0x6f, 0x75, 0x74, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x05, 0x72, 0x65, 0x74, 0x72,\n\t0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50,\n\t0x6f, 0x6c, 0x69, 0x63, 0x79, 0x48, 0x01, 0x52, 0x05, 0x72, 0x65, 0x74, 0x72, 0x79, 0x88, 0x01,\n\t0x01, 0x12, 0x30, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72,\n\t0x72, 0x6f, 0x72, 0x12, 0x3c, 0x0a, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x43, 0x61, 0x6c, 0x6c, 0x4f, 0x70,\n\t0x74, 0x69, 0x6f, 0x6e, 0x48, 0x02, 0x52, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01,\n\t0x01, 0x12, 0x1f, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20,\n\t0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x88,\n\t0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x42, 0x08,\n\t0x0a, 0x06, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x79, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,\n\t0x22, 0x7f, 0x0a, 0x0a, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x12, 0x33,\n\t0x0a, 0x04, 0x63, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53,\n\t0x77, 0x69, 0x74, 0x63, 0x68, 0x43, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x72, 0x52, 0x04, 0x63,\n\t0x61, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x44, 0x65, 0x66,\n\t0x61, 0x75, 0x6c, 0x74, 0x45, 0x78, 0x70, 0x72, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c,\n\t0x74, 0x22, 0x71, 0x0a, 0x0e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x43, 0x61, 0x73, 0x65, 0x45,\n\t0x78, 0x70, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x02, 0x69, 0x66, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e,\n\t0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x79,\n\t0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x62, 0x79, 0x42, 0x06, 0x0a, 0x04,\n\t0x65, 0x78, 0x70, 0x72, 0x22, 0x64, 0x0a, 0x11, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x44, 0x65,\n\t0x66, 0x61, 0x75, 0x6c, 0x74, 0x45, 0x78, 0x70, 0x72, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66,\n\t0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c,\n\t0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66,\n\t0x12, 0x10, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02,\n\t0x62, 0x79, 0x42, 0x06, 0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x22, 0x86, 0x04, 0x0a, 0x09, 0x47,\n\t0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18,\n\t0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65,\n\t0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12,\n\t0x13, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x69,\n\t0x66, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x0e, 0x32, 0x10, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e,\n\t0x43, 0x6f, 0x64, 0x65, 0x48, 0x01, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12,\n\t0x1d, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,\n\t0x48, 0x02, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a,\n\t0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x20, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69,\n\t0x6c, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x69, 0x67,\n\t0x6e, 0x6f, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x06, 0x69, 0x67,\n\t0x6e, 0x6f, 0x72, 0x65, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x67, 0x6e, 0x6f, 0x72,\n\t0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x07,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x11, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x41, 0x6e,\n\t0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x88, 0x01, 0x01, 0x12, 0x45, 0x0a, 0x09,\n\t0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32,\n\t0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x4c, 0x6f, 0x67, 0x4c,\n\t0x65, 0x76, 0x65, 0x6c, 0x48, 0x05, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c,\n\t0x88, 0x01, 0x01, 0x22, 0x41, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12,\n\t0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05,\n\t0x44, 0x45, 0x42, 0x55, 0x47, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x4e, 0x46, 0x4f, 0x10,\n\t0x02, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x41, 0x52, 0x4e, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x45,\n\t0x52, 0x52, 0x4f, 0x52, 0x10, 0x04, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x66, 0x42, 0x07, 0x0a,\n\t0x05, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61,\n\t0x67, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x42, 0x16, 0x0a,\n\t0x14, 0x5f, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x72, 0x65, 0x73,\n\t0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65,\n\t0x76, 0x65, 0x6c, 0x22, 0xfa, 0x05, 0x0a, 0x0f, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f,\n\t0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x66, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x02,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44,\n\t0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x36,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78, 0x70, 0x72, 0x52, 0x07, 0x6d,\n\t0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f,\n\t0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66,\n\t0x6f, 0x52, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x34, 0x0a, 0x0a,\n\t0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65,\n\t0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x72, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e,\n\t0x66, 0x6f, 0x12, 0x34, 0x0a, 0x0a, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x69, 0x6e, 0x66, 0x6f,\n\t0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x64,\n\t0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3d, 0x0a, 0x0d, 0x71, 0x75, 0x6f, 0x74,\n\t0x61, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x6f,\n\t0x74, 0x61, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x0c, 0x71, 0x75, 0x6f, 0x74, 0x61,\n\t0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x52, 0x0a, 0x14, 0x70, 0x72, 0x65, 0x63, 0x6f,\n\t0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18,\n\t0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72,\n\t0x70, 0x63, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x46,\n\t0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x13, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69,\n\t0x74, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x62,\n\t0x61, 0x64, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61,\n\t0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x62, 0x61, 0x64, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f,\n\t0x69, 0x6e, 0x66, 0x6f, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49,\n\t0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f,\n\t0x12, 0x3d, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66,\n\t0x6f, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66,\n\t0x6f, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12,\n\t0x24, 0x0a, 0x04, 0x68, 0x65, 0x6c, 0x70, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x48, 0x65, 0x6c, 0x70, 0x52,\n\t0x04, 0x68, 0x65, 0x6c, 0x70, 0x12, 0x49, 0x0a, 0x11, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a,\n\t0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f,\n\t0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x10,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,\n\t0x12, 0x0e, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x02, 0x62, 0x79,\n\t0x22, 0xc7, 0x03, 0x0a, 0x0e, 0x47, 0x52, 0x50, 0x43, 0x43, 0x61, 0x6c, 0x6c, 0x4f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x73,\n\t0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0e,\n\t0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x88, 0x01,\n\t0x01, 0x12, 0x1b, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x48, 0x01, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x37,\n\t0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x72, 0x65, 0x63, 0x76, 0x5f,\n\t0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02,\n\t0x52, 0x12, 0x6d, 0x61, 0x78, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x63, 0x76, 0x4d, 0x73, 0x67,\n\t0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x63,\n\t0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a,\n\t0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x43, 0x61,\n\t0x6c, 0x6c, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01,\n\t0x12, 0x28, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x48, 0x04, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x69,\n\t0x63, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x74, 0x72,\n\t0x61, 0x69, 0x6c, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x07, 0x74,\n\t0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x0e, 0x77, 0x61, 0x69,\n\t0x74, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28,\n\t0x08, 0x48, 0x06, 0x52, 0x0c, 0x77, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x52, 0x65, 0x61, 0x64,\n\t0x79, 0x88, 0x01, 0x01, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,\n\t0x5f, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x68, 0x65, 0x61,\n\t0x64, 0x65, 0x72, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c,\n\t0x5f, 0x72, 0x65, 0x63, 0x76, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x19,\n\t0x0a, 0x17, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x65, 0x6e, 0x64,\n\t0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x74,\n\t0x61, 0x74, 0x69, 0x63, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x5f,\n\t0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x77, 0x61, 0x69, 0x74,\n\t0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x22, 0x64, 0x0a, 0x0e, 0x56, 0x61,\n\t0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72, 0x12, 0x17, 0x0a, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72,\n\t0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65,\n\t0x22, 0xb8, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,\n\t0x12, 0x42, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,\n\t0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x73,\n\t0x74, 0x61, 0x6e, 0x74, 0x12, 0x4b, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74,\n\t0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x72,\n\t0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x69,\n\t0x61, 0x6c, 0x48, 0x00, 0x52, 0x0b, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x69, 0x61,\n\t0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,\n\t0x66, 0x42, 0x08, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x79, 0x0a, 0x13, 0x52,\n\t0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61,\n\t0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c,\n\t0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69,\n\t0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, 0x01, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x52,\n\t0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x69, 0x6e,\n\t0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x72,\n\t0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0xd1, 0x02, 0x0a, 0x16, 0x52, 0x65, 0x74, 0x72, 0x79,\n\t0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x69, 0x61,\n\t0x6c, 0x12, 0x2e, 0x0a, 0x10, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x74,\n\t0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0f, 0x69,\n\t0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x88, 0x01,\n\t0x01, 0x12, 0x36, 0x0a, 0x14, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x48,\n\t0x01, 0x52, 0x13, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0a, 0x6d, 0x75, 0x6c,\n\t0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x48, 0x02, 0x52,\n\t0x0a, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x26,\n\t0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x04,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x49, 0x6e, 0x74, 0x65, 0x72,\n\t0x76, 0x61, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65,\n\t0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x48, 0x04, 0x52, 0x0a, 0x6d,\n\t0x61, 0x78, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x42, 0x13, 0x0a, 0x11,\n\t0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61,\n\t0x6c, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x6d,\n\t0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6d, 0x61,\n\t0x78, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d,\n\t0x61, 0x78, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x5d, 0x0a, 0x0d, 0x4d, 0x65,\n\t0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x66,\n\t0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c,\n\t0x64, 0x12, 0x13, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,\n\t0x02, 0x62, 0x79, 0x88, 0x01, 0x01, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x48, 0x01, 0x52, 0x02, 0x69, 0x66, 0x88, 0x01, 0x01, 0x42, 0x05, 0x0a, 0x03, 0x5f,\n\t0x62, 0x79, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x66, 0x22, 0x85, 0x01, 0x0a, 0x0e, 0x4d, 0x65,\n\t0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x17, 0x0a, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x88, 0x01, 0x01,\n\t0x12, 0x1f, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x08, 0x48, 0x02, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x88, 0x01,\n\t0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x66,\n\t0x69, 0x65, 0x6c, 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e,\n\t0x64, 0x22, 0x62, 0x0a, 0x08, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x12, 0x13, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,\n\t0x02, 0x62, 0x79, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x06, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65,\n\t0x88, 0x01, 0x01, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x62, 0x79, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x69,\n\t0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0xf2, 0x01, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52,\n\t0x75, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65,\n\t0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0e,\n\t0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x88, 0x01,\n\t0x01, 0x12, 0x13, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52,\n\t0x02, 0x62, 0x79, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x88, 0x01,\n\t0x01, 0x12, 0x31, 0x0a, 0x05, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x52, 0x05, 0x6f,\n\t0x6e, 0x65, 0x6f, 0x66, 0x12, 0x2f, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x05, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x52, 0x03, 0x65, 0x6e, 0x76, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d,\n\t0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x62, 0x79,\n\t0x42, 0x08, 0x0a, 0x06, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x89, 0x01, 0x0a, 0x0a, 0x46,\n\t0x69, 0x65, 0x6c, 0x64, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x12, 0x10, 0x0a, 0x02, 0x69, 0x66, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x69, 0x66, 0x12, 0x1a, 0x0a, 0x07, 0x64,\n\t0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x07,\n\t0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x03,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44,\n\t0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x0e,\n\t0x0a, 0x02, 0x62, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x62, 0x79, 0x42, 0x06,\n\t0x0a, 0x04, 0x63, 0x6f, 0x6e, 0x64, 0x22, 0x45, 0x0a, 0x09, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75,\n\t0x67, 0x69, 0x6e, 0x12, 0x38, 0x0a, 0x06, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20,\n\t0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x45,\n\t0x78, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x06, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x22, 0xaf, 0x02,\n\t0x0a, 0x0f, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x45, 0x78, 0x70, 0x6f, 0x72,\n\t0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x36, 0x0a, 0x05, 0x74, 0x79, 0x70,\n\t0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x52, 0x65,\n\t0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x74, 0x79, 0x70, 0x65,\n\t0x73, 0x12, 0x3a, 0x0a, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69,\n\t0x6f, 0x6e, 0x52, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3a, 0x0a,\n\t0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x09,\n\t0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x44, 0x0a, 0x0a, 0x63, 0x61, 0x70,\n\t0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c,\n\t0x69, 0x74, 0x79, 0x52, 0x0a, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22,\n\t0x9b, 0x02, 0x0a, 0x13, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x70,\n\t0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x3e, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e,\n\t0x45, 0x6e, 0x76, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x48, 0x00, 0x52,\n\t0x03, 0x65, 0x6e, 0x76, 0x88, 0x01, 0x01, 0x12, 0x54, 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x65, 0x5f,\n\t0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43,\n\t0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x73, 0x74,\n\t0x65, 0x6d, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x48, 0x01, 0x52, 0x0a,\n\t0x66, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x4a, 0x0a,\n\t0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b,\n\t0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72,\n\t0x6b, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x48, 0x02, 0x52, 0x07, 0x6e,\n\t0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x88, 0x01, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x65, 0x6e,\n\t0x76, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65,\n\t0x6d, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x40, 0x0a,\n\t0x16, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x45, 0x6e, 0x76, 0x43, 0x61, 0x70,\n\t0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d,\n\t0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22,\n\t0x3e, 0x0a, 0x1d, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65,\n\t0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79,\n\t0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 0x74, 0x68, 0x22,\n\t0x1c, 0x0a, 0x1a, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x4e, 0x65, 0x74, 0x77,\n\t0x6f, 0x72, 0x6b, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22, 0xa1, 0x01,\n\t0x0a, 0x0b, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x38, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x03, 0x20,\n\t0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,\n\t0x6e, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12,\n\t0x30, 0x0a, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72,\n\t0x6e, 0x22, 0x71, 0x0a, 0x0f, 0x43, 0x45, 0x4c, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72,\n\t0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x36, 0x0a, 0x07,\n\t0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x6d, 0x65, 0x74,\n\t0x68, 0x6f, 0x64, 0x73, 0x22, 0x6b, 0x0a, 0x13, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74,\n\t0x69, 0x6f, 0x6e, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,\n\t0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64,\n\t0x65, 0x73, 0x63, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70,\n\t0x65, 0x22, 0xdd, 0x01, 0x0a, 0x07, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2f, 0x0a,\n\t0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x79,\n\t0x70, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x36,\n\t0x0a, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65,\n\t0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2f, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65,\n\t0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x70, 0x12, 0x1a, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61,\n\t0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28,\n\t0x09, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70,\n\t0x65, 0x22, 0x68, 0x0a, 0x0a, 0x43, 0x45, 0x4c, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65, 0x12,\n\t0x2a, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43,\n\t0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76,\n\t0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70,\n\t0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c,\n\t0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x63, 0x0a, 0x0b, 0x43,\n\t0x45, 0x4c, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12,\n\t0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65,\n\t0x73, 0x63, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65,\n\t0x2a, 0x5e, 0x0a, 0x08, 0x54, 0x79, 0x70, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x0b, 0x0a, 0x07,\n\t0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52,\n\t0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x4f, 0x4f, 0x4c, 0x10, 0x02, 0x12,\n\t0x09, 0x0a, 0x05, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x49,\n\t0x4e, 0x54, 0x36, 0x34, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45,\n\t0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x06,\n\t0x3a, 0x4c, 0x0a, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x46, 0x69, 0x6c, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x3a, 0x58,\n\t0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52,\n\t0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x3a, 0x54, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a, 0x58,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52,\n\t0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x50, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c,\n\t0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52,\n\t0x75, 0x6c, 0x65, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x3a, 0x4c, 0x0a, 0x04, 0x65, 0x6e,\n\t0x75, 0x6d, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x75,\n\t0x6c, 0x65, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x3a, 0x61, 0x0a, 0x0a, 0x65, 0x6e, 0x75, 0x6d,\n\t0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c,\n\t0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x1e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x75, 0x6c, 0x65,\n\t0x52, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x50, 0x0a, 0x05, 0x6f,\n\t0x6e, 0x65, 0x6f, 0x66, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70,\n\t0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x6e, 0x65,\n\t0x6f, 0x66, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x42, 0xc2, 0x01,\n\t0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0f, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,\n\t0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x65, 0x72, 0x63, 0x61, 0x72, 0x69, 0x2f, 0x67, 0x72, 0x70,\n\t0x63, 0x2d, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x67, 0x72, 0x70,\n\t0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xa2, 0x02, 0x03, 0x47, 0x46, 0x58, 0xaa, 0x02, 0x0f,\n\t0x47, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xca,\n\t0x02, 0x0f, 0x47, 0x72, 0x70, 0x63, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0xe2, 0x02, 0x1b, 0x47, 0x72, 0x70, 0x63, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea,\n\t0x02, 0x10, 0x47, 0x72, 0x70, 0x63, 0x3a, 0x3a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_grpc_federation_federation_proto_rawDescOnce sync.Once\n\tfile_grpc_federation_federation_proto_rawDescData = file_grpc_federation_federation_proto_rawDesc\n)\n\nfunc file_grpc_federation_federation_proto_rawDescGZIP() []byte {\n\tfile_grpc_federation_federation_proto_rawDescOnce.Do(func() {\n\t\tfile_grpc_federation_federation_proto_rawDescData = protoimpl.X.CompressGZIP(file_grpc_federation_federation_proto_rawDescData)\n\t})\n\treturn file_grpc_federation_federation_proto_rawDescData\n}\n\nvar file_grpc_federation_federation_proto_enumTypes = make([]protoimpl.EnumInfo, 2)\nvar file_grpc_federation_federation_proto_msgTypes = make([]protoimpl.MessageInfo, 48)\nvar file_grpc_federation_federation_proto_goTypes = []interface{}{\n\t(TypeKind)(0),                          // 0: grpc.federation.TypeKind\n\t(GRPCError_LogLevel)(0),                // 1: grpc.federation.GRPCError.LogLevel\n\t(*FileRule)(nil),                       // 2: grpc.federation.FileRule\n\t(*EnumRule)(nil),                       // 3: grpc.federation.EnumRule\n\t(*EnumValueRule)(nil),                  // 4: grpc.federation.EnumValueRule\n\t(*EnumValueAttribute)(nil),             // 5: grpc.federation.EnumValueAttribute\n\t(*OneofRule)(nil),                      // 6: grpc.federation.OneofRule\n\t(*ServiceRule)(nil),                    // 7: grpc.federation.ServiceRule\n\t(*Env)(nil),                            // 8: grpc.federation.Env\n\t(*ServiceVariable)(nil),                // 9: grpc.federation.ServiceVariable\n\t(*ServiceVariableValidationExpr)(nil),  // 10: grpc.federation.ServiceVariableValidationExpr\n\t(*EnvVar)(nil),                         // 11: grpc.federation.EnvVar\n\t(*EnvType)(nil),                        // 12: grpc.federation.EnvType\n\t(*EnvMapType)(nil),                     // 13: grpc.federation.EnvMapType\n\t(*EnvVarOption)(nil),                   // 14: grpc.federation.EnvVarOption\n\t(*MethodRule)(nil),                     // 15: grpc.federation.MethodRule\n\t(*MessageRule)(nil),                    // 16: grpc.federation.MessageRule\n\t(*VariableDefinition)(nil),             // 17: grpc.federation.VariableDefinition\n\t(*MapExpr)(nil),                        // 18: grpc.federation.MapExpr\n\t(*Iterator)(nil),                       // 19: grpc.federation.Iterator\n\t(*MessageExpr)(nil),                    // 20: grpc.federation.MessageExpr\n\t(*EnumExpr)(nil),                       // 21: grpc.federation.EnumExpr\n\t(*CallExpr)(nil),                       // 22: grpc.federation.CallExpr\n\t(*SwitchExpr)(nil),                     // 23: grpc.federation.SwitchExpr\n\t(*SwitchCaseExpr)(nil),                 // 24: grpc.federation.SwitchCaseExpr\n\t(*SwitchDefaultExpr)(nil),              // 25: grpc.federation.SwitchDefaultExpr\n\t(*GRPCError)(nil),                      // 26: grpc.federation.GRPCError\n\t(*GRPCErrorDetail)(nil),                // 27: grpc.federation.GRPCErrorDetail\n\t(*GRPCCallOption)(nil),                 // 28: grpc.federation.GRPCCallOption\n\t(*ValidationExpr)(nil),                 // 29: grpc.federation.ValidationExpr\n\t(*RetryPolicy)(nil),                    // 30: grpc.federation.RetryPolicy\n\t(*RetryPolicyConstant)(nil),            // 31: grpc.federation.RetryPolicyConstant\n\t(*RetryPolicyExponential)(nil),         // 32: grpc.federation.RetryPolicyExponential\n\t(*MethodRequest)(nil),                  // 33: grpc.federation.MethodRequest\n\t(*MethodResponse)(nil),                 // 34: grpc.federation.MethodResponse\n\t(*Argument)(nil),                       // 35: grpc.federation.Argument\n\t(*FieldRule)(nil),                      // 36: grpc.federation.FieldRule\n\t(*FieldOneof)(nil),                     // 37: grpc.federation.FieldOneof\n\t(*CELPlugin)(nil),                      // 38: grpc.federation.CELPlugin\n\t(*CELPluginExport)(nil),                // 39: grpc.federation.CELPluginExport\n\t(*CELPluginCapability)(nil),            // 40: grpc.federation.CELPluginCapability\n\t(*CELPluginEnvCapability)(nil),         // 41: grpc.federation.CELPluginEnvCapability\n\t(*CELPluginFileSystemCapability)(nil),  // 42: grpc.federation.CELPluginFileSystemCapability\n\t(*CELPluginNetworkCapability)(nil),     // 43: grpc.federation.CELPluginNetworkCapability\n\t(*CELFunction)(nil),                    // 44: grpc.federation.CELFunction\n\t(*CELReceiverType)(nil),                // 45: grpc.federation.CELReceiverType\n\t(*CELFunctionArgument)(nil),            // 46: grpc.federation.CELFunctionArgument\n\t(*CELType)(nil),                        // 47: grpc.federation.CELType\n\t(*CELMapType)(nil),                     // 48: grpc.federation.CELMapType\n\t(*CELVariable)(nil),                    // 49: grpc.federation.CELVariable\n\t(code.Code)(0),                         // 50: google.rpc.Code\n\t(*errdetails.ErrorInfo)(nil),           // 51: google.rpc.ErrorInfo\n\t(*errdetails.RetryInfo)(nil),           // 52: google.rpc.RetryInfo\n\t(*errdetails.DebugInfo)(nil),           // 53: google.rpc.DebugInfo\n\t(*errdetails.QuotaFailure)(nil),        // 54: google.rpc.QuotaFailure\n\t(*errdetails.PreconditionFailure)(nil), // 55: google.rpc.PreconditionFailure\n\t(*errdetails.BadRequest)(nil),          // 56: google.rpc.BadRequest\n\t(*errdetails.RequestInfo)(nil),         // 57: google.rpc.RequestInfo\n\t(*errdetails.ResourceInfo)(nil),        // 58: google.rpc.ResourceInfo\n\t(*errdetails.Help)(nil),                // 59: google.rpc.Help\n\t(*errdetails.LocalizedMessage)(nil),    // 60: google.rpc.LocalizedMessage\n\t(*descriptorpb.FileOptions)(nil),       // 61: google.protobuf.FileOptions\n\t(*descriptorpb.ServiceOptions)(nil),    // 62: google.protobuf.ServiceOptions\n\t(*descriptorpb.MethodOptions)(nil),     // 63: google.protobuf.MethodOptions\n\t(*descriptorpb.MessageOptions)(nil),    // 64: google.protobuf.MessageOptions\n\t(*descriptorpb.FieldOptions)(nil),      // 65: google.protobuf.FieldOptions\n\t(*descriptorpb.EnumOptions)(nil),       // 66: google.protobuf.EnumOptions\n\t(*descriptorpb.EnumValueOptions)(nil),  // 67: google.protobuf.EnumValueOptions\n\t(*descriptorpb.OneofOptions)(nil),      // 68: google.protobuf.OneofOptions\n}\nvar file_grpc_federation_federation_proto_depIdxs = []int32{\n\t38, // 0: grpc.federation.FileRule.plugin:type_name -> grpc.federation.CELPlugin\n\t5,  // 1: grpc.federation.EnumValueRule.attr:type_name -> grpc.federation.EnumValueAttribute\n\t8,  // 2: grpc.federation.ServiceRule.env:type_name -> grpc.federation.Env\n\t9,  // 3: grpc.federation.ServiceRule.var:type_name -> grpc.federation.ServiceVariable\n\t11, // 4: grpc.federation.Env.var:type_name -> grpc.federation.EnvVar\n\t18, // 5: grpc.federation.ServiceVariable.map:type_name -> grpc.federation.MapExpr\n\t20, // 6: grpc.federation.ServiceVariable.message:type_name -> grpc.federation.MessageExpr\n\t10, // 7: grpc.federation.ServiceVariable.validation:type_name -> grpc.federation.ServiceVariableValidationExpr\n\t21, // 8: grpc.federation.ServiceVariable.enum:type_name -> grpc.federation.EnumExpr\n\t23, // 9: grpc.federation.ServiceVariable.switch:type_name -> grpc.federation.SwitchExpr\n\t12, // 10: grpc.federation.EnvVar.type:type_name -> grpc.federation.EnvType\n\t14, // 11: grpc.federation.EnvVar.option:type_name -> grpc.federation.EnvVarOption\n\t0,  // 12: grpc.federation.EnvType.kind:type_name -> grpc.federation.TypeKind\n\t12, // 13: grpc.federation.EnvType.repeated:type_name -> grpc.federation.EnvType\n\t13, // 14: grpc.federation.EnvType.map:type_name -> grpc.federation.EnvMapType\n\t12, // 15: grpc.federation.EnvMapType.key:type_name -> grpc.federation.EnvType\n\t12, // 16: grpc.federation.EnvMapType.value:type_name -> grpc.federation.EnvType\n\t17, // 17: grpc.federation.MessageRule.def:type_name -> grpc.federation.VariableDefinition\n\t18, // 18: grpc.federation.VariableDefinition.map:type_name -> grpc.federation.MapExpr\n\t20, // 19: grpc.federation.VariableDefinition.message:type_name -> grpc.federation.MessageExpr\n\t22, // 20: grpc.federation.VariableDefinition.call:type_name -> grpc.federation.CallExpr\n\t29, // 21: grpc.federation.VariableDefinition.validation:type_name -> grpc.federation.ValidationExpr\n\t21, // 22: grpc.federation.VariableDefinition.enum:type_name -> grpc.federation.EnumExpr\n\t23, // 23: grpc.federation.VariableDefinition.switch:type_name -> grpc.federation.SwitchExpr\n\t19, // 24: grpc.federation.MapExpr.iterator:type_name -> grpc.federation.Iterator\n\t20, // 25: grpc.federation.MapExpr.message:type_name -> grpc.federation.MessageExpr\n\t21, // 26: grpc.federation.MapExpr.enum:type_name -> grpc.federation.EnumExpr\n\t35, // 27: grpc.federation.MessageExpr.args:type_name -> grpc.federation.Argument\n\t33, // 28: grpc.federation.CallExpr.request:type_name -> grpc.federation.MethodRequest\n\t30, // 29: grpc.federation.CallExpr.retry:type_name -> grpc.federation.RetryPolicy\n\t26, // 30: grpc.federation.CallExpr.error:type_name -> grpc.federation.GRPCError\n\t28, // 31: grpc.federation.CallExpr.option:type_name -> grpc.federation.GRPCCallOption\n\t24, // 32: grpc.federation.SwitchExpr.case:type_name -> grpc.federation.SwitchCaseExpr\n\t25, // 33: grpc.federation.SwitchExpr.default:type_name -> grpc.federation.SwitchDefaultExpr\n\t17, // 34: grpc.federation.SwitchCaseExpr.def:type_name -> grpc.federation.VariableDefinition\n\t17, // 35: grpc.federation.SwitchDefaultExpr.def:type_name -> grpc.federation.VariableDefinition\n\t17, // 36: grpc.federation.GRPCError.def:type_name -> grpc.federation.VariableDefinition\n\t50, // 37: grpc.federation.GRPCError.code:type_name -> google.rpc.Code\n\t27, // 38: grpc.federation.GRPCError.details:type_name -> grpc.federation.GRPCErrorDetail\n\t1,  // 39: grpc.federation.GRPCError.log_level:type_name -> grpc.federation.GRPCError.LogLevel\n\t17, // 40: grpc.federation.GRPCErrorDetail.def:type_name -> grpc.federation.VariableDefinition\n\t20, // 41: grpc.federation.GRPCErrorDetail.message:type_name -> grpc.federation.MessageExpr\n\t51, // 42: grpc.federation.GRPCErrorDetail.error_info:type_name -> google.rpc.ErrorInfo\n\t52, // 43: grpc.federation.GRPCErrorDetail.retry_info:type_name -> google.rpc.RetryInfo\n\t53, // 44: grpc.federation.GRPCErrorDetail.debug_info:type_name -> google.rpc.DebugInfo\n\t54, // 45: grpc.federation.GRPCErrorDetail.quota_failure:type_name -> google.rpc.QuotaFailure\n\t55, // 46: grpc.federation.GRPCErrorDetail.precondition_failure:type_name -> google.rpc.PreconditionFailure\n\t56, // 47: grpc.federation.GRPCErrorDetail.bad_request:type_name -> google.rpc.BadRequest\n\t57, // 48: grpc.federation.GRPCErrorDetail.request_info:type_name -> google.rpc.RequestInfo\n\t58, // 49: grpc.federation.GRPCErrorDetail.resource_info:type_name -> google.rpc.ResourceInfo\n\t59, // 50: grpc.federation.GRPCErrorDetail.help:type_name -> google.rpc.Help\n\t60, // 51: grpc.federation.GRPCErrorDetail.localized_message:type_name -> google.rpc.LocalizedMessage\n\t26, // 52: grpc.federation.ValidationExpr.error:type_name -> grpc.federation.GRPCError\n\t31, // 53: grpc.federation.RetryPolicy.constant:type_name -> grpc.federation.RetryPolicyConstant\n\t32, // 54: grpc.federation.RetryPolicy.exponential:type_name -> grpc.federation.RetryPolicyExponential\n\t37, // 55: grpc.federation.FieldRule.oneof:type_name -> grpc.federation.FieldOneof\n\t14, // 56: grpc.federation.FieldRule.env:type_name -> grpc.federation.EnvVarOption\n\t17, // 57: grpc.federation.FieldOneof.def:type_name -> grpc.federation.VariableDefinition\n\t39, // 58: grpc.federation.CELPlugin.export:type_name -> grpc.federation.CELPluginExport\n\t45, // 59: grpc.federation.CELPluginExport.types:type_name -> grpc.federation.CELReceiverType\n\t44, // 60: grpc.federation.CELPluginExport.functions:type_name -> grpc.federation.CELFunction\n\t49, // 61: grpc.federation.CELPluginExport.variables:type_name -> grpc.federation.CELVariable\n\t40, // 62: grpc.federation.CELPluginExport.capability:type_name -> grpc.federation.CELPluginCapability\n\t41, // 63: grpc.federation.CELPluginCapability.env:type_name -> grpc.federation.CELPluginEnvCapability\n\t42, // 64: grpc.federation.CELPluginCapability.file_system:type_name -> grpc.federation.CELPluginFileSystemCapability\n\t43, // 65: grpc.federation.CELPluginCapability.network:type_name -> grpc.federation.CELPluginNetworkCapability\n\t46, // 66: grpc.federation.CELFunction.args:type_name -> grpc.federation.CELFunctionArgument\n\t47, // 67: grpc.federation.CELFunction.return:type_name -> grpc.federation.CELType\n\t44, // 68: grpc.federation.CELReceiverType.methods:type_name -> grpc.federation.CELFunction\n\t47, // 69: grpc.federation.CELFunctionArgument.type:type_name -> grpc.federation.CELType\n\t0,  // 70: grpc.federation.CELType.kind:type_name -> grpc.federation.TypeKind\n\t47, // 71: grpc.federation.CELType.repeated:type_name -> grpc.federation.CELType\n\t48, // 72: grpc.federation.CELType.map:type_name -> grpc.federation.CELMapType\n\t47, // 73: grpc.federation.CELMapType.key:type_name -> grpc.federation.CELType\n\t47, // 74: grpc.federation.CELMapType.value:type_name -> grpc.federation.CELType\n\t47, // 75: grpc.federation.CELVariable.type:type_name -> grpc.federation.CELType\n\t61, // 76: grpc.federation.file:extendee -> google.protobuf.FileOptions\n\t62, // 77: grpc.federation.service:extendee -> google.protobuf.ServiceOptions\n\t63, // 78: grpc.federation.method:extendee -> google.protobuf.MethodOptions\n\t64, // 79: grpc.federation.message:extendee -> google.protobuf.MessageOptions\n\t65, // 80: grpc.federation.field:extendee -> google.protobuf.FieldOptions\n\t66, // 81: grpc.federation.enum:extendee -> google.protobuf.EnumOptions\n\t67, // 82: grpc.federation.enum_value:extendee -> google.protobuf.EnumValueOptions\n\t68, // 83: grpc.federation.oneof:extendee -> google.protobuf.OneofOptions\n\t2,  // 84: grpc.federation.file:type_name -> grpc.federation.FileRule\n\t7,  // 85: grpc.federation.service:type_name -> grpc.federation.ServiceRule\n\t15, // 86: grpc.federation.method:type_name -> grpc.federation.MethodRule\n\t16, // 87: grpc.federation.message:type_name -> grpc.federation.MessageRule\n\t36, // 88: grpc.federation.field:type_name -> grpc.federation.FieldRule\n\t3,  // 89: grpc.federation.enum:type_name -> grpc.federation.EnumRule\n\t4,  // 90: grpc.federation.enum_value:type_name -> grpc.federation.EnumValueRule\n\t6,  // 91: grpc.federation.oneof:type_name -> grpc.federation.OneofRule\n\t92, // [92:92] is the sub-list for method output_type\n\t92, // [92:92] is the sub-list for method input_type\n\t84, // [84:92] is the sub-list for extension type_name\n\t76, // [76:84] is the sub-list for extension extendee\n\t0,  // [0:76] is the sub-list for field type_name\n}\n\nfunc init() { file_grpc_federation_federation_proto_init() }\nfunc file_grpc_federation_federation_proto_init() {\n\tif File_grpc_federation_federation_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_grpc_federation_federation_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*FileRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumValueRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumValueAttribute); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*OneofRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Env); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceVariable); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceVariableValidationExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvVar); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvMapType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvVarOption); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MethodRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MessageRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*VariableDefinition); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MapExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Iterator); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MessageExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CallExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SwitchExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SwitchCaseExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SwitchDefaultExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GRPCError); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GRPCErrorDetail); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GRPCCallOption); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ValidationExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RetryPolicy); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RetryPolicyConstant); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RetryPolicyExponential); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MethodRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MethodResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Argument); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*FieldRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*FieldOneof); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPlugin); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginExport); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginEnvCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginFileSystemCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginNetworkCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELFunction); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELReceiverType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELFunctionArgument); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELMapType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELVariable); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[2].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[7].OneofWrappers = []interface{}{\n\t\t(*ServiceVariable_By)(nil),\n\t\t(*ServiceVariable_Map)(nil),\n\t\t(*ServiceVariable_Message)(nil),\n\t\t(*ServiceVariable_Validation)(nil),\n\t\t(*ServiceVariable_Enum)(nil),\n\t\t(*ServiceVariable_Switch)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[9].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[10].OneofWrappers = []interface{}{\n\t\t(*EnvType_Kind)(nil),\n\t\t(*EnvType_Repeated)(nil),\n\t\t(*EnvType_Map)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[12].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[13].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[14].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[15].OneofWrappers = []interface{}{\n\t\t(*VariableDefinition_By)(nil),\n\t\t(*VariableDefinition_Map)(nil),\n\t\t(*VariableDefinition_Message)(nil),\n\t\t(*VariableDefinition_Call)(nil),\n\t\t(*VariableDefinition_Validation)(nil),\n\t\t(*VariableDefinition_Enum)(nil),\n\t\t(*VariableDefinition_Switch)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[16].OneofWrappers = []interface{}{\n\t\t(*MapExpr_By)(nil),\n\t\t(*MapExpr_Message)(nil),\n\t\t(*MapExpr_Enum)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[20].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[22].OneofWrappers = []interface{}{\n\t\t(*SwitchCaseExpr_By)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[23].OneofWrappers = []interface{}{\n\t\t(*SwitchDefaultExpr_By)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[24].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[26].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[27].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[28].OneofWrappers = []interface{}{\n\t\t(*RetryPolicy_Constant)(nil),\n\t\t(*RetryPolicy_Exponential)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[29].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[30].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[31].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[32].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[33].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[34].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[35].OneofWrappers = []interface{}{\n\t\t(*FieldOneof_If)(nil),\n\t\t(*FieldOneof_Default)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[38].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[45].OneofWrappers = []interface{}{\n\t\t(*CELType_Kind)(nil),\n\t\t(*CELType_Repeated)(nil),\n\t\t(*CELType_Map)(nil),\n\t\t(*CELType_Message)(nil),\n\t\t(*CELType_Enum)(nil),\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_grpc_federation_federation_proto_rawDesc,\n\t\t\tNumEnums:      2,\n\t\t\tNumMessages:   48,\n\t\t\tNumExtensions: 8,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_grpc_federation_federation_proto_goTypes,\n\t\tDependencyIndexes: file_grpc_federation_federation_proto_depIdxs,\n\t\tEnumInfos:         file_grpc_federation_federation_proto_enumTypes,\n\t\tMessageInfos:      file_grpc_federation_federation_proto_msgTypes,\n\t\tExtensionInfos:    file_grpc_federation_federation_proto_extTypes,\n\t}.Build()\n\tFile_grpc_federation_federation_proto = out.File\n\tfile_grpc_federation_federation_proto_rawDesc = nil\n\tfile_grpc_federation_federation_proto_goTypes = nil\n\tfile_grpc_federation_federation_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/10_oneof/main_test.go",
    "content": "package main_test\n\nimport (\n\t\"context\"\n\t\"log/slog\"\n\t\"net\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\"\n\t\"go.opentelemetry.io/otel/propagation\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\tsdktrace \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.4.0\"\n\t\"go.uber.org/goleak\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/codes\"\n\t\"google.golang.org/grpc/status\"\n\t\"google.golang.org/grpc/test/bufconn\"\n\n\t\"example/federation\"\n\tuser \"example/user\"\n)\n\nconst bufSize = 1024\n\nvar (\n\tlistener   *bufconn.Listener\n\tuserClient user.UserServiceClient\n)\n\nfunc dialer(ctx context.Context, address string) (net.Conn, error) {\n\treturn listener.Dial()\n}\n\ntype clientConfig struct{}\n\nfunc (c *clientConfig) User_UserServiceClient(cfg federation.FederationServiceClientConfig) (user.UserServiceClient, error) {\n\treturn userClient, nil\n}\n\ntype UserServer struct {\n\t*user.UnimplementedUserServiceServer\n}\n\nfunc (s *UserServer) GetUser(ctx context.Context, req *user.GetUserRequest) (*user.GetUserResponse, error) {\n\treturn &user.GetUserResponse{\n\t\tUser: &user.User{\n\t\t\tId: req.Id,\n\t\t},\n\t}, nil\n}\n\nfunc TestFederation(t *testing.T) {\n\tdefer goleak.VerifyNone(t)\n\tctx := context.Background()\n\tlistener = bufconn.Listen(bufSize)\n\n\tif os.Getenv(\"ENABLE_JAEGER\") != \"\" {\n\t\texporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithInsecure())\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttp := sdktrace.NewTracerProvider(\n\t\t\tsdktrace.WithBatcher(exporter),\n\t\t\tsdktrace.WithResource(\n\t\t\t\tresource.NewWithAttributes(\n\t\t\t\t\tsemconv.SchemaURL,\n\t\t\t\t\tsemconv.ServiceNameKey.String(\"example10/oneof\"),\n\t\t\t\t\tsemconv.ServiceVersionKey.String(\"1.0.0\"),\n\t\t\t\t\tattribute.String(\"environment\", \"dev\"),\n\t\t\t\t),\n\t\t\t),\n\t\t\tsdktrace.WithSampler(sdktrace.AlwaysSample()),\n\t\t)\n\t\tdefer tp.Shutdown(ctx)\n\t\totel.SetTextMapPropagator(propagation.TraceContext{})\n\t\totel.SetTracerProvider(tp)\n\t}\n\n\tconn, err := grpc.DialContext(ctx, \"\", grpc.WithContextDialer(dialer), grpc.WithInsecure())\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer conn.Close()\n\n\tuserClient = user.NewUserServiceClient(conn)\n\n\tgrpcServer := grpc.NewServer()\n\tdefer grpcServer.Stop()\n\n\tlogger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{\n\t\tLevel: slog.LevelDebug,\n\t}))\n\tfederationServer, err := federation.NewFederationService(federation.FederationServiceConfig{\n\t\tClient: new(clientConfig),\n\t\tLogger: logger,\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer federation.CleanupFederationService(ctx, federationServer)\n\n\tuser.RegisterUserServiceServer(grpcServer, &UserServer{})\n\tfederation.RegisterFederationServiceServer(grpcServer, federationServer)\n\n\tgo func() {\n\t\tif err := grpcServer.Serve(listener); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t}()\n\n\tclient := federation.NewFederationServiceClient(conn)\n\tres, err := client.Get(ctx, &federation.GetRequest{})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif diff := cmp.Diff(res, &federation.GetResponse{\n\t\tUser: &federation.User{\n\t\t\tId: \"b\",\n\t\t},\n\t\tMsg: \"bbb\",\n\t\tNestedMsg: &federation.NestedMessageSelection_Nest{\n\t\t\tValue: &federation.NestedMessageSelection_Nest_Int{Int: 1},\n\t\t},\n\t\tCastOneof: &federation.CastOneof{\n\t\t\tCastOneof: &federation.CastOneof_Type{\n\t\t\t\tType: federation.UserType_USER_TYPE_ANONYMOUS,\n\t\t\t},\n\t\t},\n\t}, cmpopts.IgnoreUnexported(\n\t\tfederation.GetResponse{},\n\t\tfederation.User{},\n\t\tfederation.NestedMessageSelection_Nest{},\n\t\tfederation.NestedMessageSelection_Nest_Int{},\n\t\tfederation.CastOneof{},\n\t\tfederation.CastOneof_Type{},\n\t)); diff != \"\" {\n\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t}\n}\n\nfunc TestFederation_NoValue(t *testing.T) {\n\tdefer goleak.VerifyNone(t)\n\tctx := context.Background()\n\tlistener = bufconn.Listen(bufSize)\n\n\tif os.Getenv(\"ENABLE_JAEGER\") != \"\" {\n\t\texporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithInsecure())\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttp := sdktrace.NewTracerProvider(\n\t\t\tsdktrace.WithBatcher(exporter),\n\t\t\tsdktrace.WithResource(\n\t\t\t\tresource.NewWithAttributes(\n\t\t\t\t\tsemconv.SchemaURL,\n\t\t\t\t\tsemconv.ServiceNameKey.String(\"example10/oneof\"),\n\t\t\t\t\tsemconv.ServiceVersionKey.String(\"1.0.0\"),\n\t\t\t\t\tattribute.String(\"environment\", \"dev\"),\n\t\t\t\t),\n\t\t\t),\n\t\t\tsdktrace.WithSampler(sdktrace.AlwaysSample()),\n\t\t)\n\t\tdefer tp.Shutdown(ctx)\n\t\totel.SetTextMapPropagator(propagation.TraceContext{})\n\t\totel.SetTracerProvider(tp)\n\t}\n\n\tconn, err := grpc.DialContext(ctx, \"\", grpc.WithContextDialer(dialer), grpc.WithInsecure())\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer conn.Close()\n\n\tuserClient = user.NewUserServiceClient(conn)\n\n\tgrpcServer := grpc.NewServer()\n\tdefer grpcServer.Stop()\n\n\tlogger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{\n\t\tLevel: slog.LevelDebug,\n\t}))\n\tfederationServer, err := federation.NewFederationService(federation.FederationServiceConfig{\n\t\tClient: new(clientConfig),\n\t\tLogger: logger,\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer federation.CleanupFederationService(ctx, federationServer)\n\n\tuser.RegisterUserServiceServer(grpcServer, &UserServer{})\n\tfederation.RegisterFederationServiceServer(grpcServer, federationServer)\n\n\tgo func() {\n\t\tif err := grpcServer.Serve(listener); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t}()\n\n\tclient := federation.NewFederationServiceClient(conn)\n\t_, err = client.GetNoValue(ctx, &federation.GetNoValueRequest{})\n\tif err == nil {\n\t\tt.Fatal(\"unexpected error nil\")\n\t}\n\texpectedErr := status.New(codes.Unknown, \"NoValue is invalid field\")\n\tif diff := cmp.Diff(err.Error(), expectedErr.Err().Error()); diff != \"\" {\n\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t}\n}\n"
  },
  {
    "path": "_examples/10_oneof/proto/buf.yaml",
    "content": "version: v1\nbreaking:\n  use:\n    - FILE\nlint:\n  use:\n    - DEFAULT\n"
  },
  {
    "path": "_examples/10_oneof/proto/federation/federation.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\noption (grpc.federation.file)= {\n  import: [\"user/user.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc Get(GetRequest) returns (GetResponse) {};\n  rpc GetNoValue(GetNoValueRequest) returns (GetNoValueResponse) {};\n}\n\nmessage GetRequest {}\n\nmessage GetResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"sel\"\n      message {\n        name: \"UserSelection\"\n        args { name: \"value\", by: \"'foo'\" }\n      }\n    }\n    def { name: \"msg_sel\" message { name: \"MessageSelection\" } }\n    def { name: \"nested_msg\" message { name: \"NestedMessageSelection.Nest\" }}\n    def { name: \"cast_oneof\" message { name: \"CastOneof\" } }\n  };\n  User user = 1 [(grpc.federation.field).by = \"sel.user\"];\n  string msg = 2 [(grpc.federation.field).by = \"msg_sel.message\"];\n  NestedMessageSelection.Nest nested_msg = 3 [(grpc.federation.field).by = \"nested_msg\"];\n  CastOneof cast_oneof = 4 [(grpc.federation.field).by = \"cast_oneof\"];\n}\n\nmessage GetNoValueRequest {}\n\nmessage GetNoValueResponse {\n  option (grpc.federation.message) = {\n    def { name: \"no_value_sel\" message { name: \"NoValueSelection\" } }\n  };\n  M no_value = 1 [(grpc.federation.field).by = \"no_value_sel.no_value\"];\n}\n\nmessage UserSelection {\n  oneof user {\n    User user_a = 1 [\n      (grpc.federation.field).oneof = {\n        if: \"false\"\n        def {\n          name: \"ua\"\n          message {\n            name: \"User\"\n            args [\n             { name: \"user_id\", by: \"'a'\" },\n             { name: \"foo\" by: \"0\" },\n             { name: \"bar\" by: \"'hello'\"}\n            ]\n          }\n        }\n        by: \"ua\"\n      }\n    ];\n\n    User user_b = 2 [\n      (grpc.federation.field).oneof = {\n        if: \"true\"\n        def {\n          name: \"ub\"\n          message {\n            name: \"User\"\n            args [\n              { name: \"user_id\", by: \"'b'\" },\n              { name: \"foo\" by: \"0\" },\n              { name: \"bar\" by: \"'hello'\"}\n            ]\n          }\n        }\n        by: \"ub\"\n      }\n    ];\n\n    User user_c = 3 [\n      (grpc.federation.field).oneof = {\n        default: true\n        def {\n          name: \"uc\"\n          message {\n            name: \"User\"\n            args [\n              { name: \"user_id\", by: \"$.value\" },\n              { name: \"foo\" by: \"0\" },\n              { name: \"bar\" by: \"'hello'\"}\n            ]\n          }\n        }\n        by: \"uc\"\n      }\n    ];\n  }\n}\n\nmessage MessageSelection {\n  oneof message {\n    string msg_a = 1 [\n      (grpc.federation.field).oneof = {\n        if: \"false\"\n        by: \"'aaa'\"\n      }\n    ];\n    string msg_b = 2 [\n      (grpc.federation.field).oneof = {\n        if: \"true\"\n        by: \"'bbb'\"\n      }\n    ];\n    string msg_c = 3 [\n      (grpc.federation.field).oneof = {\n        default: true\n        by: \"'ccc'\"\n      }\n    ];\n  }\n}\n\nmessage NoValueSelection {\n  oneof no_value {\n    M m_a = 1 [\n      (grpc.federation.field).oneof = {\n        if: \"false\"\n        by: \"M{value: 'a'}\"\n      }\n    ];\n    M m_b = 2 [\n      (grpc.federation.field).oneof = {\n        if: \"false\"\n        by: \"M{value: 'b'}\"\n      }\n    ];\n  }\n}\n\nmessage NestedMessageSelection {\n  message Nest {\n    oneof value {\n      int64 int = 1 [(grpc.federation.field).oneof = {\n        if: \"true\"\n        by: \"1\"\n      }];\n      string text = 2 [(grpc.federation.field).oneof = {\n        if: \"false\"\n        by: \"'foo'\"\n      }];\n    }\n  }\n}\n\nmessage CastOneof {\n  oneof cast_oneof {\n    int64 num = 1 [(grpc.federation.field).oneof = {\n      if: \"false\"\n      by: \"uint(1)\"\n    }];\n    User user = 2 [(grpc.federation.field).oneof = {\n      if: \"false\"\n      by: \"user.User{id: 'foo'}\"\n    }];\n    UserType type = 3 [(grpc.federation.field).oneof = {\n      if: \"true\"\n      by: \"user.UserType.value('USER_TYPE_ANONYMOUS')\"\n    }];\n  }\n}\n\nmessage M {\n  string value = 1 [(grpc.federation.field).by = \"'foo'\"];\n}\n\nmessage User {\n  option (grpc.federation.message) = {\n    alias: \"user.User\"\n    def {\n      call {\n        method: \"user.UserService/GetUser\"\n        request [\n          { field: \"id\", by: \"$.user_id\" },\n          { field: \"foo\" by: \"$.foo\" if: \"$.foo != 0\" },\n          { field: \"bar\" by: \"$.bar\" if: \"$.bar != ''\" }\n        ]\n      }\n    }\n  };\n\n  string id = 1 [(grpc.federation.field).by = \"$.user_id\"];\n}\n\nenum UserType {\n  option (grpc.federation.enum).alias = \"user.UserType\";\n\n  USER_TYPE_UNSPECIFIED = 0;\n  USER_TYPE_ANONYMOUS = 1;\n}"
  },
  {
    "path": "_examples/10_oneof/proto/user/user.proto",
    "content": "syntax = \"proto3\";\n\npackage user;\n\noption go_package = \"example/user;user\";\n\nservice UserService {\n  rpc GetUser(GetUserRequest) returns (GetUserResponse) {};\n}\n\nmessage GetUserRequest {\n  string id = 1;\n  oneof foobar {\n    int64 foo = 2;\n    string bar = 3;\n  }\n}\n\nmessage GetUserResponse {\n  User user = 1;\n}\n\nmessage User {\n  string id = 1;\n  string name = 2;\n}\n\nenum UserType {\n  USER_TYPE_UNSPECIFIED = 0;\n  USER_TYPE_ANONYMOUS = 1;\n}"
  },
  {
    "path": "_examples/10_oneof/user/user.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: user/user.proto\n\npackage user\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype UserType int32\n\nconst (\n\tUserType_USER_TYPE_UNSPECIFIED UserType = 0\n\tUserType_USER_TYPE_ANONYMOUS   UserType = 1\n)\n\n// Enum value maps for UserType.\nvar (\n\tUserType_name = map[int32]string{\n\t\t0: \"USER_TYPE_UNSPECIFIED\",\n\t\t1: \"USER_TYPE_ANONYMOUS\",\n\t}\n\tUserType_value = map[string]int32{\n\t\t\"USER_TYPE_UNSPECIFIED\": 0,\n\t\t\"USER_TYPE_ANONYMOUS\":   1,\n\t}\n)\n\nfunc (x UserType) Enum() *UserType {\n\tp := new(UserType)\n\t*p = x\n\treturn p\n}\n\nfunc (x UserType) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (UserType) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_user_user_proto_enumTypes[0].Descriptor()\n}\n\nfunc (UserType) Type() protoreflect.EnumType {\n\treturn &file_user_user_proto_enumTypes[0]\n}\n\nfunc (x UserType) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use UserType.Descriptor instead.\nfunc (UserType) EnumDescriptor() ([]byte, []int) {\n\treturn file_user_user_proto_rawDescGZIP(), []int{0}\n}\n\ntype GetUserRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\t// Types that are assignable to Foobar:\n\t//\n\t//\t*GetUserRequest_Foo\n\t//\t*GetUserRequest_Bar\n\tFoobar isGetUserRequest_Foobar `protobuf_oneof:\"foobar\"`\n}\n\nfunc (x *GetUserRequest) Reset() {\n\t*x = GetUserRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_user_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetUserRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetUserRequest) ProtoMessage() {}\n\nfunc (x *GetUserRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_user_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetUserRequest.ProtoReflect.Descriptor instead.\nfunc (*GetUserRequest) Descriptor() ([]byte, []int) {\n\treturn file_user_user_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetUserRequest) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (m *GetUserRequest) GetFoobar() isGetUserRequest_Foobar {\n\tif m != nil {\n\t\treturn m.Foobar\n\t}\n\treturn nil\n}\n\nfunc (x *GetUserRequest) GetFoo() int64 {\n\tif x, ok := x.GetFoobar().(*GetUserRequest_Foo); ok {\n\t\treturn x.Foo\n\t}\n\treturn 0\n}\n\nfunc (x *GetUserRequest) GetBar() string {\n\tif x, ok := x.GetFoobar().(*GetUserRequest_Bar); ok {\n\t\treturn x.Bar\n\t}\n\treturn \"\"\n}\n\ntype isGetUserRequest_Foobar interface {\n\tisGetUserRequest_Foobar()\n}\n\ntype GetUserRequest_Foo struct {\n\tFoo int64 `protobuf:\"varint,2,opt,name=foo,proto3,oneof\"`\n}\n\ntype GetUserRequest_Bar struct {\n\tBar string `protobuf:\"bytes,3,opt,name=bar,proto3,oneof\"`\n}\n\nfunc (*GetUserRequest_Foo) isGetUserRequest_Foobar() {}\n\nfunc (*GetUserRequest_Bar) isGetUserRequest_Foobar() {}\n\ntype GetUserResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUser *User `protobuf:\"bytes,1,opt,name=user,proto3\" json:\"user,omitempty\"`\n}\n\nfunc (x *GetUserResponse) Reset() {\n\t*x = GetUserResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_user_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetUserResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetUserResponse) ProtoMessage() {}\n\nfunc (x *GetUserResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_user_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetUserResponse.ProtoReflect.Descriptor instead.\nfunc (*GetUserResponse) Descriptor() ([]byte, []int) {\n\treturn file_user_user_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetUserResponse) GetUser() *User {\n\tif x != nil {\n\t\treturn x.User\n\t}\n\treturn nil\n}\n\ntype User struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId   string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *User) Reset() {\n\t*x = User{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_user_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *User) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*User) ProtoMessage() {}\n\nfunc (x *User) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_user_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use User.ProtoReflect.Descriptor instead.\nfunc (*User) Descriptor() ([]byte, []int) {\n\treturn file_user_user_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *User) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *User) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nvar File_user_user_proto protoreflect.FileDescriptor\n\nvar file_user_user_proto_rawDesc = []byte{\n\t0x0a, 0x0f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x52, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x55, 0x73,\n\t0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x03, 0x66, 0x6f, 0x6f,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x03, 0x66, 0x6f, 0x6f, 0x12, 0x12, 0x0a,\n\t0x03, 0x62, 0x61, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, 0x62, 0x61,\n\t0x72, 0x42, 0x08, 0x0a, 0x06, 0x66, 0x6f, 0x6f, 0x62, 0x61, 0x72, 0x22, 0x31, 0x0a, 0x0f, 0x47,\n\t0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e,\n\t0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x75,\n\t0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x2a,\n\t0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x2a, 0x3e, 0x0a, 0x08, 0x55, 0x73,\n\t0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, 0x15, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x54,\n\t0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10,\n\t0x00, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41,\n\t0x4e, 0x4f, 0x4e, 0x59, 0x4d, 0x4f, 0x55, 0x53, 0x10, 0x01, 0x32, 0x47, 0x0a, 0x0b, 0x55, 0x73,\n\t0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x38, 0x0a, 0x07, 0x47, 0x65, 0x74,\n\t0x55, 0x73, 0x65, 0x72, 0x12, 0x14, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x55,\n\t0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x75, 0x73, 0x65,\n\t0x72, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,\n\t0x65, 0x22, 0x00, 0x42, 0x58, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x42,\n\t0x09, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x11, 0x65, 0x78,\n\t0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x3b, 0x75, 0x73, 0x65, 0x72, 0xa2,\n\t0x02, 0x03, 0x55, 0x58, 0x58, 0xaa, 0x02, 0x04, 0x55, 0x73, 0x65, 0x72, 0xca, 0x02, 0x04, 0x55,\n\t0x73, 0x65, 0x72, 0xe2, 0x02, 0x10, 0x55, 0x73, 0x65, 0x72, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65,\n\t0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x04, 0x55, 0x73, 0x65, 0x72, 0x62, 0x06, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_user_user_proto_rawDescOnce sync.Once\n\tfile_user_user_proto_rawDescData = file_user_user_proto_rawDesc\n)\n\nfunc file_user_user_proto_rawDescGZIP() []byte {\n\tfile_user_user_proto_rawDescOnce.Do(func() {\n\t\tfile_user_user_proto_rawDescData = protoimpl.X.CompressGZIP(file_user_user_proto_rawDescData)\n\t})\n\treturn file_user_user_proto_rawDescData\n}\n\nvar file_user_user_proto_enumTypes = make([]protoimpl.EnumInfo, 1)\nvar file_user_user_proto_msgTypes = make([]protoimpl.MessageInfo, 3)\nvar file_user_user_proto_goTypes = []interface{}{\n\t(UserType)(0),           // 0: user.UserType\n\t(*GetUserRequest)(nil),  // 1: user.GetUserRequest\n\t(*GetUserResponse)(nil), // 2: user.GetUserResponse\n\t(*User)(nil),            // 3: user.User\n}\nvar file_user_user_proto_depIdxs = []int32{\n\t3, // 0: user.GetUserResponse.user:type_name -> user.User\n\t1, // 1: user.UserService.GetUser:input_type -> user.GetUserRequest\n\t2, // 2: user.UserService.GetUser:output_type -> user.GetUserResponse\n\t2, // [2:3] is the sub-list for method output_type\n\t1, // [1:2] is the sub-list for method input_type\n\t1, // [1:1] is the sub-list for extension type_name\n\t1, // [1:1] is the sub-list for extension extendee\n\t0, // [0:1] is the sub-list for field type_name\n}\n\nfunc init() { file_user_user_proto_init() }\nfunc file_user_user_proto_init() {\n\tif File_user_user_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_user_user_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetUserRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_user_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetUserResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_user_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*User); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\tfile_user_user_proto_msgTypes[0].OneofWrappers = []interface{}{\n\t\t(*GetUserRequest_Foo)(nil),\n\t\t(*GetUserRequest_Bar)(nil),\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_user_user_proto_rawDesc,\n\t\t\tNumEnums:      1,\n\t\t\tNumMessages:   3,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_user_user_proto_goTypes,\n\t\tDependencyIndexes: file_user_user_proto_depIdxs,\n\t\tEnumInfos:         file_user_user_proto_enumTypes,\n\t\tMessageInfos:      file_user_user_proto_msgTypes,\n\t}.Build()\n\tFile_user_user_proto = out.File\n\tfile_user_user_proto_rawDesc = nil\n\tfile_user_user_proto_goTypes = nil\n\tfile_user_user_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/10_oneof/user/user_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: user/user.proto\n\npackage user\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tUserService_GetUser_FullMethodName = \"/user.UserService/GetUser\"\n)\n\n// UserServiceClient is the client API for UserService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype UserServiceClient interface {\n\tGetUser(ctx context.Context, in *GetUserRequest, opts ...grpc.CallOption) (*GetUserResponse, error)\n}\n\ntype userServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewUserServiceClient(cc grpc.ClientConnInterface) UserServiceClient {\n\treturn &userServiceClient{cc}\n}\n\nfunc (c *userServiceClient) GetUser(ctx context.Context, in *GetUserRequest, opts ...grpc.CallOption) (*GetUserResponse, error) {\n\tout := new(GetUserResponse)\n\terr := c.cc.Invoke(ctx, UserService_GetUser_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// UserServiceServer is the server API for UserService service.\n// All implementations must embed UnimplementedUserServiceServer\n// for forward compatibility\ntype UserServiceServer interface {\n\tGetUser(context.Context, *GetUserRequest) (*GetUserResponse, error)\n\tmustEmbedUnimplementedUserServiceServer()\n}\n\n// UnimplementedUserServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedUserServiceServer struct {\n}\n\nfunc (UnimplementedUserServiceServer) GetUser(context.Context, *GetUserRequest) (*GetUserResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetUser not implemented\")\n}\nfunc (UnimplementedUserServiceServer) mustEmbedUnimplementedUserServiceServer() {}\n\n// UnsafeUserServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to UserServiceServer will\n// result in compilation errors.\ntype UnsafeUserServiceServer interface {\n\tmustEmbedUnimplementedUserServiceServer()\n}\n\nfunc RegisterUserServiceServer(s grpc.ServiceRegistrar, srv UserServiceServer) {\n\ts.RegisterService(&UserService_ServiceDesc, srv)\n}\n\nfunc _UserService_GetUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetUserRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServiceServer).GetUser(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: UserService_GetUser_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServiceServer).GetUser(ctx, req.(*GetUserRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// UserService_ServiceDesc is the grpc.ServiceDesc for UserService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar UserService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"user.UserService\",\n\tHandlerType: (*UserServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetUser\",\n\t\t\tHandler:    _UserService_GetUser_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"user/user.proto\",\n}\n"
  },
  {
    "path": "_examples/11_multi_service/.gitignore",
    "content": "grpc/federation\n"
  },
  {
    "path": "_examples/11_multi_service/Makefile",
    "content": "MAKEFILE_DIR := $(dir $(lastword $(MAKEFILE_LIST)))\nGOBIN := $(MAKEFILE_DIR)/../../bin\nPATH := $(GOBIN):$(PATH)\n\nJAEGER_IMAGE := jaegertracing/all-in-one:latest\n\n.PHONY: generate\ngenerate:\n\t$(GOBIN)/buf generate\n\n.PHONY: lint\nlint:\n\t@$(GOBIN)/grpc-federation-linter -Iproto -Iproto_deps ./proto/federation/federation.proto\n\n.PHONY: test\ntest:\n\tgo test -race ./ -count=1\n\n.PHONY: grpc-federation/generate\ngrpc-federation/generate:\n\t@$(GOBIN)/grpc-federation-generator ./proto/federation/federation.proto\n\n.PHONY: grpc-federation/watch\ngrpc-federation/watch:\n\t@$(GOBIN)/grpc-federation-generator -w\n\n.PHONY: jaeger/start\njaeger/start:\n\t@docker run \\\n\t\t-e COLLECTOR_OTLP_ENABLED=true \\\n\t\t-p 16686:16686 \\\n\t\t-p 4317:4317 \\\n\t\t-p 4318:4318 \\\n\t\t-d \\\n\t\t$(JAEGER_IMAGE)\n\n.PHONY: jaeger/stop\njaeger/stop:\n\t@docker stop $(shell docker ps -q  --filter ancestor=$(JAEGER_IMAGE))\n"
  },
  {
    "path": "_examples/11_multi_service/buf.gen.yaml",
    "content": "version: v1\nmanaged:\n  enabled: true\nplugins:\n  - plugin: go\n    out: .\n    opt: paths=source_relative\n  - plugin: go-grpc\n    out: .\n    opt: paths=source_relative\n  - plugin: grpc-federation\n    out: .\n    opt:\n    - paths=source_relative\n    - import_paths=proto\n"
  },
  {
    "path": "_examples/11_multi_service/buf.work.yaml",
    "content": "version: v1\ndirectories:\n  - proto\n  - proto_deps\n"
  },
  {
    "path": "_examples/11_multi_service/comment/comment.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: comment/comment.proto\n\npackage comment\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CommentType int32\n\nconst (\n\tCommentType_UNKNOWN CommentType = 0\n\tCommentType_TYPE1   CommentType = 1\n\tCommentType_TYPE2   CommentType = 2\n)\n\n// Enum value maps for CommentType.\nvar (\n\tCommentType_name = map[int32]string{\n\t\t0: \"UNKNOWN\",\n\t\t1: \"TYPE1\",\n\t\t2: \"TYPE2\",\n\t}\n\tCommentType_value = map[string]int32{\n\t\t\"UNKNOWN\": 0,\n\t\t\"TYPE1\":   1,\n\t\t\"TYPE2\":   2,\n\t}\n)\n\nfunc (x CommentType) Enum() *CommentType {\n\tp := new(CommentType)\n\t*p = x\n\treturn p\n}\n\nfunc (x CommentType) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (CommentType) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_comment_comment_proto_enumTypes[0].Descriptor()\n}\n\nfunc (CommentType) Type() protoreflect.EnumType {\n\treturn &file_comment_comment_proto_enumTypes[0]\n}\n\nfunc (x CommentType) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use CommentType.Descriptor instead.\nfunc (CommentType) EnumDescriptor() ([]byte, []int) {\n\treturn file_comment_comment_proto_rawDescGZIP(), []int{0}\n}\n\nvar File_comment_comment_proto protoreflect.FileDescriptor\n\nvar file_comment_comment_proto_rawDesc = []byte{\n\t0x0a, 0x15, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e,\n\t0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74,\n\t0x2a, 0x30, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12,\n\t0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05,\n\t0x54, 0x59, 0x50, 0x45, 0x31, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x54, 0x59, 0x50, 0x45, 0x32,\n\t0x10, 0x02, 0x42, 0x70, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e,\n\t0x74, 0x42, 0x0c, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50,\n\t0x01, 0x5a, 0x17, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x65,\n\t0x6e, 0x74, 0x3b, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0xa2, 0x02, 0x03, 0x43, 0x58, 0x58,\n\t0xaa, 0x02, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0xca, 0x02, 0x07, 0x43, 0x6f, 0x6d,\n\t0x6d, 0x65, 0x6e, 0x74, 0xe2, 0x02, 0x13, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x5c, 0x47,\n\t0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x07, 0x43, 0x6f, 0x6d,\n\t0x6d, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_comment_comment_proto_rawDescOnce sync.Once\n\tfile_comment_comment_proto_rawDescData = file_comment_comment_proto_rawDesc\n)\n\nfunc file_comment_comment_proto_rawDescGZIP() []byte {\n\tfile_comment_comment_proto_rawDescOnce.Do(func() {\n\t\tfile_comment_comment_proto_rawDescData = protoimpl.X.CompressGZIP(file_comment_comment_proto_rawDescData)\n\t})\n\treturn file_comment_comment_proto_rawDescData\n}\n\nvar file_comment_comment_proto_enumTypes = make([]protoimpl.EnumInfo, 1)\nvar file_comment_comment_proto_goTypes = []interface{}{\n\t(CommentType)(0), // 0: comment.CommentType\n}\nvar file_comment_comment_proto_depIdxs = []int32{\n\t0, // [0:0] is the sub-list for method output_type\n\t0, // [0:0] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_comment_comment_proto_init() }\nfunc file_comment_comment_proto_init() {\n\tif File_comment_comment_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_comment_comment_proto_rawDesc,\n\t\t\tNumEnums:      1,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_comment_comment_proto_goTypes,\n\t\tDependencyIndexes: file_comment_comment_proto_depIdxs,\n\t\tEnumInfos:         file_comment_comment_proto_enumTypes,\n\t}.Build()\n\tFile_comment_comment_proto = out.File\n\tfile_comment_comment_proto_rawDesc = nil\n\tfile_comment_comment_proto_goTypes = nil\n\tfile_comment_comment_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/11_multi_service/favorite/favorite.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: favorite/favorite.proto\n\npackage favorite\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype FavoriteType int32\n\nconst (\n\tFavoriteType_UNKNOWN FavoriteType = 0\n\tFavoriteType_TYPE1   FavoriteType = 1\n\tFavoriteType_TYPE2   FavoriteType = 2\n)\n\n// Enum value maps for FavoriteType.\nvar (\n\tFavoriteType_name = map[int32]string{\n\t\t0: \"UNKNOWN\",\n\t\t1: \"TYPE1\",\n\t\t2: \"TYPE2\",\n\t}\n\tFavoriteType_value = map[string]int32{\n\t\t\"UNKNOWN\": 0,\n\t\t\"TYPE1\":   1,\n\t\t\"TYPE2\":   2,\n\t}\n)\n\nfunc (x FavoriteType) Enum() *FavoriteType {\n\tp := new(FavoriteType)\n\t*p = x\n\treturn p\n}\n\nfunc (x FavoriteType) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (FavoriteType) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_favorite_favorite_proto_enumTypes[0].Descriptor()\n}\n\nfunc (FavoriteType) Type() protoreflect.EnumType {\n\treturn &file_favorite_favorite_proto_enumTypes[0]\n}\n\nfunc (x FavoriteType) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use FavoriteType.Descriptor instead.\nfunc (FavoriteType) EnumDescriptor() ([]byte, []int) {\n\treturn file_favorite_favorite_proto_rawDescGZIP(), []int{0}\n}\n\nvar File_favorite_favorite_proto protoreflect.FileDescriptor\n\nvar file_favorite_favorite_proto_rawDesc = []byte{\n\t0x0a, 0x17, 0x66, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x2f, 0x66, 0x61, 0x76, 0x6f, 0x72,\n\t0x69, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x66, 0x61, 0x76, 0x6f, 0x72,\n\t0x69, 0x74, 0x65, 0x1a, 0x20, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2a, 0x4d, 0x0a, 0x0c, 0x46, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74,\n\t0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e,\n\t0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x54, 0x59, 0x50, 0x45, 0x31, 0x10, 0x01, 0x12, 0x09, 0x0a,\n\t0x05, 0x54, 0x59, 0x50, 0x45, 0x32, 0x10, 0x02, 0x1a, 0x1a, 0x9a, 0x4a, 0x17, 0x0a, 0x15, 0x66,\n\t0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x2e, 0x46, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65,\n\t0x54, 0x79, 0x70, 0x65, 0x42, 0x78, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x2e, 0x66, 0x61, 0x76, 0x6f,\n\t0x72, 0x69, 0x74, 0x65, 0x42, 0x0d, 0x46, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x50, 0x72,\n\t0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x19, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x66,\n\t0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x3b, 0x66, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65,\n\t0xa2, 0x02, 0x03, 0x46, 0x58, 0x58, 0xaa, 0x02, 0x08, 0x46, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74,\n\t0x65, 0xca, 0x02, 0x08, 0x46, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0xe2, 0x02, 0x14, 0x46,\n\t0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64,\n\t0x61, 0x74, 0x61, 0xea, 0x02, 0x08, 0x46, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x62, 0x06,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_favorite_favorite_proto_rawDescOnce sync.Once\n\tfile_favorite_favorite_proto_rawDescData = file_favorite_favorite_proto_rawDesc\n)\n\nfunc file_favorite_favorite_proto_rawDescGZIP() []byte {\n\tfile_favorite_favorite_proto_rawDescOnce.Do(func() {\n\t\tfile_favorite_favorite_proto_rawDescData = protoimpl.X.CompressGZIP(file_favorite_favorite_proto_rawDescData)\n\t})\n\treturn file_favorite_favorite_proto_rawDescData\n}\n\nvar file_favorite_favorite_proto_enumTypes = make([]protoimpl.EnumInfo, 1)\nvar file_favorite_favorite_proto_goTypes = []interface{}{\n\t(FavoriteType)(0), // 0: favorite.FavoriteType\n}\nvar file_favorite_favorite_proto_depIdxs = []int32{\n\t0, // [0:0] is the sub-list for method output_type\n\t0, // [0:0] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_favorite_favorite_proto_init() }\nfunc file_favorite_favorite_proto_init() {\n\tif File_favorite_favorite_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_favorite_favorite_proto_rawDesc,\n\t\t\tNumEnums:      1,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_favorite_favorite_proto_goTypes,\n\t\tDependencyIndexes: file_favorite_favorite_proto_depIdxs,\n\t\tEnumInfos:         file_favorite_favorite_proto_enumTypes,\n\t}.Build()\n\tFile_favorite_favorite_proto = out.File\n\tfile_favorite_favorite_proto_rawDesc = nil\n\tfile_favorite_favorite_proto_goTypes = nil\n\tfile_favorite_favorite_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/11_multi_service/federation/federation.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype MyFavoriteType int32\n\nconst (\n\tMyFavoriteType_UNKNOWN MyFavoriteType = 0\n\tMyFavoriteType_TYPE1   MyFavoriteType = 5000\n)\n\n// Enum value maps for MyFavoriteType.\nvar (\n\tMyFavoriteType_name = map[int32]string{\n\t\t0:    \"UNKNOWN\",\n\t\t5000: \"TYPE1\",\n\t}\n\tMyFavoriteType_value = map[string]int32{\n\t\t\"UNKNOWN\": 0,\n\t\t\"TYPE1\":   5000,\n\t}\n)\n\nfunc (x MyFavoriteType) Enum() *MyFavoriteType {\n\tp := new(MyFavoriteType)\n\t*p = x\n\treturn p\n}\n\nfunc (x MyFavoriteType) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (MyFavoriteType) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_federation_federation_proto_enumTypes[0].Descriptor()\n}\n\nfunc (MyFavoriteType) Type() protoreflect.EnumType {\n\treturn &file_federation_federation_proto_enumTypes[0]\n}\n\nfunc (x MyFavoriteType) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use MyFavoriteType.Descriptor instead.\nfunc (MyFavoriteType) EnumDescriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\ntype GetPostRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetPostRequest) Reset() {\n\t*x = GetPostRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostRequest) ProtoMessage() {}\n\nfunc (x *GetPostRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostRequest.ProtoReflect.Descriptor instead.\nfunc (*GetPostRequest) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetPostRequest) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\ntype GetPostResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPost      *Post                `protobuf:\"bytes,1,opt,name=post,proto3\" json:\"post,omitempty\"`\n\tUpperName string               `protobuf:\"bytes,2,opt,name=upper_name,json=upperName,proto3\" json:\"upper_name,omitempty\"`\n\tFoo       *GetPostResponse_Foo `protobuf:\"bytes,3,opt,name=foo,proto3\" json:\"foo,omitempty\"`\n}\n\nfunc (x *GetPostResponse) Reset() {\n\t*x = GetPostResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostResponse) ProtoMessage() {}\n\nfunc (x *GetPostResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostResponse.ProtoReflect.Descriptor instead.\nfunc (*GetPostResponse) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetPostResponse) GetPost() *Post {\n\tif x != nil {\n\t\treturn x.Post\n\t}\n\treturn nil\n}\n\nfunc (x *GetPostResponse) GetUpperName() string {\n\tif x != nil {\n\t\treturn x.UpperName\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetPostResponse) GetFoo() *GetPostResponse_Foo {\n\tif x != nil {\n\t\treturn x.Foo\n\t}\n\treturn nil\n}\n\ntype Post struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId            string         `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tTitle         string         `protobuf:\"bytes,2,opt,name=title,proto3\" json:\"title,omitempty\"`\n\tContent       string         `protobuf:\"bytes,3,opt,name=content,proto3\" json:\"content,omitempty\"`\n\tUser          *User          `protobuf:\"bytes,4,opt,name=user,proto3\" json:\"user,omitempty\"`\n\tReaction      *Reaction      `protobuf:\"bytes,5,opt,name=reaction,proto3\" json:\"reaction,omitempty\"`\n\tFavoriteValue MyFavoriteType `protobuf:\"varint,6,opt,name=favorite_value,json=favoriteValue,proto3,enum=federation.MyFavoriteType\" json:\"favorite_value,omitempty\"`\n\tCmp           bool           `protobuf:\"varint,7,opt,name=cmp,proto3\" json:\"cmp,omitempty\"`\n}\n\nfunc (x *Post) Reset() {\n\t*x = Post{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Post) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Post) ProtoMessage() {}\n\nfunc (x *Post) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Post.ProtoReflect.Descriptor instead.\nfunc (*Post) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *Post) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetTitle() string {\n\tif x != nil {\n\t\treturn x.Title\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetContent() string {\n\tif x != nil {\n\t\treturn x.Content\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetUser() *User {\n\tif x != nil {\n\t\treturn x.User\n\t}\n\treturn nil\n}\n\nfunc (x *Post) GetReaction() *Reaction {\n\tif x != nil {\n\t\treturn x.Reaction\n\t}\n\treturn nil\n}\n\nfunc (x *Post) GetFavoriteValue() MyFavoriteType {\n\tif x != nil {\n\t\treturn x.FavoriteValue\n\t}\n\treturn MyFavoriteType_UNKNOWN\n}\n\nfunc (x *Post) GetCmp() bool {\n\tif x != nil {\n\t\treturn x.Cmp\n\t}\n\treturn false\n}\n\ntype User struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId   string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *User) Reset() {\n\t*x = User{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *User) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*User) ProtoMessage() {}\n\nfunc (x *User) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use User.ProtoReflect.Descriptor instead.\nfunc (*User) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *User) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *User) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\ntype GetNameRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *GetNameRequest) Reset() {\n\t*x = GetNameRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetNameRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetNameRequest) ProtoMessage() {}\n\nfunc (x *GetNameRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetNameRequest.ProtoReflect.Descriptor instead.\nfunc (*GetNameRequest) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{4}\n}\n\ntype GetNameResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName string               `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tFoo  *GetNameResponse_Foo `protobuf:\"bytes,2,opt,name=foo,proto3\" json:\"foo,omitempty\"`\n}\n\nfunc (x *GetNameResponse) Reset() {\n\t*x = GetNameResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetNameResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetNameResponse) ProtoMessage() {}\n\nfunc (x *GetNameResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetNameResponse.ProtoReflect.Descriptor instead.\nfunc (*GetNameResponse) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *GetNameResponse) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetNameResponse) GetFoo() *GetNameResponse_Foo {\n\tif x != nil {\n\t\treturn x.Foo\n\t}\n\treturn nil\n}\n\ntype GetStatusRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *GetStatusRequest) Reset() {\n\t*x = GetStatusRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetStatusRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetStatusRequest) ProtoMessage() {}\n\nfunc (x *GetStatusRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetStatusRequest.ProtoReflect.Descriptor instead.\nfunc (*GetStatusRequest) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{6}\n}\n\ntype GetStatusResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUser *User `protobuf:\"bytes,1,opt,name=user,proto3\" json:\"user,omitempty\"`\n}\n\nfunc (x *GetStatusResponse) Reset() {\n\t*x = GetStatusResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetStatusResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetStatusResponse) ProtoMessage() {}\n\nfunc (x *GetStatusResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetStatusResponse.ProtoReflect.Descriptor instead.\nfunc (*GetStatusResponse) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{7}\n}\n\nfunc (x *GetStatusResponse) GetUser() *User {\n\tif x != nil {\n\t\treturn x.User\n\t}\n\treturn nil\n}\n\ntype GetPostResponse_Foo struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tX string `protobuf:\"bytes,1,opt,name=x,proto3\" json:\"x,omitempty\"`\n}\n\nfunc (x *GetPostResponse_Foo) Reset() {\n\t*x = GetPostResponse_Foo{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostResponse_Foo) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostResponse_Foo) ProtoMessage() {}\n\nfunc (x *GetPostResponse_Foo) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostResponse_Foo.ProtoReflect.Descriptor instead.\nfunc (*GetPostResponse_Foo) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{1, 0}\n}\n\nfunc (x *GetPostResponse_Foo) GetX() string {\n\tif x != nil {\n\t\treturn x.X\n\t}\n\treturn \"\"\n}\n\ntype GetNameResponse_Foo struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tY string `protobuf:\"bytes,1,opt,name=y,proto3\" json:\"y,omitempty\"`\n}\n\nfunc (x *GetNameResponse_Foo) Reset() {\n\t*x = GetNameResponse_Foo{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetNameResponse_Foo) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetNameResponse_Foo) ProtoMessage() {}\n\nfunc (x *GetNameResponse_Foo) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetNameResponse_Foo.ProtoReflect.Descriptor instead.\nfunc (*GetNameResponse_Foo) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{5, 0}\n}\n\nfunc (x *GetNameResponse_Foo) GetY() string {\n\tif x != nil {\n\t\treturn x.Y\n\t}\n\treturn \"\"\n}\n\nvar File_federation_federation_proto protoreflect.FileDescriptor\n\nvar file_federation_federation_proto_rawDesc = []byte{\n\t0x0a, 0x1b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x20, 0x67, 0x72, 0x70, 0x63, 0x2f,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x20, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73,\n\t0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x8f, 0x02, 0x0a, 0x0f, 0x47, 0x65, 0x74,\n\t0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x04,\n\t0x70, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x42, 0x06, 0x9a, 0x4a,\n\t0x03, 0x12, 0x01, 0x70, 0x52, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x0a, 0x75, 0x70,\n\t0x70, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x23,\n\t0x9a, 0x4a, 0x20, 0x12, 0x1e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x61, 0x72, 0x2e, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x6e,\n\t0x61, 0x6d, 0x65, 0x52, 0x09, 0x75, 0x70, 0x70, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3b,\n\t0x0a, 0x03, 0x66, 0x6f, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74,\n\t0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x46, 0x6f, 0x6f, 0x42, 0x08, 0x9a, 0x4a,\n\t0x05, 0x12, 0x03, 0x66, 0x6f, 0x6f, 0x52, 0x03, 0x66, 0x6f, 0x6f, 0x1a, 0x1d, 0x0a, 0x03, 0x46,\n\t0x6f, 0x6f, 0x12, 0x16, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0x9a,\n\t0x4a, 0x05, 0x12, 0x03, 0x27, 0x78, 0x27, 0x52, 0x01, 0x78, 0x3a, 0x2e, 0x9a, 0x4a, 0x2b, 0x0a,\n\t0x0b, 0x0a, 0x01, 0x70, 0x6a, 0x06, 0x0a, 0x04, 0x50, 0x6f, 0x73, 0x74, 0x0a, 0x1c, 0x0a, 0x03,\n\t0x66, 0x6f, 0x6f, 0x6a, 0x15, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65,\n\t0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x46, 0x6f, 0x6f, 0x22, 0xa2, 0x04, 0x0a, 0x04, 0x50,\n\t0x6f, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42,\n\t0x0e, 0x9a, 0x4a, 0x0b, 0x12, 0x09, 0x27, 0x70, 0x6f, 0x73, 0x74, 0x2d, 0x69, 0x64, 0x27, 0x52,\n\t0x02, 0x69, 0x64, 0x12, 0x22, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x09, 0x42, 0x0c, 0x9a, 0x4a, 0x09, 0x12, 0x07, 0x27, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x27,\n\t0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x28, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0e, 0x9a, 0x4a, 0x0b, 0x12, 0x09, 0x27,\n\t0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x27, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x74, 0x12, 0x2c, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x10, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x55, 0x73, 0x65,\n\t0x72, 0x42, 0x06, 0x9a, 0x4a, 0x03, 0x12, 0x01, 0x75, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12,\n\t0x3f, 0x0a, 0x08, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x14, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52,\n\t0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0d, 0x9a, 0x4a, 0x0a, 0x12, 0x08, 0x72, 0x65,\n\t0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,\n\t0x12, 0x56, 0x0a, 0x0e, 0x66, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x6c,\n\t0x75, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x79, 0x46, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65,\n\t0x54, 0x79, 0x70, 0x65, 0x42, 0x13, 0x9a, 0x4a, 0x10, 0x12, 0x0e, 0x66, 0x61, 0x76, 0x6f, 0x72,\n\t0x69, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x66, 0x61, 0x76, 0x6f, 0x72,\n\t0x69, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1a, 0x0a, 0x03, 0x63, 0x6d, 0x70, 0x18,\n\t0x07, 0x20, 0x01, 0x28, 0x08, 0x42, 0x08, 0x9a, 0x4a, 0x05, 0x12, 0x03, 0x63, 0x6d, 0x70, 0x52,\n\t0x03, 0x63, 0x6d, 0x70, 0x3a, 0xc8, 0x01, 0x9a, 0x4a, 0xc4, 0x01, 0x0a, 0x27, 0x0a, 0x01, 0x75,\n\t0x6a, 0x22, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x0b, 0x0a, 0x02, 0x69, 0x64, 0x12, 0x05,\n\t0x27, 0x66, 0x6f, 0x6f, 0x27, 0x12, 0x0d, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x05, 0x27,\n\t0x62, 0x61, 0x72, 0x27, 0x0a, 0x36, 0x0a, 0x0e, 0x66, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65,\n\t0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5a, 0x24, 0x66, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65,\n\t0x2e, 0x46, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x61,\n\t0x6c, 0x75, 0x65, 0x28, 0x27, 0x54, 0x59, 0x50, 0x45, 0x31, 0x27, 0x29, 0x0a, 0x34, 0x0a, 0x03,\n\t0x63, 0x6d, 0x70, 0x5a, 0x2d, 0x66, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x76, 0x61,\n\t0x6c, 0x75, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x66, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x2e,\n\t0x46, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x54, 0x59, 0x50,\n\t0x45, 0x31, 0x0a, 0x2b, 0x0a, 0x08, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x6a, 0x1f,\n\t0x0a, 0x08, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x13, 0x0a, 0x01, 0x76, 0x12,\n\t0x0e, 0x66, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22,\n\t0x42, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x09, 0x42, 0x09, 0x9a, 0x4a, 0x06, 0x12, 0x04, 0x24, 0x2e, 0x69, 0x64, 0x52, 0x02,\n\t0x69, 0x64, 0x12, 0x1f, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,\n\t0x42, 0x0b, 0x9a, 0x4a, 0x08, 0x12, 0x06, 0x24, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x22, 0x10, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65,\n\t0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xc3, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4e, 0x61, 0x6d,\n\t0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1d, 0x9a, 0x4a, 0x1a, 0x12, 0x18, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x65, 0x6e,\n\t0x76, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x03,\n\t0x66, 0x6f, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65,\n\t0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x46, 0x6f, 0x6f, 0x42, 0x08, 0x9a, 0x4a, 0x05, 0x12,\n\t0x03, 0x66, 0x6f, 0x6f, 0x52, 0x03, 0x66, 0x6f, 0x6f, 0x1a, 0x1d, 0x0a, 0x03, 0x46, 0x6f, 0x6f,\n\t0x12, 0x16, 0x0a, 0x01, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0x9a, 0x4a, 0x05,\n\t0x12, 0x03, 0x27, 0x79, 0x27, 0x52, 0x01, 0x79, 0x3a, 0x21, 0x9a, 0x4a, 0x1e, 0x0a, 0x1c, 0x0a,\n\t0x03, 0x66, 0x6f, 0x6f, 0x6a, 0x15, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x52,\n\t0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x46, 0x6f, 0x6f, 0x22, 0x12, 0x0a, 0x10, 0x47,\n\t0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22,\n\t0x71, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70,\n\t0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x10, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x55, 0x73, 0x65, 0x72, 0x42, 0x06, 0x9a, 0x4a, 0x03, 0x12, 0x01, 0x75, 0x52, 0x04, 0x75, 0x73,\n\t0x65, 0x72, 0x3a, 0x2e, 0x9a, 0x4a, 0x2b, 0x0a, 0x29, 0x0a, 0x01, 0x75, 0x6a, 0x24, 0x0a, 0x04,\n\t0x55, 0x73, 0x65, 0x72, 0x12, 0x0c, 0x0a, 0x02, 0x69, 0x64, 0x12, 0x06, 0x27, 0x78, 0x78, 0x78,\n\t0x78, 0x27, 0x12, 0x0e, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x06, 0x27, 0x79, 0x79, 0x79,\n\t0x79, 0x27, 0x2a, 0x5f, 0x0a, 0x0e, 0x4d, 0x79, 0x46, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65,\n\t0x54, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10,\n\t0x00, 0x1a, 0x0c, 0x9a, 0x4a, 0x09, 0x12, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x12,\n\t0x16, 0x0a, 0x05, 0x54, 0x59, 0x50, 0x45, 0x31, 0x10, 0x88, 0x27, 0x1a, 0x0a, 0x9a, 0x4a, 0x07,\n\t0x12, 0x05, 0x54, 0x59, 0x50, 0x45, 0x31, 0x1a, 0x1a, 0x9a, 0x4a, 0x17, 0x0a, 0x15, 0x66, 0x61,\n\t0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x2e, 0x46, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x54,\n\t0x79, 0x70, 0x65, 0x32, 0xab, 0x03, 0x0a, 0x11, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x44, 0x0a, 0x07, 0x47, 0x65, 0x74,\n\t0x50, 0x6f, 0x73, 0x74, 0x12, 0x1a, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x1a, 0x1b, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65,\n\t0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12,\n\t0x44, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x52,\n\t0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f,\n\t0x6e, 0x73, 0x65, 0x22, 0x00, 0x1a, 0x89, 0x02, 0x9a, 0x4a, 0x85, 0x02, 0x0a, 0x2c, 0x0a, 0x18,\n\t0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x02, 0x08, 0x01, 0x1a, 0x0c, 0x12, 0x0a, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x10, 0x0a, 0x0a, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x02, 0x08, 0x01, 0x12, 0x47, 0x0a, 0x0a, 0x75, 0x70,\n\t0x70, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5a, 0x39, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,\n\t0x73, 0x2e, 0x74, 0x6f, 0x55, 0x70, 0x70, 0x65, 0x72, 0x28, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x65, 0x6e, 0x76, 0x2e, 0x6e, 0x61,\n\t0x6d, 0x65, 0x29, 0x12, 0x20, 0x0a, 0x1b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62,\n\t0x6c, 0x65, 0x5a, 0x01, 0x31, 0x12, 0x4e, 0x72, 0x4c, 0x0a, 0x1e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x65, 0x6e, 0x76, 0x2e, 0x6e,\n\t0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x27, 0x12, 0x2a, 0x27, 0x6e, 0x61, 0x6d, 0x65,\n\t0x20, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x76, 0x61, 0x72,\n\t0x69, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x69, 0x73, 0x20, 0x75, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x69,\n\t0x66, 0x69, 0x65, 0x64, 0x27, 0x12, 0x1a, 0x0a, 0x0b, 0x66, 0x6f, 0x6f, 0x5f, 0x62, 0x61, 0x72,\n\t0x5f, 0x62, 0x61, 0x7a, 0x5a, 0x0b, 0x7b, 0x27, 0x61, 0x27, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65,\n\t0x7d, 0x32, 0xc2, 0x04, 0x0a, 0x0e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72,\n\t0x76, 0x69, 0x63, 0x65, 0x12, 0x44, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x12,\n\t0x1a, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74,\n\t0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74,\n\t0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x07, 0x47, 0x65,\n\t0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,\n\t0x74, 0x1a, 0x1b, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47,\n\t0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00,\n\t0x1a, 0xa3, 0x03, 0x9a, 0x4a, 0x9f, 0x03, 0x0a, 0x26, 0x0a, 0x15, 0x0a, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x12, 0x02, 0x08, 0x01, 0x1a, 0x09, 0x12, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65,\n\t0x0a, 0x0d, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x02, 0x08, 0x01, 0x12,\n\t0x47, 0x0a, 0x0a, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5a, 0x39, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x73,\n\t0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x74, 0x6f, 0x55, 0x70, 0x70, 0x65, 0x72, 0x28, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x65,\n\t0x6e, 0x76, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x12, 0x4f, 0x0a, 0x14, 0x70, 0x72, 0x69, 0x76,\n\t0x61, 0x74, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x65, 0x6e, 0x75, 0x6d,\n\t0x7a, 0x37, 0x0a, 0x0e, 0x4d, 0x79, 0x46, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x54, 0x79,\n\t0x70, 0x65, 0x12, 0x25, 0x66, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x2e, 0x46, 0x61, 0x76,\n\t0x6f, 0x72, 0x69, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28,\n\t0x27, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x31, 0x27, 0x29, 0x12, 0x64, 0x0a, 0x14, 0x70, 0x72, 0x69,\n\t0x76, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, 0x73, 0x65,\n\t0x72, 0x6a, 0x4c, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x02, 0x69, 0x64, 0x12,\n\t0x19, 0x27, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,\n\t0x65, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x27, 0x12, 0x23, 0x0a, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x1b, 0x27, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x65, 0x72,\n\t0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x27, 0x12,\n\t0x1f, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x5a, 0x16, 0x5b, 0x70, 0x72, 0x69, 0x76, 0x61,\n\t0x74, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5d,\n\t0x12, 0x38, 0x0a, 0x1a, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x62, 0x1a,\n\t0x0a, 0x0d, 0x0a, 0x04, 0x69, 0x74, 0x65, 0x72, 0x12, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x5a,\n\t0x09, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x0b, 0x66, 0x6f,\n\t0x6f, 0x5f, 0x62, 0x61, 0x72, 0x5f, 0x62, 0x61, 0x7a, 0x5a, 0x0b, 0x7b, 0x27, 0x62, 0x27, 0x3a,\n\t0x20, 0x74, 0x72, 0x75, 0x65, 0x7d, 0x32, 0x5f, 0x0a, 0x0c, 0x44, 0x65, 0x62, 0x75, 0x67, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4a, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61,\n\t0x74, 0x75, 0x73, 0x12, 0x1c, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,\n\t0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47,\n\t0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x22, 0x00, 0x1a, 0x03, 0x9a, 0x4a, 0x00, 0x42, 0xa4, 0x01, 0x9a, 0x4a, 0x19, 0x12, 0x17, 0x66,\n\t0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x2f, 0x66, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0f, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x1d, 0x65, 0x78, 0x61, 0x6d, 0x70,\n\t0x6c, 0x65, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xa2, 0x02, 0x03, 0x46, 0x58, 0x58, 0xaa, 0x02,\n\t0x0a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xca, 0x02, 0x0a, 0x46, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xe2, 0x02, 0x16, 0x46, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,\n\t0x61, 0xea, 0x02, 0x0a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x06,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_federation_federation_proto_rawDescOnce sync.Once\n\tfile_federation_federation_proto_rawDescData = file_federation_federation_proto_rawDesc\n)\n\nfunc file_federation_federation_proto_rawDescGZIP() []byte {\n\tfile_federation_federation_proto_rawDescOnce.Do(func() {\n\t\tfile_federation_federation_proto_rawDescData = protoimpl.X.CompressGZIP(file_federation_federation_proto_rawDescData)\n\t})\n\treturn file_federation_federation_proto_rawDescData\n}\n\nvar file_federation_federation_proto_enumTypes = make([]protoimpl.EnumInfo, 1)\nvar file_federation_federation_proto_msgTypes = make([]protoimpl.MessageInfo, 10)\nvar file_federation_federation_proto_goTypes = []interface{}{\n\t(MyFavoriteType)(0),         // 0: federation.MyFavoriteType\n\t(*GetPostRequest)(nil),      // 1: federation.GetPostRequest\n\t(*GetPostResponse)(nil),     // 2: federation.GetPostResponse\n\t(*Post)(nil),                // 3: federation.Post\n\t(*User)(nil),                // 4: federation.User\n\t(*GetNameRequest)(nil),      // 5: federation.GetNameRequest\n\t(*GetNameResponse)(nil),     // 6: federation.GetNameResponse\n\t(*GetStatusRequest)(nil),    // 7: federation.GetStatusRequest\n\t(*GetStatusResponse)(nil),   // 8: federation.GetStatusResponse\n\t(*GetPostResponse_Foo)(nil), // 9: federation.GetPostResponse.Foo\n\t(*GetNameResponse_Foo)(nil), // 10: federation.GetNameResponse.Foo\n\t(*Reaction)(nil),            // 11: federation.Reaction\n}\nvar file_federation_federation_proto_depIdxs = []int32{\n\t3,  // 0: federation.GetPostResponse.post:type_name -> federation.Post\n\t9,  // 1: federation.GetPostResponse.foo:type_name -> federation.GetPostResponse.Foo\n\t4,  // 2: federation.Post.user:type_name -> federation.User\n\t11, // 3: federation.Post.reaction:type_name -> federation.Reaction\n\t0,  // 4: federation.Post.favorite_value:type_name -> federation.MyFavoriteType\n\t10, // 5: federation.GetNameResponse.foo:type_name -> federation.GetNameResponse.Foo\n\t4,  // 6: federation.GetStatusResponse.user:type_name -> federation.User\n\t1,  // 7: federation.FederationService.GetPost:input_type -> federation.GetPostRequest\n\t5,  // 8: federation.FederationService.GetName:input_type -> federation.GetNameRequest\n\t1,  // 9: federation.PrivateService.GetPost:input_type -> federation.GetPostRequest\n\t5,  // 10: federation.PrivateService.GetName:input_type -> federation.GetNameRequest\n\t7,  // 11: federation.DebugService.GetStatus:input_type -> federation.GetStatusRequest\n\t2,  // 12: federation.FederationService.GetPost:output_type -> federation.GetPostResponse\n\t6,  // 13: federation.FederationService.GetName:output_type -> federation.GetNameResponse\n\t2,  // 14: federation.PrivateService.GetPost:output_type -> federation.GetPostResponse\n\t6,  // 15: federation.PrivateService.GetName:output_type -> federation.GetNameResponse\n\t8,  // 16: federation.DebugService.GetStatus:output_type -> federation.GetStatusResponse\n\t12, // [12:17] is the sub-list for method output_type\n\t7,  // [7:12] is the sub-list for method input_type\n\t7,  // [7:7] is the sub-list for extension type_name\n\t7,  // [7:7] is the sub-list for extension extendee\n\t0,  // [0:7] is the sub-list for field type_name\n}\n\nfunc init() { file_federation_federation_proto_init() }\nfunc file_federation_federation_proto_init() {\n\tif File_federation_federation_proto != nil {\n\t\treturn\n\t}\n\tfile_federation_reaction_proto_init()\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_federation_federation_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Post); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*User); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetNameRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetNameResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetStatusRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetStatusResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostResponse_Foo); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetNameResponse_Foo); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_federation_federation_proto_rawDesc,\n\t\t\tNumEnums:      1,\n\t\t\tNumMessages:   10,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   3,\n\t\t},\n\t\tGoTypes:           file_federation_federation_proto_goTypes,\n\t\tDependencyIndexes: file_federation_federation_proto_depIdxs,\n\t\tEnumInfos:         file_federation_federation_proto_enumTypes,\n\t\tMessageInfos:      file_federation_federation_proto_msgTypes,\n\t}.Build()\n\tFile_federation_federation_proto = out.File\n\tfile_federation_federation_proto_rawDesc = nil\n\tfile_federation_federation_proto_goTypes = nil\n\tfile_federation_federation_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/11_multi_service/federation/federation_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tFederationService_GetPost_FullMethodName = \"/federation.FederationService/GetPost\"\n\tFederationService_GetName_FullMethodName = \"/federation.FederationService/GetName\"\n)\n\n// FederationServiceClient is the client API for FederationService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype FederationServiceClient interface {\n\tGetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error)\n\tGetName(ctx context.Context, in *GetNameRequest, opts ...grpc.CallOption) (*GetNameResponse, error)\n}\n\ntype federationServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewFederationServiceClient(cc grpc.ClientConnInterface) FederationServiceClient {\n\treturn &federationServiceClient{cc}\n}\n\nfunc (c *federationServiceClient) GetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error) {\n\tout := new(GetPostResponse)\n\terr := c.cc.Invoke(ctx, FederationService_GetPost_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *federationServiceClient) GetName(ctx context.Context, in *GetNameRequest, opts ...grpc.CallOption) (*GetNameResponse, error) {\n\tout := new(GetNameResponse)\n\terr := c.cc.Invoke(ctx, FederationService_GetName_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// FederationServiceServer is the server API for FederationService service.\n// All implementations must embed UnimplementedFederationServiceServer\n// for forward compatibility\ntype FederationServiceServer interface {\n\tGetPost(context.Context, *GetPostRequest) (*GetPostResponse, error)\n\tGetName(context.Context, *GetNameRequest) (*GetNameResponse, error)\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\n// UnimplementedFederationServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedFederationServiceServer struct {\n}\n\nfunc (UnimplementedFederationServiceServer) GetPost(context.Context, *GetPostRequest) (*GetPostResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetPost not implemented\")\n}\nfunc (UnimplementedFederationServiceServer) GetName(context.Context, *GetNameRequest) (*GetNameResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetName not implemented\")\n}\nfunc (UnimplementedFederationServiceServer) mustEmbedUnimplementedFederationServiceServer() {}\n\n// UnsafeFederationServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to FederationServiceServer will\n// result in compilation errors.\ntype UnsafeFederationServiceServer interface {\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\nfunc RegisterFederationServiceServer(s grpc.ServiceRegistrar, srv FederationServiceServer) {\n\ts.RegisterService(&FederationService_ServiceDesc, srv)\n}\n\nfunc _FederationService_GetPost_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetPostRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(FederationServiceServer).GetPost(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: FederationService_GetPost_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(FederationServiceServer).GetPost(ctx, req.(*GetPostRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _FederationService_GetName_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetNameRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(FederationServiceServer).GetName(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: FederationService_GetName_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(FederationServiceServer).GetName(ctx, req.(*GetNameRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// FederationService_ServiceDesc is the grpc.ServiceDesc for FederationService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar FederationService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"federation.FederationService\",\n\tHandlerType: (*FederationServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetPost\",\n\t\t\tHandler:    _FederationService_GetPost_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetName\",\n\t\t\tHandler:    _FederationService_GetName_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"federation/federation.proto\",\n}\n\nconst (\n\tPrivateService_GetPost_FullMethodName = \"/federation.PrivateService/GetPost\"\n\tPrivateService_GetName_FullMethodName = \"/federation.PrivateService/GetName\"\n)\n\n// PrivateServiceClient is the client API for PrivateService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype PrivateServiceClient interface {\n\tGetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error)\n\tGetName(ctx context.Context, in *GetNameRequest, opts ...grpc.CallOption) (*GetNameResponse, error)\n}\n\ntype privateServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewPrivateServiceClient(cc grpc.ClientConnInterface) PrivateServiceClient {\n\treturn &privateServiceClient{cc}\n}\n\nfunc (c *privateServiceClient) GetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error) {\n\tout := new(GetPostResponse)\n\terr := c.cc.Invoke(ctx, PrivateService_GetPost_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *privateServiceClient) GetName(ctx context.Context, in *GetNameRequest, opts ...grpc.CallOption) (*GetNameResponse, error) {\n\tout := new(GetNameResponse)\n\terr := c.cc.Invoke(ctx, PrivateService_GetName_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// PrivateServiceServer is the server API for PrivateService service.\n// All implementations must embed UnimplementedPrivateServiceServer\n// for forward compatibility\ntype PrivateServiceServer interface {\n\tGetPost(context.Context, *GetPostRequest) (*GetPostResponse, error)\n\tGetName(context.Context, *GetNameRequest) (*GetNameResponse, error)\n\tmustEmbedUnimplementedPrivateServiceServer()\n}\n\n// UnimplementedPrivateServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedPrivateServiceServer struct {\n}\n\nfunc (UnimplementedPrivateServiceServer) GetPost(context.Context, *GetPostRequest) (*GetPostResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetPost not implemented\")\n}\nfunc (UnimplementedPrivateServiceServer) GetName(context.Context, *GetNameRequest) (*GetNameResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetName not implemented\")\n}\nfunc (UnimplementedPrivateServiceServer) mustEmbedUnimplementedPrivateServiceServer() {}\n\n// UnsafePrivateServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to PrivateServiceServer will\n// result in compilation errors.\ntype UnsafePrivateServiceServer interface {\n\tmustEmbedUnimplementedPrivateServiceServer()\n}\n\nfunc RegisterPrivateServiceServer(s grpc.ServiceRegistrar, srv PrivateServiceServer) {\n\ts.RegisterService(&PrivateService_ServiceDesc, srv)\n}\n\nfunc _PrivateService_GetPost_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetPostRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(PrivateServiceServer).GetPost(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: PrivateService_GetPost_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(PrivateServiceServer).GetPost(ctx, req.(*GetPostRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _PrivateService_GetName_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetNameRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(PrivateServiceServer).GetName(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: PrivateService_GetName_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(PrivateServiceServer).GetName(ctx, req.(*GetNameRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// PrivateService_ServiceDesc is the grpc.ServiceDesc for PrivateService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar PrivateService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"federation.PrivateService\",\n\tHandlerType: (*PrivateServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetPost\",\n\t\t\tHandler:    _PrivateService_GetPost_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetName\",\n\t\t\tHandler:    _PrivateService_GetName_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"federation/federation.proto\",\n}\n\nconst (\n\tDebugService_GetStatus_FullMethodName = \"/federation.DebugService/GetStatus\"\n)\n\n// DebugServiceClient is the client API for DebugService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype DebugServiceClient interface {\n\tGetStatus(ctx context.Context, in *GetStatusRequest, opts ...grpc.CallOption) (*GetStatusResponse, error)\n}\n\ntype debugServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewDebugServiceClient(cc grpc.ClientConnInterface) DebugServiceClient {\n\treturn &debugServiceClient{cc}\n}\n\nfunc (c *debugServiceClient) GetStatus(ctx context.Context, in *GetStatusRequest, opts ...grpc.CallOption) (*GetStatusResponse, error) {\n\tout := new(GetStatusResponse)\n\terr := c.cc.Invoke(ctx, DebugService_GetStatus_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// DebugServiceServer is the server API for DebugService service.\n// All implementations must embed UnimplementedDebugServiceServer\n// for forward compatibility\ntype DebugServiceServer interface {\n\tGetStatus(context.Context, *GetStatusRequest) (*GetStatusResponse, error)\n\tmustEmbedUnimplementedDebugServiceServer()\n}\n\n// UnimplementedDebugServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedDebugServiceServer struct {\n}\n\nfunc (UnimplementedDebugServiceServer) GetStatus(context.Context, *GetStatusRequest) (*GetStatusResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetStatus not implemented\")\n}\nfunc (UnimplementedDebugServiceServer) mustEmbedUnimplementedDebugServiceServer() {}\n\n// UnsafeDebugServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to DebugServiceServer will\n// result in compilation errors.\ntype UnsafeDebugServiceServer interface {\n\tmustEmbedUnimplementedDebugServiceServer()\n}\n\nfunc RegisterDebugServiceServer(s grpc.ServiceRegistrar, srv DebugServiceServer) {\n\ts.RegisterService(&DebugService_ServiceDesc, srv)\n}\n\nfunc _DebugService_GetStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetStatusRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(DebugServiceServer).GetStatus(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: DebugService_GetStatus_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(DebugServiceServer).GetStatus(ctx, req.(*GetStatusRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// DebugService_ServiceDesc is the grpc.ServiceDesc for DebugService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar DebugService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"federation.DebugService\",\n\tHandlerType: (*DebugServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetStatus\",\n\t\t\tHandler:    _DebugService_GetStatus_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"federation/federation.proto\",\n}\n"
  },
  {
    "path": "_examples/11_multi_service/federation/federation_grpc_federation.pb.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: federation/federation.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n\n\tfavorite \"example/favorite\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Federation_GetNameResponseVariable represents variable definitions in \"federation.GetNameResponse\".\ntype FederationService_Federation_GetNameResponseVariable struct {\n\tFoo *GetNameResponse_Foo\n}\n\n// Federation_GetNameResponseArgument is argument for \"federation.GetNameResponse\" message.\ntype FederationService_Federation_GetNameResponseArgument struct {\n\tFederationService_Federation_GetNameResponseVariable\n}\n\n// Federation_GetNameResponse_FooVariable represents variable definitions in \"federation.Foo\".\ntype FederationService_Federation_GetNameResponse_FooVariable struct {\n}\n\n// Federation_GetNameResponse_FooArgument is argument for \"federation.Foo\" message.\ntype FederationService_Federation_GetNameResponse_FooArgument struct {\n\tFederationService_Federation_GetNameResponse_FooVariable\n}\n\n// Federation_GetPostResponseVariable represents variable definitions in \"federation.GetPostResponse\".\ntype FederationService_Federation_GetPostResponseVariable struct {\n\tFoo *GetPostResponse_Foo\n\tP   *Post\n}\n\n// Federation_GetPostResponseArgument is argument for \"federation.GetPostResponse\" message.\ntype FederationService_Federation_GetPostResponseArgument struct {\n\tId string\n\tFederationService_Federation_GetPostResponseVariable\n}\n\n// Federation_GetPostResponse_FooVariable represents variable definitions in \"federation.Foo\".\ntype FederationService_Federation_GetPostResponse_FooVariable struct {\n}\n\n// Federation_GetPostResponse_FooArgument is argument for \"federation.Foo\" message.\ntype FederationService_Federation_GetPostResponse_FooArgument struct {\n\tFederationService_Federation_GetPostResponse_FooVariable\n}\n\n// Federation_PostVariable represents variable definitions in \"federation.Post\".\ntype FederationService_Federation_PostVariable struct {\n\tCmp           bool\n\tFavoriteValue favorite.FavoriteType\n\tReaction      *Reaction\n\tU             *User\n}\n\n// Federation_PostArgument is argument for \"federation.Post\" message.\ntype FederationService_Federation_PostArgument struct {\n\tFederationService_Federation_PostVariable\n}\n\n// Federation_ReactionVariable represents variable definitions in \"federation.Reaction\".\ntype FederationService_Federation_ReactionVariable struct {\n\tCmp bool\n}\n\n// Federation_ReactionArgument is argument for \"federation.Reaction\" message.\ntype FederationService_Federation_ReactionArgument struct {\n\tV favorite.FavoriteType\n\tFederationService_Federation_ReactionVariable\n}\n\n// Federation_UserVariable represents variable definitions in \"federation.User\".\ntype FederationService_Federation_UserVariable struct {\n}\n\n// Federation_UserArgument is argument for \"federation.User\" message.\ntype FederationService_Federation_UserArgument struct {\n\tId   string\n\tName string\n\tFederationService_Federation_UserVariable\n}\n\n// FederationServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationServiceConfig struct {\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationServiceClientFactory interface {\n}\n\n// FederationServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationServiceDependentClientSet struct {\n}\n\n// FederationServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationServiceResolver interface {\n}\n\n// FederationServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// FederationServiceEnv keeps the values read from environment variables.\ntype FederationServiceEnv struct {\n\tName       string `envconfig:\"NAME\" default:\"federation\"`\n\tFederation string `envconfig:\"FEDERATION\"`\n}\n\ntype keyFederationServiceEnv struct{}\n\n// GetFederationServiceEnv gets environment variables.\nfunc GetFederationServiceEnv(ctx context.Context) *FederationServiceEnv {\n\tvalue := ctx.Value(keyFederationServiceEnv{})\n\tif value == nil {\n\t\treturn nil\n\t}\n\treturn value.(*FederationServiceEnv)\n}\n\nfunc withFederationServiceEnv(ctx context.Context, env *FederationServiceEnv) context.Context {\n\treturn context.WithValue(ctx, keyFederationServiceEnv{}, env)\n}\n\n// FederationServiceVariable keeps the initial values.\ntype FederationServiceVariable struct {\n\tUpperName                 string\n\tFederationServiceVariable int64\n\tbool\n\tFooBarBaz map[string]bool\n}\n\ntype keyFederationServiceVariable struct{}\n\n// GetFederationServiceVariable gets initial variables.\nfunc GetFederationServiceVariable(ctx context.Context) *FederationServiceVariable {\n\tvalue := ctx.Value(keyFederationServiceVariable{})\n\tif value == nil {\n\t\treturn nil\n\t}\n\treturn value.(*FederationServiceVariable)\n}\n\nfunc withFederationServiceVariable(ctx context.Context, svcVar *FederationServiceVariable) context.Context {\n\treturn context.WithValue(ctx, keyFederationServiceVariable{}, svcVar)\n}\n\n// FederationServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationServiceUnimplementedResolver struct{}\n\n// FederationService represents Federation Service.\ntype FederationService struct {\n\tUnimplementedFederationServiceServer\n\tcfg             FederationServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tenv             *FederationServiceEnv\n\tsvcVar          *FederationServiceVariable\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationServiceDependentClientSet\n}\n\n// NewFederationService creates FederationService instance by FederationServiceConfig.\nfunc NewFederationService(cfg FederationServiceConfig) (*FederationService, error) {\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"federation.FederationService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.federation.GetNameResponseArgument\":     {},\n\t\t\"grpc.federation.private.federation.GetNameResponse_FooArgument\": {},\n\t\t\"grpc.federation.private.federation.GetPostResponseArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.federation.GetPostResponse_FooArgument\": {},\n\t\t\"grpc.federation.private.federation.PostArgument\":                {},\n\t\t\"grpc.federation.private.federation.ReactionArgument\": {\n\t\t\t\"v\": grpcfed.NewCELFieldType(grpcfed.CELIntType, \"V\"),\n\t\t},\n\t\t\"grpc.federation.private.federation.UserArgument\": {\n\t\t\t\"id\":   grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t\t\"name\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Name\"),\n\t\t},\n\t\t\"grpc.federation.private.Env\": {\n\t\t\t\"name\":       grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Name\"),\n\t\t\t\"federation\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Federation\"),\n\t\t},\n\t\t\"grpc.federation.private.ServiceVariable\": {\n\t\t\t\"upper_name\":                  grpcfed.NewCELFieldType(grpcfed.CELStringType, \"UpperName\"),\n\t\t\t\"federation_service_variable\": grpcfed.NewCELFieldType(grpcfed.CELIntType, \"FederationServiceVariable\"),\n\t\t\t\"\":                            grpcfed.NewCELFieldType(grpcfed.CELBoolType, \"\"),\n\t\t\t\"foo_bar_baz\":                 grpcfed.NewCELFieldType(grpcfed.NewCELMapType(grpcfed.CELStringType, grpcfed.CELBoolType), \"FooBarBaz\"),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"favorite.FavoriteType\", favorite.FavoriteType_value, favorite.FavoriteType_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"federation.MyFavoriteType\", MyFavoriteType_value, MyFavoriteType_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewCELVariable(\"grpc.federation.env\", grpcfed.CELObjectType(\"grpc.federation.private.Env\")))\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewCELVariable(\"grpc.federation.var\", grpcfed.CELObjectType(\"grpc.federation.private.ServiceVariable\")))\n\tvar env FederationServiceEnv\n\tif err := grpcfed.LoadEnv(\"\", &env); err != nil {\n\t\treturn nil, err\n\t}\n\tsvc := &FederationService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tenv:             &env,\n\t\tsvcVar:          new(FederationServiceVariable),\n\t\tclient:          &FederationServiceDependentClientSet{},\n\t}\n\tif err := svc.initServiceVariables(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationService(ctx context.Context, svc *FederationService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\nfunc (s *FederationService) initServiceVariables(ctx context.Context) error {\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars *FederationServiceVariable\n\t}\n\tvalue := &localValueType{\n\t\tLocalValue: grpcfed.NewServiceVariableLocalValue(s.celEnvOpts),\n\t\tvars:       s.svcVar,\n\t}\n\tvalue.AddEnv(s.env)\n\tvalue.AddServiceVariable(s.svcVar)\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t/*\n\t\tdef {\n\t\t  name: \"upper_name\"\n\t\t  by: \"grpc.federation.strings.toUpper(grpc.federation.env.name)\"\n\t\t}\n\t*/\n\tdef_upper_name := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[string, *localValueType]{\n\t\t\tName: `upper_name`,\n\t\t\tType: grpcfed.CELStringType,\n\t\t\tSetter: func(value *localValueType, v string) error {\n\t\t\t\tvalue.vars.UpperName = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `grpc.federation.strings.toUpper(grpc.federation.env.name)`,\n\t\t\tByCacheIndex: 1,\n\t\t})\n\t}\n\tif err := def_upper_name(ctx); err != nil {\n\t\treturn err\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"federation_service_variable\"\n\t\t  by: \"1\"\n\t\t}\n\t*/\n\tdef_federation_service_variable := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[int64, *localValueType]{\n\t\t\tName: `federation_service_variable`,\n\t\t\tType: grpcfed.CELIntType,\n\t\t\tSetter: func(value *localValueType, v int64) error {\n\t\t\t\tvalue.vars.FederationServiceVariable = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `1`,\n\t\t\tByCacheIndex: 2,\n\t\t})\n\t}\n\tif err := def_federation_service_variable(ctx); err != nil {\n\t\treturn err\n\t}\n\n\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\tValue:      value,\n\t\tExpr:       `grpc.federation.env.name == ''`,\n\t\tCacheIndex: 3,\n\t\tBody: func(value *localValueType) error {\n\t\t\terrmsg, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\tValue:      value,\n\t\t\t\tExpr:       `'name environment variable is unspecified'`,\n\t\t\t\tOutType:    reflect.TypeOf(\"\"),\n\t\t\t\tCacheIndex: 4,\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\treturn grpcfed.NewGRPCStatus(grpcfed.InternalCode, errmsg.(string)).Err()\n\t\t},\n\t}); err != nil {\n\t\treturn err\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"foo_bar_baz\"\n\t\t  by: \"{'a': true}\"\n\t\t}\n\t*/\n\tdef_foo_bar_baz := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[map[string]bool, *localValueType]{\n\t\t\tName: `foo_bar_baz`,\n\t\t\tType: grpcfed.NewCELMapType(grpcfed.CELStringType, grpcfed.CELBoolType),\n\t\t\tSetter: func(value *localValueType, v map[string]bool) error {\n\t\t\t\tvalue.vars.FooBarBaz = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `{'a': true}`,\n\t\t\tByCacheIndex: 5,\n\t\t})\n\t}\n\tif err := def_foo_bar_baz(ctx); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// GetPost implements \"federation.FederationService/GetPost\" method.\nfunc (s *FederationService) GetPost(ctx context.Context, req *GetPostRequest) (res *GetPostResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.FederationService/GetPost\")\n\tdefer span.End()\n\tctx = withFederationServiceEnv(ctx, s.env)\n\tctx = withFederationServiceVariable(ctx, s.svcVar)\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Federation_GetPostResponse(ctx, &FederationService_Federation_GetPostResponseArgument{\n\t\tId: req.GetId(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// GetName implements \"federation.FederationService/GetName\" method.\nfunc (s *FederationService) GetName(ctx context.Context, req *GetNameRequest) (res *GetNameResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.FederationService/GetName\")\n\tdefer span.End()\n\tctx = withFederationServiceEnv(ctx, s.env)\n\tctx = withFederationServiceVariable(ctx, s.svcVar)\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Federation_GetNameResponse(ctx, &FederationService_Federation_GetNameResponseArgument{})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Federation_GetNameResponse resolve \"federation.GetNameResponse\" message.\nfunc (s *FederationService) resolve_Federation_GetNameResponse(ctx context.Context, req *FederationService_Federation_GetNameResponseArgument) (*GetNameResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.GetNameResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.GetNameResponse\", slog.Any(\"message_args\", s.logvalue_Federation_GetNameResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tFoo *GetNameResponse_Foo\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.federation.GetNameResponseArgument\", req)}\n\tvalue.AddEnv(s.env)\n\tvalue.AddServiceVariable(s.svcVar)\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"foo\"\n\t\t  message {\n\t\t    name: \"Foo\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_foo := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*GetNameResponse_Foo, *localValueType]{\n\t\t\tName: `foo`,\n\t\t\tType: grpcfed.CELObjectType(\"federation.GetNameResponse.Foo\"),\n\t\t\tSetter: func(value *localValueType, v *GetNameResponse_Foo) error {\n\t\t\t\tvalue.vars.Foo = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Federation_GetNameResponse_FooArgument{}\n\t\t\t\tret, err := s.resolve_Federation_GetNameResponse_Foo(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_foo(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Federation_GetNameResponseVariable.Foo = value.vars.Foo\n\n\t// create a message value to be returned.\n\tret := &GetNameResponse{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"grpc.federation.env.name\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `grpc.federation.env.name`,\n\t\tCacheIndex: 6,\n\t\tSetter: func(v string) error {\n\t\t\tret.Name = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"foo\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*GetNameResponse_Foo]{\n\t\tValue:      value,\n\t\tExpr:       `foo`,\n\t\tCacheIndex: 7,\n\t\tSetter: func(v *GetNameResponse_Foo) error {\n\t\t\tret.Foo = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.GetNameResponse\", slog.Any(\"federation.GetNameResponse\", s.logvalue_Federation_GetNameResponse(ret)))\n\treturn ret, nil\n}\n\n// resolve_Federation_GetNameResponse_Foo resolve \"federation.GetNameResponse.Foo\" message.\nfunc (s *FederationService) resolve_Federation_GetNameResponse_Foo(ctx context.Context, req *FederationService_Federation_GetNameResponse_FooArgument) (*GetNameResponse_Foo, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.GetNameResponse.Foo\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.GetNameResponse.Foo\", slog.Any(\"message_args\", s.logvalue_Federation_GetNameResponse_FooArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.federation.GetNameResponse_FooArgument\", req)}\n\tvalue.AddEnv(s.env)\n\tvalue.AddServiceVariable(s.svcVar)\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &GetNameResponse_Foo{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'y'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'y'`,\n\t\tCacheIndex: 8,\n\t\tSetter: func(v string) error {\n\t\t\tret.Y = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.GetNameResponse.Foo\", slog.Any(\"federation.GetNameResponse.Foo\", s.logvalue_Federation_GetNameResponse_Foo(ret)))\n\treturn ret, nil\n}\n\n// resolve_Federation_GetPostResponse resolve \"federation.GetPostResponse\" message.\nfunc (s *FederationService) resolve_Federation_GetPostResponse(ctx context.Context, req *FederationService_Federation_GetPostResponseArgument) (*GetPostResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.GetPostResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.GetPostResponse\", slog.Any(\"message_args\", s.logvalue_Federation_GetPostResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tFoo *GetPostResponse_Foo\n\t\t\tP   *Post\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.federation.GetPostResponseArgument\", req)}\n\tvalue.AddEnv(s.env)\n\tvalue.AddServiceVariable(s.svcVar)\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"p\"\n\t\t  message {\n\t\t    name: \"Post\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_p := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Post, *localValueType]{\n\t\t\tName: `p`,\n\t\t\tType: grpcfed.CELObjectType(\"federation.Post\"),\n\t\t\tSetter: func(value *localValueType, v *Post) error {\n\t\t\t\tvalue.vars.P = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Federation_PostArgument{}\n\t\t\t\tret, err := s.resolve_Federation_Post(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"foo\"\n\t\t  message {\n\t\t    name: \"Foo\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_foo := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*GetPostResponse_Foo, *localValueType]{\n\t\t\tName: `foo`,\n\t\t\tType: grpcfed.CELObjectType(\"federation.GetPostResponse.Foo\"),\n\t\t\tSetter: func(value *localValueType, v *GetPostResponse_Foo) error {\n\t\t\t\tvalue.vars.Foo = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Federation_GetPostResponse_FooArgument{}\n\t\t\t\tret, err := s.resolve_Federation_GetPostResponse_Foo(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t   foo ─┐\n\t     p ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_foo(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_p(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Federation_GetPostResponseVariable.Foo = value.vars.Foo\n\treq.FederationService_Federation_GetPostResponseVariable.P = value.vars.P\n\n\t// create a message value to be returned.\n\tret := &GetPostResponse{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"p\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*Post]{\n\t\tValue:      value,\n\t\tExpr:       `p`,\n\t\tCacheIndex: 9,\n\t\tSetter: func(v *Post) error {\n\t\t\tret.Post = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"grpc.federation.var.upper_name\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `grpc.federation.var.upper_name`,\n\t\tCacheIndex: 10,\n\t\tSetter: func(v string) error {\n\t\t\tret.UpperName = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"foo\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*GetPostResponse_Foo]{\n\t\tValue:      value,\n\t\tExpr:       `foo`,\n\t\tCacheIndex: 11,\n\t\tSetter: func(v *GetPostResponse_Foo) error {\n\t\t\tret.Foo = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.GetPostResponse\", slog.Any(\"federation.GetPostResponse\", s.logvalue_Federation_GetPostResponse(ret)))\n\treturn ret, nil\n}\n\n// resolve_Federation_GetPostResponse_Foo resolve \"federation.GetPostResponse.Foo\" message.\nfunc (s *FederationService) resolve_Federation_GetPostResponse_Foo(ctx context.Context, req *FederationService_Federation_GetPostResponse_FooArgument) (*GetPostResponse_Foo, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.GetPostResponse.Foo\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.GetPostResponse.Foo\", slog.Any(\"message_args\", s.logvalue_Federation_GetPostResponse_FooArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.federation.GetPostResponse_FooArgument\", req)}\n\tvalue.AddEnv(s.env)\n\tvalue.AddServiceVariable(s.svcVar)\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &GetPostResponse_Foo{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'x'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'x'`,\n\t\tCacheIndex: 12,\n\t\tSetter: func(v string) error {\n\t\t\tret.X = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.GetPostResponse.Foo\", slog.Any(\"federation.GetPostResponse.Foo\", s.logvalue_Federation_GetPostResponse_Foo(ret)))\n\treturn ret, nil\n}\n\n// resolve_Federation_Post resolve \"federation.Post\" message.\nfunc (s *FederationService) resolve_Federation_Post(ctx context.Context, req *FederationService_Federation_PostArgument) (*Post, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.Post\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.Post\", slog.Any(\"message_args\", s.logvalue_Federation_PostArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tCmp           bool\n\t\t\tFavoriteValue favorite.FavoriteType\n\t\t\tReaction      *Reaction\n\t\t\tU             *User\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.federation.PostArgument\", req)}\n\tvalue.AddEnv(s.env)\n\tvalue.AddServiceVariable(s.svcVar)\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"u\"\n\t\t  message {\n\t\t    name: \"User\"\n\t\t    args: [\n\t\t      { name: \"id\", by: \"'foo'\" },\n\t\t      { name: \"name\", by: \"'bar'\" }\n\t\t    ]\n\t\t  }\n\t\t}\n\t*/\n\tdef_u := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*User, *localValueType]{\n\t\t\tName: `u`,\n\t\t\tType: grpcfed.CELObjectType(\"federation.User\"),\n\t\t\tSetter: func(value *localValueType, v *User) error {\n\t\t\t\tvalue.vars.U = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Federation_UserArgument{}\n\t\t\t\t// { name: \"id\", by: \"'foo'\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `'foo'`,\n\t\t\t\t\tCacheIndex: 13,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { name: \"name\", by: \"'bar'\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `'bar'`,\n\t\t\t\t\tCacheIndex: 14,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Name = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Federation_User(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"favorite_value\"\n\t\t  by: \"favorite.FavoriteType.value('TYPE1')\"\n\t\t}\n\t*/\n\tdef_favorite_value := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[favorite.FavoriteType, *localValueType]{\n\t\t\tName: `favorite_value`,\n\t\t\tType: grpcfed.CELIntType,\n\t\t\tSetter: func(value *localValueType, v favorite.FavoriteType) error {\n\t\t\t\tvalue.vars.FavoriteValue = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `favorite.FavoriteType.value('TYPE1')`,\n\t\t\tByCacheIndex: 15,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"cmp\"\n\t\t  by: \"favorite_value == favorite.FavoriteType.TYPE1\"\n\t\t}\n\t*/\n\tdef_cmp := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[bool, *localValueType]{\n\t\t\tName: `cmp`,\n\t\t\tType: grpcfed.CELBoolType,\n\t\t\tSetter: func(value *localValueType, v bool) error {\n\t\t\t\tvalue.vars.Cmp = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `favorite_value == favorite.FavoriteType.TYPE1`,\n\t\t\tByCacheIndex: 16,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"reaction\"\n\t\t  message {\n\t\t    name: \"Reaction\"\n\t\t    args { name: \"v\", by: \"favorite_value\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_reaction := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Reaction, *localValueType]{\n\t\t\tName: `reaction`,\n\t\t\tType: grpcfed.CELObjectType(\"federation.Reaction\"),\n\t\t\tSetter: func(value *localValueType, v *Reaction) error {\n\t\t\t\tvalue.vars.Reaction = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Federation_ReactionArgument{}\n\t\t\t\t// { name: \"v\", by: \"favorite_value\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[favorite.FavoriteType]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `favorite_value`,\n\t\t\t\t\tCacheIndex: 17,\n\t\t\t\t\tSetter: func(v favorite.FavoriteType) error {\n\t\t\t\t\t\targs.V = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Federation_Reaction(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t   favorite_value ─┐\n\t                        cmp ─┐\n\t   favorite_value ─┐         │\n\t                   reaction ─┤\n\t                          u ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_favorite_value(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_cmp(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_favorite_value(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_reaction(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_u(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Federation_PostVariable.Cmp = value.vars.Cmp\n\treq.FederationService_Federation_PostVariable.FavoriteValue = value.vars.FavoriteValue\n\treq.FederationService_Federation_PostVariable.Reaction = value.vars.Reaction\n\treq.FederationService_Federation_PostVariable.U = value.vars.U\n\n\t// create a message value to be returned.\n\tret := &Post{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'post-id'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'post-id'`,\n\t\tCacheIndex: 18,\n\t\tSetter: func(v string) error {\n\t\t\tret.Id = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"'title'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'title'`,\n\t\tCacheIndex: 19,\n\t\tSetter: func(v string) error {\n\t\t\tret.Title = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"'content'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'content'`,\n\t\tCacheIndex: 20,\n\t\tSetter: func(v string) error {\n\t\t\tret.Content = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"u\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*User]{\n\t\tValue:      value,\n\t\tExpr:       `u`,\n\t\tCacheIndex: 21,\n\t\tSetter: func(v *User) error {\n\t\t\tret.User = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"reaction\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*Reaction]{\n\t\tValue:      value,\n\t\tExpr:       `reaction`,\n\t\tCacheIndex: 22,\n\t\tSetter: func(v *Reaction) error {\n\t\t\tret.Reaction = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"favorite_value\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[favorite.FavoriteType]{\n\t\tValue:      value,\n\t\tExpr:       `favorite_value`,\n\t\tCacheIndex: 23,\n\t\tSetter: func(v favorite.FavoriteType) error {\n\t\t\tfavoriteValueValue, err := s.cast_Favorite_FavoriteType__to__Federation_MyFavoriteType(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.FavoriteValue = favoriteValueValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"cmp\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[bool]{\n\t\tValue:      value,\n\t\tExpr:       `cmp`,\n\t\tCacheIndex: 24,\n\t\tSetter: func(v bool) error {\n\t\t\tret.Cmp = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.Post\", slog.Any(\"federation.Post\", s.logvalue_Federation_Post(ret)))\n\treturn ret, nil\n}\n\n// resolve_Federation_Reaction resolve \"federation.Reaction\" message.\nfunc (s *FederationService) resolve_Federation_Reaction(ctx context.Context, req *FederationService_Federation_ReactionArgument) (*Reaction, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.Reaction\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.Reaction\", slog.Any(\"message_args\", s.logvalue_Federation_ReactionArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tCmp bool\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.federation.ReactionArgument\", req)}\n\tvalue.AddEnv(s.env)\n\tvalue.AddServiceVariable(s.svcVar)\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"cmp\"\n\t\t  by: \"$.v == favorite.FavoriteType.TYPE1\"\n\t\t}\n\t*/\n\tdef_cmp := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[bool, *localValueType]{\n\t\t\tName: `cmp`,\n\t\t\tType: grpcfed.CELBoolType,\n\t\t\tSetter: func(value *localValueType, v bool) error {\n\t\t\t\tvalue.vars.Cmp = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `$.v == favorite.FavoriteType.TYPE1`,\n\t\t\tByCacheIndex: 25,\n\t\t})\n\t}\n\n\tif err := def_cmp(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Federation_ReactionVariable.Cmp = value.vars.Cmp\n\n\t// create a message value to be returned.\n\tret := &Reaction{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"favorite.FavoriteType.value('TYPE1')\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[favorite.FavoriteType]{\n\t\tValue:      value,\n\t\tExpr:       `favorite.FavoriteType.value('TYPE1')`,\n\t\tCacheIndex: 26,\n\t\tSetter: func(v favorite.FavoriteType) error {\n\t\t\tret.FavoriteType = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"favorite.FavoriteType.name(favorite.FavoriteType.value('TYPE1'))\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `favorite.FavoriteType.name(favorite.FavoriteType.value('TYPE1'))`,\n\t\tCacheIndex: 27,\n\t\tSetter: func(v string) error {\n\t\t\tret.FavoriteTypeStr = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"cmp\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[bool]{\n\t\tValue:      value,\n\t\tExpr:       `cmp`,\n\t\tCacheIndex: 28,\n\t\tSetter: func(v bool) error {\n\t\t\tret.Cmp = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.Reaction\", slog.Any(\"federation.Reaction\", s.logvalue_Federation_Reaction(ret)))\n\treturn ret, nil\n}\n\n// resolve_Federation_User resolve \"federation.User\" message.\nfunc (s *FederationService) resolve_Federation_User(ctx context.Context, req *FederationService_Federation_UserArgument) (*User, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.User\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.User\", slog.Any(\"message_args\", s.logvalue_Federation_UserArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.federation.UserArgument\", req)}\n\tvalue.AddEnv(s.env)\n\tvalue.AddServiceVariable(s.svcVar)\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &User{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"$.id\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `$.id`,\n\t\tCacheIndex: 29,\n\t\tSetter: func(v string) error {\n\t\t\tret.Id = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"$.name\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `$.name`,\n\t\tCacheIndex: 30,\n\t\tSetter: func(v string) error {\n\t\t\tret.Name = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.User\", slog.Any(\"federation.User\", s.logvalue_Federation_User(ret)))\n\treturn ret, nil\n}\n\n// cast_Favorite_FavoriteType__to__Federation_MyFavoriteType cast from \"favorite.FavoriteType\" to \"federation.MyFavoriteType\".\nfunc (s *FederationService) cast_Favorite_FavoriteType__to__Federation_MyFavoriteType(from favorite.FavoriteType) (MyFavoriteType, error) {\n\tvar ret MyFavoriteType\n\tswitch from {\n\tcase favorite.FavoriteType_UNKNOWN:\n\t\tret = MyFavoriteType_UNKNOWN\n\tcase favorite.FavoriteType_TYPE1:\n\t\tret = MyFavoriteType_TYPE1\n\tdefault:\n\t\tret = 0\n\t}\n\treturn ret, nil\n}\n\nfunc (s *FederationService) logvalue_Favorite_FavoriteType(v favorite.FavoriteType) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tswitch v {\n\tcase favorite.FavoriteType_UNKNOWN:\n\t\treturn slog.StringValue(\"UNKNOWN\")\n\tcase favorite.FavoriteType_TYPE1:\n\t\treturn slog.StringValue(\"TYPE1\")\n\tcase favorite.FavoriteType_TYPE2:\n\t\treturn slog.StringValue(\"TYPE2\")\n\t}\n\treturn slog.StringValue(\"\")\n}\n\nfunc (s *FederationService) logvalue_Federation_GetNameResponse(v *GetNameResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"name\", v.GetName()),\n\t\tslog.Any(\"foo\", s.logvalue_Federation_GetNameResponse_Foo(v.GetFoo())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Federation_GetNameResponseArgument(v *FederationService_Federation_GetNameResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Federation_GetNameResponse_Foo(v *GetNameResponse_Foo) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"y\", v.GetY()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Federation_GetNameResponse_FooArgument(v *FederationService_Federation_GetNameResponse_FooArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Federation_GetPostResponse(v *GetPostResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"post\", s.logvalue_Federation_Post(v.GetPost())),\n\t\tslog.String(\"upper_name\", v.GetUpperName()),\n\t\tslog.Any(\"foo\", s.logvalue_Federation_GetPostResponse_Foo(v.GetFoo())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Federation_GetPostResponseArgument(v *FederationService_Federation_GetPostResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Federation_GetPostResponse_Foo(v *GetPostResponse_Foo) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"x\", v.GetX()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Federation_GetPostResponse_FooArgument(v *FederationService_Federation_GetPostResponse_FooArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Federation_MyFavoriteType(v MyFavoriteType) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tswitch v {\n\tcase MyFavoriteType_UNKNOWN:\n\t\treturn slog.StringValue(\"UNKNOWN\")\n\tcase MyFavoriteType_TYPE1:\n\t\treturn slog.StringValue(\"TYPE1\")\n\t}\n\treturn slog.StringValue(\"\")\n}\n\nfunc (s *FederationService) logvalue_Federation_Post(v *Post) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.String(\"title\", v.GetTitle()),\n\t\tslog.String(\"content\", v.GetContent()),\n\t\tslog.Any(\"user\", s.logvalue_Federation_User(v.GetUser())),\n\t\tslog.Any(\"reaction\", s.logvalue_Federation_Reaction(v.GetReaction())),\n\t\tslog.String(\"favorite_value\", s.logvalue_Federation_MyFavoriteType(v.GetFavoriteValue()).String()),\n\t\tslog.Bool(\"cmp\", v.GetCmp()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Federation_PostArgument(v *FederationService_Federation_PostArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Federation_Reaction(v *Reaction) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"favorite_type\", s.logvalue_Favorite_FavoriteType(v.GetFavoriteType()).String()),\n\t\tslog.String(\"favorite_type_str\", v.GetFavoriteTypeStr()),\n\t\tslog.Bool(\"cmp\", v.GetCmp()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Federation_ReactionArgument(v *FederationService_Federation_ReactionArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"v\", s.logvalue_Favorite_FavoriteType(v.V).String()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Federation_User(v *User) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Federation_UserArgument(v *FederationService_Federation_UserArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t\tslog.String(\"name\", v.Name),\n\t)\n}\n\n// Federation_GetNameResponseVariable represents variable definitions in \"federation.GetNameResponse\".\ntype PrivateService_Federation_GetNameResponseVariable struct {\n\tFoo *GetNameResponse_Foo\n}\n\n// Federation_GetNameResponseArgument is argument for \"federation.GetNameResponse\" message.\ntype PrivateService_Federation_GetNameResponseArgument struct {\n\tPrivateService_Federation_GetNameResponseVariable\n}\n\n// Federation_GetNameResponse_FooVariable represents variable definitions in \"federation.Foo\".\ntype PrivateService_Federation_GetNameResponse_FooVariable struct {\n}\n\n// Federation_GetNameResponse_FooArgument is argument for \"federation.Foo\" message.\ntype PrivateService_Federation_GetNameResponse_FooArgument struct {\n\tPrivateService_Federation_GetNameResponse_FooVariable\n}\n\n// Federation_GetPostResponseVariable represents variable definitions in \"federation.GetPostResponse\".\ntype PrivateService_Federation_GetPostResponseVariable struct {\n\tFoo *GetPostResponse_Foo\n\tP   *Post\n}\n\n// Federation_GetPostResponseArgument is argument for \"federation.GetPostResponse\" message.\ntype PrivateService_Federation_GetPostResponseArgument struct {\n\tId string\n\tPrivateService_Federation_GetPostResponseVariable\n}\n\n// Federation_GetPostResponse_FooVariable represents variable definitions in \"federation.Foo\".\ntype PrivateService_Federation_GetPostResponse_FooVariable struct {\n}\n\n// Federation_GetPostResponse_FooArgument is argument for \"federation.Foo\" message.\ntype PrivateService_Federation_GetPostResponse_FooArgument struct {\n\tPrivateService_Federation_GetPostResponse_FooVariable\n}\n\n// Federation_PostVariable represents variable definitions in \"federation.Post\".\ntype PrivateService_Federation_PostVariable struct {\n\tCmp           bool\n\tFavoriteValue favorite.FavoriteType\n\tReaction      *Reaction\n\tU             *User\n}\n\n// Federation_PostArgument is argument for \"federation.Post\" message.\ntype PrivateService_Federation_PostArgument struct {\n\tPrivateService_Federation_PostVariable\n}\n\n// Federation_ReactionVariable represents variable definitions in \"federation.Reaction\".\ntype PrivateService_Federation_ReactionVariable struct {\n\tCmp bool\n}\n\n// Federation_ReactionArgument is argument for \"federation.Reaction\" message.\ntype PrivateService_Federation_ReactionArgument struct {\n\tV favorite.FavoriteType\n\tPrivateService_Federation_ReactionVariable\n}\n\n// Federation_UserVariable represents variable definitions in \"federation.User\".\ntype PrivateService_Federation_UserVariable struct {\n}\n\n// Federation_UserArgument is argument for \"federation.User\" message.\ntype PrivateService_Federation_UserArgument struct {\n\tId   string\n\tName string\n\tPrivateService_Federation_UserVariable\n}\n\n// PrivateServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype PrivateServiceConfig struct {\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// PrivateServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype PrivateServiceClientFactory interface {\n}\n\n// PrivateServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype PrivateServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// PrivateServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype PrivateServiceDependentClientSet struct {\n}\n\n// PrivateServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype PrivateServiceResolver interface {\n}\n\n// PrivateServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype PrivateServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// PrivateServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype PrivateServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// PrivateServiceEnv keeps the values read from environment variables.\ntype PrivateServiceEnv struct {\n\tName    string `envconfig:\"NAME\" default:\"private\"`\n\tPrivate string `envconfig:\"PRIVATE\"`\n}\n\ntype keyPrivateServiceEnv struct{}\n\n// GetPrivateServiceEnv gets environment variables.\nfunc GetPrivateServiceEnv(ctx context.Context) *PrivateServiceEnv {\n\tvalue := ctx.Value(keyPrivateServiceEnv{})\n\tif value == nil {\n\t\treturn nil\n\t}\n\treturn value.(*PrivateServiceEnv)\n}\n\nfunc withPrivateServiceEnv(ctx context.Context, env *PrivateServiceEnv) context.Context {\n\treturn context.WithValue(ctx, keyPrivateServiceEnv{}, env)\n}\n\n// PrivateServiceVariable keeps the initial values.\ntype PrivateServiceVariable struct {\n\tUpperName               string\n\tPrivateServiceEnum      MyFavoriteType\n\tPrivateServiceUser      *User\n\tUsers                   []*User\n\tPrivateServiceUserNames []string\n\tFooBarBaz               map[string]bool\n}\n\ntype keyPrivateServiceVariable struct{}\n\n// GetPrivateServiceVariable gets initial variables.\nfunc GetPrivateServiceVariable(ctx context.Context) *PrivateServiceVariable {\n\tvalue := ctx.Value(keyPrivateServiceVariable{})\n\tif value == nil {\n\t\treturn nil\n\t}\n\treturn value.(*PrivateServiceVariable)\n}\n\nfunc withPrivateServiceVariable(ctx context.Context, svcVar *PrivateServiceVariable) context.Context {\n\treturn context.WithValue(ctx, keyPrivateServiceVariable{}, svcVar)\n}\n\n// PrivateServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype PrivateServiceUnimplementedResolver struct{}\n\n// PrivateService represents Federation Service.\ntype PrivateService struct {\n\tUnimplementedPrivateServiceServer\n\tcfg             PrivateServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tenv             *PrivateServiceEnv\n\tsvcVar          *PrivateServiceVariable\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *PrivateServiceDependentClientSet\n}\n\n// NewPrivateService creates PrivateService instance by PrivateServiceConfig.\nfunc NewPrivateService(cfg PrivateServiceConfig) (*PrivateService, error) {\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"federation.PrivateService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.federation.GetNameResponseArgument\":     {},\n\t\t\"grpc.federation.private.federation.GetNameResponse_FooArgument\": {},\n\t\t\"grpc.federation.private.federation.GetPostResponseArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.federation.GetPostResponse_FooArgument\": {},\n\t\t\"grpc.federation.private.federation.PostArgument\":                {},\n\t\t\"grpc.federation.private.federation.ReactionArgument\": {\n\t\t\t\"v\": grpcfed.NewCELFieldType(grpcfed.CELIntType, \"V\"),\n\t\t},\n\t\t\"grpc.federation.private.federation.UserArgument\": {\n\t\t\t\"id\":   grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t\t\"name\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Name\"),\n\t\t},\n\t\t\"grpc.federation.private.Env\": {\n\t\t\t\"name\":    grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Name\"),\n\t\t\t\"private\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Private\"),\n\t\t},\n\t\t\"grpc.federation.private.ServiceVariable\": {\n\t\t\t\"upper_name\":                 grpcfed.NewCELFieldType(grpcfed.CELStringType, \"UpperName\"),\n\t\t\t\"private_service_enum\":       grpcfed.NewCELFieldType(grpcfed.CELIntType, \"PrivateServiceEnum\"),\n\t\t\t\"private_service_user\":       grpcfed.NewCELFieldType(grpcfed.NewCELObjectType(\"federation.User\"), \"PrivateServiceUser\"),\n\t\t\t\"users\":                      grpcfed.NewCELFieldType(grpcfed.NewCELListType(grpcfed.NewCELObjectType(\"federation.User\")), \"Users\"),\n\t\t\t\"private_service_user_names\": grpcfed.NewCELFieldType(grpcfed.NewCELListType(grpcfed.CELStringType), \"PrivateServiceUserNames\"),\n\t\t\t\"foo_bar_baz\":                grpcfed.NewCELFieldType(grpcfed.NewCELMapType(grpcfed.CELStringType, grpcfed.CELBoolType), \"FooBarBaz\"),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"favorite.FavoriteType\", favorite.FavoriteType_value, favorite.FavoriteType_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"federation.MyFavoriteType\", MyFavoriteType_value, MyFavoriteType_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewCELVariable(\"grpc.federation.env\", grpcfed.CELObjectType(\"grpc.federation.private.Env\")))\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewCELVariable(\"grpc.federation.var\", grpcfed.CELObjectType(\"grpc.federation.private.ServiceVariable\")))\n\tvar env PrivateServiceEnv\n\tif err := grpcfed.LoadEnv(\"\", &env); err != nil {\n\t\treturn nil, err\n\t}\n\tsvc := &PrivateService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tenv:             &env,\n\t\tsvcVar:          new(PrivateServiceVariable),\n\t\tclient:          &PrivateServiceDependentClientSet{},\n\t}\n\tif err := svc.initServiceVariables(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\treturn svc, nil\n}\n\n// CleanupPrivateService cleanup all resources to prevent goroutine leaks.\nfunc CleanupPrivateService(ctx context.Context, svc *PrivateService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *PrivateService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\nfunc (s *PrivateService) initServiceVariables(ctx context.Context) error {\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars *PrivateServiceVariable\n\t}\n\tvalue := &localValueType{\n\t\tLocalValue: grpcfed.NewServiceVariableLocalValue(s.celEnvOpts),\n\t\tvars:       s.svcVar,\n\t}\n\tvalue.AddEnv(s.env)\n\tvalue.AddServiceVariable(s.svcVar)\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t/*\n\t\tdef {\n\t\t  name: \"upper_name\"\n\t\t  by: \"grpc.federation.strings.toUpper(grpc.federation.env.name)\"\n\t\t}\n\t*/\n\tdef_upper_name := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[string, *localValueType]{\n\t\t\tName: `upper_name`,\n\t\t\tType: grpcfed.CELStringType,\n\t\t\tSetter: func(value *localValueType, v string) error {\n\t\t\t\tvalue.vars.UpperName = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `grpc.federation.strings.toUpper(grpc.federation.env.name)`,\n\t\t\tByCacheIndex: 1,\n\t\t})\n\t}\n\tif err := def_upper_name(ctx); err != nil {\n\t\treturn err\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"private_service_enum\"\n\t\t  enum {\n\t\t    name: \"federation.MyFavoriteType\"\n\t\t    by: \"favorite.FavoriteType.value('TYPE_1')\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_private_service_enum := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[MyFavoriteType, *localValueType]{\n\t\t\tName: `private_service_enum`,\n\t\t\tType: grpcfed.CELIntType,\n\t\t\tSetter: func(value *localValueType, v MyFavoriteType) error {\n\t\t\t\tvalue.vars.PrivateServiceEnum = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tEnum: func(ctx context.Context, value *localValueType) (MyFavoriteType, error) {\n\t\t\t\tsrc, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `favorite.FavoriteType.value('TYPE_1')`,\n\t\t\t\t\tOutType:    reflect.TypeOf(favorite.FavoriteType(0)),\n\t\t\t\t\tCacheIndex: 2,\n\t\t\t\t})\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn 0, err\n\t\t\t\t}\n\t\t\t\tv := src.(favorite.FavoriteType)\n\t\t\t\treturn s.cast_Favorite_FavoriteType__to__Federation_MyFavoriteType(v)\n\t\t\t},\n\t\t})\n\t}\n\tif err := def_private_service_enum(ctx); err != nil {\n\t\treturn err\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"private_service_user\"\n\t\t  message {\n\t\t    name: \"User\"\n\t\t    args: [\n\t\t      { name: \"id\", by: \"'private_service_user_id'\" },\n\t\t      { name: \"name\", by: \"'private_service_user_name'\" }\n\t\t    ]\n\t\t  }\n\t\t}\n\t*/\n\tdef_private_service_user := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*User, *localValueType]{\n\t\t\tName: `private_service_user`,\n\t\t\tType: grpcfed.CELObjectType(\"federation.User\"),\n\t\t\tSetter: func(value *localValueType, v *User) error {\n\t\t\t\tvalue.vars.PrivateServiceUser = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &PrivateService_Federation_UserArgument{}\n\t\t\t\t// { name: \"id\", by: \"'private_service_user_id'\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `'private_service_user_id'`,\n\t\t\t\t\tCacheIndex: 3,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { name: \"name\", by: \"'private_service_user_name'\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `'private_service_user_name'`,\n\t\t\t\t\tCacheIndex: 4,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Name = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Federation_User(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\tif err := def_private_service_user(ctx); err != nil {\n\t\treturn err\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"users\"\n\t\t  by: \"[private_service_user]\"\n\t\t}\n\t*/\n\tdef_users := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[[]*User, *localValueType]{\n\t\t\tName: `users`,\n\t\t\tType: grpcfed.CELListType(grpcfed.CELObjectType(\"federation.User\")),\n\t\t\tSetter: func(value *localValueType, v []*User) error {\n\t\t\t\tvalue.vars.Users = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `[private_service_user]`,\n\t\t\tByCacheIndex: 5,\n\t\t})\n\t}\n\tif err := def_users(ctx); err != nil {\n\t\treturn err\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"private_service_user_names\"\n\t\t  map {\n\t\t    iterator {\n\t\t      name: \"iter\"\n\t\t      src: \"users\"\n\t\t    }\n\t\t    by: \"iter.name\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_private_service_user_names := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDefMap(ctx, value, grpcfed.DefMap[[]string, *User, *localValueType]{\n\t\t\tName: `private_service_user_names`,\n\t\t\tType: grpcfed.CELListType(grpcfed.CELStringType),\n\t\t\tSetter: func(value *localValueType, v []string) error {\n\t\t\t\tvalue.vars.PrivateServiceUserNames = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tIteratorName:   `iter`,\n\t\t\tIteratorType:   grpcfed.CELObjectType(\"federation.User\"),\n\t\t\tIteratorSource: func(value *localValueType) []*User { return value.vars.Users },\n\t\t\tIterator: func(ctx context.Context, value *grpcfed.MapIteratorValue) (any, error) {\n\t\t\t\treturn grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `iter.name`,\n\t\t\t\t\tOutType:    reflect.TypeOf(\"\"),\n\t\t\t\t\tCacheIndex: 6,\n\t\t\t\t})\n\t\t\t},\n\t\t})\n\t}\n\tif err := def_private_service_user_names(ctx); err != nil {\n\t\treturn err\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"foo_bar_baz\"\n\t\t  by: \"{'b': true}\"\n\t\t}\n\t*/\n\tdef_foo_bar_baz := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[map[string]bool, *localValueType]{\n\t\t\tName: `foo_bar_baz`,\n\t\t\tType: grpcfed.NewCELMapType(grpcfed.CELStringType, grpcfed.CELBoolType),\n\t\t\tSetter: func(value *localValueType, v map[string]bool) error {\n\t\t\t\tvalue.vars.FooBarBaz = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `{'b': true}`,\n\t\t\tByCacheIndex: 7,\n\t\t})\n\t}\n\tif err := def_foo_bar_baz(ctx); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// GetPost implements \"federation.PrivateService/GetPost\" method.\nfunc (s *PrivateService) GetPost(ctx context.Context, req *GetPostRequest) (res *GetPostResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.PrivateService/GetPost\")\n\tdefer span.End()\n\tctx = withPrivateServiceEnv(ctx, s.env)\n\tctx = withPrivateServiceVariable(ctx, s.svcVar)\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Federation_GetPostResponse(ctx, &PrivateService_Federation_GetPostResponseArgument{\n\t\tId: req.GetId(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// GetName implements \"federation.PrivateService/GetName\" method.\nfunc (s *PrivateService) GetName(ctx context.Context, req *GetNameRequest) (res *GetNameResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.PrivateService/GetName\")\n\tdefer span.End()\n\tctx = withPrivateServiceEnv(ctx, s.env)\n\tctx = withPrivateServiceVariable(ctx, s.svcVar)\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Federation_GetNameResponse(ctx, &PrivateService_Federation_GetNameResponseArgument{})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Federation_GetNameResponse resolve \"federation.GetNameResponse\" message.\nfunc (s *PrivateService) resolve_Federation_GetNameResponse(ctx context.Context, req *PrivateService_Federation_GetNameResponseArgument) (*GetNameResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.GetNameResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.GetNameResponse\", slog.Any(\"message_args\", s.logvalue_Federation_GetNameResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tFoo *GetNameResponse_Foo\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.federation.GetNameResponseArgument\", req)}\n\tvalue.AddEnv(s.env)\n\tvalue.AddServiceVariable(s.svcVar)\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"foo\"\n\t\t  message {\n\t\t    name: \"Foo\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_foo := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*GetNameResponse_Foo, *localValueType]{\n\t\t\tName: `foo`,\n\t\t\tType: grpcfed.CELObjectType(\"federation.GetNameResponse.Foo\"),\n\t\t\tSetter: func(value *localValueType, v *GetNameResponse_Foo) error {\n\t\t\t\tvalue.vars.Foo = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &PrivateService_Federation_GetNameResponse_FooArgument{}\n\t\t\t\tret, err := s.resolve_Federation_GetNameResponse_Foo(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_foo(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.PrivateService_Federation_GetNameResponseVariable.Foo = value.vars.Foo\n\n\t// create a message value to be returned.\n\tret := &GetNameResponse{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"grpc.federation.env.name\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `grpc.federation.env.name`,\n\t\tCacheIndex: 8,\n\t\tSetter: func(v string) error {\n\t\t\tret.Name = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"foo\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*GetNameResponse_Foo]{\n\t\tValue:      value,\n\t\tExpr:       `foo`,\n\t\tCacheIndex: 9,\n\t\tSetter: func(v *GetNameResponse_Foo) error {\n\t\t\tret.Foo = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.GetNameResponse\", slog.Any(\"federation.GetNameResponse\", s.logvalue_Federation_GetNameResponse(ret)))\n\treturn ret, nil\n}\n\n// resolve_Federation_GetNameResponse_Foo resolve \"federation.GetNameResponse.Foo\" message.\nfunc (s *PrivateService) resolve_Federation_GetNameResponse_Foo(ctx context.Context, req *PrivateService_Federation_GetNameResponse_FooArgument) (*GetNameResponse_Foo, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.GetNameResponse.Foo\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.GetNameResponse.Foo\", slog.Any(\"message_args\", s.logvalue_Federation_GetNameResponse_FooArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.federation.GetNameResponse_FooArgument\", req)}\n\tvalue.AddEnv(s.env)\n\tvalue.AddServiceVariable(s.svcVar)\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &GetNameResponse_Foo{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'y'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'y'`,\n\t\tCacheIndex: 10,\n\t\tSetter: func(v string) error {\n\t\t\tret.Y = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.GetNameResponse.Foo\", slog.Any(\"federation.GetNameResponse.Foo\", s.logvalue_Federation_GetNameResponse_Foo(ret)))\n\treturn ret, nil\n}\n\n// resolve_Federation_GetPostResponse resolve \"federation.GetPostResponse\" message.\nfunc (s *PrivateService) resolve_Federation_GetPostResponse(ctx context.Context, req *PrivateService_Federation_GetPostResponseArgument) (*GetPostResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.GetPostResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.GetPostResponse\", slog.Any(\"message_args\", s.logvalue_Federation_GetPostResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tFoo *GetPostResponse_Foo\n\t\t\tP   *Post\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.federation.GetPostResponseArgument\", req)}\n\tvalue.AddEnv(s.env)\n\tvalue.AddServiceVariable(s.svcVar)\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"p\"\n\t\t  message {\n\t\t    name: \"Post\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_p := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Post, *localValueType]{\n\t\t\tName: `p`,\n\t\t\tType: grpcfed.CELObjectType(\"federation.Post\"),\n\t\t\tSetter: func(value *localValueType, v *Post) error {\n\t\t\t\tvalue.vars.P = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &PrivateService_Federation_PostArgument{}\n\t\t\t\tret, err := s.resolve_Federation_Post(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"foo\"\n\t\t  message {\n\t\t    name: \"Foo\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_foo := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*GetPostResponse_Foo, *localValueType]{\n\t\t\tName: `foo`,\n\t\t\tType: grpcfed.CELObjectType(\"federation.GetPostResponse.Foo\"),\n\t\t\tSetter: func(value *localValueType, v *GetPostResponse_Foo) error {\n\t\t\t\tvalue.vars.Foo = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &PrivateService_Federation_GetPostResponse_FooArgument{}\n\t\t\t\tret, err := s.resolve_Federation_GetPostResponse_Foo(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t   foo ─┐\n\t     p ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_foo(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_p(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.PrivateService_Federation_GetPostResponseVariable.Foo = value.vars.Foo\n\treq.PrivateService_Federation_GetPostResponseVariable.P = value.vars.P\n\n\t// create a message value to be returned.\n\tret := &GetPostResponse{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"p\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*Post]{\n\t\tValue:      value,\n\t\tExpr:       `p`,\n\t\tCacheIndex: 11,\n\t\tSetter: func(v *Post) error {\n\t\t\tret.Post = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"grpc.federation.var.upper_name\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `grpc.federation.var.upper_name`,\n\t\tCacheIndex: 12,\n\t\tSetter: func(v string) error {\n\t\t\tret.UpperName = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"foo\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*GetPostResponse_Foo]{\n\t\tValue:      value,\n\t\tExpr:       `foo`,\n\t\tCacheIndex: 13,\n\t\tSetter: func(v *GetPostResponse_Foo) error {\n\t\t\tret.Foo = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.GetPostResponse\", slog.Any(\"federation.GetPostResponse\", s.logvalue_Federation_GetPostResponse(ret)))\n\treturn ret, nil\n}\n\n// resolve_Federation_GetPostResponse_Foo resolve \"federation.GetPostResponse.Foo\" message.\nfunc (s *PrivateService) resolve_Federation_GetPostResponse_Foo(ctx context.Context, req *PrivateService_Federation_GetPostResponse_FooArgument) (*GetPostResponse_Foo, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.GetPostResponse.Foo\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.GetPostResponse.Foo\", slog.Any(\"message_args\", s.logvalue_Federation_GetPostResponse_FooArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.federation.GetPostResponse_FooArgument\", req)}\n\tvalue.AddEnv(s.env)\n\tvalue.AddServiceVariable(s.svcVar)\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &GetPostResponse_Foo{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'x'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'x'`,\n\t\tCacheIndex: 14,\n\t\tSetter: func(v string) error {\n\t\t\tret.X = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.GetPostResponse.Foo\", slog.Any(\"federation.GetPostResponse.Foo\", s.logvalue_Federation_GetPostResponse_Foo(ret)))\n\treturn ret, nil\n}\n\n// resolve_Federation_Post resolve \"federation.Post\" message.\nfunc (s *PrivateService) resolve_Federation_Post(ctx context.Context, req *PrivateService_Federation_PostArgument) (*Post, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.Post\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.Post\", slog.Any(\"message_args\", s.logvalue_Federation_PostArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tCmp           bool\n\t\t\tFavoriteValue favorite.FavoriteType\n\t\t\tReaction      *Reaction\n\t\t\tU             *User\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.federation.PostArgument\", req)}\n\tvalue.AddEnv(s.env)\n\tvalue.AddServiceVariable(s.svcVar)\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"u\"\n\t\t  message {\n\t\t    name: \"User\"\n\t\t    args: [\n\t\t      { name: \"id\", by: \"'foo'\" },\n\t\t      { name: \"name\", by: \"'bar'\" }\n\t\t    ]\n\t\t  }\n\t\t}\n\t*/\n\tdef_u := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*User, *localValueType]{\n\t\t\tName: `u`,\n\t\t\tType: grpcfed.CELObjectType(\"federation.User\"),\n\t\t\tSetter: func(value *localValueType, v *User) error {\n\t\t\t\tvalue.vars.U = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &PrivateService_Federation_UserArgument{}\n\t\t\t\t// { name: \"id\", by: \"'foo'\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `'foo'`,\n\t\t\t\t\tCacheIndex: 15,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { name: \"name\", by: \"'bar'\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `'bar'`,\n\t\t\t\t\tCacheIndex: 16,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Name = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Federation_User(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"favorite_value\"\n\t\t  by: \"favorite.FavoriteType.value('TYPE1')\"\n\t\t}\n\t*/\n\tdef_favorite_value := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[favorite.FavoriteType, *localValueType]{\n\t\t\tName: `favorite_value`,\n\t\t\tType: grpcfed.CELIntType,\n\t\t\tSetter: func(value *localValueType, v favorite.FavoriteType) error {\n\t\t\t\tvalue.vars.FavoriteValue = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `favorite.FavoriteType.value('TYPE1')`,\n\t\t\tByCacheIndex: 17,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"cmp\"\n\t\t  by: \"favorite_value == favorite.FavoriteType.TYPE1\"\n\t\t}\n\t*/\n\tdef_cmp := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[bool, *localValueType]{\n\t\t\tName: `cmp`,\n\t\t\tType: grpcfed.CELBoolType,\n\t\t\tSetter: func(value *localValueType, v bool) error {\n\t\t\t\tvalue.vars.Cmp = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `favorite_value == favorite.FavoriteType.TYPE1`,\n\t\t\tByCacheIndex: 18,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"reaction\"\n\t\t  message {\n\t\t    name: \"Reaction\"\n\t\t    args { name: \"v\", by: \"favorite_value\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_reaction := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Reaction, *localValueType]{\n\t\t\tName: `reaction`,\n\t\t\tType: grpcfed.CELObjectType(\"federation.Reaction\"),\n\t\t\tSetter: func(value *localValueType, v *Reaction) error {\n\t\t\t\tvalue.vars.Reaction = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &PrivateService_Federation_ReactionArgument{}\n\t\t\t\t// { name: \"v\", by: \"favorite_value\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[favorite.FavoriteType]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `favorite_value`,\n\t\t\t\t\tCacheIndex: 19,\n\t\t\t\t\tSetter: func(v favorite.FavoriteType) error {\n\t\t\t\t\t\targs.V = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Federation_Reaction(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t   favorite_value ─┐\n\t                        cmp ─┐\n\t   favorite_value ─┐         │\n\t                   reaction ─┤\n\t                          u ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_favorite_value(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_cmp(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_favorite_value(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_reaction(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_u(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.PrivateService_Federation_PostVariable.Cmp = value.vars.Cmp\n\treq.PrivateService_Federation_PostVariable.FavoriteValue = value.vars.FavoriteValue\n\treq.PrivateService_Federation_PostVariable.Reaction = value.vars.Reaction\n\treq.PrivateService_Federation_PostVariable.U = value.vars.U\n\n\t// create a message value to be returned.\n\tret := &Post{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'post-id'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'post-id'`,\n\t\tCacheIndex: 20,\n\t\tSetter: func(v string) error {\n\t\t\tret.Id = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"'title'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'title'`,\n\t\tCacheIndex: 21,\n\t\tSetter: func(v string) error {\n\t\t\tret.Title = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"'content'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'content'`,\n\t\tCacheIndex: 22,\n\t\tSetter: func(v string) error {\n\t\t\tret.Content = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"u\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*User]{\n\t\tValue:      value,\n\t\tExpr:       `u`,\n\t\tCacheIndex: 23,\n\t\tSetter: func(v *User) error {\n\t\t\tret.User = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"reaction\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*Reaction]{\n\t\tValue:      value,\n\t\tExpr:       `reaction`,\n\t\tCacheIndex: 24,\n\t\tSetter: func(v *Reaction) error {\n\t\t\tret.Reaction = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"favorite_value\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[favorite.FavoriteType]{\n\t\tValue:      value,\n\t\tExpr:       `favorite_value`,\n\t\tCacheIndex: 25,\n\t\tSetter: func(v favorite.FavoriteType) error {\n\t\t\tfavoriteValueValue, err := s.cast_Favorite_FavoriteType__to__Federation_MyFavoriteType(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.FavoriteValue = favoriteValueValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"cmp\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[bool]{\n\t\tValue:      value,\n\t\tExpr:       `cmp`,\n\t\tCacheIndex: 26,\n\t\tSetter: func(v bool) error {\n\t\t\tret.Cmp = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.Post\", slog.Any(\"federation.Post\", s.logvalue_Federation_Post(ret)))\n\treturn ret, nil\n}\n\n// resolve_Federation_Reaction resolve \"federation.Reaction\" message.\nfunc (s *PrivateService) resolve_Federation_Reaction(ctx context.Context, req *PrivateService_Federation_ReactionArgument) (*Reaction, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.Reaction\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.Reaction\", slog.Any(\"message_args\", s.logvalue_Federation_ReactionArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tCmp bool\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.federation.ReactionArgument\", req)}\n\tvalue.AddEnv(s.env)\n\tvalue.AddServiceVariable(s.svcVar)\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"cmp\"\n\t\t  by: \"$.v == favorite.FavoriteType.TYPE1\"\n\t\t}\n\t*/\n\tdef_cmp := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[bool, *localValueType]{\n\t\t\tName: `cmp`,\n\t\t\tType: grpcfed.CELBoolType,\n\t\t\tSetter: func(value *localValueType, v bool) error {\n\t\t\t\tvalue.vars.Cmp = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `$.v == favorite.FavoriteType.TYPE1`,\n\t\t\tByCacheIndex: 27,\n\t\t})\n\t}\n\n\tif err := def_cmp(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.PrivateService_Federation_ReactionVariable.Cmp = value.vars.Cmp\n\n\t// create a message value to be returned.\n\tret := &Reaction{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"favorite.FavoriteType.value('TYPE1')\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[favorite.FavoriteType]{\n\t\tValue:      value,\n\t\tExpr:       `favorite.FavoriteType.value('TYPE1')`,\n\t\tCacheIndex: 28,\n\t\tSetter: func(v favorite.FavoriteType) error {\n\t\t\tret.FavoriteType = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"favorite.FavoriteType.name(favorite.FavoriteType.value('TYPE1'))\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `favorite.FavoriteType.name(favorite.FavoriteType.value('TYPE1'))`,\n\t\tCacheIndex: 29,\n\t\tSetter: func(v string) error {\n\t\t\tret.FavoriteTypeStr = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"cmp\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[bool]{\n\t\tValue:      value,\n\t\tExpr:       `cmp`,\n\t\tCacheIndex: 30,\n\t\tSetter: func(v bool) error {\n\t\t\tret.Cmp = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.Reaction\", slog.Any(\"federation.Reaction\", s.logvalue_Federation_Reaction(ret)))\n\treturn ret, nil\n}\n\n// resolve_Federation_User resolve \"federation.User\" message.\nfunc (s *PrivateService) resolve_Federation_User(ctx context.Context, req *PrivateService_Federation_UserArgument) (*User, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.User\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.User\", slog.Any(\"message_args\", s.logvalue_Federation_UserArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.federation.UserArgument\", req)}\n\tvalue.AddEnv(s.env)\n\tvalue.AddServiceVariable(s.svcVar)\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &User{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"$.id\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `$.id`,\n\t\tCacheIndex: 31,\n\t\tSetter: func(v string) error {\n\t\t\tret.Id = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"$.name\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `$.name`,\n\t\tCacheIndex: 32,\n\t\tSetter: func(v string) error {\n\t\t\tret.Name = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.User\", slog.Any(\"federation.User\", s.logvalue_Federation_User(ret)))\n\treturn ret, nil\n}\n\n// cast_Favorite_FavoriteType__to__Federation_MyFavoriteType cast from \"favorite.FavoriteType\" to \"federation.MyFavoriteType\".\nfunc (s *PrivateService) cast_Favorite_FavoriteType__to__Federation_MyFavoriteType(from favorite.FavoriteType) (MyFavoriteType, error) {\n\tvar ret MyFavoriteType\n\tswitch from {\n\tcase favorite.FavoriteType_UNKNOWN:\n\t\tret = MyFavoriteType_UNKNOWN\n\tcase favorite.FavoriteType_TYPE1:\n\t\tret = MyFavoriteType_TYPE1\n\tdefault:\n\t\tret = 0\n\t}\n\treturn ret, nil\n}\n\nfunc (s *PrivateService) logvalue_Favorite_FavoriteType(v favorite.FavoriteType) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tswitch v {\n\tcase favorite.FavoriteType_UNKNOWN:\n\t\treturn slog.StringValue(\"UNKNOWN\")\n\tcase favorite.FavoriteType_TYPE1:\n\t\treturn slog.StringValue(\"TYPE1\")\n\tcase favorite.FavoriteType_TYPE2:\n\t\treturn slog.StringValue(\"TYPE2\")\n\t}\n\treturn slog.StringValue(\"\")\n}\n\nfunc (s *PrivateService) logvalue_Federation_GetNameResponse(v *GetNameResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"name\", v.GetName()),\n\t\tslog.Any(\"foo\", s.logvalue_Federation_GetNameResponse_Foo(v.GetFoo())),\n\t)\n}\n\nfunc (s *PrivateService) logvalue_Federation_GetNameResponseArgument(v *PrivateService_Federation_GetNameResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *PrivateService) logvalue_Federation_GetNameResponse_Foo(v *GetNameResponse_Foo) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"y\", v.GetY()),\n\t)\n}\n\nfunc (s *PrivateService) logvalue_Federation_GetNameResponse_FooArgument(v *PrivateService_Federation_GetNameResponse_FooArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *PrivateService) logvalue_Federation_GetPostResponse(v *GetPostResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"post\", s.logvalue_Federation_Post(v.GetPost())),\n\t\tslog.String(\"upper_name\", v.GetUpperName()),\n\t\tslog.Any(\"foo\", s.logvalue_Federation_GetPostResponse_Foo(v.GetFoo())),\n\t)\n}\n\nfunc (s *PrivateService) logvalue_Federation_GetPostResponseArgument(v *PrivateService_Federation_GetPostResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *PrivateService) logvalue_Federation_GetPostResponse_Foo(v *GetPostResponse_Foo) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"x\", v.GetX()),\n\t)\n}\n\nfunc (s *PrivateService) logvalue_Federation_GetPostResponse_FooArgument(v *PrivateService_Federation_GetPostResponse_FooArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *PrivateService) logvalue_Federation_MyFavoriteType(v MyFavoriteType) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tswitch v {\n\tcase MyFavoriteType_UNKNOWN:\n\t\treturn slog.StringValue(\"UNKNOWN\")\n\tcase MyFavoriteType_TYPE1:\n\t\treturn slog.StringValue(\"TYPE1\")\n\t}\n\treturn slog.StringValue(\"\")\n}\n\nfunc (s *PrivateService) logvalue_Federation_Post(v *Post) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.String(\"title\", v.GetTitle()),\n\t\tslog.String(\"content\", v.GetContent()),\n\t\tslog.Any(\"user\", s.logvalue_Federation_User(v.GetUser())),\n\t\tslog.Any(\"reaction\", s.logvalue_Federation_Reaction(v.GetReaction())),\n\t\tslog.String(\"favorite_value\", s.logvalue_Federation_MyFavoriteType(v.GetFavoriteValue()).String()),\n\t\tslog.Bool(\"cmp\", v.GetCmp()),\n\t)\n}\n\nfunc (s *PrivateService) logvalue_Federation_PostArgument(v *PrivateService_Federation_PostArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *PrivateService) logvalue_Federation_Reaction(v *Reaction) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"favorite_type\", s.logvalue_Favorite_FavoriteType(v.GetFavoriteType()).String()),\n\t\tslog.String(\"favorite_type_str\", v.GetFavoriteTypeStr()),\n\t\tslog.Bool(\"cmp\", v.GetCmp()),\n\t)\n}\n\nfunc (s *PrivateService) logvalue_Federation_ReactionArgument(v *PrivateService_Federation_ReactionArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"v\", s.logvalue_Favorite_FavoriteType(v.V).String()),\n\t)\n}\n\nfunc (s *PrivateService) logvalue_Federation_User(v *User) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n\nfunc (s *PrivateService) logvalue_Federation_UserArgument(v *PrivateService_Federation_UserArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t\tslog.String(\"name\", v.Name),\n\t)\n}\n\n// Federation_GetStatusResponseVariable represents variable definitions in \"federation.GetStatusResponse\".\ntype DebugService_Federation_GetStatusResponseVariable struct {\n\tU *User\n}\n\n// Federation_GetStatusResponseArgument is argument for \"federation.GetStatusResponse\" message.\ntype DebugService_Federation_GetStatusResponseArgument struct {\n\tDebugService_Federation_GetStatusResponseVariable\n}\n\n// Federation_UserVariable represents variable definitions in \"federation.User\".\ntype DebugService_Federation_UserVariable struct {\n}\n\n// Federation_UserArgument is argument for \"federation.User\" message.\ntype DebugService_Federation_UserArgument struct {\n\tId   string\n\tName string\n\tDebugService_Federation_UserVariable\n}\n\n// DebugServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype DebugServiceConfig struct {\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// DebugServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype DebugServiceClientFactory interface {\n}\n\n// DebugServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype DebugServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// DebugServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype DebugServiceDependentClientSet struct {\n}\n\n// DebugServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype DebugServiceResolver interface {\n}\n\n// DebugServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype DebugServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// DebugServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype DebugServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// DebugServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype DebugServiceUnimplementedResolver struct{}\n\n// DebugService represents Federation Service.\ntype DebugService struct {\n\tUnimplementedDebugServiceServer\n\tcfg             DebugServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *DebugServiceDependentClientSet\n}\n\n// NewDebugService creates DebugService instance by DebugServiceConfig.\nfunc NewDebugService(cfg DebugServiceConfig) (*DebugService, error) {\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"federation.DebugService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.federation.GetStatusResponseArgument\": {},\n\t\t\"grpc.federation.private.federation.UserArgument\": {\n\t\t\t\"id\":   grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t\t\"name\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Name\"),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"favorite.FavoriteType\", favorite.FavoriteType_value, favorite.FavoriteType_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"federation.MyFavoriteType\", MyFavoriteType_value, MyFavoriteType_name)...)\n\tsvc := &DebugService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tclient:          &DebugServiceDependentClientSet{},\n\t}\n\treturn svc, nil\n}\n\n// CleanupDebugService cleanup all resources to prevent goroutine leaks.\nfunc CleanupDebugService(ctx context.Context, svc *DebugService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *DebugService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n// GetStatus implements \"federation.DebugService/GetStatus\" method.\nfunc (s *DebugService) GetStatus(ctx context.Context, req *GetStatusRequest) (res *GetStatusResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.DebugService/GetStatus\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Federation_GetStatusResponse(ctx, &DebugService_Federation_GetStatusResponseArgument{})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Federation_GetStatusResponse resolve \"federation.GetStatusResponse\" message.\nfunc (s *DebugService) resolve_Federation_GetStatusResponse(ctx context.Context, req *DebugService_Federation_GetStatusResponseArgument) (*GetStatusResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.GetStatusResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.GetStatusResponse\", slog.Any(\"message_args\", s.logvalue_Federation_GetStatusResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tU *User\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.federation.GetStatusResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"u\"\n\t\t  message {\n\t\t    name: \"User\"\n\t\t    args: [\n\t\t      { name: \"id\", by: \"'xxxx'\" },\n\t\t      { name: \"name\", by: \"'yyyy'\" }\n\t\t    ]\n\t\t  }\n\t\t}\n\t*/\n\tdef_u := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*User, *localValueType]{\n\t\t\tName: `u`,\n\t\t\tType: grpcfed.CELObjectType(\"federation.User\"),\n\t\t\tSetter: func(value *localValueType, v *User) error {\n\t\t\t\tvalue.vars.U = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &DebugService_Federation_UserArgument{}\n\t\t\t\t// { name: \"id\", by: \"'xxxx'\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `'xxxx'`,\n\t\t\t\t\tCacheIndex: 1,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { name: \"name\", by: \"'yyyy'\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `'yyyy'`,\n\t\t\t\t\tCacheIndex: 2,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Name = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Federation_User(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_u(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.DebugService_Federation_GetStatusResponseVariable.U = value.vars.U\n\n\t// create a message value to be returned.\n\tret := &GetStatusResponse{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"u\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*User]{\n\t\tValue:      value,\n\t\tExpr:       `u`,\n\t\tCacheIndex: 3,\n\t\tSetter: func(v *User) error {\n\t\t\tret.User = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.GetStatusResponse\", slog.Any(\"federation.GetStatusResponse\", s.logvalue_Federation_GetStatusResponse(ret)))\n\treturn ret, nil\n}\n\n// resolve_Federation_User resolve \"federation.User\" message.\nfunc (s *DebugService) resolve_Federation_User(ctx context.Context, req *DebugService_Federation_UserArgument) (*User, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.User\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.User\", slog.Any(\"message_args\", s.logvalue_Federation_UserArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.federation.UserArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &User{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"$.id\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `$.id`,\n\t\tCacheIndex: 4,\n\t\tSetter: func(v string) error {\n\t\t\tret.Id = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"$.name\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `$.name`,\n\t\tCacheIndex: 5,\n\t\tSetter: func(v string) error {\n\t\t\tret.Name = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.User\", slog.Any(\"federation.User\", s.logvalue_Federation_User(ret)))\n\treturn ret, nil\n}\n\nfunc (s *DebugService) logvalue_Federation_GetStatusResponse(v *GetStatusResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"user\", s.logvalue_Federation_User(v.GetUser())),\n\t)\n}\n\nfunc (s *DebugService) logvalue_Federation_GetStatusResponseArgument(v *DebugService_Federation_GetStatusResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *DebugService) logvalue_Federation_User(v *User) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n\nfunc (s *DebugService) logvalue_Federation_UserArgument(v *DebugService_Federation_UserArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t\tslog.String(\"name\", v.Name),\n\t)\n}\n"
  },
  {
    "path": "_examples/11_multi_service/federation/other.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: federation/other.proto\n\npackage federation\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype GetRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetRequest) Reset() {\n\t*x = GetRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_other_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetRequest) ProtoMessage() {}\n\nfunc (x *GetRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_other_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetRequest.ProtoReflect.Descriptor instead.\nfunc (*GetRequest) Descriptor() ([]byte, []int) {\n\treturn file_federation_other_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetRequest) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\ntype GetResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPost *Post `protobuf:\"bytes,1,opt,name=post,proto3\" json:\"post,omitempty\"`\n}\n\nfunc (x *GetResponse) Reset() {\n\t*x = GetResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_other_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetResponse) ProtoMessage() {}\n\nfunc (x *GetResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_other_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetResponse.ProtoReflect.Descriptor instead.\nfunc (*GetResponse) Descriptor() ([]byte, []int) {\n\treturn file_federation_other_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetResponse) GetPost() *Post {\n\tif x != nil {\n\t\treturn x.Post\n\t}\n\treturn nil\n}\n\nvar File_federation_other_proto protoreflect.FileDescriptor\n\nvar file_federation_other_proto_rawDesc = []byte{\n\t0x0a, 0x16, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6f, 0x74, 0x68,\n\t0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x20, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x22, 0x1c, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,\n\t0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,\n\t0x64, 0x22, 0x4c, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x12, 0x2b, 0x0a, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x6f, 0x73, 0x74,\n\t0x42, 0x05, 0x9a, 0x4a, 0x02, 0x08, 0x01, 0x52, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x3a, 0x10, 0x9a,\n\t0x4a, 0x0d, 0x0a, 0x0b, 0x0a, 0x01, 0x70, 0x6a, 0x06, 0x0a, 0x04, 0x50, 0x6f, 0x73, 0x74, 0x32,\n\t0x4d, 0x0a, 0x0c, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12,\n\t0x38, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x52,\n\t0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x1a, 0x03, 0x9a, 0x4a, 0x00, 0x42, 0x83,\n\t0x01, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x42, 0x0a, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a,\n\t0x1d, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x3b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xa2, 0x02,\n\t0x03, 0x46, 0x58, 0x58, 0xaa, 0x02, 0x0a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0xca, 0x02, 0x0a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xe2, 0x02,\n\t0x16, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x47, 0x50, 0x42, 0x4d,\n\t0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_federation_other_proto_rawDescOnce sync.Once\n\tfile_federation_other_proto_rawDescData = file_federation_other_proto_rawDesc\n)\n\nfunc file_federation_other_proto_rawDescGZIP() []byte {\n\tfile_federation_other_proto_rawDescOnce.Do(func() {\n\t\tfile_federation_other_proto_rawDescData = protoimpl.X.CompressGZIP(file_federation_other_proto_rawDescData)\n\t})\n\treturn file_federation_other_proto_rawDescData\n}\n\nvar file_federation_other_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_federation_other_proto_goTypes = []interface{}{\n\t(*GetRequest)(nil),  // 0: federation.GetRequest\n\t(*GetResponse)(nil), // 1: federation.GetResponse\n\t(*Post)(nil),        // 2: federation.Post\n}\nvar file_federation_other_proto_depIdxs = []int32{\n\t2, // 0: federation.GetResponse.post:type_name -> federation.Post\n\t0, // 1: federation.OtherService.Get:input_type -> federation.GetRequest\n\t1, // 2: federation.OtherService.Get:output_type -> federation.GetResponse\n\t2, // [2:3] is the sub-list for method output_type\n\t1, // [1:2] is the sub-list for method input_type\n\t1, // [1:1] is the sub-list for extension type_name\n\t1, // [1:1] is the sub-list for extension extendee\n\t0, // [0:1] is the sub-list for field type_name\n}\n\nfunc init() { file_federation_other_proto_init() }\nfunc file_federation_other_proto_init() {\n\tif File_federation_other_proto != nil {\n\t\treturn\n\t}\n\tfile_federation_federation_proto_init()\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_federation_other_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_other_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_federation_other_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_federation_other_proto_goTypes,\n\t\tDependencyIndexes: file_federation_other_proto_depIdxs,\n\t\tMessageInfos:      file_federation_other_proto_msgTypes,\n\t}.Build()\n\tFile_federation_other_proto = out.File\n\tfile_federation_other_proto_rawDesc = nil\n\tfile_federation_other_proto_goTypes = nil\n\tfile_federation_other_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/11_multi_service/federation/other_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: federation/other.proto\n\npackage federation\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tOtherService_Get_FullMethodName = \"/federation.OtherService/Get\"\n)\n\n// OtherServiceClient is the client API for OtherService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype OtherServiceClient interface {\n\tGet(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error)\n}\n\ntype otherServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewOtherServiceClient(cc grpc.ClientConnInterface) OtherServiceClient {\n\treturn &otherServiceClient{cc}\n}\n\nfunc (c *otherServiceClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) {\n\tout := new(GetResponse)\n\terr := c.cc.Invoke(ctx, OtherService_Get_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// OtherServiceServer is the server API for OtherService service.\n// All implementations must embed UnimplementedOtherServiceServer\n// for forward compatibility\ntype OtherServiceServer interface {\n\tGet(context.Context, *GetRequest) (*GetResponse, error)\n\tmustEmbedUnimplementedOtherServiceServer()\n}\n\n// UnimplementedOtherServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedOtherServiceServer struct {\n}\n\nfunc (UnimplementedOtherServiceServer) Get(context.Context, *GetRequest) (*GetResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method Get not implemented\")\n}\nfunc (UnimplementedOtherServiceServer) mustEmbedUnimplementedOtherServiceServer() {}\n\n// UnsafeOtherServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to OtherServiceServer will\n// result in compilation errors.\ntype UnsafeOtherServiceServer interface {\n\tmustEmbedUnimplementedOtherServiceServer()\n}\n\nfunc RegisterOtherServiceServer(s grpc.ServiceRegistrar, srv OtherServiceServer) {\n\ts.RegisterService(&OtherService_ServiceDesc, srv)\n}\n\nfunc _OtherService_Get_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(OtherServiceServer).Get(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: OtherService_Get_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(OtherServiceServer).Get(ctx, req.(*GetRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// OtherService_ServiceDesc is the grpc.ServiceDesc for OtherService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar OtherService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"federation.OtherService\",\n\tHandlerType: (*OtherServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"Get\",\n\t\t\tHandler:    _OtherService_Get_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"federation/other.proto\",\n}\n"
  },
  {
    "path": "_examples/11_multi_service/federation/other_grpc_federation.pb.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: federation/other.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n\n\tfavorite \"example/favorite\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Federation_GetResponseVariable represents variable definitions in \"federation.GetResponse\".\ntype OtherService_Federation_GetResponseVariable struct {\n\tP *Post\n}\n\n// Federation_GetResponseArgument is argument for \"federation.GetResponse\" message.\ntype OtherService_Federation_GetResponseArgument struct {\n\tId string\n\tOtherService_Federation_GetResponseVariable\n}\n\n// Federation_GetResponse_PostArgument is custom resolver's argument for \"post\" field of \"federation.GetResponse\" message.\ntype OtherService_Federation_GetResponse_PostArgument struct {\n\t*OtherService_Federation_GetResponseArgument\n}\n\n// Federation_PostVariable represents variable definitions in \"federation.Post\".\ntype OtherService_Federation_PostVariable struct {\n\tCmp           bool\n\tFavoriteValue favorite.FavoriteType\n\tReaction      *Reaction\n\tU             *User\n}\n\n// Federation_PostArgument is argument for \"federation.Post\" message.\ntype OtherService_Federation_PostArgument struct {\n\tOtherService_Federation_PostVariable\n}\n\n// Federation_ReactionVariable represents variable definitions in \"federation.Reaction\".\ntype OtherService_Federation_ReactionVariable struct {\n\tCmp bool\n}\n\n// Federation_ReactionArgument is argument for \"federation.Reaction\" message.\ntype OtherService_Federation_ReactionArgument struct {\n\tV favorite.FavoriteType\n\tOtherService_Federation_ReactionVariable\n}\n\n// Federation_UserVariable represents variable definitions in \"federation.User\".\ntype OtherService_Federation_UserVariable struct {\n}\n\n// Federation_UserArgument is argument for \"federation.User\" message.\ntype OtherService_Federation_UserArgument struct {\n\tId   string\n\tName string\n\tOtherService_Federation_UserVariable\n}\n\n// OtherServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype OtherServiceConfig struct {\n\t// Resolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\n\t// If this interface is not provided, an error is returned during initialization.\n\tResolver OtherServiceResolver // required\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// OtherServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype OtherServiceClientFactory interface {\n}\n\n// OtherServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype OtherServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// OtherServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype OtherServiceDependentClientSet struct {\n}\n\n// OtherServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype OtherServiceResolver interface {\n\t// Resolve_Federation_GetResponse_Post implements resolver for \"federation.GetResponse.post\".\n\tResolve_Federation_GetResponse_Post(context.Context, *OtherService_Federation_GetResponse_PostArgument) (*Post, error)\n}\n\n// OtherServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype OtherServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// OtherServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype OtherServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// OtherServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype OtherServiceUnimplementedResolver struct{}\n\n// Resolve_Federation_GetResponse_Post resolve \"federation.GetResponse.post\".\n// This method always returns Unimplemented error.\nfunc (OtherServiceUnimplementedResolver) Resolve_Federation_GetResponse_Post(context.Context, *OtherService_Federation_GetResponse_PostArgument) (ret *Post, e error) {\n\te = grpcfed.GRPCErrorf(grpcfed.UnimplementedCode, \"method Resolve_Federation_GetResponse_Post not implemented\")\n\treturn\n}\n\n// OtherService represents Federation Service.\ntype OtherService struct {\n\tUnimplementedOtherServiceServer\n\tcfg             OtherServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tresolver        OtherServiceResolver\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *OtherServiceDependentClientSet\n}\n\n// NewOtherService creates OtherService instance by OtherServiceConfig.\nfunc NewOtherService(cfg OtherServiceConfig) (*OtherService, error) {\n\tif cfg.Resolver == nil {\n\t\treturn nil, grpcfed.ErrResolverConfig\n\t}\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"federation.OtherService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.federation.GetResponseArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.federation.PostArgument\": {},\n\t\t\"grpc.federation.private.federation.ReactionArgument\": {\n\t\t\t\"v\": grpcfed.NewCELFieldType(grpcfed.CELIntType, \"V\"),\n\t\t},\n\t\t\"grpc.federation.private.federation.UserArgument\": {\n\t\t\t\"id\":   grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t\t\"name\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Name\"),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"favorite.FavoriteType\", favorite.FavoriteType_value, favorite.FavoriteType_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"federation.MyFavoriteType\", MyFavoriteType_value, MyFavoriteType_name)...)\n\tsvc := &OtherService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tresolver:        cfg.Resolver,\n\t\tclient:          &OtherServiceDependentClientSet{},\n\t}\n\tif resolver, ok := cfg.Resolver.(grpcfed.CustomResolverInitializer); ok {\n\t\tctx := context.Background()\n\t\tif err := resolver.Init(ctx); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn svc, nil\n}\n\n// CleanupOtherService cleanup all resources to prevent goroutine leaks.\nfunc CleanupOtherService(ctx context.Context, svc *OtherService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *OtherService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n// Get implements \"federation.OtherService/Get\" method.\nfunc (s *OtherService) Get(ctx context.Context, req *GetRequest) (res *GetResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.OtherService/Get\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Federation_GetResponse(ctx, &OtherService_Federation_GetResponseArgument{\n\t\tId: req.GetId(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Federation_GetResponse resolve \"federation.GetResponse\" message.\nfunc (s *OtherService) resolve_Federation_GetResponse(ctx context.Context, req *OtherService_Federation_GetResponseArgument) (*GetResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.GetResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.GetResponse\", slog.Any(\"message_args\", s.logvalue_Federation_GetResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tP *Post\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.federation.GetResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"p\"\n\t\t  message {\n\t\t    name: \"Post\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_p := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Post, *localValueType]{\n\t\t\tName: `p`,\n\t\t\tType: grpcfed.CELObjectType(\"federation.Post\"),\n\t\t\tSetter: func(value *localValueType, v *Post) error {\n\t\t\t\tvalue.vars.P = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &OtherService_Federation_PostArgument{}\n\t\t\t\tret, err := s.resolve_Federation_Post(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_p(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.OtherService_Federation_GetResponseVariable.P = value.vars.P\n\n\t// create a message value to be returned.\n\tret := &GetResponse{}\n\n\t// field binding section.\n\t{\n\t\t// (grpc.federation.field).custom_resolver = true\n\t\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx)) // create a new reference to logger.\n\t\tvar err error\n\t\tret.Post, err = s.resolver.Resolve_Federation_GetResponse_Post(ctx, &OtherService_Federation_GetResponse_PostArgument{\n\t\t\tOtherService_Federation_GetResponseArgument: req,\n\t\t})\n\t\tif err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.GetResponse\", slog.Any(\"federation.GetResponse\", s.logvalue_Federation_GetResponse(ret)))\n\treturn ret, nil\n}\n\n// resolve_Federation_Post resolve \"federation.Post\" message.\nfunc (s *OtherService) resolve_Federation_Post(ctx context.Context, req *OtherService_Federation_PostArgument) (*Post, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.Post\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.Post\", slog.Any(\"message_args\", s.logvalue_Federation_PostArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tCmp           bool\n\t\t\tFavoriteValue favorite.FavoriteType\n\t\t\tReaction      *Reaction\n\t\t\tU             *User\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.federation.PostArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"u\"\n\t\t  message {\n\t\t    name: \"User\"\n\t\t    args: [\n\t\t      { name: \"id\", by: \"'foo'\" },\n\t\t      { name: \"name\", by: \"'bar'\" }\n\t\t    ]\n\t\t  }\n\t\t}\n\t*/\n\tdef_u := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*User, *localValueType]{\n\t\t\tName: `u`,\n\t\t\tType: grpcfed.CELObjectType(\"federation.User\"),\n\t\t\tSetter: func(value *localValueType, v *User) error {\n\t\t\t\tvalue.vars.U = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &OtherService_Federation_UserArgument{}\n\t\t\t\t// { name: \"id\", by: \"'foo'\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `'foo'`,\n\t\t\t\t\tCacheIndex: 1,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { name: \"name\", by: \"'bar'\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `'bar'`,\n\t\t\t\t\tCacheIndex: 2,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Name = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Federation_User(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"favorite_value\"\n\t\t  by: \"favorite.FavoriteType.value('TYPE1')\"\n\t\t}\n\t*/\n\tdef_favorite_value := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[favorite.FavoriteType, *localValueType]{\n\t\t\tName: `favorite_value`,\n\t\t\tType: grpcfed.CELIntType,\n\t\t\tSetter: func(value *localValueType, v favorite.FavoriteType) error {\n\t\t\t\tvalue.vars.FavoriteValue = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `favorite.FavoriteType.value('TYPE1')`,\n\t\t\tByCacheIndex: 3,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"cmp\"\n\t\t  by: \"favorite_value == favorite.FavoriteType.TYPE1\"\n\t\t}\n\t*/\n\tdef_cmp := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[bool, *localValueType]{\n\t\t\tName: `cmp`,\n\t\t\tType: grpcfed.CELBoolType,\n\t\t\tSetter: func(value *localValueType, v bool) error {\n\t\t\t\tvalue.vars.Cmp = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `favorite_value == favorite.FavoriteType.TYPE1`,\n\t\t\tByCacheIndex: 4,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"reaction\"\n\t\t  message {\n\t\t    name: \"Reaction\"\n\t\t    args { name: \"v\", by: \"favorite_value\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_reaction := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Reaction, *localValueType]{\n\t\t\tName: `reaction`,\n\t\t\tType: grpcfed.CELObjectType(\"federation.Reaction\"),\n\t\t\tSetter: func(value *localValueType, v *Reaction) error {\n\t\t\t\tvalue.vars.Reaction = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &OtherService_Federation_ReactionArgument{}\n\t\t\t\t// { name: \"v\", by: \"favorite_value\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[favorite.FavoriteType]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `favorite_value`,\n\t\t\t\t\tCacheIndex: 5,\n\t\t\t\t\tSetter: func(v favorite.FavoriteType) error {\n\t\t\t\t\t\targs.V = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Federation_Reaction(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t   favorite_value ─┐\n\t                        cmp ─┐\n\t   favorite_value ─┐         │\n\t                   reaction ─┤\n\t                          u ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_favorite_value(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_cmp(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_favorite_value(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_reaction(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_u(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.OtherService_Federation_PostVariable.Cmp = value.vars.Cmp\n\treq.OtherService_Federation_PostVariable.FavoriteValue = value.vars.FavoriteValue\n\treq.OtherService_Federation_PostVariable.Reaction = value.vars.Reaction\n\treq.OtherService_Federation_PostVariable.U = value.vars.U\n\n\t// create a message value to be returned.\n\tret := &Post{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'post-id'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'post-id'`,\n\t\tCacheIndex: 6,\n\t\tSetter: func(v string) error {\n\t\t\tret.Id = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"'title'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'title'`,\n\t\tCacheIndex: 7,\n\t\tSetter: func(v string) error {\n\t\t\tret.Title = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"'content'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'content'`,\n\t\tCacheIndex: 8,\n\t\tSetter: func(v string) error {\n\t\t\tret.Content = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"u\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*User]{\n\t\tValue:      value,\n\t\tExpr:       `u`,\n\t\tCacheIndex: 9,\n\t\tSetter: func(v *User) error {\n\t\t\tret.User = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"reaction\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*Reaction]{\n\t\tValue:      value,\n\t\tExpr:       `reaction`,\n\t\tCacheIndex: 10,\n\t\tSetter: func(v *Reaction) error {\n\t\t\tret.Reaction = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"favorite_value\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[favorite.FavoriteType]{\n\t\tValue:      value,\n\t\tExpr:       `favorite_value`,\n\t\tCacheIndex: 11,\n\t\tSetter: func(v favorite.FavoriteType) error {\n\t\t\tfavoriteValueValue, err := s.cast_Favorite_FavoriteType__to__Federation_MyFavoriteType(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.FavoriteValue = favoriteValueValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"cmp\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[bool]{\n\t\tValue:      value,\n\t\tExpr:       `cmp`,\n\t\tCacheIndex: 12,\n\t\tSetter: func(v bool) error {\n\t\t\tret.Cmp = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.Post\", slog.Any(\"federation.Post\", s.logvalue_Federation_Post(ret)))\n\treturn ret, nil\n}\n\n// resolve_Federation_Reaction resolve \"federation.Reaction\" message.\nfunc (s *OtherService) resolve_Federation_Reaction(ctx context.Context, req *OtherService_Federation_ReactionArgument) (*Reaction, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.Reaction\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.Reaction\", slog.Any(\"message_args\", s.logvalue_Federation_ReactionArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tCmp bool\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.federation.ReactionArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"cmp\"\n\t\t  by: \"$.v == favorite.FavoriteType.TYPE1\"\n\t\t}\n\t*/\n\tdef_cmp := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[bool, *localValueType]{\n\t\t\tName: `cmp`,\n\t\t\tType: grpcfed.CELBoolType,\n\t\t\tSetter: func(value *localValueType, v bool) error {\n\t\t\t\tvalue.vars.Cmp = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `$.v == favorite.FavoriteType.TYPE1`,\n\t\t\tByCacheIndex: 13,\n\t\t})\n\t}\n\n\tif err := def_cmp(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.OtherService_Federation_ReactionVariable.Cmp = value.vars.Cmp\n\n\t// create a message value to be returned.\n\tret := &Reaction{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"favorite.FavoriteType.value('TYPE1')\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[favorite.FavoriteType]{\n\t\tValue:      value,\n\t\tExpr:       `favorite.FavoriteType.value('TYPE1')`,\n\t\tCacheIndex: 14,\n\t\tSetter: func(v favorite.FavoriteType) error {\n\t\t\tret.FavoriteType = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"favorite.FavoriteType.name(favorite.FavoriteType.value('TYPE1'))\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `favorite.FavoriteType.name(favorite.FavoriteType.value('TYPE1'))`,\n\t\tCacheIndex: 15,\n\t\tSetter: func(v string) error {\n\t\t\tret.FavoriteTypeStr = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"cmp\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[bool]{\n\t\tValue:      value,\n\t\tExpr:       `cmp`,\n\t\tCacheIndex: 16,\n\t\tSetter: func(v bool) error {\n\t\t\tret.Cmp = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.Reaction\", slog.Any(\"federation.Reaction\", s.logvalue_Federation_Reaction(ret)))\n\treturn ret, nil\n}\n\n// resolve_Federation_User resolve \"federation.User\" message.\nfunc (s *OtherService) resolve_Federation_User(ctx context.Context, req *OtherService_Federation_UserArgument) (*User, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.User\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.User\", slog.Any(\"message_args\", s.logvalue_Federation_UserArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.federation.UserArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &User{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"$.id\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `$.id`,\n\t\tCacheIndex: 17,\n\t\tSetter: func(v string) error {\n\t\t\tret.Id = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"$.name\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `$.name`,\n\t\tCacheIndex: 18,\n\t\tSetter: func(v string) error {\n\t\t\tret.Name = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.User\", slog.Any(\"federation.User\", s.logvalue_Federation_User(ret)))\n\treturn ret, nil\n}\n\n// cast_Favorite_FavoriteType__to__Federation_MyFavoriteType cast from \"favorite.FavoriteType\" to \"federation.MyFavoriteType\".\nfunc (s *OtherService) cast_Favorite_FavoriteType__to__Federation_MyFavoriteType(from favorite.FavoriteType) (MyFavoriteType, error) {\n\tvar ret MyFavoriteType\n\tswitch from {\n\tcase favorite.FavoriteType_UNKNOWN:\n\t\tret = MyFavoriteType_UNKNOWN\n\tcase favorite.FavoriteType_TYPE1:\n\t\tret = MyFavoriteType_TYPE1\n\tdefault:\n\t\tret = 0\n\t}\n\treturn ret, nil\n}\n\nfunc (s *OtherService) logvalue_Favorite_FavoriteType(v favorite.FavoriteType) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tswitch v {\n\tcase favorite.FavoriteType_UNKNOWN:\n\t\treturn slog.StringValue(\"UNKNOWN\")\n\tcase favorite.FavoriteType_TYPE1:\n\t\treturn slog.StringValue(\"TYPE1\")\n\tcase favorite.FavoriteType_TYPE2:\n\t\treturn slog.StringValue(\"TYPE2\")\n\t}\n\treturn slog.StringValue(\"\")\n}\n\nfunc (s *OtherService) logvalue_Federation_GetResponse(v *GetResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"post\", s.logvalue_Federation_Post(v.GetPost())),\n\t)\n}\n\nfunc (s *OtherService) logvalue_Federation_GetResponseArgument(v *OtherService_Federation_GetResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *OtherService) logvalue_Federation_MyFavoriteType(v MyFavoriteType) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tswitch v {\n\tcase MyFavoriteType_UNKNOWN:\n\t\treturn slog.StringValue(\"UNKNOWN\")\n\tcase MyFavoriteType_TYPE1:\n\t\treturn slog.StringValue(\"TYPE1\")\n\t}\n\treturn slog.StringValue(\"\")\n}\n\nfunc (s *OtherService) logvalue_Federation_Post(v *Post) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.String(\"title\", v.GetTitle()),\n\t\tslog.String(\"content\", v.GetContent()),\n\t\tslog.Any(\"user\", s.logvalue_Federation_User(v.GetUser())),\n\t\tslog.Any(\"reaction\", s.logvalue_Federation_Reaction(v.GetReaction())),\n\t\tslog.String(\"favorite_value\", s.logvalue_Federation_MyFavoriteType(v.GetFavoriteValue()).String()),\n\t\tslog.Bool(\"cmp\", v.GetCmp()),\n\t)\n}\n\nfunc (s *OtherService) logvalue_Federation_PostArgument(v *OtherService_Federation_PostArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *OtherService) logvalue_Federation_Reaction(v *Reaction) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"favorite_type\", s.logvalue_Favorite_FavoriteType(v.GetFavoriteType()).String()),\n\t\tslog.String(\"favorite_type_str\", v.GetFavoriteTypeStr()),\n\t\tslog.Bool(\"cmp\", v.GetCmp()),\n\t)\n}\n\nfunc (s *OtherService) logvalue_Federation_ReactionArgument(v *OtherService_Federation_ReactionArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"v\", s.logvalue_Favorite_FavoriteType(v.V).String()),\n\t)\n}\n\nfunc (s *OtherService) logvalue_Federation_User(v *User) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n\nfunc (s *OtherService) logvalue_Federation_UserArgument(v *OtherService_Federation_UserArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t\tslog.String(\"name\", v.Name),\n\t)\n}\n"
  },
  {
    "path": "_examples/11_multi_service/federation/ping.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: federation/ping.proto\n\npackage federation\n\nimport (\n\tlike \"example/like\"\n\t_ \"github.com/mercari/grpc-federation/grpc/federation\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\ttimestamppb \"google.golang.org/protobuf/types/known/timestamppb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype PingRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *PingRequest) Reset() {\n\t*x = PingRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_ping_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *PingRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*PingRequest) ProtoMessage() {}\n\nfunc (x *PingRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_ping_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use PingRequest.ProtoReflect.Descriptor instead.\nfunc (*PingRequest) Descriptor() ([]byte, []int) {\n\treturn file_federation_ping_proto_rawDescGZIP(), []int{0}\n}\n\ntype PingResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tLikeType like.LikeType          `protobuf:\"varint,1,opt,name=like_type,json=likeType,proto3,enum=like.LikeType\" json:\"like_type,omitempty\"`\n\tPingAt   *timestamppb.Timestamp `protobuf:\"bytes,2,opt,name=ping_at,json=pingAt,proto3\" json:\"ping_at,omitempty\"`\n}\n\nfunc (x *PingResponse) Reset() {\n\t*x = PingResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_ping_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *PingResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*PingResponse) ProtoMessage() {}\n\nfunc (x *PingResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_ping_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use PingResponse.ProtoReflect.Descriptor instead.\nfunc (*PingResponse) Descriptor() ([]byte, []int) {\n\treturn file_federation_ping_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *PingResponse) GetLikeType() like.LikeType {\n\tif x != nil {\n\t\treturn x.LikeType\n\t}\n\treturn like.LikeType(0)\n}\n\nfunc (x *PingResponse) GetPingAt() *timestamppb.Timestamp {\n\tif x != nil {\n\t\treturn x.PingAt\n\t}\n\treturn nil\n}\n\nvar File_federation_ping_proto protoreflect.FileDescriptor\n\nvar file_federation_ping_proto_rawDesc = []byte{\n\t0x0a, 0x15, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x70, 0x69, 0x6e,\n\t0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0f, 0x6c, 0x69, 0x6b, 0x65, 0x2f, 0x6c, 0x69, 0x6b,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x0d, 0x0a, 0x0b, 0x50, 0x69, 0x6e, 0x67, 0x52,\n\t0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x99, 0x01, 0x0a, 0x0c, 0x50, 0x69, 0x6e, 0x67, 0x52,\n\t0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x69, 0x6b, 0x65, 0x5f,\n\t0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e, 0x2e, 0x6c, 0x69, 0x6b,\n\t0x65, 0x2e, 0x4c, 0x69, 0x6b, 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x06, 0x9a, 0x4a, 0x03, 0x12,\n\t0x01, 0x31, 0x52, 0x08, 0x6c, 0x69, 0x6b, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x54, 0x0a, 0x07,\n\t0x70, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,\n\t0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x1f, 0x9a, 0x4a, 0x1c, 0x12, 0x1a,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x74, 0x69, 0x6d, 0x65, 0x2e, 0x6e, 0x6f, 0x77, 0x28, 0x29, 0x52, 0x06, 0x70, 0x69, 0x6e, 0x67,\n\t0x41, 0x74, 0x42, 0x82, 0x01, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x09, 0x50, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f,\n\t0x50, 0x01, 0x5a, 0x1d, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0xa2, 0x02, 0x03, 0x46, 0x58, 0x58, 0xaa, 0x02, 0x0a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0xca, 0x02, 0x0a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0xe2, 0x02, 0x16, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x47,\n\t0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0a, 0x46, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_federation_ping_proto_rawDescOnce sync.Once\n\tfile_federation_ping_proto_rawDescData = file_federation_ping_proto_rawDesc\n)\n\nfunc file_federation_ping_proto_rawDescGZIP() []byte {\n\tfile_federation_ping_proto_rawDescOnce.Do(func() {\n\t\tfile_federation_ping_proto_rawDescData = protoimpl.X.CompressGZIP(file_federation_ping_proto_rawDescData)\n\t})\n\treturn file_federation_ping_proto_rawDescData\n}\n\nvar file_federation_ping_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_federation_ping_proto_goTypes = []interface{}{\n\t(*PingRequest)(nil),           // 0: federation.PingRequest\n\t(*PingResponse)(nil),          // 1: federation.PingResponse\n\t(like.LikeType)(0),            // 2: like.LikeType\n\t(*timestamppb.Timestamp)(nil), // 3: google.protobuf.Timestamp\n}\nvar file_federation_ping_proto_depIdxs = []int32{\n\t2, // 0: federation.PingResponse.like_type:type_name -> like.LikeType\n\t3, // 1: federation.PingResponse.ping_at:type_name -> google.protobuf.Timestamp\n\t2, // [2:2] is the sub-list for method output_type\n\t2, // [2:2] is the sub-list for method input_type\n\t2, // [2:2] is the sub-list for extension type_name\n\t2, // [2:2] is the sub-list for extension extendee\n\t0, // [0:2] is the sub-list for field type_name\n}\n\nfunc init() { file_federation_ping_proto_init() }\nfunc file_federation_ping_proto_init() {\n\tif File_federation_ping_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_federation_ping_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*PingRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_ping_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*PingResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_federation_ping_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_federation_ping_proto_goTypes,\n\t\tDependencyIndexes: file_federation_ping_proto_depIdxs,\n\t\tMessageInfos:      file_federation_ping_proto_msgTypes,\n\t}.Build()\n\tFile_federation_ping_proto = out.File\n\tfile_federation_ping_proto_rawDesc = nil\n\tfile_federation_ping_proto_goTypes = nil\n\tfile_federation_ping_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/11_multi_service/federation/ping_grpc_federation.pb.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\npackage federation\n\nimport (\n\t\"reflect\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Federation_PingResponseArgument is argument for \"federation.PingResponse\" message.\ntype Federation_PingResponseArgument[T any] struct {\n\tClient T\n}\n"
  },
  {
    "path": "_examples/11_multi_service/federation/reaction.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: federation/reaction.proto\n\npackage federation\n\nimport (\n\tfavorite \"example/favorite\"\n\t_ \"github.com/mercari/grpc-federation/grpc/federation\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Reaction struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tFavoriteType    favorite.FavoriteType `protobuf:\"varint,1,opt,name=favorite_type,json=favoriteType,proto3,enum=favorite.FavoriteType\" json:\"favorite_type,omitempty\"`\n\tFavoriteTypeStr string                `protobuf:\"bytes,2,opt,name=favorite_type_str,json=favoriteTypeStr,proto3\" json:\"favorite_type_str,omitempty\"`\n\tCmp             bool                  `protobuf:\"varint,3,opt,name=cmp,proto3\" json:\"cmp,omitempty\"`\n}\n\nfunc (x *Reaction) Reset() {\n\t*x = Reaction{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_reaction_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Reaction) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Reaction) ProtoMessage() {}\n\nfunc (x *Reaction) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_reaction_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Reaction.ProtoReflect.Descriptor instead.\nfunc (*Reaction) Descriptor() ([]byte, []int) {\n\treturn file_federation_reaction_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Reaction) GetFavoriteType() favorite.FavoriteType {\n\tif x != nil {\n\t\treturn x.FavoriteType\n\t}\n\treturn favorite.FavoriteType(0)\n}\n\nfunc (x *Reaction) GetFavoriteTypeStr() string {\n\tif x != nil {\n\t\treturn x.FavoriteTypeStr\n\t}\n\treturn \"\"\n}\n\nfunc (x *Reaction) GetCmp() bool {\n\tif x != nil {\n\t\treturn x.Cmp\n\t}\n\treturn false\n}\n\nvar File_federation_reaction_proto protoreflect.FileDescriptor\n\nvar file_federation_reaction_proto_rawDesc = []byte{\n\t0x0a, 0x19, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x72, 0x65, 0x61,\n\t0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x20, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x66, 0x61, 0x76, 0x6f, 0x72,\n\t0x69, 0x74, 0x65, 0x2f, 0x66, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x22, 0xb1, 0x02, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12,\n\t0x66, 0x0a, 0x0d, 0x66, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x66, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74,\n\t0x65, 0x2e, 0x46, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x29,\n\t0x9a, 0x4a, 0x26, 0x12, 0x24, 0x66, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x2e, 0x46, 0x61,\n\t0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65,\n\t0x28, 0x27, 0x54, 0x59, 0x50, 0x45, 0x31, 0x27, 0x29, 0x52, 0x0c, 0x66, 0x61, 0x76, 0x6f, 0x72,\n\t0x69, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x71, 0x0a, 0x11, 0x66, 0x61, 0x76, 0x6f, 0x72,\n\t0x69, 0x74, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x09, 0x42, 0x45, 0x9a, 0x4a, 0x42, 0x12, 0x40, 0x66, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74,\n\t0x65, 0x2e, 0x46, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x6e,\n\t0x61, 0x6d, 0x65, 0x28, 0x66, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x2e, 0x46, 0x61, 0x76,\n\t0x6f, 0x72, 0x69, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28,\n\t0x27, 0x54, 0x59, 0x50, 0x45, 0x31, 0x27, 0x29, 0x29, 0x52, 0x0f, 0x66, 0x61, 0x76, 0x6f, 0x72,\n\t0x69, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x53, 0x74, 0x72, 0x12, 0x1a, 0x0a, 0x03, 0x63, 0x6d,\n\t0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x42, 0x08, 0x9a, 0x4a, 0x05, 0x12, 0x03, 0x63, 0x6d,\n\t0x70, 0x52, 0x03, 0x63, 0x6d, 0x70, 0x3a, 0x2e, 0x9a, 0x4a, 0x2b, 0x0a, 0x29, 0x0a, 0x03, 0x63,\n\t0x6d, 0x70, 0x5a, 0x22, 0x24, 0x2e, 0x76, 0x20, 0x3d, 0x3d, 0x20, 0x66, 0x61, 0x76, 0x6f, 0x72,\n\t0x69, 0x74, 0x65, 0x2e, 0x46, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65,\n\t0x2e, 0x54, 0x59, 0x50, 0x45, 0x31, 0x42, 0x86, 0x01, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0d, 0x52, 0x65, 0x61, 0x63, 0x74,\n\t0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x1d, 0x65, 0x78, 0x61, 0x6d,\n\t0x70, 0x6c, 0x65, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xa2, 0x02, 0x03, 0x46, 0x58, 0x58, 0xaa,\n\t0x02, 0x0a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xca, 0x02, 0x0a, 0x46,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xe2, 0x02, 0x16, 0x46, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61,\n\t0x74, 0x61, 0xea, 0x02, 0x0a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62,\n\t0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_federation_reaction_proto_rawDescOnce sync.Once\n\tfile_federation_reaction_proto_rawDescData = file_federation_reaction_proto_rawDesc\n)\n\nfunc file_federation_reaction_proto_rawDescGZIP() []byte {\n\tfile_federation_reaction_proto_rawDescOnce.Do(func() {\n\t\tfile_federation_reaction_proto_rawDescData = protoimpl.X.CompressGZIP(file_federation_reaction_proto_rawDescData)\n\t})\n\treturn file_federation_reaction_proto_rawDescData\n}\n\nvar file_federation_reaction_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_federation_reaction_proto_goTypes = []interface{}{\n\t(*Reaction)(nil),           // 0: federation.Reaction\n\t(favorite.FavoriteType)(0), // 1: favorite.FavoriteType\n}\nvar file_federation_reaction_proto_depIdxs = []int32{\n\t1, // 0: federation.Reaction.favorite_type:type_name -> favorite.FavoriteType\n\t1, // [1:1] is the sub-list for method output_type\n\t1, // [1:1] is the sub-list for method input_type\n\t1, // [1:1] is the sub-list for extension type_name\n\t1, // [1:1] is the sub-list for extension extendee\n\t0, // [0:1] is the sub-list for field type_name\n}\n\nfunc init() { file_federation_reaction_proto_init() }\nfunc file_federation_reaction_proto_init() {\n\tif File_federation_reaction_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_federation_reaction_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Reaction); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_federation_reaction_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_federation_reaction_proto_goTypes,\n\t\tDependencyIndexes: file_federation_reaction_proto_depIdxs,\n\t\tMessageInfos:      file_federation_reaction_proto_msgTypes,\n\t}.Build()\n\tFile_federation_reaction_proto = out.File\n\tfile_federation_reaction_proto_rawDesc = nil\n\tfile_federation_reaction_proto_goTypes = nil\n\tfile_federation_reaction_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/11_multi_service/federation/reaction_grpc_federation.pb.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: federation/reaction.proto\npackage federation\n\nimport (\n\t\"reflect\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n"
  },
  {
    "path": "_examples/11_multi_service/go.mod",
    "content": "module example\n\ngo 1.24.0\n\nreplace github.com/mercari/grpc-federation => ../../\n\nrequire (\n\tgithub.com/google/go-cmp v0.7.0\n\tgithub.com/mercari/grpc-federation v0.0.0-00010101000000-000000000000\n\tgo.opentelemetry.io/otel v1.24.0\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0\n\tgo.opentelemetry.io/otel/sdk v1.24.0\n\tgo.opentelemetry.io/otel/trace v1.24.0\n\tgo.uber.org/goleak v1.3.0\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7\n\tgoogle.golang.org/grpc v1.65.0\n\tgoogle.golang.org/protobuf v1.34.2\n)\n\nrequire (\n\tcel.dev/expr v0.19.1 // indirect\n\tgithub.com/antlr4-go/antlr/v4 v4.13.0 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.2.1 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/goccy/wasi-go v0.3.2 // indirect\n\tgithub.com/google/cel-go v0.23.1 // indirect\n\tgithub.com/google/uuid v1.6.0 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect\n\tgithub.com/kelseyhightower/envconfig v1.4.0 // indirect\n\tgithub.com/stealthrocket/wazergo v0.19.1 // indirect\n\tgithub.com/stoewer/go-strcase v1.3.0 // indirect\n\tgithub.com/tetratelabs/wazero v1.10.1 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.24.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.0.0 // indirect\n\tgolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect\n\tgolang.org/x/net v0.38.0 // indirect\n\tgolang.org/x/sync v0.14.0 // indirect\n\tgolang.org/x/sys v0.37.0 // indirect\n\tgolang.org/x/text v0.23.0 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 // indirect\n)\n"
  },
  {
    "path": "_examples/11_multi_service/go.sum",
    "content": "cel.dev/expr v0.19.1 h1:NciYrtDRIR0lNCnH1LFJegdjspNx9fI59O7TWcua/W4=\ncel.dev/expr v0.19.1/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw=\ngithub.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=\ngithub.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/goccy/wasi-go v0.3.2 h1:wAvGXmqCkfcp0B0AwIp5Ya53hzDwkKm9W8iuT3nCCz0=\ngithub.com/goccy/wasi-go v0.3.2/go.mod h1:nIKD204n9xa4Z20UV+XA483kIr9TAl2vXr+X5qVAO5M=\ngithub.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4=\ngithub.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=\ngithub.com/google/cel-go v0.23.1 h1:91ThhEZlBcE5rB2adBVXqvDoqdL8BG2oyhd0bK1I/r4=\ngithub.com/google/cel-go v0.23.1/go.mod h1:52Pb6QsDbC5kvgxvZhiL9QX1oZEkcUF/ZqaPx1J5Wwo=\ngithub.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\ngithub.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg=\ngithub.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=\ngithub.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/stealthrocket/wazergo v0.19.1 h1:BPrITETPgSFwiytwmToO0MbUC/+RGC39JScz1JmmG6c=\ngithub.com/stealthrocket/wazergo v0.19.1/go.mod h1:riI0hxw4ndZA5e6z7PesHg2BtTftcZaMxRcoiGGipTs=\ngithub.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs=\ngithub.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tetratelabs/wazero v1.10.1 h1:2DugeJf6VVk58KTPszlNfeeN8AhhpwcZqkJj2wwFuH8=\ngithub.com/tetratelabs/wazero v1.10.1/go.mod h1:DRm5twOQ5Gr1AoEdSi0CLjDQF1J9ZAuyqFIjl1KKfQU=\ngo.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo=\ngo.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0=\ngo.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI=\ngo.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=\ngo.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw=\ngo.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg=\ngo.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=\ngo.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=\ngo.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=\ngo.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=\ngolang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=\ngolang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=\ngolang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=\ngolang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=\ngolang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=\ngolang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=\ngolang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 h1:YcyjlL1PRr2Q17/I0dPk2JmYS5CDXfcdb2Z3YRioEbw=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7 h1:2035KHhUv+EpyB+hWgJnaWKJOdX1E95w2S8Rr4uWKTs=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=\ngoogle.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=\ngoogle.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=\ngoogle.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=\ngoogle.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "_examples/11_multi_service/grpc/federation/federation.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: grpc/federation/federation.proto\n\npackage federation\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\tcode \"google.golang.org/genproto/googleapis/rpc/code\"\n\terrdetails \"google.golang.org/genproto/googleapis/rpc/errdetails\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tdescriptorpb \"google.golang.org/protobuf/types/descriptorpb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// TypeKind is primitive kind list.\ntype TypeKind int32\n\nconst (\n\t// UNKNOWN represents unexpected value.\n\tTypeKind_UNKNOWN TypeKind = 0\n\t// STRING is used to convert the input value to `string` type.\n\tTypeKind_STRING TypeKind = 1\n\t// BOOL is used to convert the input value to `bool` type.\n\tTypeKind_BOOL TypeKind = 2\n\t// INT64 is used to convert the input value to `int64` type.\n\tTypeKind_INT64 TypeKind = 3\n\t// UINT64 is used to convert the input value to `uint64` type.\n\tTypeKind_UINT64 TypeKind = 4\n\t// DOUBLE is used to convert the input value to `double` type.\n\tTypeKind_DOUBLE TypeKind = 5\n\t// DURATION is used to convert the input value to the `google.protobuf.Duration` type.\n\tTypeKind_DURATION TypeKind = 6\n)\n\n// Enum value maps for TypeKind.\nvar (\n\tTypeKind_name = map[int32]string{\n\t\t0: \"UNKNOWN\",\n\t\t1: \"STRING\",\n\t\t2: \"BOOL\",\n\t\t3: \"INT64\",\n\t\t4: \"UINT64\",\n\t\t5: \"DOUBLE\",\n\t\t6: \"DURATION\",\n\t}\n\tTypeKind_value = map[string]int32{\n\t\t\"UNKNOWN\":  0,\n\t\t\"STRING\":   1,\n\t\t\"BOOL\":     2,\n\t\t\"INT64\":    3,\n\t\t\"UINT64\":   4,\n\t\t\"DOUBLE\":   5,\n\t\t\"DURATION\": 6,\n\t}\n)\n\nfunc (x TypeKind) Enum() *TypeKind {\n\tp := new(TypeKind)\n\t*p = x\n\treturn p\n}\n\nfunc (x TypeKind) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (TypeKind) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_grpc_federation_federation_proto_enumTypes[0].Descriptor()\n}\n\nfunc (TypeKind) Type() protoreflect.EnumType {\n\treturn &file_grpc_federation_federation_proto_enumTypes[0]\n}\n\nfunc (x TypeKind) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use TypeKind.Descriptor instead.\nfunc (TypeKind) EnumDescriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\n// LogLevel is the importance or severity of a log event.\ntype GRPCError_LogLevel int32\n\nconst (\n\t// UNKNOWN represents unexpected value.\n\tGRPCError_UNKNOWN GRPCError_LogLevel = 0\n\t// DEBUG is used for detailed information that is useful during development and debugging.\n\tGRPCError_DEBUG GRPCError_LogLevel = 1\n\t// INFO logs are used to provide information about the normal functioning of the application.\n\tGRPCError_INFO GRPCError_LogLevel = 2\n\t// WARN signifies a potential problem or warning that does not necessarily stop the program from working but may lead to issues in the future.\n\tGRPCError_WARN GRPCError_LogLevel = 3\n\t// ERROR indicates a serious issue that has caused a failure in the application.\n\tGRPCError_ERROR GRPCError_LogLevel = 4\n)\n\n// Enum value maps for GRPCError_LogLevel.\nvar (\n\tGRPCError_LogLevel_name = map[int32]string{\n\t\t0: \"UNKNOWN\",\n\t\t1: \"DEBUG\",\n\t\t2: \"INFO\",\n\t\t3: \"WARN\",\n\t\t4: \"ERROR\",\n\t}\n\tGRPCError_LogLevel_value = map[string]int32{\n\t\t\"UNKNOWN\": 0,\n\t\t\"DEBUG\":   1,\n\t\t\"INFO\":    2,\n\t\t\"WARN\":    3,\n\t\t\"ERROR\":   4,\n\t}\n)\n\nfunc (x GRPCError_LogLevel) Enum() *GRPCError_LogLevel {\n\tp := new(GRPCError_LogLevel)\n\t*p = x\n\treturn p\n}\n\nfunc (x GRPCError_LogLevel) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (GRPCError_LogLevel) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_grpc_federation_federation_proto_enumTypes[1].Descriptor()\n}\n\nfunc (GRPCError_LogLevel) Type() protoreflect.EnumType {\n\treturn &file_grpc_federation_federation_proto_enumTypes[1]\n}\n\nfunc (x GRPCError_LogLevel) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use GRPCError_LogLevel.Descriptor instead.\nfunc (GRPCError_LogLevel) EnumDescriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{24, 0}\n}\n\ntype FileRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPlugin *CELPlugin `protobuf:\"bytes,1,opt,name=plugin,proto3\" json:\"plugin,omitempty\"`\n\t// import can be used to resolve methods, messages, etc. that are referenced in gRPC Federation rules.\n\tImport []string `protobuf:\"bytes,2,rep,name=import,proto3\" json:\"import,omitempty\"`\n}\n\nfunc (x *FileRule) Reset() {\n\t*x = FileRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *FileRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*FileRule) ProtoMessage() {}\n\nfunc (x *FileRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use FileRule.ProtoReflect.Descriptor instead.\nfunc (*FileRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *FileRule) GetPlugin() *CELPlugin {\n\tif x != nil {\n\t\treturn x.Plugin\n\t}\n\treturn nil\n}\n\nfunc (x *FileRule) GetImport() []string {\n\tif x != nil {\n\t\treturn x.Import\n\t}\n\treturn nil\n}\n\ntype EnumRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// alias mapping between enums defined in other packages and enums defined on the federation service side.\n\t// The alias is the FQDN ( <package-name>.<enum-name> ) to the enum.\n\t// If this definition exists, type conversion is automatically performed before the enum value assignment operation.\n\t// If a enum with this option has a value that is not present in the enum specified by alias, and the alias option is not specified for that value, an error is occurred.\n\t// You can specify multiple aliases. In that case, only values common to all aliases will be considered.\n\t// Specifying a value that is not included in either alias will result in an error.\n\tAlias []string `protobuf:\"bytes,1,rep,name=alias,proto3\" json:\"alias,omitempty\"`\n}\n\nfunc (x *EnumRule) Reset() {\n\t*x = EnumRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumRule) ProtoMessage() {}\n\nfunc (x *EnumRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumRule.ProtoReflect.Descriptor instead.\nfunc (*EnumRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *EnumRule) GetAlias() []string {\n\tif x != nil {\n\t\treturn x.Alias\n\t}\n\treturn nil\n}\n\ntype EnumValueRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// specifies the default value of the enum.\n\t// All values other than those specified in alias will be default values.\n\tDefault *bool `protobuf:\"varint,1,opt,name=default,proto3,oneof\" json:\"default,omitempty\"`\n\t// alias can be used when alias is specified in grpc.federation.enum option,\n\t// and specifies the value name to be referenced among the enums specified in alias of enum option.\n\t// multiple value names can be specified for alias.\n\tAlias []string `protobuf:\"bytes,2,rep,name=alias,proto3\" json:\"alias,omitempty\"`\n\t// attr is used to hold multiple name-value pairs corresponding to an enum value.\n\t// The values specified by the name must be consistently specified for all enum values.\n\t// The values stored using this feature can be retrieved using the `attr()` method of the enum API.\n\tAttr []*EnumValueAttribute `protobuf:\"bytes,3,rep,name=attr,proto3\" json:\"attr,omitempty\"`\n\t// noalias exclude from the target of alias.\n\t// This option cannot be specified simultaneously with `default` or `alias`.\n\tNoalias *bool `protobuf:\"varint,4,opt,name=noalias,proto3,oneof\" json:\"noalias,omitempty\"`\n}\n\nfunc (x *EnumValueRule) Reset() {\n\t*x = EnumValueRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumValueRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumValueRule) ProtoMessage() {}\n\nfunc (x *EnumValueRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumValueRule.ProtoReflect.Descriptor instead.\nfunc (*EnumValueRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *EnumValueRule) GetDefault() bool {\n\tif x != nil && x.Default != nil {\n\t\treturn *x.Default\n\t}\n\treturn false\n}\n\nfunc (x *EnumValueRule) GetAlias() []string {\n\tif x != nil {\n\t\treturn x.Alias\n\t}\n\treturn nil\n}\n\nfunc (x *EnumValueRule) GetAttr() []*EnumValueAttribute {\n\tif x != nil {\n\t\treturn x.Attr\n\t}\n\treturn nil\n}\n\nfunc (x *EnumValueRule) GetNoalias() bool {\n\tif x != nil && x.Noalias != nil {\n\t\treturn *x.Noalias\n\t}\n\treturn false\n}\n\ntype EnumValueAttribute struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the attribute key.\n\t// This value is used to search for values using the `attr(<name>)` method.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// value represents the value corresponding to `name`.\n\tValue string `protobuf:\"bytes,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *EnumValueAttribute) Reset() {\n\t*x = EnumValueAttribute{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumValueAttribute) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumValueAttribute) ProtoMessage() {}\n\nfunc (x *EnumValueAttribute) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumValueAttribute.ProtoReflect.Descriptor instead.\nfunc (*EnumValueAttribute) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *EnumValueAttribute) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnumValueAttribute) GetValue() string {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn \"\"\n}\n\ntype OneofRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *OneofRule) Reset() {\n\t*x = OneofRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *OneofRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*OneofRule) ProtoMessage() {}\n\nfunc (x *OneofRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use OneofRule.ProtoReflect.Descriptor instead.\nfunc (*OneofRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{4}\n}\n\n// ServiceRule define gRPC Federation rules for the service.\ntype ServiceRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// env defines the environment variable.\n\tEnv *Env `protobuf:\"bytes,1,opt,name=env,proto3\" json:\"env,omitempty\"`\n\t// var defines the service-level variables.\n\tVar []*ServiceVariable `protobuf:\"bytes,2,rep,name=var,proto3\" json:\"var,omitempty\"`\n}\n\nfunc (x *ServiceRule) Reset() {\n\t*x = ServiceRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceRule) ProtoMessage() {}\n\nfunc (x *ServiceRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceRule.ProtoReflect.Descriptor instead.\nfunc (*ServiceRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *ServiceRule) GetEnv() *Env {\n\tif x != nil {\n\t\treturn x.Env\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceRule) GetVar() []*ServiceVariable {\n\tif x != nil {\n\t\treturn x.Var\n\t}\n\treturn nil\n}\n\n// Env is used when setting environment variables.\n// There are two ways to configure it.\ntype Env struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// var is used to directly list environment variables.\n\tVar []*EnvVar `protobuf:\"bytes,1,rep,name=var,proto3\" json:\"var,omitempty\"`\n\t// message is used to reference an already defined Protocol Buffers' message for defining environment variables.\n\t// If you want to set detailed options for the fields of the message, use the `env` option in FieldRule.\n\tMessage string `protobuf:\"bytes,2,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Env) Reset() {\n\t*x = Env{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Env) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Env) ProtoMessage() {}\n\nfunc (x *Env) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Env.ProtoReflect.Descriptor instead.\nfunc (*Env) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *Env) GetVar() []*EnvVar {\n\tif x != nil {\n\t\treturn x.Var\n\t}\n\treturn nil\n}\n\nfunc (x *Env) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\n// ServiceVariable define variables at the service level.\n// This definition is executed at server startup, after the initialization of Env.\n// The defined variables can be used across all messages that the service depends on.\ntype ServiceVariable struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is a variable name.\n\t// This name can be referenced in all CELs related to the service by using `grpc.federation.var.` prefix.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// if specify the condition for evaluating expr.\n\t// this value evaluated by CEL and it must return a boolean value.\n\t// If the result of evaluation is `false`, the value assigned to name is the default value of the result of evaluation of `expr`.\n\tIf *string `protobuf:\"bytes,2,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n\t// expr specify the value to be assigned to name.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*ServiceVariable_By\n\t//\t*ServiceVariable_Map\n\t//\t*ServiceVariable_Message\n\t//\t*ServiceVariable_Validation\n\t//\t*ServiceVariable_Enum\n\t//\t*ServiceVariable_Switch\n\tExpr isServiceVariable_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *ServiceVariable) Reset() {\n\t*x = ServiceVariable{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceVariable) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceVariable) ProtoMessage() {}\n\nfunc (x *ServiceVariable) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceVariable.ProtoReflect.Descriptor instead.\nfunc (*ServiceVariable) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{7}\n}\n\nfunc (x *ServiceVariable) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *ServiceVariable) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\nfunc (m *ServiceVariable) GetExpr() isServiceVariable_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetBy() string {\n\tif x, ok := x.GetExpr().(*ServiceVariable_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *ServiceVariable) GetMap() *MapExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetMessage() *MessageExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetValidation() *ServiceVariableValidationExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Validation); ok {\n\t\treturn x.Validation\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetEnum() *EnumExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetSwitch() *SwitchExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Switch); ok {\n\t\treturn x.Switch\n\t}\n\treturn nil\n}\n\ntype isServiceVariable_Expr interface {\n\tisServiceVariable_Expr()\n}\n\ntype ServiceVariable_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\ntype ServiceVariable_Map struct {\n\t// map apply map operation for the specified repeated type.\n\tMap *MapExpr `protobuf:\"bytes,12,opt,name=map,proto3,oneof\"`\n}\n\ntype ServiceVariable_Message struct {\n\t// message gets with message arguments.\n\tMessage *MessageExpr `protobuf:\"bytes,13,opt,name=message,proto3,oneof\"`\n}\n\ntype ServiceVariable_Validation struct {\n\t// validation defines the validation rule and message.\n\tValidation *ServiceVariableValidationExpr `protobuf:\"bytes,14,opt,name=validation,proto3,oneof\"`\n}\n\ntype ServiceVariable_Enum struct {\n\t// enum gets with cel value.\n\tEnum *EnumExpr `protobuf:\"bytes,15,opt,name=enum,proto3,oneof\"`\n}\n\ntype ServiceVariable_Switch struct {\n\t// switch provides conditional evaluation with multiple branches.\n\tSwitch *SwitchExpr `protobuf:\"bytes,16,opt,name=switch,proto3,oneof\"`\n}\n\nfunc (*ServiceVariable_By) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Map) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Message) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Validation) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Enum) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Switch) isServiceVariable_Expr() {}\n\n// ServiceVariableValidationExpr represents validation rule and error message.\ntype ServiceVariableValidationExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// if specifies condition in CEL. If the condition is true, it returns error.\n\t// The return value must always be of type boolean.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3\" json:\"if,omitempty\"`\n\t// message is a error message in CEL.\n\tMessage string `protobuf:\"bytes,2,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *ServiceVariableValidationExpr) Reset() {\n\t*x = ServiceVariableValidationExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceVariableValidationExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceVariableValidationExpr) ProtoMessage() {}\n\nfunc (x *ServiceVariableValidationExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceVariableValidationExpr.ProtoReflect.Descriptor instead.\nfunc (*ServiceVariableValidationExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{8}\n}\n\nfunc (x *ServiceVariableValidationExpr) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *ServiceVariableValidationExpr) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\n// EnvVar represents an environment variable.\ntype EnvVar struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is an environment variable name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// type is an environment variable type.\n\tType *EnvType `protobuf:\"bytes,2,opt,name=type,proto3\" json:\"type,omitempty\"`\n\t// option is an additional option for parsing environment variable.\n\tOption *EnvVarOption `protobuf:\"bytes,3,opt,name=option,proto3,oneof\" json:\"option,omitempty\"`\n}\n\nfunc (x *EnvVar) Reset() {\n\t*x = EnvVar{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvVar) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvVar) ProtoMessage() {}\n\nfunc (x *EnvVar) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvVar.ProtoReflect.Descriptor instead.\nfunc (*EnvVar) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{9}\n}\n\nfunc (x *EnvVar) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnvVar) GetType() *EnvType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nfunc (x *EnvVar) GetOption() *EnvVarOption {\n\tif x != nil {\n\t\treturn x.Option\n\t}\n\treturn nil\n}\n\n// EnvType represents type information for environment variable.\ntype EnvType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to Type:\n\t//\n\t//\t*EnvType_Kind\n\t//\t*EnvType_Repeated\n\t//\t*EnvType_Map\n\tType isEnvType_Type `protobuf_oneof:\"type\"`\n}\n\nfunc (x *EnvType) Reset() {\n\t*x = EnvType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[10]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvType) ProtoMessage() {}\n\nfunc (x *EnvType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[10]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvType.ProtoReflect.Descriptor instead.\nfunc (*EnvType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{10}\n}\n\nfunc (m *EnvType) GetType() isEnvType_Type {\n\tif m != nil {\n\t\treturn m.Type\n\t}\n\treturn nil\n}\n\nfunc (x *EnvType) GetKind() TypeKind {\n\tif x, ok := x.GetType().(*EnvType_Kind); ok {\n\t\treturn x.Kind\n\t}\n\treturn TypeKind_UNKNOWN\n}\n\nfunc (x *EnvType) GetRepeated() *EnvType {\n\tif x, ok := x.GetType().(*EnvType_Repeated); ok {\n\t\treturn x.Repeated\n\t}\n\treturn nil\n}\n\nfunc (x *EnvType) GetMap() *EnvMapType {\n\tif x, ok := x.GetType().(*EnvType_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\ntype isEnvType_Type interface {\n\tisEnvType_Type()\n}\n\ntype EnvType_Kind struct {\n\t// kind is used when the type is a primitive type.\n\tKind TypeKind `protobuf:\"varint,1,opt,name=kind,proto3,enum=grpc.federation.TypeKind,oneof\"`\n}\n\ntype EnvType_Repeated struct {\n\t// repeated is used when the type is a repeated type.\n\tRepeated *EnvType `protobuf:\"bytes,2,opt,name=repeated,proto3,oneof\"`\n}\n\ntype EnvType_Map struct {\n\t// map is used when the type is a map type.\n\tMap *EnvMapType `protobuf:\"bytes,3,opt,name=map,proto3,oneof\"`\n}\n\nfunc (*EnvType_Kind) isEnvType_Type() {}\n\nfunc (*EnvType_Repeated) isEnvType_Type() {}\n\nfunc (*EnvType_Map) isEnvType_Type() {}\n\n// EnvMapType represents map type.\ntype EnvMapType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// key represents map's key type.\n\tKey *EnvType `protobuf:\"bytes,1,opt,name=key,proto3\" json:\"key,omitempty\"`\n\t// value represents map's value type.\n\tValue *EnvType `protobuf:\"bytes,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *EnvMapType) Reset() {\n\t*x = EnvMapType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[11]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvMapType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvMapType) ProtoMessage() {}\n\nfunc (x *EnvMapType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[11]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvMapType.ProtoReflect.Descriptor instead.\nfunc (*EnvMapType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{11}\n}\n\nfunc (x *EnvMapType) GetKey() *EnvType {\n\tif x != nil {\n\t\treturn x.Key\n\t}\n\treturn nil\n}\n\nfunc (x *EnvMapType) GetValue() *EnvType {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn nil\n}\n\n// EnvVarOption represents additional option for environment variable.\n// The option work with the `envconfig` library in Go language.\n// For detailed specifications, please refer to the library's documentation ( https://pkg.go.dev/github.com/kelseyhightower/envconfig#section-readme ).\ntype EnvVarOption struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// alternate use this option if you want to use an environment variable with a different name than the value specified in `EnvVar.name`.\n\tAlternate *string `protobuf:\"bytes,1,opt,name=alternate,proto3,oneof\" json:\"alternate,omitempty\"`\n\t// default specify the value to use as a fallback if the specified environment variable is not found.\n\tDefault *string `protobuf:\"bytes,2,opt,name=default,proto3,oneof\" json:\"default,omitempty\"`\n\t// required require the environment variable to exist.\n\t// If it does not exist, an error will occur at startup.\n\tRequired *bool `protobuf:\"varint,3,opt,name=required,proto3,oneof\" json:\"required,omitempty\"`\n\t// ignored if ignored is true, it does nothing even if the environment variable exists.\n\tIgnored *bool `protobuf:\"varint,4,opt,name=ignored,proto3,oneof\" json:\"ignored,omitempty\"`\n}\n\nfunc (x *EnvVarOption) Reset() {\n\t*x = EnvVarOption{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[12]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvVarOption) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvVarOption) ProtoMessage() {}\n\nfunc (x *EnvVarOption) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[12]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvVarOption.ProtoReflect.Descriptor instead.\nfunc (*EnvVarOption) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{12}\n}\n\nfunc (x *EnvVarOption) GetAlternate() string {\n\tif x != nil && x.Alternate != nil {\n\t\treturn *x.Alternate\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnvVarOption) GetDefault() string {\n\tif x != nil && x.Default != nil {\n\t\treturn *x.Default\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnvVarOption) GetRequired() bool {\n\tif x != nil && x.Required != nil {\n\t\treturn *x.Required\n\t}\n\treturn false\n}\n\nfunc (x *EnvVarOption) GetIgnored() bool {\n\tif x != nil && x.Ignored != nil {\n\t\treturn *x.Ignored\n\t}\n\treturn false\n}\n\ntype MethodRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// the time to timeout. If the specified time period elapses, DEADLINE_EXCEEDED status is returned.\n\t// If you want to handle this error, you need to implement a custom error handler in Go.\n\t// The format is the same as Go's time.Duration format. See https://pkg.go.dev/time#ParseDuration.\n\tTimeout *string `protobuf:\"bytes,1,opt,name=timeout,proto3,oneof\" json:\"timeout,omitempty\"`\n\t// response specify the name of the message you want to use to create the response value.\n\t// If you specify a reserved type like `google.protobuf.Empty` as the response, you cannot define gRPC Federation options.\n\t// In such cases, you can specify a separate message to create the response value.\n\t// The specified response message must contain fields with the same names and types as all the fields in the original response.\n\tResponse *string `protobuf:\"bytes,2,opt,name=response,proto3,oneof\" json:\"response,omitempty\"`\n}\n\nfunc (x *MethodRule) Reset() {\n\t*x = MethodRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[13]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MethodRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MethodRule) ProtoMessage() {}\n\nfunc (x *MethodRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[13]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MethodRule.ProtoReflect.Descriptor instead.\nfunc (*MethodRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{13}\n}\n\nfunc (x *MethodRule) GetTimeout() string {\n\tif x != nil && x.Timeout != nil {\n\t\treturn *x.Timeout\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodRule) GetResponse() string {\n\tif x != nil && x.Response != nil {\n\t\treturn *x.Response\n\t}\n\treturn \"\"\n}\n\n// MessageRule define gRPC Federation rules for the message.\ntype MessageRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// def specify variables to be used in field binding by `grpc.federation.field` option.\n\tDef []*VariableDefinition `protobuf:\"bytes,1,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// if custom_resolver is true, the resolver for this message is implemented by Go.\n\t// If there are any values retrieved by resolver or messages, they are passed as arguments for custom resolver.\n\t// Each field of the message returned by the custom resolver is automatically bound.\n\t// If you want to change the binding process for a particular field, set `custom_resolver=true` option for that field.\n\tCustomResolver *bool `protobuf:\"varint,2,opt,name=custom_resolver,json=customResolver,proto3,oneof\" json:\"custom_resolver,omitempty\"`\n\t// alias mapping between messages defined in other packages and messages defined on the federation service side.\n\t// The alias is the FQDN ( <package-name>.<message-name> ) to the message.\n\t// If this definition exists, type conversion is automatically performed before the field assignment operation.\n\t// If a message with this option has a field that is not present in the message specified by alias, and the alias option is not specified for that field, an error is occurred.\n\t// You can specify multiple aliases. In that case, only fields common to all aliases will be considered.\n\t// Specifying a field that is not included in either alias will result in an error.\n\tAlias []string `protobuf:\"bytes,3,rep,name=alias,proto3\" json:\"alias,omitempty\"`\n}\n\nfunc (x *MessageRule) Reset() {\n\t*x = MessageRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[14]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MessageRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MessageRule) ProtoMessage() {}\n\nfunc (x *MessageRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[14]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MessageRule.ProtoReflect.Descriptor instead.\nfunc (*MessageRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{14}\n}\n\nfunc (x *MessageRule) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *MessageRule) GetCustomResolver() bool {\n\tif x != nil && x.CustomResolver != nil {\n\t\treturn *x.CustomResolver\n\t}\n\treturn false\n}\n\nfunc (x *MessageRule) GetAlias() []string {\n\tif x != nil {\n\t\treturn x.Alias\n\t}\n\treturn nil\n}\n\n// VariableDefinition represents variable definition.\ntype VariableDefinition struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is a variable name.\n\t// This name can be referenced in all CELs defined after itself in the same message.\n\t// It can also be referenced in `grpc.federation.field` option.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// if specify the condition for evaluating expr.\n\t// this value evaluated by CEL and it must return a boolean value.\n\t// If the result of evaluation is `false`, the value assigned to name is the default value of the result of evaluation of `expr`.\n\tIf *string `protobuf:\"bytes,2,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n\t// autobind if the result value of `expr` is a message type,\n\t// the value of a field with the same name and type as the field name of its own message is automatically assigned to the value of the field in the message.\n\t// If multiple autobinds are used at the same message,\n\t// you must explicitly use the `grpc.federation.field` option to do the binding yourself, since duplicate field names cannot be correctly determined as one.\n\tAutobind *bool `protobuf:\"varint,3,opt,name=autobind,proto3,oneof\" json:\"autobind,omitempty\"`\n\t// expr specify the value to be assigned to name.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*VariableDefinition_By\n\t//\t*VariableDefinition_Map\n\t//\t*VariableDefinition_Message\n\t//\t*VariableDefinition_Call\n\t//\t*VariableDefinition_Validation\n\t//\t*VariableDefinition_Enum\n\t//\t*VariableDefinition_Switch\n\tExpr isVariableDefinition_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *VariableDefinition) Reset() {\n\t*x = VariableDefinition{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[15]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *VariableDefinition) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*VariableDefinition) ProtoMessage() {}\n\nfunc (x *VariableDefinition) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[15]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use VariableDefinition.ProtoReflect.Descriptor instead.\nfunc (*VariableDefinition) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{15}\n}\n\nfunc (x *VariableDefinition) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *VariableDefinition) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *VariableDefinition) GetAutobind() bool {\n\tif x != nil && x.Autobind != nil {\n\t\treturn *x.Autobind\n\t}\n\treturn false\n}\n\nfunc (m *VariableDefinition) GetExpr() isVariableDefinition_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetBy() string {\n\tif x, ok := x.GetExpr().(*VariableDefinition_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *VariableDefinition) GetMap() *MapExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetMessage() *MessageExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetCall() *CallExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Call); ok {\n\t\treturn x.Call\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetValidation() *ValidationExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Validation); ok {\n\t\treturn x.Validation\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetEnum() *EnumExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetSwitch() *SwitchExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Switch); ok {\n\t\treturn x.Switch\n\t}\n\treturn nil\n}\n\ntype isVariableDefinition_Expr interface {\n\tisVariableDefinition_Expr()\n}\n\ntype VariableDefinition_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\ntype VariableDefinition_Map struct {\n\t// map apply map operation for the specified repeated type.\n\tMap *MapExpr `protobuf:\"bytes,12,opt,name=map,proto3,oneof\"`\n}\n\ntype VariableDefinition_Message struct {\n\t// message gets with message arguments.\n\tMessage *MessageExpr `protobuf:\"bytes,13,opt,name=message,proto3,oneof\"`\n}\n\ntype VariableDefinition_Call struct {\n\t// call specifies how to call gRPC method.\n\tCall *CallExpr `protobuf:\"bytes,14,opt,name=call,proto3,oneof\"`\n}\n\ntype VariableDefinition_Validation struct {\n\t// validation defines the validation rule and error.\n\tValidation *ValidationExpr `protobuf:\"bytes,15,opt,name=validation,proto3,oneof\"`\n}\n\ntype VariableDefinition_Enum struct {\n\t// enum gets with cel value.\n\tEnum *EnumExpr `protobuf:\"bytes,16,opt,name=enum,proto3,oneof\"`\n}\n\ntype VariableDefinition_Switch struct {\n\t// switch provides conditional evaluation with multiple branches.\n\tSwitch *SwitchExpr `protobuf:\"bytes,17,opt,name=switch,proto3,oneof\"`\n}\n\nfunc (*VariableDefinition_By) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Map) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Message) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Call) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Validation) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Enum) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Switch) isVariableDefinition_Expr() {}\n\n// MapExpr apply map operation for the specified repeated type.\ntype MapExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// iterator define iterator variable.\n\t// When evaluating CEL in `expr`, we can refer to the name defined in iterator.\n\tIterator *Iterator `protobuf:\"bytes,1,opt,name=iterator,proto3\" json:\"iterator,omitempty\"`\n\t// expr creates map elements using iterator variable.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*MapExpr_By\n\t//\t*MapExpr_Message\n\t//\t*MapExpr_Enum\n\tExpr isMapExpr_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *MapExpr) Reset() {\n\t*x = MapExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[16]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MapExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MapExpr) ProtoMessage() {}\n\nfunc (x *MapExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[16]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MapExpr.ProtoReflect.Descriptor instead.\nfunc (*MapExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{16}\n}\n\nfunc (x *MapExpr) GetIterator() *Iterator {\n\tif x != nil {\n\t\treturn x.Iterator\n\t}\n\treturn nil\n}\n\nfunc (m *MapExpr) GetExpr() isMapExpr_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *MapExpr) GetBy() string {\n\tif x, ok := x.GetExpr().(*MapExpr_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *MapExpr) GetMessage() *MessageExpr {\n\tif x, ok := x.GetExpr().(*MapExpr_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *MapExpr) GetEnum() *EnumExpr {\n\tif x, ok := x.GetExpr().(*MapExpr_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn nil\n}\n\ntype isMapExpr_Expr interface {\n\tisMapExpr_Expr()\n}\n\ntype MapExpr_By struct {\n\t// `by` evaluates with CEL.\n\t// this can refer to the variable declared by `iterator`.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\ntype MapExpr_Message struct {\n\t// message gets with message arguments, and it is made an element of the map.\n\t// The result type of MapExpr is the repeated type of the specified message.\n\tMessage *MessageExpr `protobuf:\"bytes,12,opt,name=message,proto3,oneof\"`\n}\n\ntype MapExpr_Enum struct {\n\t// enum creates enum value for each element of the map.\n\t// The result type of MapExpr is the repeated type of the specified enum.\n\tEnum *EnumExpr `protobuf:\"bytes,13,opt,name=enum,proto3,oneof\"`\n}\n\nfunc (*MapExpr_By) isMapExpr_Expr() {}\n\nfunc (*MapExpr_Message) isMapExpr_Expr() {}\n\nfunc (*MapExpr_Enum) isMapExpr_Expr() {}\n\n// Iterator represents iterator variable.\ntype Iterator struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// variable name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// src the value that will be the source for creating the iterator.\n\t// src must be a repeated type.\n\tSrc string `protobuf:\"bytes,2,opt,name=src,proto3\" json:\"src,omitempty\"`\n}\n\nfunc (x *Iterator) Reset() {\n\t*x = Iterator{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[17]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Iterator) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Iterator) ProtoMessage() {}\n\nfunc (x *Iterator) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[17]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Iterator.ProtoReflect.Descriptor instead.\nfunc (*Iterator) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{17}\n}\n\nfunc (x *Iterator) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Iterator) GetSrc() string {\n\tif x != nil {\n\t\treturn x.Src\n\t}\n\treturn \"\"\n}\n\n// MessageExpr represents dependent message.\ntype MessageExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name specify the message name by FQDN. format is `<package-name>.<message-name>`.\n\t// <package-name> can be omitted when referring to messages in the same package.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// args specify the parameters needed to get the message. This is called the \"message arguments\".\n\tArgs []*Argument `protobuf:\"bytes,2,rep,name=args,proto3\" json:\"args,omitempty\"`\n}\n\nfunc (x *MessageExpr) Reset() {\n\t*x = MessageExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[18]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MessageExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MessageExpr) ProtoMessage() {}\n\nfunc (x *MessageExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[18]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MessageExpr.ProtoReflect.Descriptor instead.\nfunc (*MessageExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{18}\n}\n\nfunc (x *MessageExpr) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *MessageExpr) GetArgs() []*Argument {\n\tif x != nil {\n\t\treturn x.Args\n\t}\n\treturn nil\n}\n\n// EnumExpr represents dependent enum.\ntype EnumExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name specify the enum name by FQDN. format is `<package-name>.<enum-name>`.\n\t// <package-name> can be omitted when referring to enum in the same package.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,2,opt,name=by,proto3\" json:\"by,omitempty\"`\n}\n\nfunc (x *EnumExpr) Reset() {\n\t*x = EnumExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[19]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumExpr) ProtoMessage() {}\n\nfunc (x *EnumExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[19]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumExpr.ProtoReflect.Descriptor instead.\nfunc (*EnumExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{19}\n}\n\nfunc (x *EnumExpr) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnumExpr) GetBy() string {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\n// CallExpr represents how to call gRPC method.\ntype CallExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// method specify the FQDN for the gRPC method. format is `<package-name>.<service-name>/<method-name>`.\n\tMethod string `protobuf:\"bytes,1,opt,name=method,proto3\" json:\"method,omitempty\"`\n\t// request specify request parameters for the gRPC method.\n\tRequest []*MethodRequest `protobuf:\"bytes,2,rep,name=request,proto3\" json:\"request,omitempty\"`\n\t// the time to timeout. If the specified time period elapses, DEADLINE_EXCEEDED status is returned.\n\t// If you want to handle this error, you need to implement a custom error handler in Go.\n\t// The format is the same as Go's time.Duration format. See https://pkg.go.dev/time#ParseDuration.\n\tTimeout *string `protobuf:\"bytes,3,opt,name=timeout,proto3,oneof\" json:\"timeout,omitempty\"`\n\t// retry specifies the retry policy if the method call fails.\n\tRetry *RetryPolicy `protobuf:\"bytes,4,opt,name=retry,proto3,oneof\" json:\"retry,omitempty\"`\n\t// error evaluated when an error occurs during a method call.\n\t// Multiple errors can be defined and are evaluated in the order in which they are described.\n\t// If an error occurs while creating an gRPC status error, original error will be returned.\n\tError []*GRPCError `protobuf:\"bytes,5,rep,name=error,proto3\" json:\"error,omitempty\"`\n\t// option is the gRPC's call option (https://pkg.go.dev/google.golang.org/grpc#CallOption).\n\tOption *GRPCCallOption `protobuf:\"bytes,6,opt,name=option,proto3,oneof\" json:\"option,omitempty\"`\n\t// metadata specify outgoing metadata with CEL value.\n\t// The specified type must always be of type map<string, repeated string>.\n\tMetadata *string `protobuf:\"bytes,7,opt,name=metadata,proto3,oneof\" json:\"metadata,omitempty\"`\n}\n\nfunc (x *CallExpr) Reset() {\n\t*x = CallExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[20]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CallExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CallExpr) ProtoMessage() {}\n\nfunc (x *CallExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[20]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CallExpr.ProtoReflect.Descriptor instead.\nfunc (*CallExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{20}\n}\n\nfunc (x *CallExpr) GetMethod() string {\n\tif x != nil {\n\t\treturn x.Method\n\t}\n\treturn \"\"\n}\n\nfunc (x *CallExpr) GetRequest() []*MethodRequest {\n\tif x != nil {\n\t\treturn x.Request\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetTimeout() string {\n\tif x != nil && x.Timeout != nil {\n\t\treturn *x.Timeout\n\t}\n\treturn \"\"\n}\n\nfunc (x *CallExpr) GetRetry() *RetryPolicy {\n\tif x != nil {\n\t\treturn x.Retry\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetError() []*GRPCError {\n\tif x != nil {\n\t\treturn x.Error\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetOption() *GRPCCallOption {\n\tif x != nil {\n\t\treturn x.Option\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetMetadata() string {\n\tif x != nil && x.Metadata != nil {\n\t\treturn *x.Metadata\n\t}\n\treturn \"\"\n}\n\n// SwitchExpr represents a switch statement. At least one \"case\", and \"default\", must be defined. All\n// case.if expressions must evaluate to a boolean value. All case.by expressions, and default.by, must\n// evaluate to the same type (the return type of the switch).\n//\n// When executed, the case.if expressions are evaluated in order, and, for the first case whose\n// case.if expression evaluates to true, its case.by is evaluated to make the return value of the\n// SwitchExpr.\n// If no case.if evaluates to true, default.by is evaluated to make the return value.\ntype SwitchExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Cases for the switch expression.\n\tCase []*SwitchCaseExpr `protobuf:\"bytes,1,rep,name=case,proto3\" json:\"case,omitempty\"`\n\t// The default case, if none of the \"case.if\" expressions evaluate to true.\n\tDefault *SwitchDefaultExpr `protobuf:\"bytes,2,opt,name=default,proto3\" json:\"default,omitempty\"`\n}\n\nfunc (x *SwitchExpr) Reset() {\n\t*x = SwitchExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[21]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SwitchExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SwitchExpr) ProtoMessage() {}\n\nfunc (x *SwitchExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[21]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SwitchExpr.ProtoReflect.Descriptor instead.\nfunc (*SwitchExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{21}\n}\n\nfunc (x *SwitchExpr) GetCase() []*SwitchCaseExpr {\n\tif x != nil {\n\t\treturn x.Case\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchExpr) GetDefault() *SwitchDefaultExpr {\n\tif x != nil {\n\t\treturn x.Default\n\t}\n\treturn nil\n}\n\n// SwitchCaseExpr represents a single case for a switch expression.\ntype SwitchCaseExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// if specify the condition for evaluating expr.\n\t// this value evaluated by CEL and it must return a boolean value.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3\" json:\"if,omitempty\"`\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,2,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// expr specify the value to return for the case.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*SwitchCaseExpr_By\n\tExpr isSwitchCaseExpr_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *SwitchCaseExpr) Reset() {\n\t*x = SwitchCaseExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[22]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SwitchCaseExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SwitchCaseExpr) ProtoMessage() {}\n\nfunc (x *SwitchCaseExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[22]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SwitchCaseExpr.ProtoReflect.Descriptor instead.\nfunc (*SwitchCaseExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{22}\n}\n\nfunc (x *SwitchCaseExpr) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *SwitchCaseExpr) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (m *SwitchCaseExpr) GetExpr() isSwitchCaseExpr_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchCaseExpr) GetBy() string {\n\tif x, ok := x.GetExpr().(*SwitchCaseExpr_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\ntype isSwitchCaseExpr_Expr interface {\n\tisSwitchCaseExpr_Expr()\n}\n\ntype SwitchCaseExpr_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\nfunc (*SwitchCaseExpr_By) isSwitchCaseExpr_Expr() {}\n\n// SwitchDefaultExpr represents the default case for a switch expression.\ntype SwitchDefaultExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,1,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// expr specify the value to return for the default case.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*SwitchDefaultExpr_By\n\tExpr isSwitchDefaultExpr_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *SwitchDefaultExpr) Reset() {\n\t*x = SwitchDefaultExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[23]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SwitchDefaultExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SwitchDefaultExpr) ProtoMessage() {}\n\nfunc (x *SwitchDefaultExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[23]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SwitchDefaultExpr.ProtoReflect.Descriptor instead.\nfunc (*SwitchDefaultExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{23}\n}\n\nfunc (x *SwitchDefaultExpr) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (m *SwitchDefaultExpr) GetExpr() isSwitchDefaultExpr_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchDefaultExpr) GetBy() string {\n\tif x, ok := x.GetExpr().(*SwitchDefaultExpr_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\ntype isSwitchDefaultExpr_Expr interface {\n\tisSwitchDefaultExpr_Expr()\n}\n\ntype SwitchDefaultExpr_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\nfunc (*SwitchDefaultExpr_By) isSwitchDefaultExpr_Expr() {}\n\n// GRPCError create gRPC status value.\ntype GRPCError struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,1,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// if specifies condition in CEL. If the condition is true, it returns defined error information.\n\t// If this field is omitted, it is always treated as 'true' and returns defined error information.\n\t// The return value must always be of type boolean.\n\tIf *string `protobuf:\"bytes,2,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n\t// code is a gRPC status code.\n\tCode *code.Code `protobuf:\"varint,3,opt,name=code,proto3,enum=google.rpc.Code,oneof\" json:\"code,omitempty\"`\n\t// message is a gRPC status message.\n\t// If omitted, the message will be auto-generated from the configurations.\n\tMessage *string `protobuf:\"bytes,4,opt,name=message,proto3,oneof\" json:\"message,omitempty\"`\n\t// details is a list of error details.\n\t// If returns error, the corresponding error details are set.\n\tDetails []*GRPCErrorDetail `protobuf:\"bytes,5,rep,name=details,proto3\" json:\"details,omitempty\"`\n\t// ignore ignore the error if the condition in the \"if\" field is true and \"ignore\" field is set to true.\n\t// When an error is ignored, the returned response is always null value.\n\t// If you want to return a response that is not null, please use `ignore_and_response` feature.\n\t// Therefore, `ignore` and `ignore_and_response` cannot be specified same.\n\tIgnore *bool `protobuf:\"varint,6,opt,name=ignore,proto3,oneof\" json:\"ignore,omitempty\"`\n\t// ignore_and_response ignore the error if the condition in the \"if\" field is true and it returns response specified in CEL.\n\t// The evaluation value of CEL must always be the same as the response message type.\n\t// `ignore` and `ignore_and_response` cannot be specified same.\n\tIgnoreAndResponse *string `protobuf:\"bytes,7,opt,name=ignore_and_response,json=ignoreAndResponse,proto3,oneof\" json:\"ignore_and_response,omitempty\"`\n\t// log_level can be configured to output logs as any log level.\n\t// If DEBUG is specified for the log_level, logs are output as debug logs.\n\t// default value is ERROR.\n\tLogLevel *GRPCError_LogLevel `protobuf:\"varint,8,opt,name=log_level,json=logLevel,proto3,enum=grpc.federation.GRPCError_LogLevel,oneof\" json:\"log_level,omitempty\"`\n}\n\nfunc (x *GRPCError) Reset() {\n\t*x = GRPCError{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[24]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GRPCError) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GRPCError) ProtoMessage() {}\n\nfunc (x *GRPCError) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[24]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GRPCError.ProtoReflect.Descriptor instead.\nfunc (*GRPCError) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{24}\n}\n\nfunc (x *GRPCError) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCError) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCError) GetCode() code.Code {\n\tif x != nil && x.Code != nil {\n\t\treturn *x.Code\n\t}\n\treturn code.Code(0)\n}\n\nfunc (x *GRPCError) GetMessage() string {\n\tif x != nil && x.Message != nil {\n\t\treturn *x.Message\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCError) GetDetails() []*GRPCErrorDetail {\n\tif x != nil {\n\t\treturn x.Details\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCError) GetIgnore() bool {\n\tif x != nil && x.Ignore != nil {\n\t\treturn *x.Ignore\n\t}\n\treturn false\n}\n\nfunc (x *GRPCError) GetIgnoreAndResponse() string {\n\tif x != nil && x.IgnoreAndResponse != nil {\n\t\treturn *x.IgnoreAndResponse\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCError) GetLogLevel() GRPCError_LogLevel {\n\tif x != nil && x.LogLevel != nil {\n\t\treturn *x.LogLevel\n\t}\n\treturn GRPCError_UNKNOWN\n}\n\ntype GRPCErrorDetail struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// if specifies condition rule in CEL. If the condition is true, gRPC error detail is added to the error.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3\" json:\"if,omitempty\"`\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,2,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// message represents arbitrary messages to describe the detail of the error.\n\tMessage []*MessageExpr `protobuf:\"bytes,3,rep,name=message,proto3\" json:\"message,omitempty\"`\n\t// error_info describes the cause of the error with structured details.\n\tErrorInfo []*errdetails.ErrorInfo `protobuf:\"bytes,4,rep,name=error_info,json=errorInfo,proto3\" json:\"error_info,omitempty\"`\n\t// retry_info describes when the clients can retry a failed request.\n\tRetryInfo []*errdetails.RetryInfo `protobuf:\"bytes,5,rep,name=retry_info,json=retryInfo,proto3\" json:\"retry_info,omitempty\"`\n\t// debug_info describes additional debugging info.\n\tDebugInfo []*errdetails.DebugInfo `protobuf:\"bytes,6,rep,name=debug_info,json=debugInfo,proto3\" json:\"debug_info,omitempty\"`\n\t// quota_failure describes how a quota check failed.\n\tQuotaFailure []*errdetails.QuotaFailure `protobuf:\"bytes,7,rep,name=quota_failure,json=quotaFailure,proto3\" json:\"quota_failure,omitempty\"`\n\t// precondition_failure describes what preconditions have failed.\n\tPreconditionFailure []*errdetails.PreconditionFailure `protobuf:\"bytes,8,rep,name=precondition_failure,json=preconditionFailure,proto3\" json:\"precondition_failure,omitempty\"`\n\t// bad_request describes violations in a client request.\n\tBadRequest []*errdetails.BadRequest `protobuf:\"bytes,9,rep,name=bad_request,json=badRequest,proto3\" json:\"bad_request,omitempty\"`\n\t// request_info contains metadata about the request that clients can attach.\n\tRequestInfo []*errdetails.RequestInfo `protobuf:\"bytes,10,rep,name=request_info,json=requestInfo,proto3\" json:\"request_info,omitempty\"`\n\t// resource_info describes the resource that is being accessed.\n\tResourceInfo []*errdetails.ResourceInfo `protobuf:\"bytes,11,rep,name=resource_info,json=resourceInfo,proto3\" json:\"resource_info,omitempty\"`\n\t// help provides links to documentation or for performing an out of band action.\n\tHelp []*errdetails.Help `protobuf:\"bytes,12,rep,name=help,proto3\" json:\"help,omitempty\"`\n\t// localized_message provides a localized error message that is safe to return to the user.\n\tLocalizedMessage []*errdetails.LocalizedMessage `protobuf:\"bytes,13,rep,name=localized_message,json=localizedMessage,proto3\" json:\"localized_message,omitempty\"`\n\t// by specify a message in CEL to express the details of the error.\n\tBy []string `protobuf:\"bytes,14,rep,name=by,proto3\" json:\"by,omitempty\"`\n}\n\nfunc (x *GRPCErrorDetail) Reset() {\n\t*x = GRPCErrorDetail{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[25]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GRPCErrorDetail) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GRPCErrorDetail) ProtoMessage() {}\n\nfunc (x *GRPCErrorDetail) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[25]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GRPCErrorDetail.ProtoReflect.Descriptor instead.\nfunc (*GRPCErrorDetail) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{25}\n}\n\nfunc (x *GRPCErrorDetail) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCErrorDetail) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetMessage() []*MessageExpr {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetErrorInfo() []*errdetails.ErrorInfo {\n\tif x != nil {\n\t\treturn x.ErrorInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetRetryInfo() []*errdetails.RetryInfo {\n\tif x != nil {\n\t\treturn x.RetryInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetDebugInfo() []*errdetails.DebugInfo {\n\tif x != nil {\n\t\treturn x.DebugInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetQuotaFailure() []*errdetails.QuotaFailure {\n\tif x != nil {\n\t\treturn x.QuotaFailure\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetPreconditionFailure() []*errdetails.PreconditionFailure {\n\tif x != nil {\n\t\treturn x.PreconditionFailure\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetBadRequest() []*errdetails.BadRequest {\n\tif x != nil {\n\t\treturn x.BadRequest\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetRequestInfo() []*errdetails.RequestInfo {\n\tif x != nil {\n\t\treturn x.RequestInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetResourceInfo() []*errdetails.ResourceInfo {\n\tif x != nil {\n\t\treturn x.ResourceInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetHelp() []*errdetails.Help {\n\tif x != nil {\n\t\treturn x.Help\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetLocalizedMessage() []*errdetails.LocalizedMessage {\n\tif x != nil {\n\t\treturn x.LocalizedMessage\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetBy() []string {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn nil\n}\n\n// GRPCCallOption configures a gRPC Call before it starts or extracts information from a gRPC Call after it completes.\ntype GRPCCallOption struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// set the content-subtype. For example, if content-subtype is \"json\", the Content-Type over the wire will be \"application/grpc+json\".\n\t// The content-subtype is converted to lowercase before being included in Content-Type.\n\t// See Content-Type on https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests for more details.\n\t// If no such codec is found, the call will result in an error with code INTERNAL.\n\tContentSubtype *string `protobuf:\"bytes,1,opt,name=content_subtype,json=contentSubtype,proto3,oneof\" json:\"content_subtype,omitempty\"`\n\t// header retrieves the header metadata for a unary RPC.\n\t// In order to obtain the metadata, you must specify a variable of type map<string, repeated string> in the header.\n\t// e.g.)\n\t// def [\n\t//\n\t//\t{ name: \"hdr\" by: \"grpc.federation.metadata.new()\" }\n\t//\t{ call { method: \"pkg.Method\" option { header: \"hdr\" } } }\n\t//\n\t// ]\n\tHeader *string `protobuf:\"bytes,2,opt,name=header,proto3,oneof\" json:\"header,omitempty\"`\n\t// max_call_recv_msg_size sets the maximum message size in bytes the client can receive.\n\t// If this is not set, gRPC uses the default 4MB.\n\tMaxCallRecvMsgSize *int64 `protobuf:\"varint,3,opt,name=max_call_recv_msg_size,json=maxCallRecvMsgSize,proto3,oneof\" json:\"max_call_recv_msg_size,omitempty\"`\n\t// max_call_send_msg_size sets the maximum message size in bytes the client can send.\n\t// If this is not set, gRPC uses the default maximum number of int32 range.\n\tMaxCallSendMsgSize *int64 `protobuf:\"varint,4,opt,name=max_call_send_msg_size,json=maxCallSendMsgSize,proto3,oneof\" json:\"max_call_send_msg_size,omitempty\"`\n\t// static_method specifies that a call is being made to a method that is static,\n\t// which means the method is known at compile time and doesn't change at runtime.\n\t// This can be used as a signal to stats plugins that this method is safe to include as a key to a measurement.\n\tStaticMethod *bool `protobuf:\"varint,5,opt,name=static_method,json=staticMethod,proto3,oneof\" json:\"static_method,omitempty\"`\n\t// trailer retrieves the trailer metadata for a unary RPC.\n\t// In order to obtain the metadata, you must specify a variable of type map<string, repeated string> in the trailer.\n\t// e.g.)\n\t// def [\n\t//\n\t//\t{ name: \"trl\" by: \"grpc.federation.metadata.new()\" }\n\t//\t{ call { method: \"pkg.Method\" option { trailer: \"trl\" } } }\n\t//\n\t// ]\n\tTrailer *string `protobuf:\"bytes,6,opt,name=trailer,proto3,oneof\" json:\"trailer,omitempty\"`\n\t// wait_for_ready configures the RPC's behavior when the client is in TRANSIENT_FAILURE,\n\t// which occurs when all addresses fail to connect.\n\t// If wait_for_ready is false, the RPC will fail immediately.\n\t// Otherwise, the client will wait until a connection becomes available or the RPC's deadline is reached.\n\t// By default, RPCs do not \"wait for ready\".\n\tWaitForReady *bool `protobuf:\"varint,7,opt,name=wait_for_ready,json=waitForReady,proto3,oneof\" json:\"wait_for_ready,omitempty\"`\n}\n\nfunc (x *GRPCCallOption) Reset() {\n\t*x = GRPCCallOption{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[26]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GRPCCallOption) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GRPCCallOption) ProtoMessage() {}\n\nfunc (x *GRPCCallOption) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[26]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GRPCCallOption.ProtoReflect.Descriptor instead.\nfunc (*GRPCCallOption) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{26}\n}\n\nfunc (x *GRPCCallOption) GetContentSubtype() string {\n\tif x != nil && x.ContentSubtype != nil {\n\t\treturn *x.ContentSubtype\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCCallOption) GetHeader() string {\n\tif x != nil && x.Header != nil {\n\t\treturn *x.Header\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCCallOption) GetMaxCallRecvMsgSize() int64 {\n\tif x != nil && x.MaxCallRecvMsgSize != nil {\n\t\treturn *x.MaxCallRecvMsgSize\n\t}\n\treturn 0\n}\n\nfunc (x *GRPCCallOption) GetMaxCallSendMsgSize() int64 {\n\tif x != nil && x.MaxCallSendMsgSize != nil {\n\t\treturn *x.MaxCallSendMsgSize\n\t}\n\treturn 0\n}\n\nfunc (x *GRPCCallOption) GetStaticMethod() bool {\n\tif x != nil && x.StaticMethod != nil {\n\t\treturn *x.StaticMethod\n\t}\n\treturn false\n}\n\nfunc (x *GRPCCallOption) GetTrailer() string {\n\tif x != nil && x.Trailer != nil {\n\t\treturn *x.Trailer\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCCallOption) GetWaitForReady() bool {\n\tif x != nil && x.WaitForReady != nil {\n\t\treturn *x.WaitForReady\n\t}\n\treturn false\n}\n\n// Validation represents a validation rule against variables defined within the current scope.\ntype ValidationExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is a unique name for the validation.\n\t// If set, the validation error type will be <message-name><name>Error.\n\t// If omitted, the validation error type will be ValidationError.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// error defines the actual validation rules and an error to returned if the validation fails.\n\tError *GRPCError `protobuf:\"bytes,2,opt,name=error,proto3\" json:\"error,omitempty\"`\n}\n\nfunc (x *ValidationExpr) Reset() {\n\t*x = ValidationExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[27]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ValidationExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ValidationExpr) ProtoMessage() {}\n\nfunc (x *ValidationExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[27]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ValidationExpr.ProtoReflect.Descriptor instead.\nfunc (*ValidationExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{27}\n}\n\nfunc (x *ValidationExpr) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *ValidationExpr) GetError() *GRPCError {\n\tif x != nil {\n\t\treturn x.Error\n\t}\n\treturn nil\n}\n\n// RetryPolicy define the retry policy if the method call fails.\ntype RetryPolicy struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to Policy:\n\t//\n\t//\t*RetryPolicy_Constant\n\t//\t*RetryPolicy_Exponential\n\tPolicy isRetryPolicy_Policy `protobuf_oneof:\"policy\"`\n\t// if specifies condition in CEL. If the condition is true, run the retry process according to the policy.\n\t// If this field is omitted, it is always treated as 'true' and run the retry process.\n\t// The return value must always be of type boolean.\n\tIf string `protobuf:\"bytes,3,opt,name=if,proto3\" json:\"if,omitempty\"`\n}\n\nfunc (x *RetryPolicy) Reset() {\n\t*x = RetryPolicy{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[28]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RetryPolicy) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RetryPolicy) ProtoMessage() {}\n\nfunc (x *RetryPolicy) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[28]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RetryPolicy.ProtoReflect.Descriptor instead.\nfunc (*RetryPolicy) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{28}\n}\n\nfunc (m *RetryPolicy) GetPolicy() isRetryPolicy_Policy {\n\tif m != nil {\n\t\treturn m.Policy\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicy) GetConstant() *RetryPolicyConstant {\n\tif x, ok := x.GetPolicy().(*RetryPolicy_Constant); ok {\n\t\treturn x.Constant\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicy) GetExponential() *RetryPolicyExponential {\n\tif x, ok := x.GetPolicy().(*RetryPolicy_Exponential); ok {\n\t\treturn x.Exponential\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicy) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\ntype isRetryPolicy_Policy interface {\n\tisRetryPolicy_Policy()\n}\n\ntype RetryPolicy_Constant struct {\n\t// retry according to the \"constant\" policy.\n\tConstant *RetryPolicyConstant `protobuf:\"bytes,1,opt,name=constant,proto3,oneof\"`\n}\n\ntype RetryPolicy_Exponential struct {\n\t// retry according to the \"exponential backoff\" policy.\n\t// The following Go library is used in the implementation,\n\t// so please refer to the library documentation for how to specify each parameter.\n\t// https://pkg.go.dev/github.com/cenkalti/backoff/v4#section-readme.\n\tExponential *RetryPolicyExponential `protobuf:\"bytes,2,opt,name=exponential,proto3,oneof\"`\n}\n\nfunc (*RetryPolicy_Constant) isRetryPolicy_Policy() {}\n\nfunc (*RetryPolicy_Exponential) isRetryPolicy_Policy() {}\n\n// RetryPolicyConstant define \"constant\" based retry policy.\ntype RetryPolicyConstant struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// interval value. ( default value is 1s ).\n\tInterval *string `protobuf:\"bytes,1,opt,name=interval,proto3,oneof\" json:\"interval,omitempty\"`\n\t// max retry count. ( default value is 5. If zero is specified, it never stops )\n\tMaxRetries *uint64 `protobuf:\"varint,2,opt,name=max_retries,json=maxRetries,proto3,oneof\" json:\"max_retries,omitempty\"`\n}\n\nfunc (x *RetryPolicyConstant) Reset() {\n\t*x = RetryPolicyConstant{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[29]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RetryPolicyConstant) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RetryPolicyConstant) ProtoMessage() {}\n\nfunc (x *RetryPolicyConstant) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[29]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RetryPolicyConstant.ProtoReflect.Descriptor instead.\nfunc (*RetryPolicyConstant) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{29}\n}\n\nfunc (x *RetryPolicyConstant) GetInterval() string {\n\tif x != nil && x.Interval != nil {\n\t\treturn *x.Interval\n\t}\n\treturn \"\"\n}\n\nfunc (x *RetryPolicyConstant) GetMaxRetries() uint64 {\n\tif x != nil && x.MaxRetries != nil {\n\t\treturn *x.MaxRetries\n\t}\n\treturn 0\n}\n\n// RetryPolicyExponential define \"exponential backoff\" based retry policy.\ntype RetryPolicyExponential struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// initial interval value. ( default value is \"500ms\" ).\n\tInitialInterval *string `protobuf:\"bytes,1,opt,name=initial_interval,json=initialInterval,proto3,oneof\" json:\"initial_interval,omitempty\"`\n\t// randomization factor value. ( default value is 0.5 ).\n\tRandomizationFactor *float64 `protobuf:\"fixed64,2,opt,name=randomization_factor,json=randomizationFactor,proto3,oneof\" json:\"randomization_factor,omitempty\"`\n\t// multiplier. ( default value is 1.5 ).\n\tMultiplier *float64 `protobuf:\"fixed64,3,opt,name=multiplier,proto3,oneof\" json:\"multiplier,omitempty\"`\n\t// max interval value. ( default value is \"60s\" ).\n\tMaxInterval *string `protobuf:\"bytes,4,opt,name=max_interval,json=maxInterval,proto3,oneof\" json:\"max_interval,omitempty\"`\n\t// max retry count. ( default value is 5. If zero is specified, it never stops ).\n\tMaxRetries *uint64 `protobuf:\"varint,5,opt,name=max_retries,json=maxRetries,proto3,oneof\" json:\"max_retries,omitempty\"`\n}\n\nfunc (x *RetryPolicyExponential) Reset() {\n\t*x = RetryPolicyExponential{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[30]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RetryPolicyExponential) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RetryPolicyExponential) ProtoMessage() {}\n\nfunc (x *RetryPolicyExponential) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[30]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RetryPolicyExponential.ProtoReflect.Descriptor instead.\nfunc (*RetryPolicyExponential) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{30}\n}\n\nfunc (x *RetryPolicyExponential) GetInitialInterval() string {\n\tif x != nil && x.InitialInterval != nil {\n\t\treturn *x.InitialInterval\n\t}\n\treturn \"\"\n}\n\nfunc (x *RetryPolicyExponential) GetRandomizationFactor() float64 {\n\tif x != nil && x.RandomizationFactor != nil {\n\t\treturn *x.RandomizationFactor\n\t}\n\treturn 0\n}\n\nfunc (x *RetryPolicyExponential) GetMultiplier() float64 {\n\tif x != nil && x.Multiplier != nil {\n\t\treturn *x.Multiplier\n\t}\n\treturn 0\n}\n\nfunc (x *RetryPolicyExponential) GetMaxInterval() string {\n\tif x != nil && x.MaxInterval != nil {\n\t\treturn *x.MaxInterval\n\t}\n\treturn \"\"\n}\n\nfunc (x *RetryPolicyExponential) GetMaxRetries() uint64 {\n\tif x != nil && x.MaxRetries != nil {\n\t\treturn *x.MaxRetries\n\t}\n\treturn 0\n}\n\n// MethodRequest define parameters to be used for gRPC method request.\ntype MethodRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// field name of the request message.\n\tField string `protobuf:\"bytes,1,opt,name=field,proto3\" json:\"field,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tBy *string `protobuf:\"bytes,2,opt,name=by,proto3,oneof\" json:\"by,omitempty\"`\n\t// if describes the condition to be assigned to field.\n\t// The return value must be of type bool.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\t// If the field is a 'oneof' field, it must be specified.\n\tIf *string `protobuf:\"bytes,3,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n}\n\nfunc (x *MethodRequest) Reset() {\n\t*x = MethodRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[31]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MethodRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MethodRequest) ProtoMessage() {}\n\nfunc (x *MethodRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[31]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MethodRequest.ProtoReflect.Descriptor instead.\nfunc (*MethodRequest) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{31}\n}\n\nfunc (x *MethodRequest) GetField() string {\n\tif x != nil {\n\t\treturn x.Field\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodRequest) GetBy() string {\n\tif x != nil && x.By != nil {\n\t\treturn *x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodRequest) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\n// MethodResponse define which value of the method response is referenced.\ntype MethodResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name specify the unique name that can be used in a `MessageRule` / `FieldRule` for the same message for a specific field in the response.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// field name in response message.\n\tField *string `protobuf:\"bytes,2,opt,name=field,proto3,oneof\" json:\"field,omitempty\"`\n\t// autobind if the value referenced by `field` is a message type,\n\t// the value of a field with the same name and type as the field name of its own message is automatically assigned to the value of the field in the message.\n\t// If multiple autobinds are used at the same message,\n\t// you must explicitly use the `grpc.federation.field` option to do the binding yourself, since duplicate field names cannot be correctly determined as one.\n\tAutobind *bool `protobuf:\"varint,3,opt,name=autobind,proto3,oneof\" json:\"autobind,omitempty\"`\n}\n\nfunc (x *MethodResponse) Reset() {\n\t*x = MethodResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[32]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MethodResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MethodResponse) ProtoMessage() {}\n\nfunc (x *MethodResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[32]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MethodResponse.ProtoReflect.Descriptor instead.\nfunc (*MethodResponse) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{32}\n}\n\nfunc (x *MethodResponse) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodResponse) GetField() string {\n\tif x != nil && x.Field != nil {\n\t\treturn *x.Field\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodResponse) GetAutobind() bool {\n\tif x != nil && x.Autobind != nil {\n\t\treturn *x.Autobind\n\t}\n\treturn false\n}\n\n// Argument define message argument.\ntype Argument struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name of the message argument.\n\t// Use this name to refer to the message argument.\n\t// For example, if `foo` is specified as the name, it is referenced by `$.foo`.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tBy *string `protobuf:\"bytes,2,opt,name=by,proto3,oneof\" json:\"by,omitempty\"`\n\t// inline like by, it refers to the specified value and expands all fields beyond it.\n\t// For this reason, the referenced value must always be of message type.\n\tInline *string `protobuf:\"bytes,3,opt,name=inline,proto3,oneof\" json:\"inline,omitempty\"`\n}\n\nfunc (x *Argument) Reset() {\n\t*x = Argument{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[33]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Argument) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Argument) ProtoMessage() {}\n\nfunc (x *Argument) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[33]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Argument.ProtoReflect.Descriptor instead.\nfunc (*Argument) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{33}\n}\n\nfunc (x *Argument) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Argument) GetBy() string {\n\tif x != nil && x.By != nil {\n\t\treturn *x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *Argument) GetInline() string {\n\tif x != nil && x.Inline != nil {\n\t\treturn *x.Inline\n\t}\n\treturn \"\"\n}\n\n// FieldRule define gRPC Federation rules for the field of message.\ntype FieldRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// If custom_resolver is true, the field binding process is to be implemented in Go.\n\t// If there are any values retrieved by grpc.federation.message option, they are passed as arguments for custom resolver.\n\tCustomResolver *bool `protobuf:\"varint,1,opt,name=custom_resolver,json=customResolver,proto3,oneof\" json:\"custom_resolver,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tBy *string `protobuf:\"bytes,2,opt,name=by,proto3,oneof\" json:\"by,omitempty\"`\n\t// alias can be used when alias is specified in grpc.federation.message option,\n\t// and specifies the field name to be referenced among the messages specified in alias of message option.\n\t// If the specified field has the same type or can be converted automatically, its value is assigned.\n\tAlias *string `protobuf:\"bytes,3,opt,name=alias,proto3,oneof\" json:\"alias,omitempty\"`\n\t// use to evaluate any one of fields. this field only available in oneof.\n\tOneof *FieldOneof `protobuf:\"bytes,4,opt,name=oneof,proto3\" json:\"oneof,omitempty\"`\n\t// when defining an environment variable, use it for fields where you want to set additional options.\n\tEnv *EnvVarOption `protobuf:\"bytes,5,opt,name=env,proto3\" json:\"env,omitempty\"`\n}\n\nfunc (x *FieldRule) Reset() {\n\t*x = FieldRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[34]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *FieldRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*FieldRule) ProtoMessage() {}\n\nfunc (x *FieldRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[34]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use FieldRule.ProtoReflect.Descriptor instead.\nfunc (*FieldRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{34}\n}\n\nfunc (x *FieldRule) GetCustomResolver() bool {\n\tif x != nil && x.CustomResolver != nil {\n\t\treturn *x.CustomResolver\n\t}\n\treturn false\n}\n\nfunc (x *FieldRule) GetBy() string {\n\tif x != nil && x.By != nil {\n\t\treturn *x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *FieldRule) GetAlias() string {\n\tif x != nil && x.Alias != nil {\n\t\treturn *x.Alias\n\t}\n\treturn \"\"\n}\n\nfunc (x *FieldRule) GetOneof() *FieldOneof {\n\tif x != nil {\n\t\treturn x.Oneof\n\t}\n\treturn nil\n}\n\nfunc (x *FieldRule) GetEnv() *EnvVarOption {\n\tif x != nil {\n\t\treturn x.Env\n\t}\n\treturn nil\n}\n\n// FieldOneof evaluate \"messages\" or other field only if expr is true and assign to the oneof field.\n// This feature only available in oneof.\ntype FieldOneof struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// cond specify either `expr` or `default`. Only one `default` can be set per oneof.\n\t//\n\t// Types that are assignable to Cond:\n\t//\n\t//\t*FieldOneof_If\n\t//\t*FieldOneof_Default\n\tCond isFieldOneof_Cond `protobuf_oneof:\"cond\"`\n\t// def specify variables to be used in current oneof field's scope for field binding.\n\tDef []*VariableDefinition `protobuf:\"bytes,3,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule and FieldOneOf can be used.\n\tBy string `protobuf:\"bytes,4,opt,name=by,proto3\" json:\"by,omitempty\"`\n}\n\nfunc (x *FieldOneof) Reset() {\n\t*x = FieldOneof{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[35]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *FieldOneof) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*FieldOneof) ProtoMessage() {}\n\nfunc (x *FieldOneof) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[35]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use FieldOneof.ProtoReflect.Descriptor instead.\nfunc (*FieldOneof) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{35}\n}\n\nfunc (m *FieldOneof) GetCond() isFieldOneof_Cond {\n\tif m != nil {\n\t\treturn m.Cond\n\t}\n\treturn nil\n}\n\nfunc (x *FieldOneof) GetIf() string {\n\tif x, ok := x.GetCond().(*FieldOneof_If); ok {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *FieldOneof) GetDefault() bool {\n\tif x, ok := x.GetCond().(*FieldOneof_Default); ok {\n\t\treturn x.Default\n\t}\n\treturn false\n}\n\nfunc (x *FieldOneof) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *FieldOneof) GetBy() string {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\ntype isFieldOneof_Cond interface {\n\tisFieldOneof_Cond()\n}\n\ntype FieldOneof_If struct {\n\t// if describes the condition to be assigned to field.\n\t// The return value must be of type bool.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3,oneof\"`\n}\n\ntype FieldOneof_Default struct {\n\t// default used to assign a value when none of the other fields match any of the specified expressions.\n\t// Only one value can be defined per oneof.\n\tDefault bool `protobuf:\"varint,2,opt,name=default,proto3,oneof\"`\n}\n\nfunc (*FieldOneof_If) isFieldOneof_Cond() {}\n\nfunc (*FieldOneof_Default) isFieldOneof_Cond() {}\n\n// CELPlugin define schema of CEL plugin.\ntype CELPlugin struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tExport []*CELPluginExport `protobuf:\"bytes,1,rep,name=export,proto3\" json:\"export,omitempty\"`\n}\n\nfunc (x *CELPlugin) Reset() {\n\t*x = CELPlugin{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[36]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPlugin) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPlugin) ProtoMessage() {}\n\nfunc (x *CELPlugin) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[36]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPlugin.ProtoReflect.Descriptor instead.\nfunc (*CELPlugin) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{36}\n}\n\nfunc (x *CELPlugin) GetExport() []*CELPluginExport {\n\tif x != nil {\n\t\treturn x.Export\n\t}\n\treturn nil\n}\n\n// CELPluginExport describe the schema to be exposed as a CEL plugin.\ntype CELPluginExport struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the plugin name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// types describe the message type you want to expose.\n\tTypes []*CELReceiverType `protobuf:\"bytes,3,rep,name=types,proto3\" json:\"types,omitempty\"`\n\t// functions describe the definition of the function you want to expose.\n\tFunctions []*CELFunction `protobuf:\"bytes,4,rep,name=functions,proto3\" json:\"functions,omitempty\"`\n\t// variables describe the definition of the variable you want to expose.\n\tVariables  []*CELVariable       `protobuf:\"bytes,5,rep,name=variables,proto3\" json:\"variables,omitempty\"`\n\tCapability *CELPluginCapability `protobuf:\"bytes,6,opt,name=capability,proto3\" json:\"capability,omitempty\"`\n}\n\nfunc (x *CELPluginExport) Reset() {\n\t*x = CELPluginExport{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[37]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginExport) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginExport) ProtoMessage() {}\n\nfunc (x *CELPluginExport) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[37]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginExport.ProtoReflect.Descriptor instead.\nfunc (*CELPluginExport) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{37}\n}\n\nfunc (x *CELPluginExport) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELPluginExport) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELPluginExport) GetTypes() []*CELReceiverType {\n\tif x != nil {\n\t\treturn x.Types\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginExport) GetFunctions() []*CELFunction {\n\tif x != nil {\n\t\treturn x.Functions\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginExport) GetVariables() []*CELVariable {\n\tif x != nil {\n\t\treturn x.Variables\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginExport) GetCapability() *CELPluginCapability {\n\tif x != nil {\n\t\treturn x.Capability\n\t}\n\treturn nil\n}\n\n// CELPluginCapability controls the permissions granted to the WebAssembly plugin.\ntype CELPluginCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// env is the capability for environment variable.\n\tEnv *CELPluginEnvCapability `protobuf:\"bytes,1,opt,name=env,proto3,oneof\" json:\"env,omitempty\"`\n\t// file_system is the capability for file system.\n\tFileSystem *CELPluginFileSystemCapability `protobuf:\"bytes,2,opt,name=file_system,json=fileSystem,proto3,oneof\" json:\"file_system,omitempty\"`\n\t// network is the capability for network.\n\tNetwork *CELPluginNetworkCapability `protobuf:\"bytes,3,opt,name=network,proto3,oneof\" json:\"network,omitempty\"`\n}\n\nfunc (x *CELPluginCapability) Reset() {\n\t*x = CELPluginCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[38]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginCapability) ProtoMessage() {}\n\nfunc (x *CELPluginCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[38]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{38}\n}\n\nfunc (x *CELPluginCapability) GetEnv() *CELPluginEnvCapability {\n\tif x != nil {\n\t\treturn x.Env\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginCapability) GetFileSystem() *CELPluginFileSystemCapability {\n\tif x != nil {\n\t\treturn x.FileSystem\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginCapability) GetNetwork() *CELPluginNetworkCapability {\n\tif x != nil {\n\t\treturn x.Network\n\t}\n\treturn nil\n}\n\n// CELPluginEnvCapability controls access to the environment variable.\ntype CELPluginEnvCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// all allows access to all environment variables.\n\tAll bool `protobuf:\"varint,1,opt,name=all,proto3\" json:\"all,omitempty\"`\n\t// specifies accessible names. If \"all\" is true, it takes precedence.\n\tNames []string `protobuf:\"bytes,2,rep,name=names,proto3\" json:\"names,omitempty\"`\n}\n\nfunc (x *CELPluginEnvCapability) Reset() {\n\t*x = CELPluginEnvCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[39]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginEnvCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginEnvCapability) ProtoMessage() {}\n\nfunc (x *CELPluginEnvCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[39]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginEnvCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginEnvCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{39}\n}\n\nfunc (x *CELPluginEnvCapability) GetAll() bool {\n\tif x != nil {\n\t\treturn x.All\n\t}\n\treturn false\n}\n\nfunc (x *CELPluginEnvCapability) GetNames() []string {\n\tif x != nil {\n\t\treturn x.Names\n\t}\n\treturn nil\n}\n\n// CELPluginFileSystemCapability controls access to the file system.\ntype CELPluginFileSystemCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// mount_path specifies the file path of the host to mount.\n\t// If not specified, the root directory will be used.\n\tMountPath string `protobuf:\"bytes,1,opt,name=mount_path,json=mountPath,proto3\" json:\"mount_path,omitempty\"`\n}\n\nfunc (x *CELPluginFileSystemCapability) Reset() {\n\t*x = CELPluginFileSystemCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[40]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginFileSystemCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginFileSystemCapability) ProtoMessage() {}\n\nfunc (x *CELPluginFileSystemCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[40]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginFileSystemCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginFileSystemCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{40}\n}\n\nfunc (x *CELPluginFileSystemCapability) GetMountPath() string {\n\tif x != nil {\n\t\treturn x.MountPath\n\t}\n\treturn \"\"\n}\n\n// CELPluginNetworkCapability sets permissions related to network access.\n// This is an experimental feature.\ntype CELPluginNetworkCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *CELPluginNetworkCapability) Reset() {\n\t*x = CELPluginNetworkCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[41]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginNetworkCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginNetworkCapability) ProtoMessage() {}\n\nfunc (x *CELPluginNetworkCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[41]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginNetworkCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginNetworkCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{41}\n}\n\n// CELFunction represents the CEL function definition.\ntype CELFunction struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the function name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of function.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// args describe the definition of the function argument.\n\tArgs []*CELFunctionArgument `protobuf:\"bytes,3,rep,name=args,proto3\" json:\"args,omitempty\"`\n\t// return describe the definition of return type of function.\n\tReturn *CELType `protobuf:\"bytes,4,opt,name=return,proto3\" json:\"return,omitempty\"`\n}\n\nfunc (x *CELFunction) Reset() {\n\t*x = CELFunction{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[42]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELFunction) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELFunction) ProtoMessage() {}\n\nfunc (x *CELFunction) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[42]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELFunction.ProtoReflect.Descriptor instead.\nfunc (*CELFunction) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{42}\n}\n\nfunc (x *CELFunction) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunction) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunction) GetArgs() []*CELFunctionArgument {\n\tif x != nil {\n\t\treturn x.Args\n\t}\n\treturn nil\n}\n\nfunc (x *CELFunction) GetReturn() *CELType {\n\tif x != nil {\n\t\treturn x.Return\n\t}\n\treturn nil\n}\n\n// CELReceiverType represents methods tied to the message.\ntype CELReceiverType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the message name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// methods describe the definition of the method for the message.\n\tMethods []*CELFunction `protobuf:\"bytes,3,rep,name=methods,proto3\" json:\"methods,omitempty\"`\n}\n\nfunc (x *CELReceiverType) Reset() {\n\t*x = CELReceiverType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[43]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELReceiverType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELReceiverType) ProtoMessage() {}\n\nfunc (x *CELReceiverType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[43]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELReceiverType.ProtoReflect.Descriptor instead.\nfunc (*CELReceiverType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{43}\n}\n\nfunc (x *CELReceiverType) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELReceiverType) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELReceiverType) GetMethods() []*CELFunction {\n\tif x != nil {\n\t\treturn x.Methods\n\t}\n\treturn nil\n}\n\n// CELFunctionArgument represents the function argument.\ntype CELFunctionArgument struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the argument value name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// type is the argument type.\n\tType *CELType `protobuf:\"bytes,3,opt,name=type,proto3\" json:\"type,omitempty\"`\n}\n\nfunc (x *CELFunctionArgument) Reset() {\n\t*x = CELFunctionArgument{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[44]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELFunctionArgument) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELFunctionArgument) ProtoMessage() {}\n\nfunc (x *CELFunctionArgument) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[44]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELFunctionArgument.ProtoReflect.Descriptor instead.\nfunc (*CELFunctionArgument) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{44}\n}\n\nfunc (x *CELFunctionArgument) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunctionArgument) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunctionArgument) GetType() *CELType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\n// CELType represents type information for CEL plugin interface.\ntype CELType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to Type:\n\t//\n\t//\t*CELType_Kind\n\t//\t*CELType_Repeated\n\t//\t*CELType_Map\n\t//\t*CELType_Message\n\t//\t*CELType_Enum\n\tType isCELType_Type `protobuf_oneof:\"type\"`\n}\n\nfunc (x *CELType) Reset() {\n\t*x = CELType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[45]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELType) ProtoMessage() {}\n\nfunc (x *CELType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[45]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELType.ProtoReflect.Descriptor instead.\nfunc (*CELType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{45}\n}\n\nfunc (m *CELType) GetType() isCELType_Type {\n\tif m != nil {\n\t\treturn m.Type\n\t}\n\treturn nil\n}\n\nfunc (x *CELType) GetKind() TypeKind {\n\tif x, ok := x.GetType().(*CELType_Kind); ok {\n\t\treturn x.Kind\n\t}\n\treturn TypeKind_UNKNOWN\n}\n\nfunc (x *CELType) GetRepeated() *CELType {\n\tif x, ok := x.GetType().(*CELType_Repeated); ok {\n\t\treturn x.Repeated\n\t}\n\treturn nil\n}\n\nfunc (x *CELType) GetMap() *CELMapType {\n\tif x, ok := x.GetType().(*CELType_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\nfunc (x *CELType) GetMessage() string {\n\tif x, ok := x.GetType().(*CELType_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELType) GetEnum() string {\n\tif x, ok := x.GetType().(*CELType_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn \"\"\n}\n\ntype isCELType_Type interface {\n\tisCELType_Type()\n}\n\ntype CELType_Kind struct {\n\t// kind is used when the type is a primitive type.\n\tKind TypeKind `protobuf:\"varint,1,opt,name=kind,proto3,enum=grpc.federation.TypeKind,oneof\"`\n}\n\ntype CELType_Repeated struct {\n\t// repeated is used when the type is a repeated type.\n\tRepeated *CELType `protobuf:\"bytes,2,opt,name=repeated,proto3,oneof\"`\n}\n\ntype CELType_Map struct {\n\t// map is used when the type is a map type.\n\tMap *CELMapType `protobuf:\"bytes,3,opt,name=map,proto3,oneof\"`\n}\n\ntype CELType_Message struct {\n\t// message is a fqdn to the message type.\n\tMessage string `protobuf:\"bytes,4,opt,name=message,proto3,oneof\"`\n}\n\ntype CELType_Enum struct {\n\t// enum is a fqdn to the enum type.\n\tEnum string `protobuf:\"bytes,5,opt,name=enum,proto3,oneof\"`\n}\n\nfunc (*CELType_Kind) isCELType_Type() {}\n\nfunc (*CELType_Repeated) isCELType_Type() {}\n\nfunc (*CELType_Map) isCELType_Type() {}\n\nfunc (*CELType_Message) isCELType_Type() {}\n\nfunc (*CELType_Enum) isCELType_Type() {}\n\n// CELMapType represents map type.\ntype CELMapType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// key represents map's key type.\n\tKey *CELType `protobuf:\"bytes,1,opt,name=key,proto3\" json:\"key,omitempty\"`\n\t// value represents map's value type.\n\tValue *CELType `protobuf:\"bytes,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *CELMapType) Reset() {\n\t*x = CELMapType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[46]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELMapType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELMapType) ProtoMessage() {}\n\nfunc (x *CELMapType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[46]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELMapType.ProtoReflect.Descriptor instead.\nfunc (*CELMapType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{46}\n}\n\nfunc (x *CELMapType) GetKey() *CELType {\n\tif x != nil {\n\t\treturn x.Key\n\t}\n\treturn nil\n}\n\nfunc (x *CELMapType) GetValue() *CELType {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn nil\n}\n\n// CELVariable represents CEL variable.\ntype CELVariable struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the variable name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// type is the variable type.\n\tType *CELType `protobuf:\"bytes,3,opt,name=type,proto3\" json:\"type,omitempty\"`\n}\n\nfunc (x *CELVariable) Reset() {\n\t*x = CELVariable{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[47]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELVariable) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELVariable) ProtoMessage() {}\n\nfunc (x *CELVariable) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[47]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELVariable.ProtoReflect.Descriptor instead.\nfunc (*CELVariable) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{47}\n}\n\nfunc (x *CELVariable) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELVariable) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELVariable) GetType() *CELType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nvar file_grpc_federation_federation_proto_extTypes = []protoimpl.ExtensionInfo{\n\t{\n\t\tExtendedType:  (*descriptorpb.FileOptions)(nil),\n\t\tExtensionType: (*FileRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.file\",\n\t\tTag:           \"bytes,1187,opt,name=file\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*ServiceRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.service\",\n\t\tTag:           \"bytes,1187,opt,name=service\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*MethodRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.method\",\n\t\tTag:           \"bytes,1187,opt,name=method\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MessageOptions)(nil),\n\t\tExtensionType: (*MessageRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.message\",\n\t\tTag:           \"bytes,1187,opt,name=message\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*FieldRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.field\",\n\t\tTag:           \"bytes,1187,opt,name=field\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.EnumOptions)(nil),\n\t\tExtensionType: (*EnumRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.enum\",\n\t\tTag:           \"bytes,1187,opt,name=enum\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.EnumValueOptions)(nil),\n\t\tExtensionType: (*EnumValueRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.enum_value\",\n\t\tTag:           \"bytes,1187,opt,name=enum_value\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.OneofOptions)(nil),\n\t\tExtensionType: (*OneofRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.oneof\",\n\t\tTag:           \"bytes,1187,opt,name=oneof\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n}\n\n// Extension fields to descriptorpb.FileOptions.\nvar (\n\t// optional grpc.federation.FileRule file = 1187;\n\tE_File = &file_grpc_federation_federation_proto_extTypes[0]\n)\n\n// Extension fields to descriptorpb.ServiceOptions.\nvar (\n\t// optional grpc.federation.ServiceRule service = 1187;\n\tE_Service = &file_grpc_federation_federation_proto_extTypes[1]\n)\n\n// Extension fields to descriptorpb.MethodOptions.\nvar (\n\t// optional grpc.federation.MethodRule method = 1187;\n\tE_Method = &file_grpc_federation_federation_proto_extTypes[2]\n)\n\n// Extension fields to descriptorpb.MessageOptions.\nvar (\n\t// optional grpc.federation.MessageRule message = 1187;\n\tE_Message = &file_grpc_federation_federation_proto_extTypes[3]\n)\n\n// Extension fields to descriptorpb.FieldOptions.\nvar (\n\t// optional grpc.federation.FieldRule field = 1187;\n\tE_Field = &file_grpc_federation_federation_proto_extTypes[4]\n)\n\n// Extension fields to descriptorpb.EnumOptions.\nvar (\n\t// optional grpc.federation.EnumRule enum = 1187;\n\tE_Enum = &file_grpc_federation_federation_proto_extTypes[5]\n)\n\n// Extension fields to descriptorpb.EnumValueOptions.\nvar (\n\t// optional grpc.federation.EnumValueRule enum_value = 1187;\n\tE_EnumValue = &file_grpc_federation_federation_proto_extTypes[6]\n)\n\n// Extension fields to descriptorpb.OneofOptions.\nvar (\n\t// optional grpc.federation.OneofRule oneof = 1187;\n\tE_Oneof = &file_grpc_federation_federation_proto_extTypes[7]\n)\n\nvar File_grpc_federation_federation_proto protoreflect.FileDescriptor\n\nvar file_grpc_federation_federation_proto_rawDesc = []byte{\n\t0x0a, 0x20, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x12, 0x0f, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70,\n\t0x63, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x64,\n\t0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x67, 0x72,\n\t0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x70, 0x72,\n\t0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x67, 0x72, 0x70,\n\t0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x74, 0x69, 0x6d,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x56, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x52,\n\t0x75, 0x6c, 0x65, 0x12, 0x32, 0x0a, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52,\n\t0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6d, 0x70, 0x6f, 0x72,\n\t0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x22,\n\t0x20, 0x0a, 0x08, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61,\n\t0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61,\n\t0x73, 0x22, 0xb4, 0x01, 0x0a, 0x0d, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52,\n\t0x75, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x88,\n\t0x01, 0x01, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,\n\t0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x37, 0x0a, 0x04, 0x61, 0x74, 0x74, 0x72,\n\t0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c,\n\t0x75, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, 0x04, 0x61, 0x74, 0x74,\n\t0x72, 0x12, 0x1d, 0x0a, 0x07, 0x6e, 0x6f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x04, 0x20, 0x01,\n\t0x28, 0x08, 0x48, 0x01, 0x52, 0x07, 0x6e, 0x6f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x88, 0x01, 0x01,\n\t0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x42, 0x0a, 0x0a, 0x08,\n\t0x5f, 0x6e, 0x6f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x3e, 0x0a, 0x12, 0x45, 0x6e, 0x75, 0x6d,\n\t0x56, 0x61, 0x6c, 0x75, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x12, 0x12,\n\t0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x0b, 0x0a, 0x09, 0x4f, 0x6e, 0x65, 0x6f,\n\t0x66, 0x52, 0x75, 0x6c, 0x65, 0x22, 0x69, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n\t0x52, 0x75, 0x6c, 0x65, 0x12, 0x26, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x14, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x32, 0x0a, 0x03,\n\t0x76, 0x61, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x03, 0x76, 0x61, 0x72,\n\t0x22, 0x4a, 0x0a, 0x03, 0x45, 0x6e, 0x76, 0x12, 0x29, 0x0a, 0x03, 0x76, 0x61, 0x72, 0x18, 0x01,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x52, 0x03, 0x76,\n\t0x61, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x8b, 0x03, 0x0a,\n\t0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65,\n\t0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01,\n\t0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x66, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x02, 0x69, 0x66, 0x88, 0x01, 0x01, 0x12, 0x10,\n\t0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x62, 0x79,\n\t0x12, 0x2c, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x4d, 0x61, 0x70, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x70, 0x12, 0x38,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52,\n\t0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x50, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x69,\n\t0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x61,\n\t0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x0a,\n\t0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x04, 0x65, 0x6e,\n\t0x75, 0x6d, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x45,\n\t0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x35, 0x0a, 0x06, 0x73,\n\t0x77, 0x69, 0x74, 0x63, 0x68, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x77,\n\t0x69, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x06, 0x73, 0x77, 0x69, 0x74,\n\t0x63, 0x68, 0x42, 0x06, 0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e,\n\t0x61, 0x6d, 0x65, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x66, 0x22, 0x49, 0x0a, 0x1d, 0x53, 0x65,\n\t0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c,\n\t0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69,\n\t0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x66, 0x12, 0x18, 0x0a, 0x07, 0x6d,\n\t0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65,\n\t0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x06, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72,\n\t0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79,\n\t0x70, 0x65, 0x12, 0x3a, 0x0a, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x48, 0x00, 0x52, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x09,\n\t0x0a, 0x07, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xab, 0x01, 0x0a, 0x07, 0x45, 0x6e,\n\t0x76, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2f, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x00,\n\t0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x36, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74,\n\t0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79,\n\t0x70, 0x65, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2f,\n\t0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e,\n\t0x76, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x70, 0x42,\n\t0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x68, 0x0a, 0x0a, 0x45, 0x6e, 0x76, 0x4d, 0x61,\n\t0x70, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2a, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79, 0x70, 0x65, 0x52, 0x03, 0x6b, 0x65,\n\t0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,\n\t0x65, 0x22, 0xc3, 0x01, 0x0a, 0x0c, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x09, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61,\n\t0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c,\n\t0x74, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72,\n\t0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64,\n\t0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x07, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65,\n\t0x64, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61,\n\t0x74, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x42, 0x0b,\n\t0x0a, 0x09, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x5f,\n\t0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x22, 0x65, 0x0a, 0x0a, 0x4d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75,\n\t0x74, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e,\n\t0x73, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75,\n\t0x74, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9c,\n\t0x01, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x35,\n\t0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61,\n\t0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e,\n\t0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f,\n\t0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00,\n\t0x52, 0x0e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72,\n\t0x88, 0x01, 0x01, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x03, 0x20, 0x03,\n\t0x28, 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x75,\n\t0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x22, 0xde, 0x03,\n\t0x0a, 0x12, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69,\n\t0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x48, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x13, 0x0a,\n\t0x02, 0x69, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x02, 0x69, 0x66, 0x88,\n\t0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x18, 0x03,\n\t0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64,\n\t0x88, 0x01, 0x01, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48,\n\t0x00, 0x52, 0x02, 0x62, 0x79, 0x12, 0x2c, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x0c, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x61, 0x70, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x03,\n\t0x6d, 0x61, 0x70, 0x12, 0x38, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0d,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78,\n\t0x70, 0x72, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2f, 0x0a,\n\t0x04, 0x63, 0x61, 0x6c, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x61,\n\t0x6c, 0x6c, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x63, 0x61, 0x6c, 0x6c, 0x12, 0x41,\n\t0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45,\n\t0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x12, 0x2f, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e,\n\t0x75, 0x6d, 0x12, 0x35, 0x0a, 0x06, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x18, 0x11, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x48,\n\t0x00, 0x52, 0x06, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x42, 0x06, 0x0a, 0x04, 0x65, 0x78, 0x70,\n\t0x72, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69,\n\t0x66, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x22, 0xc5,\n\t0x01, 0x0a, 0x07, 0x4d, 0x61, 0x70, 0x45, 0x78, 0x70, 0x72, 0x12, 0x35, 0x0a, 0x08, 0x69, 0x74,\n\t0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49,\n\t0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f,\n\t0x72, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,\n\t0x02, 0x62, 0x79, 0x12, 0x38, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0c,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78,\n\t0x70, 0x72, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2f, 0x0a,\n\t0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e,\n\t0x75, 0x6d, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x42, 0x06,\n\t0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x22, 0x30, 0x0a, 0x08, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74,\n\t0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x72, 0x63, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x72, 0x63, 0x22, 0x50, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x45, 0x78, 0x70, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x04, 0x61,\n\t0x72, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x41, 0x72, 0x67, 0x75,\n\t0x6d, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x22, 0x2e, 0x0a, 0x08, 0x45, 0x6e,\n\t0x75, 0x6d, 0x45, 0x78, 0x70, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x62, 0x79,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x62, 0x79, 0x22, 0xf3, 0x02, 0x0a, 0x08, 0x43,\n\t0x61, 0x6c, 0x6c, 0x45, 0x78, 0x70, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12,\n\t0x38, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x07, 0x74, 0x69, 0x6d,\n\t0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x74, 0x69,\n\t0x6d, 0x65, 0x6f, 0x75, 0x74, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x05, 0x72, 0x65, 0x74, 0x72,\n\t0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50,\n\t0x6f, 0x6c, 0x69, 0x63, 0x79, 0x48, 0x01, 0x52, 0x05, 0x72, 0x65, 0x74, 0x72, 0x79, 0x88, 0x01,\n\t0x01, 0x12, 0x30, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72,\n\t0x72, 0x6f, 0x72, 0x12, 0x3c, 0x0a, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x43, 0x61, 0x6c, 0x6c, 0x4f, 0x70,\n\t0x74, 0x69, 0x6f, 0x6e, 0x48, 0x02, 0x52, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01,\n\t0x01, 0x12, 0x1f, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20,\n\t0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x88,\n\t0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x42, 0x08,\n\t0x0a, 0x06, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x79, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,\n\t0x22, 0x7f, 0x0a, 0x0a, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x12, 0x33,\n\t0x0a, 0x04, 0x63, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53,\n\t0x77, 0x69, 0x74, 0x63, 0x68, 0x43, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x72, 0x52, 0x04, 0x63,\n\t0x61, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x44, 0x65, 0x66,\n\t0x61, 0x75, 0x6c, 0x74, 0x45, 0x78, 0x70, 0x72, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c,\n\t0x74, 0x22, 0x71, 0x0a, 0x0e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x43, 0x61, 0x73, 0x65, 0x45,\n\t0x78, 0x70, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x02, 0x69, 0x66, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e,\n\t0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x79,\n\t0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x62, 0x79, 0x42, 0x06, 0x0a, 0x04,\n\t0x65, 0x78, 0x70, 0x72, 0x22, 0x64, 0x0a, 0x11, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x44, 0x65,\n\t0x66, 0x61, 0x75, 0x6c, 0x74, 0x45, 0x78, 0x70, 0x72, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66,\n\t0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c,\n\t0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66,\n\t0x12, 0x10, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02,\n\t0x62, 0x79, 0x42, 0x06, 0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x22, 0x86, 0x04, 0x0a, 0x09, 0x47,\n\t0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18,\n\t0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65,\n\t0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12,\n\t0x13, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x69,\n\t0x66, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x0e, 0x32, 0x10, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e,\n\t0x43, 0x6f, 0x64, 0x65, 0x48, 0x01, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12,\n\t0x1d, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,\n\t0x48, 0x02, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a,\n\t0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x20, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69,\n\t0x6c, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x69, 0x67,\n\t0x6e, 0x6f, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x06, 0x69, 0x67,\n\t0x6e, 0x6f, 0x72, 0x65, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x67, 0x6e, 0x6f, 0x72,\n\t0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x07,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x11, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x41, 0x6e,\n\t0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x88, 0x01, 0x01, 0x12, 0x45, 0x0a, 0x09,\n\t0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32,\n\t0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x4c, 0x6f, 0x67, 0x4c,\n\t0x65, 0x76, 0x65, 0x6c, 0x48, 0x05, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c,\n\t0x88, 0x01, 0x01, 0x22, 0x41, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12,\n\t0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05,\n\t0x44, 0x45, 0x42, 0x55, 0x47, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x4e, 0x46, 0x4f, 0x10,\n\t0x02, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x41, 0x52, 0x4e, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x45,\n\t0x52, 0x52, 0x4f, 0x52, 0x10, 0x04, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x66, 0x42, 0x07, 0x0a,\n\t0x05, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61,\n\t0x67, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x42, 0x16, 0x0a,\n\t0x14, 0x5f, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x72, 0x65, 0x73,\n\t0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65,\n\t0x76, 0x65, 0x6c, 0x22, 0xfa, 0x05, 0x0a, 0x0f, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f,\n\t0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x66, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x02,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44,\n\t0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x36,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78, 0x70, 0x72, 0x52, 0x07, 0x6d,\n\t0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f,\n\t0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66,\n\t0x6f, 0x52, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x34, 0x0a, 0x0a,\n\t0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65,\n\t0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x72, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e,\n\t0x66, 0x6f, 0x12, 0x34, 0x0a, 0x0a, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x69, 0x6e, 0x66, 0x6f,\n\t0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x64,\n\t0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3d, 0x0a, 0x0d, 0x71, 0x75, 0x6f, 0x74,\n\t0x61, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x6f,\n\t0x74, 0x61, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x0c, 0x71, 0x75, 0x6f, 0x74, 0x61,\n\t0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x52, 0x0a, 0x14, 0x70, 0x72, 0x65, 0x63, 0x6f,\n\t0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18,\n\t0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72,\n\t0x70, 0x63, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x46,\n\t0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x13, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69,\n\t0x74, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x62,\n\t0x61, 0x64, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61,\n\t0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x62, 0x61, 0x64, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f,\n\t0x69, 0x6e, 0x66, 0x6f, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49,\n\t0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f,\n\t0x12, 0x3d, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66,\n\t0x6f, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66,\n\t0x6f, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12,\n\t0x24, 0x0a, 0x04, 0x68, 0x65, 0x6c, 0x70, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x48, 0x65, 0x6c, 0x70, 0x52,\n\t0x04, 0x68, 0x65, 0x6c, 0x70, 0x12, 0x49, 0x0a, 0x11, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a,\n\t0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f,\n\t0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x10,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,\n\t0x12, 0x0e, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x02, 0x62, 0x79,\n\t0x22, 0xc7, 0x03, 0x0a, 0x0e, 0x47, 0x52, 0x50, 0x43, 0x43, 0x61, 0x6c, 0x6c, 0x4f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x73,\n\t0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0e,\n\t0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x88, 0x01,\n\t0x01, 0x12, 0x1b, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x48, 0x01, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x37,\n\t0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x72, 0x65, 0x63, 0x76, 0x5f,\n\t0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02,\n\t0x52, 0x12, 0x6d, 0x61, 0x78, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x63, 0x76, 0x4d, 0x73, 0x67,\n\t0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x63,\n\t0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a,\n\t0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x43, 0x61,\n\t0x6c, 0x6c, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01,\n\t0x12, 0x28, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x48, 0x04, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x69,\n\t0x63, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x74, 0x72,\n\t0x61, 0x69, 0x6c, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x07, 0x74,\n\t0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x0e, 0x77, 0x61, 0x69,\n\t0x74, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28,\n\t0x08, 0x48, 0x06, 0x52, 0x0c, 0x77, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x52, 0x65, 0x61, 0x64,\n\t0x79, 0x88, 0x01, 0x01, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,\n\t0x5f, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x68, 0x65, 0x61,\n\t0x64, 0x65, 0x72, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c,\n\t0x5f, 0x72, 0x65, 0x63, 0x76, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x19,\n\t0x0a, 0x17, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x65, 0x6e, 0x64,\n\t0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x74,\n\t0x61, 0x74, 0x69, 0x63, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x5f,\n\t0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x77, 0x61, 0x69, 0x74,\n\t0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x22, 0x64, 0x0a, 0x0e, 0x56, 0x61,\n\t0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72, 0x12, 0x17, 0x0a, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72,\n\t0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65,\n\t0x22, 0xb8, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,\n\t0x12, 0x42, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,\n\t0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x73,\n\t0x74, 0x61, 0x6e, 0x74, 0x12, 0x4b, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74,\n\t0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x72,\n\t0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x69,\n\t0x61, 0x6c, 0x48, 0x00, 0x52, 0x0b, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x69, 0x61,\n\t0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,\n\t0x66, 0x42, 0x08, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x79, 0x0a, 0x13, 0x52,\n\t0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61,\n\t0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c,\n\t0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69,\n\t0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, 0x01, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x52,\n\t0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x69, 0x6e,\n\t0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x72,\n\t0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0xd1, 0x02, 0x0a, 0x16, 0x52, 0x65, 0x74, 0x72, 0x79,\n\t0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x69, 0x61,\n\t0x6c, 0x12, 0x2e, 0x0a, 0x10, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x74,\n\t0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0f, 0x69,\n\t0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x88, 0x01,\n\t0x01, 0x12, 0x36, 0x0a, 0x14, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x48,\n\t0x01, 0x52, 0x13, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0a, 0x6d, 0x75, 0x6c,\n\t0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x48, 0x02, 0x52,\n\t0x0a, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x26,\n\t0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x04,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x49, 0x6e, 0x74, 0x65, 0x72,\n\t0x76, 0x61, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65,\n\t0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x48, 0x04, 0x52, 0x0a, 0x6d,\n\t0x61, 0x78, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x42, 0x13, 0x0a, 0x11,\n\t0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61,\n\t0x6c, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x6d,\n\t0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6d, 0x61,\n\t0x78, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d,\n\t0x61, 0x78, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x5d, 0x0a, 0x0d, 0x4d, 0x65,\n\t0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x66,\n\t0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c,\n\t0x64, 0x12, 0x13, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,\n\t0x02, 0x62, 0x79, 0x88, 0x01, 0x01, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x48, 0x01, 0x52, 0x02, 0x69, 0x66, 0x88, 0x01, 0x01, 0x42, 0x05, 0x0a, 0x03, 0x5f,\n\t0x62, 0x79, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x66, 0x22, 0x85, 0x01, 0x0a, 0x0e, 0x4d, 0x65,\n\t0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x17, 0x0a, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x88, 0x01, 0x01,\n\t0x12, 0x1f, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x08, 0x48, 0x02, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x88, 0x01,\n\t0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x66,\n\t0x69, 0x65, 0x6c, 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e,\n\t0x64, 0x22, 0x62, 0x0a, 0x08, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x12, 0x13, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,\n\t0x02, 0x62, 0x79, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x06, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65,\n\t0x88, 0x01, 0x01, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x62, 0x79, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x69,\n\t0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0xf2, 0x01, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52,\n\t0x75, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65,\n\t0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0e,\n\t0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x88, 0x01,\n\t0x01, 0x12, 0x13, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52,\n\t0x02, 0x62, 0x79, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x88, 0x01,\n\t0x01, 0x12, 0x31, 0x0a, 0x05, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x52, 0x05, 0x6f,\n\t0x6e, 0x65, 0x6f, 0x66, 0x12, 0x2f, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x05, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x52, 0x03, 0x65, 0x6e, 0x76, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d,\n\t0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x62, 0x79,\n\t0x42, 0x08, 0x0a, 0x06, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x89, 0x01, 0x0a, 0x0a, 0x46,\n\t0x69, 0x65, 0x6c, 0x64, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x12, 0x10, 0x0a, 0x02, 0x69, 0x66, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x69, 0x66, 0x12, 0x1a, 0x0a, 0x07, 0x64,\n\t0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x07,\n\t0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x03,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44,\n\t0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x0e,\n\t0x0a, 0x02, 0x62, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x62, 0x79, 0x42, 0x06,\n\t0x0a, 0x04, 0x63, 0x6f, 0x6e, 0x64, 0x22, 0x45, 0x0a, 0x09, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75,\n\t0x67, 0x69, 0x6e, 0x12, 0x38, 0x0a, 0x06, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20,\n\t0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x45,\n\t0x78, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x06, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x22, 0xaf, 0x02,\n\t0x0a, 0x0f, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x45, 0x78, 0x70, 0x6f, 0x72,\n\t0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x36, 0x0a, 0x05, 0x74, 0x79, 0x70,\n\t0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x52, 0x65,\n\t0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x74, 0x79, 0x70, 0x65,\n\t0x73, 0x12, 0x3a, 0x0a, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69,\n\t0x6f, 0x6e, 0x52, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3a, 0x0a,\n\t0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x09,\n\t0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x44, 0x0a, 0x0a, 0x63, 0x61, 0x70,\n\t0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c,\n\t0x69, 0x74, 0x79, 0x52, 0x0a, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22,\n\t0x9b, 0x02, 0x0a, 0x13, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x70,\n\t0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x3e, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e,\n\t0x45, 0x6e, 0x76, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x48, 0x00, 0x52,\n\t0x03, 0x65, 0x6e, 0x76, 0x88, 0x01, 0x01, 0x12, 0x54, 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x65, 0x5f,\n\t0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43,\n\t0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x73, 0x74,\n\t0x65, 0x6d, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x48, 0x01, 0x52, 0x0a,\n\t0x66, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x4a, 0x0a,\n\t0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b,\n\t0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72,\n\t0x6b, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x48, 0x02, 0x52, 0x07, 0x6e,\n\t0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x88, 0x01, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x65, 0x6e,\n\t0x76, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65,\n\t0x6d, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x40, 0x0a,\n\t0x16, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x45, 0x6e, 0x76, 0x43, 0x61, 0x70,\n\t0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d,\n\t0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22,\n\t0x3e, 0x0a, 0x1d, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65,\n\t0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79,\n\t0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 0x74, 0x68, 0x22,\n\t0x1c, 0x0a, 0x1a, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x4e, 0x65, 0x74, 0x77,\n\t0x6f, 0x72, 0x6b, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22, 0xa1, 0x01,\n\t0x0a, 0x0b, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x38, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x03, 0x20,\n\t0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,\n\t0x6e, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12,\n\t0x30, 0x0a, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72,\n\t0x6e, 0x22, 0x71, 0x0a, 0x0f, 0x43, 0x45, 0x4c, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72,\n\t0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x36, 0x0a, 0x07,\n\t0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x6d, 0x65, 0x74,\n\t0x68, 0x6f, 0x64, 0x73, 0x22, 0x6b, 0x0a, 0x13, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74,\n\t0x69, 0x6f, 0x6e, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,\n\t0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64,\n\t0x65, 0x73, 0x63, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70,\n\t0x65, 0x22, 0xdd, 0x01, 0x0a, 0x07, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2f, 0x0a,\n\t0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x79,\n\t0x70, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x36,\n\t0x0a, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65,\n\t0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2f, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65,\n\t0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x70, 0x12, 0x1a, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61,\n\t0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28,\n\t0x09, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70,\n\t0x65, 0x22, 0x68, 0x0a, 0x0a, 0x43, 0x45, 0x4c, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65, 0x12,\n\t0x2a, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43,\n\t0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76,\n\t0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70,\n\t0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c,\n\t0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x63, 0x0a, 0x0b, 0x43,\n\t0x45, 0x4c, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12,\n\t0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65,\n\t0x73, 0x63, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65,\n\t0x2a, 0x5e, 0x0a, 0x08, 0x54, 0x79, 0x70, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x0b, 0x0a, 0x07,\n\t0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52,\n\t0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x4f, 0x4f, 0x4c, 0x10, 0x02, 0x12,\n\t0x09, 0x0a, 0x05, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x49,\n\t0x4e, 0x54, 0x36, 0x34, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45,\n\t0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x06,\n\t0x3a, 0x4c, 0x0a, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x46, 0x69, 0x6c, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x3a, 0x58,\n\t0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52,\n\t0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x3a, 0x54, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a, 0x58,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52,\n\t0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x50, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c,\n\t0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52,\n\t0x75, 0x6c, 0x65, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x3a, 0x4c, 0x0a, 0x04, 0x65, 0x6e,\n\t0x75, 0x6d, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x75,\n\t0x6c, 0x65, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x3a, 0x61, 0x0a, 0x0a, 0x65, 0x6e, 0x75, 0x6d,\n\t0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c,\n\t0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x1e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x75, 0x6c, 0x65,\n\t0x52, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x50, 0x0a, 0x05, 0x6f,\n\t0x6e, 0x65, 0x6f, 0x66, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70,\n\t0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x6e, 0x65,\n\t0x6f, 0x66, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x42, 0xc2, 0x01,\n\t0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0f, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,\n\t0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x65, 0x72, 0x63, 0x61, 0x72, 0x69, 0x2f, 0x67, 0x72, 0x70,\n\t0x63, 0x2d, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x67, 0x72, 0x70,\n\t0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xa2, 0x02, 0x03, 0x47, 0x46, 0x58, 0xaa, 0x02, 0x0f,\n\t0x47, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xca,\n\t0x02, 0x0f, 0x47, 0x72, 0x70, 0x63, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0xe2, 0x02, 0x1b, 0x47, 0x72, 0x70, 0x63, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea,\n\t0x02, 0x10, 0x47, 0x72, 0x70, 0x63, 0x3a, 0x3a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_grpc_federation_federation_proto_rawDescOnce sync.Once\n\tfile_grpc_federation_federation_proto_rawDescData = file_grpc_federation_federation_proto_rawDesc\n)\n\nfunc file_grpc_federation_federation_proto_rawDescGZIP() []byte {\n\tfile_grpc_federation_federation_proto_rawDescOnce.Do(func() {\n\t\tfile_grpc_federation_federation_proto_rawDescData = protoimpl.X.CompressGZIP(file_grpc_federation_federation_proto_rawDescData)\n\t})\n\treturn file_grpc_federation_federation_proto_rawDescData\n}\n\nvar file_grpc_federation_federation_proto_enumTypes = make([]protoimpl.EnumInfo, 2)\nvar file_grpc_federation_federation_proto_msgTypes = make([]protoimpl.MessageInfo, 48)\nvar file_grpc_federation_federation_proto_goTypes = []interface{}{\n\t(TypeKind)(0),                          // 0: grpc.federation.TypeKind\n\t(GRPCError_LogLevel)(0),                // 1: grpc.federation.GRPCError.LogLevel\n\t(*FileRule)(nil),                       // 2: grpc.federation.FileRule\n\t(*EnumRule)(nil),                       // 3: grpc.federation.EnumRule\n\t(*EnumValueRule)(nil),                  // 4: grpc.federation.EnumValueRule\n\t(*EnumValueAttribute)(nil),             // 5: grpc.federation.EnumValueAttribute\n\t(*OneofRule)(nil),                      // 6: grpc.federation.OneofRule\n\t(*ServiceRule)(nil),                    // 7: grpc.federation.ServiceRule\n\t(*Env)(nil),                            // 8: grpc.federation.Env\n\t(*ServiceVariable)(nil),                // 9: grpc.federation.ServiceVariable\n\t(*ServiceVariableValidationExpr)(nil),  // 10: grpc.federation.ServiceVariableValidationExpr\n\t(*EnvVar)(nil),                         // 11: grpc.federation.EnvVar\n\t(*EnvType)(nil),                        // 12: grpc.federation.EnvType\n\t(*EnvMapType)(nil),                     // 13: grpc.federation.EnvMapType\n\t(*EnvVarOption)(nil),                   // 14: grpc.federation.EnvVarOption\n\t(*MethodRule)(nil),                     // 15: grpc.federation.MethodRule\n\t(*MessageRule)(nil),                    // 16: grpc.federation.MessageRule\n\t(*VariableDefinition)(nil),             // 17: grpc.federation.VariableDefinition\n\t(*MapExpr)(nil),                        // 18: grpc.federation.MapExpr\n\t(*Iterator)(nil),                       // 19: grpc.federation.Iterator\n\t(*MessageExpr)(nil),                    // 20: grpc.federation.MessageExpr\n\t(*EnumExpr)(nil),                       // 21: grpc.federation.EnumExpr\n\t(*CallExpr)(nil),                       // 22: grpc.federation.CallExpr\n\t(*SwitchExpr)(nil),                     // 23: grpc.federation.SwitchExpr\n\t(*SwitchCaseExpr)(nil),                 // 24: grpc.federation.SwitchCaseExpr\n\t(*SwitchDefaultExpr)(nil),              // 25: grpc.federation.SwitchDefaultExpr\n\t(*GRPCError)(nil),                      // 26: grpc.federation.GRPCError\n\t(*GRPCErrorDetail)(nil),                // 27: grpc.federation.GRPCErrorDetail\n\t(*GRPCCallOption)(nil),                 // 28: grpc.federation.GRPCCallOption\n\t(*ValidationExpr)(nil),                 // 29: grpc.federation.ValidationExpr\n\t(*RetryPolicy)(nil),                    // 30: grpc.federation.RetryPolicy\n\t(*RetryPolicyConstant)(nil),            // 31: grpc.federation.RetryPolicyConstant\n\t(*RetryPolicyExponential)(nil),         // 32: grpc.federation.RetryPolicyExponential\n\t(*MethodRequest)(nil),                  // 33: grpc.federation.MethodRequest\n\t(*MethodResponse)(nil),                 // 34: grpc.federation.MethodResponse\n\t(*Argument)(nil),                       // 35: grpc.federation.Argument\n\t(*FieldRule)(nil),                      // 36: grpc.federation.FieldRule\n\t(*FieldOneof)(nil),                     // 37: grpc.federation.FieldOneof\n\t(*CELPlugin)(nil),                      // 38: grpc.federation.CELPlugin\n\t(*CELPluginExport)(nil),                // 39: grpc.federation.CELPluginExport\n\t(*CELPluginCapability)(nil),            // 40: grpc.federation.CELPluginCapability\n\t(*CELPluginEnvCapability)(nil),         // 41: grpc.federation.CELPluginEnvCapability\n\t(*CELPluginFileSystemCapability)(nil),  // 42: grpc.federation.CELPluginFileSystemCapability\n\t(*CELPluginNetworkCapability)(nil),     // 43: grpc.federation.CELPluginNetworkCapability\n\t(*CELFunction)(nil),                    // 44: grpc.federation.CELFunction\n\t(*CELReceiverType)(nil),                // 45: grpc.federation.CELReceiverType\n\t(*CELFunctionArgument)(nil),            // 46: grpc.federation.CELFunctionArgument\n\t(*CELType)(nil),                        // 47: grpc.federation.CELType\n\t(*CELMapType)(nil),                     // 48: grpc.federation.CELMapType\n\t(*CELVariable)(nil),                    // 49: grpc.federation.CELVariable\n\t(code.Code)(0),                         // 50: google.rpc.Code\n\t(*errdetails.ErrorInfo)(nil),           // 51: google.rpc.ErrorInfo\n\t(*errdetails.RetryInfo)(nil),           // 52: google.rpc.RetryInfo\n\t(*errdetails.DebugInfo)(nil),           // 53: google.rpc.DebugInfo\n\t(*errdetails.QuotaFailure)(nil),        // 54: google.rpc.QuotaFailure\n\t(*errdetails.PreconditionFailure)(nil), // 55: google.rpc.PreconditionFailure\n\t(*errdetails.BadRequest)(nil),          // 56: google.rpc.BadRequest\n\t(*errdetails.RequestInfo)(nil),         // 57: google.rpc.RequestInfo\n\t(*errdetails.ResourceInfo)(nil),        // 58: google.rpc.ResourceInfo\n\t(*errdetails.Help)(nil),                // 59: google.rpc.Help\n\t(*errdetails.LocalizedMessage)(nil),    // 60: google.rpc.LocalizedMessage\n\t(*descriptorpb.FileOptions)(nil),       // 61: google.protobuf.FileOptions\n\t(*descriptorpb.ServiceOptions)(nil),    // 62: google.protobuf.ServiceOptions\n\t(*descriptorpb.MethodOptions)(nil),     // 63: google.protobuf.MethodOptions\n\t(*descriptorpb.MessageOptions)(nil),    // 64: google.protobuf.MessageOptions\n\t(*descriptorpb.FieldOptions)(nil),      // 65: google.protobuf.FieldOptions\n\t(*descriptorpb.EnumOptions)(nil),       // 66: google.protobuf.EnumOptions\n\t(*descriptorpb.EnumValueOptions)(nil),  // 67: google.protobuf.EnumValueOptions\n\t(*descriptorpb.OneofOptions)(nil),      // 68: google.protobuf.OneofOptions\n}\nvar file_grpc_federation_federation_proto_depIdxs = []int32{\n\t38, // 0: grpc.federation.FileRule.plugin:type_name -> grpc.federation.CELPlugin\n\t5,  // 1: grpc.federation.EnumValueRule.attr:type_name -> grpc.federation.EnumValueAttribute\n\t8,  // 2: grpc.federation.ServiceRule.env:type_name -> grpc.federation.Env\n\t9,  // 3: grpc.federation.ServiceRule.var:type_name -> grpc.federation.ServiceVariable\n\t11, // 4: grpc.federation.Env.var:type_name -> grpc.federation.EnvVar\n\t18, // 5: grpc.federation.ServiceVariable.map:type_name -> grpc.federation.MapExpr\n\t20, // 6: grpc.federation.ServiceVariable.message:type_name -> grpc.federation.MessageExpr\n\t10, // 7: grpc.federation.ServiceVariable.validation:type_name -> grpc.federation.ServiceVariableValidationExpr\n\t21, // 8: grpc.federation.ServiceVariable.enum:type_name -> grpc.federation.EnumExpr\n\t23, // 9: grpc.federation.ServiceVariable.switch:type_name -> grpc.federation.SwitchExpr\n\t12, // 10: grpc.federation.EnvVar.type:type_name -> grpc.federation.EnvType\n\t14, // 11: grpc.federation.EnvVar.option:type_name -> grpc.federation.EnvVarOption\n\t0,  // 12: grpc.federation.EnvType.kind:type_name -> grpc.federation.TypeKind\n\t12, // 13: grpc.federation.EnvType.repeated:type_name -> grpc.federation.EnvType\n\t13, // 14: grpc.federation.EnvType.map:type_name -> grpc.federation.EnvMapType\n\t12, // 15: grpc.federation.EnvMapType.key:type_name -> grpc.federation.EnvType\n\t12, // 16: grpc.federation.EnvMapType.value:type_name -> grpc.federation.EnvType\n\t17, // 17: grpc.federation.MessageRule.def:type_name -> grpc.federation.VariableDefinition\n\t18, // 18: grpc.federation.VariableDefinition.map:type_name -> grpc.federation.MapExpr\n\t20, // 19: grpc.federation.VariableDefinition.message:type_name -> grpc.federation.MessageExpr\n\t22, // 20: grpc.federation.VariableDefinition.call:type_name -> grpc.federation.CallExpr\n\t29, // 21: grpc.federation.VariableDefinition.validation:type_name -> grpc.federation.ValidationExpr\n\t21, // 22: grpc.federation.VariableDefinition.enum:type_name -> grpc.federation.EnumExpr\n\t23, // 23: grpc.federation.VariableDefinition.switch:type_name -> grpc.federation.SwitchExpr\n\t19, // 24: grpc.federation.MapExpr.iterator:type_name -> grpc.federation.Iterator\n\t20, // 25: grpc.federation.MapExpr.message:type_name -> grpc.federation.MessageExpr\n\t21, // 26: grpc.federation.MapExpr.enum:type_name -> grpc.federation.EnumExpr\n\t35, // 27: grpc.federation.MessageExpr.args:type_name -> grpc.federation.Argument\n\t33, // 28: grpc.federation.CallExpr.request:type_name -> grpc.federation.MethodRequest\n\t30, // 29: grpc.federation.CallExpr.retry:type_name -> grpc.federation.RetryPolicy\n\t26, // 30: grpc.federation.CallExpr.error:type_name -> grpc.federation.GRPCError\n\t28, // 31: grpc.federation.CallExpr.option:type_name -> grpc.federation.GRPCCallOption\n\t24, // 32: grpc.federation.SwitchExpr.case:type_name -> grpc.federation.SwitchCaseExpr\n\t25, // 33: grpc.federation.SwitchExpr.default:type_name -> grpc.federation.SwitchDefaultExpr\n\t17, // 34: grpc.federation.SwitchCaseExpr.def:type_name -> grpc.federation.VariableDefinition\n\t17, // 35: grpc.federation.SwitchDefaultExpr.def:type_name -> grpc.federation.VariableDefinition\n\t17, // 36: grpc.federation.GRPCError.def:type_name -> grpc.federation.VariableDefinition\n\t50, // 37: grpc.federation.GRPCError.code:type_name -> google.rpc.Code\n\t27, // 38: grpc.federation.GRPCError.details:type_name -> grpc.federation.GRPCErrorDetail\n\t1,  // 39: grpc.federation.GRPCError.log_level:type_name -> grpc.federation.GRPCError.LogLevel\n\t17, // 40: grpc.federation.GRPCErrorDetail.def:type_name -> grpc.federation.VariableDefinition\n\t20, // 41: grpc.federation.GRPCErrorDetail.message:type_name -> grpc.federation.MessageExpr\n\t51, // 42: grpc.federation.GRPCErrorDetail.error_info:type_name -> google.rpc.ErrorInfo\n\t52, // 43: grpc.federation.GRPCErrorDetail.retry_info:type_name -> google.rpc.RetryInfo\n\t53, // 44: grpc.federation.GRPCErrorDetail.debug_info:type_name -> google.rpc.DebugInfo\n\t54, // 45: grpc.federation.GRPCErrorDetail.quota_failure:type_name -> google.rpc.QuotaFailure\n\t55, // 46: grpc.federation.GRPCErrorDetail.precondition_failure:type_name -> google.rpc.PreconditionFailure\n\t56, // 47: grpc.federation.GRPCErrorDetail.bad_request:type_name -> google.rpc.BadRequest\n\t57, // 48: grpc.federation.GRPCErrorDetail.request_info:type_name -> google.rpc.RequestInfo\n\t58, // 49: grpc.federation.GRPCErrorDetail.resource_info:type_name -> google.rpc.ResourceInfo\n\t59, // 50: grpc.federation.GRPCErrorDetail.help:type_name -> google.rpc.Help\n\t60, // 51: grpc.federation.GRPCErrorDetail.localized_message:type_name -> google.rpc.LocalizedMessage\n\t26, // 52: grpc.federation.ValidationExpr.error:type_name -> grpc.federation.GRPCError\n\t31, // 53: grpc.federation.RetryPolicy.constant:type_name -> grpc.federation.RetryPolicyConstant\n\t32, // 54: grpc.federation.RetryPolicy.exponential:type_name -> grpc.federation.RetryPolicyExponential\n\t37, // 55: grpc.federation.FieldRule.oneof:type_name -> grpc.federation.FieldOneof\n\t14, // 56: grpc.federation.FieldRule.env:type_name -> grpc.federation.EnvVarOption\n\t17, // 57: grpc.federation.FieldOneof.def:type_name -> grpc.federation.VariableDefinition\n\t39, // 58: grpc.federation.CELPlugin.export:type_name -> grpc.federation.CELPluginExport\n\t45, // 59: grpc.federation.CELPluginExport.types:type_name -> grpc.federation.CELReceiverType\n\t44, // 60: grpc.federation.CELPluginExport.functions:type_name -> grpc.federation.CELFunction\n\t49, // 61: grpc.federation.CELPluginExport.variables:type_name -> grpc.federation.CELVariable\n\t40, // 62: grpc.federation.CELPluginExport.capability:type_name -> grpc.federation.CELPluginCapability\n\t41, // 63: grpc.federation.CELPluginCapability.env:type_name -> grpc.federation.CELPluginEnvCapability\n\t42, // 64: grpc.federation.CELPluginCapability.file_system:type_name -> grpc.federation.CELPluginFileSystemCapability\n\t43, // 65: grpc.federation.CELPluginCapability.network:type_name -> grpc.federation.CELPluginNetworkCapability\n\t46, // 66: grpc.federation.CELFunction.args:type_name -> grpc.federation.CELFunctionArgument\n\t47, // 67: grpc.federation.CELFunction.return:type_name -> grpc.federation.CELType\n\t44, // 68: grpc.federation.CELReceiverType.methods:type_name -> grpc.federation.CELFunction\n\t47, // 69: grpc.federation.CELFunctionArgument.type:type_name -> grpc.federation.CELType\n\t0,  // 70: grpc.federation.CELType.kind:type_name -> grpc.federation.TypeKind\n\t47, // 71: grpc.federation.CELType.repeated:type_name -> grpc.federation.CELType\n\t48, // 72: grpc.federation.CELType.map:type_name -> grpc.federation.CELMapType\n\t47, // 73: grpc.federation.CELMapType.key:type_name -> grpc.federation.CELType\n\t47, // 74: grpc.federation.CELMapType.value:type_name -> grpc.federation.CELType\n\t47, // 75: grpc.federation.CELVariable.type:type_name -> grpc.federation.CELType\n\t61, // 76: grpc.federation.file:extendee -> google.protobuf.FileOptions\n\t62, // 77: grpc.federation.service:extendee -> google.protobuf.ServiceOptions\n\t63, // 78: grpc.federation.method:extendee -> google.protobuf.MethodOptions\n\t64, // 79: grpc.federation.message:extendee -> google.protobuf.MessageOptions\n\t65, // 80: grpc.federation.field:extendee -> google.protobuf.FieldOptions\n\t66, // 81: grpc.federation.enum:extendee -> google.protobuf.EnumOptions\n\t67, // 82: grpc.federation.enum_value:extendee -> google.protobuf.EnumValueOptions\n\t68, // 83: grpc.federation.oneof:extendee -> google.protobuf.OneofOptions\n\t2,  // 84: grpc.federation.file:type_name -> grpc.federation.FileRule\n\t7,  // 85: grpc.federation.service:type_name -> grpc.federation.ServiceRule\n\t15, // 86: grpc.federation.method:type_name -> grpc.federation.MethodRule\n\t16, // 87: grpc.federation.message:type_name -> grpc.federation.MessageRule\n\t36, // 88: grpc.federation.field:type_name -> grpc.federation.FieldRule\n\t3,  // 89: grpc.federation.enum:type_name -> grpc.federation.EnumRule\n\t4,  // 90: grpc.federation.enum_value:type_name -> grpc.federation.EnumValueRule\n\t6,  // 91: grpc.federation.oneof:type_name -> grpc.federation.OneofRule\n\t92, // [92:92] is the sub-list for method output_type\n\t92, // [92:92] is the sub-list for method input_type\n\t84, // [84:92] is the sub-list for extension type_name\n\t76, // [76:84] is the sub-list for extension extendee\n\t0,  // [0:76] is the sub-list for field type_name\n}\n\nfunc init() { file_grpc_federation_federation_proto_init() }\nfunc file_grpc_federation_federation_proto_init() {\n\tif File_grpc_federation_federation_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_grpc_federation_federation_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*FileRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumValueRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumValueAttribute); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*OneofRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Env); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceVariable); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceVariableValidationExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvVar); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvMapType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvVarOption); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MethodRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MessageRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*VariableDefinition); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MapExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Iterator); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MessageExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CallExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SwitchExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SwitchCaseExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SwitchDefaultExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GRPCError); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GRPCErrorDetail); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GRPCCallOption); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ValidationExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RetryPolicy); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RetryPolicyConstant); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RetryPolicyExponential); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MethodRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MethodResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Argument); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*FieldRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*FieldOneof); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPlugin); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginExport); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginEnvCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginFileSystemCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginNetworkCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELFunction); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELReceiverType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELFunctionArgument); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELMapType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELVariable); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[2].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[7].OneofWrappers = []interface{}{\n\t\t(*ServiceVariable_By)(nil),\n\t\t(*ServiceVariable_Map)(nil),\n\t\t(*ServiceVariable_Message)(nil),\n\t\t(*ServiceVariable_Validation)(nil),\n\t\t(*ServiceVariable_Enum)(nil),\n\t\t(*ServiceVariable_Switch)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[9].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[10].OneofWrappers = []interface{}{\n\t\t(*EnvType_Kind)(nil),\n\t\t(*EnvType_Repeated)(nil),\n\t\t(*EnvType_Map)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[12].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[13].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[14].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[15].OneofWrappers = []interface{}{\n\t\t(*VariableDefinition_By)(nil),\n\t\t(*VariableDefinition_Map)(nil),\n\t\t(*VariableDefinition_Message)(nil),\n\t\t(*VariableDefinition_Call)(nil),\n\t\t(*VariableDefinition_Validation)(nil),\n\t\t(*VariableDefinition_Enum)(nil),\n\t\t(*VariableDefinition_Switch)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[16].OneofWrappers = []interface{}{\n\t\t(*MapExpr_By)(nil),\n\t\t(*MapExpr_Message)(nil),\n\t\t(*MapExpr_Enum)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[20].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[22].OneofWrappers = []interface{}{\n\t\t(*SwitchCaseExpr_By)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[23].OneofWrappers = []interface{}{\n\t\t(*SwitchDefaultExpr_By)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[24].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[26].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[27].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[28].OneofWrappers = []interface{}{\n\t\t(*RetryPolicy_Constant)(nil),\n\t\t(*RetryPolicy_Exponential)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[29].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[30].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[31].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[32].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[33].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[34].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[35].OneofWrappers = []interface{}{\n\t\t(*FieldOneof_If)(nil),\n\t\t(*FieldOneof_Default)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[38].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[45].OneofWrappers = []interface{}{\n\t\t(*CELType_Kind)(nil),\n\t\t(*CELType_Repeated)(nil),\n\t\t(*CELType_Map)(nil),\n\t\t(*CELType_Message)(nil),\n\t\t(*CELType_Enum)(nil),\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_grpc_federation_federation_proto_rawDesc,\n\t\t\tNumEnums:      2,\n\t\t\tNumMessages:   48,\n\t\t\tNumExtensions: 8,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_grpc_federation_federation_proto_goTypes,\n\t\tDependencyIndexes: file_grpc_federation_federation_proto_depIdxs,\n\t\tEnumInfos:         file_grpc_federation_federation_proto_enumTypes,\n\t\tMessageInfos:      file_grpc_federation_federation_proto_msgTypes,\n\t\tExtensionInfos:    file_grpc_federation_federation_proto_extTypes,\n\t}.Build()\n\tFile_grpc_federation_federation_proto = out.File\n\tfile_grpc_federation_federation_proto_rawDesc = nil\n\tfile_grpc_federation_federation_proto_goTypes = nil\n\tfile_grpc_federation_federation_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/11_multi_service/grpc-federation.yaml",
    "content": "imports:\n  - proto\nsrc:\n  - proto\nout: .\nplugins:\n  - plugin: go\n    opt: paths=source_relative\n  - plugin: go-grpc\n    opt: paths=source_relative\n  - plugin: grpc-federation\n    opt: paths=source_relative\n"
  },
  {
    "path": "_examples/11_multi_service/like/like.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: like/like.proto\n\npackage like\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype LikeType int32\n\nconst (\n\tLikeType_UNKNOWN LikeType = 0\n\tLikeType_TYPE1   LikeType = 1\n\tLikeType_TYPE2   LikeType = 2\n)\n\n// Enum value maps for LikeType.\nvar (\n\tLikeType_name = map[int32]string{\n\t\t0: \"UNKNOWN\",\n\t\t1: \"TYPE1\",\n\t\t2: \"TYPE2\",\n\t}\n\tLikeType_value = map[string]int32{\n\t\t\"UNKNOWN\": 0,\n\t\t\"TYPE1\":   1,\n\t\t\"TYPE2\":   2,\n\t}\n)\n\nfunc (x LikeType) Enum() *LikeType {\n\tp := new(LikeType)\n\t*p = x\n\treturn p\n}\n\nfunc (x LikeType) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (LikeType) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_like_like_proto_enumTypes[0].Descriptor()\n}\n\nfunc (LikeType) Type() protoreflect.EnumType {\n\treturn &file_like_like_proto_enumTypes[0]\n}\n\nfunc (x LikeType) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use LikeType.Descriptor instead.\nfunc (LikeType) EnumDescriptor() ([]byte, []int) {\n\treturn file_like_like_proto_rawDescGZIP(), []int{0}\n}\n\nvar File_like_like_proto protoreflect.FileDescriptor\n\nvar file_like_like_proto_rawDesc = []byte{\n\t0x0a, 0x0f, 0x6c, 0x69, 0x6b, 0x65, 0x2f, 0x6c, 0x69, 0x6b, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x04, 0x6c, 0x69, 0x6b, 0x65, 0x1a, 0x20, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2a, 0x2d, 0x0a, 0x08, 0x4c, 0x69, 0x6b,\n\t0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e,\n\t0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x54, 0x59, 0x50, 0x45, 0x31, 0x10, 0x01, 0x12, 0x09, 0x0a,\n\t0x05, 0x54, 0x59, 0x50, 0x45, 0x32, 0x10, 0x02, 0x42, 0x58, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x2e,\n\t0x6c, 0x69, 0x6b, 0x65, 0x42, 0x09, 0x4c, 0x69, 0x6b, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50,\n\t0x01, 0x5a, 0x11, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x6b, 0x65, 0x3b,\n\t0x6c, 0x69, 0x6b, 0x65, 0xa2, 0x02, 0x03, 0x4c, 0x58, 0x58, 0xaa, 0x02, 0x04, 0x4c, 0x69, 0x6b,\n\t0x65, 0xca, 0x02, 0x04, 0x4c, 0x69, 0x6b, 0x65, 0xe2, 0x02, 0x10, 0x4c, 0x69, 0x6b, 0x65, 0x5c,\n\t0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x04, 0x4c, 0x69,\n\t0x6b, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_like_like_proto_rawDescOnce sync.Once\n\tfile_like_like_proto_rawDescData = file_like_like_proto_rawDesc\n)\n\nfunc file_like_like_proto_rawDescGZIP() []byte {\n\tfile_like_like_proto_rawDescOnce.Do(func() {\n\t\tfile_like_like_proto_rawDescData = protoimpl.X.CompressGZIP(file_like_like_proto_rawDescData)\n\t})\n\treturn file_like_like_proto_rawDescData\n}\n\nvar file_like_like_proto_enumTypes = make([]protoimpl.EnumInfo, 1)\nvar file_like_like_proto_goTypes = []interface{}{\n\t(LikeType)(0), // 0: like.LikeType\n}\nvar file_like_like_proto_depIdxs = []int32{\n\t0, // [0:0] is the sub-list for method output_type\n\t0, // [0:0] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_like_like_proto_init() }\nfunc file_like_like_proto_init() {\n\tif File_like_like_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_like_like_proto_rawDesc,\n\t\t\tNumEnums:      1,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_like_like_proto_goTypes,\n\t\tDependencyIndexes: file_like_like_proto_depIdxs,\n\t\tEnumInfos:         file_like_like_proto_enumTypes,\n\t}.Build()\n\tFile_like_like_proto = out.File\n\tfile_like_like_proto_rawDesc = nil\n\tfile_like_like_proto_goTypes = nil\n\tfile_like_like_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/11_multi_service/main_test.go",
    "content": "package main_test\n\nimport (\n\t\"context\"\n\t\"example/favorite\"\n\t\"log/slog\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\"\n\t\"go.opentelemetry.io/otel/propagation\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\tsdktrace \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.4.0\"\n\t\"go.uber.org/goleak\"\n\n\t\"example/federation\"\n)\n\ntype Resolver struct {\n\t*federation.OtherServiceUnimplementedResolver\n}\n\nvar otherServicePostData = &federation.Post{\n\tId:      \"abcd\",\n\tTitle:   \"tttt\",\n\tContent: \"xxxx\",\n\tUser: &federation.User{\n\t\tId:   \"yyyy\",\n\t\tName: \"zzzz\",\n\t},\n}\n\nfunc (r *Resolver) Resolve_Federation_GetResponse_Post(_ context.Context, _ *federation.OtherService_Federation_GetResponse_PostArgument) (*federation.Post, error) {\n\treturn otherServicePostData, nil\n}\n\nfunc TestFederation(t *testing.T) {\n\tdefer goleak.VerifyNone(t)\n\tctx := context.Background()\n\n\tif os.Getenv(\"ENABLE_JAEGER\") != \"\" {\n\t\texporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithInsecure())\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttp := sdktrace.NewTracerProvider(\n\t\t\tsdktrace.WithBatcher(exporter),\n\t\t\tsdktrace.WithResource(\n\t\t\t\tresource.NewWithAttributes(\n\t\t\t\t\tsemconv.SchemaURL,\n\t\t\t\t\tsemconv.ServiceNameKey.String(\"example11/multi_service\"),\n\t\t\t\t\tsemconv.ServiceVersionKey.String(\"1.0.0\"),\n\t\t\t\t\tattribute.String(\"environment\", \"dev\"),\n\t\t\t\t),\n\t\t\t),\n\t\t\tsdktrace.WithSampler(sdktrace.AlwaysSample()),\n\t\t)\n\t\tdefer tp.Shutdown(ctx)\n\t\totel.SetTextMapPropagator(propagation.TraceContext{})\n\t\totel.SetTracerProvider(tp)\n\t}\n\n\tlogger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{\n\t\tLevel: slog.LevelDebug,\n\t}))\n\tt.Run(\"federation\", func(t *testing.T) {\n\t\tvar (\n\t\t\trequestID           = \"foo\"\n\t\t\texpectedGetPostResp = &federation.GetPostResponse{\n\t\t\t\tPost: &federation.Post{\n\t\t\t\t\tId:      \"post-id\",\n\t\t\t\t\tTitle:   \"title\",\n\t\t\t\t\tContent: \"content\",\n\t\t\t\t\tUser: &federation.User{\n\t\t\t\t\t\tId:   requestID,\n\t\t\t\t\t\tName: \"bar\",\n\t\t\t\t\t},\n\t\t\t\t\tReaction: &federation.Reaction{\n\t\t\t\t\t\tFavoriteType:    favorite.FavoriteType_TYPE1,\n\t\t\t\t\t\tFavoriteTypeStr: \"TYPE1\",\n\t\t\t\t\t\tCmp:             true,\n\t\t\t\t\t},\n\t\t\t\t\tFavoriteValue: federation.MyFavoriteType_TYPE1,\n\t\t\t\t\tCmp:           true,\n\t\t\t\t},\n\t\t\t\tUpperName: \"FEDERATION\",\n\t\t\t\tFoo:       &federation.GetPostResponse_Foo{X: \"x\"},\n\t\t\t}\n\t\t\texpectedGetNameResp = &federation.GetNameResponse{\n\t\t\t\tName: \"federation\",\n\t\t\t\tFoo:  &federation.GetNameResponse_Foo{Y: \"y\"},\n\t\t\t}\n\t\t)\n\n\t\tsvc, err := federation.NewFederationService(federation.FederationServiceConfig{\n\t\t\tLogger: logger,\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tdefer federation.CleanupFederationService(ctx, svc)\n\n\t\tgotGetPostResp, err := svc.GetPost(ctx, &federation.GetPostRequest{Id: requestID})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tif diff := cmp.Diff(\n\t\t\tgotGetPostResp, expectedGetPostResp,\n\t\t\tcmpopts.IgnoreUnexported(\n\t\t\t\tfederation.GetPostResponse{},\n\t\t\t\tfederation.Post{},\n\t\t\t\tfederation.User{},\n\t\t\t\tfederation.Reaction{},\n\t\t\t\tfederation.GetPostResponse_Foo{},\n\t\t\t),\n\t\t); diff != \"\" {\n\t\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t}\n\n\t\tgotGetNameResp, err := svc.GetName(ctx, &federation.GetNameRequest{})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tif diff := cmp.Diff(\n\t\t\tgotGetNameResp, expectedGetNameResp,\n\t\t\tcmpopts.IgnoreUnexported(\n\t\t\t\tfederation.GetNameResponse{},\n\t\t\t\tfederation.GetNameResponse_Foo{},\n\t\t\t),\n\t\t); diff != \"\" {\n\t\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t}\n\t})\n\tt.Run(\"debug\", func(t *testing.T) {\n\t\texpected := &federation.GetStatusResponse{\n\t\t\tUser: &federation.User{\n\t\t\t\tId:   \"xxxx\",\n\t\t\t\tName: \"yyyy\",\n\t\t\t},\n\t\t}\n\t\tsvc, err := federation.NewDebugService(federation.DebugServiceConfig{\n\t\t\tLogger: logger,\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tdefer federation.CleanupDebugService(ctx, svc)\n\n\t\tgot, err := svc.GetStatus(ctx, &federation.GetStatusRequest{})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tif diff := cmp.Diff(\n\t\t\tgot, expected,\n\t\t\tcmpopts.IgnoreUnexported(federation.GetStatusResponse{}, federation.User{}),\n\t\t); diff != \"\" {\n\t\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t}\n\t})\n\tt.Run(\"private\", func(t *testing.T) {\n\t\texpected := &federation.GetNameResponse{\n\t\t\tName: \"private\",\n\t\t\tFoo:  &federation.GetNameResponse_Foo{Y: \"y\"},\n\t\t}\n\t\tsvc, err := federation.NewPrivateService(federation.PrivateServiceConfig{\n\t\t\tLogger: logger,\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tdefer federation.CleanupPrivateService(ctx, svc)\n\n\t\tgot, err := svc.GetName(ctx, &federation.GetNameRequest{})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tif diff := cmp.Diff(\n\t\t\tgot, expected,\n\t\t\tcmpopts.IgnoreUnexported(federation.GetNameResponse{}, federation.GetNameResponse_Foo{}),\n\t\t); diff != \"\" {\n\t\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t}\n\t})\n\tt.Run(\"other\", func(t *testing.T) {\n\t\texpected := &federation.GetResponse{\n\t\t\tPost: otherServicePostData,\n\t\t}\n\t\tsvc, err := federation.NewOtherService(federation.OtherServiceConfig{\n\t\t\tLogger:   logger,\n\t\t\tResolver: new(Resolver),\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tdefer federation.CleanupOtherService(ctx, svc)\n\n\t\tgot, err := svc.Get(ctx, &federation.GetRequest{})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tif diff := cmp.Diff(\n\t\t\tgot, expected,\n\t\t\tcmpopts.IgnoreUnexported(federation.GetResponse{}, federation.Post{}, federation.User{}),\n\t\t); diff != \"\" {\n\t\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t}\n\t})\n}\n"
  },
  {
    "path": "_examples/11_multi_service/proto/buf.yaml",
    "content": "version: v1\nbreaking:\n  use:\n    - FILE\nlint:\n  use:\n    - DEFAULT\n"
  },
  {
    "path": "_examples/11_multi_service/proto/comment/comment.proto",
    "content": "syntax = \"proto3\";\n\npackage comment;\n\noption go_package = \"example/comment;comment\";\n\nenum CommentType {\n  UNKNOWN = 0;\n  TYPE1 = 1;\n  TYPE2 = 2;\n}\n"
  },
  {
    "path": "_examples/11_multi_service/proto/favorite/favorite.proto",
    "content": "syntax = \"proto3\";\n\npackage favorite;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/favorite;favorite\";\n\nenum FavoriteType {\n  option (grpc.federation.enum).alias = \"favorite.FavoriteType\";\n  UNKNOWN = 0;\n  TYPE1 = 1;\n  TYPE2 = 2;\n}\n"
  },
  {
    "path": "_examples/11_multi_service/proto/federation/federation.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"grpc/federation/federation.proto\";\nimport \"federation/reaction.proto\";\n\noption go_package = \"example/federation;federation\";\n\noption (grpc.federation.file) = {\n  import: [\"favorite/favorite.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {\n    env {\n      var {\n        name: \"name\"\n        type { kind: STRING }\n        option {\n          default: \"federation\"\n        }\n      }\n      var {\n        name: \"federation\"\n        type { kind: STRING }\n      }\n    }\n    var {\n      name: \"upper_name\"\n      by: \"grpc.federation.strings.toUpper(grpc.federation.env.name)\"\n    }\n    var {\n      name: \"federation_service_variable\"\n      by: \"1\"\n    }\n    var {\n      validation {\n        if: \"grpc.federation.env.name == ''\"\n        message: \"'name environment variable is unspecified'\"\n      }\n    }\n    var {\n      name: \"foo_bar_baz\"\n      by: \"{'a': true}\"\n    }\n  };\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n  rpc GetName(GetNameRequest) returns (GetNameResponse) {};\n}\n\nservice PrivateService {\n  option (grpc.federation.service) = {\n    env {\n      var {\n        name: \"name\"\n        type { kind: STRING }\n        option {\n          default: \"private\"\n        }\n      }\n      var {\n        name: \"private\"\n        type { kind: STRING }\n      }\n    }\n    var {\n      name: \"upper_name\"\n      by: \"grpc.federation.strings.toUpper(grpc.federation.env.name)\"\n    }\n    var {\n      name: \"private_service_enum\"\n      enum {\n        name: \"MyFavoriteType\"\n        by: \"favorite.FavoriteType.value('TYPE_1')\"\n      }\n    }\n    var {\n      name: \"private_service_user\"\n      message {\n        name: \"User\"\n        args [\n          {name: \"id\" by: \"'private_service_user_id'\"},\n          {name: \"name\" by: \"'private_service_user_name'\"}\n        ]\n      }\n    }\n    var { name: \"users\" by: \"[private_service_user]\"}\n    var {\n      name: \"private_service_user_names\"\n      map {\n        iterator {\n          name: \"iter\"\n          src: \"users\"\n        }\n        by: \"iter.name\"\n      }\n    }\n    var {\n      name: \"foo_bar_baz\"\n      by: \"{'b': true}\"\n    }\n  };\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n  rpc GetName(GetNameRequest) returns (GetNameResponse) {};\n}\n\nservice DebugService {\n  option (grpc.federation.service) = {};\n  rpc GetStatus(GetStatusRequest) returns (GetStatusResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"p\"\n      message { name: \"Post\" }\n    }\n    def { name: \"foo\" message {name: \"GetPostResponse.Foo\"} }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"p\"];\n  string upper_name = 2 [(grpc.federation.field).by = \"grpc.federation.var.upper_name\"];\n\n  message Foo {\n    string x = 1 [(grpc.federation.field).by = \"'x'\"];\n  }\n\n  GetPostResponse.Foo foo = 3 [(grpc.federation.field).by = \"foo\"];\n}\n\nmessage Post {\n  option (grpc.federation.message).def = {\n    name: \"u\"\n    message {\n      name: \"User\"\n      args { name: \"id\", by: \"'foo'\" }\n      args { name: \"name\", by: \"'bar'\" }\n    }\n  };\n  option (grpc.federation.message).def = {\n    name: \"favorite_value\" by: \"favorite.FavoriteType.value('TYPE1')\"\n  };\n  option (grpc.federation.message).def = {\n    name: \"cmp\" by: \"favorite_value == favorite.FavoriteType.TYPE1\"\n  };\n  option (grpc.federation.message).def = {\n    name: \"reaction\"\n    message {\n      name: \"Reaction\"\n      args { name: \"v\" by: \"favorite_value\" }\n    }\n  };\n\n  string id = 1 [(grpc.federation.field).by = \"'post-id'\"];\n  string title = 2 [(grpc.federation.field).by = \"'title'\"];\n  string content = 3 [(grpc.federation.field).by = \"'content'\"];\n  User user = 4 [(grpc.federation.field).by = \"u\"];\n  Reaction reaction = 5 [(grpc.federation.field).by = \"reaction\"];\n  MyFavoriteType favorite_value = 6 [(grpc.federation.field).by = \"favorite_value\"];\n  bool cmp = 7 [(grpc.federation.field).by = \"cmp\"];\n}\n\nenum MyFavoriteType {\n  option (grpc.federation.enum).alias = \"favorite.FavoriteType\";\n\n  UNKNOWN = 0 [(grpc.federation.enum_value).alias = \"UNKNOWN\"];\n  TYPE1 = 5000 [(grpc.federation.enum_value).alias = \"TYPE1\"];\n}\n\nmessage User {\n  string id = 1 [(grpc.federation.field).by = \"$.id\"];\n  string name = 2 [(grpc.federation.field).by = \"$.name\"];\n}\n\nmessage GetNameRequest {\n}\n\nmessage GetNameResponse {\n  option (grpc.federation.message) = {\n    def { name: \"foo\" message {name: \"GetNameResponse.Foo\"} }\n  };\n\n  string name = 1 [(grpc.federation.field).by = \"grpc.federation.env.name\"];\n\n  message Foo {\n    string y = 1 [(grpc.federation.field).by = \"'y'\"];\n  }\n\n  GetNameResponse.Foo foo = 2 [(grpc.federation.field).by = \"foo\"];\n}\n\nmessage GetStatusRequest {\n}\n\nmessage GetStatusResponse {\n  option (grpc.federation.message).def = {\n    name: \"u\"\n    message {\n      name: \"User\"\n      args { name: \"id\", by: \"'xxxx'\" }\n      args { name: \"name\", by: \"'yyyy'\" }\n    }\n  };\n\n  User user = 1 [(grpc.federation.field).by = \"u\"];\n}\n"
  },
  {
    "path": "_examples/11_multi_service/proto/federation/other.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"grpc/federation/federation.proto\";\nimport \"federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice OtherService {\n  option (grpc.federation.service) = {};\n  rpc Get(GetRequest) returns (GetResponse) {};\n}\n\nmessage GetRequest {\n  string id = 1;\n}\n\nmessage GetResponse {\n  option (grpc.federation.message).def = {\n    name: \"p\"\n    message { name: \"Post\" }\n  };\n  Post post = 1 [(grpc.federation.field).custom_resolver = true];\n}\n"
  },
  {
    "path": "_examples/11_multi_service/proto/federation/reaction.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"grpc/federation/federation.proto\";\nimport \"favorite/favorite.proto\";\n\noption go_package = \"example/federation;federation\";\n\nmessage Reaction {\n  option (grpc.federation.message) = {\n    def { name: \"cmp\" by: \"$.v == favorite.FavoriteType.TYPE1\" }\n  };\n\n  favorite.FavoriteType favorite_type = 1 [(grpc.federation.field).by = \"favorite.FavoriteType.value('TYPE1')\"];\n  string favorite_type_str = 2 [(grpc.federation.field).by = \"favorite.FavoriteType.name(favorite.FavoriteType.value('TYPE1'))\"];\n  bool cmp = 3 [(grpc.federation.field).by = \"cmp\"];\n}\n"
  },
  {
    "path": "_examples/12_validation/.gitignore",
    "content": "grpc/federation\n"
  },
  {
    "path": "_examples/12_validation/.vscode/settings.json",
    "content": "{\n    \"protoc\": {\n        \"options\": [\n            \"--proto_path=proto\",\n            \"--proto_path=proto_deps\"\n        ]\n    },\n    \"grpc-federation\": {\n        \"path\": \"../../bin/grpc-federation-language-server\",\n        \"import-paths\": [\n            \"proto\",\n            \"proto_deps\"\n        ]\n    }\n}\n"
  },
  {
    "path": "_examples/12_validation/Makefile",
    "content": "MAKEFILE_DIR := $(dir $(lastword $(MAKEFILE_LIST)))\nGOBIN := $(MAKEFILE_DIR)/../../bin\nPATH := $(GOBIN):$(PATH)\n\n.PHONY: generate\ngenerate:\n\t$(GOBIN)/buf generate\n\n.PHONY: lint\nlint:\n\t@$(GOBIN)/grpc-federation-linter -Iproto -Iproto_deps ./proto/federation/federation.proto\n\n.PHONY: test\ntest:\n\tgo test -race ./ -count=1\n"
  },
  {
    "path": "_examples/12_validation/buf.gen.yaml",
    "content": "version: v1\nmanaged:\n  enabled: true\nplugins:\n  - plugin: go\n    out: .\n    opt: paths=source_relative\n  - plugin: go-grpc\n    out: .\n    opt: paths=source_relative\n  - plugin: grpc-federation\n    out: .\n    opt: paths=source_relative\n"
  },
  {
    "path": "_examples/12_validation/buf.work.yaml",
    "content": "version: v1\ndirectories:\n  - proto\n  - proto_deps\n"
  },
  {
    "path": "_examples/12_validation/federation/federation.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\t_ \"google.golang.org/protobuf/types/known/anypb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype GetPostRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetPostRequest) Reset() {\n\t*x = GetPostRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostRequest) ProtoMessage() {}\n\nfunc (x *GetPostRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostRequest.ProtoReflect.Descriptor instead.\nfunc (*GetPostRequest) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetPostRequest) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\ntype GetPostResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPost *Post `protobuf:\"bytes,1,opt,name=post,proto3\" json:\"post,omitempty\"`\n}\n\nfunc (x *GetPostResponse) Reset() {\n\t*x = GetPostResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostResponse) ProtoMessage() {}\n\nfunc (x *GetPostResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostResponse.ProtoReflect.Descriptor instead.\nfunc (*GetPostResponse) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetPostResponse) GetPost() *Post {\n\tif x != nil {\n\t\treturn x.Post\n\t}\n\treturn nil\n}\n\ntype Post struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId      string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tTitle   string `protobuf:\"bytes,2,opt,name=title,proto3\" json:\"title,omitempty\"`\n\tContent string `protobuf:\"bytes,3,opt,name=content,proto3\" json:\"content,omitempty\"`\n\tItem    *Item  `protobuf:\"bytes,4,opt,name=item,proto3\" json:\"item,omitempty\"`\n}\n\nfunc (x *Post) Reset() {\n\t*x = Post{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Post) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Post) ProtoMessage() {}\n\nfunc (x *Post) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Post.ProtoReflect.Descriptor instead.\nfunc (*Post) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *Post) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetTitle() string {\n\tif x != nil {\n\t\treturn x.Title\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetContent() string {\n\tif x != nil {\n\t\treturn x.Content\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetItem() *Item {\n\tif x != nil {\n\t\treturn x.Item\n\t}\n\treturn nil\n}\n\ntype Item struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tItemId int32  `protobuf:\"varint,1,opt,name=item_id,json=itemId,proto3\" json:\"item_id,omitempty\"`\n\tName   string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *Item) Reset() {\n\t*x = Item{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Item) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Item) ProtoMessage() {}\n\nfunc (x *Item) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Item.ProtoReflect.Descriptor instead.\nfunc (*Item) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *Item) GetItemId() int32 {\n\tif x != nil {\n\t\treturn x.ItemId\n\t}\n\treturn 0\n}\n\nfunc (x *Item) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\ntype CustomMessage struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessage string `protobuf:\"bytes,1,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *CustomMessage) Reset() {\n\t*x = CustomMessage{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CustomMessage) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CustomMessage) ProtoMessage() {}\n\nfunc (x *CustomMessage) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CustomMessage.ProtoReflect.Descriptor instead.\nfunc (*CustomMessage) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *CustomMessage) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\ntype CustomHandlerMessage struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *CustomHandlerMessage) Reset() {\n\t*x = CustomHandlerMessage{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CustomHandlerMessage) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CustomHandlerMessage) ProtoMessage() {}\n\nfunc (x *CustomHandlerMessage) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CustomHandlerMessage.ProtoReflect.Descriptor instead.\nfunc (*CustomHandlerMessage) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{5}\n}\n\nvar File_federation_federation_proto protoreflect.FileDescriptor\n\nvar file_federation_federation_proto_rawDesc = []byte{\n\t0x0a, 0x1b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x6f,\n\t0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x19, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61,\n\t0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x20, 0x0a, 0x0e, 0x47, 0x65,\n\t0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02,\n\t0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0xb6, 0x07, 0x0a,\n\t0x0f, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x12, 0x33, 0x0a, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14,\n\t0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x50, 0x6f, 0x73, 0x74, 0x42, 0x09, 0x9a, 0x4a, 0x06, 0x12, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x52,\n\t0x04, 0x70, 0x6f, 0x73, 0x74, 0x3a, 0xed, 0x06, 0x9a, 0x4a, 0xe9, 0x06, 0x0a, 0x0e, 0x0a, 0x04,\n\t0x70, 0x6f, 0x73, 0x74, 0x6a, 0x06, 0x0a, 0x04, 0x50, 0x6f, 0x73, 0x74, 0x0a, 0x3a, 0x0a, 0x0d,\n\t0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x6a, 0x29, 0x0a,\n\t0x14, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x4d, 0x65,\n\t0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x11, 0x0a, 0x03, 0x61, 0x72, 0x67, 0x12, 0x0a, 0x27, 0x73,\n\t0x6f, 0x6d, 0x65, 0x2d, 0x61, 0x72, 0x67, 0x27, 0x0a, 0x3b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74,\n\t0x6f, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x6a, 0x2a, 0x0a, 0x0d, 0x43, 0x75, 0x73,\n\t0x74, 0x6f, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x19, 0x0a, 0x07, 0x6d, 0x65,\n\t0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x27, 0x73, 0x6f, 0x6d, 0x65, 0x2d, 0x6d, 0x65, 0x73,\n\t0x73, 0x61, 0x67, 0x65, 0x27, 0x0a, 0x33, 0x7a, 0x31, 0x12, 0x2f, 0x12, 0x14, 0x70, 0x6f, 0x73,\n\t0x74, 0x2e, 0x69, 0x64, 0x20, 0x21, 0x3d, 0x20, 0x27, 0x73, 0x6f, 0x6d, 0x65, 0x2d, 0x69, 0x64,\n\t0x27, 0x18, 0x09, 0x22, 0x15, 0x27, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x31, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x21, 0x27, 0x0a, 0x33, 0x7a, 0x31, 0x12, 0x2f,\n\t0x12, 0x14, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x69, 0x64, 0x20, 0x21, 0x3d, 0x20, 0x27, 0x73, 0x6f,\n\t0x6d, 0x65, 0x2d, 0x69, 0x64, 0x27, 0x18, 0x09, 0x22, 0x15, 0x27, 0x76, 0x61, 0x6c, 0x69, 0x64,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x32, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x21, 0x27, 0x0a,\n\t0xbb, 0x02, 0x7a, 0xb8, 0x02, 0x12, 0xb5, 0x02, 0x0a, 0x36, 0x5a, 0x34, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6c, 0x6f, 0x67, 0x2e,\n\t0x61, 0x64, 0x64, 0x28, 0x7b, 0x27, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x33, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x73, 0x27, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0x7d, 0x29,\n\t0x12, 0x14, 0x24, 0x2e, 0x69, 0x64, 0x20, 0x21, 0x3d, 0x20, 0x27, 0x63, 0x6f, 0x72, 0x72, 0x65,\n\t0x63, 0x74, 0x2d, 0x69, 0x64, 0x27, 0x18, 0x09, 0x22, 0x15, 0x27, 0x76, 0x61, 0x6c, 0x69, 0x64,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x33, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x21, 0x27, 0x2a,\n\t0xc9, 0x01, 0x1a, 0x26, 0x0a, 0x0d, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x12, 0x15, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0a,\n\t0x27, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x31, 0x27, 0x1a, 0x26, 0x0a, 0x0d, 0x43, 0x75,\n\t0x73, 0x74, 0x6f, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x15, 0x0a, 0x07, 0x6d,\n\t0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0a, 0x27, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,\n\t0x32, 0x27, 0x42, 0x24, 0x0a, 0x22, 0x0a, 0x07, 0x27, 0x74, 0x79, 0x70, 0x65, 0x31, 0x27, 0x12,\n\t0x07, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x69, 0x64, 0x1a, 0x0e, 0x27, 0x64, 0x65, 0x73, 0x63, 0x72,\n\t0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x27, 0x4a, 0x1b, 0x0a, 0x19, 0x0a, 0x07, 0x70, 0x6f,\n\t0x73, 0x74, 0x2e, 0x69, 0x64, 0x12, 0x0e, 0x27, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x32, 0x27, 0x6a, 0x15, 0x0a, 0x05, 0x65, 0x6e, 0x2d, 0x55, 0x53, 0x12, 0x0c,\n\t0x70, 0x6f, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x72, 0x1d, 0x43, 0x75,\n\t0x73, 0x74, 0x6f, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x7b, 0x6d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x3a, 0x20, 0x27, 0x66, 0x6f, 0x6f, 0x27, 0x7d, 0x40, 0x03, 0x0a, 0x4b, 0x7a,\n\t0x49, 0x12, 0x47, 0x0a, 0x21, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e,\n\t0x5a, 0x14, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x69, 0x64, 0x20, 0x21, 0x3d, 0x20, 0x27, 0x73, 0x6f,\n\t0x6d, 0x65, 0x2d, 0x69, 0x64, 0x27, 0x12, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f,\n\t0x6e, 0x18, 0x09, 0x22, 0x15, 0x27, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x34, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x21, 0x27, 0x0a, 0x57, 0x0a, 0x17, 0x63, 0x75,\n\t0x73, 0x74, 0x6f, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7a, 0x3c, 0x12, 0x3a, 0x12, 0x1b, 0x63, 0x75, 0x73, 0x74, 0x6f,\n\t0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,\n\t0x20, 0x3d, 0x3d, 0x20, 0x27, 0x27, 0x18, 0x0d, 0x22, 0x19, 0x27, 0x63, 0x75, 0x73, 0x74, 0x6f,\n\t0x6d, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70,\n\t0x74, 0x79, 0x27, 0x0a, 0x29, 0x7a, 0x27, 0x12, 0x25, 0x12, 0x11, 0x70, 0x6f, 0x73, 0x74, 0x2e,\n\t0x69, 0x74, 0x65, 0x6d, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x18, 0x0d, 0x22, 0x0e,\n\t0x27, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x27, 0x0a, 0x31,\n\t0x7a, 0x2f, 0x12, 0x2d, 0x12, 0x16, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x2e,\n\t0x69, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x18, 0x0d, 0x22, 0x11,\n\t0x27, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x69, 0x64, 0x20, 0x69, 0x73, 0x20, 0x7a, 0x65, 0x72, 0x6f,\n\t0x27, 0x0a, 0x32, 0x7a, 0x30, 0x12, 0x2e, 0x12, 0x14, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x69, 0x74,\n\t0x65, 0x6d, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x27, 0x18, 0x0d, 0x22,\n\t0x14, 0x27, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65,\n\t0x6d, 0x70, 0x74, 0x79, 0x27, 0x22, 0xd3, 0x01, 0x0a, 0x04, 0x50, 0x6f, 0x73, 0x74, 0x12, 0x1e,\n\t0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0e, 0x9a, 0x4a, 0x0b, 0x12,\n\t0x09, 0x27, 0x73, 0x6f, 0x6d, 0x65, 0x2d, 0x69, 0x64, 0x27, 0x52, 0x02, 0x69, 0x64, 0x12, 0x27,\n\t0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x11, 0x9a,\n\t0x4a, 0x0e, 0x12, 0x0c, 0x27, 0x73, 0x6f, 0x6d, 0x65, 0x2d, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x27,\n\t0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x2d, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x13, 0x9a, 0x4a, 0x10, 0x12, 0x0e, 0x27,\n\t0x73, 0x6f, 0x6d, 0x65, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x27, 0x52, 0x07, 0x63,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x53, 0x0a, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x04,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x42, 0x29, 0x9a, 0x4a, 0x26, 0x12,\n\t0x24, 0x49, 0x74, 0x65, 0x6d, 0x7b, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x3a, 0x20, 0x32,\n\t0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x20, 0x27, 0x69, 0x74, 0x65, 0x6d, 0x2d, 0x6e, 0x61,\n\t0x6d, 0x65, 0x32, 0x27, 0x7d, 0x52, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x22, 0x4d, 0x0a, 0x04, 0x49,\n\t0x74, 0x65, 0x6d, 0x12, 0x1f, 0x0a, 0x07, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x05, 0x42, 0x06, 0x9a, 0x4a, 0x03, 0x12, 0x01, 0x31, 0x52, 0x06, 0x69, 0x74,\n\t0x65, 0x6d, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x09, 0x42, 0x10, 0x9a, 0x4a, 0x0d, 0x12, 0x0b, 0x27, 0x69, 0x74, 0x65, 0x6d, 0x2d, 0x6e,\n\t0x61, 0x6d, 0x65, 0x27, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x39, 0x0a, 0x0d, 0x43, 0x75,\n\t0x73, 0x74, 0x6f, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x28, 0x0a, 0x07, 0x6d,\n\t0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0e, 0x9a, 0x4a,\n\t0x0b, 0x12, 0x09, 0x24, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x07, 0x6d, 0x65,\n\t0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x37, 0x0a, 0x14, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48,\n\t0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x1f, 0x9a,\n\t0x4a, 0x1c, 0x0a, 0x18, 0x7a, 0x16, 0x12, 0x14, 0x12, 0x10, 0x24, 0x2e, 0x61, 0x72, 0x67, 0x20,\n\t0x3d, 0x3d, 0x20, 0x27, 0x77, 0x72, 0x6f, 0x6e, 0x67, 0x27, 0x18, 0x09, 0x10, 0x01, 0x32, 0x66,\n\t0x0a, 0x11, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x12, 0x4c, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x12, 0x1e,\n\t0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f,\n\t0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,\n\t0x00, 0x1a, 0x03, 0x9a, 0x4a, 0x00, 0x42, 0x9d, 0x01, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x2e, 0x6f,\n\t0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0f, 0x46,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01,\n\t0x5a, 0x1d, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xa2,\n\t0x02, 0x03, 0x4f, 0x46, 0x58, 0xaa, 0x02, 0x0e, 0x4f, 0x72, 0x67, 0x2e, 0x46, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xca, 0x02, 0x0e, 0x4f, 0x72, 0x67, 0x5c, 0x46, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xe2, 0x02, 0x1a, 0x4f, 0x72, 0x67, 0x5c, 0x46, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61,\n\t0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0f, 0x4f, 0x72, 0x67, 0x3a, 0x3a, 0x46, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_federation_federation_proto_rawDescOnce sync.Once\n\tfile_federation_federation_proto_rawDescData = file_federation_federation_proto_rawDesc\n)\n\nfunc file_federation_federation_proto_rawDescGZIP() []byte {\n\tfile_federation_federation_proto_rawDescOnce.Do(func() {\n\t\tfile_federation_federation_proto_rawDescData = protoimpl.X.CompressGZIP(file_federation_federation_proto_rawDescData)\n\t})\n\treturn file_federation_federation_proto_rawDescData\n}\n\nvar file_federation_federation_proto_msgTypes = make([]protoimpl.MessageInfo, 6)\nvar file_federation_federation_proto_goTypes = []interface{}{\n\t(*GetPostRequest)(nil),       // 0: org.federation.GetPostRequest\n\t(*GetPostResponse)(nil),      // 1: org.federation.GetPostResponse\n\t(*Post)(nil),                 // 2: org.federation.Post\n\t(*Item)(nil),                 // 3: org.federation.Item\n\t(*CustomMessage)(nil),        // 4: org.federation.CustomMessage\n\t(*CustomHandlerMessage)(nil), // 5: org.federation.CustomHandlerMessage\n}\nvar file_federation_federation_proto_depIdxs = []int32{\n\t2, // 0: org.federation.GetPostResponse.post:type_name -> org.federation.Post\n\t3, // 1: org.federation.Post.item:type_name -> org.federation.Item\n\t0, // 2: org.federation.FederationService.GetPost:input_type -> org.federation.GetPostRequest\n\t1, // 3: org.federation.FederationService.GetPost:output_type -> org.federation.GetPostResponse\n\t3, // [3:4] is the sub-list for method output_type\n\t2, // [2:3] is the sub-list for method input_type\n\t2, // [2:2] is the sub-list for extension type_name\n\t2, // [2:2] is the sub-list for extension extendee\n\t0, // [0:2] is the sub-list for field type_name\n}\n\nfunc init() { file_federation_federation_proto_init() }\nfunc file_federation_federation_proto_init() {\n\tif File_federation_federation_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_federation_federation_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Post); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Item); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CustomMessage); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CustomHandlerMessage); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_federation_federation_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   6,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_federation_federation_proto_goTypes,\n\t\tDependencyIndexes: file_federation_federation_proto_depIdxs,\n\t\tMessageInfos:      file_federation_federation_proto_msgTypes,\n\t}.Build()\n\tFile_federation_federation_proto = out.File\n\tfile_federation_federation_proto_rawDesc = nil\n\tfile_federation_federation_proto_goTypes = nil\n\tfile_federation_federation_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/12_validation/federation/federation_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tFederationService_GetPost_FullMethodName = \"/org.federation.FederationService/GetPost\"\n)\n\n// FederationServiceClient is the client API for FederationService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype FederationServiceClient interface {\n\tGetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error)\n}\n\ntype federationServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewFederationServiceClient(cc grpc.ClientConnInterface) FederationServiceClient {\n\treturn &federationServiceClient{cc}\n}\n\nfunc (c *federationServiceClient) GetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error) {\n\tout := new(GetPostResponse)\n\terr := c.cc.Invoke(ctx, FederationService_GetPost_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// FederationServiceServer is the server API for FederationService service.\n// All implementations must embed UnimplementedFederationServiceServer\n// for forward compatibility\ntype FederationServiceServer interface {\n\tGetPost(context.Context, *GetPostRequest) (*GetPostResponse, error)\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\n// UnimplementedFederationServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedFederationServiceServer struct {\n}\n\nfunc (UnimplementedFederationServiceServer) GetPost(context.Context, *GetPostRequest) (*GetPostResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetPost not implemented\")\n}\nfunc (UnimplementedFederationServiceServer) mustEmbedUnimplementedFederationServiceServer() {}\n\n// UnsafeFederationServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to FederationServiceServer will\n// result in compilation errors.\ntype UnsafeFederationServiceServer interface {\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\nfunc RegisterFederationServiceServer(s grpc.ServiceRegistrar, srv FederationServiceServer) {\n\ts.RegisterService(&FederationService_ServiceDesc, srv)\n}\n\nfunc _FederationService_GetPost_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetPostRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(FederationServiceServer).GetPost(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: FederationService_GetPost_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(FederationServiceServer).GetPost(ctx, req.(*GetPostRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// FederationService_ServiceDesc is the grpc.ServiceDesc for FederationService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar FederationService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"org.federation.FederationService\",\n\tHandlerType: (*FederationServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetPost\",\n\t\t\tHandler:    _FederationService_GetPost_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"federation/federation.proto\",\n}\n"
  },
  {
    "path": "_examples/12_validation/federation/federation_grpc_federation.pb.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: federation/federation.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Org_Federation_CustomHandlerMessageVariable represents variable definitions in \"org.federation.CustomHandlerMessage\".\ntype FederationService_Org_Federation_CustomHandlerMessageVariable struct {\n}\n\n// Org_Federation_CustomHandlerMessageArgument is argument for \"org.federation.CustomHandlerMessage\" message.\ntype FederationService_Org_Federation_CustomHandlerMessageArgument struct {\n\tArg string\n\tFederationService_Org_Federation_CustomHandlerMessageVariable\n}\n\n// Org_Federation_CustomMessageVariable represents variable definitions in \"org.federation.CustomMessage\".\ntype FederationService_Org_Federation_CustomMessageVariable struct {\n}\n\n// Org_Federation_CustomMessageArgument is argument for \"org.federation.CustomMessage\" message.\ntype FederationService_Org_Federation_CustomMessageArgument struct {\n\tMessage string\n\tFederationService_Org_Federation_CustomMessageVariable\n}\n\n// Org_Federation_GetPostResponseVariable represents variable definitions in \"org.federation.GetPostResponse\".\ntype FederationService_Org_Federation_GetPostResponseVariable struct {\n\tCondition           bool\n\tCustomMessage       *CustomMessage\n\tPost                *Post\n\tXDef5ErrDetail0Msg0 *CustomMessage\n\tXDef5ErrDetail0Msg1 *CustomMessage\n}\n\n// Org_Federation_GetPostResponseArgument is argument for \"org.federation.GetPostResponse\" message.\ntype FederationService_Org_Federation_GetPostResponseArgument struct {\n\tId string\n\tFederationService_Org_Federation_GetPostResponseVariable\n}\n\n// Org_Federation_PostVariable represents variable definitions in \"org.federation.Post\".\ntype FederationService_Org_Federation_PostVariable struct {\n}\n\n// Org_Federation_PostArgument is argument for \"org.federation.Post\" message.\ntype FederationService_Org_Federation_PostArgument struct {\n\tFederationService_Org_Federation_PostVariable\n}\n\n// FederationServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationServiceConfig struct {\n\t// Resolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\n\t// If this interface is not provided, an error is returned during initialization.\n\tResolver FederationServiceResolver // required\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationServiceClientFactory interface {\n}\n\n// FederationServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationServiceDependentClientSet struct {\n}\n\n// FederationServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationServiceResolver interface {\n\t// Resolve_Org_Federation_CustomHandlerMessage implements resolver for \"org.federation.CustomHandlerMessage\".\n\tResolve_Org_Federation_CustomHandlerMessage(context.Context, *FederationService_Org_Federation_CustomHandlerMessageArgument) (*CustomHandlerMessage, error)\n}\n\n// FederationServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// FederationServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationServiceUnimplementedResolver struct{}\n\n// Resolve_Org_Federation_CustomHandlerMessage resolve \"org.federation.CustomHandlerMessage\".\n// This method always returns Unimplemented error.\nfunc (FederationServiceUnimplementedResolver) Resolve_Org_Federation_CustomHandlerMessage(context.Context, *FederationService_Org_Federation_CustomHandlerMessageArgument) (ret *CustomHandlerMessage, e error) {\n\te = grpcfed.GRPCErrorf(grpcfed.UnimplementedCode, \"method Resolve_Org_Federation_CustomHandlerMessage not implemented\")\n\treturn\n}\n\n// FederationService represents Federation Service.\ntype FederationService struct {\n\tUnimplementedFederationServiceServer\n\tcfg             FederationServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tresolver        FederationServiceResolver\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationServiceDependentClientSet\n}\n\n// NewFederationService creates FederationService instance by FederationServiceConfig.\nfunc NewFederationService(cfg FederationServiceConfig) (*FederationService, error) {\n\tif cfg.Resolver == nil {\n\t\treturn nil, grpcfed.ErrResolverConfig\n\t}\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"org.federation.FederationService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.org.federation.CustomHandlerMessageArgument\": {\n\t\t\t\"arg\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Arg\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.CustomMessageArgument\": {\n\t\t\t\"message\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Message\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.GetPostResponseArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.PostArgument\": {},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"org.federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tsvc := &FederationService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tresolver:        cfg.Resolver,\n\t\tclient:          &FederationServiceDependentClientSet{},\n\t}\n\tif resolver, ok := cfg.Resolver.(grpcfed.CustomResolverInitializer); ok {\n\t\tctx := context.Background()\n\t\tif err := resolver.Init(ctx); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationService(ctx context.Context, svc *FederationService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n// GetPost implements \"org.federation.FederationService/GetPost\" method.\nfunc (s *FederationService) GetPost(ctx context.Context, req *GetPostRequest) (res *GetPostResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.FederationService/GetPost\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Org_Federation_GetPostResponse(ctx, &FederationService_Org_Federation_GetPostResponseArgument{\n\t\tId: req.GetId(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Org_Federation_CustomHandlerMessage resolve \"org.federation.CustomHandlerMessage\" message.\nfunc (s *FederationService) resolve_Org_Federation_CustomHandlerMessage(ctx context.Context, req *FederationService_Org_Federation_CustomHandlerMessageArgument) (*CustomHandlerMessage, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.CustomHandlerMessage\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.CustomHandlerMessage\", slog.Any(\"message_args\", s.logvalue_Org_Federation_CustomHandlerMessageArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tXDef0 bool\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.CustomHandlerMessageArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"_def0\"\n\t\t  validation {\n\t\t    error {\n\t\t      code: FAILED_PRECONDITION\n\t\t      if: \"$.arg == 'wrong'\"\n\t\t    }\n\t\t  }\n\t\t}\n\t*/\n\tdef__def0 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[bool, *localValueType]{\n\t\t\tName: `_def0`,\n\t\t\tType: grpcfed.CELBoolType,\n\t\t\tSetter: func(value *localValueType, v bool) error {\n\t\t\t\tvalue.vars.XDef0 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tValidation: func(ctx context.Context, value *localValueType) error {\n\t\t\t\tvar stat *grpcfed.Status\n\t\t\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.arg == 'wrong'`,\n\t\t\t\t\tCacheIndex: 1,\n\t\t\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t\t\terrorMessage := \"error\"\n\t\t\t\t\t\tstat = grpcfed.NewGRPCStatus(grpcfed.FailedPreconditionCode, errorMessage)\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\treturn grpcfed.NewErrorWithLogAttrs(stat.Err(), slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def__def0(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// create a message value to be returned.\n\t// `custom_resolver = true` in \"grpc.federation.message\" option.\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx)) // create a new reference to logger.\n\tret, err := s.resolver.Resolve_Org_Federation_CustomHandlerMessage(ctx, req)\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.CustomHandlerMessage\", slog.Any(\"org.federation.CustomHandlerMessage\", s.logvalue_Org_Federation_CustomHandlerMessage(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_CustomMessage resolve \"org.federation.CustomMessage\" message.\nfunc (s *FederationService) resolve_Org_Federation_CustomMessage(ctx context.Context, req *FederationService_Org_Federation_CustomMessageArgument) (*CustomMessage, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.CustomMessage\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.CustomMessage\", slog.Any(\"message_args\", s.logvalue_Org_Federation_CustomMessageArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.CustomMessageArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &CustomMessage{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"$.message\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `$.message`,\n\t\tCacheIndex: 2,\n\t\tSetter: func(v string) error {\n\t\t\tret.Message = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.CustomMessage\", slog.Any(\"org.federation.CustomMessage\", s.logvalue_Org_Federation_CustomMessage(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_GetPostResponse resolve \"org.federation.GetPostResponse\" message.\nfunc (s *FederationService) resolve_Org_Federation_GetPostResponse(ctx context.Context, req *FederationService_Org_Federation_GetPostResponseArgument) (*GetPostResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.GetPostResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.GetPostResponse\", slog.Any(\"message_args\", s.logvalue_Org_Federation_GetPostResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tCondition               bool\n\t\t\tCustomHandler           *CustomHandlerMessage\n\t\t\tCustomMessage           *CustomMessage\n\t\t\tCustomMessageValidation bool\n\t\t\tPost                    *Post\n\t\t\tXDef10                  bool\n\t\t\tXDef3                   bool\n\t\t\tXDef4                   bool\n\t\t\tXDef5                   bool\n\t\t\tXDef5Def0               bool\n\t\t\tXDef5ErrDetail0Msg0     *CustomMessage\n\t\t\tXDef5ErrDetail0Msg1     *CustomMessage\n\t\t\tXDef6                   bool\n\t\t\tXDef8                   bool\n\t\t\tXDef9                   bool\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.GetPostResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"post\"\n\t\t  message {\n\t\t    name: \"Post\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_post := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Post, *localValueType]{\n\t\t\tName: `post`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.Post\"),\n\t\t\tSetter: func(value *localValueType, v *Post) error {\n\t\t\t\tvalue.vars.Post = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_PostArgument{}\n\t\t\t\tret, err := s.resolve_Org_Federation_Post(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"customHandler\"\n\t\t  message {\n\t\t    name: \"CustomHandlerMessage\"\n\t\t    args { name: \"arg\", by: \"'some-arg'\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_customHandler := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*CustomHandlerMessage, *localValueType]{\n\t\t\tName: `customHandler`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.CustomHandlerMessage\"),\n\t\t\tSetter: func(value *localValueType, v *CustomHandlerMessage) error {\n\t\t\t\tvalue.vars.CustomHandler = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_CustomHandlerMessageArgument{}\n\t\t\t\t// { name: \"arg\", by: \"'some-arg'\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `'some-arg'`,\n\t\t\t\t\tCacheIndex: 3,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Arg = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_CustomHandlerMessage(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"customMessage\"\n\t\t  message {\n\t\t    name: \"CustomMessage\"\n\t\t    args { name: \"message\", by: \"'some-message'\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_customMessage := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*CustomMessage, *localValueType]{\n\t\t\tName: `customMessage`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.CustomMessage\"),\n\t\t\tSetter: func(value *localValueType, v *CustomMessage) error {\n\t\t\t\tvalue.vars.CustomMessage = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_CustomMessageArgument{}\n\t\t\t\t// { name: \"message\", by: \"'some-message'\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `'some-message'`,\n\t\t\t\t\tCacheIndex: 4,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Message = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_CustomMessage(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"_def3\"\n\t\t  validation {\n\t\t    error {\n\t\t      code: FAILED_PRECONDITION\n\t\t      if: \"post.id != 'some-id'\"\n\t\t      message: \"'validation1 failed!'\"\n\t\t    }\n\t\t  }\n\t\t}\n\t*/\n\tdef__def3 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[bool, *localValueType]{\n\t\t\tName: `_def3`,\n\t\t\tType: grpcfed.CELBoolType,\n\t\t\tSetter: func(value *localValueType, v bool) error {\n\t\t\t\tvalue.vars.XDef3 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tValidation: func(ctx context.Context, value *localValueType) error {\n\t\t\t\tvar stat *grpcfed.Status\n\t\t\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `post.id != 'some-id'`,\n\t\t\t\t\tCacheIndex: 5,\n\t\t\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t\t\terrmsg, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\tExpr:       `'validation1 failed!'`,\n\t\t\t\t\t\t\tOutType:    reflect.TypeOf(\"\"),\n\t\t\t\t\t\t\tCacheIndex: 6,\n\t\t\t\t\t\t})\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t}\n\t\t\t\t\t\terrorMessage := errmsg.(string)\n\t\t\t\t\t\tstat = grpcfed.NewGRPCStatus(grpcfed.FailedPreconditionCode, errorMessage)\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\treturn grpcfed.NewErrorWithLogAttrs(stat.Err(), slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"_def4\"\n\t\t  validation {\n\t\t    error {\n\t\t      code: FAILED_PRECONDITION\n\t\t      if: \"post.id != 'some-id'\"\n\t\t      message: \"'validation2 failed!'\"\n\t\t    }\n\t\t  }\n\t\t}\n\t*/\n\tdef__def4 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[bool, *localValueType]{\n\t\t\tName: `_def4`,\n\t\t\tType: grpcfed.CELBoolType,\n\t\t\tSetter: func(value *localValueType, v bool) error {\n\t\t\t\tvalue.vars.XDef4 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tValidation: func(ctx context.Context, value *localValueType) error {\n\t\t\t\tvar stat *grpcfed.Status\n\t\t\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `post.id != 'some-id'`,\n\t\t\t\t\tCacheIndex: 7,\n\t\t\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t\t\terrmsg, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\tExpr:       `'validation2 failed!'`,\n\t\t\t\t\t\t\tOutType:    reflect.TypeOf(\"\"),\n\t\t\t\t\t\t\tCacheIndex: 8,\n\t\t\t\t\t\t})\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t}\n\t\t\t\t\t\terrorMessage := errmsg.(string)\n\t\t\t\t\t\tstat = grpcfed.NewGRPCStatus(grpcfed.FailedPreconditionCode, errorMessage)\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\treturn grpcfed.NewErrorWithLogAttrs(stat.Err(), slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"_def5\"\n\t\t  validation {\n\t\t    error {\n\t\t      code: FAILED_PRECONDITION\n\t\t      def {\n\t\t        name: \"_def5_def0\"\n\t\t        by: \"grpc.federation.log.add({'validation3_attrs': true})\"\n\t\t      }\n\t\t      if: \"$.id != 'correct-id'\"\n\t\t      message: \"'validation3 failed!'\"\n\t\t      details {\n\t\t        if: \"true\"\n\t\t        message: [\n\t\t          {...},\n\t\t          {...}\n\t\t        ]\n\t\t        precondition_failure {...}\n\t\t        bad_request {...}\n\t\t        localized_message {...}\n\t\t      }\n\t\t    }\n\t\t  }\n\t\t}\n\t*/\n\tdef__def5 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[bool, *localValueType]{\n\t\t\tName: `_def5`,\n\t\t\tType: grpcfed.CELBoolType,\n\t\t\tSetter: func(value *localValueType, v bool) error {\n\t\t\t\tvalue.vars.XDef5 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tValidation: func(ctx context.Context, value *localValueType) error {\n\t\t\t\tvar stat *grpcfed.Status\n\t\t\t\tif _, err := func() (any, error) {\n\t\t\t\t\t/*\n\t\t\t\t\t\tdef {\n\t\t\t\t\t\t  name: \"_def5_def0\"\n\t\t\t\t\t\t  by: \"grpc.federation.log.add({'validation3_attrs': true})\"\n\t\t\t\t\t\t}\n\t\t\t\t\t*/\n\t\t\t\t\tdef__def5_def0 := func(ctx context.Context) error {\n\t\t\t\t\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[bool, *localValueType]{\n\t\t\t\t\t\t\tName: `_def5_def0`,\n\t\t\t\t\t\t\tType: grpcfed.CELBoolType,\n\t\t\t\t\t\t\tSetter: func(value *localValueType, v bool) error {\n\t\t\t\t\t\t\t\tvalue.vars.XDef5Def0 = v\n\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tBy:           `grpc.federation.log.add({'validation3_attrs': true})`,\n\t\t\t\t\t\t\tByCacheIndex: 9,\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\n\t\t\t\t\tif err := def__def5_def0(ctx); err != nil {\n\t\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t}\n\t\t\t\t\treturn nil, nil\n\t\t\t\t}(); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id != 'correct-id'`,\n\t\t\t\t\tCacheIndex: 10,\n\t\t\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t\t\terrmsg, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\tExpr:       `'validation3 failed!'`,\n\t\t\t\t\t\t\tOutType:    reflect.TypeOf(\"\"),\n\t\t\t\t\t\t\tCacheIndex: 11,\n\t\t\t\t\t\t})\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t}\n\t\t\t\t\t\terrorMessage := errmsg.(string)\n\t\t\t\t\t\tvar details []grpcfed.ProtoMessage\n\t\t\t\t\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\tExpr:       `true`,\n\t\t\t\t\t\t\tCacheIndex: 12,\n\t\t\t\t\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t\t\t\t\tif _, err := func() (any, error) {\n\t\t\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t\t\t\tdef {\n\t\t\t\t\t\t\t\t\t\t  name: \"_def5_err_detail0_msg0\"\n\t\t\t\t\t\t\t\t\t\t  message {\n\t\t\t\t\t\t\t\t\t\t    name: \"CustomMessage\"\n\t\t\t\t\t\t\t\t\t\t    args { name: \"message\", by: \"'message1'\" }\n\t\t\t\t\t\t\t\t\t\t  }\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\t\t\tdef__def5_err_detail0_msg0 := func(ctx context.Context) error {\n\t\t\t\t\t\t\t\t\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*CustomMessage, *localValueType]{\n\t\t\t\t\t\t\t\t\t\t\tName: `_def5_err_detail0_msg0`,\n\t\t\t\t\t\t\t\t\t\t\tType: grpcfed.CELObjectType(\"org.federation.CustomMessage\"),\n\t\t\t\t\t\t\t\t\t\t\tSetter: func(value *localValueType, v *CustomMessage) error {\n\t\t\t\t\t\t\t\t\t\t\t\tvalue.vars.XDef5ErrDetail0Msg0 = v\n\t\t\t\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\t\t\t\t\t\t\t\t\targs := &FederationService_Org_Federation_CustomMessageArgument{}\n\t\t\t\t\t\t\t\t\t\t\t\t// { name: \"message\", by: \"'message1'\" }\n\t\t\t\t\t\t\t\t\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\t\t\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\t\t\t\t\t\t\tExpr:       `'message1'`,\n\t\t\t\t\t\t\t\t\t\t\t\t\tCacheIndex: 13,\n\t\t\t\t\t\t\t\t\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\targs.Message = v\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tret, err := s.resolve_Org_Federation_CustomMessage(ctx, args)\n\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\treturn ret, nil\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t\t\t\tdef {\n\t\t\t\t\t\t\t\t\t\t  name: \"_def5_err_detail0_msg1\"\n\t\t\t\t\t\t\t\t\t\t  message {\n\t\t\t\t\t\t\t\t\t\t    name: \"CustomMessage\"\n\t\t\t\t\t\t\t\t\t\t    args { name: \"message\", by: \"'message2'\" }\n\t\t\t\t\t\t\t\t\t\t  }\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\t\t\tdef__def5_err_detail0_msg1 := func(ctx context.Context) error {\n\t\t\t\t\t\t\t\t\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*CustomMessage, *localValueType]{\n\t\t\t\t\t\t\t\t\t\t\tName: `_def5_err_detail0_msg1`,\n\t\t\t\t\t\t\t\t\t\t\tType: grpcfed.CELObjectType(\"org.federation.CustomMessage\"),\n\t\t\t\t\t\t\t\t\t\t\tSetter: func(value *localValueType, v *CustomMessage) error {\n\t\t\t\t\t\t\t\t\t\t\t\tvalue.vars.XDef5ErrDetail0Msg1 = v\n\t\t\t\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\t\t\t\t\t\t\t\t\targs := &FederationService_Org_Federation_CustomMessageArgument{}\n\t\t\t\t\t\t\t\t\t\t\t\t// { name: \"message\", by: \"'message2'\" }\n\t\t\t\t\t\t\t\t\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\t\t\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\t\t\t\t\t\t\tExpr:       `'message2'`,\n\t\t\t\t\t\t\t\t\t\t\t\t\tCacheIndex: 14,\n\t\t\t\t\t\t\t\t\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\targs.Message = v\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tret, err := s.resolve_Org_Federation_CustomMessage(ctx, args)\n\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\treturn ret, nil\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// A tree view of message dependencies is shown below.\n\t\t\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t\t\t   _def5_err_detail0_msg0 ─┐\n\t\t\t\t\t\t\t\t\t   _def5_err_detail0_msg1 ─┤\n\t\t\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\t\t\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\t\t\t\t\t\t\t\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\t\t\t\t\t\t\t\tif err := def__def5_err_detail0_msg0(ctx1); err != nil {\n\t\t\t\t\t\t\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\treturn nil, nil\n\t\t\t\t\t\t\t\t\t})\n\n\t\t\t\t\t\t\t\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\t\t\t\t\t\t\t\tif err := def__def5_err_detail0_msg1(ctx1); err != nil {\n\t\t\t\t\t\t\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\treturn nil, nil\n\t\t\t\t\t\t\t\t\t})\n\n\t\t\t\t\t\t\t\t\tif err := eg.Wait(); err != nil {\n\t\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn nil, nil\n\t\t\t\t\t\t\t\t}(); err != nil {\n\t\t\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif detail := grpcfed.CustomMessage(ctx, &grpcfed.CustomMessageParam{\n\t\t\t\t\t\t\t\t\tValue:            value,\n\t\t\t\t\t\t\t\t\tMessageValueName: \"_def5_err_detail0_msg0\",\n\t\t\t\t\t\t\t\t\tCacheIndex:       15,\n\t\t\t\t\t\t\t\t\tMessageIndex:     0,\n\t\t\t\t\t\t\t\t}); detail != nil {\n\t\t\t\t\t\t\t\t\tdetails = append(details, detail)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif detail := grpcfed.CustomMessage(ctx, &grpcfed.CustomMessageParam{\n\t\t\t\t\t\t\t\t\tValue:            value,\n\t\t\t\t\t\t\t\t\tMessageValueName: \"_def5_err_detail0_msg1\",\n\t\t\t\t\t\t\t\t\tCacheIndex:       16,\n\t\t\t\t\t\t\t\t\tMessageIndex:     1,\n\t\t\t\t\t\t\t\t}); detail != nil {\n\t\t\t\t\t\t\t\t\tdetails = append(details, detail)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tdetail, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\t\t\t\tExpr:       `CustomMessage{message: 'foo'}`,\n\t\t\t\t\t\t\t\t\t\tOutType:    reflect.TypeOf((*CustomMessage)(nil)),\n\t\t\t\t\t\t\t\t\t\tCacheIndex: 17,\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\tgrpcfed.Logger(ctx).ErrorContext(ctx, \"failed setting error details\", slog.String(\"error\", err.Error()))\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif detail != nil {\n\t\t\t\t\t\t\t\t\t\tdetails = append(details, detail.(grpcfed.ProtoMessage))\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif detail := grpcfed.PreconditionFailure(ctx, value, []*grpcfed.PreconditionFailureViolation{\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tType:              `'type1'`,\n\t\t\t\t\t\t\t\t\t\tSubject:           `post.id`,\n\t\t\t\t\t\t\t\t\t\tDesc:              `'description1'`,\n\t\t\t\t\t\t\t\t\t\tTypeCacheIndex:    18,\n\t\t\t\t\t\t\t\t\t\tSubjectCacheIndex: 19,\n\t\t\t\t\t\t\t\t\t\tDescCacheIndex:    20,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t}); detail != nil {\n\t\t\t\t\t\t\t\t\tdetails = append(details, detail)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif detail := grpcfed.BadRequest(ctx, value, []*grpcfed.BadRequestFieldViolation{\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tField:           `post.id`,\n\t\t\t\t\t\t\t\t\t\tDesc:            `'description2'`,\n\t\t\t\t\t\t\t\t\t\tFieldCacheIndex: 21,\n\t\t\t\t\t\t\t\t\t\tDescCacheIndex:  22,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t}); detail != nil {\n\t\t\t\t\t\t\t\t\tdetails = append(details, detail)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif detail := grpcfed.LocalizedMessage(ctx, &grpcfed.LocalizedMessageParam{\n\t\t\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\t\t\tLocale:     \"en-US\",\n\t\t\t\t\t\t\t\t\tMessage:    `post.content`,\n\t\t\t\t\t\t\t\t\tCacheIndex: 23,\n\t\t\t\t\t\t\t\t}); detail != nil {\n\t\t\t\t\t\t\t\t\tdetails = append(details, detail)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstatus := grpcfed.NewGRPCStatus(grpcfed.FailedPreconditionCode, errorMessage)\n\t\t\t\t\t\tstatusWithDetails, err := status.WithDetails(details...)\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\tgrpcfed.Logger(ctx).ErrorContext(ctx, \"failed setting error details\", slog.String(\"error\", err.Error()))\n\t\t\t\t\t\t\tstat = status\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tstat = statusWithDetails\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\treturn grpcfed.NewErrorWithLogAttrs(stat.Err(), slog.LevelWarn, grpcfed.LogAttrs(ctx))\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"_def6\"\n\t\t  validation {\n\t\t    error {\n\t\t      code: FAILED_PRECONDITION\n\t\t      def {\n\t\t        name: \"condition\"\n\t\t        by: \"post.id != 'some-id'\"\n\t\t      }\n\t\t      if: \"condition\"\n\t\t      message: \"'validation4 failed!'\"\n\t\t    }\n\t\t  }\n\t\t}\n\t*/\n\tdef__def6 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[bool, *localValueType]{\n\t\t\tName: `_def6`,\n\t\t\tType: grpcfed.CELBoolType,\n\t\t\tSetter: func(value *localValueType, v bool) error {\n\t\t\t\tvalue.vars.XDef6 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tValidation: func(ctx context.Context, value *localValueType) error {\n\t\t\t\tvar stat *grpcfed.Status\n\t\t\t\tif _, err := func() (any, error) {\n\t\t\t\t\t/*\n\t\t\t\t\t\tdef {\n\t\t\t\t\t\t  name: \"condition\"\n\t\t\t\t\t\t  by: \"post.id != 'some-id'\"\n\t\t\t\t\t\t}\n\t\t\t\t\t*/\n\t\t\t\t\tdef_condition := func(ctx context.Context) error {\n\t\t\t\t\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[bool, *localValueType]{\n\t\t\t\t\t\t\tName: `condition`,\n\t\t\t\t\t\t\tType: grpcfed.CELBoolType,\n\t\t\t\t\t\t\tSetter: func(value *localValueType, v bool) error {\n\t\t\t\t\t\t\t\tvalue.vars.Condition = v\n\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tBy:           `post.id != 'some-id'`,\n\t\t\t\t\t\t\tByCacheIndex: 24,\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\n\t\t\t\t\tif err := def_condition(ctx); err != nil {\n\t\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t}\n\t\t\t\t\treturn nil, nil\n\t\t\t\t}(); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `condition`,\n\t\t\t\t\tCacheIndex: 25,\n\t\t\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t\t\terrmsg, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\tExpr:       `'validation4 failed!'`,\n\t\t\t\t\t\t\tOutType:    reflect.TypeOf(\"\"),\n\t\t\t\t\t\t\tCacheIndex: 26,\n\t\t\t\t\t\t})\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t}\n\t\t\t\t\t\terrorMessage := errmsg.(string)\n\t\t\t\t\t\tstat = grpcfed.NewGRPCStatus(grpcfed.FailedPreconditionCode, errorMessage)\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\treturn grpcfed.NewErrorWithLogAttrs(stat.Err(), slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"customMessageValidation\"\n\t\t  validation {\n\t\t    error {\n\t\t      code: INTERNAL\n\t\t      if: \"customMessage.message == ''\"\n\t\t      message: \"'custom message is empty'\"\n\t\t    }\n\t\t  }\n\t\t}\n\t*/\n\tdef_customMessageValidation := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[bool, *localValueType]{\n\t\t\tName: `customMessageValidation`,\n\t\t\tType: grpcfed.CELBoolType,\n\t\t\tSetter: func(value *localValueType, v bool) error {\n\t\t\t\tvalue.vars.CustomMessageValidation = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tValidation: func(ctx context.Context, value *localValueType) error {\n\t\t\t\tvar stat *grpcfed.Status\n\t\t\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `customMessage.message == ''`,\n\t\t\t\t\tCacheIndex: 27,\n\t\t\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t\t\terrmsg, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\tExpr:       `'custom message is empty'`,\n\t\t\t\t\t\t\tOutType:    reflect.TypeOf(\"\"),\n\t\t\t\t\t\t\tCacheIndex: 28,\n\t\t\t\t\t\t})\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t}\n\t\t\t\t\t\terrorMessage := errmsg.(string)\n\t\t\t\t\t\tstat = grpcfed.NewGRPCStatus(grpcfed.InternalCode, errorMessage)\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\treturn grpcfed.NewErrorWithLogAttrs(stat.Err(), slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"_def8\"\n\t\t  validation {\n\t\t    error {\n\t\t      code: INTERNAL\n\t\t      if: \"post.item == null\"\n\t\t      message: \"'item is null'\"\n\t\t    }\n\t\t  }\n\t\t}\n\t*/\n\tdef__def8 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[bool, *localValueType]{\n\t\t\tName: `_def8`,\n\t\t\tType: grpcfed.CELBoolType,\n\t\t\tSetter: func(value *localValueType, v bool) error {\n\t\t\t\tvalue.vars.XDef8 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tValidation: func(ctx context.Context, value *localValueType) error {\n\t\t\t\tvar stat *grpcfed.Status\n\t\t\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `post.item == null`,\n\t\t\t\t\tCacheIndex: 29,\n\t\t\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t\t\terrmsg, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\tExpr:       `'item is null'`,\n\t\t\t\t\t\t\tOutType:    reflect.TypeOf(\"\"),\n\t\t\t\t\t\t\tCacheIndex: 30,\n\t\t\t\t\t\t})\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t}\n\t\t\t\t\t\terrorMessage := errmsg.(string)\n\t\t\t\t\t\tstat = grpcfed.NewGRPCStatus(grpcfed.InternalCode, errorMessage)\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\treturn grpcfed.NewErrorWithLogAttrs(stat.Err(), slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"_def9\"\n\t\t  validation {\n\t\t    error {\n\t\t      code: INTERNAL\n\t\t      if: \"post.item.item_id == 0\"\n\t\t      message: \"'item id is zero'\"\n\t\t    }\n\t\t  }\n\t\t}\n\t*/\n\tdef__def9 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[bool, *localValueType]{\n\t\t\tName: `_def9`,\n\t\t\tType: grpcfed.CELBoolType,\n\t\t\tSetter: func(value *localValueType, v bool) error {\n\t\t\t\tvalue.vars.XDef9 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tValidation: func(ctx context.Context, value *localValueType) error {\n\t\t\t\tvar stat *grpcfed.Status\n\t\t\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `post.item.item_id == 0`,\n\t\t\t\t\tCacheIndex: 31,\n\t\t\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t\t\terrmsg, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\tExpr:       `'item id is zero'`,\n\t\t\t\t\t\t\tOutType:    reflect.TypeOf(\"\"),\n\t\t\t\t\t\t\tCacheIndex: 32,\n\t\t\t\t\t\t})\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t}\n\t\t\t\t\t\terrorMessage := errmsg.(string)\n\t\t\t\t\t\tstat = grpcfed.NewGRPCStatus(grpcfed.InternalCode, errorMessage)\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\treturn grpcfed.NewErrorWithLogAttrs(stat.Err(), slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"_def10\"\n\t\t  validation {\n\t\t    error {\n\t\t      code: INTERNAL\n\t\t      if: \"post.item.name == ''\"\n\t\t      message: \"'item name is empty'\"\n\t\t    }\n\t\t  }\n\t\t}\n\t*/\n\tdef__def10 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[bool, *localValueType]{\n\t\t\tName: `_def10`,\n\t\t\tType: grpcfed.CELBoolType,\n\t\t\tSetter: func(value *localValueType, v bool) error {\n\t\t\t\tvalue.vars.XDef10 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tValidation: func(ctx context.Context, value *localValueType) error {\n\t\t\t\tvar stat *grpcfed.Status\n\t\t\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `post.item.name == ''`,\n\t\t\t\t\tCacheIndex: 33,\n\t\t\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t\t\terrmsg, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\tExpr:       `'item name is empty'`,\n\t\t\t\t\t\t\tOutType:    reflect.TypeOf(\"\"),\n\t\t\t\t\t\t\tCacheIndex: 34,\n\t\t\t\t\t\t})\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t}\n\t\t\t\t\t\terrorMessage := errmsg.(string)\n\t\t\t\t\t\tstat = grpcfed.NewGRPCStatus(grpcfed.InternalCode, errorMessage)\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\treturn grpcfed.NewErrorWithLogAttrs(stat.Err(), slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t},\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t   post ─┐\n\t         _def3 ─┐\n\t                _def4 ─┐\n\t                       _def5 ─┐\n\t                                      _def6 ─┐\n\t                              customMessage ─┤\n\t                                             customMessageValidation ─┐\n\t                                                                      _def8 ─┐\n\t                                                                             _def9 ─┐\n\t                                                                                           _def10 ─┐\n\t                                                                                    customHandler ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\teg, ctx2 := grpcfed.ErrorGroupWithContext(ctx1)\n\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\tif err := def_post(ctx2); err != nil {\n\t\t\t\tgrpcfed.RecordErrorToSpan(ctx2, err)\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif err := def__def3(ctx2); err != nil {\n\t\t\t\tgrpcfed.RecordErrorToSpan(ctx2, err)\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif err := def__def4(ctx2); err != nil {\n\t\t\t\tgrpcfed.RecordErrorToSpan(ctx2, err)\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif err := def__def5(ctx2); err != nil {\n\t\t\t\tgrpcfed.RecordErrorToSpan(ctx2, err)\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif err := def__def6(ctx2); err != nil {\n\t\t\t\tgrpcfed.RecordErrorToSpan(ctx2, err)\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn nil, nil\n\t\t})\n\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\tif err := def_customMessage(ctx2); err != nil {\n\t\t\t\tgrpcfed.RecordErrorToSpan(ctx2, err)\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn nil, nil\n\t\t})\n\t\tif err := eg.Wait(); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_customMessageValidation(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def__def8(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def__def9(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def__def10(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_customHandler(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_GetPostResponseVariable.Condition = value.vars.Condition\n\treq.FederationService_Org_Federation_GetPostResponseVariable.CustomMessage = value.vars.CustomMessage\n\treq.FederationService_Org_Federation_GetPostResponseVariable.Post = value.vars.Post\n\treq.FederationService_Org_Federation_GetPostResponseVariable.XDef5ErrDetail0Msg0 = value.vars.XDef5ErrDetail0Msg0\n\treq.FederationService_Org_Federation_GetPostResponseVariable.XDef5ErrDetail0Msg1 = value.vars.XDef5ErrDetail0Msg1\n\n\t// create a message value to be returned.\n\tret := &GetPostResponse{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"post\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*Post]{\n\t\tValue:      value,\n\t\tExpr:       `post`,\n\t\tCacheIndex: 35,\n\t\tSetter: func(v *Post) error {\n\t\t\tret.Post = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.GetPostResponse\", slog.Any(\"org.federation.GetPostResponse\", s.logvalue_Org_Federation_GetPostResponse(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_Post resolve \"org.federation.Post\" message.\nfunc (s *FederationService) resolve_Org_Federation_Post(ctx context.Context, req *FederationService_Org_Federation_PostArgument) (*Post, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.Post\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.Post\", slog.Any(\"message_args\", s.logvalue_Org_Federation_PostArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.PostArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &Post{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'some-id'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'some-id'`,\n\t\tCacheIndex: 36,\n\t\tSetter: func(v string) error {\n\t\t\tret.Id = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"'some-title'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'some-title'`,\n\t\tCacheIndex: 37,\n\t\tSetter: func(v string) error {\n\t\t\tret.Title = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"'some-content'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'some-content'`,\n\t\tCacheIndex: 38,\n\t\tSetter: func(v string) error {\n\t\t\tret.Content = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"Item{item_id: 2, name: 'item-name2'}\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*Item]{\n\t\tValue:      value,\n\t\tExpr:       `Item{item_id: 2, name: 'item-name2'}`,\n\t\tCacheIndex: 39,\n\t\tSetter: func(v *Item) error {\n\t\t\tret.Item = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.Post\", slog.Any(\"org.federation.Post\", s.logvalue_Org_Federation_Post(ret)))\n\treturn ret, nil\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_CustomHandlerMessage(v *CustomHandlerMessage) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_CustomHandlerMessageArgument(v *FederationService_Org_Federation_CustomHandlerMessageArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"arg\", v.Arg),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_CustomMessage(v *CustomMessage) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"message\", v.GetMessage()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_CustomMessageArgument(v *FederationService_Org_Federation_CustomMessageArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"message\", v.Message),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostResponse(v *GetPostResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"post\", s.logvalue_Org_Federation_Post(v.GetPost())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostResponseArgument(v *FederationService_Org_Federation_GetPostResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_Item(v *Item) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Int64(\"item_id\", int64(v.GetItemId())),\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_Post(v *Post) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.String(\"title\", v.GetTitle()),\n\t\tslog.String(\"content\", v.GetContent()),\n\t\tslog.Any(\"item\", s.logvalue_Org_Federation_Item(v.GetItem())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_PostArgument(v *FederationService_Org_Federation_PostArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n"
  },
  {
    "path": "_examples/12_validation/go.mod",
    "content": "module example\n\ngo 1.24.0\n\nreplace github.com/mercari/grpc-federation => ../../\n\nrequire (\n\tgithub.com/google/go-cmp v0.7.0\n\tgithub.com/mercari/grpc-federation v0.0.0-00010101000000-000000000000\n\tgo.opentelemetry.io/otel v1.24.0\n\tgo.opentelemetry.io/otel/trace v1.24.0\n\tgo.uber.org/goleak v1.3.0\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7\n\tgoogle.golang.org/grpc v1.65.0\n\tgoogle.golang.org/protobuf v1.34.2\n)\n\nrequire (\n\tcel.dev/expr v0.19.1 // indirect\n\tgithub.com/antlr4-go/antlr/v4 v4.13.0 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.2.1 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/goccy/wasi-go v0.3.2 // indirect\n\tgithub.com/google/cel-go v0.23.1 // indirect\n\tgithub.com/google/uuid v1.6.0 // indirect\n\tgithub.com/kelseyhightower/envconfig v1.4.0 // indirect\n\tgithub.com/stealthrocket/wazergo v0.19.1 // indirect\n\tgithub.com/stoewer/go-strcase v1.3.0 // indirect\n\tgithub.com/tetratelabs/wazero v1.10.1 // indirect\n\tgo.opentelemetry.io/otel/metric v1.24.0 // indirect\n\tgolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect\n\tgolang.org/x/net v0.38.0 // indirect\n\tgolang.org/x/sync v0.14.0 // indirect\n\tgolang.org/x/sys v0.37.0 // indirect\n\tgolang.org/x/text v0.23.0 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 // indirect\n)\n"
  },
  {
    "path": "_examples/12_validation/go.sum",
    "content": "cel.dev/expr v0.19.1 h1:NciYrtDRIR0lNCnH1LFJegdjspNx9fI59O7TWcua/W4=\ncel.dev/expr v0.19.1/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw=\ngithub.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=\ngithub.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/goccy/wasi-go v0.3.2 h1:wAvGXmqCkfcp0B0AwIp5Ya53hzDwkKm9W8iuT3nCCz0=\ngithub.com/goccy/wasi-go v0.3.2/go.mod h1:nIKD204n9xa4Z20UV+XA483kIr9TAl2vXr+X5qVAO5M=\ngithub.com/google/cel-go v0.23.1 h1:91ThhEZlBcE5rB2adBVXqvDoqdL8BG2oyhd0bK1I/r4=\ngithub.com/google/cel-go v0.23.1/go.mod h1:52Pb6QsDbC5kvgxvZhiL9QX1oZEkcUF/ZqaPx1J5Wwo=\ngithub.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\ngithub.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=\ngithub.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/stealthrocket/wazergo v0.19.1 h1:BPrITETPgSFwiytwmToO0MbUC/+RGC39JScz1JmmG6c=\ngithub.com/stealthrocket/wazergo v0.19.1/go.mod h1:riI0hxw4ndZA5e6z7PesHg2BtTftcZaMxRcoiGGipTs=\ngithub.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs=\ngithub.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tetratelabs/wazero v1.10.1 h1:2DugeJf6VVk58KTPszlNfeeN8AhhpwcZqkJj2wwFuH8=\ngithub.com/tetratelabs/wazero v1.10.1/go.mod h1:DRm5twOQ5Gr1AoEdSi0CLjDQF1J9ZAuyqFIjl1KKfQU=\ngo.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo=\ngo.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=\ngo.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI=\ngo.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=\ngo.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=\ngo.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=\ngolang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=\ngolang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=\ngolang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=\ngolang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=\ngolang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=\ngolang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=\ngolang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 h1:YcyjlL1PRr2Q17/I0dPk2JmYS5CDXfcdb2Z3YRioEbw=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7 h1:2035KHhUv+EpyB+hWgJnaWKJOdX1E95w2S8Rr4uWKTs=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=\ngoogle.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=\ngoogle.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=\ngoogle.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=\ngoogle.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "_examples/12_validation/main_test.go",
    "content": "package main_test\n\nimport (\n\t\"context\"\n\t\"log/slog\"\n\t\"net\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"go.uber.org/goleak\"\n\t\"google.golang.org/genproto/googleapis/rpc/errdetails\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/codes\"\n\t\"google.golang.org/grpc/status\"\n\t\"google.golang.org/grpc/test/bufconn\"\n\n\t\"example/federation\"\n)\n\ntype Resolver struct{}\n\nfunc (r *Resolver) Resolve_Org_Federation_CustomHandlerMessage(_ context.Context, _ *federation.FederationService_Org_Federation_CustomHandlerMessageArgument) (*federation.CustomHandlerMessage, error) {\n\treturn &federation.CustomHandlerMessage{}, nil\n}\n\nconst bufSize = 1024\n\nvar listener *bufconn.Listener\n\nfunc dialer(_ context.Context, _ string) (net.Conn, error) {\n\treturn listener.Dial()\n}\n\nfunc TestFederation(t *testing.T) {\n\tdefer goleak.VerifyNone(t)\n\tctx := context.Background()\n\tlistener = bufconn.Listen(bufSize)\n\n\tconn, err := grpc.DialContext(ctx, \"\", grpc.WithContextDialer(dialer), grpc.WithInsecure())\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer conn.Close()\n\n\tgrpcServer := grpc.NewServer()\n\tdefer grpcServer.Stop()\n\n\tlogger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{\n\t\tLevel: slog.LevelDebug,\n\t}))\n\tfederationServer, err := federation.NewFederationService(federation.FederationServiceConfig{\n\t\tResolver: &Resolver{},\n\t\tLogger:   logger,\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer federation.CleanupFederationService(ctx, federationServer)\n\n\tfederation.RegisterFederationServiceServer(grpcServer, federationServer)\n\n\tgo func() {\n\t\tif err := grpcServer.Serve(listener); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t}()\n\n\tclient := federation.NewFederationServiceClient(conn)\n\n\ttype errStatus struct {\n\t\tcode    codes.Code\n\t\tmessage string\n\t\tdetails []any\n\t}\n\tfor _, tc := range []struct {\n\t\tdesc        string\n\t\trequest     *federation.GetPostRequest\n\t\texpected    *federation.GetPostResponse\n\t\texpectedErr *errStatus\n\t}{\n\t\t{\n\t\t\tdesc: \"success\",\n\t\t\trequest: &federation.GetPostRequest{\n\t\t\t\tId: \"correct-id\",\n\t\t\t},\n\t\t\texpected: &federation.GetPostResponse{\n\t\t\t\tPost: &federation.Post{\n\t\t\t\t\tId:      \"some-id\",\n\t\t\t\t\tTitle:   \"some-title\",\n\t\t\t\t\tContent: \"some-content\",\n\t\t\t\t\tItem: &federation.Item{\n\t\t\t\t\t\tItemId: 2,\n\t\t\t\t\t\tName:   \"item-name2\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"validation failure\",\n\t\t\trequest: &federation.GetPostRequest{\n\t\t\t\tId: \"wrong-id\",\n\t\t\t},\n\t\t\texpectedErr: &errStatus{\n\t\t\t\tcode:    codes.FailedPrecondition,\n\t\t\t\tmessage: \"validation3 failed!\",\n\t\t\t\tdetails: []any{\n\t\t\t\t\t&federation.CustomMessage{\n\t\t\t\t\t\tMessage: \"message1\",\n\t\t\t\t\t},\n\t\t\t\t\t&federation.CustomMessage{\n\t\t\t\t\t\tMessage: \"message2\",\n\t\t\t\t\t},\n\t\t\t\t\t&federation.CustomMessage{\n\t\t\t\t\t\tMessage: \"foo\",\n\t\t\t\t\t},\n\t\t\t\t\t&errdetails.PreconditionFailure{\n\t\t\t\t\t\tViolations: []*errdetails.PreconditionFailure_Violation{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tType:        \"type1\",\n\t\t\t\t\t\t\t\tSubject:     \"some-id\",\n\t\t\t\t\t\t\t\tDescription: \"description1\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t&errdetails.BadRequest{\n\t\t\t\t\t\tFieldViolations: []*errdetails.BadRequest_FieldViolation{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tField:       \"some-id\",\n\t\t\t\t\t\t\t\tDescription: \"description2\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t&errdetails.LocalizedMessage{\n\t\t\t\t\t\tLocale:  \"en-US\",\n\t\t\t\t\t\tMessage: \"some-content\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t} {\n\t\tt.Run(tc.desc, func(t *testing.T) {\n\t\t\tres, err := client.GetPost(ctx, tc.request)\n\t\t\tif err != nil {\n\t\t\t\tif tc.expectedErr == nil {\n\t\t\t\t\tt.Fatalf(\"failed to call GetPost: %v\", err)\n\t\t\t\t}\n\n\t\t\t\ts, ok := status.FromError(err)\n\t\t\t\tif !ok {\n\t\t\t\t\tt.Fatalf(\"failed to extract gRPC Status from the error: %v\", err)\n\t\t\t\t}\n\n\t\t\t\tif got := s.Code(); got != tc.expectedErr.code {\n\t\t\t\t\tt.Errorf(\"invalid a gRPC status code: got: %v, expected: %v\", got, tc.expectedErr.code)\n\t\t\t\t}\n\n\t\t\t\tif got := s.Message(); got != tc.expectedErr.message {\n\t\t\t\t\tt.Errorf(\"invalid a gRPC status message: got: %v, expected: %v\", got, tc.expectedErr.message)\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(s.Details(), tc.expectedErr.details, cmpopts.IgnoreUnexported(\n\t\t\t\t\tfederation.CustomMessage{},\n\t\t\t\t\terrdetails.PreconditionFailure{},\n\t\t\t\t\terrdetails.PreconditionFailure_Violation{},\n\t\t\t\t\terrdetails.BadRequest{},\n\t\t\t\t\terrdetails.BadRequest_FieldViolation{},\n\t\t\t\t\terrdetails.LocalizedMessage{},\n\t\t\t\t)); diff != \"\" {\n\t\t\t\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif tc.expectedErr != nil {\n\t\t\t\tt.Fatal(\"expected to receive an error but got nil\")\n\t\t\t}\n\n\t\t\tif diff := cmp.Diff(res, tc.expected, cmpopts.IgnoreUnexported(\n\t\t\t\tfederation.GetPostResponse{},\n\t\t\t\tfederation.Post{},\n\t\t\t\tfederation.Item{},\n\t\t\t)); diff != \"\" {\n\t\t\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "_examples/12_validation/proto/buf.yaml",
    "content": "version: v1\nbreaking:\n  use:\n    - FILE\nlint:\n  use:\n    - DEFAULT\n"
  },
  {
    "path": "_examples/12_validation/proto/federation/federation.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"google/protobuf/any.proto\";\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def [\n      { name: \"post\" message { name: \"Post\" } },\n      {\n        name: \"customHandler\"\n        message {\n          name: \"CustomHandlerMessage\",\n          args: {name: \"arg\", by: \"'some-arg'\"}\n        }\n      },\n      {\n        name: \"customMessage\"\n        message {\n          name: \"CustomMessage\",\n          args: {name: \"message\", by: \"'some-message'\"}\n        }\n      },\n      {\n        validation {\n          error {\n            code: FAILED_PRECONDITION\n            message: \"'validation1 failed!'\",\n            if: \"post.id != 'some-id'\"\n          }\n        }\n      },\n      {\n        validation {\n          error {\n            code: FAILED_PRECONDITION\n            message: \"'validation2 failed!'\",\n            if: \"post.id != 'some-id'\"\n          }\n        }\n      },\n      {\n        validation {\n          error: {\n            log_level: WARN\n            def [\n              { by: \"grpc.federation.log.add({'validation3_attrs': true})\" }\n            ]\n            code: FAILED_PRECONDITION,\n            message: \"'validation3 failed!'\",\n            if: \"$.id != 'correct-id'\"\n            details: {\n              by: \"CustomMessage{message: 'foo'}\"\n              message: [\n                {\n                  name: \"CustomMessage\",\n                  args: {\n                    name: \"message\",\n                    by: \"'message1'\"\n                  }\n                },\n                {\n                  name: \"CustomMessage\",\n                  args: {\n                    name: \"message\",\n                    by: \"'message2'\"\n                  }\n                }\n              ]\n              precondition_failure {\n                violations: [\n                  {\n                    type: \"'type1'\"\n                    subject: \"post.id\"\n                    description: \"'description1'\"\n                  }\n                ]\n              }\n              bad_request {\n                field_violations: [\n                  {\n                    field: \"post.id\"\n                    description: \"'description2'\"\n                  }\n                ]\n              }\n              localized_message {\n                locale: \"en-US\"\n                message: \"post.content\"\n              }\n            }\n          }\n        }\n      },\n      {\n        validation {\n          error {\n            def [\n              {\n                name: \"condition\",\n                by: \"post.id != 'some-id'\"\n              }\n            ]\n            code: FAILED_PRECONDITION\n            message: \"'validation4 failed!'\",\n            if: \"condition\"\n          }\n        }\n      },\n      {\n        name: \"customMessageValidation\"\n        validation : {error {code : INTERNAL message : \"'custom message is empty'\" if : \"customMessage.message == ''\"}}\n      },\n      {validation : {error {code : INTERNAL message : \"'item is null'\" if : \"post.item == null\"}}},\n      {validation : {error {code : INTERNAL message : \"'item id is zero'\" if : \"post.item.item_id == 0\"}}},\n      {validation : {error {code : INTERNAL message : \"'item name is empty'\" if : \"post.item.name == ''\"}}}\n    ]\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  string id = 1 [(grpc.federation.field).by = \"'some-id'\"];\n  string title = 2 [(grpc.federation.field).by = \"'some-title'\"];\n  string content = 3 [(grpc.federation.field).by = \"'some-content'\"];\n  Item item = 4 [(grpc.federation.field).by = \"Item{item_id: 2, name: 'item-name2'}\"];\n}\n\nmessage Item {\n  int32 item_id = 1 [(grpc.federation.field).by = \"1\"];\n  string name = 2 [(grpc.federation.field).by = \"'item-name'\"];\n}\n\nmessage CustomMessage {\n  string message = 1 [(grpc.federation.field).by = \"$.message\"];\n}\n\nmessage CustomHandlerMessage {\n  option (grpc.federation.message) = {\n    def {\n      validation {\n        error {\n          code: FAILED_PRECONDITION\n          if: \"$.arg == 'wrong'\"\n        }\n      }\n    }\n    custom_resolver: true\n  };\n}\n"
  },
  {
    "path": "_examples/13_map/.gitignore",
    "content": "grpc/federation\n"
  },
  {
    "path": "_examples/13_map/.vscode/settings.json",
    "content": "{\n    \"protoc\": {\n        \"options\": [\n            \"--proto_path=proto\",\n            \"--proto_path=proto_deps\"\n        ]\n    },\n    \"grpc-federation\": {\n        \"path\": \"../../bin/grpc-federation-language-server\",\n        \"import-paths\": [\n            \"proto\",\n            \"proto_deps\"\n        ]\n    }\n}\n"
  },
  {
    "path": "_examples/13_map/Makefile",
    "content": "MAKEFILE_DIR := $(dir $(lastword $(MAKEFILE_LIST)))\nGOBIN := $(MAKEFILE_DIR)/../../bin\nPATH := $(GOBIN):$(PATH)\n\nJAEGER_IMAGE := jaegertracing/all-in-one:latest\n\n.PHONY: generate\ngenerate:\n\t$(GOBIN)/buf generate\n\n.PHONY: lint\nlint:\n\t@$(GOBIN)/grpc-federation-linter -Iproto -Iproto_deps ./proto/federation/federation.proto\n\n.PHONY: test\ntest:\n\tgo test -race ./ -count=1\n\n.PHONY: grpc-federation/generate\ngrpc-federation/generate:\n\t@$(GOBIN)/grpc-federation-generator ./proto/federation/federation.proto\n\n.PHONY: grpc-federation/watch\ngrpc-federation/watch:\n\t@$(GOBIN)/grpc-federation-generator -w\n\n.PHONY: jaeger/start\njaeger/start:\n\t@docker run \\\n\t\t-e COLLECTOR_OTLP_ENABLED=true \\\n\t\t-p 16686:16686 \\\n\t\t-p 4317:4317 \\\n\t\t-p 4318:4318 \\\n\t\t-d \\\n\t\t$(JAEGER_IMAGE)\n\n.PHONY: jaeger/stop\njaeger/stop:\n\t@docker stop $(shell docker ps -q  --filter ancestor=$(JAEGER_IMAGE))\n"
  },
  {
    "path": "_examples/13_map/buf.gen.yaml",
    "content": "version: v1\nmanaged:\n  enabled: true\nplugins:\n  - plugin: go\n    out: .\n    opt: paths=source_relative\n  - plugin: go-grpc\n    out: .\n    opt: paths=source_relative\n  - plugin: grpc-federation\n    out: .\n    opt:\n    - paths=source_relative\n    - import_paths=proto\n"
  },
  {
    "path": "_examples/13_map/buf.work.yaml",
    "content": "version: v1\ndirectories:\n  - proto\n  - proto_deps\n"
  },
  {
    "path": "_examples/13_map/federation/federation.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\t_ \"google.golang.org/protobuf/types/known/anypb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Item_ItemType int32\n\nconst (\n\tItem_ITEM_TYPE_UNSPECIFIED Item_ItemType = 0\n\tItem_ITEM_TYPE_1           Item_ItemType = 1\n\tItem_ITEM_TYPE_2           Item_ItemType = 2\n\tItem_ITEM_TYPE_3           Item_ItemType = 3\n)\n\n// Enum value maps for Item_ItemType.\nvar (\n\tItem_ItemType_name = map[int32]string{\n\t\t0: \"ITEM_TYPE_UNSPECIFIED\",\n\t\t1: \"ITEM_TYPE_1\",\n\t\t2: \"ITEM_TYPE_2\",\n\t\t3: \"ITEM_TYPE_3\",\n\t}\n\tItem_ItemType_value = map[string]int32{\n\t\t\"ITEM_TYPE_UNSPECIFIED\": 0,\n\t\t\"ITEM_TYPE_1\":           1,\n\t\t\"ITEM_TYPE_2\":           2,\n\t\t\"ITEM_TYPE_3\":           3,\n\t}\n)\n\nfunc (x Item_ItemType) Enum() *Item_ItemType {\n\tp := new(Item_ItemType)\n\t*p = x\n\treturn p\n}\n\nfunc (x Item_ItemType) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (Item_ItemType) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_federation_federation_proto_enumTypes[0].Descriptor()\n}\n\nfunc (Item_ItemType) Type() protoreflect.EnumType {\n\treturn &file_federation_federation_proto_enumTypes[0]\n}\n\nfunc (x Item_ItemType) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use Item_ItemType.Descriptor instead.\nfunc (Item_ItemType) EnumDescriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{4, 0}\n}\n\ntype GetPostsRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tIds []string `protobuf:\"bytes,1,rep,name=ids,proto3\" json:\"ids,omitempty\"`\n}\n\nfunc (x *GetPostsRequest) Reset() {\n\t*x = GetPostsRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostsRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostsRequest) ProtoMessage() {}\n\nfunc (x *GetPostsRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostsRequest.ProtoReflect.Descriptor instead.\nfunc (*GetPostsRequest) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetPostsRequest) GetIds() []string {\n\tif x != nil {\n\t\treturn x.Ids\n\t}\n\treturn nil\n}\n\ntype GetPostsResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPosts *Posts `protobuf:\"bytes,1,opt,name=posts,proto3\" json:\"posts,omitempty\"`\n}\n\nfunc (x *GetPostsResponse) Reset() {\n\t*x = GetPostsResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostsResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostsResponse) ProtoMessage() {}\n\nfunc (x *GetPostsResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostsResponse.ProtoReflect.Descriptor instead.\nfunc (*GetPostsResponse) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetPostsResponse) GetPosts() *Posts {\n\tif x != nil {\n\t\treturn x.Posts\n\t}\n\treturn nil\n}\n\ntype Posts struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tIds               []string          `protobuf:\"bytes,1,rep,name=ids,proto3\" json:\"ids,omitempty\"`\n\tTitles            []string          `protobuf:\"bytes,2,rep,name=titles,proto3\" json:\"titles,omitempty\"`\n\tContents          []string          `protobuf:\"bytes,3,rep,name=contents,proto3\" json:\"contents,omitempty\"`\n\tUsers             []*User           `protobuf:\"bytes,4,rep,name=users,proto3\" json:\"users,omitempty\"`\n\tItems             []*Posts_PostItem `protobuf:\"bytes,5,rep,name=items,proto3\" json:\"items,omitempty\"`\n\tItemTypes         []Item_ItemType   `protobuf:\"varint,6,rep,packed,name=item_types,json=itemTypes,proto3,enum=org.federation.Item_ItemType\" json:\"item_types,omitempty\"`\n\tSelectedItemTypes []Item_ItemType   `protobuf:\"varint,7,rep,packed,name=selected_item_types,json=selectedItemTypes,proto3,enum=org.federation.Item_ItemType\" json:\"selected_item_types,omitempty\"`\n}\n\nfunc (x *Posts) Reset() {\n\t*x = Posts{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Posts) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Posts) ProtoMessage() {}\n\nfunc (x *Posts) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Posts.ProtoReflect.Descriptor instead.\nfunc (*Posts) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *Posts) GetIds() []string {\n\tif x != nil {\n\t\treturn x.Ids\n\t}\n\treturn nil\n}\n\nfunc (x *Posts) GetTitles() []string {\n\tif x != nil {\n\t\treturn x.Titles\n\t}\n\treturn nil\n}\n\nfunc (x *Posts) GetContents() []string {\n\tif x != nil {\n\t\treturn x.Contents\n\t}\n\treturn nil\n}\n\nfunc (x *Posts) GetUsers() []*User {\n\tif x != nil {\n\t\treturn x.Users\n\t}\n\treturn nil\n}\n\nfunc (x *Posts) GetItems() []*Posts_PostItem {\n\tif x != nil {\n\t\treturn x.Items\n\t}\n\treturn nil\n}\n\nfunc (x *Posts) GetItemTypes() []Item_ItemType {\n\tif x != nil {\n\t\treturn x.ItemTypes\n\t}\n\treturn nil\n}\n\nfunc (x *Posts) GetSelectedItemTypes() []Item_ItemType {\n\tif x != nil {\n\t\treturn x.SelectedItemTypes\n\t}\n\treturn nil\n}\n\ntype User struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId   string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *User) Reset() {\n\t*x = User{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *User) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*User) ProtoMessage() {}\n\nfunc (x *User) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use User.ProtoReflect.Descriptor instead.\nfunc (*User) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *User) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *User) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\ntype Item struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *Item) Reset() {\n\t*x = Item{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Item) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Item) ProtoMessage() {}\n\nfunc (x *Item) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Item.ProtoReflect.Descriptor instead.\nfunc (*Item) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{4}\n}\n\ntype Posts_PostItem struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *Posts_PostItem) Reset() {\n\t*x = Posts_PostItem{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Posts_PostItem) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Posts_PostItem) ProtoMessage() {}\n\nfunc (x *Posts_PostItem) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Posts_PostItem.ProtoReflect.Descriptor instead.\nfunc (*Posts_PostItem) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{2, 0}\n}\n\nfunc (x *Posts_PostItem) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nvar File_federation_federation_proto protoreflect.FileDescriptor\n\nvar file_federation_federation_proto_rawDesc = []byte{\n\t0x0a, 0x1b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x6f,\n\t0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x19, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61,\n\t0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x23, 0x0a, 0x0f, 0x47, 0x65,\n\t0x74, 0x50, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a,\n\t0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22,\n\t0x75, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f,\n\t0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x05, 0x70, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x73, 0x42, 0x0a, 0x9a, 0x4a, 0x07, 0x12, 0x05,\n\t0x70, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x05, 0x70, 0x6f, 0x73, 0x74, 0x73, 0x3a, 0x28, 0x9a, 0x4a,\n\t0x25, 0x0a, 0x23, 0x0a, 0x05, 0x70, 0x6f, 0x73, 0x74, 0x73, 0x6a, 0x1a, 0x0a, 0x05, 0x50, 0x6f,\n\t0x73, 0x74, 0x73, 0x12, 0x11, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x12,\n\t0x05, 0x24, 0x2e, 0x69, 0x64, 0x73, 0x22, 0xb7, 0x08, 0x0a, 0x05, 0x50, 0x6f, 0x73, 0x74, 0x73,\n\t0x12, 0x1a, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x08, 0x9a,\n\t0x4a, 0x05, 0x12, 0x03, 0x69, 0x64, 0x73, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x38, 0x0a, 0x06,\n\t0x74, 0x69, 0x74, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x20, 0x9a, 0x4a,\n\t0x1d, 0x12, 0x1b, 0x70, 0x6f, 0x73, 0x74, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x70, 0x6f, 0x73,\n\t0x74, 0x2c, 0x20, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x29, 0x52, 0x06,\n\t0x74, 0x69, 0x74, 0x6c, 0x65, 0x73, 0x12, 0x3e, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x42, 0x22, 0x9a, 0x4a, 0x1f, 0x12, 0x1d, 0x70,\n\t0x6f, 0x73, 0x74, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x70, 0x6f, 0x73, 0x74, 0x2c, 0x20, 0x70,\n\t0x6f, 0x73, 0x74, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x29, 0x52, 0x08, 0x63, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x36, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18,\n\t0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x42, 0x0a, 0x9a, 0x4a, 0x07,\n\t0x12, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x12, 0x40,\n\t0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e,\n\t0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50,\n\t0x6f, 0x73, 0x74, 0x73, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x42, 0x0a, 0x9a,\n\t0x4a, 0x07, 0x12, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73,\n\t0x12, 0x4d, 0x0a, 0x0a, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x06,\n\t0x20, 0x03, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x54,\n\t0x79, 0x70, 0x65, 0x42, 0x0f, 0x9a, 0x4a, 0x0c, 0x12, 0x0a, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x74,\n\t0x79, 0x70, 0x65, 0x73, 0x52, 0x09, 0x69, 0x74, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12,\n\t0x67, 0x0a, 0x13, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x69, 0x74, 0x65, 0x6d,\n\t0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x6f,\n\t0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x74,\n\t0x65, 0x6d, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x42, 0x18, 0x9a, 0x4a, 0x15,\n\t0x12, 0x13, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x5f,\n\t0x74, 0x79, 0x70, 0x65, 0x73, 0x52, 0x11, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x49,\n\t0x74, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x73, 0x1a, 0x33, 0x0a, 0x08, 0x50, 0x6f, 0x73, 0x74,\n\t0x49, 0x74, 0x65, 0x6d, 0x12, 0x27, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x42, 0x13, 0x9a, 0x4a, 0x10, 0x12, 0x0e, 0x27, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x27,\n\t0x20, 0x2b, 0x20, 0x24, 0x2e, 0x69, 0x64, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0xb0, 0x04,\n\t0x9a, 0x4a, 0xac, 0x04, 0x0a, 0x35, 0x0a, 0x03, 0x72, 0x65, 0x73, 0x72, 0x2e, 0x0a, 0x19, 0x70,\n\t0x6f, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f,\n\t0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x11, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x12,\n\t0x0a, 0x24, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x0a, 0x12, 0x0a, 0x05, 0x70,\n\t0x6f, 0x73, 0x74, 0x73, 0x5a, 0x09, 0x72, 0x65, 0x73, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x73, 0x0a,\n\t0x1f, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x62, 0x18, 0x0a, 0x0d, 0x0a, 0x04, 0x70, 0x6f, 0x73, 0x74,\n\t0x12, 0x05, 0x70, 0x6f, 0x73, 0x74, 0x73, 0x5a, 0x07, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x69, 0x64,\n\t0x0a, 0x39, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x62, 0x30, 0x0a, 0x0d, 0x0a, 0x04, 0x69,\n\t0x74, 0x65, 0x72, 0x12, 0x05, 0x70, 0x6f, 0x73, 0x74, 0x73, 0x62, 0x1f, 0x0a, 0x04, 0x55, 0x73,\n\t0x65, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x12, 0x0c, 0x69,\n\t0x74, 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x0a, 0x39, 0x0a, 0x05, 0x69,\n\t0x74, 0x65, 0x6d, 0x73, 0x62, 0x30, 0x0a, 0x0d, 0x0a, 0x04, 0x69, 0x74, 0x65, 0x72, 0x12, 0x05,\n\t0x70, 0x6f, 0x73, 0x74, 0x73, 0x62, 0x1f, 0x0a, 0x0e, 0x50, 0x6f, 0x73, 0x74, 0x73, 0x2e, 0x50,\n\t0x6f, 0x73, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x0d, 0x0a, 0x02, 0x69, 0x64, 0x12, 0x07, 0x69,\n\t0x74, 0x65, 0x72, 0x2e, 0x69, 0x64, 0x0a, 0x67, 0x0a, 0x11, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,\n\t0x5f, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x5a, 0x52, 0x5b, 0x75, 0x73,\n\t0x65, 0x72, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65,\n\t0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x27, 0x49, 0x54, 0x45, 0x4d, 0x5f, 0x54, 0x59, 0x50,\n\t0x45, 0x5f, 0x31, 0x27, 0x29, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x49, 0x74, 0x65, 0x6d,\n\t0x2e, 0x49, 0x74, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28,\n\t0x27, 0x49, 0x54, 0x45, 0x4d, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x32, 0x27, 0x29, 0x5d, 0x0a,\n\t0x3e, 0x0a, 0x0a, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x62, 0x30, 0x0a,\n\t0x18, 0x0a, 0x03, 0x74, 0x79, 0x70, 0x12, 0x11, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69,\n\t0x74, 0x65, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x6a, 0x14, 0x0a, 0x0d, 0x49, 0x74, 0x65,\n\t0x6d, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x03, 0x74, 0x79, 0x70, 0x0a,\n\t0x9e, 0x01, 0x0a, 0x13, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x69, 0x74, 0x65,\n\t0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x62, 0x86, 0x01, 0x0a, 0x18, 0x0a, 0x03, 0x74, 0x79,\n\t0x70, 0x12, 0x11, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x74,\n\t0x79, 0x70, 0x65, 0x73, 0x6a, 0x6a, 0x0a, 0x0d, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x49, 0x74, 0x65,\n\t0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x59, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x2e, 0x73, 0x65, 0x6c, 0x65,\n\t0x63, 0x74, 0x28, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x2c, 0x20, 0x75, 0x73,\n\t0x65, 0x72, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65,\n\t0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x27, 0x49, 0x54, 0x45, 0x4d, 0x5f, 0x54, 0x59, 0x50,\n\t0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x27, 0x29, 0x29,\n\t0x22, 0x77, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x4b, 0x9a, 0x4a,\n\t0x48, 0x0a, 0x32, 0x0a, 0x03, 0x72, 0x65, 0x73, 0x72, 0x2b, 0x0a, 0x18, 0x75, 0x73, 0x65, 0x72,\n\t0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x47, 0x65, 0x74,\n\t0x55, 0x73, 0x65, 0x72, 0x12, 0x0f, 0x0a, 0x02, 0x69, 0x64, 0x12, 0x09, 0x24, 0x2e, 0x75, 0x73,\n\t0x65, 0x72, 0x5f, 0x69, 0x64, 0x0a, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x5a,\n\t0x08, 0x72, 0x65, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x22, 0x89, 0x01, 0x0a, 0x04, 0x49, 0x74,\n\t0x65, 0x6d, 0x22, 0x71, 0x0a, 0x08, 0x49, 0x74, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x19,\n\t0x0a, 0x15, 0x49, 0x54, 0x45, 0x4d, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50,\n\t0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x54, 0x45,\n\t0x4d, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x31, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x54,\n\t0x45, 0x4d, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x32, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x49,\n\t0x54, 0x45, 0x4d, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x33, 0x10, 0x03, 0x1a, 0x17, 0x9a, 0x4a,\n\t0x14, 0x0a, 0x12, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x49, 0x74, 0x65,\n\t0x6d, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x0e, 0x9a, 0x4a, 0x0b, 0x1a, 0x09, 0x75, 0x73, 0x65, 0x72,\n\t0x2e, 0x49, 0x74, 0x65, 0x6d, 0x32, 0x69, 0x0a, 0x11, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4f, 0x0a, 0x08, 0x47, 0x65,\n\t0x74, 0x50, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x1f, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x73,\n\t0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74,\n\t0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x1a, 0x03, 0x9a, 0x4a, 0x00,\n\t0x42, 0xc2, 0x01, 0x9a, 0x4a, 0x22, 0x12, 0x0f, 0x70, 0x6f, 0x73, 0x74, 0x2f, 0x70, 0x6f, 0x73,\n\t0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x75, 0x73,\n\t0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x72,\n\t0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0f, 0x46, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a,\n\t0x1d, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x3b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xa2, 0x02,\n\t0x03, 0x4f, 0x46, 0x58, 0xaa, 0x02, 0x0e, 0x4f, 0x72, 0x67, 0x2e, 0x46, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0xca, 0x02, 0x0e, 0x4f, 0x72, 0x67, 0x5c, 0x46, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xe2, 0x02, 0x1a, 0x4f, 0x72, 0x67, 0x5c, 0x46, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64,\n\t0x61, 0x74, 0x61, 0xea, 0x02, 0x0f, 0x4f, 0x72, 0x67, 0x3a, 0x3a, 0x46, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_federation_federation_proto_rawDescOnce sync.Once\n\tfile_federation_federation_proto_rawDescData = file_federation_federation_proto_rawDesc\n)\n\nfunc file_federation_federation_proto_rawDescGZIP() []byte {\n\tfile_federation_federation_proto_rawDescOnce.Do(func() {\n\t\tfile_federation_federation_proto_rawDescData = protoimpl.X.CompressGZIP(file_federation_federation_proto_rawDescData)\n\t})\n\treturn file_federation_federation_proto_rawDescData\n}\n\nvar file_federation_federation_proto_enumTypes = make([]protoimpl.EnumInfo, 1)\nvar file_federation_federation_proto_msgTypes = make([]protoimpl.MessageInfo, 6)\nvar file_federation_federation_proto_goTypes = []interface{}{\n\t(Item_ItemType)(0),       // 0: org.federation.Item.ItemType\n\t(*GetPostsRequest)(nil),  // 1: org.federation.GetPostsRequest\n\t(*GetPostsResponse)(nil), // 2: org.federation.GetPostsResponse\n\t(*Posts)(nil),            // 3: org.federation.Posts\n\t(*User)(nil),             // 4: org.federation.User\n\t(*Item)(nil),             // 5: org.federation.Item\n\t(*Posts_PostItem)(nil),   // 6: org.federation.Posts.PostItem\n}\nvar file_federation_federation_proto_depIdxs = []int32{\n\t3, // 0: org.federation.GetPostsResponse.posts:type_name -> org.federation.Posts\n\t4, // 1: org.federation.Posts.users:type_name -> org.federation.User\n\t6, // 2: org.federation.Posts.items:type_name -> org.federation.Posts.PostItem\n\t0, // 3: org.federation.Posts.item_types:type_name -> org.federation.Item.ItemType\n\t0, // 4: org.federation.Posts.selected_item_types:type_name -> org.federation.Item.ItemType\n\t1, // 5: org.federation.FederationService.GetPosts:input_type -> org.federation.GetPostsRequest\n\t2, // 6: org.federation.FederationService.GetPosts:output_type -> org.federation.GetPostsResponse\n\t6, // [6:7] is the sub-list for method output_type\n\t5, // [5:6] is the sub-list for method input_type\n\t5, // [5:5] is the sub-list for extension type_name\n\t5, // [5:5] is the sub-list for extension extendee\n\t0, // [0:5] is the sub-list for field type_name\n}\n\nfunc init() { file_federation_federation_proto_init() }\nfunc file_federation_federation_proto_init() {\n\tif File_federation_federation_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_federation_federation_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostsRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostsResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Posts); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*User); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Item); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Posts_PostItem); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_federation_federation_proto_rawDesc,\n\t\t\tNumEnums:      1,\n\t\t\tNumMessages:   6,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_federation_federation_proto_goTypes,\n\t\tDependencyIndexes: file_federation_federation_proto_depIdxs,\n\t\tEnumInfos:         file_federation_federation_proto_enumTypes,\n\t\tMessageInfos:      file_federation_federation_proto_msgTypes,\n\t}.Build()\n\tFile_federation_federation_proto = out.File\n\tfile_federation_federation_proto_rawDesc = nil\n\tfile_federation_federation_proto_goTypes = nil\n\tfile_federation_federation_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/13_map/federation/federation_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tFederationService_GetPosts_FullMethodName = \"/org.federation.FederationService/GetPosts\"\n)\n\n// FederationServiceClient is the client API for FederationService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype FederationServiceClient interface {\n\tGetPosts(ctx context.Context, in *GetPostsRequest, opts ...grpc.CallOption) (*GetPostsResponse, error)\n}\n\ntype federationServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewFederationServiceClient(cc grpc.ClientConnInterface) FederationServiceClient {\n\treturn &federationServiceClient{cc}\n}\n\nfunc (c *federationServiceClient) GetPosts(ctx context.Context, in *GetPostsRequest, opts ...grpc.CallOption) (*GetPostsResponse, error) {\n\tout := new(GetPostsResponse)\n\terr := c.cc.Invoke(ctx, FederationService_GetPosts_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// FederationServiceServer is the server API for FederationService service.\n// All implementations must embed UnimplementedFederationServiceServer\n// for forward compatibility\ntype FederationServiceServer interface {\n\tGetPosts(context.Context, *GetPostsRequest) (*GetPostsResponse, error)\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\n// UnimplementedFederationServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedFederationServiceServer struct {\n}\n\nfunc (UnimplementedFederationServiceServer) GetPosts(context.Context, *GetPostsRequest) (*GetPostsResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetPosts not implemented\")\n}\nfunc (UnimplementedFederationServiceServer) mustEmbedUnimplementedFederationServiceServer() {}\n\n// UnsafeFederationServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to FederationServiceServer will\n// result in compilation errors.\ntype UnsafeFederationServiceServer interface {\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\nfunc RegisterFederationServiceServer(s grpc.ServiceRegistrar, srv FederationServiceServer) {\n\ts.RegisterService(&FederationService_ServiceDesc, srv)\n}\n\nfunc _FederationService_GetPosts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetPostsRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(FederationServiceServer).GetPosts(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: FederationService_GetPosts_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(FederationServiceServer).GetPosts(ctx, req.(*GetPostsRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// FederationService_ServiceDesc is the grpc.ServiceDesc for FederationService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar FederationService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"org.federation.FederationService\",\n\tHandlerType: (*FederationServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetPosts\",\n\t\t\tHandler:    _FederationService_GetPosts_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"federation/federation.proto\",\n}\n"
  },
  {
    "path": "_examples/13_map/federation/federation_grpc_federation.pb.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: federation/federation.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n\n\tpost \"example/post\"\n\tuser \"example/user\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Org_Federation_GetPostsResponseVariable represents variable definitions in \"org.federation.GetPostsResponse\".\ntype FederationService_Org_Federation_GetPostsResponseVariable struct {\n\tPosts *Posts\n}\n\n// Org_Federation_GetPostsResponseArgument is argument for \"org.federation.GetPostsResponse\" message.\ntype FederationService_Org_Federation_GetPostsResponseArgument struct {\n\tIds []string\n\tFederationService_Org_Federation_GetPostsResponseVariable\n}\n\n// Org_Federation_PostsVariable represents variable definitions in \"org.federation.Posts\".\ntype FederationService_Org_Federation_PostsVariable struct {\n\tIds               []string\n\tItemTypes         []Item_ItemType\n\tItems             []*Posts_PostItem\n\tPosts             []*post.Post\n\tRes               *post.GetPostsResponse\n\tSelectedItemTypes []Item_ItemType\n\tSourceItemTypes   []user.Item_ItemType\n\tUsers             []*User\n}\n\n// Org_Federation_PostsArgument is argument for \"org.federation.Posts\" message.\ntype FederationService_Org_Federation_PostsArgument struct {\n\tPostIds []string\n\tFederationService_Org_Federation_PostsVariable\n}\n\n// Org_Federation_Posts_PostItemVariable represents variable definitions in \"org.federation.PostItem\".\ntype FederationService_Org_Federation_Posts_PostItemVariable struct {\n}\n\n// Org_Federation_Posts_PostItemArgument is argument for \"org.federation.PostItem\" message.\ntype FederationService_Org_Federation_Posts_PostItemArgument struct {\n\tId string\n\tFederationService_Org_Federation_Posts_PostItemVariable\n}\n\n// Org_Federation_UserVariable represents variable definitions in \"org.federation.User\".\ntype FederationService_Org_Federation_UserVariable struct {\n\tRes  *user.GetUserResponse\n\tUser *user.User\n}\n\n// Org_Federation_UserArgument is argument for \"org.federation.User\" message.\ntype FederationService_Org_Federation_UserArgument struct {\n\tUserId string\n\tFederationService_Org_Federation_UserVariable\n}\n\n// FederationServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationServiceConfig struct {\n\t// Client provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\n\t// If this interface is not provided, an error is returned during initialization.\n\tClient FederationServiceClientFactory // required\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationServiceClientFactory interface {\n\t// Post_PostServiceClient create a gRPC Client to be used to call methods in post.PostService.\n\tPost_PostServiceClient(FederationServiceClientConfig) (post.PostServiceClient, error)\n\t// User_UserServiceClient create a gRPC Client to be used to call methods in user.UserService.\n\tUser_UserServiceClient(FederationServiceClientConfig) (user.UserServiceClient, error)\n}\n\n// FederationServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationServiceDependentClientSet struct {\n\tPost_PostServiceClient post.PostServiceClient\n\tUser_UserServiceClient user.UserServiceClient\n}\n\n// FederationServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationServiceResolver interface {\n}\n\n// FederationServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// FederationServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationServiceUnimplementedResolver struct{}\n\nconst (\n\tFederationService_DependentMethod_Post_PostService_GetPosts = \"/post.PostService/GetPosts\"\n\tFederationService_DependentMethod_User_UserService_GetUser  = \"/user.UserService/GetUser\"\n)\n\n// FederationService represents Federation Service.\ntype FederationService struct {\n\tUnimplementedFederationServiceServer\n\tcfg             FederationServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationServiceDependentClientSet\n}\n\n// NewFederationService creates FederationService instance by FederationServiceConfig.\nfunc NewFederationService(cfg FederationServiceConfig) (*FederationService, error) {\n\tif cfg.Client == nil {\n\t\treturn nil, grpcfed.ErrClientConfig\n\t}\n\tPost_PostServiceClient, err := cfg.Client.Post_PostServiceClient(FederationServiceClientConfig{\n\t\tService: \"post.PostService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tUser_UserServiceClient, err := cfg.Client.User_UserServiceClient(FederationServiceClientConfig{\n\t\tService: \"user.UserService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"org.federation.FederationService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.org.federation.GetPostsResponseArgument\": {\n\t\t\t\"ids\": grpcfed.NewCELFieldType(grpcfed.NewCELListType(grpcfed.CELStringType), \"Ids\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.PostsArgument\": {\n\t\t\t\"post_ids\": grpcfed.NewCELFieldType(grpcfed.NewCELListType(grpcfed.CELStringType), \"PostIds\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.Posts_PostItemArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.UserArgument\": {\n\t\t\t\"user_id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"UserId\"),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"org.federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.GRPCErrorAccessorOptions(celTypeHelper, \"post.GetPostsResponse\")...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.GRPCErrorAccessorOptions(celTypeHelper, \"user.GetUserResponse\")...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.federation.Item.ItemType\", Item_ItemType_value, Item_ItemType_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"user.Item.ItemType\", user.Item_ItemType_value, user.Item_ItemType_name)...)\n\tsvc := &FederationService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tclient: &FederationServiceDependentClientSet{\n\t\t\tPost_PostServiceClient: Post_PostServiceClient,\n\t\t\tUser_UserServiceClient: User_UserServiceClient,\n\t\t},\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationService(ctx context.Context, svc *FederationService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n// GetPosts implements \"org.federation.FederationService/GetPosts\" method.\nfunc (s *FederationService) GetPosts(ctx context.Context, req *GetPostsRequest) (res *GetPostsResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.FederationService/GetPosts\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Org_Federation_GetPostsResponse(ctx, &FederationService_Org_Federation_GetPostsResponseArgument{\n\t\tIds: req.GetIds(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Org_Federation_GetPostsResponse resolve \"org.federation.GetPostsResponse\" message.\nfunc (s *FederationService) resolve_Org_Federation_GetPostsResponse(ctx context.Context, req *FederationService_Org_Federation_GetPostsResponseArgument) (*GetPostsResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.GetPostsResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.GetPostsResponse\", slog.Any(\"message_args\", s.logvalue_Org_Federation_GetPostsResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tPosts *Posts\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.GetPostsResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"posts\"\n\t\t  message {\n\t\t    name: \"Posts\"\n\t\t    args { name: \"post_ids\", by: \"$.ids\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_posts := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Posts, *localValueType]{\n\t\t\tName: `posts`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.Posts\"),\n\t\t\tSetter: func(value *localValueType, v *Posts) error {\n\t\t\t\tvalue.vars.Posts = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_PostsArgument{}\n\t\t\t\t// { name: \"post_ids\", by: \"$.ids\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.ids`,\n\t\t\t\t\tCacheIndex: 1,\n\t\t\t\t\tSetter: func(v []string) error {\n\t\t\t\t\t\targs.PostIds = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_Posts(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_posts(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_GetPostsResponseVariable.Posts = value.vars.Posts\n\n\t// create a message value to be returned.\n\tret := &GetPostsResponse{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"posts\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*Posts]{\n\t\tValue:      value,\n\t\tExpr:       `posts`,\n\t\tCacheIndex: 2,\n\t\tSetter: func(v *Posts) error {\n\t\t\tret.Posts = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.GetPostsResponse\", slog.Any(\"org.federation.GetPostsResponse\", s.logvalue_Org_Federation_GetPostsResponse(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_Posts resolve \"org.federation.Posts\" message.\nfunc (s *FederationService) resolve_Org_Federation_Posts(ctx context.Context, req *FederationService_Org_Federation_PostsArgument) (*Posts, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.Posts\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.Posts\", slog.Any(\"message_args\", s.logvalue_Org_Federation_PostsArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tIds               []string\n\t\t\tItemTypes         []Item_ItemType\n\t\t\tItems             []*Posts_PostItem\n\t\t\tPosts             []*post.Post\n\t\t\tRes               *post.GetPostsResponse\n\t\t\tSelectedItemTypes []Item_ItemType\n\t\t\tSourceItemTypes   []user.Item_ItemType\n\t\t\tUsers             []*User\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.PostsArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"post.PostService/GetPosts\"\n\t\t    request { field: \"ids\", by: \"$.post_ids\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.GetPostsResponse, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"post.GetPostsResponse\"),\n\t\t\tSetter: func(value *localValueType, v *post.GetPostsResponse) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &post.GetPostsRequest{}\n\t\t\t\t// { field: \"ids\", by: \"$.post_ids\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.post_ids`,\n\t\t\t\t\tCacheIndex: 3,\n\t\t\t\t\tSetter: func(v []string) error {\n\t\t\t\t\t\targs.Ids = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call post.PostService/GetPosts\", slog.Any(\"post.GetPostsRequest\", s.logvalue_Post_GetPostsRequest(args)))\n\t\t\t\tret, err := s.client.Post_PostServiceClient.GetPosts(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Post_PostService_GetPosts, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"posts\"\n\t\t  by: \"res.posts\"\n\t\t}\n\t*/\n\tdef_posts := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[[]*post.Post, *localValueType]{\n\t\t\tName: `posts`,\n\t\t\tType: grpcfed.CELListType(grpcfed.CELObjectType(\"post.Post\")),\n\t\t\tSetter: func(value *localValueType, v []*post.Post) error {\n\t\t\t\tvalue.vars.Posts = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `res.posts`,\n\t\t\tByCacheIndex: 4,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"ids\"\n\t\t  map {\n\t\t    iterator {\n\t\t      name: \"post\"\n\t\t      src: \"posts\"\n\t\t    }\n\t\t    by: \"post.id\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_ids := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDefMap(ctx, value, grpcfed.DefMap[[]string, *post.Post, *localValueType]{\n\t\t\tName: `ids`,\n\t\t\tType: grpcfed.CELListType(grpcfed.CELStringType),\n\t\t\tSetter: func(value *localValueType, v []string) error {\n\t\t\t\tvalue.vars.Ids = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tIteratorName:   `post`,\n\t\t\tIteratorType:   grpcfed.CELObjectType(\"post.Post\"),\n\t\t\tIteratorSource: func(value *localValueType) []*post.Post { return value.vars.Posts },\n\t\t\tIterator: func(ctx context.Context, value *grpcfed.MapIteratorValue) (any, error) {\n\t\t\t\treturn grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `post.id`,\n\t\t\t\t\tOutType:    reflect.TypeOf(\"\"),\n\t\t\t\t\tCacheIndex: 5,\n\t\t\t\t})\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"users\"\n\t\t  map {\n\t\t    iterator {\n\t\t      name: \"iter\"\n\t\t      src: \"posts\"\n\t\t    }\n\t\t    message {\n\t\t      name: \"User\"\n\t\t      args { name: \"user_id\", by: \"iter.user_id\" }\n\t\t    }\n\t\t  }\n\t\t}\n\t*/\n\tdef_users := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDefMap(ctx, value, grpcfed.DefMap[[]*User, *post.Post, *localValueType]{\n\t\t\tName: `users`,\n\t\t\tType: grpcfed.CELListType(grpcfed.CELObjectType(\"org.federation.User\")),\n\t\t\tSetter: func(value *localValueType, v []*User) error {\n\t\t\t\tvalue.vars.Users = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tIteratorName:   `iter`,\n\t\t\tIteratorType:   grpcfed.CELObjectType(\"post.Post\"),\n\t\t\tIteratorSource: func(value *localValueType) []*post.Post { return value.vars.Posts },\n\t\t\tIterator: func(ctx context.Context, value *grpcfed.MapIteratorValue) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_UserArgument{}\n\t\t\t\t// { name: \"user_id\", by: \"iter.user_id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `iter.user_id`,\n\t\t\t\t\tCacheIndex: 6,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.UserId = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn s.resolve_Org_Federation_User(ctx, args)\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"items\"\n\t\t  map {\n\t\t    iterator {\n\t\t      name: \"iter\"\n\t\t      src: \"posts\"\n\t\t    }\n\t\t    message {\n\t\t      name: \"PostItem\"\n\t\t      args { name: \"id\", by: \"iter.id\" }\n\t\t    }\n\t\t  }\n\t\t}\n\t*/\n\tdef_items := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDefMap(ctx, value, grpcfed.DefMap[[]*Posts_PostItem, *post.Post, *localValueType]{\n\t\t\tName: `items`,\n\t\t\tType: grpcfed.CELListType(grpcfed.CELObjectType(\"org.federation.Posts.PostItem\")),\n\t\t\tSetter: func(value *localValueType, v []*Posts_PostItem) error {\n\t\t\t\tvalue.vars.Items = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tIteratorName:   `iter`,\n\t\t\tIteratorType:   grpcfed.CELObjectType(\"post.Post\"),\n\t\t\tIteratorSource: func(value *localValueType) []*post.Post { return value.vars.Posts },\n\t\t\tIterator: func(ctx context.Context, value *grpcfed.MapIteratorValue) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_Posts_PostItemArgument{}\n\t\t\t\t// { name: \"id\", by: \"iter.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `iter.id`,\n\t\t\t\t\tCacheIndex: 7,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn s.resolve_Org_Federation_Posts_PostItem(ctx, args)\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"source_item_types\"\n\t\t  by: \"[user.Item.ItemType.value('ITEM_TYPE_1'), user.Item.ItemType.value('ITEM_TYPE_2')]\"\n\t\t}\n\t*/\n\tdef_source_item_types := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[[]user.Item_ItemType, *localValueType]{\n\t\t\tName: `source_item_types`,\n\t\t\tType: grpcfed.CELListType(grpcfed.CELIntType),\n\t\t\tSetter: func(value *localValueType, v []user.Item_ItemType) error {\n\t\t\t\tvalue.vars.SourceItemTypes = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `[user.Item.ItemType.value('ITEM_TYPE_1'), user.Item.ItemType.value('ITEM_TYPE_2')]`,\n\t\t\tByCacheIndex: 8,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"item_types\"\n\t\t  map {\n\t\t    iterator {\n\t\t      name: \"typ\"\n\t\t      src: \"source_item_types\"\n\t\t    }\n\t\t  }\n\t\t}\n\t*/\n\tdef_item_types := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDefMap(ctx, value, grpcfed.DefMap[[]Item_ItemType, user.Item_ItemType, *localValueType]{\n\t\t\tName: `item_types`,\n\t\t\tType: grpcfed.CELListType(grpcfed.CELIntType),\n\t\t\tSetter: func(value *localValueType, v []Item_ItemType) error {\n\t\t\t\tvalue.vars.ItemTypes = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tIteratorName:   `typ`,\n\t\t\tIteratorType:   grpcfed.CELIntType,\n\t\t\tIteratorSource: func(value *localValueType) []user.Item_ItemType { return value.vars.SourceItemTypes },\n\t\t\tIterator: func(ctx context.Context, value *grpcfed.MapIteratorValue) (any, error) {\n\t\t\t\tsrc, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `typ`,\n\t\t\t\t\tOutType:    reflect.TypeOf(user.Item_ItemType(0)),\n\t\t\t\t\tCacheIndex: 9,\n\t\t\t\t})\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn 0, err\n\t\t\t\t}\n\t\t\t\tv := src.(user.Item_ItemType)\n\t\t\t\treturn s.cast_User_Item_ItemType__to__Org_Federation_Item_ItemType(v)\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"selected_item_types\"\n\t\t  map {\n\t\t    iterator {\n\t\t      name: \"typ\"\n\t\t      src: \"source_item_types\"\n\t\t    }\n\t\t  }\n\t\t}\n\t*/\n\tdef_selected_item_types := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDefMap(ctx, value, grpcfed.DefMap[[]Item_ItemType, user.Item_ItemType, *localValueType]{\n\t\t\tName: `selected_item_types`,\n\t\t\tType: grpcfed.CELListType(grpcfed.CELIntType),\n\t\t\tSetter: func(value *localValueType, v []Item_ItemType) error {\n\t\t\t\tvalue.vars.SelectedItemTypes = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tIteratorName:   `typ`,\n\t\t\tIteratorType:   grpcfed.CELIntType,\n\t\t\tIteratorSource: func(value *localValueType) []user.Item_ItemType { return value.vars.SourceItemTypes },\n\t\t\tIterator: func(ctx context.Context, value *grpcfed.MapIteratorValue) (any, error) {\n\t\t\t\tsrc, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `grpc.federation.enum.select(true, typ, user.Item.ItemType.value('ITEM_TYPE_UNSPECIFIED'))`,\n\t\t\t\t\tOutType:    reflect.TypeOf((*grpcfedcel.EnumSelector)(nil)),\n\t\t\t\t\tCacheIndex: 10,\n\t\t\t\t})\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn 0, err\n\t\t\t\t}\n\t\t\t\tv := src.(*grpcfedcel.EnumSelector)\n\t\t\t\tvar dst Item_ItemType\n\t\t\t\tif err := func() error {\n\t\t\t\t\tif v.GetCond() {\n\t\t\t\t\t\tcasted, err := s.cast_User_Item_ItemType__to__Org_Federation_Item_ItemType(user.Item_ItemType(v.GetTrueValue()))\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdst = casted\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcasted, err := s.cast_User_Item_ItemType__to__Org_Federation_Item_ItemType(user.Item_ItemType(v.GetFalseValue()))\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdst = casted\n\t\t\t\t\t}\n\t\t\t\t\treturn nil\n\t\t\t\t}(); err != nil {\n\t\t\t\t\treturn 0, err\n\t\t\t\t}\n\t\t\t\treturn dst, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t   res ─┐\n\t                    posts ─┐\n\t                                           ids ─┐\n\t        source_item_types ─┐                    │\n\t                                    item_types ─┤\n\t   res ─┐                                       │\n\t                    posts ─┐                    │\n\t                                         items ─┤\n\t        source_item_types ─┐                    │\n\t                           selected_item_types ─┤\n\t   res ─┐                                       │\n\t                    posts ─┐                    │\n\t                                         users ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_posts(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_ids(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_source_item_types(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_item_types(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_posts(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_items(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_source_item_types(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_selected_item_types(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_posts(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_users(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_PostsVariable.Ids = value.vars.Ids\n\treq.FederationService_Org_Federation_PostsVariable.ItemTypes = value.vars.ItemTypes\n\treq.FederationService_Org_Federation_PostsVariable.Items = value.vars.Items\n\treq.FederationService_Org_Federation_PostsVariable.Posts = value.vars.Posts\n\treq.FederationService_Org_Federation_PostsVariable.Res = value.vars.Res\n\treq.FederationService_Org_Federation_PostsVariable.SelectedItemTypes = value.vars.SelectedItemTypes\n\treq.FederationService_Org_Federation_PostsVariable.SourceItemTypes = value.vars.SourceItemTypes\n\treq.FederationService_Org_Federation_PostsVariable.Users = value.vars.Users\n\n\t// create a message value to be returned.\n\tret := &Posts{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"ids\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]string]{\n\t\tValue:      value,\n\t\tExpr:       `ids`,\n\t\tCacheIndex: 11,\n\t\tSetter: func(v []string) error {\n\t\t\tret.Ids = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"posts.map(post, post.title)\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]string]{\n\t\tValue:      value,\n\t\tExpr:       `posts.map(post, post.title)`,\n\t\tCacheIndex: 12,\n\t\tSetter: func(v []string) error {\n\t\t\tret.Titles = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"posts.map(post, post.content)\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]string]{\n\t\tValue:      value,\n\t\tExpr:       `posts.map(post, post.content)`,\n\t\tCacheIndex: 13,\n\t\tSetter: func(v []string) error {\n\t\t\tret.Contents = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"users\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]*User]{\n\t\tValue:      value,\n\t\tExpr:       `users`,\n\t\tCacheIndex: 14,\n\t\tSetter: func(v []*User) error {\n\t\t\tret.Users = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"items\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]*Posts_PostItem]{\n\t\tValue:      value,\n\t\tExpr:       `items`,\n\t\tCacheIndex: 15,\n\t\tSetter: func(v []*Posts_PostItem) error {\n\t\t\tret.Items = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"item_types\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]Item_ItemType]{\n\t\tValue:      value,\n\t\tExpr:       `item_types`,\n\t\tCacheIndex: 16,\n\t\tSetter: func(v []Item_ItemType) error {\n\t\t\tret.ItemTypes = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"selected_item_types\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]Item_ItemType]{\n\t\tValue:      value,\n\t\tExpr:       `selected_item_types`,\n\t\tCacheIndex: 17,\n\t\tSetter: func(v []Item_ItemType) error {\n\t\t\tret.SelectedItemTypes = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.Posts\", slog.Any(\"org.federation.Posts\", s.logvalue_Org_Federation_Posts(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_Posts_PostItem resolve \"org.federation.Posts.PostItem\" message.\nfunc (s *FederationService) resolve_Org_Federation_Posts_PostItem(ctx context.Context, req *FederationService_Org_Federation_Posts_PostItemArgument) (*Posts_PostItem, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.Posts.PostItem\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.Posts.PostItem\", slog.Any(\"message_args\", s.logvalue_Org_Federation_Posts_PostItemArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.Posts_PostItemArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &Posts_PostItem{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'item_' + $.id\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'item_' + $.id`,\n\t\tCacheIndex: 18,\n\t\tSetter: func(v string) error {\n\t\t\tret.Name = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.Posts.PostItem\", slog.Any(\"org.federation.Posts.PostItem\", s.logvalue_Org_Federation_Posts_PostItem(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_User resolve \"org.federation.User\" message.\nfunc (s *FederationService) resolve_Org_Federation_User(ctx context.Context, req *FederationService_Org_Federation_UserArgument) (*User, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.User\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.User\", slog.Any(\"message_args\", s.logvalue_Org_Federation_UserArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tRes  *user.GetUserResponse\n\t\t\tUser *user.User\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.UserArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"user.UserService/GetUser\"\n\t\t    request { field: \"id\", by: \"$.user_id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*user.GetUserResponse, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"user.GetUserResponse\"),\n\t\t\tSetter: func(value *localValueType, v *user.GetUserResponse) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &user.GetUserRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.user_id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.user_id`,\n\t\t\t\t\tCacheIndex: 19,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call user.UserService/GetUser\", slog.Any(\"user.GetUserRequest\", s.logvalue_User_GetUserRequest(args)))\n\t\t\t\tret, err := s.client.User_UserServiceClient.GetUser(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_User_UserService_GetUser, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"user\"\n\t\t  autobind: true\n\t\t  by: \"res.user\"\n\t\t}\n\t*/\n\tdef_user := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*user.User, *localValueType]{\n\t\t\tName: `user`,\n\t\t\tType: grpcfed.CELObjectType(\"user.User\"),\n\t\t\tSetter: func(value *localValueType, v *user.User) error {\n\t\t\t\tvalue.vars.User = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `res.user`,\n\t\t\tByCacheIndex: 20,\n\t\t})\n\t}\n\n\tif err := def_res(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\tif err := def_user(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_UserVariable.Res = value.vars.Res\n\treq.FederationService_Org_Federation_UserVariable.User = value.vars.User\n\n\t// create a message value to be returned.\n\tret := &User{}\n\n\t// field binding section.\n\tret.Id = value.vars.User.GetId()     // { name: \"user\", autobind: true }\n\tret.Name = value.vars.User.GetName() // { name: \"user\", autobind: true }\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.User\", slog.Any(\"org.federation.User\", s.logvalue_Org_Federation_User(ret)))\n\treturn ret, nil\n}\n\n// cast_User_Item_ItemType__to__Org_Federation_Item_ItemType cast from \"user.Item.ItemType\" to \"org.federation.Item.ItemType\".\nfunc (s *FederationService) cast_User_Item_ItemType__to__Org_Federation_Item_ItemType(from user.Item_ItemType) (Item_ItemType, error) {\n\tvar ret Item_ItemType\n\tswitch from {\n\tcase user.Item_ITEM_TYPE_UNSPECIFIED:\n\t\tret = Item_ITEM_TYPE_UNSPECIFIED\n\tcase user.Item_ITEM_TYPE_1:\n\t\tret = Item_ITEM_TYPE_1\n\tcase user.Item_ITEM_TYPE_2:\n\t\tret = Item_ITEM_TYPE_2\n\tcase user.Item_ITEM_TYPE_3:\n\t\tret = Item_ITEM_TYPE_3\n\tdefault:\n\t\tret = 0\n\t}\n\treturn ret, nil\n}\n\n// cast_repeated_User_Item_ItemType__to__repeated_Org_Federation_Item_ItemType cast from \"repeated user.Item.ItemType\" to \"repeated org.federation.Item.ItemType\".\nfunc (s *FederationService) cast_repeated_User_Item_ItemType__to__repeated_Org_Federation_Item_ItemType(from []user.Item_ItemType) ([]Item_ItemType, error) {\n\tret := make([]Item_ItemType, 0, len(from))\n\tfor _, v := range from {\n\t\tcasted, err := s.cast_User_Item_ItemType__to__Org_Federation_Item_ItemType(v)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret = append(ret, casted)\n\t}\n\treturn ret, nil\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostsResponse(v *GetPostsResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"posts\", s.logvalue_Org_Federation_Posts(v.GetPosts())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostsResponseArgument(v *FederationService_Org_Federation_GetPostsResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.Ids),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_Item_ItemType(v Item_ItemType) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tswitch v {\n\tcase Item_ITEM_TYPE_UNSPECIFIED:\n\t\treturn slog.StringValue(\"ITEM_TYPE_UNSPECIFIED\")\n\tcase Item_ITEM_TYPE_1:\n\t\treturn slog.StringValue(\"ITEM_TYPE_1\")\n\tcase Item_ITEM_TYPE_2:\n\t\treturn slog.StringValue(\"ITEM_TYPE_2\")\n\tcase Item_ITEM_TYPE_3:\n\t\treturn slog.StringValue(\"ITEM_TYPE_3\")\n\t}\n\treturn slog.StringValue(\"\")\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_Posts(v *Posts) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.GetIds()),\n\t\tslog.Any(\"titles\", v.GetTitles()),\n\t\tslog.Any(\"contents\", v.GetContents()),\n\t\tslog.Any(\"users\", s.logvalue_repeated_Org_Federation_User(v.GetUsers())),\n\t\tslog.Any(\"items\", s.logvalue_repeated_Org_Federation_Posts_PostItem(v.GetItems())),\n\t\tslog.Any(\"item_types\", s.logvalue_repeated_Org_Federation_Item_ItemType(v.GetItemTypes())),\n\t\tslog.Any(\"selected_item_types\", s.logvalue_repeated_Org_Federation_Item_ItemType(v.GetSelectedItemTypes())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_PostsArgument(v *FederationService_Org_Federation_PostsArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"post_ids\", v.PostIds),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_Posts_PostItem(v *Posts_PostItem) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_Posts_PostItemArgument(v *FederationService_Org_Federation_Posts_PostItemArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_User(v *User) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_UserArgument(v *FederationService_Org_Federation_UserArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"user_id\", v.UserId),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Post_GetPostRequest(v *post.GetPostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Post_GetPostsRequest(v *post.GetPostsRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.GetIds()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_User_GetUserRequest(v *user.GetUserRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_User_GetUsersRequest(v *user.GetUsersRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.GetIds()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_repeated_Org_Federation_Item_ItemType(v []Item_ItemType) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tattrs := make([]slog.Attr, 0, len(v))\n\tfor idx, vv := range v {\n\t\tattrs = append(attrs, slog.Attr{\n\t\t\tKey:   grpcfed.ToLogAttrKey(idx),\n\t\t\tValue: s.logvalue_Org_Federation_Item_ItemType(vv),\n\t\t})\n\t}\n\treturn slog.GroupValue(attrs...)\n}\n\nfunc (s *FederationService) logvalue_repeated_Org_Federation_Posts_PostItem(v []*Posts_PostItem) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tattrs := make([]slog.Attr, 0, len(v))\n\tfor idx, vv := range v {\n\t\tattrs = append(attrs, slog.Attr{\n\t\t\tKey:   grpcfed.ToLogAttrKey(idx),\n\t\t\tValue: s.logvalue_Org_Federation_Posts_PostItem(vv),\n\t\t})\n\t}\n\treturn slog.GroupValue(attrs...)\n}\n\nfunc (s *FederationService) logvalue_repeated_Org_Federation_User(v []*User) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tattrs := make([]slog.Attr, 0, len(v))\n\tfor idx, vv := range v {\n\t\tattrs = append(attrs, slog.Attr{\n\t\t\tKey:   grpcfed.ToLogAttrKey(idx),\n\t\t\tValue: s.logvalue_Org_Federation_User(vv),\n\t\t})\n\t}\n\treturn slog.GroupValue(attrs...)\n}\n"
  },
  {
    "path": "_examples/13_map/go.mod",
    "content": "module example\n\ngo 1.24.0\n\nreplace github.com/mercari/grpc-federation => ../../\n\nrequire (\n\tgithub.com/google/go-cmp v0.7.0\n\tgithub.com/mercari/grpc-federation v0.0.0-00010101000000-000000000000\n\tgo.opentelemetry.io/otel v1.24.0\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0\n\tgo.opentelemetry.io/otel/sdk v1.24.0\n\tgo.opentelemetry.io/otel/trace v1.24.0\n\tgo.uber.org/goleak v1.3.0\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7\n\tgoogle.golang.org/grpc v1.65.0\n\tgoogle.golang.org/protobuf v1.34.2\n)\n\nrequire (\n\tcel.dev/expr v0.19.1 // indirect\n\tgithub.com/antlr4-go/antlr/v4 v4.13.0 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.2.1 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/goccy/wasi-go v0.3.2 // indirect\n\tgithub.com/google/cel-go v0.23.1 // indirect\n\tgithub.com/google/uuid v1.6.0 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect\n\tgithub.com/kelseyhightower/envconfig v1.4.0 // indirect\n\tgithub.com/stealthrocket/wazergo v0.19.1 // indirect\n\tgithub.com/stoewer/go-strcase v1.3.0 // indirect\n\tgithub.com/tetratelabs/wazero v1.10.1 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.24.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.0.0 // indirect\n\tgolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect\n\tgolang.org/x/net v0.38.0 // indirect\n\tgolang.org/x/sync v0.14.0 // indirect\n\tgolang.org/x/sys v0.37.0 // indirect\n\tgolang.org/x/text v0.23.0 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 // indirect\n)\n"
  },
  {
    "path": "_examples/13_map/go.sum",
    "content": "cel.dev/expr v0.19.1 h1:NciYrtDRIR0lNCnH1LFJegdjspNx9fI59O7TWcua/W4=\ncel.dev/expr v0.19.1/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw=\ngithub.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=\ngithub.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/goccy/wasi-go v0.3.2 h1:wAvGXmqCkfcp0B0AwIp5Ya53hzDwkKm9W8iuT3nCCz0=\ngithub.com/goccy/wasi-go v0.3.2/go.mod h1:nIKD204n9xa4Z20UV+XA483kIr9TAl2vXr+X5qVAO5M=\ngithub.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4=\ngithub.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=\ngithub.com/google/cel-go v0.23.1 h1:91ThhEZlBcE5rB2adBVXqvDoqdL8BG2oyhd0bK1I/r4=\ngithub.com/google/cel-go v0.23.1/go.mod h1:52Pb6QsDbC5kvgxvZhiL9QX1oZEkcUF/ZqaPx1J5Wwo=\ngithub.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\ngithub.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg=\ngithub.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=\ngithub.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/stealthrocket/wazergo v0.19.1 h1:BPrITETPgSFwiytwmToO0MbUC/+RGC39JScz1JmmG6c=\ngithub.com/stealthrocket/wazergo v0.19.1/go.mod h1:riI0hxw4ndZA5e6z7PesHg2BtTftcZaMxRcoiGGipTs=\ngithub.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs=\ngithub.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tetratelabs/wazero v1.10.1 h1:2DugeJf6VVk58KTPszlNfeeN8AhhpwcZqkJj2wwFuH8=\ngithub.com/tetratelabs/wazero v1.10.1/go.mod h1:DRm5twOQ5Gr1AoEdSi0CLjDQF1J9ZAuyqFIjl1KKfQU=\ngo.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo=\ngo.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0=\ngo.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI=\ngo.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=\ngo.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw=\ngo.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg=\ngo.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=\ngo.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=\ngo.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=\ngo.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=\ngolang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=\ngolang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=\ngolang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=\ngolang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=\ngolang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=\ngolang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=\ngolang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 h1:YcyjlL1PRr2Q17/I0dPk2JmYS5CDXfcdb2Z3YRioEbw=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7 h1:2035KHhUv+EpyB+hWgJnaWKJOdX1E95w2S8Rr4uWKTs=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=\ngoogle.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=\ngoogle.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=\ngoogle.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=\ngoogle.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "_examples/13_map/main_test.go",
    "content": "package main_test\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"net\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\"\n\t\"go.opentelemetry.io/otel/propagation\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\tsdktrace \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.4.0\"\n\t\"go.uber.org/goleak\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/credentials/insecure\"\n\t\"google.golang.org/grpc/test/bufconn\"\n\n\t\"example/federation\"\n\t\"example/post\"\n\t\"example/user\"\n)\n\nconst bufSize = 1024\n\nvar (\n\tlistener   *bufconn.Listener\n\tpostClient post.PostServiceClient\n\tuserClient user.UserServiceClient\n)\n\ntype clientConfig struct{}\n\nfunc (c *clientConfig) Post_PostServiceClient(cfg federation.FederationServiceClientConfig) (post.PostServiceClient, error) {\n\treturn postClient, nil\n}\n\nfunc (c *clientConfig) User_UserServiceClient(cfg federation.FederationServiceClientConfig) (user.UserServiceClient, error) {\n\treturn userClient, nil\n}\n\ntype PostServer struct {\n\t*post.UnimplementedPostServiceServer\n}\n\nfunc (s *PostServer) GetPosts(ctx context.Context, req *post.GetPostsRequest) (*post.GetPostsResponse, error) {\n\tvar ret post.GetPostsResponse\n\tfor _, id := range req.GetIds() {\n\t\tret.Posts = append(ret.Posts, &post.Post{\n\t\t\tId:      id,\n\t\t\tTitle:   \"title for \" + id,\n\t\t\tContent: \"content for \" + id,\n\t\t\tUserId:  id,\n\t\t})\n\t}\n\treturn &ret, nil\n}\n\ntype UserServer struct {\n\t*user.UnimplementedUserServiceServer\n}\n\nfunc (s *UserServer) GetUser(ctx context.Context, req *user.GetUserRequest) (*user.GetUserResponse, error) {\n\treturn &user.GetUserResponse{\n\t\tUser: &user.User{\n\t\t\tId:   req.Id,\n\t\t\tName: fmt.Sprintf(\"name_%s\", req.Id),\n\t\t},\n\t}, nil\n}\n\nfunc dialer(ctx context.Context, address string) (net.Conn, error) {\n\treturn listener.Dial()\n}\n\nfunc TestFederation(t *testing.T) {\n\tdefer goleak.VerifyNone(t)\n\tctx := context.Background()\n\tlistener = bufconn.Listen(bufSize)\n\n\tif os.Getenv(\"ENABLE_JAEGER\") != \"\" {\n\t\texporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithInsecure())\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttp := sdktrace.NewTracerProvider(\n\t\t\tsdktrace.WithBatcher(exporter),\n\t\t\tsdktrace.WithResource(\n\t\t\t\tresource.NewWithAttributes(\n\t\t\t\t\tsemconv.SchemaURL,\n\t\t\t\t\tsemconv.ServiceNameKey.String(\"example13/map\"),\n\t\t\t\t\tsemconv.ServiceVersionKey.String(\"1.0.0\"),\n\t\t\t\t\tattribute.String(\"environment\", \"dev\"),\n\t\t\t\t),\n\t\t\t),\n\t\t\tsdktrace.WithSampler(sdktrace.AlwaysSample()),\n\t\t)\n\t\tdefer tp.Shutdown(ctx)\n\t\totel.SetTextMapPropagator(propagation.TraceContext{})\n\t\totel.SetTracerProvider(tp)\n\t}\n\n\tconn, err := grpc.DialContext(\n\t\tctx, \"\",\n\t\tgrpc.WithContextDialer(dialer),\n\t\tgrpc.WithTransportCredentials(insecure.NewCredentials()),\n\t)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer conn.Close()\n\n\tpostClient = post.NewPostServiceClient(conn)\n\tuserClient = user.NewUserServiceClient(conn)\n\n\tgrpcServer := grpc.NewServer()\n\tdefer grpcServer.Stop()\n\n\tlogger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{\n\t\tLevel: slog.LevelDebug,\n\t}))\n\tfederationServer, err := federation.NewFederationService(federation.FederationServiceConfig{\n\t\tClient: new(clientConfig),\n\t\tLogger: logger,\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer federation.CleanupFederationService(ctx, federationServer)\n\n\tpost.RegisterPostServiceServer(grpcServer, &PostServer{})\n\tuser.RegisterUserServiceServer(grpcServer, &UserServer{})\n\tfederation.RegisterFederationServiceServer(grpcServer, federationServer)\n\n\tgo func() {\n\t\tif err := grpcServer.Serve(listener); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t}()\n\n\tclient := federation.NewFederationServiceClient(conn)\n\tres, err := client.GetPosts(ctx, &federation.GetPostsRequest{\n\t\tIds: []string{\"x\", \"y\"},\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif diff := cmp.Diff(res, &federation.GetPostsResponse{\n\t\tPosts: &federation.Posts{\n\t\t\tIds:      []string{\"x\", \"y\"},\n\t\t\tTitles:   []string{\"title for x\", \"title for y\"},\n\t\t\tContents: []string{\"content for x\", \"content for y\"},\n\t\t\tUsers: []*federation.User{\n\t\t\t\t{\n\t\t\t\t\tId:   \"x\",\n\t\t\t\t\tName: \"name_x\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tId:   \"y\",\n\t\t\t\t\tName: \"name_y\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tItems: []*federation.Posts_PostItem{\n\t\t\t\t{Name: \"item_x\"},\n\t\t\t\t{Name: \"item_y\"},\n\t\t\t},\n\t\t\tItemTypes: []federation.Item_ItemType{\n\t\t\t\tfederation.Item_ITEM_TYPE_1,\n\t\t\t\tfederation.Item_ITEM_TYPE_2,\n\t\t\t},\n\t\t\tSelectedItemTypes: []federation.Item_ItemType{\n\t\t\t\tfederation.Item_ITEM_TYPE_1,\n\t\t\t\tfederation.Item_ITEM_TYPE_2,\n\t\t\t},\n\t\t},\n\t}, cmpopts.IgnoreUnexported(\n\t\tfederation.GetPostsResponse{},\n\t\tfederation.Posts{},\n\t\tfederation.User{},\n\t\tfederation.Posts_PostItem{},\n\t)); diff != \"\" {\n\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t}\n}\n"
  },
  {
    "path": "_examples/13_map/post/post.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: post/post.proto\n\npackage post\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype GetPostRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetPostRequest) Reset() {\n\t*x = GetPostRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostRequest) ProtoMessage() {}\n\nfunc (x *GetPostRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostRequest.ProtoReflect.Descriptor instead.\nfunc (*GetPostRequest) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetPostRequest) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\ntype GetPostResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPost *Post `protobuf:\"bytes,1,opt,name=post,proto3\" json:\"post,omitempty\"`\n}\n\nfunc (x *GetPostResponse) Reset() {\n\t*x = GetPostResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostResponse) ProtoMessage() {}\n\nfunc (x *GetPostResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostResponse.ProtoReflect.Descriptor instead.\nfunc (*GetPostResponse) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetPostResponse) GetPost() *Post {\n\tif x != nil {\n\t\treturn x.Post\n\t}\n\treturn nil\n}\n\ntype GetPostsRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tIds []string `protobuf:\"bytes,1,rep,name=ids,proto3\" json:\"ids,omitempty\"`\n}\n\nfunc (x *GetPostsRequest) Reset() {\n\t*x = GetPostsRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostsRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostsRequest) ProtoMessage() {}\n\nfunc (x *GetPostsRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostsRequest.ProtoReflect.Descriptor instead.\nfunc (*GetPostsRequest) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *GetPostsRequest) GetIds() []string {\n\tif x != nil {\n\t\treturn x.Ids\n\t}\n\treturn nil\n}\n\ntype GetPostsResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPosts []*Post `protobuf:\"bytes,1,rep,name=posts,proto3\" json:\"posts,omitempty\"`\n}\n\nfunc (x *GetPostsResponse) Reset() {\n\t*x = GetPostsResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostsResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostsResponse) ProtoMessage() {}\n\nfunc (x *GetPostsResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostsResponse.ProtoReflect.Descriptor instead.\nfunc (*GetPostsResponse) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *GetPostsResponse) GetPosts() []*Post {\n\tif x != nil {\n\t\treturn x.Posts\n\t}\n\treturn nil\n}\n\ntype Post struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId      string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tTitle   string `protobuf:\"bytes,2,opt,name=title,proto3\" json:\"title,omitempty\"`\n\tContent string `protobuf:\"bytes,3,opt,name=content,proto3\" json:\"content,omitempty\"`\n\tUserId  string `protobuf:\"bytes,4,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *Post) Reset() {\n\t*x = Post{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Post) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Post) ProtoMessage() {}\n\nfunc (x *Post) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Post.ProtoReflect.Descriptor instead.\nfunc (*Post) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *Post) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetTitle() string {\n\tif x != nil {\n\t\treturn x.Title\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetContent() string {\n\tif x != nil {\n\t\treturn x.Content\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetUserId() string {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn \"\"\n}\n\nvar File_post_post_proto protoreflect.FileDescriptor\n\nvar file_post_post_proto_rawDesc = []byte{\n\t0x0a, 0x0f, 0x70, 0x6f, 0x73, 0x74, 0x2f, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x20, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x6f,\n\t0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x31, 0x0a, 0x0f, 0x47, 0x65, 0x74,\n\t0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x04,\n\t0x70, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x6f, 0x73,\n\t0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x23, 0x0a, 0x0f,\n\t0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,\n\t0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64,\n\t0x73, 0x22, 0x34, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65, 0x73,\n\t0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x05, 0x70, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74,\n\t0x52, 0x05, 0x70, 0x6f, 0x73, 0x74, 0x73, 0x22, 0x5f, 0x0a, 0x04, 0x50, 0x6f, 0x73, 0x74, 0x12,\n\t0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12,\n\t0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,\n\t0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12,\n\t0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x32, 0x84, 0x01, 0x0a, 0x0b, 0x50, 0x6f, 0x73,\n\t0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x38, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x50,\n\t0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f,\n\t0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x70, 0x6f, 0x73, 0x74,\n\t0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x22, 0x00, 0x12, 0x3b, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x15,\n\t0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65,\n\t0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x47, 0x65, 0x74,\n\t0x50, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42,\n\t0x58, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x42, 0x09, 0x50, 0x6f, 0x73,\n\t0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x11, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c,\n\t0x65, 0x2f, 0x70, 0x6f, 0x73, 0x74, 0x3b, 0x70, 0x6f, 0x73, 0x74, 0xa2, 0x02, 0x03, 0x50, 0x58,\n\t0x58, 0xaa, 0x02, 0x04, 0x50, 0x6f, 0x73, 0x74, 0xca, 0x02, 0x04, 0x50, 0x6f, 0x73, 0x74, 0xe2,\n\t0x02, 0x10, 0x50, 0x6f, 0x73, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61,\n\t0x74, 0x61, 0xea, 0x02, 0x04, 0x50, 0x6f, 0x73, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x33,\n}\n\nvar (\n\tfile_post_post_proto_rawDescOnce sync.Once\n\tfile_post_post_proto_rawDescData = file_post_post_proto_rawDesc\n)\n\nfunc file_post_post_proto_rawDescGZIP() []byte {\n\tfile_post_post_proto_rawDescOnce.Do(func() {\n\t\tfile_post_post_proto_rawDescData = protoimpl.X.CompressGZIP(file_post_post_proto_rawDescData)\n\t})\n\treturn file_post_post_proto_rawDescData\n}\n\nvar file_post_post_proto_msgTypes = make([]protoimpl.MessageInfo, 5)\nvar file_post_post_proto_goTypes = []interface{}{\n\t(*GetPostRequest)(nil),   // 0: post.GetPostRequest\n\t(*GetPostResponse)(nil),  // 1: post.GetPostResponse\n\t(*GetPostsRequest)(nil),  // 2: post.GetPostsRequest\n\t(*GetPostsResponse)(nil), // 3: post.GetPostsResponse\n\t(*Post)(nil),             // 4: post.Post\n}\nvar file_post_post_proto_depIdxs = []int32{\n\t4, // 0: post.GetPostResponse.post:type_name -> post.Post\n\t4, // 1: post.GetPostsResponse.posts:type_name -> post.Post\n\t0, // 2: post.PostService.GetPost:input_type -> post.GetPostRequest\n\t2, // 3: post.PostService.GetPosts:input_type -> post.GetPostsRequest\n\t1, // 4: post.PostService.GetPost:output_type -> post.GetPostResponse\n\t3, // 5: post.PostService.GetPosts:output_type -> post.GetPostsResponse\n\t4, // [4:6] is the sub-list for method output_type\n\t2, // [2:4] is the sub-list for method input_type\n\t2, // [2:2] is the sub-list for extension type_name\n\t2, // [2:2] is the sub-list for extension extendee\n\t0, // [0:2] is the sub-list for field type_name\n}\n\nfunc init() { file_post_post_proto_init() }\nfunc file_post_post_proto_init() {\n\tif File_post_post_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_post_post_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostsRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostsResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Post); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_post_post_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   5,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_post_post_proto_goTypes,\n\t\tDependencyIndexes: file_post_post_proto_depIdxs,\n\t\tMessageInfos:      file_post_post_proto_msgTypes,\n\t}.Build()\n\tFile_post_post_proto = out.File\n\tfile_post_post_proto_rawDesc = nil\n\tfile_post_post_proto_goTypes = nil\n\tfile_post_post_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/13_map/post/post_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: post/post.proto\n\npackage post\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tPostService_GetPost_FullMethodName  = \"/post.PostService/GetPost\"\n\tPostService_GetPosts_FullMethodName = \"/post.PostService/GetPosts\"\n)\n\n// PostServiceClient is the client API for PostService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype PostServiceClient interface {\n\tGetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error)\n\tGetPosts(ctx context.Context, in *GetPostsRequest, opts ...grpc.CallOption) (*GetPostsResponse, error)\n}\n\ntype postServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewPostServiceClient(cc grpc.ClientConnInterface) PostServiceClient {\n\treturn &postServiceClient{cc}\n}\n\nfunc (c *postServiceClient) GetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error) {\n\tout := new(GetPostResponse)\n\terr := c.cc.Invoke(ctx, PostService_GetPost_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *postServiceClient) GetPosts(ctx context.Context, in *GetPostsRequest, opts ...grpc.CallOption) (*GetPostsResponse, error) {\n\tout := new(GetPostsResponse)\n\terr := c.cc.Invoke(ctx, PostService_GetPosts_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// PostServiceServer is the server API for PostService service.\n// All implementations must embed UnimplementedPostServiceServer\n// for forward compatibility\ntype PostServiceServer interface {\n\tGetPost(context.Context, *GetPostRequest) (*GetPostResponse, error)\n\tGetPosts(context.Context, *GetPostsRequest) (*GetPostsResponse, error)\n\tmustEmbedUnimplementedPostServiceServer()\n}\n\n// UnimplementedPostServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedPostServiceServer struct {\n}\n\nfunc (UnimplementedPostServiceServer) GetPost(context.Context, *GetPostRequest) (*GetPostResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetPost not implemented\")\n}\nfunc (UnimplementedPostServiceServer) GetPosts(context.Context, *GetPostsRequest) (*GetPostsResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetPosts not implemented\")\n}\nfunc (UnimplementedPostServiceServer) mustEmbedUnimplementedPostServiceServer() {}\n\n// UnsafePostServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to PostServiceServer will\n// result in compilation errors.\ntype UnsafePostServiceServer interface {\n\tmustEmbedUnimplementedPostServiceServer()\n}\n\nfunc RegisterPostServiceServer(s grpc.ServiceRegistrar, srv PostServiceServer) {\n\ts.RegisterService(&PostService_ServiceDesc, srv)\n}\n\nfunc _PostService_GetPost_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetPostRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(PostServiceServer).GetPost(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: PostService_GetPost_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(PostServiceServer).GetPost(ctx, req.(*GetPostRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _PostService_GetPosts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetPostsRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(PostServiceServer).GetPosts(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: PostService_GetPosts_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(PostServiceServer).GetPosts(ctx, req.(*GetPostsRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// PostService_ServiceDesc is the grpc.ServiceDesc for PostService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar PostService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"post.PostService\",\n\tHandlerType: (*PostServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetPost\",\n\t\t\tHandler:    _PostService_GetPost_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetPosts\",\n\t\t\tHandler:    _PostService_GetPosts_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"post/post.proto\",\n}\n"
  },
  {
    "path": "_examples/13_map/proto/buf.yaml",
    "content": "version: v1\nbreaking:\n  use:\n    - FILE\nlint:\n  use:\n    - DEFAULT\n"
  },
  {
    "path": "_examples/13_map/proto/federation/federation.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"google/protobuf/any.proto\";\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\noption (grpc.federation.file)= {\n  import: [\"post/post.proto\", \"user/user.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPosts(GetPostsRequest) returns (GetPostsResponse) {};\n}\n\nmessage GetPostsRequest {\n  repeated string ids = 1;\n}\n    \nmessage GetPostsResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"posts\"\n      message {\n        name: \"Posts\"\n        args { name: \"post_ids\", by: \"$.ids\" }\n      }\n    }\n  };\n  Posts posts = 1 [(grpc.federation.field).by = \"posts\"];\n}\n\nmessage Posts {\n  option (grpc.federation.message) = {\n    def [\n      {\n         name: \"res\"\n         call {\n          method: \"post.PostService/GetPosts\"\n          request { field: \"ids\" by: \"$.post_ids\" }\n         }\n      },\n      { name: \"posts\", by: \"res.posts\" },\n      {\n        name: \"ids\"\n        map {\n          iterator {\n            name: \"post\"\n            src: \"posts\"\n          }\n          by: \"post.id\"\n        }\n      },\n      {\n        name: \"users\"\n        map {\n          iterator {\n            name: \"iter\"\n            src: \"posts\"\n          }\n          message {\n            name: \"User\"\n            args { name: \"user_id\", by: \"iter.user_id\" }\n          }\n        }\n      },\n      {\n        name: \"items\"\n        map {\n          iterator {\n            name: \"iter\"\n            src: \"posts\"\n          }\n          message {\n            name: \"Posts.PostItem\"\n            args { name: \"id\" by: \"iter.id\" }\n          }\n        }\n      },\n      {\n        name: \"source_item_types\"\n        by: \"[user.Item.ItemType.value('ITEM_TYPE_1'), user.Item.ItemType.value('ITEM_TYPE_2')]\"\n      },\n      {\n        name: \"item_types\"\n        map {\n          iterator {\n            name: \"typ\"\n            src: \"source_item_types\"\n          }\n          enum {\n            name: \"Item.ItemType\"\n            by: \"typ\"\n          }\n        }\n      },\n      {\n        name: \"selected_item_types\"\n        map {\n          iterator {\n            name: \"typ\"\n            src: \"source_item_types\"\n          }\n          enum {\n            name: \"Item.ItemType\"\n            by: \"grpc.federation.enum.select(true, typ, user.Item.ItemType.value('ITEM_TYPE_UNSPECIFIED'))\"\n          }\n        }\n      }\n    ]\n  };\n\n  message PostItem {\n    string name = 1 [(grpc.federation.field).by = \"'item_' + $.id\"];\n  };\n\n  repeated string ids = 1 [(grpc.federation.field).by = \"ids\"];\n  repeated string titles = 2 [(grpc.federation.field).by = \"posts.map(post, post.title)\"];\n  repeated string contents = 3 [(grpc.federation.field).by = \"posts.map(post, post.content)\"];\n  repeated User users = 4 [(grpc.federation.field).by = \"users\"];\n  repeated PostItem items = 5 [(grpc.federation.field).by = \"items\"];\n  repeated Item.ItemType item_types = 6 [(grpc.federation.field).by = \"item_types\"];\n  repeated Item.ItemType selected_item_types = 7 [(grpc.federation.field).by = \"selected_item_types\"];\n}\n\nmessage User {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"user.UserService/GetUser\"\n        request { field: \"id\" by: \"$.user_id\" }\n      }\n    }\n    def { name: \"user\" by: \"res.user\" autobind: true }\n  };\n  string id = 1;\n  string name = 2;\n}\n\nmessage Item {\n  option (grpc.federation.message).alias = \"user.Item\";\n\n  enum ItemType {\n    option (grpc.federation.enum).alias = \"user.Item.ItemType\";\n\n    ITEM_TYPE_UNSPECIFIED = 0;\n    ITEM_TYPE_1 = 1;\n    ITEM_TYPE_2 = 2;\n    ITEM_TYPE_3 = 3;\n  }\n}"
  },
  {
    "path": "_examples/13_map/proto/post/post.proto",
    "content": "syntax = \"proto3\";\n\npackage post;\n\noption go_package = \"example/post;post\";\n\nservice PostService {\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n  rpc GetPosts(GetPostsRequest) returns (GetPostsResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  Post post = 1;\n}\n\nmessage GetPostsRequest {\n  repeated string ids = 1;\n}\n\nmessage GetPostsResponse {\n  repeated Post posts = 1;\n}\n\nmessage Post {\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  string user_id = 4;\n}\n"
  },
  {
    "path": "_examples/13_map/proto/user/user.proto",
    "content": "syntax = \"proto3\";\n\npackage user;\n\nimport \"google/protobuf/any.proto\";\n\noption go_package = \"example/user;user\";\n\nservice UserService {\n  rpc GetUser(GetUserRequest) returns (GetUserResponse) {};\n  rpc GetUsers(GetUsersRequest) returns (GetUsersResponse) {};\n}\n\nmessage GetUserRequest {\n  string id = 1;\n}\n\nmessage GetUserResponse {\n  User user = 1;\n}\n\nmessage GetUsersRequest {\n  repeated string ids = 1;\n}\n\nmessage GetUsersResponse {\n  repeated User users = 1;\n}\n\nmessage User {\n  string id = 1;\n  string name = 2;\n  repeated Item items = 3;\n  map<string, google.protobuf.Any> profile = 4;\n  oneof attr {\n    AttrA attr_a = 5;\n    AttrB b = 6;\n  }\n  message AttrA {\n    string foo = 1;\n  }\n  message AttrB {\n    bool bar = 2;\n  }\n}\n\nmessage Item {\n  enum ItemType {\n    ITEM_TYPE_UNSPECIFIED = 0;\n    ITEM_TYPE_1 = 1;\n    ITEM_TYPE_2 = 2;\n    ITEM_TYPE_3 = 3;\n  }\n  message Location {\n    string addr1 = 1;\n    string addr2 = 2;\n    oneof addr3 {\n      AddrA addr_a = 3;\n      AddrB b = 4;\n    };\n    message AddrA {\n      string foo = 1;\n    }\n    message AddrB {\n      int64 bar = 1;\n    }\n  }\n  string name = 1;\n  ItemType type = 2;\n  int64 value = 3;\n  Location location = 4;\n}"
  },
  {
    "path": "_examples/13_map/user/user.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: user/user.proto\n\npackage user\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tanypb \"google.golang.org/protobuf/types/known/anypb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Item_ItemType int32\n\nconst (\n\tItem_ITEM_TYPE_UNSPECIFIED Item_ItemType = 0\n\tItem_ITEM_TYPE_1           Item_ItemType = 1\n\tItem_ITEM_TYPE_2           Item_ItemType = 2\n\tItem_ITEM_TYPE_3           Item_ItemType = 3\n)\n\n// Enum value maps for Item_ItemType.\nvar (\n\tItem_ItemType_name = map[int32]string{\n\t\t0: \"ITEM_TYPE_UNSPECIFIED\",\n\t\t1: \"ITEM_TYPE_1\",\n\t\t2: \"ITEM_TYPE_2\",\n\t\t3: \"ITEM_TYPE_3\",\n\t}\n\tItem_ItemType_value = map[string]int32{\n\t\t\"ITEM_TYPE_UNSPECIFIED\": 0,\n\t\t\"ITEM_TYPE_1\":           1,\n\t\t\"ITEM_TYPE_2\":           2,\n\t\t\"ITEM_TYPE_3\":           3,\n\t}\n)\n\nfunc (x Item_ItemType) Enum() *Item_ItemType {\n\tp := new(Item_ItemType)\n\t*p = x\n\treturn p\n}\n\nfunc (x Item_ItemType) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (Item_ItemType) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_user_user_proto_enumTypes[0].Descriptor()\n}\n\nfunc (Item_ItemType) Type() protoreflect.EnumType {\n\treturn &file_user_user_proto_enumTypes[0]\n}\n\nfunc (x Item_ItemType) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use Item_ItemType.Descriptor instead.\nfunc (Item_ItemType) EnumDescriptor() ([]byte, []int) {\n\treturn file_user_user_proto_rawDescGZIP(), []int{5, 0}\n}\n\ntype GetUserRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetUserRequest) Reset() {\n\t*x = GetUserRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_user_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetUserRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetUserRequest) ProtoMessage() {}\n\nfunc (x *GetUserRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_user_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetUserRequest.ProtoReflect.Descriptor instead.\nfunc (*GetUserRequest) Descriptor() ([]byte, []int) {\n\treturn file_user_user_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetUserRequest) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\ntype GetUserResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUser *User `protobuf:\"bytes,1,opt,name=user,proto3\" json:\"user,omitempty\"`\n}\n\nfunc (x *GetUserResponse) Reset() {\n\t*x = GetUserResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_user_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetUserResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetUserResponse) ProtoMessage() {}\n\nfunc (x *GetUserResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_user_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetUserResponse.ProtoReflect.Descriptor instead.\nfunc (*GetUserResponse) Descriptor() ([]byte, []int) {\n\treturn file_user_user_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetUserResponse) GetUser() *User {\n\tif x != nil {\n\t\treturn x.User\n\t}\n\treturn nil\n}\n\ntype GetUsersRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tIds []string `protobuf:\"bytes,1,rep,name=ids,proto3\" json:\"ids,omitempty\"`\n}\n\nfunc (x *GetUsersRequest) Reset() {\n\t*x = GetUsersRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_user_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetUsersRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetUsersRequest) ProtoMessage() {}\n\nfunc (x *GetUsersRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_user_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetUsersRequest.ProtoReflect.Descriptor instead.\nfunc (*GetUsersRequest) Descriptor() ([]byte, []int) {\n\treturn file_user_user_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *GetUsersRequest) GetIds() []string {\n\tif x != nil {\n\t\treturn x.Ids\n\t}\n\treturn nil\n}\n\ntype GetUsersResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUsers []*User `protobuf:\"bytes,1,rep,name=users,proto3\" json:\"users,omitempty\"`\n}\n\nfunc (x *GetUsersResponse) Reset() {\n\t*x = GetUsersResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_user_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetUsersResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetUsersResponse) ProtoMessage() {}\n\nfunc (x *GetUsersResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_user_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetUsersResponse.ProtoReflect.Descriptor instead.\nfunc (*GetUsersResponse) Descriptor() ([]byte, []int) {\n\treturn file_user_user_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *GetUsersResponse) GetUsers() []*User {\n\tif x != nil {\n\t\treturn x.Users\n\t}\n\treturn nil\n}\n\ntype User struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId      string                `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName    string                `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tItems   []*Item               `protobuf:\"bytes,3,rep,name=items,proto3\" json:\"items,omitempty\"`\n\tProfile map[string]*anypb.Any `protobuf:\"bytes,4,rep,name=profile,proto3\" json:\"profile,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\t// Types that are assignable to Attr:\n\t//\n\t//\t*User_AttrA_\n\t//\t*User_B\n\tAttr isUser_Attr `protobuf_oneof:\"attr\"`\n}\n\nfunc (x *User) Reset() {\n\t*x = User{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_user_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *User) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*User) ProtoMessage() {}\n\nfunc (x *User) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_user_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use User.ProtoReflect.Descriptor instead.\nfunc (*User) Descriptor() ([]byte, []int) {\n\treturn file_user_user_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *User) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *User) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *User) GetItems() []*Item {\n\tif x != nil {\n\t\treturn x.Items\n\t}\n\treturn nil\n}\n\nfunc (x *User) GetProfile() map[string]*anypb.Any {\n\tif x != nil {\n\t\treturn x.Profile\n\t}\n\treturn nil\n}\n\nfunc (m *User) GetAttr() isUser_Attr {\n\tif m != nil {\n\t\treturn m.Attr\n\t}\n\treturn nil\n}\n\nfunc (x *User) GetAttrA() *User_AttrA {\n\tif x, ok := x.GetAttr().(*User_AttrA_); ok {\n\t\treturn x.AttrA\n\t}\n\treturn nil\n}\n\nfunc (x *User) GetB() *User_AttrB {\n\tif x, ok := x.GetAttr().(*User_B); ok {\n\t\treturn x.B\n\t}\n\treturn nil\n}\n\ntype isUser_Attr interface {\n\tisUser_Attr()\n}\n\ntype User_AttrA_ struct {\n\tAttrA *User_AttrA `protobuf:\"bytes,5,opt,name=attr_a,json=attrA,proto3,oneof\"`\n}\n\ntype User_B struct {\n\tB *User_AttrB `protobuf:\"bytes,6,opt,name=b,proto3,oneof\"`\n}\n\nfunc (*User_AttrA_) isUser_Attr() {}\n\nfunc (*User_B) isUser_Attr() {}\n\ntype Item struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName     string         `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tType     Item_ItemType  `protobuf:\"varint,2,opt,name=type,proto3,enum=user.Item_ItemType\" json:\"type,omitempty\"`\n\tValue    int64          `protobuf:\"varint,3,opt,name=value,proto3\" json:\"value,omitempty\"`\n\tLocation *Item_Location `protobuf:\"bytes,4,opt,name=location,proto3\" json:\"location,omitempty\"`\n}\n\nfunc (x *Item) Reset() {\n\t*x = Item{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_user_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Item) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Item) ProtoMessage() {}\n\nfunc (x *Item) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_user_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Item.ProtoReflect.Descriptor instead.\nfunc (*Item) Descriptor() ([]byte, []int) {\n\treturn file_user_user_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *Item) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Item) GetType() Item_ItemType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn Item_ITEM_TYPE_UNSPECIFIED\n}\n\nfunc (x *Item) GetValue() int64 {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn 0\n}\n\nfunc (x *Item) GetLocation() *Item_Location {\n\tif x != nil {\n\t\treturn x.Location\n\t}\n\treturn nil\n}\n\ntype User_AttrA struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tFoo string `protobuf:\"bytes,1,opt,name=foo,proto3\" json:\"foo,omitempty\"`\n}\n\nfunc (x *User_AttrA) Reset() {\n\t*x = User_AttrA{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_user_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *User_AttrA) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*User_AttrA) ProtoMessage() {}\n\nfunc (x *User_AttrA) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_user_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use User_AttrA.ProtoReflect.Descriptor instead.\nfunc (*User_AttrA) Descriptor() ([]byte, []int) {\n\treturn file_user_user_proto_rawDescGZIP(), []int{4, 1}\n}\n\nfunc (x *User_AttrA) GetFoo() string {\n\tif x != nil {\n\t\treturn x.Foo\n\t}\n\treturn \"\"\n}\n\ntype User_AttrB struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tBar bool `protobuf:\"varint,2,opt,name=bar,proto3\" json:\"bar,omitempty\"`\n}\n\nfunc (x *User_AttrB) Reset() {\n\t*x = User_AttrB{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_user_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *User_AttrB) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*User_AttrB) ProtoMessage() {}\n\nfunc (x *User_AttrB) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_user_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use User_AttrB.ProtoReflect.Descriptor instead.\nfunc (*User_AttrB) Descriptor() ([]byte, []int) {\n\treturn file_user_user_proto_rawDescGZIP(), []int{4, 2}\n}\n\nfunc (x *User_AttrB) GetBar() bool {\n\tif x != nil {\n\t\treturn x.Bar\n\t}\n\treturn false\n}\n\ntype Item_Location struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tAddr1 string `protobuf:\"bytes,1,opt,name=addr1,proto3\" json:\"addr1,omitempty\"`\n\tAddr2 string `protobuf:\"bytes,2,opt,name=addr2,proto3\" json:\"addr2,omitempty\"`\n\t// Types that are assignable to Addr3:\n\t//\n\t//\t*Item_Location_AddrA_\n\t//\t*Item_Location_B\n\tAddr3 isItem_Location_Addr3 `protobuf_oneof:\"addr3\"`\n}\n\nfunc (x *Item_Location) Reset() {\n\t*x = Item_Location{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_user_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Item_Location) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Item_Location) ProtoMessage() {}\n\nfunc (x *Item_Location) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_user_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Item_Location.ProtoReflect.Descriptor instead.\nfunc (*Item_Location) Descriptor() ([]byte, []int) {\n\treturn file_user_user_proto_rawDescGZIP(), []int{5, 0}\n}\n\nfunc (x *Item_Location) GetAddr1() string {\n\tif x != nil {\n\t\treturn x.Addr1\n\t}\n\treturn \"\"\n}\n\nfunc (x *Item_Location) GetAddr2() string {\n\tif x != nil {\n\t\treturn x.Addr2\n\t}\n\treturn \"\"\n}\n\nfunc (m *Item_Location) GetAddr3() isItem_Location_Addr3 {\n\tif m != nil {\n\t\treturn m.Addr3\n\t}\n\treturn nil\n}\n\nfunc (x *Item_Location) GetAddrA() *Item_Location_AddrA {\n\tif x, ok := x.GetAddr3().(*Item_Location_AddrA_); ok {\n\t\treturn x.AddrA\n\t}\n\treturn nil\n}\n\nfunc (x *Item_Location) GetB() *Item_Location_AddrB {\n\tif x, ok := x.GetAddr3().(*Item_Location_B); ok {\n\t\treturn x.B\n\t}\n\treturn nil\n}\n\ntype isItem_Location_Addr3 interface {\n\tisItem_Location_Addr3()\n}\n\ntype Item_Location_AddrA_ struct {\n\tAddrA *Item_Location_AddrA `protobuf:\"bytes,3,opt,name=addr_a,json=addrA,proto3,oneof\"`\n}\n\ntype Item_Location_B struct {\n\tB *Item_Location_AddrB `protobuf:\"bytes,4,opt,name=b,proto3,oneof\"`\n}\n\nfunc (*Item_Location_AddrA_) isItem_Location_Addr3() {}\n\nfunc (*Item_Location_B) isItem_Location_Addr3() {}\n\ntype Item_Location_AddrA struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tFoo string `protobuf:\"bytes,1,opt,name=foo,proto3\" json:\"foo,omitempty\"`\n}\n\nfunc (x *Item_Location_AddrA) Reset() {\n\t*x = Item_Location_AddrA{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_user_proto_msgTypes[10]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Item_Location_AddrA) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Item_Location_AddrA) ProtoMessage() {}\n\nfunc (x *Item_Location_AddrA) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_user_proto_msgTypes[10]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Item_Location_AddrA.ProtoReflect.Descriptor instead.\nfunc (*Item_Location_AddrA) Descriptor() ([]byte, []int) {\n\treturn file_user_user_proto_rawDescGZIP(), []int{5, 0, 0}\n}\n\nfunc (x *Item_Location_AddrA) GetFoo() string {\n\tif x != nil {\n\t\treturn x.Foo\n\t}\n\treturn \"\"\n}\n\ntype Item_Location_AddrB struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tBar int64 `protobuf:\"varint,1,opt,name=bar,proto3\" json:\"bar,omitempty\"`\n}\n\nfunc (x *Item_Location_AddrB) Reset() {\n\t*x = Item_Location_AddrB{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_user_user_proto_msgTypes[11]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Item_Location_AddrB) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Item_Location_AddrB) ProtoMessage() {}\n\nfunc (x *Item_Location_AddrB) ProtoReflect() protoreflect.Message {\n\tmi := &file_user_user_proto_msgTypes[11]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Item_Location_AddrB.ProtoReflect.Descriptor instead.\nfunc (*Item_Location_AddrB) Descriptor() ([]byte, []int) {\n\treturn file_user_user_proto_rawDescGZIP(), []int{5, 0, 1}\n}\n\nfunc (x *Item_Location_AddrB) GetBar() int64 {\n\tif x != nil {\n\t\treturn x.Bar\n\t}\n\treturn 0\n}\n\nvar File_user_user_proto protoreflect.FileDescriptor\n\nvar file_user_user_proto_rawDesc = []byte{\n\t0x0a, 0x0f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x04, 0x75, 0x73, 0x65, 0x72, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x22, 0x20, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x02, 0x69, 0x64, 0x22, 0x31, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52,\n\t0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65,\n\t0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x23, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x55, 0x73,\n\t0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64,\n\t0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, 0x34, 0x0a, 0x10,\n\t0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x12, 0x20, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x0a, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x75, 0x73, 0x65,\n\t0x72, 0x73, 0x22, 0xdc, 0x02, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69,\n\t0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,\n\t0x20, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a,\n\t0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d,\n\t0x73, 0x12, 0x31, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x03,\n\t0x28, 0x0b, 0x32, 0x17, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x2e, 0x50,\n\t0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x70, 0x72, 0x6f,\n\t0x66, 0x69, 0x6c, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x61, 0x74, 0x74, 0x72, 0x5f, 0x61, 0x18, 0x05,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72,\n\t0x2e, 0x41, 0x74, 0x74, 0x72, 0x41, 0x48, 0x00, 0x52, 0x05, 0x61, 0x74, 0x74, 0x72, 0x41, 0x12,\n\t0x20, 0x0a, 0x01, 0x62, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x75, 0x73, 0x65,\n\t0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x42, 0x48, 0x00, 0x52, 0x01,\n\t0x62, 0x1a, 0x50, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72,\n\t0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03,\n\t0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a,\n\t0x02, 0x38, 0x01, 0x1a, 0x19, 0x0a, 0x05, 0x41, 0x74, 0x74, 0x72, 0x41, 0x12, 0x10, 0x0a, 0x03,\n\t0x66, 0x6f, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x66, 0x6f, 0x6f, 0x1a, 0x19,\n\t0x0a, 0x05, 0x41, 0x74, 0x74, 0x72, 0x42, 0x12, 0x10, 0x0a, 0x03, 0x62, 0x61, 0x72, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x62, 0x61, 0x72, 0x42, 0x06, 0x0a, 0x04, 0x61, 0x74, 0x74,\n\t0x72, 0x22, 0xbb, 0x03, 0x0a, 0x04, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x27,\n\t0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x75,\n\t0x73, 0x65, 0x72, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x54, 0x79, 0x70,\n\t0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2f, 0x0a,\n\t0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x13, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x4c, 0x6f, 0x63, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xd4,\n\t0x01, 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x61,\n\t0x64, 0x64, 0x72, 0x31, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x64, 0x64, 0x72,\n\t0x31, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x64, 0x64, 0x72, 0x32, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x05, 0x61, 0x64, 0x64, 0x72, 0x32, 0x12, 0x32, 0x0a, 0x06, 0x61, 0x64, 0x64, 0x72, 0x5f,\n\t0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x49,\n\t0x74, 0x65, 0x6d, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x41, 0x64, 0x64,\n\t0x72, 0x41, 0x48, 0x00, 0x52, 0x05, 0x61, 0x64, 0x64, 0x72, 0x41, 0x12, 0x29, 0x0a, 0x01, 0x62,\n\t0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x49, 0x74,\n\t0x65, 0x6d, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x41, 0x64, 0x64, 0x72,\n\t0x42, 0x48, 0x00, 0x52, 0x01, 0x62, 0x1a, 0x19, 0x0a, 0x05, 0x41, 0x64, 0x64, 0x72, 0x41, 0x12,\n\t0x10, 0x0a, 0x03, 0x66, 0x6f, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x66, 0x6f,\n\t0x6f, 0x1a, 0x19, 0x0a, 0x05, 0x41, 0x64, 0x64, 0x72, 0x42, 0x12, 0x10, 0x0a, 0x03, 0x62, 0x61,\n\t0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x62, 0x61, 0x72, 0x42, 0x07, 0x0a, 0x05,\n\t0x61, 0x64, 0x64, 0x72, 0x33, 0x22, 0x58, 0x0a, 0x08, 0x49, 0x74, 0x65, 0x6d, 0x54, 0x79, 0x70,\n\t0x65, 0x12, 0x19, 0x0a, 0x15, 0x49, 0x54, 0x45, 0x4d, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55,\n\t0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b,\n\t0x49, 0x54, 0x45, 0x4d, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x31, 0x10, 0x01, 0x12, 0x0f, 0x0a,\n\t0x0b, 0x49, 0x54, 0x45, 0x4d, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x32, 0x10, 0x02, 0x12, 0x0f,\n\t0x0a, 0x0b, 0x49, 0x54, 0x45, 0x4d, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x33, 0x10, 0x03, 0x32,\n\t0x84, 0x01, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12,\n\t0x38, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x14, 0x2e, 0x75, 0x73, 0x65,\n\t0x72, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x1a, 0x15, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52,\n\t0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x08, 0x47, 0x65, 0x74,\n\t0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x15, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74,\n\t0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x75,\n\t0x73, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70,\n\t0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x58, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x2e, 0x75, 0x73,\n\t0x65, 0x72, 0x42, 0x09, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a,\n\t0x11, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x3b, 0x75, 0x73,\n\t0x65, 0x72, 0xa2, 0x02, 0x03, 0x55, 0x58, 0x58, 0xaa, 0x02, 0x04, 0x55, 0x73, 0x65, 0x72, 0xca,\n\t0x02, 0x04, 0x55, 0x73, 0x65, 0x72, 0xe2, 0x02, 0x10, 0x55, 0x73, 0x65, 0x72, 0x5c, 0x47, 0x50,\n\t0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x04, 0x55, 0x73, 0x65, 0x72,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_user_user_proto_rawDescOnce sync.Once\n\tfile_user_user_proto_rawDescData = file_user_user_proto_rawDesc\n)\n\nfunc file_user_user_proto_rawDescGZIP() []byte {\n\tfile_user_user_proto_rawDescOnce.Do(func() {\n\t\tfile_user_user_proto_rawDescData = protoimpl.X.CompressGZIP(file_user_user_proto_rawDescData)\n\t})\n\treturn file_user_user_proto_rawDescData\n}\n\nvar file_user_user_proto_enumTypes = make([]protoimpl.EnumInfo, 1)\nvar file_user_user_proto_msgTypes = make([]protoimpl.MessageInfo, 12)\nvar file_user_user_proto_goTypes = []interface{}{\n\t(Item_ItemType)(0),          // 0: user.Item.ItemType\n\t(*GetUserRequest)(nil),      // 1: user.GetUserRequest\n\t(*GetUserResponse)(nil),     // 2: user.GetUserResponse\n\t(*GetUsersRequest)(nil),     // 3: user.GetUsersRequest\n\t(*GetUsersResponse)(nil),    // 4: user.GetUsersResponse\n\t(*User)(nil),                // 5: user.User\n\t(*Item)(nil),                // 6: user.Item\n\tnil,                         // 7: user.User.ProfileEntry\n\t(*User_AttrA)(nil),          // 8: user.User.AttrA\n\t(*User_AttrB)(nil),          // 9: user.User.AttrB\n\t(*Item_Location)(nil),       // 10: user.Item.Location\n\t(*Item_Location_AddrA)(nil), // 11: user.Item.Location.AddrA\n\t(*Item_Location_AddrB)(nil), // 12: user.Item.Location.AddrB\n\t(*anypb.Any)(nil),           // 13: google.protobuf.Any\n}\nvar file_user_user_proto_depIdxs = []int32{\n\t5,  // 0: user.GetUserResponse.user:type_name -> user.User\n\t5,  // 1: user.GetUsersResponse.users:type_name -> user.User\n\t6,  // 2: user.User.items:type_name -> user.Item\n\t7,  // 3: user.User.profile:type_name -> user.User.ProfileEntry\n\t8,  // 4: user.User.attr_a:type_name -> user.User.AttrA\n\t9,  // 5: user.User.b:type_name -> user.User.AttrB\n\t0,  // 6: user.Item.type:type_name -> user.Item.ItemType\n\t10, // 7: user.Item.location:type_name -> user.Item.Location\n\t13, // 8: user.User.ProfileEntry.value:type_name -> google.protobuf.Any\n\t11, // 9: user.Item.Location.addr_a:type_name -> user.Item.Location.AddrA\n\t12, // 10: user.Item.Location.b:type_name -> user.Item.Location.AddrB\n\t1,  // 11: user.UserService.GetUser:input_type -> user.GetUserRequest\n\t3,  // 12: user.UserService.GetUsers:input_type -> user.GetUsersRequest\n\t2,  // 13: user.UserService.GetUser:output_type -> user.GetUserResponse\n\t4,  // 14: user.UserService.GetUsers:output_type -> user.GetUsersResponse\n\t13, // [13:15] is the sub-list for method output_type\n\t11, // [11:13] is the sub-list for method input_type\n\t11, // [11:11] is the sub-list for extension type_name\n\t11, // [11:11] is the sub-list for extension extendee\n\t0,  // [0:11] is the sub-list for field type_name\n}\n\nfunc init() { file_user_user_proto_init() }\nfunc file_user_user_proto_init() {\n\tif File_user_user_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_user_user_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetUserRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_user_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetUserResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_user_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetUsersRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_user_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetUsersResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_user_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*User); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_user_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Item); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_user_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*User_AttrA); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_user_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*User_AttrB); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_user_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Item_Location); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_user_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Item_Location_AddrA); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_user_user_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Item_Location_AddrB); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\tfile_user_user_proto_msgTypes[4].OneofWrappers = []interface{}{\n\t\t(*User_AttrA_)(nil),\n\t\t(*User_B)(nil),\n\t}\n\tfile_user_user_proto_msgTypes[9].OneofWrappers = []interface{}{\n\t\t(*Item_Location_AddrA_)(nil),\n\t\t(*Item_Location_B)(nil),\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_user_user_proto_rawDesc,\n\t\t\tNumEnums:      1,\n\t\t\tNumMessages:   12,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_user_user_proto_goTypes,\n\t\tDependencyIndexes: file_user_user_proto_depIdxs,\n\t\tEnumInfos:         file_user_user_proto_enumTypes,\n\t\tMessageInfos:      file_user_user_proto_msgTypes,\n\t}.Build()\n\tFile_user_user_proto = out.File\n\tfile_user_user_proto_rawDesc = nil\n\tfile_user_user_proto_goTypes = nil\n\tfile_user_user_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/13_map/user/user_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: user/user.proto\n\npackage user\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tUserService_GetUser_FullMethodName  = \"/user.UserService/GetUser\"\n\tUserService_GetUsers_FullMethodName = \"/user.UserService/GetUsers\"\n)\n\n// UserServiceClient is the client API for UserService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype UserServiceClient interface {\n\tGetUser(ctx context.Context, in *GetUserRequest, opts ...grpc.CallOption) (*GetUserResponse, error)\n\tGetUsers(ctx context.Context, in *GetUsersRequest, opts ...grpc.CallOption) (*GetUsersResponse, error)\n}\n\ntype userServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewUserServiceClient(cc grpc.ClientConnInterface) UserServiceClient {\n\treturn &userServiceClient{cc}\n}\n\nfunc (c *userServiceClient) GetUser(ctx context.Context, in *GetUserRequest, opts ...grpc.CallOption) (*GetUserResponse, error) {\n\tout := new(GetUserResponse)\n\terr := c.cc.Invoke(ctx, UserService_GetUser_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *userServiceClient) GetUsers(ctx context.Context, in *GetUsersRequest, opts ...grpc.CallOption) (*GetUsersResponse, error) {\n\tout := new(GetUsersResponse)\n\terr := c.cc.Invoke(ctx, UserService_GetUsers_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// UserServiceServer is the server API for UserService service.\n// All implementations must embed UnimplementedUserServiceServer\n// for forward compatibility\ntype UserServiceServer interface {\n\tGetUser(context.Context, *GetUserRequest) (*GetUserResponse, error)\n\tGetUsers(context.Context, *GetUsersRequest) (*GetUsersResponse, error)\n\tmustEmbedUnimplementedUserServiceServer()\n}\n\n// UnimplementedUserServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedUserServiceServer struct {\n}\n\nfunc (UnimplementedUserServiceServer) GetUser(context.Context, *GetUserRequest) (*GetUserResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetUser not implemented\")\n}\nfunc (UnimplementedUserServiceServer) GetUsers(context.Context, *GetUsersRequest) (*GetUsersResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetUsers not implemented\")\n}\nfunc (UnimplementedUserServiceServer) mustEmbedUnimplementedUserServiceServer() {}\n\n// UnsafeUserServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to UserServiceServer will\n// result in compilation errors.\ntype UnsafeUserServiceServer interface {\n\tmustEmbedUnimplementedUserServiceServer()\n}\n\nfunc RegisterUserServiceServer(s grpc.ServiceRegistrar, srv UserServiceServer) {\n\ts.RegisterService(&UserService_ServiceDesc, srv)\n}\n\nfunc _UserService_GetUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetUserRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServiceServer).GetUser(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: UserService_GetUser_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServiceServer).GetUser(ctx, req.(*GetUserRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _UserService_GetUsers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetUsersRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UserServiceServer).GetUsers(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: UserService_GetUsers_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UserServiceServer).GetUsers(ctx, req.(*GetUsersRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// UserService_ServiceDesc is the grpc.ServiceDesc for UserService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar UserService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"user.UserService\",\n\tHandlerType: (*UserServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetUser\",\n\t\t\tHandler:    _UserService_GetUser_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetUsers\",\n\t\t\tHandler:    _UserService_GetUsers_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"user/user.proto\",\n}\n"
  },
  {
    "path": "_examples/14_condition/.gitignore",
    "content": "grpc/federation\n"
  },
  {
    "path": "_examples/14_condition/Makefile",
    "content": "MAKEFILE_DIR := $(dir $(lastword $(MAKEFILE_LIST)))\nGOBIN := $(MAKEFILE_DIR)/../../bin\nPATH := $(GOBIN):$(PATH)\n\nJAEGER_IMAGE := jaegertracing/all-in-one:latest\n\n.PHONY: generate\ngenerate:\n\t$(GOBIN)/buf generate\n\n.PHONY: lint\nlint:\n\t@$(GOBIN)/grpc-federation-linter -Iproto -Iproto_deps ./proto/federation/federation.proto\n\n.PHONY: test\ntest:\n\tgo test -race ./ -count=1\n\n.PHONY: grpc-federation/generate\ngrpc-federation/generate:\n\t@$(GOBIN)/grpc-federation-generator ./proto/federation/federation.proto\n\n.PHONY: grpc-federation/watch\ngrpc-federation/watch:\n\t@$(GOBIN)/grpc-federation-generator -w\n\n.PHONY: jaeger/start\njaeger/start:\n\t@docker run \\\n\t\t-e COLLECTOR_OTLP_ENABLED=true \\\n\t\t-p 16686:16686 \\\n\t\t-p 4317:4317 \\\n\t\t-p 4318:4318 \\\n\t\t-d \\\n\t\t$(JAEGER_IMAGE)\n\n.PHONY: jaeger/stop\njaeger/stop:\n\t@docker stop $(shell docker ps -q  --filter ancestor=$(JAEGER_IMAGE))\n"
  },
  {
    "path": "_examples/14_condition/buf.gen.yaml",
    "content": "version: v1\nmanaged:\n  enabled: true\nplugins:\n  - plugin: go\n    out: .\n    opt: paths=source_relative\n  - plugin: go-grpc\n    out: .\n    opt: paths=source_relative\n  - plugin: grpc-federation\n    out: .\n    opt:\n    - paths=source_relative\n    - import_paths=proto\n"
  },
  {
    "path": "_examples/14_condition/buf.work.yaml",
    "content": "version: v1\ndirectories:\n  - proto\n  - proto_deps\n"
  },
  {
    "path": "_examples/14_condition/federation/federation.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\t_ \"google.golang.org/protobuf/types/known/anypb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype GetPostRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetPostRequest) Reset() {\n\t*x = GetPostRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostRequest) ProtoMessage() {}\n\nfunc (x *GetPostRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostRequest.ProtoReflect.Descriptor instead.\nfunc (*GetPostRequest) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetPostRequest) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\ntype GetPostResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPost *Post `protobuf:\"bytes,1,opt,name=post,proto3\" json:\"post,omitempty\"`\n}\n\nfunc (x *GetPostResponse) Reset() {\n\t*x = GetPostResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostResponse) ProtoMessage() {}\n\nfunc (x *GetPostResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostResponse.ProtoReflect.Descriptor instead.\nfunc (*GetPostResponse) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetPostResponse) GetPost() *Post {\n\tif x != nil {\n\t\treturn x.Post\n\t}\n\treturn nil\n}\n\ntype Post struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId    string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tTitle string `protobuf:\"bytes,2,opt,name=title,proto3\" json:\"title,omitempty\"`\n\tUser  *User  `protobuf:\"bytes,4,opt,name=user,proto3\" json:\"user,omitempty\"`\n}\n\nfunc (x *Post) Reset() {\n\t*x = Post{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Post) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Post) ProtoMessage() {}\n\nfunc (x *Post) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Post.ProtoReflect.Descriptor instead.\nfunc (*Post) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *Post) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetTitle() string {\n\tif x != nil {\n\t\treturn x.Title\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetUser() *User {\n\tif x != nil {\n\t\treturn x.User\n\t}\n\treturn nil\n}\n\ntype User struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *User) Reset() {\n\t*x = User{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *User) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*User) ProtoMessage() {}\n\nfunc (x *User) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use User.ProtoReflect.Descriptor instead.\nfunc (*User) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *User) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nvar File_federation_federation_proto protoreflect.FileDescriptor\n\nvar file_federation_federation_proto_rawDesc = []byte{\n\t0x0a, 0x1b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x6f,\n\t0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x19, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61,\n\t0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x20, 0x0a, 0x0e, 0x47, 0x65,\n\t0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02,\n\t0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x67, 0x0a, 0x0f,\n\t0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,\n\t0x33, 0x0a, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e,\n\t0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50,\n\t0x6f, 0x73, 0x74, 0x42, 0x09, 0x9a, 0x4a, 0x06, 0x12, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x52, 0x04,\n\t0x70, 0x6f, 0x73, 0x74, 0x3a, 0x1f, 0x9a, 0x4a, 0x1c, 0x0a, 0x1a, 0x0a, 0x04, 0x70, 0x6f, 0x73,\n\t0x74, 0x6a, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x73, 0x74, 0x12, 0x0a, 0x0a, 0x02, 0x69, 0x64, 0x12,\n\t0x04, 0x24, 0x2e, 0x69, 0x64, 0x22, 0xa3, 0x03, 0x0a, 0x04, 0x50, 0x6f, 0x73, 0x74, 0x12, 0x1c,\n\t0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0x9a, 0x4a, 0x09, 0x12,\n\t0x07, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x69, 0x64, 0x52, 0x02, 0x69, 0x64, 0x12, 0x25, 0x0a, 0x05,\n\t0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0f, 0x9a, 0x4a, 0x0c,\n\t0x12, 0x0a, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x52, 0x05, 0x74, 0x69,\n\t0x74, 0x6c, 0x65, 0x12, 0x37, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x42, 0x0d, 0x9a, 0x4a, 0x0a, 0x12, 0x08, 0x75, 0x73,\n\t0x65, 0x72, 0x73, 0x5b, 0x30, 0x5d, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x9c, 0x02, 0x9a,\n\t0x4a, 0x98, 0x02, 0x0a, 0x39, 0x0a, 0x03, 0x72, 0x65, 0x73, 0x12, 0x0a, 0x24, 0x2e, 0x69, 0x64,\n\t0x20, 0x21, 0x3d, 0x20, 0x27, 0x27, 0x72, 0x26, 0x0a, 0x18, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x50,\n\t0x6f, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x47, 0x65, 0x74, 0x50, 0x6f,\n\t0x73, 0x74, 0x12, 0x0a, 0x0a, 0x02, 0x69, 0x64, 0x12, 0x04, 0x24, 0x2e, 0x69, 0x64, 0x0a, 0x1d,\n\t0x0a, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x12, 0x0b, 0x72, 0x65, 0x73, 0x20, 0x21, 0x3d, 0x20, 0x6e,\n\t0x75, 0x6c, 0x6c, 0x5a, 0x08, 0x72, 0x65, 0x73, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x0a, 0x35, 0x0a,\n\t0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x0c, 0x70, 0x6f, 0x73, 0x74, 0x20, 0x21, 0x3d, 0x20, 0x6e,\n\t0x75, 0x6c, 0x6c, 0x6a, 0x1f, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x75,\n\t0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x12, 0x0c, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x75, 0x73, 0x65,\n\t0x72, 0x5f, 0x69, 0x64, 0x0a, 0x0f, 0x0a, 0x05, 0x70, 0x6f, 0x73, 0x74, 0x73, 0x5a, 0x06, 0x5b,\n\t0x70, 0x6f, 0x73, 0x74, 0x5d, 0x0a, 0x47, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x12, 0x0c,\n\t0x75, 0x73, 0x65, 0x72, 0x20, 0x21, 0x3d, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x62, 0x30, 0x0a, 0x0d,\n\t0x0a, 0x04, 0x69, 0x74, 0x65, 0x72, 0x12, 0x05, 0x70, 0x6f, 0x73, 0x74, 0x73, 0x62, 0x1f, 0x0a,\n\t0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64,\n\t0x12, 0x0c, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x0a, 0x2b,\n\t0x12, 0x10, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x29, 0x20, 0x3e,\n\t0x20, 0x30, 0x7a, 0x17, 0x12, 0x15, 0x12, 0x11, 0x75, 0x73, 0x65, 0x72, 0x73, 0x5b, 0x30, 0x5d,\n\t0x2e, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x27, 0x18, 0x03, 0x22, 0x26, 0x0a, 0x04, 0x55,\n\t0x73, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42,\n\t0x0e, 0x9a, 0x4a, 0x0b, 0x12, 0x09, 0x24, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x52,\n\t0x02, 0x69, 0x64, 0x32, 0x66, 0x0a, 0x11, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4c, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x50,\n\t0x6f, 0x73, 0x74, 0x12, 0x1e, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75,\n\t0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70,\n\t0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x1a, 0x03, 0x9a, 0x4a, 0x00, 0x42, 0xb1, 0x01, 0x9a, 0x4a,\n\t0x11, 0x12, 0x0f, 0x70, 0x6f, 0x73, 0x74, 0x2f, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0f, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x1d, 0x65, 0x78, 0x61, 0x6d, 0x70,\n\t0x6c, 0x65, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xa2, 0x02, 0x03, 0x4f, 0x46, 0x58, 0xaa, 0x02,\n\t0x0e, 0x4f, 0x72, 0x67, 0x2e, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xca,\n\t0x02, 0x0e, 0x4f, 0x72, 0x67, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0xe2, 0x02, 0x1a, 0x4f, 0x72, 0x67, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0f,\n\t0x4f, 0x72, 0x67, 0x3a, 0x3a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62,\n\t0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_federation_federation_proto_rawDescOnce sync.Once\n\tfile_federation_federation_proto_rawDescData = file_federation_federation_proto_rawDesc\n)\n\nfunc file_federation_federation_proto_rawDescGZIP() []byte {\n\tfile_federation_federation_proto_rawDescOnce.Do(func() {\n\t\tfile_federation_federation_proto_rawDescData = protoimpl.X.CompressGZIP(file_federation_federation_proto_rawDescData)\n\t})\n\treturn file_federation_federation_proto_rawDescData\n}\n\nvar file_federation_federation_proto_msgTypes = make([]protoimpl.MessageInfo, 4)\nvar file_federation_federation_proto_goTypes = []interface{}{\n\t(*GetPostRequest)(nil),  // 0: org.federation.GetPostRequest\n\t(*GetPostResponse)(nil), // 1: org.federation.GetPostResponse\n\t(*Post)(nil),            // 2: org.federation.Post\n\t(*User)(nil),            // 3: org.federation.User\n}\nvar file_federation_federation_proto_depIdxs = []int32{\n\t2, // 0: org.federation.GetPostResponse.post:type_name -> org.federation.Post\n\t3, // 1: org.federation.Post.user:type_name -> org.federation.User\n\t0, // 2: org.federation.FederationService.GetPost:input_type -> org.federation.GetPostRequest\n\t1, // 3: org.federation.FederationService.GetPost:output_type -> org.federation.GetPostResponse\n\t3, // [3:4] is the sub-list for method output_type\n\t2, // [2:3] is the sub-list for method input_type\n\t2, // [2:2] is the sub-list for extension type_name\n\t2, // [2:2] is the sub-list for extension extendee\n\t0, // [0:2] is the sub-list for field type_name\n}\n\nfunc init() { file_federation_federation_proto_init() }\nfunc file_federation_federation_proto_init() {\n\tif File_federation_federation_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_federation_federation_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Post); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*User); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_federation_federation_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   4,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_federation_federation_proto_goTypes,\n\t\tDependencyIndexes: file_federation_federation_proto_depIdxs,\n\t\tMessageInfos:      file_federation_federation_proto_msgTypes,\n\t}.Build()\n\tFile_federation_federation_proto = out.File\n\tfile_federation_federation_proto_rawDesc = nil\n\tfile_federation_federation_proto_goTypes = nil\n\tfile_federation_federation_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/14_condition/federation/federation_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tFederationService_GetPost_FullMethodName = \"/org.federation.FederationService/GetPost\"\n)\n\n// FederationServiceClient is the client API for FederationService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype FederationServiceClient interface {\n\tGetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error)\n}\n\ntype federationServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewFederationServiceClient(cc grpc.ClientConnInterface) FederationServiceClient {\n\treturn &federationServiceClient{cc}\n}\n\nfunc (c *federationServiceClient) GetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error) {\n\tout := new(GetPostResponse)\n\terr := c.cc.Invoke(ctx, FederationService_GetPost_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// FederationServiceServer is the server API for FederationService service.\n// All implementations must embed UnimplementedFederationServiceServer\n// for forward compatibility\ntype FederationServiceServer interface {\n\tGetPost(context.Context, *GetPostRequest) (*GetPostResponse, error)\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\n// UnimplementedFederationServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedFederationServiceServer struct {\n}\n\nfunc (UnimplementedFederationServiceServer) GetPost(context.Context, *GetPostRequest) (*GetPostResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetPost not implemented\")\n}\nfunc (UnimplementedFederationServiceServer) mustEmbedUnimplementedFederationServiceServer() {}\n\n// UnsafeFederationServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to FederationServiceServer will\n// result in compilation errors.\ntype UnsafeFederationServiceServer interface {\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\nfunc RegisterFederationServiceServer(s grpc.ServiceRegistrar, srv FederationServiceServer) {\n\ts.RegisterService(&FederationService_ServiceDesc, srv)\n}\n\nfunc _FederationService_GetPost_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetPostRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(FederationServiceServer).GetPost(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: FederationService_GetPost_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(FederationServiceServer).GetPost(ctx, req.(*GetPostRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// FederationService_ServiceDesc is the grpc.ServiceDesc for FederationService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar FederationService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"org.federation.FederationService\",\n\tHandlerType: (*FederationServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetPost\",\n\t\t\tHandler:    _FederationService_GetPost_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"federation/federation.proto\",\n}\n"
  },
  {
    "path": "_examples/14_condition/federation/federation_grpc_federation.pb.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: federation/federation.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n\n\tpost \"example/post\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Org_Federation_GetPostResponseVariable represents variable definitions in \"org.federation.GetPostResponse\".\ntype FederationService_Org_Federation_GetPostResponseVariable struct {\n\tPost *Post\n}\n\n// Org_Federation_GetPostResponseArgument is argument for \"org.federation.GetPostResponse\" message.\ntype FederationService_Org_Federation_GetPostResponseArgument struct {\n\tId string\n\tFederationService_Org_Federation_GetPostResponseVariable\n}\n\n// Org_Federation_PostVariable represents variable definitions in \"org.federation.Post\".\ntype FederationService_Org_Federation_PostVariable struct {\n\tPost  *post.Post\n\tPosts []*post.Post\n\tRes   *post.GetPostResponse\n\tUser  *User\n\tUsers []*User\n}\n\n// Org_Federation_PostArgument is argument for \"org.federation.Post\" message.\ntype FederationService_Org_Federation_PostArgument struct {\n\tId string\n\tFederationService_Org_Federation_PostVariable\n}\n\n// Org_Federation_UserVariable represents variable definitions in \"org.federation.User\".\ntype FederationService_Org_Federation_UserVariable struct {\n}\n\n// Org_Federation_UserArgument is argument for \"org.federation.User\" message.\ntype FederationService_Org_Federation_UserArgument struct {\n\tUserId string\n\tFederationService_Org_Federation_UserVariable\n}\n\n// FederationServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationServiceConfig struct {\n\t// Client provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\n\t// If this interface is not provided, an error is returned during initialization.\n\tClient FederationServiceClientFactory // required\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationServiceClientFactory interface {\n\t// Post_PostServiceClient create a gRPC Client to be used to call methods in post.PostService.\n\tPost_PostServiceClient(FederationServiceClientConfig) (post.PostServiceClient, error)\n}\n\n// FederationServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationServiceDependentClientSet struct {\n\tPost_PostServiceClient post.PostServiceClient\n}\n\n// FederationServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationServiceResolver interface {\n}\n\n// FederationServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// FederationServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationServiceUnimplementedResolver struct{}\n\nconst (\n\tFederationService_DependentMethod_Post_PostService_GetPost = \"/post.PostService/GetPost\"\n)\n\n// FederationService represents Federation Service.\ntype FederationService struct {\n\tUnimplementedFederationServiceServer\n\tcfg             FederationServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationServiceDependentClientSet\n}\n\n// NewFederationService creates FederationService instance by FederationServiceConfig.\nfunc NewFederationService(cfg FederationServiceConfig) (*FederationService, error) {\n\tif cfg.Client == nil {\n\t\treturn nil, grpcfed.ErrClientConfig\n\t}\n\tPost_PostServiceClient, err := cfg.Client.Post_PostServiceClient(FederationServiceClientConfig{\n\t\tService: \"post.PostService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"org.federation.FederationService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.org.federation.GetPostResponseArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.PostArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.UserArgument\": {\n\t\t\t\"user_id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"UserId\"),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"org.federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.GRPCErrorAccessorOptions(celTypeHelper, \"post.GetPostResponse\")...)\n\tsvc := &FederationService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tclient: &FederationServiceDependentClientSet{\n\t\t\tPost_PostServiceClient: Post_PostServiceClient,\n\t\t},\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationService(ctx context.Context, svc *FederationService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n// GetPost implements \"org.federation.FederationService/GetPost\" method.\nfunc (s *FederationService) GetPost(ctx context.Context, req *GetPostRequest) (res *GetPostResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.FederationService/GetPost\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Org_Federation_GetPostResponse(ctx, &FederationService_Org_Federation_GetPostResponseArgument{\n\t\tId: req.GetId(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Org_Federation_GetPostResponse resolve \"org.federation.GetPostResponse\" message.\nfunc (s *FederationService) resolve_Org_Federation_GetPostResponse(ctx context.Context, req *FederationService_Org_Federation_GetPostResponseArgument) (*GetPostResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.GetPostResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.GetPostResponse\", slog.Any(\"message_args\", s.logvalue_Org_Federation_GetPostResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tPost *Post\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.GetPostResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"post\"\n\t\t  message {\n\t\t    name: \"Post\"\n\t\t    args { name: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_post := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Post, *localValueType]{\n\t\t\tName: `post`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.Post\"),\n\t\t\tSetter: func(value *localValueType, v *Post) error {\n\t\t\t\tvalue.vars.Post = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_PostArgument{}\n\t\t\t\t// { name: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 1,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_Post(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_post(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_GetPostResponseVariable.Post = value.vars.Post\n\n\t// create a message value to be returned.\n\tret := &GetPostResponse{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"post\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*Post]{\n\t\tValue:      value,\n\t\tExpr:       `post`,\n\t\tCacheIndex: 2,\n\t\tSetter: func(v *Post) error {\n\t\t\tret.Post = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.GetPostResponse\", slog.Any(\"org.federation.GetPostResponse\", s.logvalue_Org_Federation_GetPostResponse(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_Post resolve \"org.federation.Post\" message.\nfunc (s *FederationService) resolve_Org_Federation_Post(ctx context.Context, req *FederationService_Org_Federation_PostArgument) (*Post, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.Post\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.Post\", slog.Any(\"message_args\", s.logvalue_Org_Federation_PostArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tPost  *post.Post\n\t\t\tPosts []*post.Post\n\t\t\tRes   *post.GetPostResponse\n\t\t\tUser  *User\n\t\t\tUsers []*User\n\t\t\tXDef5 bool\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.PostArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  if: \"$.id != ''\"\n\t\t  call {\n\t\t    method: \"post.PostService/GetPost\"\n\t\t    request { field: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.GetPostResponse, *localValueType]{\n\t\t\tIf:           `$.id != ''`,\n\t\t\tIfCacheIndex: 3,\n\t\t\tName:         `res`,\n\t\t\tType:         grpcfed.CELObjectType(\"post.GetPostResponse\"),\n\t\t\tSetter: func(value *localValueType, v *post.GetPostResponse) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &post.GetPostRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 4,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call post.PostService/GetPost\", slog.Any(\"post.GetPostRequest\", s.logvalue_Post_GetPostRequest(args)))\n\t\t\t\tret, err := s.client.Post_PostServiceClient.GetPost(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Post_PostService_GetPost, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"post\"\n\t\t  if: \"res != null\"\n\t\t  by: \"res.post\"\n\t\t}\n\t*/\n\tdef_post := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.Post, *localValueType]{\n\t\t\tIf:           `res != null`,\n\t\t\tIfCacheIndex: 5,\n\t\t\tName:         `post`,\n\t\t\tType:         grpcfed.CELObjectType(\"post.Post\"),\n\t\t\tSetter: func(value *localValueType, v *post.Post) error {\n\t\t\t\tvalue.vars.Post = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `res.post`,\n\t\t\tByCacheIndex: 6,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"user\"\n\t\t  if: \"post != null\"\n\t\t  message {\n\t\t    name: \"User\"\n\t\t    args { name: \"user_id\", by: \"post.user_id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_user := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*User, *localValueType]{\n\t\t\tIf:           `post != null`,\n\t\t\tIfCacheIndex: 7,\n\t\t\tName:         `user`,\n\t\t\tType:         grpcfed.CELObjectType(\"org.federation.User\"),\n\t\t\tSetter: func(value *localValueType, v *User) error {\n\t\t\t\tvalue.vars.User = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_UserArgument{}\n\t\t\t\t// { name: \"user_id\", by: \"post.user_id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `post.user_id`,\n\t\t\t\t\tCacheIndex: 8,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.UserId = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_User(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"posts\"\n\t\t  by: \"[post]\"\n\t\t}\n\t*/\n\tdef_posts := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[[]*post.Post, *localValueType]{\n\t\t\tName: `posts`,\n\t\t\tType: grpcfed.CELListType(grpcfed.CELObjectType(\"post.Post\")),\n\t\t\tSetter: func(value *localValueType, v []*post.Post) error {\n\t\t\t\tvalue.vars.Posts = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `[post]`,\n\t\t\tByCacheIndex: 9,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"users\"\n\t\t  if: \"user != null\"\n\t\t  map {\n\t\t    iterator {\n\t\t      name: \"iter\"\n\t\t      src: \"posts\"\n\t\t    }\n\t\t    message {\n\t\t      name: \"User\"\n\t\t      args { name: \"user_id\", by: \"iter.user_id\" }\n\t\t    }\n\t\t  }\n\t\t}\n\t*/\n\tdef_users := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDefMap(ctx, value, grpcfed.DefMap[[]*User, *post.Post, *localValueType]{\n\t\t\tIf:           `user != null`,\n\t\t\tIfCacheIndex: 10,\n\t\t\tName:         `users`,\n\t\t\tType:         grpcfed.CELListType(grpcfed.CELObjectType(\"org.federation.User\")),\n\t\t\tSetter: func(value *localValueType, v []*User) error {\n\t\t\t\tvalue.vars.Users = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tIteratorName:   `iter`,\n\t\t\tIteratorType:   grpcfed.CELObjectType(\"post.Post\"),\n\t\t\tIteratorSource: func(value *localValueType) []*post.Post { return value.vars.Posts },\n\t\t\tIterator: func(ctx context.Context, value *grpcfed.MapIteratorValue) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_UserArgument{}\n\t\t\t\t// { name: \"user_id\", by: \"iter.user_id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `iter.user_id`,\n\t\t\t\t\tCacheIndex: 11,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.UserId = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn s.resolve_Org_Federation_User(ctx, args)\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"_def5\"\n\t\t  if: \"users.size() > 0\"\n\t\t  validation {\n\t\t    error {\n\t\t      code: INVALID_ARGUMENT\n\t\t      if: \"users[0].id == ''\"\n\t\t    }\n\t\t  }\n\t\t}\n\t*/\n\tdef__def5 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[bool, *localValueType]{\n\t\t\tIf:           `users.size() > 0`,\n\t\t\tIfCacheIndex: 12,\n\t\t\tName:         `_def5`,\n\t\t\tType:         grpcfed.CELBoolType,\n\t\t\tSetter: func(value *localValueType, v bool) error {\n\t\t\t\tvalue.vars.XDef5 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tValidation: func(ctx context.Context, value *localValueType) error {\n\t\t\t\tvar stat *grpcfed.Status\n\t\t\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `users[0].id == ''`,\n\t\t\t\t\tCacheIndex: 13,\n\t\t\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t\t\terrorMessage := \"error\"\n\t\t\t\t\t\tstat = grpcfed.NewGRPCStatus(grpcfed.InvalidArgumentCode, errorMessage)\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\treturn grpcfed.NewErrorWithLogAttrs(stat.Err(), slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t},\n\t\t})\n\t}\n\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_post(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_posts(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_post(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_user(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\tif err := def_users(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\tif err := def__def5(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_PostVariable.Post = value.vars.Post\n\treq.FederationService_Org_Federation_PostVariable.Posts = value.vars.Posts\n\treq.FederationService_Org_Federation_PostVariable.Res = value.vars.Res\n\treq.FederationService_Org_Federation_PostVariable.User = value.vars.User\n\treq.FederationService_Org_Federation_PostVariable.Users = value.vars.Users\n\n\t// create a message value to be returned.\n\tret := &Post{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"post.id\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `post.id`,\n\t\tCacheIndex: 14,\n\t\tSetter: func(v string) error {\n\t\t\tret.Id = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"post.title\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `post.title`,\n\t\tCacheIndex: 15,\n\t\tSetter: func(v string) error {\n\t\t\tret.Title = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"users[0]\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*User]{\n\t\tValue:      value,\n\t\tExpr:       `users[0]`,\n\t\tCacheIndex: 16,\n\t\tSetter: func(v *User) error {\n\t\t\tret.User = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.Post\", slog.Any(\"org.federation.Post\", s.logvalue_Org_Federation_Post(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_User resolve \"org.federation.User\" message.\nfunc (s *FederationService) resolve_Org_Federation_User(ctx context.Context, req *FederationService_Org_Federation_UserArgument) (*User, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.User\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.User\", slog.Any(\"message_args\", s.logvalue_Org_Federation_UserArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.UserArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &User{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"$.user_id\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `$.user_id`,\n\t\tCacheIndex: 17,\n\t\tSetter: func(v string) error {\n\t\t\tret.Id = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.User\", slog.Any(\"org.federation.User\", s.logvalue_Org_Federation_User(ret)))\n\treturn ret, nil\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostResponse(v *GetPostResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"post\", s.logvalue_Org_Federation_Post(v.GetPost())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostResponseArgument(v *FederationService_Org_Federation_GetPostResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_Post(v *Post) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.String(\"title\", v.GetTitle()),\n\t\tslog.Any(\"user\", s.logvalue_Org_Federation_User(v.GetUser())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_PostArgument(v *FederationService_Org_Federation_PostArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_User(v *User) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_UserArgument(v *FederationService_Org_Federation_UserArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"user_id\", v.UserId),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Post_GetPostRequest(v *post.GetPostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Post_GetPostsRequest(v *post.GetPostsRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.GetIds()),\n\t)\n}\n"
  },
  {
    "path": "_examples/14_condition/go.mod",
    "content": "module example\n\ngo 1.24.0\n\nreplace github.com/mercari/grpc-federation => ../../\n\nrequire (\n\tgithub.com/google/go-cmp v0.7.0\n\tgithub.com/mercari/grpc-federation v0.0.0-00010101000000-000000000000\n\tgo.opentelemetry.io/otel v1.24.0\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0\n\tgo.opentelemetry.io/otel/sdk v1.24.0\n\tgo.opentelemetry.io/otel/trace v1.24.0\n\tgo.uber.org/goleak v1.3.0\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7\n\tgoogle.golang.org/grpc v1.65.0\n\tgoogle.golang.org/protobuf v1.34.2\n)\n\nrequire (\n\tcel.dev/expr v0.19.1 // indirect\n\tgithub.com/antlr4-go/antlr/v4 v4.13.0 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.2.1 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/goccy/wasi-go v0.3.2 // indirect\n\tgithub.com/google/cel-go v0.23.1 // indirect\n\tgithub.com/google/uuid v1.6.0 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect\n\tgithub.com/kelseyhightower/envconfig v1.4.0 // indirect\n\tgithub.com/stealthrocket/wazergo v0.19.1 // indirect\n\tgithub.com/stoewer/go-strcase v1.3.0 // indirect\n\tgithub.com/tetratelabs/wazero v1.10.1 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.24.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.0.0 // indirect\n\tgolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect\n\tgolang.org/x/net v0.38.0 // indirect\n\tgolang.org/x/sync v0.14.0 // indirect\n\tgolang.org/x/sys v0.37.0 // indirect\n\tgolang.org/x/text v0.23.0 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 // indirect\n)\n"
  },
  {
    "path": "_examples/14_condition/go.sum",
    "content": "cel.dev/expr v0.19.1 h1:NciYrtDRIR0lNCnH1LFJegdjspNx9fI59O7TWcua/W4=\ncel.dev/expr v0.19.1/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw=\ngithub.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=\ngithub.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/goccy/wasi-go v0.3.2 h1:wAvGXmqCkfcp0B0AwIp5Ya53hzDwkKm9W8iuT3nCCz0=\ngithub.com/goccy/wasi-go v0.3.2/go.mod h1:nIKD204n9xa4Z20UV+XA483kIr9TAl2vXr+X5qVAO5M=\ngithub.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4=\ngithub.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=\ngithub.com/google/cel-go v0.23.1 h1:91ThhEZlBcE5rB2adBVXqvDoqdL8BG2oyhd0bK1I/r4=\ngithub.com/google/cel-go v0.23.1/go.mod h1:52Pb6QsDbC5kvgxvZhiL9QX1oZEkcUF/ZqaPx1J5Wwo=\ngithub.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\ngithub.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg=\ngithub.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=\ngithub.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/stealthrocket/wazergo v0.19.1 h1:BPrITETPgSFwiytwmToO0MbUC/+RGC39JScz1JmmG6c=\ngithub.com/stealthrocket/wazergo v0.19.1/go.mod h1:riI0hxw4ndZA5e6z7PesHg2BtTftcZaMxRcoiGGipTs=\ngithub.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs=\ngithub.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tetratelabs/wazero v1.10.1 h1:2DugeJf6VVk58KTPszlNfeeN8AhhpwcZqkJj2wwFuH8=\ngithub.com/tetratelabs/wazero v1.10.1/go.mod h1:DRm5twOQ5Gr1AoEdSi0CLjDQF1J9ZAuyqFIjl1KKfQU=\ngo.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo=\ngo.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0=\ngo.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI=\ngo.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=\ngo.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw=\ngo.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg=\ngo.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=\ngo.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=\ngo.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=\ngo.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=\ngolang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=\ngolang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=\ngolang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=\ngolang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=\ngolang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=\ngolang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=\ngolang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 h1:YcyjlL1PRr2Q17/I0dPk2JmYS5CDXfcdb2Z3YRioEbw=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7 h1:2035KHhUv+EpyB+hWgJnaWKJOdX1E95w2S8Rr4uWKTs=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=\ngoogle.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=\ngoogle.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=\ngoogle.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=\ngoogle.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "_examples/14_condition/grpc/federation/federation.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: grpc/federation/federation.proto\n\npackage federation\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\tcode \"google.golang.org/genproto/googleapis/rpc/code\"\n\terrdetails \"google.golang.org/genproto/googleapis/rpc/errdetails\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tdescriptorpb \"google.golang.org/protobuf/types/descriptorpb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// TypeKind is primitive kind list.\ntype TypeKind int32\n\nconst (\n\t// UNKNOWN represents unexpected value.\n\tTypeKind_UNKNOWN TypeKind = 0\n\t// STRING is used to convert the input value to `string` type.\n\tTypeKind_STRING TypeKind = 1\n\t// BOOL is used to convert the input value to `bool` type.\n\tTypeKind_BOOL TypeKind = 2\n\t// INT64 is used to convert the input value to `int64` type.\n\tTypeKind_INT64 TypeKind = 3\n\t// UINT64 is used to convert the input value to `uint64` type.\n\tTypeKind_UINT64 TypeKind = 4\n\t// DOUBLE is used to convert the input value to `double` type.\n\tTypeKind_DOUBLE TypeKind = 5\n\t// DURATION is used to convert the input value to the `google.protobuf.Duration` type.\n\tTypeKind_DURATION TypeKind = 6\n)\n\n// Enum value maps for TypeKind.\nvar (\n\tTypeKind_name = map[int32]string{\n\t\t0: \"UNKNOWN\",\n\t\t1: \"STRING\",\n\t\t2: \"BOOL\",\n\t\t3: \"INT64\",\n\t\t4: \"UINT64\",\n\t\t5: \"DOUBLE\",\n\t\t6: \"DURATION\",\n\t}\n\tTypeKind_value = map[string]int32{\n\t\t\"UNKNOWN\":  0,\n\t\t\"STRING\":   1,\n\t\t\"BOOL\":     2,\n\t\t\"INT64\":    3,\n\t\t\"UINT64\":   4,\n\t\t\"DOUBLE\":   5,\n\t\t\"DURATION\": 6,\n\t}\n)\n\nfunc (x TypeKind) Enum() *TypeKind {\n\tp := new(TypeKind)\n\t*p = x\n\treturn p\n}\n\nfunc (x TypeKind) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (TypeKind) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_grpc_federation_federation_proto_enumTypes[0].Descriptor()\n}\n\nfunc (TypeKind) Type() protoreflect.EnumType {\n\treturn &file_grpc_federation_federation_proto_enumTypes[0]\n}\n\nfunc (x TypeKind) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use TypeKind.Descriptor instead.\nfunc (TypeKind) EnumDescriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\n// LogLevel is the importance or severity of a log event.\ntype GRPCError_LogLevel int32\n\nconst (\n\t// UNKNOWN represents unexpected value.\n\tGRPCError_UNKNOWN GRPCError_LogLevel = 0\n\t// DEBUG is used for detailed information that is useful during development and debugging.\n\tGRPCError_DEBUG GRPCError_LogLevel = 1\n\t// INFO logs are used to provide information about the normal functioning of the application.\n\tGRPCError_INFO GRPCError_LogLevel = 2\n\t// WARN signifies a potential problem or warning that does not necessarily stop the program from working but may lead to issues in the future.\n\tGRPCError_WARN GRPCError_LogLevel = 3\n\t// ERROR indicates a serious issue that has caused a failure in the application.\n\tGRPCError_ERROR GRPCError_LogLevel = 4\n)\n\n// Enum value maps for GRPCError_LogLevel.\nvar (\n\tGRPCError_LogLevel_name = map[int32]string{\n\t\t0: \"UNKNOWN\",\n\t\t1: \"DEBUG\",\n\t\t2: \"INFO\",\n\t\t3: \"WARN\",\n\t\t4: \"ERROR\",\n\t}\n\tGRPCError_LogLevel_value = map[string]int32{\n\t\t\"UNKNOWN\": 0,\n\t\t\"DEBUG\":   1,\n\t\t\"INFO\":    2,\n\t\t\"WARN\":    3,\n\t\t\"ERROR\":   4,\n\t}\n)\n\nfunc (x GRPCError_LogLevel) Enum() *GRPCError_LogLevel {\n\tp := new(GRPCError_LogLevel)\n\t*p = x\n\treturn p\n}\n\nfunc (x GRPCError_LogLevel) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (GRPCError_LogLevel) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_grpc_federation_federation_proto_enumTypes[1].Descriptor()\n}\n\nfunc (GRPCError_LogLevel) Type() protoreflect.EnumType {\n\treturn &file_grpc_federation_federation_proto_enumTypes[1]\n}\n\nfunc (x GRPCError_LogLevel) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use GRPCError_LogLevel.Descriptor instead.\nfunc (GRPCError_LogLevel) EnumDescriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{24, 0}\n}\n\ntype FileRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPlugin *CELPlugin `protobuf:\"bytes,1,opt,name=plugin,proto3\" json:\"plugin,omitempty\"`\n\t// import can be used to resolve methods, messages, etc. that are referenced in gRPC Federation rules.\n\tImport []string `protobuf:\"bytes,2,rep,name=import,proto3\" json:\"import,omitempty\"`\n}\n\nfunc (x *FileRule) Reset() {\n\t*x = FileRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *FileRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*FileRule) ProtoMessage() {}\n\nfunc (x *FileRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use FileRule.ProtoReflect.Descriptor instead.\nfunc (*FileRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *FileRule) GetPlugin() *CELPlugin {\n\tif x != nil {\n\t\treturn x.Plugin\n\t}\n\treturn nil\n}\n\nfunc (x *FileRule) GetImport() []string {\n\tif x != nil {\n\t\treturn x.Import\n\t}\n\treturn nil\n}\n\ntype EnumRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// alias mapping between enums defined in other packages and enums defined on the federation service side.\n\t// The alias is the FQDN ( <package-name>.<enum-name> ) to the enum.\n\t// If this definition exists, type conversion is automatically performed before the enum value assignment operation.\n\t// If a enum with this option has a value that is not present in the enum specified by alias, and the alias option is not specified for that value, an error is occurred.\n\t// You can specify multiple aliases. In that case, only values common to all aliases will be considered.\n\t// Specifying a value that is not included in either alias will result in an error.\n\tAlias []string `protobuf:\"bytes,1,rep,name=alias,proto3\" json:\"alias,omitempty\"`\n}\n\nfunc (x *EnumRule) Reset() {\n\t*x = EnumRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumRule) ProtoMessage() {}\n\nfunc (x *EnumRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumRule.ProtoReflect.Descriptor instead.\nfunc (*EnumRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *EnumRule) GetAlias() []string {\n\tif x != nil {\n\t\treturn x.Alias\n\t}\n\treturn nil\n}\n\ntype EnumValueRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// specifies the default value of the enum.\n\t// All values other than those specified in alias will be default values.\n\tDefault *bool `protobuf:\"varint,1,opt,name=default,proto3,oneof\" json:\"default,omitempty\"`\n\t// alias can be used when alias is specified in grpc.federation.enum option,\n\t// and specifies the value name to be referenced among the enums specified in alias of enum option.\n\t// multiple value names can be specified for alias.\n\tAlias []string `protobuf:\"bytes,2,rep,name=alias,proto3\" json:\"alias,omitempty\"`\n\t// attr is used to hold multiple name-value pairs corresponding to an enum value.\n\t// The values specified by the name must be consistently specified for all enum values.\n\t// The values stored using this feature can be retrieved using the `attr()` method of the enum API.\n\tAttr []*EnumValueAttribute `protobuf:\"bytes,3,rep,name=attr,proto3\" json:\"attr,omitempty\"`\n\t// noalias exclude from the target of alias.\n\t// This option cannot be specified simultaneously with `default` or `alias`.\n\tNoalias *bool `protobuf:\"varint,4,opt,name=noalias,proto3,oneof\" json:\"noalias,omitempty\"`\n}\n\nfunc (x *EnumValueRule) Reset() {\n\t*x = EnumValueRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumValueRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumValueRule) ProtoMessage() {}\n\nfunc (x *EnumValueRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumValueRule.ProtoReflect.Descriptor instead.\nfunc (*EnumValueRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *EnumValueRule) GetDefault() bool {\n\tif x != nil && x.Default != nil {\n\t\treturn *x.Default\n\t}\n\treturn false\n}\n\nfunc (x *EnumValueRule) GetAlias() []string {\n\tif x != nil {\n\t\treturn x.Alias\n\t}\n\treturn nil\n}\n\nfunc (x *EnumValueRule) GetAttr() []*EnumValueAttribute {\n\tif x != nil {\n\t\treturn x.Attr\n\t}\n\treturn nil\n}\n\nfunc (x *EnumValueRule) GetNoalias() bool {\n\tif x != nil && x.Noalias != nil {\n\t\treturn *x.Noalias\n\t}\n\treturn false\n}\n\ntype EnumValueAttribute struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the attribute key.\n\t// This value is used to search for values using the `attr(<name>)` method.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// value represents the value corresponding to `name`.\n\tValue string `protobuf:\"bytes,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *EnumValueAttribute) Reset() {\n\t*x = EnumValueAttribute{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumValueAttribute) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumValueAttribute) ProtoMessage() {}\n\nfunc (x *EnumValueAttribute) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumValueAttribute.ProtoReflect.Descriptor instead.\nfunc (*EnumValueAttribute) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *EnumValueAttribute) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnumValueAttribute) GetValue() string {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn \"\"\n}\n\ntype OneofRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *OneofRule) Reset() {\n\t*x = OneofRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *OneofRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*OneofRule) ProtoMessage() {}\n\nfunc (x *OneofRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use OneofRule.ProtoReflect.Descriptor instead.\nfunc (*OneofRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{4}\n}\n\n// ServiceRule define gRPC Federation rules for the service.\ntype ServiceRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// env defines the environment variable.\n\tEnv *Env `protobuf:\"bytes,1,opt,name=env,proto3\" json:\"env,omitempty\"`\n\t// var defines the service-level variables.\n\tVar []*ServiceVariable `protobuf:\"bytes,2,rep,name=var,proto3\" json:\"var,omitempty\"`\n}\n\nfunc (x *ServiceRule) Reset() {\n\t*x = ServiceRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceRule) ProtoMessage() {}\n\nfunc (x *ServiceRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceRule.ProtoReflect.Descriptor instead.\nfunc (*ServiceRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *ServiceRule) GetEnv() *Env {\n\tif x != nil {\n\t\treturn x.Env\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceRule) GetVar() []*ServiceVariable {\n\tif x != nil {\n\t\treturn x.Var\n\t}\n\treturn nil\n}\n\n// Env is used when setting environment variables.\n// There are two ways to configure it.\ntype Env struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// var is used to directly list environment variables.\n\tVar []*EnvVar `protobuf:\"bytes,1,rep,name=var,proto3\" json:\"var,omitempty\"`\n\t// message is used to reference an already defined Protocol Buffers' message for defining environment variables.\n\t// If you want to set detailed options for the fields of the message, use the `env` option in FieldRule.\n\tMessage string `protobuf:\"bytes,2,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Env) Reset() {\n\t*x = Env{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Env) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Env) ProtoMessage() {}\n\nfunc (x *Env) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Env.ProtoReflect.Descriptor instead.\nfunc (*Env) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *Env) GetVar() []*EnvVar {\n\tif x != nil {\n\t\treturn x.Var\n\t}\n\treturn nil\n}\n\nfunc (x *Env) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\n// ServiceVariable define variables at the service level.\n// This definition is executed at server startup, after the initialization of Env.\n// The defined variables can be used across all messages that the service depends on.\ntype ServiceVariable struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is a variable name.\n\t// This name can be referenced in all CELs related to the service by using `grpc.federation.var.` prefix.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// if specify the condition for evaluating expr.\n\t// this value evaluated by CEL and it must return a boolean value.\n\t// If the result of evaluation is `false`, the value assigned to name is the default value of the result of evaluation of `expr`.\n\tIf *string `protobuf:\"bytes,2,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n\t// expr specify the value to be assigned to name.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*ServiceVariable_By\n\t//\t*ServiceVariable_Map\n\t//\t*ServiceVariable_Message\n\t//\t*ServiceVariable_Validation\n\t//\t*ServiceVariable_Enum\n\t//\t*ServiceVariable_Switch\n\tExpr isServiceVariable_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *ServiceVariable) Reset() {\n\t*x = ServiceVariable{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceVariable) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceVariable) ProtoMessage() {}\n\nfunc (x *ServiceVariable) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceVariable.ProtoReflect.Descriptor instead.\nfunc (*ServiceVariable) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{7}\n}\n\nfunc (x *ServiceVariable) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *ServiceVariable) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\nfunc (m *ServiceVariable) GetExpr() isServiceVariable_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetBy() string {\n\tif x, ok := x.GetExpr().(*ServiceVariable_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *ServiceVariable) GetMap() *MapExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetMessage() *MessageExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetValidation() *ServiceVariableValidationExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Validation); ok {\n\t\treturn x.Validation\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetEnum() *EnumExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetSwitch() *SwitchExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Switch); ok {\n\t\treturn x.Switch\n\t}\n\treturn nil\n}\n\ntype isServiceVariable_Expr interface {\n\tisServiceVariable_Expr()\n}\n\ntype ServiceVariable_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\ntype ServiceVariable_Map struct {\n\t// map apply map operation for the specified repeated type.\n\tMap *MapExpr `protobuf:\"bytes,12,opt,name=map,proto3,oneof\"`\n}\n\ntype ServiceVariable_Message struct {\n\t// message gets with message arguments.\n\tMessage *MessageExpr `protobuf:\"bytes,13,opt,name=message,proto3,oneof\"`\n}\n\ntype ServiceVariable_Validation struct {\n\t// validation defines the validation rule and message.\n\tValidation *ServiceVariableValidationExpr `protobuf:\"bytes,14,opt,name=validation,proto3,oneof\"`\n}\n\ntype ServiceVariable_Enum struct {\n\t// enum gets with cel value.\n\tEnum *EnumExpr `protobuf:\"bytes,15,opt,name=enum,proto3,oneof\"`\n}\n\ntype ServiceVariable_Switch struct {\n\t// switch provides conditional evaluation with multiple branches.\n\tSwitch *SwitchExpr `protobuf:\"bytes,16,opt,name=switch,proto3,oneof\"`\n}\n\nfunc (*ServiceVariable_By) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Map) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Message) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Validation) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Enum) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Switch) isServiceVariable_Expr() {}\n\n// ServiceVariableValidationExpr represents validation rule and error message.\ntype ServiceVariableValidationExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// if specifies condition in CEL. If the condition is true, it returns error.\n\t// The return value must always be of type boolean.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3\" json:\"if,omitempty\"`\n\t// message is a error message in CEL.\n\tMessage string `protobuf:\"bytes,2,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *ServiceVariableValidationExpr) Reset() {\n\t*x = ServiceVariableValidationExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceVariableValidationExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceVariableValidationExpr) ProtoMessage() {}\n\nfunc (x *ServiceVariableValidationExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceVariableValidationExpr.ProtoReflect.Descriptor instead.\nfunc (*ServiceVariableValidationExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{8}\n}\n\nfunc (x *ServiceVariableValidationExpr) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *ServiceVariableValidationExpr) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\n// EnvVar represents an environment variable.\ntype EnvVar struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is an environment variable name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// type is an environment variable type.\n\tType *EnvType `protobuf:\"bytes,2,opt,name=type,proto3\" json:\"type,omitempty\"`\n\t// option is an additional option for parsing environment variable.\n\tOption *EnvVarOption `protobuf:\"bytes,3,opt,name=option,proto3,oneof\" json:\"option,omitempty\"`\n}\n\nfunc (x *EnvVar) Reset() {\n\t*x = EnvVar{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvVar) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvVar) ProtoMessage() {}\n\nfunc (x *EnvVar) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvVar.ProtoReflect.Descriptor instead.\nfunc (*EnvVar) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{9}\n}\n\nfunc (x *EnvVar) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnvVar) GetType() *EnvType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nfunc (x *EnvVar) GetOption() *EnvVarOption {\n\tif x != nil {\n\t\treturn x.Option\n\t}\n\treturn nil\n}\n\n// EnvType represents type information for environment variable.\ntype EnvType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to Type:\n\t//\n\t//\t*EnvType_Kind\n\t//\t*EnvType_Repeated\n\t//\t*EnvType_Map\n\tType isEnvType_Type `protobuf_oneof:\"type\"`\n}\n\nfunc (x *EnvType) Reset() {\n\t*x = EnvType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[10]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvType) ProtoMessage() {}\n\nfunc (x *EnvType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[10]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvType.ProtoReflect.Descriptor instead.\nfunc (*EnvType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{10}\n}\n\nfunc (m *EnvType) GetType() isEnvType_Type {\n\tif m != nil {\n\t\treturn m.Type\n\t}\n\treturn nil\n}\n\nfunc (x *EnvType) GetKind() TypeKind {\n\tif x, ok := x.GetType().(*EnvType_Kind); ok {\n\t\treturn x.Kind\n\t}\n\treturn TypeKind_UNKNOWN\n}\n\nfunc (x *EnvType) GetRepeated() *EnvType {\n\tif x, ok := x.GetType().(*EnvType_Repeated); ok {\n\t\treturn x.Repeated\n\t}\n\treturn nil\n}\n\nfunc (x *EnvType) GetMap() *EnvMapType {\n\tif x, ok := x.GetType().(*EnvType_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\ntype isEnvType_Type interface {\n\tisEnvType_Type()\n}\n\ntype EnvType_Kind struct {\n\t// kind is used when the type is a primitive type.\n\tKind TypeKind `protobuf:\"varint,1,opt,name=kind,proto3,enum=grpc.federation.TypeKind,oneof\"`\n}\n\ntype EnvType_Repeated struct {\n\t// repeated is used when the type is a repeated type.\n\tRepeated *EnvType `protobuf:\"bytes,2,opt,name=repeated,proto3,oneof\"`\n}\n\ntype EnvType_Map struct {\n\t// map is used when the type is a map type.\n\tMap *EnvMapType `protobuf:\"bytes,3,opt,name=map,proto3,oneof\"`\n}\n\nfunc (*EnvType_Kind) isEnvType_Type() {}\n\nfunc (*EnvType_Repeated) isEnvType_Type() {}\n\nfunc (*EnvType_Map) isEnvType_Type() {}\n\n// EnvMapType represents map type.\ntype EnvMapType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// key represents map's key type.\n\tKey *EnvType `protobuf:\"bytes,1,opt,name=key,proto3\" json:\"key,omitempty\"`\n\t// value represents map's value type.\n\tValue *EnvType `protobuf:\"bytes,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *EnvMapType) Reset() {\n\t*x = EnvMapType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[11]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvMapType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvMapType) ProtoMessage() {}\n\nfunc (x *EnvMapType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[11]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvMapType.ProtoReflect.Descriptor instead.\nfunc (*EnvMapType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{11}\n}\n\nfunc (x *EnvMapType) GetKey() *EnvType {\n\tif x != nil {\n\t\treturn x.Key\n\t}\n\treturn nil\n}\n\nfunc (x *EnvMapType) GetValue() *EnvType {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn nil\n}\n\n// EnvVarOption represents additional option for environment variable.\n// The option work with the `envconfig` library in Go language.\n// For detailed specifications, please refer to the library's documentation ( https://pkg.go.dev/github.com/kelseyhightower/envconfig#section-readme ).\ntype EnvVarOption struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// alternate use this option if you want to use an environment variable with a different name than the value specified in `EnvVar.name`.\n\tAlternate *string `protobuf:\"bytes,1,opt,name=alternate,proto3,oneof\" json:\"alternate,omitempty\"`\n\t// default specify the value to use as a fallback if the specified environment variable is not found.\n\tDefault *string `protobuf:\"bytes,2,opt,name=default,proto3,oneof\" json:\"default,omitempty\"`\n\t// required require the environment variable to exist.\n\t// If it does not exist, an error will occur at startup.\n\tRequired *bool `protobuf:\"varint,3,opt,name=required,proto3,oneof\" json:\"required,omitempty\"`\n\t// ignored if ignored is true, it does nothing even if the environment variable exists.\n\tIgnored *bool `protobuf:\"varint,4,opt,name=ignored,proto3,oneof\" json:\"ignored,omitempty\"`\n}\n\nfunc (x *EnvVarOption) Reset() {\n\t*x = EnvVarOption{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[12]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvVarOption) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvVarOption) ProtoMessage() {}\n\nfunc (x *EnvVarOption) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[12]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvVarOption.ProtoReflect.Descriptor instead.\nfunc (*EnvVarOption) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{12}\n}\n\nfunc (x *EnvVarOption) GetAlternate() string {\n\tif x != nil && x.Alternate != nil {\n\t\treturn *x.Alternate\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnvVarOption) GetDefault() string {\n\tif x != nil && x.Default != nil {\n\t\treturn *x.Default\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnvVarOption) GetRequired() bool {\n\tif x != nil && x.Required != nil {\n\t\treturn *x.Required\n\t}\n\treturn false\n}\n\nfunc (x *EnvVarOption) GetIgnored() bool {\n\tif x != nil && x.Ignored != nil {\n\t\treturn *x.Ignored\n\t}\n\treturn false\n}\n\ntype MethodRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// the time to timeout. If the specified time period elapses, DEADLINE_EXCEEDED status is returned.\n\t// If you want to handle this error, you need to implement a custom error handler in Go.\n\t// The format is the same as Go's time.Duration format. See https://pkg.go.dev/time#ParseDuration.\n\tTimeout *string `protobuf:\"bytes,1,opt,name=timeout,proto3,oneof\" json:\"timeout,omitempty\"`\n\t// response specify the name of the message you want to use to create the response value.\n\t// If you specify a reserved type like `google.protobuf.Empty` as the response, you cannot define gRPC Federation options.\n\t// In such cases, you can specify a separate message to create the response value.\n\t// The specified response message must contain fields with the same names and types as all the fields in the original response.\n\tResponse *string `protobuf:\"bytes,2,opt,name=response,proto3,oneof\" json:\"response,omitempty\"`\n}\n\nfunc (x *MethodRule) Reset() {\n\t*x = MethodRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[13]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MethodRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MethodRule) ProtoMessage() {}\n\nfunc (x *MethodRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[13]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MethodRule.ProtoReflect.Descriptor instead.\nfunc (*MethodRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{13}\n}\n\nfunc (x *MethodRule) GetTimeout() string {\n\tif x != nil && x.Timeout != nil {\n\t\treturn *x.Timeout\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodRule) GetResponse() string {\n\tif x != nil && x.Response != nil {\n\t\treturn *x.Response\n\t}\n\treturn \"\"\n}\n\n// MessageRule define gRPC Federation rules for the message.\ntype MessageRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// def specify variables to be used in field binding by `grpc.federation.field` option.\n\tDef []*VariableDefinition `protobuf:\"bytes,1,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// if custom_resolver is true, the resolver for this message is implemented by Go.\n\t// If there are any values retrieved by resolver or messages, they are passed as arguments for custom resolver.\n\t// Each field of the message returned by the custom resolver is automatically bound.\n\t// If you want to change the binding process for a particular field, set `custom_resolver=true` option for that field.\n\tCustomResolver *bool `protobuf:\"varint,2,opt,name=custom_resolver,json=customResolver,proto3,oneof\" json:\"custom_resolver,omitempty\"`\n\t// alias mapping between messages defined in other packages and messages defined on the federation service side.\n\t// The alias is the FQDN ( <package-name>.<message-name> ) to the message.\n\t// If this definition exists, type conversion is automatically performed before the field assignment operation.\n\t// If a message with this option has a field that is not present in the message specified by alias, and the alias option is not specified for that field, an error is occurred.\n\t// You can specify multiple aliases. In that case, only fields common to all aliases will be considered.\n\t// Specifying a field that is not included in either alias will result in an error.\n\tAlias []string `protobuf:\"bytes,3,rep,name=alias,proto3\" json:\"alias,omitempty\"`\n}\n\nfunc (x *MessageRule) Reset() {\n\t*x = MessageRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[14]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MessageRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MessageRule) ProtoMessage() {}\n\nfunc (x *MessageRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[14]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MessageRule.ProtoReflect.Descriptor instead.\nfunc (*MessageRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{14}\n}\n\nfunc (x *MessageRule) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *MessageRule) GetCustomResolver() bool {\n\tif x != nil && x.CustomResolver != nil {\n\t\treturn *x.CustomResolver\n\t}\n\treturn false\n}\n\nfunc (x *MessageRule) GetAlias() []string {\n\tif x != nil {\n\t\treturn x.Alias\n\t}\n\treturn nil\n}\n\n// VariableDefinition represents variable definition.\ntype VariableDefinition struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is a variable name.\n\t// This name can be referenced in all CELs defined after itself in the same message.\n\t// It can also be referenced in `grpc.federation.field` option.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// if specify the condition for evaluating expr.\n\t// this value evaluated by CEL and it must return a boolean value.\n\t// If the result of evaluation is `false`, the value assigned to name is the default value of the result of evaluation of `expr`.\n\tIf *string `protobuf:\"bytes,2,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n\t// autobind if the result value of `expr` is a message type,\n\t// the value of a field with the same name and type as the field name of its own message is automatically assigned to the value of the field in the message.\n\t// If multiple autobinds are used at the same message,\n\t// you must explicitly use the `grpc.federation.field` option to do the binding yourself, since duplicate field names cannot be correctly determined as one.\n\tAutobind *bool `protobuf:\"varint,3,opt,name=autobind,proto3,oneof\" json:\"autobind,omitempty\"`\n\t// expr specify the value to be assigned to name.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*VariableDefinition_By\n\t//\t*VariableDefinition_Map\n\t//\t*VariableDefinition_Message\n\t//\t*VariableDefinition_Call\n\t//\t*VariableDefinition_Validation\n\t//\t*VariableDefinition_Enum\n\t//\t*VariableDefinition_Switch\n\tExpr isVariableDefinition_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *VariableDefinition) Reset() {\n\t*x = VariableDefinition{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[15]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *VariableDefinition) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*VariableDefinition) ProtoMessage() {}\n\nfunc (x *VariableDefinition) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[15]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use VariableDefinition.ProtoReflect.Descriptor instead.\nfunc (*VariableDefinition) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{15}\n}\n\nfunc (x *VariableDefinition) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *VariableDefinition) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *VariableDefinition) GetAutobind() bool {\n\tif x != nil && x.Autobind != nil {\n\t\treturn *x.Autobind\n\t}\n\treturn false\n}\n\nfunc (m *VariableDefinition) GetExpr() isVariableDefinition_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetBy() string {\n\tif x, ok := x.GetExpr().(*VariableDefinition_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *VariableDefinition) GetMap() *MapExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetMessage() *MessageExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetCall() *CallExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Call); ok {\n\t\treturn x.Call\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetValidation() *ValidationExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Validation); ok {\n\t\treturn x.Validation\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetEnum() *EnumExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetSwitch() *SwitchExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Switch); ok {\n\t\treturn x.Switch\n\t}\n\treturn nil\n}\n\ntype isVariableDefinition_Expr interface {\n\tisVariableDefinition_Expr()\n}\n\ntype VariableDefinition_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\ntype VariableDefinition_Map struct {\n\t// map apply map operation for the specified repeated type.\n\tMap *MapExpr `protobuf:\"bytes,12,opt,name=map,proto3,oneof\"`\n}\n\ntype VariableDefinition_Message struct {\n\t// message gets with message arguments.\n\tMessage *MessageExpr `protobuf:\"bytes,13,opt,name=message,proto3,oneof\"`\n}\n\ntype VariableDefinition_Call struct {\n\t// call specifies how to call gRPC method.\n\tCall *CallExpr `protobuf:\"bytes,14,opt,name=call,proto3,oneof\"`\n}\n\ntype VariableDefinition_Validation struct {\n\t// validation defines the validation rule and error.\n\tValidation *ValidationExpr `protobuf:\"bytes,15,opt,name=validation,proto3,oneof\"`\n}\n\ntype VariableDefinition_Enum struct {\n\t// enum gets with cel value.\n\tEnum *EnumExpr `protobuf:\"bytes,16,opt,name=enum,proto3,oneof\"`\n}\n\ntype VariableDefinition_Switch struct {\n\t// switch provides conditional evaluation with multiple branches.\n\tSwitch *SwitchExpr `protobuf:\"bytes,17,opt,name=switch,proto3,oneof\"`\n}\n\nfunc (*VariableDefinition_By) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Map) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Message) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Call) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Validation) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Enum) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Switch) isVariableDefinition_Expr() {}\n\n// MapExpr apply map operation for the specified repeated type.\ntype MapExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// iterator define iterator variable.\n\t// When evaluating CEL in `expr`, we can refer to the name defined in iterator.\n\tIterator *Iterator `protobuf:\"bytes,1,opt,name=iterator,proto3\" json:\"iterator,omitempty\"`\n\t// expr creates map elements using iterator variable.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*MapExpr_By\n\t//\t*MapExpr_Message\n\t//\t*MapExpr_Enum\n\tExpr isMapExpr_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *MapExpr) Reset() {\n\t*x = MapExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[16]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MapExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MapExpr) ProtoMessage() {}\n\nfunc (x *MapExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[16]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MapExpr.ProtoReflect.Descriptor instead.\nfunc (*MapExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{16}\n}\n\nfunc (x *MapExpr) GetIterator() *Iterator {\n\tif x != nil {\n\t\treturn x.Iterator\n\t}\n\treturn nil\n}\n\nfunc (m *MapExpr) GetExpr() isMapExpr_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *MapExpr) GetBy() string {\n\tif x, ok := x.GetExpr().(*MapExpr_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *MapExpr) GetMessage() *MessageExpr {\n\tif x, ok := x.GetExpr().(*MapExpr_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *MapExpr) GetEnum() *EnumExpr {\n\tif x, ok := x.GetExpr().(*MapExpr_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn nil\n}\n\ntype isMapExpr_Expr interface {\n\tisMapExpr_Expr()\n}\n\ntype MapExpr_By struct {\n\t// `by` evaluates with CEL.\n\t// this can refer to the variable declared by `iterator`.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\ntype MapExpr_Message struct {\n\t// message gets with message arguments, and it is made an element of the map.\n\t// The result type of MapExpr is the repeated type of the specified message.\n\tMessage *MessageExpr `protobuf:\"bytes,12,opt,name=message,proto3,oneof\"`\n}\n\ntype MapExpr_Enum struct {\n\t// enum creates enum value for each element of the map.\n\t// The result type of MapExpr is the repeated type of the specified enum.\n\tEnum *EnumExpr `protobuf:\"bytes,13,opt,name=enum,proto3,oneof\"`\n}\n\nfunc (*MapExpr_By) isMapExpr_Expr() {}\n\nfunc (*MapExpr_Message) isMapExpr_Expr() {}\n\nfunc (*MapExpr_Enum) isMapExpr_Expr() {}\n\n// Iterator represents iterator variable.\ntype Iterator struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// variable name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// src the value that will be the source for creating the iterator.\n\t// src must be a repeated type.\n\tSrc string `protobuf:\"bytes,2,opt,name=src,proto3\" json:\"src,omitempty\"`\n}\n\nfunc (x *Iterator) Reset() {\n\t*x = Iterator{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[17]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Iterator) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Iterator) ProtoMessage() {}\n\nfunc (x *Iterator) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[17]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Iterator.ProtoReflect.Descriptor instead.\nfunc (*Iterator) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{17}\n}\n\nfunc (x *Iterator) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Iterator) GetSrc() string {\n\tif x != nil {\n\t\treturn x.Src\n\t}\n\treturn \"\"\n}\n\n// MessageExpr represents dependent message.\ntype MessageExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name specify the message name by FQDN. format is `<package-name>.<message-name>`.\n\t// <package-name> can be omitted when referring to messages in the same package.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// args specify the parameters needed to get the message. This is called the \"message arguments\".\n\tArgs []*Argument `protobuf:\"bytes,2,rep,name=args,proto3\" json:\"args,omitempty\"`\n}\n\nfunc (x *MessageExpr) Reset() {\n\t*x = MessageExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[18]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MessageExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MessageExpr) ProtoMessage() {}\n\nfunc (x *MessageExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[18]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MessageExpr.ProtoReflect.Descriptor instead.\nfunc (*MessageExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{18}\n}\n\nfunc (x *MessageExpr) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *MessageExpr) GetArgs() []*Argument {\n\tif x != nil {\n\t\treturn x.Args\n\t}\n\treturn nil\n}\n\n// EnumExpr represents dependent enum.\ntype EnumExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name specify the enum name by FQDN. format is `<package-name>.<enum-name>`.\n\t// <package-name> can be omitted when referring to enum in the same package.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,2,opt,name=by,proto3\" json:\"by,omitempty\"`\n}\n\nfunc (x *EnumExpr) Reset() {\n\t*x = EnumExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[19]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumExpr) ProtoMessage() {}\n\nfunc (x *EnumExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[19]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumExpr.ProtoReflect.Descriptor instead.\nfunc (*EnumExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{19}\n}\n\nfunc (x *EnumExpr) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnumExpr) GetBy() string {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\n// CallExpr represents how to call gRPC method.\ntype CallExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// method specify the FQDN for the gRPC method. format is `<package-name>.<service-name>/<method-name>`.\n\tMethod string `protobuf:\"bytes,1,opt,name=method,proto3\" json:\"method,omitempty\"`\n\t// request specify request parameters for the gRPC method.\n\tRequest []*MethodRequest `protobuf:\"bytes,2,rep,name=request,proto3\" json:\"request,omitempty\"`\n\t// the time to timeout. If the specified time period elapses, DEADLINE_EXCEEDED status is returned.\n\t// If you want to handle this error, you need to implement a custom error handler in Go.\n\t// The format is the same as Go's time.Duration format. See https://pkg.go.dev/time#ParseDuration.\n\tTimeout *string `protobuf:\"bytes,3,opt,name=timeout,proto3,oneof\" json:\"timeout,omitempty\"`\n\t// retry specifies the retry policy if the method call fails.\n\tRetry *RetryPolicy `protobuf:\"bytes,4,opt,name=retry,proto3,oneof\" json:\"retry,omitempty\"`\n\t// error evaluated when an error occurs during a method call.\n\t// Multiple errors can be defined and are evaluated in the order in which they are described.\n\t// If an error occurs while creating an gRPC status error, original error will be returned.\n\tError []*GRPCError `protobuf:\"bytes,5,rep,name=error,proto3\" json:\"error,omitempty\"`\n\t// option is the gRPC's call option (https://pkg.go.dev/google.golang.org/grpc#CallOption).\n\tOption *GRPCCallOption `protobuf:\"bytes,6,opt,name=option,proto3,oneof\" json:\"option,omitempty\"`\n\t// metadata specify outgoing metadata with CEL value.\n\t// The specified type must always be of type map<string, repeated string>.\n\tMetadata *string `protobuf:\"bytes,7,opt,name=metadata,proto3,oneof\" json:\"metadata,omitempty\"`\n}\n\nfunc (x *CallExpr) Reset() {\n\t*x = CallExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[20]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CallExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CallExpr) ProtoMessage() {}\n\nfunc (x *CallExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[20]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CallExpr.ProtoReflect.Descriptor instead.\nfunc (*CallExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{20}\n}\n\nfunc (x *CallExpr) GetMethod() string {\n\tif x != nil {\n\t\treturn x.Method\n\t}\n\treturn \"\"\n}\n\nfunc (x *CallExpr) GetRequest() []*MethodRequest {\n\tif x != nil {\n\t\treturn x.Request\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetTimeout() string {\n\tif x != nil && x.Timeout != nil {\n\t\treturn *x.Timeout\n\t}\n\treturn \"\"\n}\n\nfunc (x *CallExpr) GetRetry() *RetryPolicy {\n\tif x != nil {\n\t\treturn x.Retry\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetError() []*GRPCError {\n\tif x != nil {\n\t\treturn x.Error\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetOption() *GRPCCallOption {\n\tif x != nil {\n\t\treturn x.Option\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetMetadata() string {\n\tif x != nil && x.Metadata != nil {\n\t\treturn *x.Metadata\n\t}\n\treturn \"\"\n}\n\n// SwitchExpr represents a switch statement. At least one \"case\", and \"default\", must be defined. All\n// case.if expressions must evaluate to a boolean value. All case.by expressions, and default.by, must\n// evaluate to the same type (the return type of the switch).\n//\n// When executed, the case.if expressions are evaluated in order, and, for the first case whose\n// case.if expression evaluates to true, its case.by is evaluated to make the return value of the\n// SwitchExpr.\n// If no case.if evaluates to true, default.by is evaluated to make the return value.\ntype SwitchExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Cases for the switch expression.\n\tCase []*SwitchCaseExpr `protobuf:\"bytes,1,rep,name=case,proto3\" json:\"case,omitempty\"`\n\t// The default case, if none of the \"case.if\" expressions evaluate to true.\n\tDefault *SwitchDefaultExpr `protobuf:\"bytes,2,opt,name=default,proto3\" json:\"default,omitempty\"`\n}\n\nfunc (x *SwitchExpr) Reset() {\n\t*x = SwitchExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[21]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SwitchExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SwitchExpr) ProtoMessage() {}\n\nfunc (x *SwitchExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[21]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SwitchExpr.ProtoReflect.Descriptor instead.\nfunc (*SwitchExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{21}\n}\n\nfunc (x *SwitchExpr) GetCase() []*SwitchCaseExpr {\n\tif x != nil {\n\t\treturn x.Case\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchExpr) GetDefault() *SwitchDefaultExpr {\n\tif x != nil {\n\t\treturn x.Default\n\t}\n\treturn nil\n}\n\n// SwitchCaseExpr represents a single case for a switch expression.\ntype SwitchCaseExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// if specify the condition for evaluating expr.\n\t// this value evaluated by CEL and it must return a boolean value.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3\" json:\"if,omitempty\"`\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,2,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// expr specify the value to return for the case.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*SwitchCaseExpr_By\n\tExpr isSwitchCaseExpr_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *SwitchCaseExpr) Reset() {\n\t*x = SwitchCaseExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[22]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SwitchCaseExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SwitchCaseExpr) ProtoMessage() {}\n\nfunc (x *SwitchCaseExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[22]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SwitchCaseExpr.ProtoReflect.Descriptor instead.\nfunc (*SwitchCaseExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{22}\n}\n\nfunc (x *SwitchCaseExpr) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *SwitchCaseExpr) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (m *SwitchCaseExpr) GetExpr() isSwitchCaseExpr_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchCaseExpr) GetBy() string {\n\tif x, ok := x.GetExpr().(*SwitchCaseExpr_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\ntype isSwitchCaseExpr_Expr interface {\n\tisSwitchCaseExpr_Expr()\n}\n\ntype SwitchCaseExpr_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\nfunc (*SwitchCaseExpr_By) isSwitchCaseExpr_Expr() {}\n\n// SwitchDefaultExpr represents the default case for a switch expression.\ntype SwitchDefaultExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,1,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// expr specify the value to return for the default case.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*SwitchDefaultExpr_By\n\tExpr isSwitchDefaultExpr_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *SwitchDefaultExpr) Reset() {\n\t*x = SwitchDefaultExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[23]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SwitchDefaultExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SwitchDefaultExpr) ProtoMessage() {}\n\nfunc (x *SwitchDefaultExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[23]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SwitchDefaultExpr.ProtoReflect.Descriptor instead.\nfunc (*SwitchDefaultExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{23}\n}\n\nfunc (x *SwitchDefaultExpr) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (m *SwitchDefaultExpr) GetExpr() isSwitchDefaultExpr_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchDefaultExpr) GetBy() string {\n\tif x, ok := x.GetExpr().(*SwitchDefaultExpr_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\ntype isSwitchDefaultExpr_Expr interface {\n\tisSwitchDefaultExpr_Expr()\n}\n\ntype SwitchDefaultExpr_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\nfunc (*SwitchDefaultExpr_By) isSwitchDefaultExpr_Expr() {}\n\n// GRPCError create gRPC status value.\ntype GRPCError struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,1,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// if specifies condition in CEL. If the condition is true, it returns defined error information.\n\t// If this field is omitted, it is always treated as 'true' and returns defined error information.\n\t// The return value must always be of type boolean.\n\tIf *string `protobuf:\"bytes,2,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n\t// code is a gRPC status code.\n\tCode *code.Code `protobuf:\"varint,3,opt,name=code,proto3,enum=google.rpc.Code,oneof\" json:\"code,omitempty\"`\n\t// message is a gRPC status message.\n\t// If omitted, the message will be auto-generated from the configurations.\n\tMessage *string `protobuf:\"bytes,4,opt,name=message,proto3,oneof\" json:\"message,omitempty\"`\n\t// details is a list of error details.\n\t// If returns error, the corresponding error details are set.\n\tDetails []*GRPCErrorDetail `protobuf:\"bytes,5,rep,name=details,proto3\" json:\"details,omitempty\"`\n\t// ignore ignore the error if the condition in the \"if\" field is true and \"ignore\" field is set to true.\n\t// When an error is ignored, the returned response is always null value.\n\t// If you want to return a response that is not null, please use `ignore_and_response` feature.\n\t// Therefore, `ignore` and `ignore_and_response` cannot be specified same.\n\tIgnore *bool `protobuf:\"varint,6,opt,name=ignore,proto3,oneof\" json:\"ignore,omitempty\"`\n\t// ignore_and_response ignore the error if the condition in the \"if\" field is true and it returns response specified in CEL.\n\t// The evaluation value of CEL must always be the same as the response message type.\n\t// `ignore` and `ignore_and_response` cannot be specified same.\n\tIgnoreAndResponse *string `protobuf:\"bytes,7,opt,name=ignore_and_response,json=ignoreAndResponse,proto3,oneof\" json:\"ignore_and_response,omitempty\"`\n\t// log_level can be configured to output logs as any log level.\n\t// If DEBUG is specified for the log_level, logs are output as debug logs.\n\t// default value is ERROR.\n\tLogLevel *GRPCError_LogLevel `protobuf:\"varint,8,opt,name=log_level,json=logLevel,proto3,enum=grpc.federation.GRPCError_LogLevel,oneof\" json:\"log_level,omitempty\"`\n}\n\nfunc (x *GRPCError) Reset() {\n\t*x = GRPCError{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[24]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GRPCError) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GRPCError) ProtoMessage() {}\n\nfunc (x *GRPCError) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[24]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GRPCError.ProtoReflect.Descriptor instead.\nfunc (*GRPCError) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{24}\n}\n\nfunc (x *GRPCError) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCError) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCError) GetCode() code.Code {\n\tif x != nil && x.Code != nil {\n\t\treturn *x.Code\n\t}\n\treturn code.Code(0)\n}\n\nfunc (x *GRPCError) GetMessage() string {\n\tif x != nil && x.Message != nil {\n\t\treturn *x.Message\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCError) GetDetails() []*GRPCErrorDetail {\n\tif x != nil {\n\t\treturn x.Details\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCError) GetIgnore() bool {\n\tif x != nil && x.Ignore != nil {\n\t\treturn *x.Ignore\n\t}\n\treturn false\n}\n\nfunc (x *GRPCError) GetIgnoreAndResponse() string {\n\tif x != nil && x.IgnoreAndResponse != nil {\n\t\treturn *x.IgnoreAndResponse\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCError) GetLogLevel() GRPCError_LogLevel {\n\tif x != nil && x.LogLevel != nil {\n\t\treturn *x.LogLevel\n\t}\n\treturn GRPCError_UNKNOWN\n}\n\ntype GRPCErrorDetail struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// if specifies condition rule in CEL. If the condition is true, gRPC error detail is added to the error.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3\" json:\"if,omitempty\"`\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,2,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// message represents arbitrary messages to describe the detail of the error.\n\tMessage []*MessageExpr `protobuf:\"bytes,3,rep,name=message,proto3\" json:\"message,omitempty\"`\n\t// error_info describes the cause of the error with structured details.\n\tErrorInfo []*errdetails.ErrorInfo `protobuf:\"bytes,4,rep,name=error_info,json=errorInfo,proto3\" json:\"error_info,omitempty\"`\n\t// retry_info describes when the clients can retry a failed request.\n\tRetryInfo []*errdetails.RetryInfo `protobuf:\"bytes,5,rep,name=retry_info,json=retryInfo,proto3\" json:\"retry_info,omitempty\"`\n\t// debug_info describes additional debugging info.\n\tDebugInfo []*errdetails.DebugInfo `protobuf:\"bytes,6,rep,name=debug_info,json=debugInfo,proto3\" json:\"debug_info,omitempty\"`\n\t// quota_failure describes how a quota check failed.\n\tQuotaFailure []*errdetails.QuotaFailure `protobuf:\"bytes,7,rep,name=quota_failure,json=quotaFailure,proto3\" json:\"quota_failure,omitempty\"`\n\t// precondition_failure describes what preconditions have failed.\n\tPreconditionFailure []*errdetails.PreconditionFailure `protobuf:\"bytes,8,rep,name=precondition_failure,json=preconditionFailure,proto3\" json:\"precondition_failure,omitempty\"`\n\t// bad_request describes violations in a client request.\n\tBadRequest []*errdetails.BadRequest `protobuf:\"bytes,9,rep,name=bad_request,json=badRequest,proto3\" json:\"bad_request,omitempty\"`\n\t// request_info contains metadata about the request that clients can attach.\n\tRequestInfo []*errdetails.RequestInfo `protobuf:\"bytes,10,rep,name=request_info,json=requestInfo,proto3\" json:\"request_info,omitempty\"`\n\t// resource_info describes the resource that is being accessed.\n\tResourceInfo []*errdetails.ResourceInfo `protobuf:\"bytes,11,rep,name=resource_info,json=resourceInfo,proto3\" json:\"resource_info,omitempty\"`\n\t// help provides links to documentation or for performing an out of band action.\n\tHelp []*errdetails.Help `protobuf:\"bytes,12,rep,name=help,proto3\" json:\"help,omitempty\"`\n\t// localized_message provides a localized error message that is safe to return to the user.\n\tLocalizedMessage []*errdetails.LocalizedMessage `protobuf:\"bytes,13,rep,name=localized_message,json=localizedMessage,proto3\" json:\"localized_message,omitempty\"`\n\t// by specify a message in CEL to express the details of the error.\n\tBy []string `protobuf:\"bytes,14,rep,name=by,proto3\" json:\"by,omitempty\"`\n}\n\nfunc (x *GRPCErrorDetail) Reset() {\n\t*x = GRPCErrorDetail{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[25]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GRPCErrorDetail) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GRPCErrorDetail) ProtoMessage() {}\n\nfunc (x *GRPCErrorDetail) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[25]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GRPCErrorDetail.ProtoReflect.Descriptor instead.\nfunc (*GRPCErrorDetail) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{25}\n}\n\nfunc (x *GRPCErrorDetail) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCErrorDetail) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetMessage() []*MessageExpr {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetErrorInfo() []*errdetails.ErrorInfo {\n\tif x != nil {\n\t\treturn x.ErrorInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetRetryInfo() []*errdetails.RetryInfo {\n\tif x != nil {\n\t\treturn x.RetryInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetDebugInfo() []*errdetails.DebugInfo {\n\tif x != nil {\n\t\treturn x.DebugInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetQuotaFailure() []*errdetails.QuotaFailure {\n\tif x != nil {\n\t\treturn x.QuotaFailure\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetPreconditionFailure() []*errdetails.PreconditionFailure {\n\tif x != nil {\n\t\treturn x.PreconditionFailure\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetBadRequest() []*errdetails.BadRequest {\n\tif x != nil {\n\t\treturn x.BadRequest\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetRequestInfo() []*errdetails.RequestInfo {\n\tif x != nil {\n\t\treturn x.RequestInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetResourceInfo() []*errdetails.ResourceInfo {\n\tif x != nil {\n\t\treturn x.ResourceInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetHelp() []*errdetails.Help {\n\tif x != nil {\n\t\treturn x.Help\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetLocalizedMessage() []*errdetails.LocalizedMessage {\n\tif x != nil {\n\t\treturn x.LocalizedMessage\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetBy() []string {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn nil\n}\n\n// GRPCCallOption configures a gRPC Call before it starts or extracts information from a gRPC Call after it completes.\ntype GRPCCallOption struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// set the content-subtype. For example, if content-subtype is \"json\", the Content-Type over the wire will be \"application/grpc+json\".\n\t// The content-subtype is converted to lowercase before being included in Content-Type.\n\t// See Content-Type on https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests for more details.\n\t// If no such codec is found, the call will result in an error with code INTERNAL.\n\tContentSubtype *string `protobuf:\"bytes,1,opt,name=content_subtype,json=contentSubtype,proto3,oneof\" json:\"content_subtype,omitempty\"`\n\t// header retrieves the header metadata for a unary RPC.\n\t// In order to obtain the metadata, you must specify a variable of type map<string, repeated string> in the header.\n\t// e.g.)\n\t// def [\n\t//\n\t//\t{ name: \"hdr\" by: \"grpc.federation.metadata.new()\" }\n\t//\t{ call { method: \"pkg.Method\" option { header: \"hdr\" } } }\n\t//\n\t// ]\n\tHeader *string `protobuf:\"bytes,2,opt,name=header,proto3,oneof\" json:\"header,omitempty\"`\n\t// max_call_recv_msg_size sets the maximum message size in bytes the client can receive.\n\t// If this is not set, gRPC uses the default 4MB.\n\tMaxCallRecvMsgSize *int64 `protobuf:\"varint,3,opt,name=max_call_recv_msg_size,json=maxCallRecvMsgSize,proto3,oneof\" json:\"max_call_recv_msg_size,omitempty\"`\n\t// max_call_send_msg_size sets the maximum message size in bytes the client can send.\n\t// If this is not set, gRPC uses the default maximum number of int32 range.\n\tMaxCallSendMsgSize *int64 `protobuf:\"varint,4,opt,name=max_call_send_msg_size,json=maxCallSendMsgSize,proto3,oneof\" json:\"max_call_send_msg_size,omitempty\"`\n\t// static_method specifies that a call is being made to a method that is static,\n\t// which means the method is known at compile time and doesn't change at runtime.\n\t// This can be used as a signal to stats plugins that this method is safe to include as a key to a measurement.\n\tStaticMethod *bool `protobuf:\"varint,5,opt,name=static_method,json=staticMethod,proto3,oneof\" json:\"static_method,omitempty\"`\n\t// trailer retrieves the trailer metadata for a unary RPC.\n\t// In order to obtain the metadata, you must specify a variable of type map<string, repeated string> in the trailer.\n\t// e.g.)\n\t// def [\n\t//\n\t//\t{ name: \"trl\" by: \"grpc.federation.metadata.new()\" }\n\t//\t{ call { method: \"pkg.Method\" option { trailer: \"trl\" } } }\n\t//\n\t// ]\n\tTrailer *string `protobuf:\"bytes,6,opt,name=trailer,proto3,oneof\" json:\"trailer,omitempty\"`\n\t// wait_for_ready configures the RPC's behavior when the client is in TRANSIENT_FAILURE,\n\t// which occurs when all addresses fail to connect.\n\t// If wait_for_ready is false, the RPC will fail immediately.\n\t// Otherwise, the client will wait until a connection becomes available or the RPC's deadline is reached.\n\t// By default, RPCs do not \"wait for ready\".\n\tWaitForReady *bool `protobuf:\"varint,7,opt,name=wait_for_ready,json=waitForReady,proto3,oneof\" json:\"wait_for_ready,omitempty\"`\n}\n\nfunc (x *GRPCCallOption) Reset() {\n\t*x = GRPCCallOption{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[26]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GRPCCallOption) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GRPCCallOption) ProtoMessage() {}\n\nfunc (x *GRPCCallOption) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[26]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GRPCCallOption.ProtoReflect.Descriptor instead.\nfunc (*GRPCCallOption) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{26}\n}\n\nfunc (x *GRPCCallOption) GetContentSubtype() string {\n\tif x != nil && x.ContentSubtype != nil {\n\t\treturn *x.ContentSubtype\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCCallOption) GetHeader() string {\n\tif x != nil && x.Header != nil {\n\t\treturn *x.Header\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCCallOption) GetMaxCallRecvMsgSize() int64 {\n\tif x != nil && x.MaxCallRecvMsgSize != nil {\n\t\treturn *x.MaxCallRecvMsgSize\n\t}\n\treturn 0\n}\n\nfunc (x *GRPCCallOption) GetMaxCallSendMsgSize() int64 {\n\tif x != nil && x.MaxCallSendMsgSize != nil {\n\t\treturn *x.MaxCallSendMsgSize\n\t}\n\treturn 0\n}\n\nfunc (x *GRPCCallOption) GetStaticMethod() bool {\n\tif x != nil && x.StaticMethod != nil {\n\t\treturn *x.StaticMethod\n\t}\n\treturn false\n}\n\nfunc (x *GRPCCallOption) GetTrailer() string {\n\tif x != nil && x.Trailer != nil {\n\t\treturn *x.Trailer\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCCallOption) GetWaitForReady() bool {\n\tif x != nil && x.WaitForReady != nil {\n\t\treturn *x.WaitForReady\n\t}\n\treturn false\n}\n\n// Validation represents a validation rule against variables defined within the current scope.\ntype ValidationExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is a unique name for the validation.\n\t// If set, the validation error type will be <message-name><name>Error.\n\t// If omitted, the validation error type will be ValidationError.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// error defines the actual validation rules and an error to returned if the validation fails.\n\tError *GRPCError `protobuf:\"bytes,2,opt,name=error,proto3\" json:\"error,omitempty\"`\n}\n\nfunc (x *ValidationExpr) Reset() {\n\t*x = ValidationExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[27]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ValidationExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ValidationExpr) ProtoMessage() {}\n\nfunc (x *ValidationExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[27]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ValidationExpr.ProtoReflect.Descriptor instead.\nfunc (*ValidationExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{27}\n}\n\nfunc (x *ValidationExpr) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *ValidationExpr) GetError() *GRPCError {\n\tif x != nil {\n\t\treturn x.Error\n\t}\n\treturn nil\n}\n\n// RetryPolicy define the retry policy if the method call fails.\ntype RetryPolicy struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to Policy:\n\t//\n\t//\t*RetryPolicy_Constant\n\t//\t*RetryPolicy_Exponential\n\tPolicy isRetryPolicy_Policy `protobuf_oneof:\"policy\"`\n\t// if specifies condition in CEL. If the condition is true, run the retry process according to the policy.\n\t// If this field is omitted, it is always treated as 'true' and run the retry process.\n\t// The return value must always be of type boolean.\n\tIf string `protobuf:\"bytes,3,opt,name=if,proto3\" json:\"if,omitempty\"`\n}\n\nfunc (x *RetryPolicy) Reset() {\n\t*x = RetryPolicy{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[28]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RetryPolicy) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RetryPolicy) ProtoMessage() {}\n\nfunc (x *RetryPolicy) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[28]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RetryPolicy.ProtoReflect.Descriptor instead.\nfunc (*RetryPolicy) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{28}\n}\n\nfunc (m *RetryPolicy) GetPolicy() isRetryPolicy_Policy {\n\tif m != nil {\n\t\treturn m.Policy\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicy) GetConstant() *RetryPolicyConstant {\n\tif x, ok := x.GetPolicy().(*RetryPolicy_Constant); ok {\n\t\treturn x.Constant\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicy) GetExponential() *RetryPolicyExponential {\n\tif x, ok := x.GetPolicy().(*RetryPolicy_Exponential); ok {\n\t\treturn x.Exponential\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicy) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\ntype isRetryPolicy_Policy interface {\n\tisRetryPolicy_Policy()\n}\n\ntype RetryPolicy_Constant struct {\n\t// retry according to the \"constant\" policy.\n\tConstant *RetryPolicyConstant `protobuf:\"bytes,1,opt,name=constant,proto3,oneof\"`\n}\n\ntype RetryPolicy_Exponential struct {\n\t// retry according to the \"exponential backoff\" policy.\n\t// The following Go library is used in the implementation,\n\t// so please refer to the library documentation for how to specify each parameter.\n\t// https://pkg.go.dev/github.com/cenkalti/backoff/v4#section-readme.\n\tExponential *RetryPolicyExponential `protobuf:\"bytes,2,opt,name=exponential,proto3,oneof\"`\n}\n\nfunc (*RetryPolicy_Constant) isRetryPolicy_Policy() {}\n\nfunc (*RetryPolicy_Exponential) isRetryPolicy_Policy() {}\n\n// RetryPolicyConstant define \"constant\" based retry policy.\ntype RetryPolicyConstant struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// interval value. ( default value is 1s ).\n\tInterval *string `protobuf:\"bytes,1,opt,name=interval,proto3,oneof\" json:\"interval,omitempty\"`\n\t// max retry count. ( default value is 5. If zero is specified, it never stops )\n\tMaxRetries *uint64 `protobuf:\"varint,2,opt,name=max_retries,json=maxRetries,proto3,oneof\" json:\"max_retries,omitempty\"`\n}\n\nfunc (x *RetryPolicyConstant) Reset() {\n\t*x = RetryPolicyConstant{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[29]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RetryPolicyConstant) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RetryPolicyConstant) ProtoMessage() {}\n\nfunc (x *RetryPolicyConstant) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[29]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RetryPolicyConstant.ProtoReflect.Descriptor instead.\nfunc (*RetryPolicyConstant) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{29}\n}\n\nfunc (x *RetryPolicyConstant) GetInterval() string {\n\tif x != nil && x.Interval != nil {\n\t\treturn *x.Interval\n\t}\n\treturn \"\"\n}\n\nfunc (x *RetryPolicyConstant) GetMaxRetries() uint64 {\n\tif x != nil && x.MaxRetries != nil {\n\t\treturn *x.MaxRetries\n\t}\n\treturn 0\n}\n\n// RetryPolicyExponential define \"exponential backoff\" based retry policy.\ntype RetryPolicyExponential struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// initial interval value. ( default value is \"500ms\" ).\n\tInitialInterval *string `protobuf:\"bytes,1,opt,name=initial_interval,json=initialInterval,proto3,oneof\" json:\"initial_interval,omitempty\"`\n\t// randomization factor value. ( default value is 0.5 ).\n\tRandomizationFactor *float64 `protobuf:\"fixed64,2,opt,name=randomization_factor,json=randomizationFactor,proto3,oneof\" json:\"randomization_factor,omitempty\"`\n\t// multiplier. ( default value is 1.5 ).\n\tMultiplier *float64 `protobuf:\"fixed64,3,opt,name=multiplier,proto3,oneof\" json:\"multiplier,omitempty\"`\n\t// max interval value. ( default value is \"60s\" ).\n\tMaxInterval *string `protobuf:\"bytes,4,opt,name=max_interval,json=maxInterval,proto3,oneof\" json:\"max_interval,omitempty\"`\n\t// max retry count. ( default value is 5. If zero is specified, it never stops ).\n\tMaxRetries *uint64 `protobuf:\"varint,5,opt,name=max_retries,json=maxRetries,proto3,oneof\" json:\"max_retries,omitempty\"`\n}\n\nfunc (x *RetryPolicyExponential) Reset() {\n\t*x = RetryPolicyExponential{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[30]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RetryPolicyExponential) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RetryPolicyExponential) ProtoMessage() {}\n\nfunc (x *RetryPolicyExponential) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[30]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RetryPolicyExponential.ProtoReflect.Descriptor instead.\nfunc (*RetryPolicyExponential) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{30}\n}\n\nfunc (x *RetryPolicyExponential) GetInitialInterval() string {\n\tif x != nil && x.InitialInterval != nil {\n\t\treturn *x.InitialInterval\n\t}\n\treturn \"\"\n}\n\nfunc (x *RetryPolicyExponential) GetRandomizationFactor() float64 {\n\tif x != nil && x.RandomizationFactor != nil {\n\t\treturn *x.RandomizationFactor\n\t}\n\treturn 0\n}\n\nfunc (x *RetryPolicyExponential) GetMultiplier() float64 {\n\tif x != nil && x.Multiplier != nil {\n\t\treturn *x.Multiplier\n\t}\n\treturn 0\n}\n\nfunc (x *RetryPolicyExponential) GetMaxInterval() string {\n\tif x != nil && x.MaxInterval != nil {\n\t\treturn *x.MaxInterval\n\t}\n\treturn \"\"\n}\n\nfunc (x *RetryPolicyExponential) GetMaxRetries() uint64 {\n\tif x != nil && x.MaxRetries != nil {\n\t\treturn *x.MaxRetries\n\t}\n\treturn 0\n}\n\n// MethodRequest define parameters to be used for gRPC method request.\ntype MethodRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// field name of the request message.\n\tField string `protobuf:\"bytes,1,opt,name=field,proto3\" json:\"field,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tBy *string `protobuf:\"bytes,2,opt,name=by,proto3,oneof\" json:\"by,omitempty\"`\n\t// if describes the condition to be assigned to field.\n\t// The return value must be of type bool.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\t// If the field is a 'oneof' field, it must be specified.\n\tIf *string `protobuf:\"bytes,3,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n}\n\nfunc (x *MethodRequest) Reset() {\n\t*x = MethodRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[31]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MethodRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MethodRequest) ProtoMessage() {}\n\nfunc (x *MethodRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[31]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MethodRequest.ProtoReflect.Descriptor instead.\nfunc (*MethodRequest) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{31}\n}\n\nfunc (x *MethodRequest) GetField() string {\n\tif x != nil {\n\t\treturn x.Field\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodRequest) GetBy() string {\n\tif x != nil && x.By != nil {\n\t\treturn *x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodRequest) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\n// MethodResponse define which value of the method response is referenced.\ntype MethodResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name specify the unique name that can be used in a `MessageRule` / `FieldRule` for the same message for a specific field in the response.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// field name in response message.\n\tField *string `protobuf:\"bytes,2,opt,name=field,proto3,oneof\" json:\"field,omitempty\"`\n\t// autobind if the value referenced by `field` is a message type,\n\t// the value of a field with the same name and type as the field name of its own message is automatically assigned to the value of the field in the message.\n\t// If multiple autobinds are used at the same message,\n\t// you must explicitly use the `grpc.federation.field` option to do the binding yourself, since duplicate field names cannot be correctly determined as one.\n\tAutobind *bool `protobuf:\"varint,3,opt,name=autobind,proto3,oneof\" json:\"autobind,omitempty\"`\n}\n\nfunc (x *MethodResponse) Reset() {\n\t*x = MethodResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[32]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MethodResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MethodResponse) ProtoMessage() {}\n\nfunc (x *MethodResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[32]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MethodResponse.ProtoReflect.Descriptor instead.\nfunc (*MethodResponse) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{32}\n}\n\nfunc (x *MethodResponse) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodResponse) GetField() string {\n\tif x != nil && x.Field != nil {\n\t\treturn *x.Field\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodResponse) GetAutobind() bool {\n\tif x != nil && x.Autobind != nil {\n\t\treturn *x.Autobind\n\t}\n\treturn false\n}\n\n// Argument define message argument.\ntype Argument struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name of the message argument.\n\t// Use this name to refer to the message argument.\n\t// For example, if `foo` is specified as the name, it is referenced by `$.foo`.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tBy *string `protobuf:\"bytes,2,opt,name=by,proto3,oneof\" json:\"by,omitempty\"`\n\t// inline like by, it refers to the specified value and expands all fields beyond it.\n\t// For this reason, the referenced value must always be of message type.\n\tInline *string `protobuf:\"bytes,3,opt,name=inline,proto3,oneof\" json:\"inline,omitempty\"`\n}\n\nfunc (x *Argument) Reset() {\n\t*x = Argument{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[33]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Argument) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Argument) ProtoMessage() {}\n\nfunc (x *Argument) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[33]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Argument.ProtoReflect.Descriptor instead.\nfunc (*Argument) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{33}\n}\n\nfunc (x *Argument) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Argument) GetBy() string {\n\tif x != nil && x.By != nil {\n\t\treturn *x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *Argument) GetInline() string {\n\tif x != nil && x.Inline != nil {\n\t\treturn *x.Inline\n\t}\n\treturn \"\"\n}\n\n// FieldRule define gRPC Federation rules for the field of message.\ntype FieldRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// If custom_resolver is true, the field binding process is to be implemented in Go.\n\t// If there are any values retrieved by grpc.federation.message option, they are passed as arguments for custom resolver.\n\tCustomResolver *bool `protobuf:\"varint,1,opt,name=custom_resolver,json=customResolver,proto3,oneof\" json:\"custom_resolver,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tBy *string `protobuf:\"bytes,2,opt,name=by,proto3,oneof\" json:\"by,omitempty\"`\n\t// alias can be used when alias is specified in grpc.federation.message option,\n\t// and specifies the field name to be referenced among the messages specified in alias of message option.\n\t// If the specified field has the same type or can be converted automatically, its value is assigned.\n\tAlias *string `protobuf:\"bytes,3,opt,name=alias,proto3,oneof\" json:\"alias,omitempty\"`\n\t// use to evaluate any one of fields. this field only available in oneof.\n\tOneof *FieldOneof `protobuf:\"bytes,4,opt,name=oneof,proto3\" json:\"oneof,omitempty\"`\n\t// when defining an environment variable, use it for fields where you want to set additional options.\n\tEnv *EnvVarOption `protobuf:\"bytes,5,opt,name=env,proto3\" json:\"env,omitempty\"`\n}\n\nfunc (x *FieldRule) Reset() {\n\t*x = FieldRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[34]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *FieldRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*FieldRule) ProtoMessage() {}\n\nfunc (x *FieldRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[34]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use FieldRule.ProtoReflect.Descriptor instead.\nfunc (*FieldRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{34}\n}\n\nfunc (x *FieldRule) GetCustomResolver() bool {\n\tif x != nil && x.CustomResolver != nil {\n\t\treturn *x.CustomResolver\n\t}\n\treturn false\n}\n\nfunc (x *FieldRule) GetBy() string {\n\tif x != nil && x.By != nil {\n\t\treturn *x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *FieldRule) GetAlias() string {\n\tif x != nil && x.Alias != nil {\n\t\treturn *x.Alias\n\t}\n\treturn \"\"\n}\n\nfunc (x *FieldRule) GetOneof() *FieldOneof {\n\tif x != nil {\n\t\treturn x.Oneof\n\t}\n\treturn nil\n}\n\nfunc (x *FieldRule) GetEnv() *EnvVarOption {\n\tif x != nil {\n\t\treturn x.Env\n\t}\n\treturn nil\n}\n\n// FieldOneof evaluate \"messages\" or other field only if expr is true and assign to the oneof field.\n// This feature only available in oneof.\ntype FieldOneof struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// cond specify either `expr` or `default`. Only one `default` can be set per oneof.\n\t//\n\t// Types that are assignable to Cond:\n\t//\n\t//\t*FieldOneof_If\n\t//\t*FieldOneof_Default\n\tCond isFieldOneof_Cond `protobuf_oneof:\"cond\"`\n\t// def specify variables to be used in current oneof field's scope for field binding.\n\tDef []*VariableDefinition `protobuf:\"bytes,3,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule and FieldOneOf can be used.\n\tBy string `protobuf:\"bytes,4,opt,name=by,proto3\" json:\"by,omitempty\"`\n}\n\nfunc (x *FieldOneof) Reset() {\n\t*x = FieldOneof{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[35]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *FieldOneof) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*FieldOneof) ProtoMessage() {}\n\nfunc (x *FieldOneof) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[35]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use FieldOneof.ProtoReflect.Descriptor instead.\nfunc (*FieldOneof) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{35}\n}\n\nfunc (m *FieldOneof) GetCond() isFieldOneof_Cond {\n\tif m != nil {\n\t\treturn m.Cond\n\t}\n\treturn nil\n}\n\nfunc (x *FieldOneof) GetIf() string {\n\tif x, ok := x.GetCond().(*FieldOneof_If); ok {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *FieldOneof) GetDefault() bool {\n\tif x, ok := x.GetCond().(*FieldOneof_Default); ok {\n\t\treturn x.Default\n\t}\n\treturn false\n}\n\nfunc (x *FieldOneof) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *FieldOneof) GetBy() string {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\ntype isFieldOneof_Cond interface {\n\tisFieldOneof_Cond()\n}\n\ntype FieldOneof_If struct {\n\t// if describes the condition to be assigned to field.\n\t// The return value must be of type bool.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3,oneof\"`\n}\n\ntype FieldOneof_Default struct {\n\t// default used to assign a value when none of the other fields match any of the specified expressions.\n\t// Only one value can be defined per oneof.\n\tDefault bool `protobuf:\"varint,2,opt,name=default,proto3,oneof\"`\n}\n\nfunc (*FieldOneof_If) isFieldOneof_Cond() {}\n\nfunc (*FieldOneof_Default) isFieldOneof_Cond() {}\n\n// CELPlugin define schema of CEL plugin.\ntype CELPlugin struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tExport []*CELPluginExport `protobuf:\"bytes,1,rep,name=export,proto3\" json:\"export,omitempty\"`\n}\n\nfunc (x *CELPlugin) Reset() {\n\t*x = CELPlugin{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[36]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPlugin) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPlugin) ProtoMessage() {}\n\nfunc (x *CELPlugin) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[36]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPlugin.ProtoReflect.Descriptor instead.\nfunc (*CELPlugin) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{36}\n}\n\nfunc (x *CELPlugin) GetExport() []*CELPluginExport {\n\tif x != nil {\n\t\treturn x.Export\n\t}\n\treturn nil\n}\n\n// CELPluginExport describe the schema to be exposed as a CEL plugin.\ntype CELPluginExport struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the plugin name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// types describe the message type you want to expose.\n\tTypes []*CELReceiverType `protobuf:\"bytes,3,rep,name=types,proto3\" json:\"types,omitempty\"`\n\t// functions describe the definition of the function you want to expose.\n\tFunctions []*CELFunction `protobuf:\"bytes,4,rep,name=functions,proto3\" json:\"functions,omitempty\"`\n\t// variables describe the definition of the variable you want to expose.\n\tVariables  []*CELVariable       `protobuf:\"bytes,5,rep,name=variables,proto3\" json:\"variables,omitempty\"`\n\tCapability *CELPluginCapability `protobuf:\"bytes,6,opt,name=capability,proto3\" json:\"capability,omitempty\"`\n}\n\nfunc (x *CELPluginExport) Reset() {\n\t*x = CELPluginExport{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[37]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginExport) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginExport) ProtoMessage() {}\n\nfunc (x *CELPluginExport) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[37]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginExport.ProtoReflect.Descriptor instead.\nfunc (*CELPluginExport) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{37}\n}\n\nfunc (x *CELPluginExport) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELPluginExport) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELPluginExport) GetTypes() []*CELReceiverType {\n\tif x != nil {\n\t\treturn x.Types\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginExport) GetFunctions() []*CELFunction {\n\tif x != nil {\n\t\treturn x.Functions\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginExport) GetVariables() []*CELVariable {\n\tif x != nil {\n\t\treturn x.Variables\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginExport) GetCapability() *CELPluginCapability {\n\tif x != nil {\n\t\treturn x.Capability\n\t}\n\treturn nil\n}\n\n// CELPluginCapability controls the permissions granted to the WebAssembly plugin.\ntype CELPluginCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// env is the capability for environment variable.\n\tEnv *CELPluginEnvCapability `protobuf:\"bytes,1,opt,name=env,proto3,oneof\" json:\"env,omitempty\"`\n\t// file_system is the capability for file system.\n\tFileSystem *CELPluginFileSystemCapability `protobuf:\"bytes,2,opt,name=file_system,json=fileSystem,proto3,oneof\" json:\"file_system,omitempty\"`\n\t// network is the capability for network.\n\tNetwork *CELPluginNetworkCapability `protobuf:\"bytes,3,opt,name=network,proto3,oneof\" json:\"network,omitempty\"`\n}\n\nfunc (x *CELPluginCapability) Reset() {\n\t*x = CELPluginCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[38]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginCapability) ProtoMessage() {}\n\nfunc (x *CELPluginCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[38]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{38}\n}\n\nfunc (x *CELPluginCapability) GetEnv() *CELPluginEnvCapability {\n\tif x != nil {\n\t\treturn x.Env\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginCapability) GetFileSystem() *CELPluginFileSystemCapability {\n\tif x != nil {\n\t\treturn x.FileSystem\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginCapability) GetNetwork() *CELPluginNetworkCapability {\n\tif x != nil {\n\t\treturn x.Network\n\t}\n\treturn nil\n}\n\n// CELPluginEnvCapability controls access to the environment variable.\ntype CELPluginEnvCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// all allows access to all environment variables.\n\tAll bool `protobuf:\"varint,1,opt,name=all,proto3\" json:\"all,omitempty\"`\n\t// specifies accessible names. If \"all\" is true, it takes precedence.\n\tNames []string `protobuf:\"bytes,2,rep,name=names,proto3\" json:\"names,omitempty\"`\n}\n\nfunc (x *CELPluginEnvCapability) Reset() {\n\t*x = CELPluginEnvCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[39]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginEnvCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginEnvCapability) ProtoMessage() {}\n\nfunc (x *CELPluginEnvCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[39]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginEnvCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginEnvCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{39}\n}\n\nfunc (x *CELPluginEnvCapability) GetAll() bool {\n\tif x != nil {\n\t\treturn x.All\n\t}\n\treturn false\n}\n\nfunc (x *CELPluginEnvCapability) GetNames() []string {\n\tif x != nil {\n\t\treturn x.Names\n\t}\n\treturn nil\n}\n\n// CELPluginFileSystemCapability controls access to the file system.\ntype CELPluginFileSystemCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// mount_path specifies the file path of the host to mount.\n\t// If not specified, the root directory will be used.\n\tMountPath string `protobuf:\"bytes,1,opt,name=mount_path,json=mountPath,proto3\" json:\"mount_path,omitempty\"`\n}\n\nfunc (x *CELPluginFileSystemCapability) Reset() {\n\t*x = CELPluginFileSystemCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[40]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginFileSystemCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginFileSystemCapability) ProtoMessage() {}\n\nfunc (x *CELPluginFileSystemCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[40]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginFileSystemCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginFileSystemCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{40}\n}\n\nfunc (x *CELPluginFileSystemCapability) GetMountPath() string {\n\tif x != nil {\n\t\treturn x.MountPath\n\t}\n\treturn \"\"\n}\n\n// CELPluginNetworkCapability sets permissions related to network access.\n// This is an experimental feature.\ntype CELPluginNetworkCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *CELPluginNetworkCapability) Reset() {\n\t*x = CELPluginNetworkCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[41]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginNetworkCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginNetworkCapability) ProtoMessage() {}\n\nfunc (x *CELPluginNetworkCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[41]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginNetworkCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginNetworkCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{41}\n}\n\n// CELFunction represents the CEL function definition.\ntype CELFunction struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the function name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of function.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// args describe the definition of the function argument.\n\tArgs []*CELFunctionArgument `protobuf:\"bytes,3,rep,name=args,proto3\" json:\"args,omitempty\"`\n\t// return describe the definition of return type of function.\n\tReturn *CELType `protobuf:\"bytes,4,opt,name=return,proto3\" json:\"return,omitempty\"`\n}\n\nfunc (x *CELFunction) Reset() {\n\t*x = CELFunction{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[42]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELFunction) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELFunction) ProtoMessage() {}\n\nfunc (x *CELFunction) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[42]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELFunction.ProtoReflect.Descriptor instead.\nfunc (*CELFunction) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{42}\n}\n\nfunc (x *CELFunction) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunction) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunction) GetArgs() []*CELFunctionArgument {\n\tif x != nil {\n\t\treturn x.Args\n\t}\n\treturn nil\n}\n\nfunc (x *CELFunction) GetReturn() *CELType {\n\tif x != nil {\n\t\treturn x.Return\n\t}\n\treturn nil\n}\n\n// CELReceiverType represents methods tied to the message.\ntype CELReceiverType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the message name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// methods describe the definition of the method for the message.\n\tMethods []*CELFunction `protobuf:\"bytes,3,rep,name=methods,proto3\" json:\"methods,omitempty\"`\n}\n\nfunc (x *CELReceiverType) Reset() {\n\t*x = CELReceiverType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[43]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELReceiverType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELReceiverType) ProtoMessage() {}\n\nfunc (x *CELReceiverType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[43]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELReceiverType.ProtoReflect.Descriptor instead.\nfunc (*CELReceiverType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{43}\n}\n\nfunc (x *CELReceiverType) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELReceiverType) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELReceiverType) GetMethods() []*CELFunction {\n\tif x != nil {\n\t\treturn x.Methods\n\t}\n\treturn nil\n}\n\n// CELFunctionArgument represents the function argument.\ntype CELFunctionArgument struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the argument value name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// type is the argument type.\n\tType *CELType `protobuf:\"bytes,3,opt,name=type,proto3\" json:\"type,omitempty\"`\n}\n\nfunc (x *CELFunctionArgument) Reset() {\n\t*x = CELFunctionArgument{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[44]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELFunctionArgument) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELFunctionArgument) ProtoMessage() {}\n\nfunc (x *CELFunctionArgument) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[44]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELFunctionArgument.ProtoReflect.Descriptor instead.\nfunc (*CELFunctionArgument) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{44}\n}\n\nfunc (x *CELFunctionArgument) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunctionArgument) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunctionArgument) GetType() *CELType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\n// CELType represents type information for CEL plugin interface.\ntype CELType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to Type:\n\t//\n\t//\t*CELType_Kind\n\t//\t*CELType_Repeated\n\t//\t*CELType_Map\n\t//\t*CELType_Message\n\t//\t*CELType_Enum\n\tType isCELType_Type `protobuf_oneof:\"type\"`\n}\n\nfunc (x *CELType) Reset() {\n\t*x = CELType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[45]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELType) ProtoMessage() {}\n\nfunc (x *CELType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[45]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELType.ProtoReflect.Descriptor instead.\nfunc (*CELType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{45}\n}\n\nfunc (m *CELType) GetType() isCELType_Type {\n\tif m != nil {\n\t\treturn m.Type\n\t}\n\treturn nil\n}\n\nfunc (x *CELType) GetKind() TypeKind {\n\tif x, ok := x.GetType().(*CELType_Kind); ok {\n\t\treturn x.Kind\n\t}\n\treturn TypeKind_UNKNOWN\n}\n\nfunc (x *CELType) GetRepeated() *CELType {\n\tif x, ok := x.GetType().(*CELType_Repeated); ok {\n\t\treturn x.Repeated\n\t}\n\treturn nil\n}\n\nfunc (x *CELType) GetMap() *CELMapType {\n\tif x, ok := x.GetType().(*CELType_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\nfunc (x *CELType) GetMessage() string {\n\tif x, ok := x.GetType().(*CELType_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELType) GetEnum() string {\n\tif x, ok := x.GetType().(*CELType_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn \"\"\n}\n\ntype isCELType_Type interface {\n\tisCELType_Type()\n}\n\ntype CELType_Kind struct {\n\t// kind is used when the type is a primitive type.\n\tKind TypeKind `protobuf:\"varint,1,opt,name=kind,proto3,enum=grpc.federation.TypeKind,oneof\"`\n}\n\ntype CELType_Repeated struct {\n\t// repeated is used when the type is a repeated type.\n\tRepeated *CELType `protobuf:\"bytes,2,opt,name=repeated,proto3,oneof\"`\n}\n\ntype CELType_Map struct {\n\t// map is used when the type is a map type.\n\tMap *CELMapType `protobuf:\"bytes,3,opt,name=map,proto3,oneof\"`\n}\n\ntype CELType_Message struct {\n\t// message is a fqdn to the message type.\n\tMessage string `protobuf:\"bytes,4,opt,name=message,proto3,oneof\"`\n}\n\ntype CELType_Enum struct {\n\t// enum is a fqdn to the enum type.\n\tEnum string `protobuf:\"bytes,5,opt,name=enum,proto3,oneof\"`\n}\n\nfunc (*CELType_Kind) isCELType_Type() {}\n\nfunc (*CELType_Repeated) isCELType_Type() {}\n\nfunc (*CELType_Map) isCELType_Type() {}\n\nfunc (*CELType_Message) isCELType_Type() {}\n\nfunc (*CELType_Enum) isCELType_Type() {}\n\n// CELMapType represents map type.\ntype CELMapType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// key represents map's key type.\n\tKey *CELType `protobuf:\"bytes,1,opt,name=key,proto3\" json:\"key,omitempty\"`\n\t// value represents map's value type.\n\tValue *CELType `protobuf:\"bytes,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *CELMapType) Reset() {\n\t*x = CELMapType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[46]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELMapType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELMapType) ProtoMessage() {}\n\nfunc (x *CELMapType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[46]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELMapType.ProtoReflect.Descriptor instead.\nfunc (*CELMapType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{46}\n}\n\nfunc (x *CELMapType) GetKey() *CELType {\n\tif x != nil {\n\t\treturn x.Key\n\t}\n\treturn nil\n}\n\nfunc (x *CELMapType) GetValue() *CELType {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn nil\n}\n\n// CELVariable represents CEL variable.\ntype CELVariable struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the variable name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// type is the variable type.\n\tType *CELType `protobuf:\"bytes,3,opt,name=type,proto3\" json:\"type,omitempty\"`\n}\n\nfunc (x *CELVariable) Reset() {\n\t*x = CELVariable{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[47]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELVariable) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELVariable) ProtoMessage() {}\n\nfunc (x *CELVariable) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[47]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELVariable.ProtoReflect.Descriptor instead.\nfunc (*CELVariable) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{47}\n}\n\nfunc (x *CELVariable) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELVariable) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELVariable) GetType() *CELType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nvar file_grpc_federation_federation_proto_extTypes = []protoimpl.ExtensionInfo{\n\t{\n\t\tExtendedType:  (*descriptorpb.FileOptions)(nil),\n\t\tExtensionType: (*FileRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.file\",\n\t\tTag:           \"bytes,1187,opt,name=file\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*ServiceRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.service\",\n\t\tTag:           \"bytes,1187,opt,name=service\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*MethodRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.method\",\n\t\tTag:           \"bytes,1187,opt,name=method\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MessageOptions)(nil),\n\t\tExtensionType: (*MessageRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.message\",\n\t\tTag:           \"bytes,1187,opt,name=message\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*FieldRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.field\",\n\t\tTag:           \"bytes,1187,opt,name=field\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.EnumOptions)(nil),\n\t\tExtensionType: (*EnumRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.enum\",\n\t\tTag:           \"bytes,1187,opt,name=enum\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.EnumValueOptions)(nil),\n\t\tExtensionType: (*EnumValueRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.enum_value\",\n\t\tTag:           \"bytes,1187,opt,name=enum_value\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.OneofOptions)(nil),\n\t\tExtensionType: (*OneofRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.oneof\",\n\t\tTag:           \"bytes,1187,opt,name=oneof\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n}\n\n// Extension fields to descriptorpb.FileOptions.\nvar (\n\t// optional grpc.federation.FileRule file = 1187;\n\tE_File = &file_grpc_federation_federation_proto_extTypes[0]\n)\n\n// Extension fields to descriptorpb.ServiceOptions.\nvar (\n\t// optional grpc.federation.ServiceRule service = 1187;\n\tE_Service = &file_grpc_federation_federation_proto_extTypes[1]\n)\n\n// Extension fields to descriptorpb.MethodOptions.\nvar (\n\t// optional grpc.federation.MethodRule method = 1187;\n\tE_Method = &file_grpc_federation_federation_proto_extTypes[2]\n)\n\n// Extension fields to descriptorpb.MessageOptions.\nvar (\n\t// optional grpc.federation.MessageRule message = 1187;\n\tE_Message = &file_grpc_federation_federation_proto_extTypes[3]\n)\n\n// Extension fields to descriptorpb.FieldOptions.\nvar (\n\t// optional grpc.federation.FieldRule field = 1187;\n\tE_Field = &file_grpc_federation_federation_proto_extTypes[4]\n)\n\n// Extension fields to descriptorpb.EnumOptions.\nvar (\n\t// optional grpc.federation.EnumRule enum = 1187;\n\tE_Enum = &file_grpc_federation_federation_proto_extTypes[5]\n)\n\n// Extension fields to descriptorpb.EnumValueOptions.\nvar (\n\t// optional grpc.federation.EnumValueRule enum_value = 1187;\n\tE_EnumValue = &file_grpc_federation_federation_proto_extTypes[6]\n)\n\n// Extension fields to descriptorpb.OneofOptions.\nvar (\n\t// optional grpc.federation.OneofRule oneof = 1187;\n\tE_Oneof = &file_grpc_federation_federation_proto_extTypes[7]\n)\n\nvar File_grpc_federation_federation_proto protoreflect.FileDescriptor\n\nvar file_grpc_federation_federation_proto_rawDesc = []byte{\n\t0x0a, 0x20, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x12, 0x0f, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70,\n\t0x63, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x64,\n\t0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x67, 0x72,\n\t0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x70, 0x72,\n\t0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x67, 0x72, 0x70,\n\t0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x74, 0x69, 0x6d,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x56, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x52,\n\t0x75, 0x6c, 0x65, 0x12, 0x32, 0x0a, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52,\n\t0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6d, 0x70, 0x6f, 0x72,\n\t0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x22,\n\t0x20, 0x0a, 0x08, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61,\n\t0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61,\n\t0x73, 0x22, 0xb4, 0x01, 0x0a, 0x0d, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52,\n\t0x75, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x88,\n\t0x01, 0x01, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,\n\t0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x37, 0x0a, 0x04, 0x61, 0x74, 0x74, 0x72,\n\t0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c,\n\t0x75, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, 0x04, 0x61, 0x74, 0x74,\n\t0x72, 0x12, 0x1d, 0x0a, 0x07, 0x6e, 0x6f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x04, 0x20, 0x01,\n\t0x28, 0x08, 0x48, 0x01, 0x52, 0x07, 0x6e, 0x6f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x88, 0x01, 0x01,\n\t0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x42, 0x0a, 0x0a, 0x08,\n\t0x5f, 0x6e, 0x6f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x3e, 0x0a, 0x12, 0x45, 0x6e, 0x75, 0x6d,\n\t0x56, 0x61, 0x6c, 0x75, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x12, 0x12,\n\t0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x0b, 0x0a, 0x09, 0x4f, 0x6e, 0x65, 0x6f,\n\t0x66, 0x52, 0x75, 0x6c, 0x65, 0x22, 0x69, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n\t0x52, 0x75, 0x6c, 0x65, 0x12, 0x26, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x14, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x32, 0x0a, 0x03,\n\t0x76, 0x61, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x03, 0x76, 0x61, 0x72,\n\t0x22, 0x4a, 0x0a, 0x03, 0x45, 0x6e, 0x76, 0x12, 0x29, 0x0a, 0x03, 0x76, 0x61, 0x72, 0x18, 0x01,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x52, 0x03, 0x76,\n\t0x61, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x8b, 0x03, 0x0a,\n\t0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65,\n\t0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01,\n\t0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x66, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x02, 0x69, 0x66, 0x88, 0x01, 0x01, 0x12, 0x10,\n\t0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x62, 0x79,\n\t0x12, 0x2c, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x4d, 0x61, 0x70, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x70, 0x12, 0x38,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52,\n\t0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x50, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x69,\n\t0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x61,\n\t0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x0a,\n\t0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x04, 0x65, 0x6e,\n\t0x75, 0x6d, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x45,\n\t0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x35, 0x0a, 0x06, 0x73,\n\t0x77, 0x69, 0x74, 0x63, 0x68, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x77,\n\t0x69, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x06, 0x73, 0x77, 0x69, 0x74,\n\t0x63, 0x68, 0x42, 0x06, 0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e,\n\t0x61, 0x6d, 0x65, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x66, 0x22, 0x49, 0x0a, 0x1d, 0x53, 0x65,\n\t0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c,\n\t0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69,\n\t0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x66, 0x12, 0x18, 0x0a, 0x07, 0x6d,\n\t0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65,\n\t0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x06, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72,\n\t0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79,\n\t0x70, 0x65, 0x12, 0x3a, 0x0a, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x48, 0x00, 0x52, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x09,\n\t0x0a, 0x07, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xab, 0x01, 0x0a, 0x07, 0x45, 0x6e,\n\t0x76, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2f, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x00,\n\t0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x36, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74,\n\t0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79,\n\t0x70, 0x65, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2f,\n\t0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e,\n\t0x76, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x70, 0x42,\n\t0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x68, 0x0a, 0x0a, 0x45, 0x6e, 0x76, 0x4d, 0x61,\n\t0x70, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2a, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79, 0x70, 0x65, 0x52, 0x03, 0x6b, 0x65,\n\t0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,\n\t0x65, 0x22, 0xc3, 0x01, 0x0a, 0x0c, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x09, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61,\n\t0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c,\n\t0x74, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72,\n\t0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64,\n\t0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x07, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65,\n\t0x64, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61,\n\t0x74, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x42, 0x0b,\n\t0x0a, 0x09, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x5f,\n\t0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x22, 0x65, 0x0a, 0x0a, 0x4d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75,\n\t0x74, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e,\n\t0x73, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75,\n\t0x74, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9c,\n\t0x01, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x35,\n\t0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61,\n\t0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e,\n\t0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f,\n\t0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00,\n\t0x52, 0x0e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72,\n\t0x88, 0x01, 0x01, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x03, 0x20, 0x03,\n\t0x28, 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x75,\n\t0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x22, 0xde, 0x03,\n\t0x0a, 0x12, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69,\n\t0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x48, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x13, 0x0a,\n\t0x02, 0x69, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x02, 0x69, 0x66, 0x88,\n\t0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x18, 0x03,\n\t0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64,\n\t0x88, 0x01, 0x01, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48,\n\t0x00, 0x52, 0x02, 0x62, 0x79, 0x12, 0x2c, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x0c, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x61, 0x70, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x03,\n\t0x6d, 0x61, 0x70, 0x12, 0x38, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0d,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78,\n\t0x70, 0x72, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2f, 0x0a,\n\t0x04, 0x63, 0x61, 0x6c, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x61,\n\t0x6c, 0x6c, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x63, 0x61, 0x6c, 0x6c, 0x12, 0x41,\n\t0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45,\n\t0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x12, 0x2f, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e,\n\t0x75, 0x6d, 0x12, 0x35, 0x0a, 0x06, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x18, 0x11, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x48,\n\t0x00, 0x52, 0x06, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x42, 0x06, 0x0a, 0x04, 0x65, 0x78, 0x70,\n\t0x72, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69,\n\t0x66, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x22, 0xc5,\n\t0x01, 0x0a, 0x07, 0x4d, 0x61, 0x70, 0x45, 0x78, 0x70, 0x72, 0x12, 0x35, 0x0a, 0x08, 0x69, 0x74,\n\t0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49,\n\t0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f,\n\t0x72, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,\n\t0x02, 0x62, 0x79, 0x12, 0x38, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0c,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78,\n\t0x70, 0x72, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2f, 0x0a,\n\t0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e,\n\t0x75, 0x6d, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x42, 0x06,\n\t0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x22, 0x30, 0x0a, 0x08, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74,\n\t0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x72, 0x63, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x72, 0x63, 0x22, 0x50, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x45, 0x78, 0x70, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x04, 0x61,\n\t0x72, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x41, 0x72, 0x67, 0x75,\n\t0x6d, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x22, 0x2e, 0x0a, 0x08, 0x45, 0x6e,\n\t0x75, 0x6d, 0x45, 0x78, 0x70, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x62, 0x79,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x62, 0x79, 0x22, 0xf3, 0x02, 0x0a, 0x08, 0x43,\n\t0x61, 0x6c, 0x6c, 0x45, 0x78, 0x70, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12,\n\t0x38, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x07, 0x74, 0x69, 0x6d,\n\t0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x74, 0x69,\n\t0x6d, 0x65, 0x6f, 0x75, 0x74, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x05, 0x72, 0x65, 0x74, 0x72,\n\t0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50,\n\t0x6f, 0x6c, 0x69, 0x63, 0x79, 0x48, 0x01, 0x52, 0x05, 0x72, 0x65, 0x74, 0x72, 0x79, 0x88, 0x01,\n\t0x01, 0x12, 0x30, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72,\n\t0x72, 0x6f, 0x72, 0x12, 0x3c, 0x0a, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x43, 0x61, 0x6c, 0x6c, 0x4f, 0x70,\n\t0x74, 0x69, 0x6f, 0x6e, 0x48, 0x02, 0x52, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01,\n\t0x01, 0x12, 0x1f, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20,\n\t0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x88,\n\t0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x42, 0x08,\n\t0x0a, 0x06, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x79, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,\n\t0x22, 0x7f, 0x0a, 0x0a, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x12, 0x33,\n\t0x0a, 0x04, 0x63, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53,\n\t0x77, 0x69, 0x74, 0x63, 0x68, 0x43, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x72, 0x52, 0x04, 0x63,\n\t0x61, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x44, 0x65, 0x66,\n\t0x61, 0x75, 0x6c, 0x74, 0x45, 0x78, 0x70, 0x72, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c,\n\t0x74, 0x22, 0x71, 0x0a, 0x0e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x43, 0x61, 0x73, 0x65, 0x45,\n\t0x78, 0x70, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x02, 0x69, 0x66, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e,\n\t0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x79,\n\t0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x62, 0x79, 0x42, 0x06, 0x0a, 0x04,\n\t0x65, 0x78, 0x70, 0x72, 0x22, 0x64, 0x0a, 0x11, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x44, 0x65,\n\t0x66, 0x61, 0x75, 0x6c, 0x74, 0x45, 0x78, 0x70, 0x72, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66,\n\t0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c,\n\t0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66,\n\t0x12, 0x10, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02,\n\t0x62, 0x79, 0x42, 0x06, 0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x22, 0x86, 0x04, 0x0a, 0x09, 0x47,\n\t0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18,\n\t0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65,\n\t0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12,\n\t0x13, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x69,\n\t0x66, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x0e, 0x32, 0x10, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e,\n\t0x43, 0x6f, 0x64, 0x65, 0x48, 0x01, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12,\n\t0x1d, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,\n\t0x48, 0x02, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a,\n\t0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x20, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69,\n\t0x6c, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x69, 0x67,\n\t0x6e, 0x6f, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x06, 0x69, 0x67,\n\t0x6e, 0x6f, 0x72, 0x65, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x67, 0x6e, 0x6f, 0x72,\n\t0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x07,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x11, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x41, 0x6e,\n\t0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x88, 0x01, 0x01, 0x12, 0x45, 0x0a, 0x09,\n\t0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32,\n\t0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x4c, 0x6f, 0x67, 0x4c,\n\t0x65, 0x76, 0x65, 0x6c, 0x48, 0x05, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c,\n\t0x88, 0x01, 0x01, 0x22, 0x41, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12,\n\t0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05,\n\t0x44, 0x45, 0x42, 0x55, 0x47, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x4e, 0x46, 0x4f, 0x10,\n\t0x02, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x41, 0x52, 0x4e, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x45,\n\t0x52, 0x52, 0x4f, 0x52, 0x10, 0x04, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x66, 0x42, 0x07, 0x0a,\n\t0x05, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61,\n\t0x67, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x42, 0x16, 0x0a,\n\t0x14, 0x5f, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x72, 0x65, 0x73,\n\t0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65,\n\t0x76, 0x65, 0x6c, 0x22, 0xfa, 0x05, 0x0a, 0x0f, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f,\n\t0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x66, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x02,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44,\n\t0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x36,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78, 0x70, 0x72, 0x52, 0x07, 0x6d,\n\t0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f,\n\t0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66,\n\t0x6f, 0x52, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x34, 0x0a, 0x0a,\n\t0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65,\n\t0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x72, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e,\n\t0x66, 0x6f, 0x12, 0x34, 0x0a, 0x0a, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x69, 0x6e, 0x66, 0x6f,\n\t0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x64,\n\t0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3d, 0x0a, 0x0d, 0x71, 0x75, 0x6f, 0x74,\n\t0x61, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x6f,\n\t0x74, 0x61, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x0c, 0x71, 0x75, 0x6f, 0x74, 0x61,\n\t0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x52, 0x0a, 0x14, 0x70, 0x72, 0x65, 0x63, 0x6f,\n\t0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18,\n\t0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72,\n\t0x70, 0x63, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x46,\n\t0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x13, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69,\n\t0x74, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x62,\n\t0x61, 0x64, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61,\n\t0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x62, 0x61, 0x64, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f,\n\t0x69, 0x6e, 0x66, 0x6f, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49,\n\t0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f,\n\t0x12, 0x3d, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66,\n\t0x6f, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66,\n\t0x6f, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12,\n\t0x24, 0x0a, 0x04, 0x68, 0x65, 0x6c, 0x70, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x48, 0x65, 0x6c, 0x70, 0x52,\n\t0x04, 0x68, 0x65, 0x6c, 0x70, 0x12, 0x49, 0x0a, 0x11, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a,\n\t0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f,\n\t0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x10,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,\n\t0x12, 0x0e, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x02, 0x62, 0x79,\n\t0x22, 0xc7, 0x03, 0x0a, 0x0e, 0x47, 0x52, 0x50, 0x43, 0x43, 0x61, 0x6c, 0x6c, 0x4f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x73,\n\t0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0e,\n\t0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x88, 0x01,\n\t0x01, 0x12, 0x1b, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x48, 0x01, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x37,\n\t0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x72, 0x65, 0x63, 0x76, 0x5f,\n\t0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02,\n\t0x52, 0x12, 0x6d, 0x61, 0x78, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x63, 0x76, 0x4d, 0x73, 0x67,\n\t0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x63,\n\t0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a,\n\t0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x43, 0x61,\n\t0x6c, 0x6c, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01,\n\t0x12, 0x28, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x48, 0x04, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x69,\n\t0x63, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x74, 0x72,\n\t0x61, 0x69, 0x6c, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x07, 0x74,\n\t0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x0e, 0x77, 0x61, 0x69,\n\t0x74, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28,\n\t0x08, 0x48, 0x06, 0x52, 0x0c, 0x77, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x52, 0x65, 0x61, 0x64,\n\t0x79, 0x88, 0x01, 0x01, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,\n\t0x5f, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x68, 0x65, 0x61,\n\t0x64, 0x65, 0x72, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c,\n\t0x5f, 0x72, 0x65, 0x63, 0x76, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x19,\n\t0x0a, 0x17, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x65, 0x6e, 0x64,\n\t0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x74,\n\t0x61, 0x74, 0x69, 0x63, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x5f,\n\t0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x77, 0x61, 0x69, 0x74,\n\t0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x22, 0x64, 0x0a, 0x0e, 0x56, 0x61,\n\t0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72, 0x12, 0x17, 0x0a, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72,\n\t0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65,\n\t0x22, 0xb8, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,\n\t0x12, 0x42, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,\n\t0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x73,\n\t0x74, 0x61, 0x6e, 0x74, 0x12, 0x4b, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74,\n\t0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x72,\n\t0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x69,\n\t0x61, 0x6c, 0x48, 0x00, 0x52, 0x0b, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x69, 0x61,\n\t0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,\n\t0x66, 0x42, 0x08, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x79, 0x0a, 0x13, 0x52,\n\t0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61,\n\t0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c,\n\t0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69,\n\t0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, 0x01, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x52,\n\t0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x69, 0x6e,\n\t0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x72,\n\t0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0xd1, 0x02, 0x0a, 0x16, 0x52, 0x65, 0x74, 0x72, 0x79,\n\t0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x69, 0x61,\n\t0x6c, 0x12, 0x2e, 0x0a, 0x10, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x74,\n\t0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0f, 0x69,\n\t0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x88, 0x01,\n\t0x01, 0x12, 0x36, 0x0a, 0x14, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x48,\n\t0x01, 0x52, 0x13, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0a, 0x6d, 0x75, 0x6c,\n\t0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x48, 0x02, 0x52,\n\t0x0a, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x26,\n\t0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x04,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x49, 0x6e, 0x74, 0x65, 0x72,\n\t0x76, 0x61, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65,\n\t0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x48, 0x04, 0x52, 0x0a, 0x6d,\n\t0x61, 0x78, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x42, 0x13, 0x0a, 0x11,\n\t0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61,\n\t0x6c, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x6d,\n\t0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6d, 0x61,\n\t0x78, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d,\n\t0x61, 0x78, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x5d, 0x0a, 0x0d, 0x4d, 0x65,\n\t0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x66,\n\t0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c,\n\t0x64, 0x12, 0x13, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,\n\t0x02, 0x62, 0x79, 0x88, 0x01, 0x01, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x48, 0x01, 0x52, 0x02, 0x69, 0x66, 0x88, 0x01, 0x01, 0x42, 0x05, 0x0a, 0x03, 0x5f,\n\t0x62, 0x79, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x66, 0x22, 0x85, 0x01, 0x0a, 0x0e, 0x4d, 0x65,\n\t0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x17, 0x0a, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x88, 0x01, 0x01,\n\t0x12, 0x1f, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x08, 0x48, 0x02, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x88, 0x01,\n\t0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x66,\n\t0x69, 0x65, 0x6c, 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e,\n\t0x64, 0x22, 0x62, 0x0a, 0x08, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x12, 0x13, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,\n\t0x02, 0x62, 0x79, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x06, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65,\n\t0x88, 0x01, 0x01, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x62, 0x79, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x69,\n\t0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0xf2, 0x01, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52,\n\t0x75, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65,\n\t0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0e,\n\t0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x88, 0x01,\n\t0x01, 0x12, 0x13, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52,\n\t0x02, 0x62, 0x79, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x88, 0x01,\n\t0x01, 0x12, 0x31, 0x0a, 0x05, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x52, 0x05, 0x6f,\n\t0x6e, 0x65, 0x6f, 0x66, 0x12, 0x2f, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x05, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x52, 0x03, 0x65, 0x6e, 0x76, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d,\n\t0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x62, 0x79,\n\t0x42, 0x08, 0x0a, 0x06, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x89, 0x01, 0x0a, 0x0a, 0x46,\n\t0x69, 0x65, 0x6c, 0x64, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x12, 0x10, 0x0a, 0x02, 0x69, 0x66, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x69, 0x66, 0x12, 0x1a, 0x0a, 0x07, 0x64,\n\t0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x07,\n\t0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x03,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44,\n\t0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x0e,\n\t0x0a, 0x02, 0x62, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x62, 0x79, 0x42, 0x06,\n\t0x0a, 0x04, 0x63, 0x6f, 0x6e, 0x64, 0x22, 0x45, 0x0a, 0x09, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75,\n\t0x67, 0x69, 0x6e, 0x12, 0x38, 0x0a, 0x06, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20,\n\t0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x45,\n\t0x78, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x06, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x22, 0xaf, 0x02,\n\t0x0a, 0x0f, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x45, 0x78, 0x70, 0x6f, 0x72,\n\t0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x36, 0x0a, 0x05, 0x74, 0x79, 0x70,\n\t0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x52, 0x65,\n\t0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x74, 0x79, 0x70, 0x65,\n\t0x73, 0x12, 0x3a, 0x0a, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69,\n\t0x6f, 0x6e, 0x52, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3a, 0x0a,\n\t0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x09,\n\t0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x44, 0x0a, 0x0a, 0x63, 0x61, 0x70,\n\t0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c,\n\t0x69, 0x74, 0x79, 0x52, 0x0a, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22,\n\t0x9b, 0x02, 0x0a, 0x13, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x70,\n\t0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x3e, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e,\n\t0x45, 0x6e, 0x76, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x48, 0x00, 0x52,\n\t0x03, 0x65, 0x6e, 0x76, 0x88, 0x01, 0x01, 0x12, 0x54, 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x65, 0x5f,\n\t0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43,\n\t0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x73, 0x74,\n\t0x65, 0x6d, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x48, 0x01, 0x52, 0x0a,\n\t0x66, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x4a, 0x0a,\n\t0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b,\n\t0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72,\n\t0x6b, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x48, 0x02, 0x52, 0x07, 0x6e,\n\t0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x88, 0x01, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x65, 0x6e,\n\t0x76, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65,\n\t0x6d, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x40, 0x0a,\n\t0x16, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x45, 0x6e, 0x76, 0x43, 0x61, 0x70,\n\t0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d,\n\t0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22,\n\t0x3e, 0x0a, 0x1d, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65,\n\t0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79,\n\t0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 0x74, 0x68, 0x22,\n\t0x1c, 0x0a, 0x1a, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x4e, 0x65, 0x74, 0x77,\n\t0x6f, 0x72, 0x6b, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22, 0xa1, 0x01,\n\t0x0a, 0x0b, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x38, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x03, 0x20,\n\t0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,\n\t0x6e, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12,\n\t0x30, 0x0a, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72,\n\t0x6e, 0x22, 0x71, 0x0a, 0x0f, 0x43, 0x45, 0x4c, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72,\n\t0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x36, 0x0a, 0x07,\n\t0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x6d, 0x65, 0x74,\n\t0x68, 0x6f, 0x64, 0x73, 0x22, 0x6b, 0x0a, 0x13, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74,\n\t0x69, 0x6f, 0x6e, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,\n\t0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64,\n\t0x65, 0x73, 0x63, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70,\n\t0x65, 0x22, 0xdd, 0x01, 0x0a, 0x07, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2f, 0x0a,\n\t0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x79,\n\t0x70, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x36,\n\t0x0a, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65,\n\t0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2f, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65,\n\t0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x70, 0x12, 0x1a, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61,\n\t0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28,\n\t0x09, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70,\n\t0x65, 0x22, 0x68, 0x0a, 0x0a, 0x43, 0x45, 0x4c, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65, 0x12,\n\t0x2a, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43,\n\t0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76,\n\t0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70,\n\t0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c,\n\t0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x63, 0x0a, 0x0b, 0x43,\n\t0x45, 0x4c, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12,\n\t0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65,\n\t0x73, 0x63, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65,\n\t0x2a, 0x5e, 0x0a, 0x08, 0x54, 0x79, 0x70, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x0b, 0x0a, 0x07,\n\t0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52,\n\t0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x4f, 0x4f, 0x4c, 0x10, 0x02, 0x12,\n\t0x09, 0x0a, 0x05, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x49,\n\t0x4e, 0x54, 0x36, 0x34, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45,\n\t0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x06,\n\t0x3a, 0x4c, 0x0a, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x46, 0x69, 0x6c, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x3a, 0x58,\n\t0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52,\n\t0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x3a, 0x54, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a, 0x58,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52,\n\t0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x50, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c,\n\t0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52,\n\t0x75, 0x6c, 0x65, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x3a, 0x4c, 0x0a, 0x04, 0x65, 0x6e,\n\t0x75, 0x6d, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x75,\n\t0x6c, 0x65, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x3a, 0x61, 0x0a, 0x0a, 0x65, 0x6e, 0x75, 0x6d,\n\t0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c,\n\t0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x1e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x75, 0x6c, 0x65,\n\t0x52, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x50, 0x0a, 0x05, 0x6f,\n\t0x6e, 0x65, 0x6f, 0x66, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70,\n\t0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x6e, 0x65,\n\t0x6f, 0x66, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x42, 0xc2, 0x01,\n\t0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0f, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,\n\t0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x65, 0x72, 0x63, 0x61, 0x72, 0x69, 0x2f, 0x67, 0x72, 0x70,\n\t0x63, 0x2d, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x67, 0x72, 0x70,\n\t0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xa2, 0x02, 0x03, 0x47, 0x46, 0x58, 0xaa, 0x02, 0x0f,\n\t0x47, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xca,\n\t0x02, 0x0f, 0x47, 0x72, 0x70, 0x63, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0xe2, 0x02, 0x1b, 0x47, 0x72, 0x70, 0x63, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea,\n\t0x02, 0x10, 0x47, 0x72, 0x70, 0x63, 0x3a, 0x3a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_grpc_federation_federation_proto_rawDescOnce sync.Once\n\tfile_grpc_federation_federation_proto_rawDescData = file_grpc_federation_federation_proto_rawDesc\n)\n\nfunc file_grpc_federation_federation_proto_rawDescGZIP() []byte {\n\tfile_grpc_federation_federation_proto_rawDescOnce.Do(func() {\n\t\tfile_grpc_federation_federation_proto_rawDescData = protoimpl.X.CompressGZIP(file_grpc_federation_federation_proto_rawDescData)\n\t})\n\treturn file_grpc_federation_federation_proto_rawDescData\n}\n\nvar file_grpc_federation_federation_proto_enumTypes = make([]protoimpl.EnumInfo, 2)\nvar file_grpc_federation_federation_proto_msgTypes = make([]protoimpl.MessageInfo, 48)\nvar file_grpc_federation_federation_proto_goTypes = []interface{}{\n\t(TypeKind)(0),                          // 0: grpc.federation.TypeKind\n\t(GRPCError_LogLevel)(0),                // 1: grpc.federation.GRPCError.LogLevel\n\t(*FileRule)(nil),                       // 2: grpc.federation.FileRule\n\t(*EnumRule)(nil),                       // 3: grpc.federation.EnumRule\n\t(*EnumValueRule)(nil),                  // 4: grpc.federation.EnumValueRule\n\t(*EnumValueAttribute)(nil),             // 5: grpc.federation.EnumValueAttribute\n\t(*OneofRule)(nil),                      // 6: grpc.federation.OneofRule\n\t(*ServiceRule)(nil),                    // 7: grpc.federation.ServiceRule\n\t(*Env)(nil),                            // 8: grpc.federation.Env\n\t(*ServiceVariable)(nil),                // 9: grpc.federation.ServiceVariable\n\t(*ServiceVariableValidationExpr)(nil),  // 10: grpc.federation.ServiceVariableValidationExpr\n\t(*EnvVar)(nil),                         // 11: grpc.federation.EnvVar\n\t(*EnvType)(nil),                        // 12: grpc.federation.EnvType\n\t(*EnvMapType)(nil),                     // 13: grpc.federation.EnvMapType\n\t(*EnvVarOption)(nil),                   // 14: grpc.federation.EnvVarOption\n\t(*MethodRule)(nil),                     // 15: grpc.federation.MethodRule\n\t(*MessageRule)(nil),                    // 16: grpc.federation.MessageRule\n\t(*VariableDefinition)(nil),             // 17: grpc.federation.VariableDefinition\n\t(*MapExpr)(nil),                        // 18: grpc.federation.MapExpr\n\t(*Iterator)(nil),                       // 19: grpc.federation.Iterator\n\t(*MessageExpr)(nil),                    // 20: grpc.federation.MessageExpr\n\t(*EnumExpr)(nil),                       // 21: grpc.federation.EnumExpr\n\t(*CallExpr)(nil),                       // 22: grpc.federation.CallExpr\n\t(*SwitchExpr)(nil),                     // 23: grpc.federation.SwitchExpr\n\t(*SwitchCaseExpr)(nil),                 // 24: grpc.federation.SwitchCaseExpr\n\t(*SwitchDefaultExpr)(nil),              // 25: grpc.federation.SwitchDefaultExpr\n\t(*GRPCError)(nil),                      // 26: grpc.federation.GRPCError\n\t(*GRPCErrorDetail)(nil),                // 27: grpc.federation.GRPCErrorDetail\n\t(*GRPCCallOption)(nil),                 // 28: grpc.federation.GRPCCallOption\n\t(*ValidationExpr)(nil),                 // 29: grpc.federation.ValidationExpr\n\t(*RetryPolicy)(nil),                    // 30: grpc.federation.RetryPolicy\n\t(*RetryPolicyConstant)(nil),            // 31: grpc.federation.RetryPolicyConstant\n\t(*RetryPolicyExponential)(nil),         // 32: grpc.federation.RetryPolicyExponential\n\t(*MethodRequest)(nil),                  // 33: grpc.federation.MethodRequest\n\t(*MethodResponse)(nil),                 // 34: grpc.federation.MethodResponse\n\t(*Argument)(nil),                       // 35: grpc.federation.Argument\n\t(*FieldRule)(nil),                      // 36: grpc.federation.FieldRule\n\t(*FieldOneof)(nil),                     // 37: grpc.federation.FieldOneof\n\t(*CELPlugin)(nil),                      // 38: grpc.federation.CELPlugin\n\t(*CELPluginExport)(nil),                // 39: grpc.federation.CELPluginExport\n\t(*CELPluginCapability)(nil),            // 40: grpc.federation.CELPluginCapability\n\t(*CELPluginEnvCapability)(nil),         // 41: grpc.federation.CELPluginEnvCapability\n\t(*CELPluginFileSystemCapability)(nil),  // 42: grpc.federation.CELPluginFileSystemCapability\n\t(*CELPluginNetworkCapability)(nil),     // 43: grpc.federation.CELPluginNetworkCapability\n\t(*CELFunction)(nil),                    // 44: grpc.federation.CELFunction\n\t(*CELReceiverType)(nil),                // 45: grpc.federation.CELReceiverType\n\t(*CELFunctionArgument)(nil),            // 46: grpc.federation.CELFunctionArgument\n\t(*CELType)(nil),                        // 47: grpc.federation.CELType\n\t(*CELMapType)(nil),                     // 48: grpc.federation.CELMapType\n\t(*CELVariable)(nil),                    // 49: grpc.federation.CELVariable\n\t(code.Code)(0),                         // 50: google.rpc.Code\n\t(*errdetails.ErrorInfo)(nil),           // 51: google.rpc.ErrorInfo\n\t(*errdetails.RetryInfo)(nil),           // 52: google.rpc.RetryInfo\n\t(*errdetails.DebugInfo)(nil),           // 53: google.rpc.DebugInfo\n\t(*errdetails.QuotaFailure)(nil),        // 54: google.rpc.QuotaFailure\n\t(*errdetails.PreconditionFailure)(nil), // 55: google.rpc.PreconditionFailure\n\t(*errdetails.BadRequest)(nil),          // 56: google.rpc.BadRequest\n\t(*errdetails.RequestInfo)(nil),         // 57: google.rpc.RequestInfo\n\t(*errdetails.ResourceInfo)(nil),        // 58: google.rpc.ResourceInfo\n\t(*errdetails.Help)(nil),                // 59: google.rpc.Help\n\t(*errdetails.LocalizedMessage)(nil),    // 60: google.rpc.LocalizedMessage\n\t(*descriptorpb.FileOptions)(nil),       // 61: google.protobuf.FileOptions\n\t(*descriptorpb.ServiceOptions)(nil),    // 62: google.protobuf.ServiceOptions\n\t(*descriptorpb.MethodOptions)(nil),     // 63: google.protobuf.MethodOptions\n\t(*descriptorpb.MessageOptions)(nil),    // 64: google.protobuf.MessageOptions\n\t(*descriptorpb.FieldOptions)(nil),      // 65: google.protobuf.FieldOptions\n\t(*descriptorpb.EnumOptions)(nil),       // 66: google.protobuf.EnumOptions\n\t(*descriptorpb.EnumValueOptions)(nil),  // 67: google.protobuf.EnumValueOptions\n\t(*descriptorpb.OneofOptions)(nil),      // 68: google.protobuf.OneofOptions\n}\nvar file_grpc_federation_federation_proto_depIdxs = []int32{\n\t38, // 0: grpc.federation.FileRule.plugin:type_name -> grpc.federation.CELPlugin\n\t5,  // 1: grpc.federation.EnumValueRule.attr:type_name -> grpc.federation.EnumValueAttribute\n\t8,  // 2: grpc.federation.ServiceRule.env:type_name -> grpc.federation.Env\n\t9,  // 3: grpc.federation.ServiceRule.var:type_name -> grpc.federation.ServiceVariable\n\t11, // 4: grpc.federation.Env.var:type_name -> grpc.federation.EnvVar\n\t18, // 5: grpc.federation.ServiceVariable.map:type_name -> grpc.federation.MapExpr\n\t20, // 6: grpc.federation.ServiceVariable.message:type_name -> grpc.federation.MessageExpr\n\t10, // 7: grpc.federation.ServiceVariable.validation:type_name -> grpc.federation.ServiceVariableValidationExpr\n\t21, // 8: grpc.federation.ServiceVariable.enum:type_name -> grpc.federation.EnumExpr\n\t23, // 9: grpc.federation.ServiceVariable.switch:type_name -> grpc.federation.SwitchExpr\n\t12, // 10: grpc.federation.EnvVar.type:type_name -> grpc.federation.EnvType\n\t14, // 11: grpc.federation.EnvVar.option:type_name -> grpc.federation.EnvVarOption\n\t0,  // 12: grpc.federation.EnvType.kind:type_name -> grpc.federation.TypeKind\n\t12, // 13: grpc.federation.EnvType.repeated:type_name -> grpc.federation.EnvType\n\t13, // 14: grpc.federation.EnvType.map:type_name -> grpc.federation.EnvMapType\n\t12, // 15: grpc.federation.EnvMapType.key:type_name -> grpc.federation.EnvType\n\t12, // 16: grpc.federation.EnvMapType.value:type_name -> grpc.federation.EnvType\n\t17, // 17: grpc.federation.MessageRule.def:type_name -> grpc.federation.VariableDefinition\n\t18, // 18: grpc.federation.VariableDefinition.map:type_name -> grpc.federation.MapExpr\n\t20, // 19: grpc.federation.VariableDefinition.message:type_name -> grpc.federation.MessageExpr\n\t22, // 20: grpc.federation.VariableDefinition.call:type_name -> grpc.federation.CallExpr\n\t29, // 21: grpc.federation.VariableDefinition.validation:type_name -> grpc.federation.ValidationExpr\n\t21, // 22: grpc.federation.VariableDefinition.enum:type_name -> grpc.federation.EnumExpr\n\t23, // 23: grpc.federation.VariableDefinition.switch:type_name -> grpc.federation.SwitchExpr\n\t19, // 24: grpc.federation.MapExpr.iterator:type_name -> grpc.federation.Iterator\n\t20, // 25: grpc.federation.MapExpr.message:type_name -> grpc.federation.MessageExpr\n\t21, // 26: grpc.federation.MapExpr.enum:type_name -> grpc.federation.EnumExpr\n\t35, // 27: grpc.federation.MessageExpr.args:type_name -> grpc.federation.Argument\n\t33, // 28: grpc.federation.CallExpr.request:type_name -> grpc.federation.MethodRequest\n\t30, // 29: grpc.federation.CallExpr.retry:type_name -> grpc.federation.RetryPolicy\n\t26, // 30: grpc.federation.CallExpr.error:type_name -> grpc.federation.GRPCError\n\t28, // 31: grpc.federation.CallExpr.option:type_name -> grpc.federation.GRPCCallOption\n\t24, // 32: grpc.federation.SwitchExpr.case:type_name -> grpc.federation.SwitchCaseExpr\n\t25, // 33: grpc.federation.SwitchExpr.default:type_name -> grpc.federation.SwitchDefaultExpr\n\t17, // 34: grpc.federation.SwitchCaseExpr.def:type_name -> grpc.federation.VariableDefinition\n\t17, // 35: grpc.federation.SwitchDefaultExpr.def:type_name -> grpc.federation.VariableDefinition\n\t17, // 36: grpc.federation.GRPCError.def:type_name -> grpc.federation.VariableDefinition\n\t50, // 37: grpc.federation.GRPCError.code:type_name -> google.rpc.Code\n\t27, // 38: grpc.federation.GRPCError.details:type_name -> grpc.federation.GRPCErrorDetail\n\t1,  // 39: grpc.federation.GRPCError.log_level:type_name -> grpc.federation.GRPCError.LogLevel\n\t17, // 40: grpc.federation.GRPCErrorDetail.def:type_name -> grpc.federation.VariableDefinition\n\t20, // 41: grpc.federation.GRPCErrorDetail.message:type_name -> grpc.federation.MessageExpr\n\t51, // 42: grpc.federation.GRPCErrorDetail.error_info:type_name -> google.rpc.ErrorInfo\n\t52, // 43: grpc.federation.GRPCErrorDetail.retry_info:type_name -> google.rpc.RetryInfo\n\t53, // 44: grpc.federation.GRPCErrorDetail.debug_info:type_name -> google.rpc.DebugInfo\n\t54, // 45: grpc.federation.GRPCErrorDetail.quota_failure:type_name -> google.rpc.QuotaFailure\n\t55, // 46: grpc.federation.GRPCErrorDetail.precondition_failure:type_name -> google.rpc.PreconditionFailure\n\t56, // 47: grpc.federation.GRPCErrorDetail.bad_request:type_name -> google.rpc.BadRequest\n\t57, // 48: grpc.federation.GRPCErrorDetail.request_info:type_name -> google.rpc.RequestInfo\n\t58, // 49: grpc.federation.GRPCErrorDetail.resource_info:type_name -> google.rpc.ResourceInfo\n\t59, // 50: grpc.federation.GRPCErrorDetail.help:type_name -> google.rpc.Help\n\t60, // 51: grpc.federation.GRPCErrorDetail.localized_message:type_name -> google.rpc.LocalizedMessage\n\t26, // 52: grpc.federation.ValidationExpr.error:type_name -> grpc.federation.GRPCError\n\t31, // 53: grpc.federation.RetryPolicy.constant:type_name -> grpc.federation.RetryPolicyConstant\n\t32, // 54: grpc.federation.RetryPolicy.exponential:type_name -> grpc.federation.RetryPolicyExponential\n\t37, // 55: grpc.federation.FieldRule.oneof:type_name -> grpc.federation.FieldOneof\n\t14, // 56: grpc.federation.FieldRule.env:type_name -> grpc.federation.EnvVarOption\n\t17, // 57: grpc.federation.FieldOneof.def:type_name -> grpc.federation.VariableDefinition\n\t39, // 58: grpc.federation.CELPlugin.export:type_name -> grpc.federation.CELPluginExport\n\t45, // 59: grpc.federation.CELPluginExport.types:type_name -> grpc.federation.CELReceiverType\n\t44, // 60: grpc.federation.CELPluginExport.functions:type_name -> grpc.federation.CELFunction\n\t49, // 61: grpc.federation.CELPluginExport.variables:type_name -> grpc.federation.CELVariable\n\t40, // 62: grpc.federation.CELPluginExport.capability:type_name -> grpc.federation.CELPluginCapability\n\t41, // 63: grpc.federation.CELPluginCapability.env:type_name -> grpc.federation.CELPluginEnvCapability\n\t42, // 64: grpc.federation.CELPluginCapability.file_system:type_name -> grpc.federation.CELPluginFileSystemCapability\n\t43, // 65: grpc.federation.CELPluginCapability.network:type_name -> grpc.federation.CELPluginNetworkCapability\n\t46, // 66: grpc.federation.CELFunction.args:type_name -> grpc.federation.CELFunctionArgument\n\t47, // 67: grpc.federation.CELFunction.return:type_name -> grpc.federation.CELType\n\t44, // 68: grpc.federation.CELReceiverType.methods:type_name -> grpc.federation.CELFunction\n\t47, // 69: grpc.federation.CELFunctionArgument.type:type_name -> grpc.federation.CELType\n\t0,  // 70: grpc.federation.CELType.kind:type_name -> grpc.federation.TypeKind\n\t47, // 71: grpc.federation.CELType.repeated:type_name -> grpc.federation.CELType\n\t48, // 72: grpc.federation.CELType.map:type_name -> grpc.federation.CELMapType\n\t47, // 73: grpc.federation.CELMapType.key:type_name -> grpc.federation.CELType\n\t47, // 74: grpc.federation.CELMapType.value:type_name -> grpc.federation.CELType\n\t47, // 75: grpc.federation.CELVariable.type:type_name -> grpc.federation.CELType\n\t61, // 76: grpc.federation.file:extendee -> google.protobuf.FileOptions\n\t62, // 77: grpc.federation.service:extendee -> google.protobuf.ServiceOptions\n\t63, // 78: grpc.federation.method:extendee -> google.protobuf.MethodOptions\n\t64, // 79: grpc.federation.message:extendee -> google.protobuf.MessageOptions\n\t65, // 80: grpc.federation.field:extendee -> google.protobuf.FieldOptions\n\t66, // 81: grpc.federation.enum:extendee -> google.protobuf.EnumOptions\n\t67, // 82: grpc.federation.enum_value:extendee -> google.protobuf.EnumValueOptions\n\t68, // 83: grpc.federation.oneof:extendee -> google.protobuf.OneofOptions\n\t2,  // 84: grpc.federation.file:type_name -> grpc.federation.FileRule\n\t7,  // 85: grpc.federation.service:type_name -> grpc.federation.ServiceRule\n\t15, // 86: grpc.federation.method:type_name -> grpc.federation.MethodRule\n\t16, // 87: grpc.federation.message:type_name -> grpc.federation.MessageRule\n\t36, // 88: grpc.federation.field:type_name -> grpc.federation.FieldRule\n\t3,  // 89: grpc.federation.enum:type_name -> grpc.federation.EnumRule\n\t4,  // 90: grpc.federation.enum_value:type_name -> grpc.federation.EnumValueRule\n\t6,  // 91: grpc.federation.oneof:type_name -> grpc.federation.OneofRule\n\t92, // [92:92] is the sub-list for method output_type\n\t92, // [92:92] is the sub-list for method input_type\n\t84, // [84:92] is the sub-list for extension type_name\n\t76, // [76:84] is the sub-list for extension extendee\n\t0,  // [0:76] is the sub-list for field type_name\n}\n\nfunc init() { file_grpc_federation_federation_proto_init() }\nfunc file_grpc_federation_federation_proto_init() {\n\tif File_grpc_federation_federation_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_grpc_federation_federation_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*FileRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumValueRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumValueAttribute); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*OneofRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Env); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceVariable); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceVariableValidationExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvVar); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvMapType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvVarOption); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MethodRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MessageRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*VariableDefinition); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MapExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Iterator); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MessageExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CallExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SwitchExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SwitchCaseExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SwitchDefaultExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GRPCError); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GRPCErrorDetail); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GRPCCallOption); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ValidationExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RetryPolicy); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RetryPolicyConstant); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RetryPolicyExponential); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MethodRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MethodResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Argument); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*FieldRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*FieldOneof); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPlugin); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginExport); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginEnvCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginFileSystemCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginNetworkCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELFunction); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELReceiverType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELFunctionArgument); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELMapType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELVariable); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[2].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[7].OneofWrappers = []interface{}{\n\t\t(*ServiceVariable_By)(nil),\n\t\t(*ServiceVariable_Map)(nil),\n\t\t(*ServiceVariable_Message)(nil),\n\t\t(*ServiceVariable_Validation)(nil),\n\t\t(*ServiceVariable_Enum)(nil),\n\t\t(*ServiceVariable_Switch)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[9].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[10].OneofWrappers = []interface{}{\n\t\t(*EnvType_Kind)(nil),\n\t\t(*EnvType_Repeated)(nil),\n\t\t(*EnvType_Map)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[12].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[13].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[14].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[15].OneofWrappers = []interface{}{\n\t\t(*VariableDefinition_By)(nil),\n\t\t(*VariableDefinition_Map)(nil),\n\t\t(*VariableDefinition_Message)(nil),\n\t\t(*VariableDefinition_Call)(nil),\n\t\t(*VariableDefinition_Validation)(nil),\n\t\t(*VariableDefinition_Enum)(nil),\n\t\t(*VariableDefinition_Switch)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[16].OneofWrappers = []interface{}{\n\t\t(*MapExpr_By)(nil),\n\t\t(*MapExpr_Message)(nil),\n\t\t(*MapExpr_Enum)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[20].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[22].OneofWrappers = []interface{}{\n\t\t(*SwitchCaseExpr_By)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[23].OneofWrappers = []interface{}{\n\t\t(*SwitchDefaultExpr_By)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[24].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[26].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[27].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[28].OneofWrappers = []interface{}{\n\t\t(*RetryPolicy_Constant)(nil),\n\t\t(*RetryPolicy_Exponential)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[29].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[30].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[31].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[32].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[33].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[34].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[35].OneofWrappers = []interface{}{\n\t\t(*FieldOneof_If)(nil),\n\t\t(*FieldOneof_Default)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[38].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[45].OneofWrappers = []interface{}{\n\t\t(*CELType_Kind)(nil),\n\t\t(*CELType_Repeated)(nil),\n\t\t(*CELType_Map)(nil),\n\t\t(*CELType_Message)(nil),\n\t\t(*CELType_Enum)(nil),\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_grpc_federation_federation_proto_rawDesc,\n\t\t\tNumEnums:      2,\n\t\t\tNumMessages:   48,\n\t\t\tNumExtensions: 8,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_grpc_federation_federation_proto_goTypes,\n\t\tDependencyIndexes: file_grpc_federation_federation_proto_depIdxs,\n\t\tEnumInfos:         file_grpc_federation_federation_proto_enumTypes,\n\t\tMessageInfos:      file_grpc_federation_federation_proto_msgTypes,\n\t\tExtensionInfos:    file_grpc_federation_federation_proto_extTypes,\n\t}.Build()\n\tFile_grpc_federation_federation_proto = out.File\n\tfile_grpc_federation_federation_proto_rawDesc = nil\n\tfile_grpc_federation_federation_proto_goTypes = nil\n\tfile_grpc_federation_federation_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/14_condition/main_test.go",
    "content": "package main_test\n\nimport (\n\t\"context\"\n\t\"log/slog\"\n\t\"net\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\"\n\t\"go.opentelemetry.io/otel/propagation\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\tsdktrace \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.4.0\"\n\t\"go.uber.org/goleak\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/credentials/insecure\"\n\t\"google.golang.org/grpc/test/bufconn\"\n\n\t\"example/federation\"\n\t\"example/post\"\n)\n\nconst bufSize = 1024\n\nvar (\n\tlistener   *bufconn.Listener\n\tpostClient post.PostServiceClient\n)\n\ntype clientConfig struct{}\n\nfunc (c *clientConfig) Post_PostServiceClient(cfg federation.FederationServiceClientConfig) (post.PostServiceClient, error) {\n\treturn postClient, nil\n}\n\ntype PostServer struct {\n\t*post.UnimplementedPostServiceServer\n}\n\nfunc (s *PostServer) GetPost(ctx context.Context, req *post.GetPostRequest) (*post.GetPostResponse, error) {\n\treturn &post.GetPostResponse{\n\t\tPost: &post.Post{\n\t\t\tId:     req.GetId(),\n\t\t\tTitle:  \"title for \" + req.GetId(),\n\t\t\tUserId: req.GetId(),\n\t\t},\n\t}, nil\n}\n\nfunc dialer(ctx context.Context, address string) (net.Conn, error) {\n\treturn listener.Dial()\n}\n\nfunc TestFederation(t *testing.T) {\n\tdefer goleak.VerifyNone(t)\n\tctx := context.Background()\n\tlistener = bufconn.Listen(bufSize)\n\n\tif os.Getenv(\"ENABLE_JAEGER\") != \"\" {\n\t\texporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithInsecure())\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttp := sdktrace.NewTracerProvider(\n\t\t\tsdktrace.WithBatcher(exporter),\n\t\t\tsdktrace.WithResource(\n\t\t\t\tresource.NewWithAttributes(\n\t\t\t\t\tsemconv.SchemaURL,\n\t\t\t\t\tsemconv.ServiceNameKey.String(\"example14/condition\"),\n\t\t\t\t\tsemconv.ServiceVersionKey.String(\"1.0.0\"),\n\t\t\t\t\tattribute.String(\"environment\", \"dev\"),\n\t\t\t\t),\n\t\t\t),\n\t\t\tsdktrace.WithSampler(sdktrace.AlwaysSample()),\n\t\t)\n\t\tdefer tp.Shutdown(ctx)\n\t\totel.SetTextMapPropagator(propagation.TraceContext{})\n\t\totel.SetTracerProvider(tp)\n\t}\n\n\tconn, err := grpc.DialContext(\n\t\tctx, \"\",\n\t\tgrpc.WithContextDialer(dialer),\n\t\tgrpc.WithTransportCredentials(insecure.NewCredentials()),\n\t)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer conn.Close()\n\n\tpostClient = post.NewPostServiceClient(conn)\n\n\tgrpcServer := grpc.NewServer()\n\tdefer grpcServer.Stop()\n\n\tlogger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{\n\t\tLevel: slog.LevelDebug,\n\t}))\n\tfederationServer, err := federation.NewFederationService(federation.FederationServiceConfig{\n\t\tClient: new(clientConfig),\n\t\tLogger: logger,\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer federation.CleanupFederationService(ctx, federationServer)\n\n\tpost.RegisterPostServiceServer(grpcServer, &PostServer{})\n\tfederation.RegisterFederationServiceServer(grpcServer, federationServer)\n\n\tgo func() {\n\t\tif err := grpcServer.Serve(listener); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t}()\n\n\tclient := federation.NewFederationServiceClient(conn)\n\tres, err := client.GetPost(ctx, &federation.GetPostRequest{\n\t\tId: \"x\",\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif diff := cmp.Diff(res, &federation.GetPostResponse{\n\t\tPost: &federation.Post{\n\t\t\tId:    \"x\",\n\t\t\tTitle: \"title for x\",\n\t\t\tUser: &federation.User{\n\t\t\t\tId: \"x\",\n\t\t\t},\n\t\t},\n\t}, cmpopts.IgnoreUnexported(\n\t\tfederation.GetPostResponse{},\n\t\tfederation.Post{},\n\t\tfederation.User{},\n\t)); diff != \"\" {\n\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t}\n}\n"
  },
  {
    "path": "_examples/14_condition/post/post.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: post/post.proto\n\npackage post\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype GetPostRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetPostRequest) Reset() {\n\t*x = GetPostRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostRequest) ProtoMessage() {}\n\nfunc (x *GetPostRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostRequest.ProtoReflect.Descriptor instead.\nfunc (*GetPostRequest) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetPostRequest) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\ntype GetPostResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPost *Post `protobuf:\"bytes,1,opt,name=post,proto3\" json:\"post,omitempty\"`\n}\n\nfunc (x *GetPostResponse) Reset() {\n\t*x = GetPostResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostResponse) ProtoMessage() {}\n\nfunc (x *GetPostResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostResponse.ProtoReflect.Descriptor instead.\nfunc (*GetPostResponse) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetPostResponse) GetPost() *Post {\n\tif x != nil {\n\t\treturn x.Post\n\t}\n\treturn nil\n}\n\ntype GetPostsRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tIds []string `protobuf:\"bytes,1,rep,name=ids,proto3\" json:\"ids,omitempty\"`\n}\n\nfunc (x *GetPostsRequest) Reset() {\n\t*x = GetPostsRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostsRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostsRequest) ProtoMessage() {}\n\nfunc (x *GetPostsRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostsRequest.ProtoReflect.Descriptor instead.\nfunc (*GetPostsRequest) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *GetPostsRequest) GetIds() []string {\n\tif x != nil {\n\t\treturn x.Ids\n\t}\n\treturn nil\n}\n\ntype GetPostsResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPosts []*Post `protobuf:\"bytes,1,rep,name=posts,proto3\" json:\"posts,omitempty\"`\n}\n\nfunc (x *GetPostsResponse) Reset() {\n\t*x = GetPostsResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostsResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostsResponse) ProtoMessage() {}\n\nfunc (x *GetPostsResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostsResponse.ProtoReflect.Descriptor instead.\nfunc (*GetPostsResponse) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *GetPostsResponse) GetPosts() []*Post {\n\tif x != nil {\n\t\treturn x.Posts\n\t}\n\treturn nil\n}\n\ntype Post struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId      string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tTitle   string `protobuf:\"bytes,2,opt,name=title,proto3\" json:\"title,omitempty\"`\n\tContent string `protobuf:\"bytes,3,opt,name=content,proto3\" json:\"content,omitempty\"`\n\tUserId  string `protobuf:\"bytes,4,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *Post) Reset() {\n\t*x = Post{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Post) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Post) ProtoMessage() {}\n\nfunc (x *Post) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Post.ProtoReflect.Descriptor instead.\nfunc (*Post) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *Post) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetTitle() string {\n\tif x != nil {\n\t\treturn x.Title\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetContent() string {\n\tif x != nil {\n\t\treturn x.Content\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetUserId() string {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn \"\"\n}\n\nvar File_post_post_proto protoreflect.FileDescriptor\n\nvar file_post_post_proto_rawDesc = []byte{\n\t0x0a, 0x0f, 0x70, 0x6f, 0x73, 0x74, 0x2f, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x20, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x6f,\n\t0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x31, 0x0a, 0x0f, 0x47, 0x65, 0x74,\n\t0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x04,\n\t0x70, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x6f, 0x73,\n\t0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x23, 0x0a, 0x0f,\n\t0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,\n\t0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64,\n\t0x73, 0x22, 0x34, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65, 0x73,\n\t0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x05, 0x70, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74,\n\t0x52, 0x05, 0x70, 0x6f, 0x73, 0x74, 0x73, 0x22, 0x5f, 0x0a, 0x04, 0x50, 0x6f, 0x73, 0x74, 0x12,\n\t0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12,\n\t0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,\n\t0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12,\n\t0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x32, 0x84, 0x01, 0x0a, 0x0b, 0x50, 0x6f, 0x73,\n\t0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x38, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x50,\n\t0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f,\n\t0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x70, 0x6f, 0x73, 0x74,\n\t0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x22, 0x00, 0x12, 0x3b, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x15,\n\t0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65,\n\t0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x47, 0x65, 0x74,\n\t0x50, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42,\n\t0x58, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x42, 0x09, 0x50, 0x6f, 0x73,\n\t0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x11, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c,\n\t0x65, 0x2f, 0x70, 0x6f, 0x73, 0x74, 0x3b, 0x70, 0x6f, 0x73, 0x74, 0xa2, 0x02, 0x03, 0x50, 0x58,\n\t0x58, 0xaa, 0x02, 0x04, 0x50, 0x6f, 0x73, 0x74, 0xca, 0x02, 0x04, 0x50, 0x6f, 0x73, 0x74, 0xe2,\n\t0x02, 0x10, 0x50, 0x6f, 0x73, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61,\n\t0x74, 0x61, 0xea, 0x02, 0x04, 0x50, 0x6f, 0x73, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x33,\n}\n\nvar (\n\tfile_post_post_proto_rawDescOnce sync.Once\n\tfile_post_post_proto_rawDescData = file_post_post_proto_rawDesc\n)\n\nfunc file_post_post_proto_rawDescGZIP() []byte {\n\tfile_post_post_proto_rawDescOnce.Do(func() {\n\t\tfile_post_post_proto_rawDescData = protoimpl.X.CompressGZIP(file_post_post_proto_rawDescData)\n\t})\n\treturn file_post_post_proto_rawDescData\n}\n\nvar file_post_post_proto_msgTypes = make([]protoimpl.MessageInfo, 5)\nvar file_post_post_proto_goTypes = []interface{}{\n\t(*GetPostRequest)(nil),   // 0: post.GetPostRequest\n\t(*GetPostResponse)(nil),  // 1: post.GetPostResponse\n\t(*GetPostsRequest)(nil),  // 2: post.GetPostsRequest\n\t(*GetPostsResponse)(nil), // 3: post.GetPostsResponse\n\t(*Post)(nil),             // 4: post.Post\n}\nvar file_post_post_proto_depIdxs = []int32{\n\t4, // 0: post.GetPostResponse.post:type_name -> post.Post\n\t4, // 1: post.GetPostsResponse.posts:type_name -> post.Post\n\t0, // 2: post.PostService.GetPost:input_type -> post.GetPostRequest\n\t2, // 3: post.PostService.GetPosts:input_type -> post.GetPostsRequest\n\t1, // 4: post.PostService.GetPost:output_type -> post.GetPostResponse\n\t3, // 5: post.PostService.GetPosts:output_type -> post.GetPostsResponse\n\t4, // [4:6] is the sub-list for method output_type\n\t2, // [2:4] is the sub-list for method input_type\n\t2, // [2:2] is the sub-list for extension type_name\n\t2, // [2:2] is the sub-list for extension extendee\n\t0, // [0:2] is the sub-list for field type_name\n}\n\nfunc init() { file_post_post_proto_init() }\nfunc file_post_post_proto_init() {\n\tif File_post_post_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_post_post_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostsRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostsResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Post); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_post_post_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   5,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_post_post_proto_goTypes,\n\t\tDependencyIndexes: file_post_post_proto_depIdxs,\n\t\tMessageInfos:      file_post_post_proto_msgTypes,\n\t}.Build()\n\tFile_post_post_proto = out.File\n\tfile_post_post_proto_rawDesc = nil\n\tfile_post_post_proto_goTypes = nil\n\tfile_post_post_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/14_condition/post/post_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: post/post.proto\n\npackage post\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tPostService_GetPost_FullMethodName  = \"/post.PostService/GetPost\"\n\tPostService_GetPosts_FullMethodName = \"/post.PostService/GetPosts\"\n)\n\n// PostServiceClient is the client API for PostService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype PostServiceClient interface {\n\tGetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error)\n\tGetPosts(ctx context.Context, in *GetPostsRequest, opts ...grpc.CallOption) (*GetPostsResponse, error)\n}\n\ntype postServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewPostServiceClient(cc grpc.ClientConnInterface) PostServiceClient {\n\treturn &postServiceClient{cc}\n}\n\nfunc (c *postServiceClient) GetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error) {\n\tout := new(GetPostResponse)\n\terr := c.cc.Invoke(ctx, PostService_GetPost_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *postServiceClient) GetPosts(ctx context.Context, in *GetPostsRequest, opts ...grpc.CallOption) (*GetPostsResponse, error) {\n\tout := new(GetPostsResponse)\n\terr := c.cc.Invoke(ctx, PostService_GetPosts_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// PostServiceServer is the server API for PostService service.\n// All implementations must embed UnimplementedPostServiceServer\n// for forward compatibility\ntype PostServiceServer interface {\n\tGetPost(context.Context, *GetPostRequest) (*GetPostResponse, error)\n\tGetPosts(context.Context, *GetPostsRequest) (*GetPostsResponse, error)\n\tmustEmbedUnimplementedPostServiceServer()\n}\n\n// UnimplementedPostServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedPostServiceServer struct {\n}\n\nfunc (UnimplementedPostServiceServer) GetPost(context.Context, *GetPostRequest) (*GetPostResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetPost not implemented\")\n}\nfunc (UnimplementedPostServiceServer) GetPosts(context.Context, *GetPostsRequest) (*GetPostsResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetPosts not implemented\")\n}\nfunc (UnimplementedPostServiceServer) mustEmbedUnimplementedPostServiceServer() {}\n\n// UnsafePostServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to PostServiceServer will\n// result in compilation errors.\ntype UnsafePostServiceServer interface {\n\tmustEmbedUnimplementedPostServiceServer()\n}\n\nfunc RegisterPostServiceServer(s grpc.ServiceRegistrar, srv PostServiceServer) {\n\ts.RegisterService(&PostService_ServiceDesc, srv)\n}\n\nfunc _PostService_GetPost_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetPostRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(PostServiceServer).GetPost(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: PostService_GetPost_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(PostServiceServer).GetPost(ctx, req.(*GetPostRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _PostService_GetPosts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetPostsRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(PostServiceServer).GetPosts(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: PostService_GetPosts_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(PostServiceServer).GetPosts(ctx, req.(*GetPostsRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// PostService_ServiceDesc is the grpc.ServiceDesc for PostService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar PostService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"post.PostService\",\n\tHandlerType: (*PostServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetPost\",\n\t\t\tHandler:    _PostService_GetPost_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetPosts\",\n\t\t\tHandler:    _PostService_GetPosts_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"post/post.proto\",\n}\n"
  },
  {
    "path": "_examples/14_condition/proto/buf.yaml",
    "content": "version: v1\nbreaking:\n  use:\n    - FILE\nlint:\n  use:\n    - DEFAULT\n"
  },
  {
    "path": "_examples/14_condition/proto/federation/federation.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"google/protobuf/any.proto\";\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\noption (grpc.federation.file)= {\n  import: [\"post/post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n    \nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def [\n      {\n        if: \"$.id != ''\"\n        name: \"res\"\n        call {\n          method: \"post.PostService/GetPost\"\n          request { field: \"id\" by: \"$.id\" }\n         }\n      },\n      {\n        if: \"res != null\"\n        name: \"post\"\n        by: \"res.post\"\n      },\n      {\n        if: \"post != null\"\n        name: \"user\"\n        message {\n          name: \"User\"\n          args {\n            name: \"user_id\"\n            by: \"post.user_id\"\n          }\n        }\n      },\n      { name: \"posts\", by: \"[post]\" },\n      {\n        if: \"user != null\"\n        name: \"users\"\n        map {\n          iterator {\n            name: \"iter\"\n            src: \"posts\"\n          }\n          message {\n            name: \"User\"\n            args {\n              name: \"user_id\"\n              by: \"iter.user_id\"\n            }\n          }\n        }\n      },\n      {\n        if: \"users.size() > 0\"\n        validation {\n          error {\n            code: INVALID_ARGUMENT\n            if: \"users[0].id == ''\"\n          }\n        }\n      }\n    ]\n  };\n  string id = 1 [(grpc.federation.field).by = \"post.id\"];\n  string title = 2 [(grpc.federation.field).by = \"post.title\"];\n  User user = 4 [(grpc.federation.field).by = \"users[0]\"];\n}\n\nmessage User {\n  string id = 1 [(grpc.federation.field).by = \"$.user_id\"];\n}\n"
  },
  {
    "path": "_examples/14_condition/proto/post/post.proto",
    "content": "syntax = \"proto3\";\n\npackage post;\n\noption go_package = \"example/post;post\";\n\nservice PostService {\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n  rpc GetPosts(GetPostsRequest) returns (GetPostsResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  Post post = 1;\n}\n\nmessage GetPostsRequest {\n  repeated string ids = 1;\n}\n\nmessage GetPostsResponse {\n  repeated Post posts = 1;\n}\n\nmessage Post {\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  string user_id = 4;\n}\n"
  },
  {
    "path": "_examples/15_cel_plugin/.gitignore",
    "content": "grpc/federation\n*.wasm\n"
  },
  {
    "path": "_examples/15_cel_plugin/Makefile",
    "content": "MAKEFILE_DIR := $(dir $(lastword $(MAKEFILE_LIST)))\nGOBIN := $(MAKEFILE_DIR)/../../bin\nPATH := $(GOBIN):$(PATH)\n\nJAEGER_IMAGE := jaegertracing/all-in-one:latest\n\n.PHONY: generate\ngenerate:\n\t$(GOBIN)/buf generate\n\n.PHONY: lint\nlint:\n\t@$(GOBIN)/grpc-federation-linter -Iproto -Iproto_deps ./proto/federation/federation.proto\n\n.PHONY: test\ntest: build/wasm\n\tgo test -race ./ -count=1\n\n.PHONY: grpc-federation/generate\ngrpc-federation/generate:\n\t@$(GOBIN)/grpc-federation-generator ./proto/federation/federation.proto\n\n.PHONY: grpc-federation/watch\ngrpc-federation/watch:\n\t@$(GOBIN)/grpc-federation-generator -w\n\n.PHONY: jaeger/start\njaeger/start:\n\t@docker run \\\n\t\t-e COLLECTOR_OTLP_ENABLED=true \\\n\t\t-p 16686:16686 \\\n\t\t-p 4317:4317 \\\n\t\t-p 4318:4318 \\\n\t\t-d \\\n\t\t$(JAEGER_IMAGE)\n\n.PHONY: jaeger/stop\njaeger/stop:\n\t@docker stop $(shell docker ps -q  --filter ancestor=$(JAEGER_IMAGE))\n\nbuild/wasm:\n\tGOOS=wasip1 GOARCH=wasm go build -ldflags \"-w -s\" -o regexp.wasm ./cmd/plugin\n"
  },
  {
    "path": "_examples/15_cel_plugin/README.md",
    "content": "# CEL Plugin Example\n\n## 1. Write plugin definition in ProtocolBuffers\n\nThe plugin feature allows you to define global functions, methods, and variables.\n\n[plugin.proto](./proto/plugin/plugin.proto)\n\n## 2. Run code generator\n\nRun `make generate` to generate code by `protoc-gen-grpc-federation`.\n\n## 3. Write plugin code\n\n[cmd/plugin/main.go](./cmd/plugin/main.go) is the plugin source.\n\nThe helper code needed to write the plugin is already generated, so it is used.\n\n[The helper is here](./plugin/plugin_grpc_federation.pb.go).\n\nIn `plugin/plugin_grpc_federation.pb.go`, there is a `RegisterRegexpPlugin` function required for plugin registration and a `RegexpPlugin` interface required for the plugin.\nThe code for the plugin is as follows.\n\n```go\npackage main\n\nimport (\n\tpluginpb \"example/plugin\"\n\t\"regexp\"\n\t\"unsafe\"\n)\n\nvar _ pluginpb.RegexpPlugin = new(plugin)\n\ntype plugin struct{}\n\n// For example.regexp.compile function.\nfunc (_ *plugin) Example_Regexp_Compile(ctx context.Context, expr string) (*pluginpb.Regexp, error) {\n\tre, err := regexp.Compile(expr)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &pluginpb.Regexp{\n\t\tPtr: uint32(uintptr(unsafe.Pointer(re))),\n\t}, nil\n}\n\n// For example.regexp.Regexp.matchString method.\nfunc (_ *plugin) Example_Regexp_Regexp_MatchString(ctx context.Context, re *pluginpb.Regexp, s string) (bool, error) {\n\treturn (*regexp.Regexp)(unsafe.Pointer(uintptr(re.Ptr))).MatchString(s), nil\n}\n\nfunc main() {\n\tpluginpb.RegisterRegexpPlugin(new(plugin))\n}\n```\n\n## 4. Compile a plugin to WebAssembly\n\nRun `make build/wasm` to compile to WebAssembly.\n( `regexp.wasm` is output )\n\n## 5. Calculates sha256 value for the WebAssembly file\n\n```console\n$ sha256sum regexp.wasm\n820f86011519c42da0fe9876bc2ca7fbee5df746acf104d9e2b9bba802ddd2b9  regexp.wasm\n```\n\n## 6. Load plugin ( WebAssembly ) file\n\nInitialize the gRPC server with the path to the wasm file and the sha256 value of the file.\n\n```go\nfederationServer, err := federation.NewFederationService(federation.FederationServiceConfig{\n\tCELPlugin: &federation.FederationServiceCELPluginConfig{\n\t\tRegexp: federation.FederationServiceCELPluginWasmConfig{\n\t\t\tPath:   \"regexp.wasm\",\n\t\t\tSha256: \"820f86011519c42da0fe9876bc2ca7fbee5df746acf104d9e2b9bba802ddd2b9\",\n\t\t},\n\t},\n})\n```\n\n## 7. Plugin usage\n\nYou can evaluate the plugin's API in the same way you would evaluate a regular usage (e.g. `by` feature).\n\n```proto\nmessage IsMatchResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"matched\"\n      by: \"example.regexp.compile($.expr).matchString($.target)\"\n    }\n  };\n  bool result = 1 [(grpc.federation.field).by = \"matched\"];\n}\n```\n"
  },
  {
    "path": "_examples/15_cel_plugin/buf.gen.yaml",
    "content": "version: v1\nmanaged:\n  enabled: true\nplugins:\n  - plugin: go\n    out: .\n    opt: paths=source_relative\n  - plugin: go-grpc\n    out: .\n    opt: paths=source_relative\n  - plugin: grpc-federation\n    out: .\n    opt:\n    - paths=source_relative\n    - import_paths=proto\n"
  },
  {
    "path": "_examples/15_cel_plugin/buf.work.yaml",
    "content": "version: v1\ndirectories:\n  - proto\n  - proto_deps\n"
  },
  {
    "path": "_examples/15_cel_plugin/cmd/plugin/main.go",
    "content": "package main\n\nimport (\n\t\"context\"\n\tpluginpb \"example/plugin\"\n\t\"fmt\"\n\t\"os\"\n\t\"regexp\"\n\t\"strings\"\n\t\"time\"\n\t\"unsafe\"\n\n\t\"google.golang.org/grpc/metadata\"\n)\n\ntype plugin struct{}\n\nfunc (_ *plugin) Val() string {\n\treturn \"hello grpc-federation plugin\"\n}\n\nfunc (_ *plugin) Example_Regexp_Compile(ctx context.Context, expr string) (*pluginpb.Regexp, error) {\n\tmd, ok := metadata.FromIncomingContext(ctx)\n\tif ok {\n\t\tfmt.Fprintf(os.Stderr, \"plugin: got metadata is %+v\", md)\n\t}\n\tre, err := regexp.Compile(expr)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &pluginpb.Regexp{\n\t\tPtr: uint32(uintptr(unsafe.Pointer(re))),\n\t}, nil\n}\n\nfunc (_ *plugin) Example_Regexp_Regexp_MatchString(ctx context.Context, re *pluginpb.Regexp, s string) (bool, error) {\n\treturn (*regexp.Regexp)(unsafe.Pointer(uintptr(re.Ptr))).MatchString(s), nil\n}\n\nfunc (_ *plugin) Example_Regexp_NewExample(_ context.Context) (*pluginpb.Example, error) {\n\treturn &pluginpb.Example{}, nil\n}\n\nfunc (_ *plugin) Example_Regexp_NewExamples(_ context.Context) ([]*pluginpb.Example, error) {\n\treturn []*pluginpb.Example{{}, {}}, nil\n}\n\nfunc (_ *plugin) Example_Regexp_FilterExamples(_ context.Context, v []*pluginpb.Example) ([]*pluginpb.Example, error) {\n\treturn v, nil\n}\n\nfunc (_ *plugin) Example_Regexp_Example_Concat(_ context.Context, _ *pluginpb.Example, v []string) (string, error) {\n\treturn strings.Join(v, \"\"), nil\n}\n\nfunc (_ *plugin) Example_Regexp_Example_Split(_ context.Context, _ *pluginpb.Example, s string, sep string) ([]string, error) {\n\treturn strings.Split(s, sep), nil\n}\n\nfunc (_ *plugin) Example_Regexp_Block(ctx context.Context) (bool, error) {\n\ttime.Sleep(100 * time.Second)\n\treturn true, nil\n}\n\nfunc main() {\n\tpluginpb.RegisterRegexpPlugin(&plugin{})\n}\n"
  },
  {
    "path": "_examples/15_cel_plugin/federation/federation.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype IsMatchRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tExpr   string `protobuf:\"bytes,1,opt,name=expr,proto3\" json:\"expr,omitempty\"`\n\tTarget string `protobuf:\"bytes,2,opt,name=target,proto3\" json:\"target,omitempty\"`\n}\n\nfunc (x *IsMatchRequest) Reset() {\n\t*x = IsMatchRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *IsMatchRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*IsMatchRequest) ProtoMessage() {}\n\nfunc (x *IsMatchRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use IsMatchRequest.ProtoReflect.Descriptor instead.\nfunc (*IsMatchRequest) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *IsMatchRequest) GetExpr() string {\n\tif x != nil {\n\t\treturn x.Expr\n\t}\n\treturn \"\"\n}\n\nfunc (x *IsMatchRequest) GetTarget() string {\n\tif x != nil {\n\t\treturn x.Target\n\t}\n\treturn \"\"\n}\n\ntype IsMatchResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tResult bool `protobuf:\"varint,1,opt,name=result,proto3\" json:\"result,omitempty\"`\n}\n\nfunc (x *IsMatchResponse) Reset() {\n\t*x = IsMatchResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *IsMatchResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*IsMatchResponse) ProtoMessage() {}\n\nfunc (x *IsMatchResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use IsMatchResponse.ProtoReflect.Descriptor instead.\nfunc (*IsMatchResponse) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *IsMatchResponse) GetResult() bool {\n\tif x != nil {\n\t\treturn x.Result\n\t}\n\treturn false\n}\n\ntype ExampleRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *ExampleRequest) Reset() {\n\t*x = ExampleRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ExampleRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ExampleRequest) ProtoMessage() {}\n\nfunc (x *ExampleRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ExampleRequest.ProtoReflect.Descriptor instead.\nfunc (*ExampleRequest) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{2}\n}\n\ntype ExampleResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tSize  int64  `protobuf:\"varint,1,opt,name=size,proto3\" json:\"size,omitempty\"`\n\tStr   string `protobuf:\"bytes,2,opt,name=str,proto3\" json:\"str,omitempty\"`\n\tValue int64  `protobuf:\"varint,3,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *ExampleResponse) Reset() {\n\t*x = ExampleResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ExampleResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ExampleResponse) ProtoMessage() {}\n\nfunc (x *ExampleResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ExampleResponse.ProtoReflect.Descriptor instead.\nfunc (*ExampleResponse) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *ExampleResponse) GetSize() int64 {\n\tif x != nil {\n\t\treturn x.Size\n\t}\n\treturn 0\n}\n\nfunc (x *ExampleResponse) GetStr() string {\n\tif x != nil {\n\t\treturn x.Str\n\t}\n\treturn \"\"\n}\n\nfunc (x *ExampleResponse) GetValue() int64 {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn 0\n}\n\nvar File_federation_federation_proto protoreflect.FileDescriptor\n\nvar file_federation_federation_proto_rawDesc = []byte{\n\t0x0a, 0x1b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x6f,\n\t0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x20, 0x67,\n\t0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22,\n\t0x3c, 0x0a, 0x0e, 0x49, 0x73, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,\n\t0x74, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x04, 0x65, 0x78, 0x70, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x87, 0x01,\n\t0x0a, 0x0f, 0x49, 0x73, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,\n\t0x65, 0x12, 0x24, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x08, 0x42, 0x0c, 0x9a, 0x4a, 0x09, 0x12, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x52,\n\t0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x3a, 0x4e, 0x9a, 0x4a, 0x4b, 0x0a, 0x24, 0x0a, 0x02,\n\t0x72, 0x65, 0x5a, 0x1e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x67, 0x65,\n\t0x78, 0x70, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x24, 0x2e, 0x65, 0x78, 0x70,\n\t0x72, 0x29, 0x0a, 0x23, 0x0a, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5a, 0x18, 0x72,\n\t0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x24, 0x2e,\n\t0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x29, 0x22, 0x10, 0x0a, 0x0e, 0x45, 0x78, 0x61, 0x6d, 0x70,\n\t0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xd3, 0x02, 0x0a, 0x0f, 0x45, 0x78,\n\t0x61, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a,\n\t0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x42, 0x0d, 0x9a, 0x4a, 0x0a,\n\t0x12, 0x08, 0x76, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x29, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65,\n\t0x12, 0x1a, 0x0a, 0x03, 0x73, 0x74, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0x9a,\n\t0x4a, 0x05, 0x12, 0x03, 0x73, 0x74, 0x72, 0x52, 0x03, 0x73, 0x74, 0x72, 0x12, 0x28, 0x0a, 0x05,\n\t0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x12, 0x9a, 0x4a, 0x0f,\n\t0x12, 0x0d, 0x65, 0x78, 0x70, 0x5f, 0x6d, 0x73, 0x67, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x52,\n\t0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0xd6, 0x01, 0x9a, 0x4a, 0xd2, 0x01, 0x0a, 0x24, 0x0a,\n\t0x04, 0x65, 0x78, 0x70, 0x73, 0x5a, 0x1c, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x72,\n\t0x65, 0x67, 0x65, 0x78, 0x70, 0x2e, 0x6e, 0x65, 0x77, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,\n\t0x73, 0x28, 0x29, 0x0a, 0x28, 0x0a, 0x01, 0x76, 0x5a, 0x23, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c,\n\t0x65, 0x2e, 0x72, 0x65, 0x67, 0x65, 0x78, 0x70, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x45,\n\t0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x28, 0x65, 0x78, 0x70, 0x73, 0x29, 0x0a, 0x22, 0x0a,\n\t0x03, 0x65, 0x78, 0x70, 0x5a, 0x1b, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x72, 0x65,\n\t0x67, 0x65, 0x78, 0x70, 0x2e, 0x6e, 0x65, 0x77, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28,\n\t0x29, 0x0a, 0x2b, 0x0a, 0x03, 0x73, 0x74, 0x72, 0x5a, 0x24, 0x65, 0x78, 0x70, 0x2e, 0x63, 0x6f,\n\t0x6e, 0x63, 0x61, 0x74, 0x28, 0x65, 0x78, 0x70, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27,\n\t0x2f, 0x61, 0x2f, 0x62, 0x2f, 0x63, 0x27, 0x2c, 0x20, 0x27, 0x2f, 0x27, 0x29, 0x29, 0x0a, 0x2f,\n\t0x0a, 0x07, 0x65, 0x78, 0x70, 0x5f, 0x6d, 0x73, 0x67, 0x6a, 0x24, 0x0a, 0x16, 0x65, 0x78, 0x61,\n\t0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x67, 0x65, 0x78, 0x70, 0x2e, 0x45, 0x78, 0x61, 0x6d,\n\t0x70, 0x6c, 0x65, 0x12, 0x0a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x01, 0x32, 0x32,\n\t0xb4, 0x01, 0x0a, 0x11, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65,\n\t0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4c, 0x0a, 0x07, 0x49, 0x73, 0x4d, 0x61, 0x74, 0x63, 0x68,\n\t0x12, 0x1e, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x49, 0x73, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x1a, 0x1f, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x49, 0x73, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,\n\t0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x07, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x1e,\n\t0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f,\n\t0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,\n\t0x00, 0x1a, 0x03, 0x9a, 0x4a, 0x00, 0x42, 0xb5, 0x01, 0x9a, 0x4a, 0x15, 0x12, 0x13, 0x70, 0x6c,\n\t0x75, 0x67, 0x69, 0x6e, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0f, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x1d, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c,\n\t0x65, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xa2, 0x02, 0x03, 0x4f, 0x46, 0x58, 0xaa, 0x02, 0x0e,\n\t0x4f, 0x72, 0x67, 0x2e, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xca, 0x02,\n\t0x0e, 0x4f, 0x72, 0x67, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xe2,\n\t0x02, 0x1a, 0x4f, 0x72, 0x67, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0f, 0x4f,\n\t0x72, 0x67, 0x3a, 0x3a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x06,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_federation_federation_proto_rawDescOnce sync.Once\n\tfile_federation_federation_proto_rawDescData = file_federation_federation_proto_rawDesc\n)\n\nfunc file_federation_federation_proto_rawDescGZIP() []byte {\n\tfile_federation_federation_proto_rawDescOnce.Do(func() {\n\t\tfile_federation_federation_proto_rawDescData = protoimpl.X.CompressGZIP(file_federation_federation_proto_rawDescData)\n\t})\n\treturn file_federation_federation_proto_rawDescData\n}\n\nvar file_federation_federation_proto_msgTypes = make([]protoimpl.MessageInfo, 4)\nvar file_federation_federation_proto_goTypes = []interface{}{\n\t(*IsMatchRequest)(nil),  // 0: org.federation.IsMatchRequest\n\t(*IsMatchResponse)(nil), // 1: org.federation.IsMatchResponse\n\t(*ExampleRequest)(nil),  // 2: org.federation.ExampleRequest\n\t(*ExampleResponse)(nil), // 3: org.federation.ExampleResponse\n}\nvar file_federation_federation_proto_depIdxs = []int32{\n\t0, // 0: org.federation.FederationService.IsMatch:input_type -> org.federation.IsMatchRequest\n\t2, // 1: org.federation.FederationService.Example:input_type -> org.federation.ExampleRequest\n\t1, // 2: org.federation.FederationService.IsMatch:output_type -> org.federation.IsMatchResponse\n\t3, // 3: org.federation.FederationService.Example:output_type -> org.federation.ExampleResponse\n\t2, // [2:4] is the sub-list for method output_type\n\t0, // [0:2] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_federation_federation_proto_init() }\nfunc file_federation_federation_proto_init() {\n\tif File_federation_federation_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_federation_federation_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*IsMatchRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*IsMatchResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ExampleRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ExampleResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_federation_federation_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   4,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_federation_federation_proto_goTypes,\n\t\tDependencyIndexes: file_federation_federation_proto_depIdxs,\n\t\tMessageInfos:      file_federation_federation_proto_msgTypes,\n\t}.Build()\n\tFile_federation_federation_proto = out.File\n\tfile_federation_federation_proto_rawDesc = nil\n\tfile_federation_federation_proto_goTypes = nil\n\tfile_federation_federation_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/15_cel_plugin/federation/federation_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tFederationService_IsMatch_FullMethodName = \"/org.federation.FederationService/IsMatch\"\n\tFederationService_Example_FullMethodName = \"/org.federation.FederationService/Example\"\n)\n\n// FederationServiceClient is the client API for FederationService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype FederationServiceClient interface {\n\tIsMatch(ctx context.Context, in *IsMatchRequest, opts ...grpc.CallOption) (*IsMatchResponse, error)\n\tExample(ctx context.Context, in *ExampleRequest, opts ...grpc.CallOption) (*ExampleResponse, error)\n}\n\ntype federationServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewFederationServiceClient(cc grpc.ClientConnInterface) FederationServiceClient {\n\treturn &federationServiceClient{cc}\n}\n\nfunc (c *federationServiceClient) IsMatch(ctx context.Context, in *IsMatchRequest, opts ...grpc.CallOption) (*IsMatchResponse, error) {\n\tout := new(IsMatchResponse)\n\terr := c.cc.Invoke(ctx, FederationService_IsMatch_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *federationServiceClient) Example(ctx context.Context, in *ExampleRequest, opts ...grpc.CallOption) (*ExampleResponse, error) {\n\tout := new(ExampleResponse)\n\terr := c.cc.Invoke(ctx, FederationService_Example_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// FederationServiceServer is the server API for FederationService service.\n// All implementations must embed UnimplementedFederationServiceServer\n// for forward compatibility\ntype FederationServiceServer interface {\n\tIsMatch(context.Context, *IsMatchRequest) (*IsMatchResponse, error)\n\tExample(context.Context, *ExampleRequest) (*ExampleResponse, error)\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\n// UnimplementedFederationServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedFederationServiceServer struct {\n}\n\nfunc (UnimplementedFederationServiceServer) IsMatch(context.Context, *IsMatchRequest) (*IsMatchResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method IsMatch not implemented\")\n}\nfunc (UnimplementedFederationServiceServer) Example(context.Context, *ExampleRequest) (*ExampleResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method Example not implemented\")\n}\nfunc (UnimplementedFederationServiceServer) mustEmbedUnimplementedFederationServiceServer() {}\n\n// UnsafeFederationServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to FederationServiceServer will\n// result in compilation errors.\ntype UnsafeFederationServiceServer interface {\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\nfunc RegisterFederationServiceServer(s grpc.ServiceRegistrar, srv FederationServiceServer) {\n\ts.RegisterService(&FederationService_ServiceDesc, srv)\n}\n\nfunc _FederationService_IsMatch_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(IsMatchRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(FederationServiceServer).IsMatch(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: FederationService_IsMatch_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(FederationServiceServer).IsMatch(ctx, req.(*IsMatchRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _FederationService_Example_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(ExampleRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(FederationServiceServer).Example(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: FederationService_Example_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(FederationServiceServer).Example(ctx, req.(*ExampleRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// FederationService_ServiceDesc is the grpc.ServiceDesc for FederationService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar FederationService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"org.federation.FederationService\",\n\tHandlerType: (*FederationServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"IsMatch\",\n\t\t\tHandler:    _FederationService_IsMatch_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"Example\",\n\t\t\tHandler:    _FederationService_Example_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"federation/federation.proto\",\n}\n"
  },
  {
    "path": "_examples/15_cel_plugin/federation/federation_grpc_federation.pb.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: federation/federation.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n\n\tpluginpb \"example/plugin\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Example_Regexp_ExampleVariable represents variable definitions in \"example.regexp.Example\".\ntype FederationService_Example_Regexp_ExampleVariable struct {\n\tV int64\n}\n\n// Example_Regexp_ExampleArgument is argument for \"example.regexp.Example\" message.\ntype FederationService_Example_Regexp_ExampleArgument struct {\n\tValue int64\n\tFederationService_Example_Regexp_ExampleVariable\n}\n\n// Org_Federation_ExampleResponseVariable represents variable definitions in \"org.federation.ExampleResponse\".\ntype FederationService_Org_Federation_ExampleResponseVariable struct {\n\tExp    *pluginpb.Example\n\tExpMsg *pluginpb.Example\n\tExps   []*pluginpb.Example\n\tStr    string\n\tV      []*pluginpb.Example\n}\n\n// Org_Federation_ExampleResponseArgument is argument for \"org.federation.ExampleResponse\" message.\ntype FederationService_Org_Federation_ExampleResponseArgument struct {\n\tFederationService_Org_Federation_ExampleResponseVariable\n}\n\n// Org_Federation_IsMatchResponseVariable represents variable definitions in \"org.federation.IsMatchResponse\".\ntype FederationService_Org_Federation_IsMatchResponseVariable struct {\n\tMatched bool\n\tRe      *pluginpb.Regexp\n}\n\n// Org_Federation_IsMatchResponseArgument is argument for \"org.federation.IsMatchResponse\" message.\ntype FederationService_Org_Federation_IsMatchResponseArgument struct {\n\tExpr   string\n\tTarget string\n\tFederationService_Org_Federation_IsMatchResponseVariable\n}\n\n// FederationServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationServiceConfig struct {\n\t// CELPlugin If you use the plugin feature to extend the CEL API,\n\t// you must write a plugin and output WebAssembly.\n\t// In this field, configure to load wasm with the path to the WebAssembly file and the sha256 value.\n\tCELPlugin *FederationServiceCELPluginConfig\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationServiceClientFactory interface {\n}\n\n// FederationServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationServiceDependentClientSet struct {\n}\n\n// FederationServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationServiceResolver interface {\n}\n\n// FederationServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationServiceCELPluginConfig struct {\n\tRegexp   FederationServiceCELPluginWasmConfig\n\tCacheDir string\n}\n\n// FederationServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationServiceUnimplementedResolver struct{}\n\n// FederationService represents Federation Service.\ntype FederationService struct {\n\tUnimplementedFederationServiceServer\n\tcfg             FederationServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationServiceDependentClientSet\n}\n\n// NewFederationService creates FederationService instance by FederationServiceConfig.\nfunc NewFederationService(cfg FederationServiceConfig) (*FederationService, error) {\n\tif cfg.CELPlugin == nil {\n\t\treturn nil, grpcfed.ErrCELPluginConfig\n\t}\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"org.federation.FederationService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.example.regexp.ExampleArgument\": {\n\t\t\t\"value\": grpcfed.NewCELFieldType(grpcfed.CELIntType, \"Value\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.ExampleResponseArgument\": {},\n\t\t\"grpc.federation.private.org.federation.IsMatchResponseArgument\": {\n\t\t\t\"expr\":   grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Expr\"),\n\t\t\t\"target\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Target\"),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"org.federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tvar celPlugins []*grpcfedcel.CELPlugin\n\t{\n\t\tplugin, err := grpcfedcel.NewCELPlugin(ctx, grpcfedcel.CELPluginConfig{\n\t\t\tName:     \"regexp\",\n\t\t\tWasm:     cfg.CELPlugin.Regexp,\n\t\t\tCacheDir: cfg.CELPlugin.CacheDir,\n\t\t\tFunctions: []*grpcfedcel.CELFunction{\n\t\t\t\t{\n\t\t\t\t\tName: \"example.regexp.compile\",\n\t\t\t\t\tID:   \"example_regexp_compile_string_example_regexp_Regexp\",\n\t\t\t\t\tArgs: []*grpcfed.CELTypeDeclare{\n\t\t\t\t\t\tgrpcfed.CELStringType,\n\t\t\t\t\t},\n\t\t\t\t\tReturn:   grpcfed.NewCELObjectType(\"example.regexp.Regexp\"),\n\t\t\t\t\tIsMethod: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tName:     \"example.regexp.newExample\",\n\t\t\t\t\tID:       \"example_regexp_newExample_example_regexp_Example\",\n\t\t\t\t\tArgs:     []*grpcfed.CELTypeDeclare{},\n\t\t\t\t\tReturn:   grpcfed.NewCELObjectType(\"example.regexp.Example\"),\n\t\t\t\t\tIsMethod: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tName:     \"example.regexp.newExamples\",\n\t\t\t\t\tID:       \"example_regexp_newExamples_repeated example_regexp_Example\",\n\t\t\t\t\tArgs:     []*grpcfed.CELTypeDeclare{},\n\t\t\t\t\tReturn:   grpcfed.NewCELListType(grpcfed.NewCELObjectType(\"example.regexp.Example\")),\n\t\t\t\t\tIsMethod: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tName: \"example.regexp.filterExamples\",\n\t\t\t\t\tID:   \"example_regexp_filterExamples_repeated example_regexp_Example_repeated example_regexp_Example\",\n\t\t\t\t\tArgs: []*grpcfed.CELTypeDeclare{\n\t\t\t\t\t\tgrpcfed.NewCELListType(grpcfed.NewCELObjectType(\"example.regexp.Example\")),\n\t\t\t\t\t},\n\t\t\t\t\tReturn:   grpcfed.NewCELListType(grpcfed.NewCELObjectType(\"example.regexp.Example\")),\n\t\t\t\t\tIsMethod: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tName: \"matchString\",\n\t\t\t\t\tID:   \"example_regexp_Regexp_matchString_example_regexp_Regexp_string_bool\",\n\t\t\t\t\tArgs: []*grpcfed.CELTypeDeclare{\n\t\t\t\t\t\tgrpcfed.NewCELObjectType(\"example.regexp.Regexp\"),\n\t\t\t\t\t\tgrpcfed.CELStringType,\n\t\t\t\t\t},\n\t\t\t\t\tReturn:   grpcfed.CELBoolType,\n\t\t\t\t\tIsMethod: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tName: \"concat\",\n\t\t\t\t\tID:   \"example_regexp_Example_concat_example_regexp_Example_repeated string_string\",\n\t\t\t\t\tArgs: []*grpcfed.CELTypeDeclare{\n\t\t\t\t\t\tgrpcfed.NewCELObjectType(\"example.regexp.Example\"),\n\t\t\t\t\t\tgrpcfed.NewCELListType(grpcfed.CELStringType),\n\t\t\t\t\t},\n\t\t\t\t\tReturn:   grpcfed.CELStringType,\n\t\t\t\t\tIsMethod: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tName: \"split\",\n\t\t\t\t\tID:   \"example_regexp_Example_split_example_regexp_Example_string_string_repeated string\",\n\t\t\t\t\tArgs: []*grpcfed.CELTypeDeclare{\n\t\t\t\t\t\tgrpcfed.NewCELObjectType(\"example.regexp.Example\"),\n\t\t\t\t\t\tgrpcfed.CELStringType,\n\t\t\t\t\t\tgrpcfed.CELStringType,\n\t\t\t\t\t},\n\t\t\t\t\tReturn:   grpcfed.NewCELListType(grpcfed.CELStringType),\n\t\t\t\t\tIsMethod: true,\n\t\t\t\t},\n\t\t\t},\n\t\t\tCapability: &grpcfedcel.CELPluginCapability{},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tinstance, err := plugin.CreateInstance(ctx, celTypeHelper.CELRegistry())\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := instance.ValidatePlugin(ctx); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tcelPlugins = append(celPlugins, plugin)\n\t\tcelEnvOpts = append(celEnvOpts, grpcfed.CELLib(plugin))\n\t}\n\tsvc := &FederationService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tcelPlugins:      celPlugins,\n\t\tclient:          &FederationServiceDependentClientSet{},\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationService(ctx context.Context, svc *FederationService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n// IsMatch implements \"org.federation.FederationService/IsMatch\" method.\nfunc (s *FederationService) IsMatch(ctx context.Context, req *IsMatchRequest) (res *IsMatchResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.FederationService/IsMatch\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Org_Federation_IsMatchResponse(ctx, &FederationService_Org_Federation_IsMatchResponseArgument{\n\t\tExpr:   req.GetExpr(),\n\t\tTarget: req.GetTarget(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// Example implements \"org.federation.FederationService/Example\" method.\nfunc (s *FederationService) Example(ctx context.Context, req *ExampleRequest) (res *ExampleResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.FederationService/Example\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Org_Federation_ExampleResponse(ctx, &FederationService_Org_Federation_ExampleResponseArgument{})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Example_Regexp_Example resolve \"example.regexp.Example\" message.\nfunc (s *FederationService) resolve_Example_Regexp_Example(ctx context.Context, req *FederationService_Example_Regexp_ExampleArgument) (*pluginpb.Example, error) {\n\tctx, span := s.tracer.Start(ctx, \"example.regexp.Example\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve example.regexp.Example\", slog.Any(\"message_args\", s.logvalue_Example_Regexp_ExampleArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tV int64\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.example.regexp.ExampleArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"v\"\n\t\t  by: \"$.value + 1\"\n\t\t}\n\t*/\n\tdef_v := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[int64, *localValueType]{\n\t\t\tName: `v`,\n\t\t\tType: grpcfed.CELIntType,\n\t\t\tSetter: func(value *localValueType, v int64) error {\n\t\t\t\tvalue.vars.V = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `$.value + 1`,\n\t\t\tByCacheIndex: 1,\n\t\t})\n\t}\n\n\tif err := def_v(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Example_Regexp_ExampleVariable.V = value.vars.V\n\n\t// create a message value to be returned.\n\tret := &pluginpb.Example{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"v\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[int64]{\n\t\tValue:      value,\n\t\tExpr:       `v`,\n\t\tCacheIndex: 2,\n\t\tSetter: func(v int64) error {\n\t\t\tret.Value = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved example.regexp.Example\", slog.Any(\"example.regexp.Example\", s.logvalue_Example_Regexp_Example(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_ExampleResponse resolve \"org.federation.ExampleResponse\" message.\nfunc (s *FederationService) resolve_Org_Federation_ExampleResponse(ctx context.Context, req *FederationService_Org_Federation_ExampleResponseArgument) (*ExampleResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.ExampleResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.ExampleResponse\", slog.Any(\"message_args\", s.logvalue_Org_Federation_ExampleResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tExp    *pluginpb.Example\n\t\t\tExpMsg *pluginpb.Example\n\t\t\tExps   []*pluginpb.Example\n\t\t\tStr    string\n\t\t\tV      []*pluginpb.Example\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.ExampleResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"exps\"\n\t\t  by: \"example.regexp.newExamples()\"\n\t\t}\n\t*/\n\tdef_exps := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[[]*pluginpb.Example, *localValueType]{\n\t\t\tName: `exps`,\n\t\t\tType: grpcfed.CELListType(grpcfed.CELObjectType(\"example.regexp.Example\")),\n\t\t\tSetter: func(value *localValueType, v []*pluginpb.Example) error {\n\t\t\t\tvalue.vars.Exps = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `example.regexp.newExamples()`,\n\t\t\tByCacheIndex: 3,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"v\"\n\t\t  by: \"example.regexp.filterExamples(exps)\"\n\t\t}\n\t*/\n\tdef_v := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[[]*pluginpb.Example, *localValueType]{\n\t\t\tName: `v`,\n\t\t\tType: grpcfed.CELListType(grpcfed.CELObjectType(\"example.regexp.Example\")),\n\t\t\tSetter: func(value *localValueType, v []*pluginpb.Example) error {\n\t\t\t\tvalue.vars.V = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `example.regexp.filterExamples(exps)`,\n\t\t\tByCacheIndex: 4,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"exp\"\n\t\t  by: \"example.regexp.newExample()\"\n\t\t}\n\t*/\n\tdef_exp := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*pluginpb.Example, *localValueType]{\n\t\t\tName: `exp`,\n\t\t\tType: grpcfed.CELObjectType(\"example.regexp.Example\"),\n\t\t\tSetter: func(value *localValueType, v *pluginpb.Example) error {\n\t\t\t\tvalue.vars.Exp = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `example.regexp.newExample()`,\n\t\t\tByCacheIndex: 5,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"str\"\n\t\t  by: \"exp.concat(exp.split('/a/b/c', '/'))\"\n\t\t}\n\t*/\n\tdef_str := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[string, *localValueType]{\n\t\t\tName: `str`,\n\t\t\tType: grpcfed.CELStringType,\n\t\t\tSetter: func(value *localValueType, v string) error {\n\t\t\t\tvalue.vars.Str = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `exp.concat(exp.split('/a/b/c', '/'))`,\n\t\t\tByCacheIndex: 6,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"exp_msg\"\n\t\t  message {\n\t\t    name: \"Example\"\n\t\t    args { name: \"value\", by: \"2\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_exp_msg := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*pluginpb.Example, *localValueType]{\n\t\t\tName: `exp_msg`,\n\t\t\tType: grpcfed.CELObjectType(\"example.regexp.Example\"),\n\t\t\tSetter: func(value *localValueType, v *pluginpb.Example) error {\n\t\t\t\tvalue.vars.ExpMsg = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Example_Regexp_ExampleArgument{}\n\t\t\t\t// { name: \"value\", by: \"2\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `2`,\n\t\t\t\t\tCacheIndex: 7,\n\t\t\t\t\tSetter: func(v int64) error {\n\t\t\t\t\t\targs.Value = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Example_Regexp_Example(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t         exp_msg ─┐\n\t    exp ─┐        │\n\t             str ─┤\n\t   exps ─┐        │\n\t               v ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_exp_msg(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_exp(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_str(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_exps(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_v(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_ExampleResponseVariable.Exp = value.vars.Exp\n\treq.FederationService_Org_Federation_ExampleResponseVariable.ExpMsg = value.vars.ExpMsg\n\treq.FederationService_Org_Federation_ExampleResponseVariable.Exps = value.vars.Exps\n\treq.FederationService_Org_Federation_ExampleResponseVariable.Str = value.vars.Str\n\treq.FederationService_Org_Federation_ExampleResponseVariable.V = value.vars.V\n\n\t// create a message value to be returned.\n\tret := &ExampleResponse{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"v.size()\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[int64]{\n\t\tValue:      value,\n\t\tExpr:       `v.size()`,\n\t\tCacheIndex: 8,\n\t\tSetter: func(v int64) error {\n\t\t\tret.Size = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"str\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `str`,\n\t\tCacheIndex: 9,\n\t\tSetter: func(v string) error {\n\t\t\tret.Str = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"exp_msg.value\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[int64]{\n\t\tValue:      value,\n\t\tExpr:       `exp_msg.value`,\n\t\tCacheIndex: 10,\n\t\tSetter: func(v int64) error {\n\t\t\tret.Value = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.ExampleResponse\", slog.Any(\"org.federation.ExampleResponse\", s.logvalue_Org_Federation_ExampleResponse(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_IsMatchResponse resolve \"org.federation.IsMatchResponse\" message.\nfunc (s *FederationService) resolve_Org_Federation_IsMatchResponse(ctx context.Context, req *FederationService_Org_Federation_IsMatchResponseArgument) (*IsMatchResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.IsMatchResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.IsMatchResponse\", slog.Any(\"message_args\", s.logvalue_Org_Federation_IsMatchResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tMatched bool\n\t\t\tRe      *pluginpb.Regexp\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.IsMatchResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"re\"\n\t\t  by: \"example.regexp.compile($.expr)\"\n\t\t}\n\t*/\n\tdef_re := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*pluginpb.Regexp, *localValueType]{\n\t\t\tName: `re`,\n\t\t\tType: grpcfed.CELObjectType(\"example.regexp.Regexp\"),\n\t\t\tSetter: func(value *localValueType, v *pluginpb.Regexp) error {\n\t\t\t\tvalue.vars.Re = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `example.regexp.compile($.expr)`,\n\t\t\tByCacheIndex: 11,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"matched\"\n\t\t  by: \"re.matchString($.target)\"\n\t\t}\n\t*/\n\tdef_matched := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[bool, *localValueType]{\n\t\t\tName: `matched`,\n\t\t\tType: grpcfed.CELBoolType,\n\t\t\tSetter: func(value *localValueType, v bool) error {\n\t\t\t\tvalue.vars.Matched = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `re.matchString($.target)`,\n\t\t\tByCacheIndex: 12,\n\t\t})\n\t}\n\n\tif err := def_re(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\tif err := def_matched(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_IsMatchResponseVariable.Matched = value.vars.Matched\n\treq.FederationService_Org_Federation_IsMatchResponseVariable.Re = value.vars.Re\n\n\t// create a message value to be returned.\n\tret := &IsMatchResponse{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"matched\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[bool]{\n\t\tValue:      value,\n\t\tExpr:       `matched`,\n\t\tCacheIndex: 13,\n\t\tSetter: func(v bool) error {\n\t\t\tret.Result = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.IsMatchResponse\", slog.Any(\"org.federation.IsMatchResponse\", s.logvalue_Org_Federation_IsMatchResponse(ret)))\n\treturn ret, nil\n}\n\nfunc (s *FederationService) logvalue_Example_Regexp_Example(v *pluginpb.Example) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Int64(\"value\", v.GetValue()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Example_Regexp_ExampleArgument(v *FederationService_Example_Regexp_ExampleArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Int64(\"value\", v.Value),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_ExampleResponse(v *ExampleResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Int64(\"size\", v.GetSize()),\n\t\tslog.String(\"str\", v.GetStr()),\n\t\tslog.Int64(\"value\", v.GetValue()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_ExampleResponseArgument(v *FederationService_Org_Federation_ExampleResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_IsMatchResponse(v *IsMatchResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Bool(\"result\", v.GetResult()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_IsMatchResponseArgument(v *FederationService_Org_Federation_IsMatchResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"expr\", v.Expr),\n\t\tslog.String(\"target\", v.Target),\n\t)\n}\n"
  },
  {
    "path": "_examples/15_cel_plugin/go.mod",
    "content": "module example\n\ngo 1.24.0\n\nreplace github.com/mercari/grpc-federation => ../../\n\nrequire (\n\tgithub.com/google/go-cmp v0.7.0\n\tgithub.com/mercari/grpc-federation v0.0.0-00010101000000-000000000000\n\tgo.opentelemetry.io/otel v1.24.0\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0\n\tgo.opentelemetry.io/otel/sdk v1.24.0\n\tgo.opentelemetry.io/otel/trace v1.24.0\n\tgo.uber.org/goleak v1.3.0\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7\n\tgoogle.golang.org/grpc v1.65.0\n\tgoogle.golang.org/protobuf v1.34.2\n)\n\nrequire (\n\tcel.dev/expr v0.19.1 // indirect\n\tgithub.com/antlr4-go/antlr/v4 v4.13.0 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.2.1 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/goccy/wasi-go v0.3.2 // indirect\n\tgithub.com/google/cel-go v0.23.1 // indirect\n\tgithub.com/google/uuid v1.6.0 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect\n\tgithub.com/kelseyhightower/envconfig v1.4.0 // indirect\n\tgithub.com/stealthrocket/wazergo v0.19.1 // indirect\n\tgithub.com/stoewer/go-strcase v1.3.0 // indirect\n\tgithub.com/tetratelabs/wazero v1.10.1 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.24.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.0.0 // indirect\n\tgolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect\n\tgolang.org/x/net v0.38.0 // indirect\n\tgolang.org/x/sync v0.14.0 // indirect\n\tgolang.org/x/sys v0.37.0 // indirect\n\tgolang.org/x/text v0.23.0 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 // indirect\n)\n"
  },
  {
    "path": "_examples/15_cel_plugin/go.sum",
    "content": "cel.dev/expr v0.19.1 h1:NciYrtDRIR0lNCnH1LFJegdjspNx9fI59O7TWcua/W4=\ncel.dev/expr v0.19.1/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw=\ngithub.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=\ngithub.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/goccy/wasi-go v0.3.2 h1:wAvGXmqCkfcp0B0AwIp5Ya53hzDwkKm9W8iuT3nCCz0=\ngithub.com/goccy/wasi-go v0.3.2/go.mod h1:nIKD204n9xa4Z20UV+XA483kIr9TAl2vXr+X5qVAO5M=\ngithub.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4=\ngithub.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=\ngithub.com/google/cel-go v0.23.1 h1:91ThhEZlBcE5rB2adBVXqvDoqdL8BG2oyhd0bK1I/r4=\ngithub.com/google/cel-go v0.23.1/go.mod h1:52Pb6QsDbC5kvgxvZhiL9QX1oZEkcUF/ZqaPx1J5Wwo=\ngithub.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\ngithub.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg=\ngithub.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=\ngithub.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/stealthrocket/wazergo v0.19.1 h1:BPrITETPgSFwiytwmToO0MbUC/+RGC39JScz1JmmG6c=\ngithub.com/stealthrocket/wazergo v0.19.1/go.mod h1:riI0hxw4ndZA5e6z7PesHg2BtTftcZaMxRcoiGGipTs=\ngithub.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs=\ngithub.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tetratelabs/wazero v1.10.1 h1:2DugeJf6VVk58KTPszlNfeeN8AhhpwcZqkJj2wwFuH8=\ngithub.com/tetratelabs/wazero v1.10.1/go.mod h1:DRm5twOQ5Gr1AoEdSi0CLjDQF1J9ZAuyqFIjl1KKfQU=\ngo.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo=\ngo.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0=\ngo.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI=\ngo.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=\ngo.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw=\ngo.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg=\ngo.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=\ngo.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=\ngo.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=\ngo.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=\ngolang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=\ngolang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=\ngolang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=\ngolang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=\ngolang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=\ngolang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=\ngolang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 h1:YcyjlL1PRr2Q17/I0dPk2JmYS5CDXfcdb2Z3YRioEbw=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7 h1:2035KHhUv+EpyB+hWgJnaWKJOdX1E95w2S8Rr4uWKTs=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=\ngoogle.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=\ngoogle.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=\ngoogle.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=\ngoogle.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "_examples/15_cel_plugin/main_test.go",
    "content": "package main_test\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"crypto/sha256\"\n\t_ \"embed\"\n\t\"encoding/hex\"\n\t\"log/slog\"\n\t\"net\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\"\n\t\"go.opentelemetry.io/otel/propagation\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\tsdktrace \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.4.0\"\n\t\"go.uber.org/goleak\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/credentials/insecure\"\n\t\"google.golang.org/grpc/test/bufconn\"\n\n\t\"example/federation\"\n)\n\nconst bufSize = 1024\n\nvar (\n\tlistener *bufconn.Listener\n\t//go:embed regexp.wasm\n\twasm []byte\n)\n\nfunc dialer(ctx context.Context, address string) (net.Conn, error) {\n\treturn listener.Dial()\n}\n\nfunc toSha256(v []byte) string {\n\thash := sha256.Sum256(v)\n\treturn hex.EncodeToString(hash[:])\n}\n\nfunc TestFederation(t *testing.T) {\n\tdefer goleak.VerifyNone(\n\t\tt,\n\t\tgoleak.IgnoreTopFunction(\"github.com/mercari/grpc-federation/grpc/federation/cel.(*CELPluginInstance).recvContent.func1\"),\n\t)\n\tctx := context.Background()\n\tlistener = bufconn.Listen(bufSize)\n\n\tif os.Getenv(\"ENABLE_JAEGER\") != \"\" {\n\t\texporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithInsecure())\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttp := sdktrace.NewTracerProvider(\n\t\t\tsdktrace.WithBatcher(exporter),\n\t\t\tsdktrace.WithResource(\n\t\t\t\tresource.NewWithAttributes(\n\t\t\t\t\tsemconv.SchemaURL,\n\t\t\t\t\tsemconv.ServiceNameKey.String(\"example15/celplugin\"),\n\t\t\t\t\tsemconv.ServiceVersionKey.String(\"1.0.0\"),\n\t\t\t\t\tattribute.String(\"environment\", \"dev\"),\n\t\t\t\t),\n\t\t\t),\n\t\t\tsdktrace.WithSampler(sdktrace.AlwaysSample()),\n\t\t)\n\t\tdefer tp.Shutdown(ctx)\n\t\totel.SetTextMapPropagator(propagation.TraceContext{})\n\t\totel.SetTracerProvider(tp)\n\t}\n\n\tconn, err := grpc.DialContext(\n\t\tctx, \"\",\n\t\tgrpc.WithContextDialer(dialer),\n\t\tgrpc.WithTransportCredentials(insecure.NewCredentials()),\n\t\tgrpc.WithDefaultCallOptions(grpc.WaitForReady(true)),\n\t)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer conn.Close()\n\n\tgrpcServer := grpc.NewServer()\n\tdefer grpcServer.Stop()\n\n\tlogger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{\n\t\tLevel: slog.LevelDebug,\n\t}))\n\tfederationServer, err := federation.NewFederationService(federation.FederationServiceConfig{\n\t\tCELPlugin: &federation.FederationServiceCELPluginConfig{\n\t\t\tRegexp: federation.FederationServiceCELPluginWasmConfig{\n\t\t\t\tReader: bytes.NewReader(wasm),\n\t\t\t\tSha256: toSha256(wasm),\n\t\t\t},\n\t\t},\n\t\tLogger: logger,\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer federation.CleanupFederationService(ctx, federationServer)\n\n\tfederation.RegisterFederationServiceServer(grpcServer, federationServer)\n\n\tgo func() {\n\t\tif err := grpcServer.Serve(listener); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t}()\n\n\tclient := federation.NewFederationServiceClient(conn)\n\tt.Run(\"success\", func(t *testing.T) {\n\t\tres, err := client.IsMatch(ctx, &federation.IsMatchRequest{\n\t\t\tExpr:   \"hello world\",\n\t\t\tTarget: \"hello world world\",\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tif diff := cmp.Diff(res, &federation.IsMatchResponse{\n\t\t\tResult: true,\n\t\t}, cmpopts.IgnoreUnexported(\n\t\t\tfederation.IsMatchResponse{},\n\t\t)); diff != \"\" {\n\t\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t}\n\t})\n\tt.Run(\"failure\", func(t *testing.T) {\n\t\t_, err := client.IsMatch(ctx, &federation.IsMatchRequest{\n\t\t\tExpr:   \"[]\",\n\t\t\tTarget: \"hello world world\",\n\t\t})\n\t\tif err == nil {\n\t\t\tt.Fatal(\"expected error\")\n\t\t}\n\t\tt.Logf(\"expected error is %s\", err)\n\t})\n\tt.Run(\"example\", func(t *testing.T) {\n\t\tres, err := client.Example(ctx, &federation.ExampleRequest{})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tif diff := cmp.Diff(res, &federation.ExampleResponse{\n\t\t\tSize:  2,\n\t\t\tStr:   \"abc\",\n\t\t\tValue: 3,\n\t\t}, cmpopts.IgnoreUnexported(\n\t\t\tfederation.ExampleResponse{},\n\t\t)); diff != \"\" {\n\t\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t}\n\t})\n}\n"
  },
  {
    "path": "_examples/15_cel_plugin/plugin/plugin.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: plugin/plugin.proto\n\npackage pluginpb\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Regexp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPtr uint32 `protobuf:\"varint,1,opt,name=ptr,proto3\" json:\"ptr,omitempty\"` // store raw pointer value.\n}\n\nfunc (x *Regexp) Reset() {\n\t*x = Regexp{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_plugin_plugin_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Regexp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Regexp) ProtoMessage() {}\n\nfunc (x *Regexp) ProtoReflect() protoreflect.Message {\n\tmi := &file_plugin_plugin_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Regexp.ProtoReflect.Descriptor instead.\nfunc (*Regexp) Descriptor() ([]byte, []int) {\n\treturn file_plugin_plugin_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Regexp) GetPtr() uint32 {\n\tif x != nil {\n\t\treturn x.Ptr\n\t}\n\treturn 0\n}\n\ntype Example struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tValue int64 `protobuf:\"varint,1,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *Example) Reset() {\n\t*x = Example{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_plugin_plugin_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Example) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Example) ProtoMessage() {}\n\nfunc (x *Example) ProtoReflect() protoreflect.Message {\n\tmi := &file_plugin_plugin_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Example.ProtoReflect.Descriptor instead.\nfunc (*Example) Descriptor() ([]byte, []int) {\n\treturn file_plugin_plugin_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Example) GetValue() int64 {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn 0\n}\n\nvar File_plugin_plugin_proto protoreflect.FileDescriptor\n\nvar file_plugin_plugin_proto_rawDesc = []byte{\n\t0x0a, 0x13, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x72,\n\t0x65, 0x67, 0x65, 0x78, 0x70, 0x1a, 0x20, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x1a, 0x0a, 0x06, 0x52, 0x65, 0x67, 0x65, 0x78,\n\t0x70, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x74, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03,\n\t0x70, 0x74, 0x72, 0x22, 0x3e, 0x0a, 0x07, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x1c,\n\t0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x42, 0x06, 0x9a,\n\t0x4a, 0x03, 0x12, 0x01, 0x76, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x15, 0x9a, 0x4a,\n\t0x12, 0x0a, 0x10, 0x0a, 0x01, 0x76, 0x5a, 0x0b, 0x24, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20,\n\t0x2b, 0x20, 0x31, 0x42, 0xf2, 0x05, 0x9a, 0x4a, 0xdb, 0x04, 0x0a, 0xd8, 0x04, 0x0a, 0xd5, 0x04,\n\t0x0a, 0x06, 0x72, 0x65, 0x67, 0x65, 0x78, 0x70, 0x1a, 0xc7, 0x01, 0x0a, 0x06, 0x52, 0x65, 0x67,\n\t0x65, 0x78, 0x70, 0x12, 0x3d, 0x52, 0x65, 0x67, 0x65, 0x78, 0x70, 0x20, 0x69, 0x73, 0x20, 0x74,\n\t0x68, 0x65, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x20,\n\t0x72, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69,\n\t0x6f, 0x6e, 0x1a, 0x7e, 0x0a, 0x0b, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x72, 0x69, 0x6e,\n\t0x67, 0x12, 0x55, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x72,\n\t0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x20, 0x77, 0x68, 0x65, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74,\n\t0x68, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74,\n\t0x61, 0x69, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x6f,\n\t0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x65, 0x78,\n\t0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x14, 0x0a, 0x01, 0x73, 0x12, 0x0b, 0x74,\n\t0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x74, 0x65, 0x78, 0x74, 0x1a, 0x02, 0x08, 0x01, 0x22, 0x02,\n\t0x08, 0x02, 0x1a, 0x50, 0x0a, 0x07, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x0c, 0x65,\n\t0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x1a, 0x14, 0x0a, 0x06, 0x63,\n\t0x6f, 0x6e, 0x63, 0x61, 0x74, 0x1a, 0x06, 0x1a, 0x04, 0x12, 0x02, 0x08, 0x01, 0x22, 0x02, 0x08,\n\t0x01, 0x1a, 0x21, 0x0a, 0x05, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x1a, 0x07, 0x0a, 0x01, 0x73, 0x1a,\n\t0x02, 0x08, 0x01, 0x1a, 0x09, 0x0a, 0x03, 0x73, 0x65, 0x70, 0x1a, 0x02, 0x08, 0x01, 0x22, 0x04,\n\t0x12, 0x02, 0x08, 0x01, 0x22, 0xab, 0x01, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65,\n\t0x12, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x73,\n\t0x20, 0x61, 0x20, 0x72, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65,\n\t0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e,\n\t0x73, 0x2c, 0x20, 0x69, 0x66, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c,\n\t0x2c, 0x20, 0x61, 0x20, 0x52, 0x65, 0x67, 0x65, 0x78, 0x70, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20,\n\t0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6d,\n\t0x61, 0x74, 0x63, 0x68, 0x20, 0x61, 0x67, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x65, 0x78,\n\t0x74, 0x1a, 0x25, 0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x12, 0x19, 0x61, 0x20, 0x72, 0x65, 0x67,\n\t0x75, 0x6c, 0x61, 0x72, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20,\n\t0x74, 0x65, 0x78, 0x74, 0x1a, 0x02, 0x08, 0x01, 0x22, 0x08, 0x22, 0x06, 0x52, 0x65, 0x67, 0x65,\n\t0x78, 0x70, 0x22, 0x17, 0x0a, 0x0a, 0x6e, 0x65, 0x77, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,\n\t0x22, 0x09, 0x22, 0x07, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x22, 0x1a, 0x0a, 0x0b, 0x6e,\n\t0x65, 0x77, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x22, 0x0b, 0x12, 0x09, 0x22, 0x07,\n\t0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x22, 0x2c, 0x0a, 0x0e, 0x66, 0x69, 0x6c, 0x74, 0x65,\n\t0x72, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x1a, 0x0d, 0x1a, 0x0b, 0x12, 0x09, 0x22,\n\t0x07, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x22, 0x0b, 0x12, 0x09, 0x22, 0x07, 0x45, 0x78,\n\t0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x1e, 0x0a, 0x03, 0x76, 0x61, 0x6c, 0x12, 0x13, 0x61, 0x20,\n\t0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x65, 0x73,\n\t0x74, 0x1a, 0x02, 0x08, 0x01, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70,\n\t0x6c, 0x65, 0x2e, 0x72, 0x65, 0x67, 0x65, 0x78, 0x70, 0x42, 0x0b, 0x50, 0x6c, 0x75, 0x67, 0x69,\n\t0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x17, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c,\n\t0x65, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x3b, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x70,\n\t0x62, 0xa2, 0x02, 0x03, 0x45, 0x52, 0x58, 0xaa, 0x02, 0x0e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c,\n\t0x65, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x70, 0xca, 0x02, 0x0e, 0x45, 0x78, 0x61, 0x6d, 0x70,\n\t0x6c, 0x65, 0x5c, 0x52, 0x65, 0x67, 0x65, 0x78, 0x70, 0xe2, 0x02, 0x1a, 0x45, 0x78, 0x61, 0x6d,\n\t0x70, 0x6c, 0x65, 0x5c, 0x52, 0x65, 0x67, 0x65, 0x78, 0x70, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65,\n\t0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0f, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,\n\t0x3a, 0x3a, 0x52, 0x65, 0x67, 0x65, 0x78, 0x70, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_plugin_plugin_proto_rawDescOnce sync.Once\n\tfile_plugin_plugin_proto_rawDescData = file_plugin_plugin_proto_rawDesc\n)\n\nfunc file_plugin_plugin_proto_rawDescGZIP() []byte {\n\tfile_plugin_plugin_proto_rawDescOnce.Do(func() {\n\t\tfile_plugin_plugin_proto_rawDescData = protoimpl.X.CompressGZIP(file_plugin_plugin_proto_rawDescData)\n\t})\n\treturn file_plugin_plugin_proto_rawDescData\n}\n\nvar file_plugin_plugin_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_plugin_plugin_proto_goTypes = []interface{}{\n\t(*Regexp)(nil),  // 0: example.regexp.Regexp\n\t(*Example)(nil), // 1: example.regexp.Example\n}\nvar file_plugin_plugin_proto_depIdxs = []int32{\n\t0, // [0:0] is the sub-list for method output_type\n\t0, // [0:0] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_plugin_plugin_proto_init() }\nfunc file_plugin_plugin_proto_init() {\n\tif File_plugin_plugin_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_plugin_plugin_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Regexp); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_plugin_plugin_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Example); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_plugin_plugin_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_plugin_plugin_proto_goTypes,\n\t\tDependencyIndexes: file_plugin_plugin_proto_depIdxs,\n\t\tMessageInfos:      file_plugin_plugin_proto_msgTypes,\n\t}.Build()\n\tFile_plugin_plugin_proto = out.File\n\tfile_plugin_plugin_proto_rawDesc = nil\n\tfile_plugin_plugin_proto_goTypes = nil\n\tfile_plugin_plugin_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/15_cel_plugin/plugin/plugin_grpc_federation.pb.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: plugin/plugin.proto\npackage pluginpb\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\ntype RegexpPlugin interface {\n\tExample_Regexp_Compile(context.Context, string) (*Regexp, error)\n\tExample_Regexp_NewExample(context.Context) (*Example, error)\n\tExample_Regexp_NewExamples(context.Context) ([]*Example, error)\n\tExample_Regexp_FilterExamples(context.Context, []*Example) ([]*Example, error)\n\tExample_Regexp_Regexp_MatchString(context.Context, *Regexp, string) (bool, error)\n\tExample_Regexp_Example_Concat(context.Context, *Example, []string) (string, error)\n\tExample_Regexp_Example_Split(context.Context, *Example, string, string) ([]string, error)\n}\n\nfunc RegisterRegexpPlugin(plug RegexpPlugin) {\n\tgrpcfed.PluginMainLoop(\n\t\tgrpcfed.CELPluginVersionSchema{\n\t\t\tProtocolVersion:   grpcfed.CELPluginProtocolVersion,\n\t\t\tFederationVersion: \"(devel)\",\n\t\t\tFunctions: []string{\n\t\t\t\t\"example_regexp_compile_string_example_regexp_Regexp\",\n\t\t\t\t\"example_regexp_newExample_example_regexp_Example\",\n\t\t\t\t\"example_regexp_newExamples_repeated example_regexp_Example\",\n\t\t\t\t\"example_regexp_filterExamples_repeated example_regexp_Example_repeated example_regexp_Example\",\n\t\t\t\t\"example_regexp_Regexp_matchString_example_regexp_Regexp_string_bool\",\n\t\t\t\t\"example_regexp_Example_concat_example_regexp_Example_repeated string_string\",\n\t\t\t\t\"example_regexp_Example_split_example_regexp_Example_string_string_repeated string\",\n\t\t\t},\n\t\t},\n\t\tfunc(ctx context.Context, req *grpcfed.CELPluginRequest) (*grpcfed.CELPluginResponse, error) {\n\t\t\tswitch req.GetMethod() {\n\t\t\tcase \"example_regexp_compile_string_example_regexp_Regexp\":\n\t\t\t\tif len(req.GetArgs()) != 1 {\n\t\t\t\t\treturn nil, fmt.Errorf(\"%s: invalid argument number: %d. expected number is %d\", req.GetMethod(), len(req.GetArgs()), 1)\n\t\t\t\t}\n\t\t\t\targ0, err := grpcfed.ToString(req.GetArgs()[0])\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := plug.Example_Regexp_Compile(ctx, arg0)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn grpcfed.ToMessageCELPluginResponse[*Regexp](ret)\n\t\t\tcase \"example_regexp_newExample_example_regexp_Example\":\n\t\t\t\tif len(req.GetArgs()) != 0 {\n\t\t\t\t\treturn nil, fmt.Errorf(\"%s: invalid argument number: %d. expected number is %d\", req.GetMethod(), len(req.GetArgs()), 0)\n\t\t\t\t}\n\t\t\t\tret, err := plug.Example_Regexp_NewExample(ctx)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn grpcfed.ToMessageCELPluginResponse[*Example](ret)\n\t\t\tcase \"example_regexp_newExamples_repeated example_regexp_Example\":\n\t\t\t\tif len(req.GetArgs()) != 0 {\n\t\t\t\t\treturn nil, fmt.Errorf(\"%s: invalid argument number: %d. expected number is %d\", req.GetMethod(), len(req.GetArgs()), 0)\n\t\t\t\t}\n\t\t\t\tret, err := plug.Example_Regexp_NewExamples(ctx)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn grpcfed.ToMessageListCELPluginResponse[*Example](ret)\n\t\t\tcase \"example_regexp_filterExamples_repeated example_regexp_Example_repeated example_regexp_Example\":\n\t\t\t\tif len(req.GetArgs()) != 1 {\n\t\t\t\t\treturn nil, fmt.Errorf(\"%s: invalid argument number: %d. expected number is %d\", req.GetMethod(), len(req.GetArgs()), 1)\n\t\t\t\t}\n\t\t\t\targ0, err := grpcfed.ToMessageList[*Example](req.GetArgs()[0])\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := plug.Example_Regexp_FilterExamples(ctx, arg0)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn grpcfed.ToMessageListCELPluginResponse[*Example](ret)\n\t\t\tcase \"example_regexp_Regexp_matchString_example_regexp_Regexp_string_bool\":\n\t\t\t\tif len(req.GetArgs()) != 2 {\n\t\t\t\t\treturn nil, fmt.Errorf(\"%s: invalid argument number: %d. expected number is %d\", req.GetMethod(), len(req.GetArgs()), 2)\n\t\t\t\t}\n\t\t\t\targ0, err := grpcfed.ToMessage[*Regexp](req.GetArgs()[0])\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\targ1, err := grpcfed.ToString(req.GetArgs()[1])\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := plug.Example_Regexp_Regexp_MatchString(ctx, arg0, arg1)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn grpcfed.ToBoolCELPluginResponse(ret)\n\t\t\tcase \"example_regexp_Example_concat_example_regexp_Example_repeated string_string\":\n\t\t\t\tif len(req.GetArgs()) != 2 {\n\t\t\t\t\treturn nil, fmt.Errorf(\"%s: invalid argument number: %d. expected number is %d\", req.GetMethod(), len(req.GetArgs()), 2)\n\t\t\t\t}\n\t\t\t\targ0, err := grpcfed.ToMessage[*Example](req.GetArgs()[0])\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\targ1, err := grpcfed.ToStringList(req.GetArgs()[1])\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := plug.Example_Regexp_Example_Concat(ctx, arg0, arg1)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn grpcfed.ToStringCELPluginResponse(ret)\n\t\t\tcase \"example_regexp_Example_split_example_regexp_Example_string_string_repeated string\":\n\t\t\t\tif len(req.GetArgs()) != 3 {\n\t\t\t\t\treturn nil, fmt.Errorf(\"%s: invalid argument number: %d. expected number is %d\", req.GetMethod(), len(req.GetArgs()), 3)\n\t\t\t\t}\n\t\t\t\targ0, err := grpcfed.ToMessage[*Example](req.GetArgs()[0])\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\targ1, err := grpcfed.ToString(req.GetArgs()[1])\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\targ2, err := grpcfed.ToString(req.GetArgs()[2])\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := plug.Example_Regexp_Example_Split(ctx, arg0, arg1, arg2)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn grpcfed.ToStringListCELPluginResponse(ret)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"unexpected method name: %s\", req.GetMethod())\n\t\t},\n\t)\n}\n"
  },
  {
    "path": "_examples/15_cel_plugin/proto/buf.yaml",
    "content": "version: v1\nbreaking:\n  use:\n    - FILE\nlint:\n  use:\n    - DEFAULT\n"
  },
  {
    "path": "_examples/15_cel_plugin/proto/federation/federation.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file)= {\n  import: [\n    \"plugin/plugin.proto\"\n  ]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc IsMatch(IsMatchRequest) returns (IsMatchResponse) {};\n  rpc Example(ExampleRequest) returns (ExampleResponse) {};\n}\n\nmessage IsMatchRequest {\n  string expr = 1;\n  string target = 2;\n}\n    \nmessage IsMatchResponse {\n  option (grpc.federation.message) = {\n    def { name: \"re\" by: \"example.regexp.compile($.expr)\" }\n    def { name: \"matched\" by: \"re.matchString($.target)\" }\n  };\n  bool result = 1 [(grpc.federation.field).by = \"matched\"];\n}\n\nmessage ExampleRequest{}\n\nmessage ExampleResponse {\n  option (grpc.federation.message) = {\n    def { name: \"exps\" by: \"example.regexp.newExamples()\" }\n    def { name: \"v\" by: \"example.regexp.filterExamples(exps)\" }\n    def { name: \"exp\" by: \"example.regexp.newExample()\"}\n    def { name: \"str\" by: \"exp.concat(exp.split('/a/b/c', '/'))\"}\n    def { name: \"exp_msg\" message { name: \"example.regexp.Example\" args { name: \"value\" by: \"2\" } }}\n  };\n  int64 size = 1 [(grpc.federation.field).by = \"v.size()\"];\n  string str = 2 [(grpc.federation.field).by = \"str\"];\n  int64 value = 3 [(grpc.federation.field).by = \"exp_msg.value\"];\n}"
  },
  {
    "path": "_examples/15_cel_plugin/proto/plugin/plugin.proto",
    "content": "syntax = \"proto3\";\n\npackage example.regexp;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/plugin;pluginpb\";\n\nmessage Regexp {\n  uint32 ptr = 1; // store raw pointer value.\n}\n\nmessage Example {\n  option (grpc.federation.message) = {\n    def { name: \"v\" by: \"$.value + 1\" }\n  };\n  int64 value = 1 [(grpc.federation.field).by = \"v\"];\n}\n\noption (grpc.federation.file).plugin.export = {\n  name: \"regexp\"\n  types: [\n    {\n      name: \"Regexp\"\n      desc: \"Regexp is the representation of a compiled regular expression\"\n      methods: [\n        {\n          name: \"matchString\"\n          desc: \"matchString reports whether the string s contains any match of the regular expression\"\n          args {\n            name: \"s\"\n            type { kind: STRING }\n            desc: \"target text\"\n          }\n          return { kind: BOOL }\n        }\n      ]\n    },\n    {\n      name: \"Example\"\n      desc: \"example type\"\n      methods: [\n        {\n          name: \"concat\"\n          args { type { repeated {kind: STRING} } }\n          return { kind: STRING }\n        },\n        {\n          name: \"split\"\n          args { name: \"s\" type {kind: STRING} }\n          args { name: \"sep\" type {kind: STRING} }\n          return { repeated {kind: STRING} }\n        }\n      ]\n    }\n  ]\n  functions: [\n    {\n      name: \"compile\"\n      desc: \"compile parses a regular expression and returns, if successful, a Regexp that can be used to match against text\"\n      args {\n        name: \"expr\"\n        type { kind: STRING }\n        desc: \"a regular expression text\"\n      }\n      return { message: \"Regexp\" }\n    },\n    {\n      name: \"newExample\"\n      return { message: \"Example\" }\n    },\n    {\n      name: \"newExamples\"\n      return { repeated {message: \"Example\"} }\n    },\n    {\n      name: \"filterExamples\"\n      args {type {repeated {message: \"Example\"}}}\n      return { repeated {message: \"Example\"} }\n    }\n  ]\n  variables: [\n    {\n      name: \"val\"\n      desc: \"a variable for test\"\n      type { kind: STRING }\n    }\n  ]\n};\n"
  },
  {
    "path": "_examples/16_code_gen_plugin/.gitignore",
    "content": "grpc/federation\n*.wasm\ngrpc-federation.yaml\nbuf.gen.yaml\n"
  },
  {
    "path": "_examples/16_code_gen_plugin/Makefile",
    "content": "MAKEFILE_DIR := $(dir $(lastword $(MAKEFILE_LIST)))\nGOBIN := $(MAKEFILE_DIR)/../../bin\nPATH := $(GOBIN):$(PATH)\n\nJAEGER_IMAGE := jaegertracing/all-in-one:latest\n\n.PHONY: generate\ngenerate: generate/config\n\t$(GOBIN)/buf generate\n\ngenerate/config: build/wasm\n\tgo run ./cmd/config/main.go\n\n.PHONY: lint\nlint:\n\t@$(GOBIN)/grpc-federation-linter -Iproto -Iproto_deps ./proto/federation/federation.proto\n\n.PHONY: test\ntest:\n\tgo test -race ./ -count=1\n\n.PHONY: grpc-federation/generate\ngrpc-federation/generate: generate/config\n\t@$(GOBIN)/grpc-federation-generator ./proto/federation/federation.proto\n\n.PHONY: grpc-federation/watch\ngrpc-federation/watch:\n\t@$(GOBIN)/grpc-federation-generator -w\n\n.PHONY: jaeger/start\njaeger/start:\n\t@docker run \\\n\t\t-e COLLECTOR_OTLP_ENABLED=true \\\n\t\t-p 16686:16686 \\\n\t\t-p 4317:4317 \\\n\t\t-p 4318:4318 \\\n\t\t-d \\\n\t\t$(JAEGER_IMAGE)\n\n.PHONY: jaeger/stop\njaeger/stop:\n\t@docker stop $(shell docker ps -q  --filter ancestor=$(JAEGER_IMAGE))\n\nbuild/wasm:\n\tGOOS=wasip1 GOARCH=wasm go build -o plugin.wasm ./cmd/plugin\n"
  },
  {
    "path": "_examples/16_code_gen_plugin/buf.work.yaml",
    "content": "version: v1\ndirectories:\n  - proto\n  - proto_deps\n"
  },
  {
    "path": "_examples/16_code_gen_plugin/cmd/config/main.go",
    "content": "package main\n\nimport (\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"runtime\"\n)\n\nvar bufGenYAML = `\n# Code generated by cmd/config/main.go. DO NOT EDIT!\nversion: v1\nmanaged:\n  enabled: true\nplugins:\n  - plugin: go\n    out: .\n    opt: paths=source_relative\n  - plugin: go-grpc\n    out: .\n    opt: paths=source_relative\n  - plugin: grpc-federation\n    out: .\n    opt:\n      - paths=source_relative\n      - plugins=file://plugin.wasm:%s\n`\n\nvar grpcFederationYAML = `\n# Code generated by cmd/config/main.go. DO NOT EDIT!\nimports:\n  - proto\nsrc:\n  - proto\nout: .\nplugins:\n  - plugin: go\n    opt: paths=source_relative\n  - plugin: go-grpc\n    opt: paths=source_relative\n  - plugin: grpc-federation\n    opt:\n      - paths=source_relative\n      - plugins=file://plugin.wasm:%s\n`\n\nfunc main() {\n\tif err := run(); err != nil {\n\t\tlog.Fatalf(\"%+v\", err)\n\t}\n}\n\nfunc run() error {\n\twasm, err := os.ReadFile(filepath.Join(root(), \"plugin.wasm\"))\n\tif err != nil {\n\t\treturn err\n\t}\n\thash := toSha256(wasm)\n\tif err := os.WriteFile(\n\t\tfilepath.Join(root(), \"buf.gen.yaml\"),\n\t\t[]byte(fmt.Sprintf(bufGenYAML, hash)),\n\t\t0o600,\n\t); err != nil {\n\t\treturn err\n\t}\n\tif err := os.WriteFile(\n\t\tfilepath.Join(root(), \"grpc-federation.yaml\"),\n\t\t[]byte(fmt.Sprintf(grpcFederationYAML, hash)),\n\t\t0o600,\n\t); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc toSha256(v []byte) string {\n\thash := sha256.Sum256(v)\n\treturn hex.EncodeToString(hash[:])\n}\n\nfunc root() string {\n\treturn filepath.Join(curDir(), \"..\", \"..\")\n}\n\nfunc curDir() string {\n\t_, file, _, _ := runtime.Caller(0) //nolint:dogsled\n\treturn filepath.Dir(file)\n}\n"
  },
  {
    "path": "_examples/16_code_gen_plugin/cmd/plugin/main.go",
    "content": "package main\n\nimport (\n\t_ \"embed\"\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\n\t\"github.com/mercari/grpc-federation/grpc/federation/generator\"\n)\n\n//go:embed resolver.go.tmpl\nvar tmpl []byte\n\nfunc main() {\n\treq, err := generator.ToCodeGeneratorRequest(os.Stdin)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tfor _, file := range req.GRPCFederationFiles {\n\t\tfor _, svc := range file.Services {\n\t\t\tfmt.Fprintln(os.Stderr, \"service name\", svc.Name)\n\t\t\tfor _, method := range svc.Methods {\n\t\t\t\tfmt.Fprintln(os.Stderr, \"method name\", method.Name)\n\t\t\t\tif method.Rule != nil {\n\t\t\t\t\tfmt.Fprintln(os.Stderr, \"method timeout\", method.Rule.Timeout)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor _, msg := range file.Messages {\n\t\t\tfmt.Fprintln(os.Stderr, \"msg name\", msg.Name)\n\t\t}\n\t}\n\tif err := os.WriteFile(\"resolver_test.go\", tmpl, 0o600); err != nil {\n\t\tlog.Fatal(err)\n\t}\n}\n"
  },
  {
    "path": "_examples/16_code_gen_plugin/cmd/plugin/resolver.go.tmpl",
    "content": "// Code generated by cmd/plugin/main.go. DO NOT EDIT!\npackage main_test\n\nimport (\n\t\"context\"\n\n\t\"example/federation\"\n)\n\nfunc (r *resolver) Resolve_Org_Federation_GetResponse(ctx context.Context, req *federation.FederationService_Org_Federation_GetResponseArgument) (*federation.GetResponse, error) {\n\treturn &federation.GetResponse{\n\t\tId: req.Id,\n\t}, nil\n}\n"
  },
  {
    "path": "_examples/16_code_gen_plugin/federation/federation.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype GetRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetRequest) Reset() {\n\t*x = GetRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetRequest) ProtoMessage() {}\n\nfunc (x *GetRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetRequest.ProtoReflect.Descriptor instead.\nfunc (*GetRequest) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetRequest) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\ntype GetResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetResponse) Reset() {\n\t*x = GetResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetResponse) ProtoMessage() {}\n\nfunc (x *GetResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetResponse.ProtoReflect.Descriptor instead.\nfunc (*GetResponse) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetResponse) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nvar File_federation_federation_proto protoreflect.FileDescriptor\n\nvar file_federation_federation_proto_rawDesc = []byte{\n\t0x0a, 0x1b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x6f,\n\t0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x20, 0x67,\n\t0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22,\n\t0x1c, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a,\n\t0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x22, 0x24, 0x0a,\n\t0x0b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02,\n\t0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x3a, 0x05, 0x9a, 0x4a,\n\t0x02, 0x10, 0x01, 0x32, 0x62, 0x0a, 0x11, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x48, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12,\n\t0x1a, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x6f, 0x72,\n\t0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74,\n\t0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x08, 0x9a, 0x4a, 0x05, 0x0a, 0x03, 0x31,\n\t0x30, 0x73, 0x1a, 0x03, 0x9a, 0x4a, 0x00, 0x42, 0x9d, 0x01, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x2e,\n\t0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0f,\n\t0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50,\n\t0x01, 0x5a, 0x1d, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0xa2, 0x02, 0x03, 0x4f, 0x46, 0x58, 0xaa, 0x02, 0x0e, 0x4f, 0x72, 0x67, 0x2e, 0x46, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xca, 0x02, 0x0e, 0x4f, 0x72, 0x67, 0x5c, 0x46, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xe2, 0x02, 0x1a, 0x4f, 0x72, 0x67, 0x5c, 0x46,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74,\n\t0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0f, 0x4f, 0x72, 0x67, 0x3a, 0x3a, 0x46, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_federation_federation_proto_rawDescOnce sync.Once\n\tfile_federation_federation_proto_rawDescData = file_federation_federation_proto_rawDesc\n)\n\nfunc file_federation_federation_proto_rawDescGZIP() []byte {\n\tfile_federation_federation_proto_rawDescOnce.Do(func() {\n\t\tfile_federation_federation_proto_rawDescData = protoimpl.X.CompressGZIP(file_federation_federation_proto_rawDescData)\n\t})\n\treturn file_federation_federation_proto_rawDescData\n}\n\nvar file_federation_federation_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_federation_federation_proto_goTypes = []interface{}{\n\t(*GetRequest)(nil),  // 0: org.federation.GetRequest\n\t(*GetResponse)(nil), // 1: org.federation.GetResponse\n}\nvar file_federation_federation_proto_depIdxs = []int32{\n\t0, // 0: org.federation.FederationService.Get:input_type -> org.federation.GetRequest\n\t1, // 1: org.federation.FederationService.Get:output_type -> org.federation.GetResponse\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_federation_federation_proto_init() }\nfunc file_federation_federation_proto_init() {\n\tif File_federation_federation_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_federation_federation_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_federation_federation_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_federation_federation_proto_goTypes,\n\t\tDependencyIndexes: file_federation_federation_proto_depIdxs,\n\t\tMessageInfos:      file_federation_federation_proto_msgTypes,\n\t}.Build()\n\tFile_federation_federation_proto = out.File\n\tfile_federation_federation_proto_rawDesc = nil\n\tfile_federation_federation_proto_goTypes = nil\n\tfile_federation_federation_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/16_code_gen_plugin/federation/federation_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tFederationService_Get_FullMethodName = \"/org.federation.FederationService/Get\"\n)\n\n// FederationServiceClient is the client API for FederationService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype FederationServiceClient interface {\n\tGet(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error)\n}\n\ntype federationServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewFederationServiceClient(cc grpc.ClientConnInterface) FederationServiceClient {\n\treturn &federationServiceClient{cc}\n}\n\nfunc (c *federationServiceClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) {\n\tout := new(GetResponse)\n\terr := c.cc.Invoke(ctx, FederationService_Get_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// FederationServiceServer is the server API for FederationService service.\n// All implementations must embed UnimplementedFederationServiceServer\n// for forward compatibility\ntype FederationServiceServer interface {\n\tGet(context.Context, *GetRequest) (*GetResponse, error)\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\n// UnimplementedFederationServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedFederationServiceServer struct {\n}\n\nfunc (UnimplementedFederationServiceServer) Get(context.Context, *GetRequest) (*GetResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method Get not implemented\")\n}\nfunc (UnimplementedFederationServiceServer) mustEmbedUnimplementedFederationServiceServer() {}\n\n// UnsafeFederationServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to FederationServiceServer will\n// result in compilation errors.\ntype UnsafeFederationServiceServer interface {\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\nfunc RegisterFederationServiceServer(s grpc.ServiceRegistrar, srv FederationServiceServer) {\n\ts.RegisterService(&FederationService_ServiceDesc, srv)\n}\n\nfunc _FederationService_Get_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(FederationServiceServer).Get(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: FederationService_Get_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(FederationServiceServer).Get(ctx, req.(*GetRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// FederationService_ServiceDesc is the grpc.ServiceDesc for FederationService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar FederationService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"org.federation.FederationService\",\n\tHandlerType: (*FederationServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"Get\",\n\t\t\tHandler:    _FederationService_Get_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"federation/federation.proto\",\n}\n"
  },
  {
    "path": "_examples/16_code_gen_plugin/federation/federation_grpc_federation.pb.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: federation/federation.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Org_Federation_GetResponseVariable represents variable definitions in \"org.federation.GetResponse\".\ntype FederationService_Org_Federation_GetResponseVariable struct {\n}\n\n// Org_Federation_GetResponseArgument is argument for \"org.federation.GetResponse\" message.\ntype FederationService_Org_Federation_GetResponseArgument struct {\n\tId int64\n\tFederationService_Org_Federation_GetResponseVariable\n}\n\n// FederationServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationServiceConfig struct {\n\t// Resolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\n\t// If this interface is not provided, an error is returned during initialization.\n\tResolver FederationServiceResolver // required\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationServiceClientFactory interface {\n}\n\n// FederationServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationServiceDependentClientSet struct {\n}\n\n// FederationServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationServiceResolver interface {\n\t// Resolve_Org_Federation_GetResponse implements resolver for \"org.federation.GetResponse\".\n\tResolve_Org_Federation_GetResponse(context.Context, *FederationService_Org_Federation_GetResponseArgument) (*GetResponse, error)\n}\n\n// FederationServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// FederationServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationServiceUnimplementedResolver struct{}\n\n// Resolve_Org_Federation_GetResponse resolve \"org.federation.GetResponse\".\n// This method always returns Unimplemented error.\nfunc (FederationServiceUnimplementedResolver) Resolve_Org_Federation_GetResponse(context.Context, *FederationService_Org_Federation_GetResponseArgument) (ret *GetResponse, e error) {\n\te = grpcfed.GRPCErrorf(grpcfed.UnimplementedCode, \"method Resolve_Org_Federation_GetResponse not implemented\")\n\treturn\n}\n\n// FederationService represents Federation Service.\ntype FederationService struct {\n\tUnimplementedFederationServiceServer\n\tcfg             FederationServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tresolver        FederationServiceResolver\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationServiceDependentClientSet\n}\n\n// NewFederationService creates FederationService instance by FederationServiceConfig.\nfunc NewFederationService(cfg FederationServiceConfig) (*FederationService, error) {\n\tif cfg.Resolver == nil {\n\t\treturn nil, grpcfed.ErrResolverConfig\n\t}\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"org.federation.FederationService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.org.federation.GetResponseArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELIntType, \"Id\"),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"org.federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tsvc := &FederationService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tresolver:        cfg.Resolver,\n\t\tclient:          &FederationServiceDependentClientSet{},\n\t}\n\tif resolver, ok := cfg.Resolver.(grpcfed.CustomResolverInitializer); ok {\n\t\tctx := context.Background()\n\t\tif err := resolver.Init(ctx); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationService(ctx context.Context, svc *FederationService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n// Get implements \"org.federation.FederationService/Get\" method.\nfunc (s *FederationService) Get(ctx context.Context, req *GetRequest) (res *GetResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.FederationService/Get\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := grpcfed.WithTimeout[GetResponse](ctx, \"org.federation.FederationService/Get\", 10000000000 /* 10s */, func(ctx context.Context) (*GetResponse, error) {\n\t\treturn s.resolve_Org_Federation_GetResponse(ctx, &FederationService_Org_Federation_GetResponseArgument{\n\t\t\tId: req.GetId(),\n\t\t})\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Org_Federation_GetResponse resolve \"org.federation.GetResponse\" message.\nfunc (s *FederationService) resolve_Org_Federation_GetResponse(ctx context.Context, req *FederationService_Org_Federation_GetResponseArgument) (*GetResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.GetResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.GetResponse\", slog.Any(\"message_args\", s.logvalue_Org_Federation_GetResponseArgument(req)))\n\n\t// create a message value to be returned.\n\t// `custom_resolver = true` in \"grpc.federation.message\" option.\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx)) // create a new reference to logger.\n\tret, err := s.resolver.Resolve_Org_Federation_GetResponse(ctx, req)\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.GetResponse\", slog.Any(\"org.federation.GetResponse\", s.logvalue_Org_Federation_GetResponse(ret)))\n\treturn ret, nil\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetResponse(v *GetResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Int64(\"id\", v.GetId()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetResponseArgument(v *FederationService_Org_Federation_GetResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Int64(\"id\", v.Id),\n\t)\n}\n"
  },
  {
    "path": "_examples/16_code_gen_plugin/go.mod",
    "content": "module example\n\ngo 1.24.0\n\nreplace github.com/mercari/grpc-federation => ../../\n\nrequire (\n\tgithub.com/google/go-cmp v0.7.0\n\tgithub.com/mercari/grpc-federation v0.0.0-00010101000000-000000000000\n\tgo.opentelemetry.io/otel v1.24.0\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0\n\tgo.opentelemetry.io/otel/sdk v1.24.0\n\tgo.opentelemetry.io/otel/trace v1.24.0\n\tgo.uber.org/goleak v1.3.0\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7\n\tgoogle.golang.org/grpc v1.65.0\n\tgoogle.golang.org/protobuf v1.34.2\n)\n\nrequire (\n\tcel.dev/expr v0.19.1 // indirect\n\tgithub.com/antlr4-go/antlr/v4 v4.13.0 // indirect\n\tgithub.com/bufbuild/protocompile v0.9.0 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.2.1 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/goccy/wasi-go v0.3.2 // indirect\n\tgithub.com/google/cel-go v0.23.1 // indirect\n\tgithub.com/google/uuid v1.6.0 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect\n\tgithub.com/kelseyhightower/envconfig v1.4.0 // indirect\n\tgithub.com/stealthrocket/wazergo v0.19.1 // indirect\n\tgithub.com/stoewer/go-strcase v1.3.0 // indirect\n\tgithub.com/tetratelabs/wazero v1.10.1 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.24.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.0.0 // indirect\n\tgolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect\n\tgolang.org/x/net v0.38.0 // indirect\n\tgolang.org/x/sync v0.14.0 // indirect\n\tgolang.org/x/sys v0.37.0 // indirect\n\tgolang.org/x/text v0.23.0 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 // indirect\n)\n"
  },
  {
    "path": "_examples/16_code_gen_plugin/go.sum",
    "content": "cel.dev/expr v0.19.1 h1:NciYrtDRIR0lNCnH1LFJegdjspNx9fI59O7TWcua/W4=\ncel.dev/expr v0.19.1/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw=\ngithub.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=\ngithub.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=\ngithub.com/bufbuild/protocompile v0.9.0 h1:DI8qLG5PEO0Mu1Oj51YFPqtx6I3qYXUAhJVJ/IzAVl0=\ngithub.com/bufbuild/protocompile v0.9.0/go.mod h1:s89m1O8CqSYpyE/YaSGtg1r1YFMF5nLTwh4vlj6O444=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/goccy/wasi-go v0.3.2 h1:wAvGXmqCkfcp0B0AwIp5Ya53hzDwkKm9W8iuT3nCCz0=\ngithub.com/goccy/wasi-go v0.3.2/go.mod h1:nIKD204n9xa4Z20UV+XA483kIr9TAl2vXr+X5qVAO5M=\ngithub.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4=\ngithub.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=\ngithub.com/google/cel-go v0.23.1 h1:91ThhEZlBcE5rB2adBVXqvDoqdL8BG2oyhd0bK1I/r4=\ngithub.com/google/cel-go v0.23.1/go.mod h1:52Pb6QsDbC5kvgxvZhiL9QX1oZEkcUF/ZqaPx1J5Wwo=\ngithub.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\ngithub.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg=\ngithub.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=\ngithub.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/stealthrocket/wazergo v0.19.1 h1:BPrITETPgSFwiytwmToO0MbUC/+RGC39JScz1JmmG6c=\ngithub.com/stealthrocket/wazergo v0.19.1/go.mod h1:riI0hxw4ndZA5e6z7PesHg2BtTftcZaMxRcoiGGipTs=\ngithub.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs=\ngithub.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tetratelabs/wazero v1.10.1 h1:2DugeJf6VVk58KTPszlNfeeN8AhhpwcZqkJj2wwFuH8=\ngithub.com/tetratelabs/wazero v1.10.1/go.mod h1:DRm5twOQ5Gr1AoEdSi0CLjDQF1J9ZAuyqFIjl1KKfQU=\ngo.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo=\ngo.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0=\ngo.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI=\ngo.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=\ngo.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw=\ngo.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg=\ngo.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=\ngo.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=\ngo.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=\ngo.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=\ngolang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=\ngolang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=\ngolang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=\ngolang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=\ngolang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=\ngolang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=\ngolang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 h1:YcyjlL1PRr2Q17/I0dPk2JmYS5CDXfcdb2Z3YRioEbw=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7 h1:2035KHhUv+EpyB+hWgJnaWKJOdX1E95w2S8Rr4uWKTs=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=\ngoogle.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=\ngoogle.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=\ngoogle.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=\ngoogle.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "_examples/16_code_gen_plugin/main_test.go",
    "content": "package main_test\n\nimport (\n\t\"context\"\n\t\"log/slog\"\n\t\"net\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\"\n\t\"go.opentelemetry.io/otel/propagation\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\tsdktrace \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.4.0\"\n\t\"go.uber.org/goleak\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/credentials/insecure\"\n\t\"google.golang.org/grpc/test/bufconn\"\n\n\t\"example/federation\"\n)\n\nconst bufSize = 1024\n\nvar (\n\tlistener *bufconn.Listener\n)\n\nfunc dialer(ctx context.Context, address string) (net.Conn, error) {\n\treturn listener.Dial()\n}\n\ntype resolver struct{}\n\nfunc TestFederation(t *testing.T) {\n\tdefer goleak.VerifyNone(t)\n\tctx := context.Background()\n\tlistener = bufconn.Listen(bufSize)\n\n\tif os.Getenv(\"ENABLE_JAEGER\") != \"\" {\n\t\texporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithInsecure())\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttp := sdktrace.NewTracerProvider(\n\t\t\tsdktrace.WithBatcher(exporter),\n\t\t\tsdktrace.WithResource(\n\t\t\t\tresource.NewWithAttributes(\n\t\t\t\t\tsemconv.SchemaURL,\n\t\t\t\t\tsemconv.ServiceNameKey.String(\"example16/codegenplugin\"),\n\t\t\t\t\tsemconv.ServiceVersionKey.String(\"1.0.0\"),\n\t\t\t\t\tattribute.String(\"environment\", \"dev\"),\n\t\t\t\t),\n\t\t\t),\n\t\t\tsdktrace.WithSampler(sdktrace.AlwaysSample()),\n\t\t)\n\t\tdefer tp.Shutdown(ctx)\n\t\totel.SetTextMapPropagator(propagation.TraceContext{})\n\t\totel.SetTracerProvider(tp)\n\t}\n\n\tconn, err := grpc.DialContext(\n\t\tctx, \"\",\n\t\tgrpc.WithContextDialer(dialer),\n\t\tgrpc.WithTransportCredentials(insecure.NewCredentials()),\n\t)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer conn.Close()\n\n\tgrpcServer := grpc.NewServer()\n\tdefer grpcServer.Stop()\n\n\tlogger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{\n\t\tLevel: slog.LevelDebug,\n\t}))\n\tfederationServer, err := federation.NewFederationService(federation.FederationServiceConfig{\n\t\tLogger:   logger,\n\t\tResolver: new(resolver),\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer federation.CleanupFederationService(ctx, federationServer)\n\n\tfederation.RegisterFederationServiceServer(grpcServer, federationServer)\n\n\tgo func() {\n\t\tif err := grpcServer.Serve(listener); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t}()\n\n\tclient := federation.NewFederationServiceClient(conn)\n\tres, err := client.Get(ctx, &federation.GetRequest{\n\t\tId: 10,\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif diff := cmp.Diff(res, &federation.GetResponse{\n\t\tId: 10,\n\t}, cmpopts.IgnoreUnexported(\n\t\tfederation.GetResponse{},\n\t)); diff != \"\" {\n\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t}\n}\n"
  },
  {
    "path": "_examples/16_code_gen_plugin/proto/buf.yaml",
    "content": "version: v1\nbreaking:\n  use:\n    - FILE\nlint:\n  use:\n    - DEFAULT\n"
  },
  {
    "path": "_examples/16_code_gen_plugin/proto/federation/federation.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc Get(GetRequest) returns (GetResponse) {\n    option (grpc.federation.method).timeout = \"10s\";\n  };\n}\n\nmessage GetRequest {\n  int64 id = 1;\n}\n\nmessage GetResponse {\n  option (grpc.federation.message).custom_resolver = true;\n  int64 id = 1;\n}\n"
  },
  {
    "path": "_examples/16_code_gen_plugin/resolver_test.go",
    "content": "// Code generated by cmd/plugin/main.go. DO NOT EDIT!\npackage main_test\n\nimport (\n\t\"context\"\n\n\t\"example/federation\"\n)\n\nfunc (r *resolver) Resolve_Org_Federation_GetResponse(ctx context.Context, req *federation.FederationService_Org_Federation_GetResponseArgument) (*federation.GetResponse, error) {\n\treturn &federation.GetResponse{\n\t\tId: req.Id,\n\t}, nil\n}\n"
  },
  {
    "path": "_examples/17_error_handler/.gitignore",
    "content": "grpc/federation\n"
  },
  {
    "path": "_examples/17_error_handler/Makefile",
    "content": "MAKEFILE_DIR := $(dir $(lastword $(MAKEFILE_LIST)))\nGOBIN := $(MAKEFILE_DIR)/../../bin\nPATH := $(GOBIN):$(PATH)\n\nJAEGER_IMAGE := jaegertracing/all-in-one:latest\n\n.PHONY: generate\ngenerate:\n\t$(GOBIN)/buf generate\n\n.PHONY: lint\nlint:\n\t@$(GOBIN)/grpc-federation-linter -Iproto -Iproto_deps ./proto/federation/federation.proto\n\n.PHONY: test\ntest:\n\tgo test -race ./ -count=1\n\n.PHONY: grpc-federation/generate\ngrpc-federation/generate:\n\t@$(GOBIN)/grpc-federation-generator ./proto/federation/federation.proto\n\n.PHONY: grpc-federation/watch\ngrpc-federation/watch:\n\t@$(GOBIN)/grpc-federation-generator -w\n\n.PHONY: jaeger/start\njaeger/start:\n\t@docker run \\\n\t\t-e COLLECTOR_OTLP_ENABLED=true \\\n\t\t-p 16686:16686 \\\n\t\t-p 4317:4317 \\\n\t\t-p 4318:4318 \\\n\t\t-d \\\n\t\t$(JAEGER_IMAGE)\n\n.PHONY: jaeger/stop\njaeger/stop:\n\t@docker stop $(shell docker ps -q  --filter ancestor=$(JAEGER_IMAGE))\n"
  },
  {
    "path": "_examples/17_error_handler/buf.gen.yaml",
    "content": "version: v1\nmanaged:\n  enabled: true\nplugins:\n  - plugin: go\n    out: .\n    opt: paths=source_relative\n  - plugin: go-grpc\n    out: .\n    opt: paths=source_relative\n  - plugin: grpc-federation\n    out: .\n    opt:\n    - paths=source_relative\n    - import_paths=proto\n"
  },
  {
    "path": "_examples/17_error_handler/buf.work.yaml",
    "content": "version: v1\ndirectories:\n  - proto\n  - proto_deps\n"
  },
  {
    "path": "_examples/17_error_handler/federation/federation.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype GetPostRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetPostRequest) Reset() {\n\t*x = GetPostRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostRequest) ProtoMessage() {}\n\nfunc (x *GetPostRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostRequest.ProtoReflect.Descriptor instead.\nfunc (*GetPostRequest) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetPostRequest) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\ntype GetPostResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPost *Post `protobuf:\"bytes,1,opt,name=post,proto3\" json:\"post,omitempty\"`\n}\n\nfunc (x *GetPostResponse) Reset() {\n\t*x = GetPostResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostResponse) ProtoMessage() {}\n\nfunc (x *GetPostResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostResponse.ProtoReflect.Descriptor instead.\nfunc (*GetPostResponse) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetPostResponse) GetPost() *Post {\n\tif x != nil {\n\t\treturn x.Post\n\t}\n\treturn nil\n}\n\ntype Z struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tCode int32 `protobuf:\"varint,1,opt,name=code,proto3\" json:\"code,omitempty\"`\n}\n\nfunc (x *Z) Reset() {\n\t*x = Z{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Z) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Z) ProtoMessage() {}\n\nfunc (x *Z) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Z.ProtoReflect.Descriptor instead.\nfunc (*Z) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *Z) GetCode() int32 {\n\tif x != nil {\n\t\treturn x.Code\n\t}\n\treturn 0\n}\n\ntype Post struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId    string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tTitle string `protobuf:\"bytes,2,opt,name=title,proto3\" json:\"title,omitempty\"`\n\tCode  int32  `protobuf:\"varint,3,opt,name=code,proto3\" json:\"code,omitempty\"`\n}\n\nfunc (x *Post) Reset() {\n\t*x = Post{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Post) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Post) ProtoMessage() {}\n\nfunc (x *Post) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Post.ProtoReflect.Descriptor instead.\nfunc (*Post) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *Post) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetTitle() string {\n\tif x != nil {\n\t\treturn x.Title\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetCode() int32 {\n\tif x != nil {\n\t\treturn x.Code\n\t}\n\treturn 0\n}\n\ntype LocalizedMessage struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tValue string `protobuf:\"bytes,1,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *LocalizedMessage) Reset() {\n\t*x = LocalizedMessage{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *LocalizedMessage) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*LocalizedMessage) ProtoMessage() {}\n\nfunc (x *LocalizedMessage) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use LocalizedMessage.ProtoReflect.Descriptor instead.\nfunc (*LocalizedMessage) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *LocalizedMessage) GetValue() string {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn \"\"\n}\n\ntype CustomMessage struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMsg string `protobuf:\"bytes,1,opt,name=msg,proto3\" json:\"msg,omitempty\"`\n}\n\nfunc (x *CustomMessage) Reset() {\n\t*x = CustomMessage{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CustomMessage) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CustomMessage) ProtoMessage() {}\n\nfunc (x *CustomMessage) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CustomMessage.ProtoReflect.Descriptor instead.\nfunc (*CustomMessage) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *CustomMessage) GetMsg() string {\n\tif x != nil {\n\t\treturn x.Msg\n\t}\n\treturn \"\"\n}\n\ntype GetPost2Request struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetPost2Request) Reset() {\n\t*x = GetPost2Request{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPost2Request) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPost2Request) ProtoMessage() {}\n\nfunc (x *GetPost2Request) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPost2Request.ProtoReflect.Descriptor instead.\nfunc (*GetPost2Request) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *GetPost2Request) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\ntype GetPost2Response struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *GetPost2Response) Reset() {\n\t*x = GetPost2Response{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPost2Response) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPost2Response) ProtoMessage() {}\n\nfunc (x *GetPost2Response) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPost2Response.ProtoReflect.Descriptor instead.\nfunc (*GetPost2Response) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{7}\n}\n\nvar File_federation_federation_proto protoreflect.FileDescriptor\n\nvar file_federation_federation_proto_rawDesc = []byte{\n\t0x0a, 0x1b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x6f,\n\t0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x20, 0x67,\n\t0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22,\n\t0x20, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,\n\t0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,\n\t0x64, 0x22, 0x67, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70,\n\t0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x42, 0x09, 0x9a, 0x4a, 0x06, 0x12, 0x04, 0x70,\n\t0x6f, 0x73, 0x74, 0x52, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x3a, 0x1f, 0x9a, 0x4a, 0x1c, 0x0a, 0x1a,\n\t0x0a, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x6a, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x73, 0x74, 0x12, 0x0a,\n\t0x0a, 0x02, 0x69, 0x64, 0x12, 0x04, 0x24, 0x2e, 0x69, 0x64, 0x22, 0x42, 0x0a, 0x01, 0x5a, 0x12,\n\t0x1d, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x42, 0x09, 0x9a,\n\t0x4a, 0x06, 0x12, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x3a, 0x1e,\n\t0x9a, 0x4a, 0x1b, 0x0a, 0x19, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x5a, 0x11, 0x24, 0x2e, 0x65,\n\t0x72, 0x72, 0x6f, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x82,\n\t0x07, 0x0a, 0x04, 0x50, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x1d, 0x0a,\n\t0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x42, 0x09, 0x9a, 0x4a, 0x06,\n\t0x12, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x3a, 0xb4, 0x06, 0x9a,\n\t0x4a, 0xb0, 0x06, 0x0a, 0xe1, 0x05, 0x0a, 0x03, 0x72, 0x65, 0x73, 0x72, 0xd9, 0x05, 0x0a, 0x18,\n\t0x70, 0x6f, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n\t0x2f, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x12, 0x0a, 0x0a, 0x02, 0x69, 0x64, 0x12, 0x04,\n\t0x24, 0x2e, 0x69, 0x64, 0x2a, 0xef, 0x03, 0x0a, 0x0a, 0x0a, 0x02, 0x69, 0x64, 0x5a, 0x04, 0x24,\n\t0x2e, 0x69, 0x64, 0x0a, 0x1a, 0x6a, 0x18, 0x0a, 0x01, 0x5a, 0x12, 0x13, 0x0a, 0x0a, 0x65, 0x72,\n\t0x72, 0x6f, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12,\n\t0xc2, 0x01, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69,\n\t0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x5b, 0x3f, 0x30,\n\t0x5d, 0x2e, 0x76, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x3f, 0x30, 0x5d,\n\t0x2e, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x61, 0x6c, 0x2e, 0x6f, 0x66, 0x28, 0x27, 0x62, 0x61, 0x72, 0x27, 0x29, 0x20, 0x26,\n\t0x26, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65,\n\t0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x5b, 0x3f, 0x30, 0x5d, 0x2e, 0x6d,\n\t0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x61, 0x6c, 0x2e, 0x6f, 0x66, 0x28, 0x27, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x27, 0x29, 0x20, 0x26,\n\t0x26, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6d,\n\t0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x5b, 0x3f, 0x30, 0x5d, 0x2e, 0x69, 0x64, 0x20, 0x3d,\n\t0x3d, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2e, 0x6f, 0x66, 0x28, 0x27, 0x78,\n\t0x78, 0x78, 0x27, 0x29, 0x18, 0x09, 0x22, 0x1e, 0x27, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73,\n\t0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x6d, 0x65,\n\t0x73, 0x73, 0x61, 0x67, 0x65, 0x27, 0x2a, 0xdd, 0x01, 0x12, 0x30, 0x0a, 0x0d, 0x6c, 0x6f, 0x63,\n\t0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6d, 0x73, 0x67, 0x6a, 0x1f, 0x0a, 0x10, 0x4c, 0x6f,\n\t0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0b,\n\t0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x6a, 0x18, 0x0a,\n\t0x01, 0x5a, 0x12, 0x13, 0x0a, 0x0a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f,\n\t0x12, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x1a, 0x24, 0x0a, 0x0d, 0x43, 0x75, 0x73, 0x74, 0x6f,\n\t0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x13, 0x0a, 0x0a, 0x65, 0x72, 0x72, 0x6f,\n\t0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x33, 0x0a,\n\t0x31, 0x0a, 0x0b, 0x27, 0x73, 0x6f, 0x6d, 0x65, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x27, 0x12, 0x0e,\n\t0x27, 0x73, 0x6f, 0x6d, 0x65, 0x2d, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x27, 0x1a, 0x12,\n\t0x27, 0x73, 0x6f, 0x6d, 0x65, 0x2d, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x27, 0x6a, 0x1c, 0x0a, 0x05, 0x65, 0x6e, 0x2d, 0x55, 0x53, 0x12, 0x13, 0x6c, 0x6f, 0x63,\n\t0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6d, 0x73, 0x67, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65,\n\t0x72, 0x14, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x7b, 0x69, 0x64, 0x3a, 0x20,\n\t0x27, 0x66, 0x6f, 0x6f, 0x27, 0x7d, 0x2a, 0x50, 0x12, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e,\n\t0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72,\n\t0x70, 0x63, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x2e, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f,\n\t0x41, 0x52, 0x47, 0x55, 0x4d, 0x45, 0x4e, 0x54, 0x18, 0x03, 0x22, 0x1a, 0x27, 0x74, 0x68, 0x69,\n\t0x73, 0x20, 0x69, 0x73, 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x20, 0x6c, 0x6f, 0x67, 0x20,\n\t0x6c, 0x65, 0x76, 0x65, 0x6c, 0x27, 0x40, 0x03, 0x2a, 0x65, 0x12, 0x2b, 0x65, 0x72, 0x72, 0x6f,\n\t0x72, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x2e, 0x55, 0x4e, 0x49, 0x4d, 0x50, 0x4c,\n\t0x45, 0x4d, 0x45, 0x4e, 0x54, 0x45, 0x44, 0x3a, 0x36, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x47, 0x65,\n\t0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x7b, 0x70, 0x6f,\n\t0x73, 0x74, 0x3a, 0x20, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x7b, 0x69, 0x64,\n\t0x3a, 0x20, 0x27, 0x61, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x27, 0x7d, 0x7d, 0x2a,\n\t0x02, 0x30, 0x01, 0x2a, 0x02, 0x18, 0x01, 0x0a, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x18,\n\t0x01, 0x5a, 0x08, 0x72, 0x65, 0x73, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x0a, 0x36, 0x0a, 0x04, 0x63,\n\t0x6f, 0x64, 0x65, 0x12, 0x15, 0x72, 0x65, 0x73, 0x2e, 0x68, 0x61, 0x73, 0x49, 0x67, 0x6e, 0x6f,\n\t0x72, 0x65, 0x64, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x29, 0x5a, 0x17, 0x72, 0x65, 0x73, 0x2e,\n\t0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x29, 0x2e, 0x63,\n\t0x6f, 0x64, 0x65, 0x22, 0x4b, 0x0a, 0x10, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64,\n\t0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x37, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x21, 0x9a, 0x4a, 0x1e, 0x12, 0x1c, 0x27, 0x6c, 0x6f,\n\t0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x27, 0x20,\n\t0x2b, 0x20, 0x24, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,\n\t0x22, 0x56, 0x0a, 0x0d, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67,\n\t0x65, 0x12, 0x45, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x33,\n\t0x9a, 0x4a, 0x30, 0x12, 0x2e, 0x27, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x20, 0x65, 0x72, 0x72,\n\t0x6f, 0x72, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x27, 0x20, 0x2b, 0x20, 0x24,\n\t0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x6d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x22, 0x21, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x50,\n\t0x6f, 0x73, 0x74, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69,\n\t0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x9f, 0x02, 0x0a, 0x10,\n\t0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x3a, 0x8a, 0x02, 0x9a, 0x4a, 0x86, 0x02, 0x0a, 0x83, 0x02, 0x72, 0x80, 0x02, 0x0a, 0x18, 0x70,\n\t0x6f, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f,\n\t0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x12, 0x0a, 0x0a, 0x02, 0x69, 0x64, 0x12, 0x04, 0x24,\n\t0x2e, 0x69, 0x64, 0x2a, 0x6f, 0x0a, 0x28, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x5a, 0x20, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x2e, 0x66,\n\t0x72, 0x6f, 0x6d, 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x29, 0x0a,\n\t0x14, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x5a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x6d, 0x65,\n\t0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2b, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x2e, 0x46,\n\t0x41, 0x49, 0x4c, 0x45, 0x44, 0x5f, 0x50, 0x52, 0x45, 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49,\n\t0x4f, 0x4e, 0x40, 0x03, 0x2a, 0x67, 0x0a, 0x29, 0x0a, 0x05, 0x63, 0x6f, 0x64, 0x65, 0x32, 0x5a,\n\t0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x6f, 0x64, 0x65,\n\t0x2e, 0x66, 0x72, 0x6f, 0x6d, 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x63, 0x6f, 0x64, 0x65,\n\t0x29, 0x0a, 0x15, 0x0a, 0x04, 0x6d, 0x73, 0x67, 0x32, 0x5a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72,\n\t0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x21, 0x63, 0x6f, 0x64, 0x65, 0x32, 0x20,\n\t0x3d, 0x3d, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x6f,\n\t0x64, 0x65, 0x2e, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x40, 0x04, 0x32, 0xb7, 0x01,\n\t0x0a, 0x11, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x12, 0x4c, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x12, 0x1e,\n\t0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f,\n\t0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,\n\t0x00, 0x12, 0x4f, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x32, 0x12, 0x1f, 0x2e,\n\t0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47,\n\t0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20,\n\t0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x22, 0x00, 0x1a, 0x03, 0x9a, 0x4a, 0x00, 0x42, 0xb1, 0x01, 0x9a, 0x4a, 0x11, 0x12, 0x0f, 0x70,\n\t0x6f, 0x73, 0x74, 0x2f, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x0a, 0x12,\n\t0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x42, 0x0f, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72,\n\t0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x1d, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0xa2, 0x02, 0x03, 0x4f, 0x46, 0x58, 0xaa, 0x02, 0x0e, 0x4f, 0x72, 0x67,\n\t0x2e, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xca, 0x02, 0x0e, 0x4f, 0x72,\n\t0x67, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xe2, 0x02, 0x1a, 0x4f,\n\t0x72, 0x67, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x47, 0x50,\n\t0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0f, 0x4f, 0x72, 0x67, 0x3a,\n\t0x3a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_federation_federation_proto_rawDescOnce sync.Once\n\tfile_federation_federation_proto_rawDescData = file_federation_federation_proto_rawDesc\n)\n\nfunc file_federation_federation_proto_rawDescGZIP() []byte {\n\tfile_federation_federation_proto_rawDescOnce.Do(func() {\n\t\tfile_federation_federation_proto_rawDescData = protoimpl.X.CompressGZIP(file_federation_federation_proto_rawDescData)\n\t})\n\treturn file_federation_federation_proto_rawDescData\n}\n\nvar file_federation_federation_proto_msgTypes = make([]protoimpl.MessageInfo, 8)\nvar file_federation_federation_proto_goTypes = []interface{}{\n\t(*GetPostRequest)(nil),   // 0: org.federation.GetPostRequest\n\t(*GetPostResponse)(nil),  // 1: org.federation.GetPostResponse\n\t(*Z)(nil),                // 2: org.federation.Z\n\t(*Post)(nil),             // 3: org.federation.Post\n\t(*LocalizedMessage)(nil), // 4: org.federation.LocalizedMessage\n\t(*CustomMessage)(nil),    // 5: org.federation.CustomMessage\n\t(*GetPost2Request)(nil),  // 6: org.federation.GetPost2Request\n\t(*GetPost2Response)(nil), // 7: org.federation.GetPost2Response\n}\nvar file_federation_federation_proto_depIdxs = []int32{\n\t3, // 0: org.federation.GetPostResponse.post:type_name -> org.federation.Post\n\t0, // 1: org.federation.FederationService.GetPost:input_type -> org.federation.GetPostRequest\n\t6, // 2: org.federation.FederationService.GetPost2:input_type -> org.federation.GetPost2Request\n\t1, // 3: org.federation.FederationService.GetPost:output_type -> org.federation.GetPostResponse\n\t7, // 4: org.federation.FederationService.GetPost2:output_type -> org.federation.GetPost2Response\n\t3, // [3:5] is the sub-list for method output_type\n\t1, // [1:3] is the sub-list for method input_type\n\t1, // [1:1] is the sub-list for extension type_name\n\t1, // [1:1] is the sub-list for extension extendee\n\t0, // [0:1] is the sub-list for field type_name\n}\n\nfunc init() { file_federation_federation_proto_init() }\nfunc file_federation_federation_proto_init() {\n\tif File_federation_federation_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_federation_federation_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Z); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Post); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*LocalizedMessage); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CustomMessage); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPost2Request); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPost2Response); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_federation_federation_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   8,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_federation_federation_proto_goTypes,\n\t\tDependencyIndexes: file_federation_federation_proto_depIdxs,\n\t\tMessageInfos:      file_federation_federation_proto_msgTypes,\n\t}.Build()\n\tFile_federation_federation_proto = out.File\n\tfile_federation_federation_proto_rawDesc = nil\n\tfile_federation_federation_proto_goTypes = nil\n\tfile_federation_federation_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/17_error_handler/federation/federation_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tFederationService_GetPost_FullMethodName  = \"/org.federation.FederationService/GetPost\"\n\tFederationService_GetPost2_FullMethodName = \"/org.federation.FederationService/GetPost2\"\n)\n\n// FederationServiceClient is the client API for FederationService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype FederationServiceClient interface {\n\tGetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error)\n\tGetPost2(ctx context.Context, in *GetPost2Request, opts ...grpc.CallOption) (*GetPost2Response, error)\n}\n\ntype federationServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewFederationServiceClient(cc grpc.ClientConnInterface) FederationServiceClient {\n\treturn &federationServiceClient{cc}\n}\n\nfunc (c *federationServiceClient) GetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error) {\n\tout := new(GetPostResponse)\n\terr := c.cc.Invoke(ctx, FederationService_GetPost_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *federationServiceClient) GetPost2(ctx context.Context, in *GetPost2Request, opts ...grpc.CallOption) (*GetPost2Response, error) {\n\tout := new(GetPost2Response)\n\terr := c.cc.Invoke(ctx, FederationService_GetPost2_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// FederationServiceServer is the server API for FederationService service.\n// All implementations must embed UnimplementedFederationServiceServer\n// for forward compatibility\ntype FederationServiceServer interface {\n\tGetPost(context.Context, *GetPostRequest) (*GetPostResponse, error)\n\tGetPost2(context.Context, *GetPost2Request) (*GetPost2Response, error)\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\n// UnimplementedFederationServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedFederationServiceServer struct {\n}\n\nfunc (UnimplementedFederationServiceServer) GetPost(context.Context, *GetPostRequest) (*GetPostResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetPost not implemented\")\n}\nfunc (UnimplementedFederationServiceServer) GetPost2(context.Context, *GetPost2Request) (*GetPost2Response, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetPost2 not implemented\")\n}\nfunc (UnimplementedFederationServiceServer) mustEmbedUnimplementedFederationServiceServer() {}\n\n// UnsafeFederationServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to FederationServiceServer will\n// result in compilation errors.\ntype UnsafeFederationServiceServer interface {\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\nfunc RegisterFederationServiceServer(s grpc.ServiceRegistrar, srv FederationServiceServer) {\n\ts.RegisterService(&FederationService_ServiceDesc, srv)\n}\n\nfunc _FederationService_GetPost_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetPostRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(FederationServiceServer).GetPost(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: FederationService_GetPost_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(FederationServiceServer).GetPost(ctx, req.(*GetPostRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _FederationService_GetPost2_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetPost2Request)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(FederationServiceServer).GetPost2(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: FederationService_GetPost2_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(FederationServiceServer).GetPost2(ctx, req.(*GetPost2Request))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// FederationService_ServiceDesc is the grpc.ServiceDesc for FederationService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar FederationService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"org.federation.FederationService\",\n\tHandlerType: (*FederationServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetPost\",\n\t\t\tHandler:    _FederationService_GetPost_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetPost2\",\n\t\t\tHandler:    _FederationService_GetPost2_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"federation/federation.proto\",\n}\n"
  },
  {
    "path": "_examples/17_error_handler/federation/federation_grpc_federation.pb.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: federation/federation.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n\n\tpost \"example/post\"\n\tcode \"google.golang.org/genproto/googleapis/rpc/code\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Org_Federation_CustomMessageVariable represents variable definitions in \"org.federation.CustomMessage\".\ntype FederationService_Org_Federation_CustomMessageVariable struct {\n}\n\n// Org_Federation_CustomMessageArgument is argument for \"org.federation.CustomMessage\" message.\ntype FederationService_Org_Federation_CustomMessageArgument struct {\n\tErrorInfo *grpcfedcel.Error\n\tFederationService_Org_Federation_CustomMessageVariable\n}\n\n// Org_Federation_GetPost2ResponseVariable represents variable definitions in \"org.federation.GetPost2Response\".\ntype FederationService_Org_Federation_GetPost2ResponseVariable struct {\n\tCode  code.Code\n\tCode2 code.Code\n}\n\n// Org_Federation_GetPost2ResponseArgument is argument for \"org.federation.GetPost2Response\" message.\ntype FederationService_Org_Federation_GetPost2ResponseArgument struct {\n\tId string\n\tFederationService_Org_Federation_GetPost2ResponseVariable\n}\n\n// Org_Federation_GetPostResponseVariable represents variable definitions in \"org.federation.GetPostResponse\".\ntype FederationService_Org_Federation_GetPostResponseVariable struct {\n\tPost *Post\n}\n\n// Org_Federation_GetPostResponseArgument is argument for \"org.federation.GetPostResponse\" message.\ntype FederationService_Org_Federation_GetPostResponseArgument struct {\n\tId string\n\tFederationService_Org_Federation_GetPostResponseVariable\n}\n\n// Org_Federation_LocalizedMessageVariable represents variable definitions in \"org.federation.LocalizedMessage\".\ntype FederationService_Org_Federation_LocalizedMessageVariable struct {\n}\n\n// Org_Federation_LocalizedMessageArgument is argument for \"org.federation.LocalizedMessage\" message.\ntype FederationService_Org_Federation_LocalizedMessageArgument struct {\n\tValue string\n\tFederationService_Org_Federation_LocalizedMessageVariable\n}\n\n// Org_Federation_PostVariable represents variable definitions in \"org.federation.Post\".\ntype FederationService_Org_Federation_PostVariable struct {\n\tCode                int64\n\tId                  string\n\tLocalizedMsg        *LocalizedMessage\n\tPost                *post.Post\n\tRes                 *post.GetPostResponse\n\tXDef0ErrDetail0Msg0 *CustomMessage\n}\n\n// Org_Federation_PostArgument is argument for \"org.federation.Post\" message.\ntype FederationService_Org_Federation_PostArgument struct {\n\tId string\n\tFederationService_Org_Federation_PostVariable\n}\n\n// Org_Federation_ZVariable represents variable definitions in \"org.federation.Z\".\ntype FederationService_Org_Federation_ZVariable struct {\n\tCode int64\n}\n\n// Org_Federation_ZArgument is argument for \"org.federation.Z\" message.\ntype FederationService_Org_Federation_ZArgument struct {\n\tErrorInfo *grpcfedcel.Error\n\tFederationService_Org_Federation_ZVariable\n}\n\n// FederationServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationServiceConfig struct {\n\t// Client provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\n\t// If this interface is not provided, an error is returned during initialization.\n\tClient FederationServiceClientFactory // required\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationServiceClientFactory interface {\n\t// Post_PostServiceClient create a gRPC Client to be used to call methods in post.PostService.\n\tPost_PostServiceClient(FederationServiceClientConfig) (post.PostServiceClient, error)\n}\n\n// FederationServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationServiceDependentClientSet struct {\n\tPost_PostServiceClient post.PostServiceClient\n}\n\n// FederationServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationServiceResolver interface {\n}\n\n// FederationServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// FederationServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationServiceUnimplementedResolver struct{}\n\nconst (\n\tFederationService_DependentMethod_Post_PostService_GetPost = \"/post.PostService/GetPost\"\n)\n\n// FederationService represents Federation Service.\ntype FederationService struct {\n\tUnimplementedFederationServiceServer\n\tcfg             FederationServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationServiceDependentClientSet\n}\n\n// NewFederationService creates FederationService instance by FederationServiceConfig.\nfunc NewFederationService(cfg FederationServiceConfig) (*FederationService, error) {\n\tif cfg.Client == nil {\n\t\treturn nil, grpcfed.ErrClientConfig\n\t}\n\tPost_PostServiceClient, err := cfg.Client.Post_PostServiceClient(FederationServiceClientConfig{\n\t\tService: \"post.PostService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"org.federation.FederationService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.org.federation.CustomMessageArgument\": {\n\t\t\t\"error_info\": grpcfed.NewCELFieldType(grpcfed.NewCELObjectType(\"grpc.federation.private.Error\"), \"ErrorInfo\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.GetPost2ResponseArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.GetPostResponseArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.LocalizedMessageArgument\": {\n\t\t\t\"value\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Value\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.PostArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.ZArgument\": {\n\t\t\t\"error_info\": grpcfed.NewCELFieldType(grpcfed.NewCELObjectType(\"grpc.federation.private.Error\"), \"ErrorInfo\"),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"org.federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.GRPCErrorAccessorOptions(celTypeHelper, \"post.GetPostResponse\")...)\n\tsvc := &FederationService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tclient: &FederationServiceDependentClientSet{\n\t\t\tPost_PostServiceClient: Post_PostServiceClient,\n\t\t},\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationService(ctx context.Context, svc *FederationService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n// GetPost implements \"org.federation.FederationService/GetPost\" method.\nfunc (s *FederationService) GetPost(ctx context.Context, req *GetPostRequest) (res *GetPostResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.FederationService/GetPost\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Org_Federation_GetPostResponse(ctx, &FederationService_Org_Federation_GetPostResponseArgument{\n\t\tId: req.GetId(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// GetPost2 implements \"org.federation.FederationService/GetPost2\" method.\nfunc (s *FederationService) GetPost2(ctx context.Context, req *GetPost2Request) (res *GetPost2Response, e error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.FederationService/GetPost2\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Org_Federation_GetPost2Response(ctx, &FederationService_Org_Federation_GetPost2ResponseArgument{\n\t\tId: req.GetId(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Org_Federation_CustomMessage resolve \"org.federation.CustomMessage\" message.\nfunc (s *FederationService) resolve_Org_Federation_CustomMessage(ctx context.Context, req *FederationService_Org_Federation_CustomMessageArgument) (*CustomMessage, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.CustomMessage\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.CustomMessage\", slog.Any(\"message_args\", s.logvalue_Org_Federation_CustomMessageArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.CustomMessageArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &CustomMessage{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'custom error message:' + $.error_info.message\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'custom error message:' + $.error_info.message`,\n\t\tCacheIndex: 1,\n\t\tSetter: func(v string) error {\n\t\t\tret.Msg = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.CustomMessage\", slog.Any(\"org.federation.CustomMessage\", s.logvalue_Org_Federation_CustomMessage(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_GetPost2Response resolve \"org.federation.GetPost2Response\" message.\nfunc (s *FederationService) resolve_Org_Federation_GetPost2Response(ctx context.Context, req *FederationService_Org_Federation_GetPost2ResponseArgument) (*GetPost2Response, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.GetPost2Response\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.GetPost2Response\", slog.Any(\"message_args\", s.logvalue_Org_Federation_GetPost2ResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tCode  code.Code\n\t\t\tCode2 code.Code\n\t\t\tMsg   string\n\t\t\tMsg2  string\n\t\t\tXDef0 *post.GetPostResponse\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.GetPost2ResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"_def0\"\n\t\t  call {\n\t\t    method: \"post.PostService/GetPost\"\n\t\t    request { field: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef__def0 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.GetPostResponse, *localValueType]{\n\t\t\tName: `_def0`,\n\t\t\tType: grpcfed.CELObjectType(\"post.GetPostResponse\"),\n\t\t\tSetter: func(value *localValueType, v *post.GetPostResponse) error {\n\t\t\t\tvalue.vars.XDef0 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &post.GetPostRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 2,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call post.PostService/GetPost\", slog.Any(\"post.GetPostRequest\", s.logvalue_Post_GetPostRequest(args)))\n\t\t\t\tret, err := s.client.Post_PostServiceClient.GetPost(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgrpcErr := grpcfed.ToGRPCError(ctx, err)\n\t\t\t\t\tctx = grpcfed.WithGRPCError(ctx, grpcErr)\n\t\t\t\t\tvar (\n\t\t\t\t\t\tdefaultMsg     string\n\t\t\t\t\t\tdefaultCode    grpcfed.Code\n\t\t\t\t\t\tdefaultDetails []grpcfed.ProtoMessage\n\t\t\t\t\t)\n\t\t\t\t\tif stat, exists := grpcfed.GRPCStatusFromError(err); exists {\n\t\t\t\t\t\tdefaultMsg = stat.Message()\n\t\t\t\t\t\tdefaultCode = stat.Code()\n\t\t\t\t\t\tdetails := stat.Details()\n\t\t\t\t\t\tdefaultDetails = make([]grpcfed.ProtoMessage, 0, len(details))\n\t\t\t\t\t\tfor _, detail := range details {\n\t\t\t\t\t\t\tmsg, ok := detail.(grpcfed.ProtoMessage)\n\t\t\t\t\t\t\tif ok {\n\t\t\t\t\t\t\t\tdefaultDetails = append(defaultDetails, msg)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t_ = defaultMsg\n\t\t\t\t\t\t_ = defaultCode\n\t\t\t\t\t\t_ = defaultDetails\n\t\t\t\t\t}\n\n\t\t\t\t\ttype localStatusType struct {\n\t\t\t\t\t\tstatus   *grpcfed.Status\n\t\t\t\t\t\tlogLevel slog.Level\n\t\t\t\t\t}\n\t\t\t\t\tstat, handleErr := func() (*localStatusType, error) {\n\t\t\t\t\t\tvar stat *grpcfed.Status\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t\tdef {\n\t\t\t\t\t\t\t\t  name: \"code\"\n\t\t\t\t\t\t\t\t  by: \"google.rpc.Code.from(error.code)\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\tdef_code := func(ctx context.Context) error {\n\t\t\t\t\t\t\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[code.Code, *localValueType]{\n\t\t\t\t\t\t\t\t\tName: `code`,\n\t\t\t\t\t\t\t\t\tType: grpcfed.CELIntType,\n\t\t\t\t\t\t\t\t\tSetter: func(value *localValueType, v code.Code) error {\n\t\t\t\t\t\t\t\t\t\tvalue.vars.Code = v\n\t\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tBy:           `google.rpc.Code.from(error.code)`,\n\t\t\t\t\t\t\t\t\tByCacheIndex: 3,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t\tdef {\n\t\t\t\t\t\t\t\t  name: \"msg\"\n\t\t\t\t\t\t\t\t  by: \"error.message\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\tdef_msg := func(ctx context.Context) error {\n\t\t\t\t\t\t\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[string, *localValueType]{\n\t\t\t\t\t\t\t\t\tName: `msg`,\n\t\t\t\t\t\t\t\t\tType: grpcfed.CELStringType,\n\t\t\t\t\t\t\t\t\tSetter: func(value *localValueType, v string) error {\n\t\t\t\t\t\t\t\t\t\tvalue.vars.Msg = v\n\t\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tBy:           `error.message`,\n\t\t\t\t\t\t\t\t\tByCacheIndex: 4,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// A tree view of message dependencies is shown below.\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t   code ─┐\n\t\t\t\t\t\t\t    msg ─┤\n\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\t\t\t\t\t\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\t\t\t\t\t\tif err := def_code(ctx1); err != nil {\n\t\t\t\t\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn nil, nil\n\t\t\t\t\t\t\t})\n\n\t\t\t\t\t\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\t\t\t\t\t\tif err := def_msg(ctx1); err != nil {\n\t\t\t\t\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn nil, nil\n\t\t\t\t\t\t\t})\n\n\t\t\t\t\t\t\tif err := eg.Wait(); err != nil {\n\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\t\tExpr:       `code == google.rpc.Code.FAILED_PRECONDITION`,\n\t\t\t\t\t\t\t\tCacheIndex: 5,\n\t\t\t\t\t\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t\t\t\t\t\tvar errorMessage string\n\t\t\t\t\t\t\t\t\tif defaultMsg != \"\" {\n\t\t\t\t\t\t\t\t\t\terrorMessage = defaultMsg\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\terrorMessage = \"error\"\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tvar code grpcfed.Code\n\t\t\t\t\t\t\t\t\tcode = defaultCode\n\t\t\t\t\t\t\t\t\tstatus := grpcfed.NewGRPCStatus(code, errorMessage)\n\t\t\t\t\t\t\t\t\tstatusWithDetails, err := status.WithDetails(defaultDetails...)\n\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\tgrpcfed.Logger(ctx).ErrorContext(ctx, \"failed setting error details\", slog.String(\"error\", err.Error()))\n\t\t\t\t\t\t\t\t\t\tstat = status\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tstat = statusWithDetails\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif stat != nil {\n\t\t\t\t\t\t\t\treturn &localStatusType{status: stat, logLevel: slog.LevelWarn}, nil\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t\tdef {\n\t\t\t\t\t\t\t\t  name: \"code2\"\n\t\t\t\t\t\t\t\t  by: \"google.rpc.Code.from(error.code)\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\tdef_code2 := func(ctx context.Context) error {\n\t\t\t\t\t\t\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[code.Code, *localValueType]{\n\t\t\t\t\t\t\t\t\tName: `code2`,\n\t\t\t\t\t\t\t\t\tType: grpcfed.CELIntType,\n\t\t\t\t\t\t\t\t\tSetter: func(value *localValueType, v code.Code) error {\n\t\t\t\t\t\t\t\t\t\tvalue.vars.Code2 = v\n\t\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tBy:           `google.rpc.Code.from(error.code)`,\n\t\t\t\t\t\t\t\t\tByCacheIndex: 6,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t\tdef {\n\t\t\t\t\t\t\t\t  name: \"msg2\"\n\t\t\t\t\t\t\t\t  by: \"error.message\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\tdef_msg2 := func(ctx context.Context) error {\n\t\t\t\t\t\t\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[string, *localValueType]{\n\t\t\t\t\t\t\t\t\tName: `msg2`,\n\t\t\t\t\t\t\t\t\tType: grpcfed.CELStringType,\n\t\t\t\t\t\t\t\t\tSetter: func(value *localValueType, v string) error {\n\t\t\t\t\t\t\t\t\t\tvalue.vars.Msg2 = v\n\t\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tBy:           `error.message`,\n\t\t\t\t\t\t\t\t\tByCacheIndex: 7,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// A tree view of message dependencies is shown below.\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t   code2 ─┐\n\t\t\t\t\t\t\t    msg2 ─┤\n\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\t\t\t\t\t\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\t\t\t\t\t\tif err := def_code2(ctx1); err != nil {\n\t\t\t\t\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn nil, nil\n\t\t\t\t\t\t\t})\n\n\t\t\t\t\t\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\t\t\t\t\t\tif err := def_msg2(ctx1); err != nil {\n\t\t\t\t\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn nil, nil\n\t\t\t\t\t\t\t})\n\n\t\t\t\t\t\t\tif err := eg.Wait(); err != nil {\n\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\t\tExpr:       `code2 == google.rpc.Code.INTERNAL`,\n\t\t\t\t\t\t\t\tCacheIndex: 8,\n\t\t\t\t\t\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t\t\t\t\t\tvar errorMessage string\n\t\t\t\t\t\t\t\t\tif defaultMsg != \"\" {\n\t\t\t\t\t\t\t\t\t\terrorMessage = defaultMsg\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\terrorMessage = \"error\"\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tvar code grpcfed.Code\n\t\t\t\t\t\t\t\t\tcode = defaultCode\n\t\t\t\t\t\t\t\t\tstatus := grpcfed.NewGRPCStatus(code, errorMessage)\n\t\t\t\t\t\t\t\t\tstatusWithDetails, err := status.WithDetails(defaultDetails...)\n\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\tgrpcfed.Logger(ctx).ErrorContext(ctx, \"failed setting error details\", slog.String(\"error\", err.Error()))\n\t\t\t\t\t\t\t\t\t\tstat = status\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tstat = statusWithDetails\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif stat != nil {\n\t\t\t\t\t\t\t\treturn &localStatusType{status: stat, logLevel: slog.LevelError}, nil\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn nil, nil\n\t\t\t\t\t}()\n\t\t\t\t\tif handleErr != nil {\n\t\t\t\t\t\tgrpcfed.Logger(ctx).ErrorContext(ctx, \"failed to handle error\", slog.String(\"error\", handleErr.Error()))\n\t\t\t\t\t\t// If it fails during error handling, return the original error.\n\t\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Post_PostService_GetPost, err); err != nil {\n\t\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if stat != nil {\n\t\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Post_PostService_GetPost, stat.status.Err()); err != nil {\n\t\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, stat.logLevel, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Post_PostService_GetPost, err); err != nil {\n\t\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tvalue.SetGRPCError(ret, grpcErr)\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def__def0(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_GetPost2ResponseVariable.Code = value.vars.Code\n\treq.FederationService_Org_Federation_GetPost2ResponseVariable.Code2 = value.vars.Code2\n\n\t// create a message value to be returned.\n\tret := &GetPost2Response{}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.GetPost2Response\", slog.Any(\"org.federation.GetPost2Response\", s.logvalue_Org_Federation_GetPost2Response(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_GetPostResponse resolve \"org.federation.GetPostResponse\" message.\nfunc (s *FederationService) resolve_Org_Federation_GetPostResponse(ctx context.Context, req *FederationService_Org_Federation_GetPostResponseArgument) (*GetPostResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.GetPostResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.GetPostResponse\", slog.Any(\"message_args\", s.logvalue_Org_Federation_GetPostResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tPost *Post\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.GetPostResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"post\"\n\t\t  message {\n\t\t    name: \"Post\"\n\t\t    args { name: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_post := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Post, *localValueType]{\n\t\t\tName: `post`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.Post\"),\n\t\t\tSetter: func(value *localValueType, v *Post) error {\n\t\t\t\tvalue.vars.Post = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_PostArgument{}\n\t\t\t\t// { name: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 9,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_Post(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_post(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_GetPostResponseVariable.Post = value.vars.Post\n\n\t// create a message value to be returned.\n\tret := &GetPostResponse{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"post\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*Post]{\n\t\tValue:      value,\n\t\tExpr:       `post`,\n\t\tCacheIndex: 10,\n\t\tSetter: func(v *Post) error {\n\t\t\tret.Post = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.GetPostResponse\", slog.Any(\"org.federation.GetPostResponse\", s.logvalue_Org_Federation_GetPostResponse(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_LocalizedMessage resolve \"org.federation.LocalizedMessage\" message.\nfunc (s *FederationService) resolve_Org_Federation_LocalizedMessage(ctx context.Context, req *FederationService_Org_Federation_LocalizedMessageArgument) (*LocalizedMessage, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.LocalizedMessage\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.LocalizedMessage\", slog.Any(\"message_args\", s.logvalue_Org_Federation_LocalizedMessageArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.LocalizedMessageArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &LocalizedMessage{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'localized value:' + $.value\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'localized value:' + $.value`,\n\t\tCacheIndex: 11,\n\t\tSetter: func(v string) error {\n\t\t\tret.Value = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.LocalizedMessage\", slog.Any(\"org.federation.LocalizedMessage\", s.logvalue_Org_Federation_LocalizedMessage(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_Post resolve \"org.federation.Post\" message.\nfunc (s *FederationService) resolve_Org_Federation_Post(ctx context.Context, req *FederationService_Org_Federation_PostArgument) (*Post, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.Post\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.Post\", slog.Any(\"message_args\", s.logvalue_Org_Federation_PostArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tCode                int64\n\t\t\tId                  string\n\t\t\tLocalizedMsg        *LocalizedMessage\n\t\t\tPost                *post.Post\n\t\t\tRes                 *post.GetPostResponse\n\t\t\tXDef0Def1           *Z\n\t\t\tXDef0ErrDetail0Def1 *Z\n\t\t\tXDef0ErrDetail0Msg0 *CustomMessage\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.PostArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"post.PostService/GetPost\"\n\t\t    request { field: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.GetPostResponse, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"post.GetPostResponse\"),\n\t\t\tSetter: func(value *localValueType, v *post.GetPostResponse) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &post.GetPostRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 12,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call post.PostService/GetPost\", slog.Any(\"post.GetPostRequest\", s.logvalue_Post_GetPostRequest(args)))\n\t\t\t\tret, err := s.client.Post_PostServiceClient.GetPost(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgrpcErr := grpcfed.ToGRPCError(ctx, err)\n\t\t\t\t\tctx = grpcfed.WithGRPCError(ctx, grpcErr)\n\t\t\t\t\tvar (\n\t\t\t\t\t\tdefaultMsg     string\n\t\t\t\t\t\tdefaultCode    grpcfed.Code\n\t\t\t\t\t\tdefaultDetails []grpcfed.ProtoMessage\n\t\t\t\t\t)\n\t\t\t\t\tif stat, exists := grpcfed.GRPCStatusFromError(err); exists {\n\t\t\t\t\t\tdefaultMsg = stat.Message()\n\t\t\t\t\t\tdefaultCode = stat.Code()\n\t\t\t\t\t\tdetails := stat.Details()\n\t\t\t\t\t\tdefaultDetails = make([]grpcfed.ProtoMessage, 0, len(details))\n\t\t\t\t\t\tfor _, detail := range details {\n\t\t\t\t\t\t\tmsg, ok := detail.(grpcfed.ProtoMessage)\n\t\t\t\t\t\t\tif ok {\n\t\t\t\t\t\t\t\tdefaultDetails = append(defaultDetails, msg)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t_ = defaultMsg\n\t\t\t\t\t\t_ = defaultCode\n\t\t\t\t\t\t_ = defaultDetails\n\t\t\t\t\t}\n\n\t\t\t\t\ttype localStatusType struct {\n\t\t\t\t\t\tstatus   *grpcfed.Status\n\t\t\t\t\t\tlogLevel slog.Level\n\t\t\t\t\t}\n\t\t\t\t\tstat, handleErr := func() (*localStatusType, error) {\n\t\t\t\t\t\tvar stat *grpcfed.Status\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t\tdef {\n\t\t\t\t\t\t\t\t  name: \"id\"\n\t\t\t\t\t\t\t\t  by: \"$.id\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\tdef_id := func(ctx context.Context) error {\n\t\t\t\t\t\t\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[string, *localValueType]{\n\t\t\t\t\t\t\t\t\tName: `id`,\n\t\t\t\t\t\t\t\t\tType: grpcfed.CELStringType,\n\t\t\t\t\t\t\t\t\tSetter: func(value *localValueType, v string) error {\n\t\t\t\t\t\t\t\t\t\tvalue.vars.Id = v\n\t\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tBy:           `$.id`,\n\t\t\t\t\t\t\t\t\tByCacheIndex: 13,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t\tdef {\n\t\t\t\t\t\t\t\t  name: \"_def0_def1\"\n\t\t\t\t\t\t\t\t  message {\n\t\t\t\t\t\t\t\t    name: \"Z\"\n\t\t\t\t\t\t\t\t    args { name: \"error_info\", by: \"error\" }\n\t\t\t\t\t\t\t\t  }\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\tdef__def0_def1 := func(ctx context.Context) error {\n\t\t\t\t\t\t\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Z, *localValueType]{\n\t\t\t\t\t\t\t\t\tName: `_def0_def1`,\n\t\t\t\t\t\t\t\t\tType: grpcfed.CELObjectType(\"org.federation.Z\"),\n\t\t\t\t\t\t\t\t\tSetter: func(value *localValueType, v *Z) error {\n\t\t\t\t\t\t\t\t\t\tvalue.vars.XDef0Def1 = v\n\t\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\t\t\t\t\t\t\targs := &FederationService_Org_Federation_ZArgument{}\n\t\t\t\t\t\t\t\t\t\t// { name: \"error_info\", by: \"error\" }\n\t\t\t\t\t\t\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*grpcfedcel.Error]{\n\t\t\t\t\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\t\t\t\t\tExpr:       `error`,\n\t\t\t\t\t\t\t\t\t\t\tCacheIndex: 14,\n\t\t\t\t\t\t\t\t\t\t\tSetter: func(v *grpcfedcel.Error) error {\n\t\t\t\t\t\t\t\t\t\t\t\targs.ErrorInfo = v\n\t\t\t\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tret, err := s.resolve_Org_Federation_Z(ctx, args)\n\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\treturn ret, nil\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// A tree view of message dependencies is shown below.\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t   _def0_def1 ─┐\n\t\t\t\t\t\t\t           id ─┤\n\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\t\t\t\t\t\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\t\t\t\t\t\tif err := def__def0_def1(ctx1); err != nil {\n\t\t\t\t\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn nil, nil\n\t\t\t\t\t\t\t})\n\n\t\t\t\t\t\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\t\t\t\t\t\tif err := def_id(ctx1); err != nil {\n\t\t\t\t\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn nil, nil\n\t\t\t\t\t\t\t})\n\n\t\t\t\t\t\t\tif err := eg.Wait(); err != nil {\n\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\t\tExpr:       `error.precondition_failures[?0].violations[?0].subject == optional.of('bar') && error.localized_messages[?0].message == optional.of('hello') && error.custom_messages[?0].id == optional.of('xxx')`,\n\t\t\t\t\t\t\t\tCacheIndex: 15,\n\t\t\t\t\t\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t\t\t\t\t\terrmsg, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\t\t\t\tExpr:       `'this is custom error message'`,\n\t\t\t\t\t\t\t\t\t\tOutType:    reflect.TypeOf(\"\"),\n\t\t\t\t\t\t\t\t\t\tCacheIndex: 16,\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\terrorMessage := errmsg.(string)\n\t\t\t\t\t\t\t\t\tvar details []grpcfed.ProtoMessage\n\t\t\t\t\t\t\t\t\tif _, err := func() (any, error) {\n\t\t\t\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t\t\t\t\tdef {\n\t\t\t\t\t\t\t\t\t\t\t  name: \"localized_msg\"\n\t\t\t\t\t\t\t\t\t\t\t  message {\n\t\t\t\t\t\t\t\t\t\t\t    name: \"LocalizedMessage\"\n\t\t\t\t\t\t\t\t\t\t\t    args { name: \"value\", by: \"id\" }\n\t\t\t\t\t\t\t\t\t\t\t  }\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\t\t\t\tdef_localized_msg := func(ctx context.Context) error {\n\t\t\t\t\t\t\t\t\t\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*LocalizedMessage, *localValueType]{\n\t\t\t\t\t\t\t\t\t\t\t\tName: `localized_msg`,\n\t\t\t\t\t\t\t\t\t\t\t\tType: grpcfed.CELObjectType(\"org.federation.LocalizedMessage\"),\n\t\t\t\t\t\t\t\t\t\t\t\tSetter: func(value *localValueType, v *LocalizedMessage) error {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvalue.vars.LocalizedMsg = v\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\t\t\t\t\t\t\t\t\t\targs := &FederationService_Org_Federation_LocalizedMessageArgument{}\n\t\t\t\t\t\t\t\t\t\t\t\t\t// { name: \"value\", by: \"id\" }\n\t\t\t\t\t\t\t\t\t\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tExpr:       `id`,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tCacheIndex: 17,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\targs.Value = v\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tret, err := s.resolve_Org_Federation_LocalizedMessage(ctx, args)\n\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn ret, nil\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t\t\t\t\tdef {\n\t\t\t\t\t\t\t\t\t\t\t  name: \"_def0_err_detail0_def1\"\n\t\t\t\t\t\t\t\t\t\t\t  message {\n\t\t\t\t\t\t\t\t\t\t\t    name: \"Z\"\n\t\t\t\t\t\t\t\t\t\t\t    args { name: \"error_info\", by: \"error\" }\n\t\t\t\t\t\t\t\t\t\t\t  }\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\t\t\t\tdef__def0_err_detail0_def1 := func(ctx context.Context) error {\n\t\t\t\t\t\t\t\t\t\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Z, *localValueType]{\n\t\t\t\t\t\t\t\t\t\t\t\tName: `_def0_err_detail0_def1`,\n\t\t\t\t\t\t\t\t\t\t\t\tType: grpcfed.CELObjectType(\"org.federation.Z\"),\n\t\t\t\t\t\t\t\t\t\t\t\tSetter: func(value *localValueType, v *Z) error {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvalue.vars.XDef0ErrDetail0Def1 = v\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\t\t\t\t\t\t\t\t\t\targs := &FederationService_Org_Federation_ZArgument{}\n\t\t\t\t\t\t\t\t\t\t\t\t\t// { name: \"error_info\", by: \"error\" }\n\t\t\t\t\t\t\t\t\t\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*grpcfedcel.Error]{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tExpr:       `error`,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tCacheIndex: 18,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetter: func(v *grpcfedcel.Error) error {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\targs.ErrorInfo = v\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tret, err := s.resolve_Org_Federation_Z(ctx, args)\n\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn ret, nil\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// A tree view of message dependencies is shown below.\n\t\t\t\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t\t\t\t   _def0_err_detail0_def1 ─┐\n\t\t\t\t\t\t\t\t\t\t            localized_msg ─┤\n\t\t\t\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\t\t\t\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\t\t\t\t\t\t\t\t\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\t\t\t\t\t\t\t\t\tif err := def__def0_err_detail0_def1(ctx1); err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\t\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\treturn nil, nil\n\t\t\t\t\t\t\t\t\t\t})\n\n\t\t\t\t\t\t\t\t\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\t\t\t\t\t\t\t\t\tif err := def_localized_msg(ctx1); err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\t\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\treturn nil, nil\n\t\t\t\t\t\t\t\t\t\t})\n\n\t\t\t\t\t\t\t\t\t\tif err := eg.Wait(); err != nil {\n\t\t\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\treturn nil, nil\n\t\t\t\t\t\t\t\t\t}(); err != nil {\n\t\t\t\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\t\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\t\t\t\tExpr:       `true`,\n\t\t\t\t\t\t\t\t\t\tCacheIndex: 19,\n\t\t\t\t\t\t\t\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t\t\t\t\t\t\t\tif _, err := func() (any, error) {\n\t\t\t\t\t\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t\t\t\t\t\t\tdef {\n\t\t\t\t\t\t\t\t\t\t\t\t\t  name: \"_def0_err_detail0_msg0\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t  message {\n\t\t\t\t\t\t\t\t\t\t\t\t\t    name: \"CustomMessage\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t    args { name: \"error_info\", by: \"error\" }\n\t\t\t\t\t\t\t\t\t\t\t\t\t  }\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\t\t\t\t\t\tdef__def0_err_detail0_msg0 := func(ctx context.Context) error {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*CustomMessage, *localValueType]{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tName: `_def0_err_detail0_msg0`,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tType: grpcfed.CELObjectType(\"org.federation.CustomMessage\"),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetter: func(value *localValueType, v *CustomMessage) error {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue.vars.XDef0ErrDetail0Msg0 = v\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\targs := &FederationService_Org_Federation_CustomMessageArgument{}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// { name: \"error_info\", by: \"error\" }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*grpcfedcel.Error]{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tExpr:       `error`,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tCacheIndex: 20,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetter: func(v *grpcfedcel.Error) error {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\targs.ErrorInfo = v\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tret, err := s.resolve_Org_Federation_CustomMessage(ctx, args)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn ret, nil\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tif err := def__def0_err_detail0_msg0(ctx); err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\treturn nil, nil\n\t\t\t\t\t\t\t\t\t\t\t}(); err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tif detail := grpcfed.CustomMessage(ctx, &grpcfed.CustomMessageParam{\n\t\t\t\t\t\t\t\t\t\t\t\tValue:            value,\n\t\t\t\t\t\t\t\t\t\t\t\tMessageValueName: \"_def0_err_detail0_msg0\",\n\t\t\t\t\t\t\t\t\t\t\t\tCacheIndex:       21,\n\t\t\t\t\t\t\t\t\t\t\t\tMessageIndex:     0,\n\t\t\t\t\t\t\t\t\t\t\t}); detail != nil {\n\t\t\t\t\t\t\t\t\t\t\t\tdetails = append(details, detail)\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tdetail, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\t\t\t\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\t\t\t\t\t\t\tExpr:       `post.Post{id: 'foo'}`,\n\t\t\t\t\t\t\t\t\t\t\t\t\tOutType:    reflect.TypeOf((*post.Post)(nil)),\n\t\t\t\t\t\t\t\t\t\t\t\t\tCacheIndex: 22,\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\tgrpcfed.Logger(ctx).ErrorContext(ctx, \"failed setting error details\", slog.String(\"error\", err.Error()))\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tif detail != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\tdetails = append(details, detail.(grpcfed.ProtoMessage))\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tif detail := grpcfed.PreconditionFailure(ctx, value, []*grpcfed.PreconditionFailureViolation{\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tType:              `'some-type'`,\n\t\t\t\t\t\t\t\t\t\t\t\t\tSubject:           `'some-subject'`,\n\t\t\t\t\t\t\t\t\t\t\t\t\tDesc:              `'some-description'`,\n\t\t\t\t\t\t\t\t\t\t\t\t\tTypeCacheIndex:    23,\n\t\t\t\t\t\t\t\t\t\t\t\t\tSubjectCacheIndex: 24,\n\t\t\t\t\t\t\t\t\t\t\t\t\tDescCacheIndex:    25,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t}); detail != nil {\n\t\t\t\t\t\t\t\t\t\t\t\tdetails = append(details, detail)\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tif detail := grpcfed.LocalizedMessage(ctx, &grpcfed.LocalizedMessageParam{\n\t\t\t\t\t\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\t\t\t\t\t\tLocale:     \"en-US\",\n\t\t\t\t\t\t\t\t\t\t\t\tMessage:    `localized_msg.value`,\n\t\t\t\t\t\t\t\t\t\t\t\tCacheIndex: 26,\n\t\t\t\t\t\t\t\t\t\t\t}); detail != nil {\n\t\t\t\t\t\t\t\t\t\t\t\tdetails = append(details, detail)\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tvar code grpcfed.Code\n\t\t\t\t\t\t\t\t\tcode = grpcfed.FailedPreconditionCode\n\t\t\t\t\t\t\t\t\tstatus := grpcfed.NewGRPCStatus(code, errorMessage)\n\t\t\t\t\t\t\t\t\tstatusWithDetails, err := status.WithDetails(details...)\n\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\tgrpcfed.Logger(ctx).ErrorContext(ctx, \"failed setting error details\", slog.String(\"error\", err.Error()))\n\t\t\t\t\t\t\t\t\t\tstat = status\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tstat = statusWithDetails\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif stat != nil {\n\t\t\t\t\t\t\t\treturn &localStatusType{status: stat, logLevel: slog.LevelError}, nil\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\t\tExpr:       `error.code == google.rpc.Code.INVALID_ARGUMENT`,\n\t\t\t\t\t\t\t\tCacheIndex: 27,\n\t\t\t\t\t\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t\t\t\t\t\terrmsg, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\t\t\t\tExpr:       `'this is custom log level'`,\n\t\t\t\t\t\t\t\t\t\tOutType:    reflect.TypeOf(\"\"),\n\t\t\t\t\t\t\t\t\t\tCacheIndex: 28,\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\terrorMessage := errmsg.(string)\n\n\t\t\t\t\t\t\t\t\tvar code grpcfed.Code\n\t\t\t\t\t\t\t\t\tcode = grpcfed.InvalidArgumentCode\n\t\t\t\t\t\t\t\t\tstatus := grpcfed.NewGRPCStatus(code, errorMessage)\n\t\t\t\t\t\t\t\t\tstatusWithDetails, err := status.WithDetails(defaultDetails...)\n\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\tgrpcfed.Logger(ctx).ErrorContext(ctx, \"failed setting error details\", slog.String(\"error\", err.Error()))\n\t\t\t\t\t\t\t\t\t\tstat = status\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tstat = statusWithDetails\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif stat != nil {\n\t\t\t\t\t\t\t\treturn &localStatusType{status: stat, logLevel: slog.LevelWarn}, nil\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\t\tExpr:       `error.code == google.rpc.Code.UNIMPLEMENTED`,\n\t\t\t\t\t\t\t\tCacheIndex: 29,\n\t\t\t\t\t\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t\t\t\t\t\tstat = grpcfed.NewGRPCStatus(grpcfed.OKCode, \"ignore error\")\n\t\t\t\t\t\t\t\t\tif err := grpcfed.IgnoreAndResponse(ctx, value, grpcfed.Def[*post.GetPostResponse, *localValueType]{\n\t\t\t\t\t\t\t\t\t\tName: \"res\",\n\t\t\t\t\t\t\t\t\t\tType: grpcfed.CELObjectType(\"post.GetPostResponse\"),\n\t\t\t\t\t\t\t\t\t\tSetter: func(value *localValueType, v *post.GetPostResponse) error {\n\t\t\t\t\t\t\t\t\t\t\tret = v // assign customized response to the result value.\n\t\t\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tBy:           `post.GetPostResponse{post: post.Post{id: 'anonymous'}}`,\n\t\t\t\t\t\t\t\t\t\tByCacheIndex: 30,\n\t\t\t\t\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\t\t\t\t\tgrpcfed.Logger(ctx).ErrorContext(ctx, \"failed to set response when ignored\", slog.String(\"error\", err.Error()))\n\t\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif stat != nil {\n\t\t\t\t\t\t\t\treturn &localStatusType{status: stat, logLevel: slog.LevelError}, nil\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\t\tExpr:       `true`,\n\t\t\t\t\t\t\t\tCacheIndex: 31,\n\t\t\t\t\t\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t\t\t\t\t\tstat = grpcfed.NewGRPCStatus(grpcfed.OKCode, \"ignore error\")\n\t\t\t\t\t\t\t\t\tret = &post.GetPostResponse{}\n\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif stat != nil {\n\t\t\t\t\t\t\t\treturn &localStatusType{status: stat, logLevel: slog.LevelError}, nil\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\t\tExpr:       `true`,\n\t\t\t\t\t\t\t\tCacheIndex: 32,\n\t\t\t\t\t\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t\t\t\t\t\tvar errorMessage string\n\t\t\t\t\t\t\t\t\tif defaultMsg != \"\" {\n\t\t\t\t\t\t\t\t\t\terrorMessage = defaultMsg\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\terrorMessage = \"error\"\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tvar code grpcfed.Code\n\t\t\t\t\t\t\t\t\tcode = grpcfed.CancelledCode\n\t\t\t\t\t\t\t\t\tstatus := grpcfed.NewGRPCStatus(code, errorMessage)\n\t\t\t\t\t\t\t\t\tstatusWithDetails, err := status.WithDetails(defaultDetails...)\n\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\tgrpcfed.Logger(ctx).ErrorContext(ctx, \"failed setting error details\", slog.String(\"error\", err.Error()))\n\t\t\t\t\t\t\t\t\t\tstat = status\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tstat = statusWithDetails\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif stat != nil {\n\t\t\t\t\t\t\t\treturn &localStatusType{status: stat, logLevel: slog.LevelError}, nil\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn nil, nil\n\t\t\t\t\t}()\n\t\t\t\t\tif handleErr != nil {\n\t\t\t\t\t\tgrpcfed.Logger(ctx).ErrorContext(ctx, \"failed to handle error\", slog.String(\"error\", handleErr.Error()))\n\t\t\t\t\t\t// If it fails during error handling, return the original error.\n\t\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Post_PostService_GetPost, err); err != nil {\n\t\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if stat != nil {\n\t\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Post_PostService_GetPost, stat.status.Err()); err != nil {\n\t\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, stat.logLevel, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Post_PostService_GetPost, err); err != nil {\n\t\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tvalue.SetGRPCError(ret, grpcErr)\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"post\"\n\t\t  autobind: true\n\t\t  by: \"res.post\"\n\t\t}\n\t*/\n\tdef_post := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.Post, *localValueType]{\n\t\t\tName: `post`,\n\t\t\tType: grpcfed.CELObjectType(\"post.Post\"),\n\t\t\tSetter: func(value *localValueType, v *post.Post) error {\n\t\t\t\tvalue.vars.Post = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `res.post`,\n\t\t\tByCacheIndex: 33,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"code\"\n\t\t  if: \"res.hasIgnoredError()\"\n\t\t  by: \"res.ignoredError().code\"\n\t\t}\n\t*/\n\tdef_code := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[int64, *localValueType]{\n\t\t\tIf:           `res.hasIgnoredError()`,\n\t\t\tIfCacheIndex: 34,\n\t\t\tName:         `code`,\n\t\t\tType:         grpcfed.CELIntType,\n\t\t\tSetter: func(value *localValueType, v int64) error {\n\t\t\t\tvalue.vars.Code = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `res.ignoredError().code`,\n\t\t\tByCacheIndex: 35,\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t   res ─┐\n\t        code ─┐\n\t   res ─┐     │\n\t        post ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_code(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_post(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_PostVariable.Code = value.vars.Code\n\treq.FederationService_Org_Federation_PostVariable.Id = value.vars.Id\n\treq.FederationService_Org_Federation_PostVariable.LocalizedMsg = value.vars.LocalizedMsg\n\treq.FederationService_Org_Federation_PostVariable.Post = value.vars.Post\n\treq.FederationService_Org_Federation_PostVariable.Res = value.vars.Res\n\treq.FederationService_Org_Federation_PostVariable.XDef0ErrDetail0Msg0 = value.vars.XDef0ErrDetail0Msg0\n\n\t// create a message value to be returned.\n\tret := &Post{}\n\n\t// field binding section.\n\tret.Id = value.vars.Post.GetId()       // { name: \"post\", autobind: true }\n\tret.Title = value.vars.Post.GetTitle() // { name: \"post\", autobind: true }\n\t// (grpc.federation.field).by = \"code\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[int32]{\n\t\tValue:      value,\n\t\tExpr:       `code`,\n\t\tCacheIndex: 36,\n\t\tSetter: func(v int32) error {\n\t\t\tret.Code = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.Post\", slog.Any(\"org.federation.Post\", s.logvalue_Org_Federation_Post(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_Z resolve \"org.federation.Z\" message.\nfunc (s *FederationService) resolve_Org_Federation_Z(ctx context.Context, req *FederationService_Org_Federation_ZArgument) (*Z, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.Z\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.Z\", slog.Any(\"message_args\", s.logvalue_Org_Federation_ZArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tCode int64\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.ZArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"code\"\n\t\t  by: \"$.error_info.code\"\n\t\t}\n\t*/\n\tdef_code := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[int64, *localValueType]{\n\t\t\tName: `code`,\n\t\t\tType: grpcfed.CELIntType,\n\t\t\tSetter: func(value *localValueType, v int64) error {\n\t\t\t\tvalue.vars.Code = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `$.error_info.code`,\n\t\t\tByCacheIndex: 37,\n\t\t})\n\t}\n\n\tif err := def_code(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_ZVariable.Code = value.vars.Code\n\n\t// create a message value to be returned.\n\tret := &Z{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"code\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[int32]{\n\t\tValue:      value,\n\t\tExpr:       `code`,\n\t\tCacheIndex: 38,\n\t\tSetter: func(v int32) error {\n\t\t\tret.Code = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.Z\", slog.Any(\"org.federation.Z\", s.logvalue_Org_Federation_Z(ret)))\n\treturn ret, nil\n}\n\n// cast_int64__to__int32 cast from \"int64\" to \"int32\".\nfunc (s *FederationService) cast_int64__to__int32(from int64) (int32, error) {\n\tret, err := grpcfed.Int64ToInt32(from)\n\tif err != nil {\n\t\treturn ret, err\n\t}\n\treturn ret, nil\n}\n\nfunc (s *FederationService) logvalue_Grpc_Federation_Private_Error(v *grpcfedcel.Error) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_CustomMessage(v *CustomMessage) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"msg\", v.GetMsg()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_CustomMessageArgument(v *FederationService_Org_Federation_CustomMessageArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"error_info\", s.logvalue_Grpc_Federation_Private_Error(v.ErrorInfo)),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPost2Response(v *GetPost2Response) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPost2ResponseArgument(v *FederationService_Org_Federation_GetPost2ResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostResponse(v *GetPostResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"post\", s.logvalue_Org_Federation_Post(v.GetPost())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostResponseArgument(v *FederationService_Org_Federation_GetPostResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_LocalizedMessage(v *LocalizedMessage) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"value\", v.GetValue()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_LocalizedMessageArgument(v *FederationService_Org_Federation_LocalizedMessageArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"value\", v.Value),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_Post(v *Post) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.String(\"title\", v.GetTitle()),\n\t\tslog.Int64(\"code\", int64(v.GetCode())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_PostArgument(v *FederationService_Org_Federation_PostArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_Z(v *Z) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Int64(\"code\", int64(v.GetCode())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_ZArgument(v *FederationService_Org_Federation_ZArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"error_info\", s.logvalue_Grpc_Federation_Private_Error(v.ErrorInfo)),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Post_GetPostRequest(v *post.GetPostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t)\n}\n"
  },
  {
    "path": "_examples/17_error_handler/go.mod",
    "content": "module example\n\ngo 1.24.0\n\nreplace github.com/mercari/grpc-federation => ../../\n\nrequire (\n\tgithub.com/google/go-cmp v0.7.0\n\tgithub.com/mercari/grpc-federation v0.0.0-00010101000000-000000000000\n\tgo.opentelemetry.io/otel v1.24.0\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0\n\tgo.opentelemetry.io/otel/sdk v1.24.0\n\tgo.opentelemetry.io/otel/trace v1.24.0\n\tgo.uber.org/goleak v1.3.0\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7\n\tgoogle.golang.org/grpc v1.65.0\n\tgoogle.golang.org/protobuf v1.34.2\n)\n\nrequire (\n\tcel.dev/expr v0.19.1 // indirect\n\tgithub.com/antlr4-go/antlr/v4 v4.13.0 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.2.1 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/goccy/wasi-go v0.3.2 // indirect\n\tgithub.com/google/cel-go v0.23.1 // indirect\n\tgithub.com/google/uuid v1.6.0 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect\n\tgithub.com/kelseyhightower/envconfig v1.4.0 // indirect\n\tgithub.com/stealthrocket/wazergo v0.19.1 // indirect\n\tgithub.com/stoewer/go-strcase v1.3.0 // indirect\n\tgithub.com/tetratelabs/wazero v1.10.1 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.24.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.0.0 // indirect\n\tgolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect\n\tgolang.org/x/net v0.38.0 // indirect\n\tgolang.org/x/sync v0.14.0 // indirect\n\tgolang.org/x/sys v0.37.0 // indirect\n\tgolang.org/x/text v0.23.0 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 // indirect\n)\n"
  },
  {
    "path": "_examples/17_error_handler/go.sum",
    "content": "cel.dev/expr v0.19.1 h1:NciYrtDRIR0lNCnH1LFJegdjspNx9fI59O7TWcua/W4=\ncel.dev/expr v0.19.1/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw=\ngithub.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=\ngithub.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/goccy/wasi-go v0.3.2 h1:wAvGXmqCkfcp0B0AwIp5Ya53hzDwkKm9W8iuT3nCCz0=\ngithub.com/goccy/wasi-go v0.3.2/go.mod h1:nIKD204n9xa4Z20UV+XA483kIr9TAl2vXr+X5qVAO5M=\ngithub.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4=\ngithub.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=\ngithub.com/google/cel-go v0.23.1 h1:91ThhEZlBcE5rB2adBVXqvDoqdL8BG2oyhd0bK1I/r4=\ngithub.com/google/cel-go v0.23.1/go.mod h1:52Pb6QsDbC5kvgxvZhiL9QX1oZEkcUF/ZqaPx1J5Wwo=\ngithub.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\ngithub.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg=\ngithub.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=\ngithub.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/stealthrocket/wazergo v0.19.1 h1:BPrITETPgSFwiytwmToO0MbUC/+RGC39JScz1JmmG6c=\ngithub.com/stealthrocket/wazergo v0.19.1/go.mod h1:riI0hxw4ndZA5e6z7PesHg2BtTftcZaMxRcoiGGipTs=\ngithub.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs=\ngithub.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tetratelabs/wazero v1.10.1 h1:2DugeJf6VVk58KTPszlNfeeN8AhhpwcZqkJj2wwFuH8=\ngithub.com/tetratelabs/wazero v1.10.1/go.mod h1:DRm5twOQ5Gr1AoEdSi0CLjDQF1J9ZAuyqFIjl1KKfQU=\ngo.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo=\ngo.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0=\ngo.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI=\ngo.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=\ngo.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw=\ngo.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg=\ngo.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=\ngo.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=\ngo.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=\ngo.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=\ngolang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=\ngolang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=\ngolang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=\ngolang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=\ngolang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=\ngolang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=\ngolang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 h1:YcyjlL1PRr2Q17/I0dPk2JmYS5CDXfcdb2Z3YRioEbw=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7 h1:2035KHhUv+EpyB+hWgJnaWKJOdX1E95w2S8Rr4uWKTs=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=\ngoogle.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=\ngoogle.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=\ngoogle.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=\ngoogle.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "_examples/17_error_handler/grpc/federation/federation.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: grpc/federation/federation.proto\n\npackage federation\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\tcode \"google.golang.org/genproto/googleapis/rpc/code\"\n\terrdetails \"google.golang.org/genproto/googleapis/rpc/errdetails\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tdescriptorpb \"google.golang.org/protobuf/types/descriptorpb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// TypeKind is primitive kind list.\ntype TypeKind int32\n\nconst (\n\t// UNKNOWN represents unexpected value.\n\tTypeKind_UNKNOWN TypeKind = 0\n\t// STRING is used to convert the input value to `string` type.\n\tTypeKind_STRING TypeKind = 1\n\t// BOOL is used to convert the input value to `bool` type.\n\tTypeKind_BOOL TypeKind = 2\n\t// INT64 is used to convert the input value to `int64` type.\n\tTypeKind_INT64 TypeKind = 3\n\t// UINT64 is used to convert the input value to `uint64` type.\n\tTypeKind_UINT64 TypeKind = 4\n\t// DOUBLE is used to convert the input value to `double` type.\n\tTypeKind_DOUBLE TypeKind = 5\n\t// DURATION is used to convert the input value to the `google.protobuf.Duration` type.\n\tTypeKind_DURATION TypeKind = 6\n)\n\n// Enum value maps for TypeKind.\nvar (\n\tTypeKind_name = map[int32]string{\n\t\t0: \"UNKNOWN\",\n\t\t1: \"STRING\",\n\t\t2: \"BOOL\",\n\t\t3: \"INT64\",\n\t\t4: \"UINT64\",\n\t\t5: \"DOUBLE\",\n\t\t6: \"DURATION\",\n\t}\n\tTypeKind_value = map[string]int32{\n\t\t\"UNKNOWN\":  0,\n\t\t\"STRING\":   1,\n\t\t\"BOOL\":     2,\n\t\t\"INT64\":    3,\n\t\t\"UINT64\":   4,\n\t\t\"DOUBLE\":   5,\n\t\t\"DURATION\": 6,\n\t}\n)\n\nfunc (x TypeKind) Enum() *TypeKind {\n\tp := new(TypeKind)\n\t*p = x\n\treturn p\n}\n\nfunc (x TypeKind) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (TypeKind) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_grpc_federation_federation_proto_enumTypes[0].Descriptor()\n}\n\nfunc (TypeKind) Type() protoreflect.EnumType {\n\treturn &file_grpc_federation_federation_proto_enumTypes[0]\n}\n\nfunc (x TypeKind) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use TypeKind.Descriptor instead.\nfunc (TypeKind) EnumDescriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\n// LogLevel is the importance or severity of a log event.\ntype GRPCError_LogLevel int32\n\nconst (\n\t// UNKNOWN represents unexpected value.\n\tGRPCError_UNKNOWN GRPCError_LogLevel = 0\n\t// DEBUG is used for detailed information that is useful during development and debugging.\n\tGRPCError_DEBUG GRPCError_LogLevel = 1\n\t// INFO logs are used to provide information about the normal functioning of the application.\n\tGRPCError_INFO GRPCError_LogLevel = 2\n\t// WARN signifies a potential problem or warning that does not necessarily stop the program from working but may lead to issues in the future.\n\tGRPCError_WARN GRPCError_LogLevel = 3\n\t// ERROR indicates a serious issue that has caused a failure in the application.\n\tGRPCError_ERROR GRPCError_LogLevel = 4\n)\n\n// Enum value maps for GRPCError_LogLevel.\nvar (\n\tGRPCError_LogLevel_name = map[int32]string{\n\t\t0: \"UNKNOWN\",\n\t\t1: \"DEBUG\",\n\t\t2: \"INFO\",\n\t\t3: \"WARN\",\n\t\t4: \"ERROR\",\n\t}\n\tGRPCError_LogLevel_value = map[string]int32{\n\t\t\"UNKNOWN\": 0,\n\t\t\"DEBUG\":   1,\n\t\t\"INFO\":    2,\n\t\t\"WARN\":    3,\n\t\t\"ERROR\":   4,\n\t}\n)\n\nfunc (x GRPCError_LogLevel) Enum() *GRPCError_LogLevel {\n\tp := new(GRPCError_LogLevel)\n\t*p = x\n\treturn p\n}\n\nfunc (x GRPCError_LogLevel) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (GRPCError_LogLevel) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_grpc_federation_federation_proto_enumTypes[1].Descriptor()\n}\n\nfunc (GRPCError_LogLevel) Type() protoreflect.EnumType {\n\treturn &file_grpc_federation_federation_proto_enumTypes[1]\n}\n\nfunc (x GRPCError_LogLevel) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use GRPCError_LogLevel.Descriptor instead.\nfunc (GRPCError_LogLevel) EnumDescriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{24, 0}\n}\n\ntype FileRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPlugin *CELPlugin `protobuf:\"bytes,1,opt,name=plugin,proto3\" json:\"plugin,omitempty\"`\n\t// import can be used to resolve methods, messages, etc. that are referenced in gRPC Federation rules.\n\tImport []string `protobuf:\"bytes,2,rep,name=import,proto3\" json:\"import,omitempty\"`\n}\n\nfunc (x *FileRule) Reset() {\n\t*x = FileRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *FileRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*FileRule) ProtoMessage() {}\n\nfunc (x *FileRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use FileRule.ProtoReflect.Descriptor instead.\nfunc (*FileRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *FileRule) GetPlugin() *CELPlugin {\n\tif x != nil {\n\t\treturn x.Plugin\n\t}\n\treturn nil\n}\n\nfunc (x *FileRule) GetImport() []string {\n\tif x != nil {\n\t\treturn x.Import\n\t}\n\treturn nil\n}\n\ntype EnumRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// alias mapping between enums defined in other packages and enums defined on the federation service side.\n\t// The alias is the FQDN ( <package-name>.<enum-name> ) to the enum.\n\t// If this definition exists, type conversion is automatically performed before the enum value assignment operation.\n\t// If a enum with this option has a value that is not present in the enum specified by alias, and the alias option is not specified for that value, an error is occurred.\n\t// You can specify multiple aliases. In that case, only values common to all aliases will be considered.\n\t// Specifying a value that is not included in either alias will result in an error.\n\tAlias []string `protobuf:\"bytes,1,rep,name=alias,proto3\" json:\"alias,omitempty\"`\n}\n\nfunc (x *EnumRule) Reset() {\n\t*x = EnumRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumRule) ProtoMessage() {}\n\nfunc (x *EnumRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumRule.ProtoReflect.Descriptor instead.\nfunc (*EnumRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *EnumRule) GetAlias() []string {\n\tif x != nil {\n\t\treturn x.Alias\n\t}\n\treturn nil\n}\n\ntype EnumValueRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// specifies the default value of the enum.\n\t// All values other than those specified in alias will be default values.\n\tDefault *bool `protobuf:\"varint,1,opt,name=default,proto3,oneof\" json:\"default,omitempty\"`\n\t// alias can be used when alias is specified in grpc.federation.enum option,\n\t// and specifies the value name to be referenced among the enums specified in alias of enum option.\n\t// multiple value names can be specified for alias.\n\tAlias []string `protobuf:\"bytes,2,rep,name=alias,proto3\" json:\"alias,omitempty\"`\n\t// attr is used to hold multiple name-value pairs corresponding to an enum value.\n\t// The values specified by the name must be consistently specified for all enum values.\n\t// The values stored using this feature can be retrieved using the `attr()` method of the enum API.\n\tAttr []*EnumValueAttribute `protobuf:\"bytes,3,rep,name=attr,proto3\" json:\"attr,omitempty\"`\n\t// noalias exclude from the target of alias.\n\t// This option cannot be specified simultaneously with `default` or `alias`.\n\tNoalias *bool `protobuf:\"varint,4,opt,name=noalias,proto3,oneof\" json:\"noalias,omitempty\"`\n}\n\nfunc (x *EnumValueRule) Reset() {\n\t*x = EnumValueRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumValueRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumValueRule) ProtoMessage() {}\n\nfunc (x *EnumValueRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumValueRule.ProtoReflect.Descriptor instead.\nfunc (*EnumValueRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *EnumValueRule) GetDefault() bool {\n\tif x != nil && x.Default != nil {\n\t\treturn *x.Default\n\t}\n\treturn false\n}\n\nfunc (x *EnumValueRule) GetAlias() []string {\n\tif x != nil {\n\t\treturn x.Alias\n\t}\n\treturn nil\n}\n\nfunc (x *EnumValueRule) GetAttr() []*EnumValueAttribute {\n\tif x != nil {\n\t\treturn x.Attr\n\t}\n\treturn nil\n}\n\nfunc (x *EnumValueRule) GetNoalias() bool {\n\tif x != nil && x.Noalias != nil {\n\t\treturn *x.Noalias\n\t}\n\treturn false\n}\n\ntype EnumValueAttribute struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the attribute key.\n\t// This value is used to search for values using the `attr(<name>)` method.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// value represents the value corresponding to `name`.\n\tValue string `protobuf:\"bytes,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *EnumValueAttribute) Reset() {\n\t*x = EnumValueAttribute{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumValueAttribute) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumValueAttribute) ProtoMessage() {}\n\nfunc (x *EnumValueAttribute) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumValueAttribute.ProtoReflect.Descriptor instead.\nfunc (*EnumValueAttribute) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *EnumValueAttribute) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnumValueAttribute) GetValue() string {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn \"\"\n}\n\ntype OneofRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *OneofRule) Reset() {\n\t*x = OneofRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *OneofRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*OneofRule) ProtoMessage() {}\n\nfunc (x *OneofRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use OneofRule.ProtoReflect.Descriptor instead.\nfunc (*OneofRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{4}\n}\n\n// ServiceRule define gRPC Federation rules for the service.\ntype ServiceRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// env defines the environment variable.\n\tEnv *Env `protobuf:\"bytes,1,opt,name=env,proto3\" json:\"env,omitempty\"`\n\t// var defines the service-level variables.\n\tVar []*ServiceVariable `protobuf:\"bytes,2,rep,name=var,proto3\" json:\"var,omitempty\"`\n}\n\nfunc (x *ServiceRule) Reset() {\n\t*x = ServiceRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceRule) ProtoMessage() {}\n\nfunc (x *ServiceRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceRule.ProtoReflect.Descriptor instead.\nfunc (*ServiceRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *ServiceRule) GetEnv() *Env {\n\tif x != nil {\n\t\treturn x.Env\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceRule) GetVar() []*ServiceVariable {\n\tif x != nil {\n\t\treturn x.Var\n\t}\n\treturn nil\n}\n\n// Env is used when setting environment variables.\n// There are two ways to configure it.\ntype Env struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// var is used to directly list environment variables.\n\tVar []*EnvVar `protobuf:\"bytes,1,rep,name=var,proto3\" json:\"var,omitempty\"`\n\t// message is used to reference an already defined Protocol Buffers' message for defining environment variables.\n\t// If you want to set detailed options for the fields of the message, use the `env` option in FieldRule.\n\tMessage string `protobuf:\"bytes,2,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Env) Reset() {\n\t*x = Env{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Env) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Env) ProtoMessage() {}\n\nfunc (x *Env) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Env.ProtoReflect.Descriptor instead.\nfunc (*Env) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *Env) GetVar() []*EnvVar {\n\tif x != nil {\n\t\treturn x.Var\n\t}\n\treturn nil\n}\n\nfunc (x *Env) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\n// ServiceVariable define variables at the service level.\n// This definition is executed at server startup, after the initialization of Env.\n// The defined variables can be used across all messages that the service depends on.\ntype ServiceVariable struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is a variable name.\n\t// This name can be referenced in all CELs related to the service by using `grpc.federation.var.` prefix.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// if specify the condition for evaluating expr.\n\t// this value evaluated by CEL and it must return a boolean value.\n\t// If the result of evaluation is `false`, the value assigned to name is the default value of the result of evaluation of `expr`.\n\tIf *string `protobuf:\"bytes,2,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n\t// expr specify the value to be assigned to name.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*ServiceVariable_By\n\t//\t*ServiceVariable_Map\n\t//\t*ServiceVariable_Message\n\t//\t*ServiceVariable_Validation\n\t//\t*ServiceVariable_Enum\n\t//\t*ServiceVariable_Switch\n\tExpr isServiceVariable_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *ServiceVariable) Reset() {\n\t*x = ServiceVariable{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceVariable) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceVariable) ProtoMessage() {}\n\nfunc (x *ServiceVariable) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceVariable.ProtoReflect.Descriptor instead.\nfunc (*ServiceVariable) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{7}\n}\n\nfunc (x *ServiceVariable) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *ServiceVariable) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\nfunc (m *ServiceVariable) GetExpr() isServiceVariable_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetBy() string {\n\tif x, ok := x.GetExpr().(*ServiceVariable_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *ServiceVariable) GetMap() *MapExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetMessage() *MessageExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetValidation() *ServiceVariableValidationExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Validation); ok {\n\t\treturn x.Validation\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetEnum() *EnumExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetSwitch() *SwitchExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Switch); ok {\n\t\treturn x.Switch\n\t}\n\treturn nil\n}\n\ntype isServiceVariable_Expr interface {\n\tisServiceVariable_Expr()\n}\n\ntype ServiceVariable_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\ntype ServiceVariable_Map struct {\n\t// map apply map operation for the specified repeated type.\n\tMap *MapExpr `protobuf:\"bytes,12,opt,name=map,proto3,oneof\"`\n}\n\ntype ServiceVariable_Message struct {\n\t// message gets with message arguments.\n\tMessage *MessageExpr `protobuf:\"bytes,13,opt,name=message,proto3,oneof\"`\n}\n\ntype ServiceVariable_Validation struct {\n\t// validation defines the validation rule and message.\n\tValidation *ServiceVariableValidationExpr `protobuf:\"bytes,14,opt,name=validation,proto3,oneof\"`\n}\n\ntype ServiceVariable_Enum struct {\n\t// enum gets with cel value.\n\tEnum *EnumExpr `protobuf:\"bytes,15,opt,name=enum,proto3,oneof\"`\n}\n\ntype ServiceVariable_Switch struct {\n\t// switch provides conditional evaluation with multiple branches.\n\tSwitch *SwitchExpr `protobuf:\"bytes,16,opt,name=switch,proto3,oneof\"`\n}\n\nfunc (*ServiceVariable_By) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Map) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Message) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Validation) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Enum) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Switch) isServiceVariable_Expr() {}\n\n// ServiceVariableValidationExpr represents validation rule and error message.\ntype ServiceVariableValidationExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// if specifies condition in CEL. If the condition is true, it returns error.\n\t// The return value must always be of type boolean.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3\" json:\"if,omitempty\"`\n\t// message is a error message in CEL.\n\tMessage string `protobuf:\"bytes,2,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *ServiceVariableValidationExpr) Reset() {\n\t*x = ServiceVariableValidationExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceVariableValidationExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceVariableValidationExpr) ProtoMessage() {}\n\nfunc (x *ServiceVariableValidationExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceVariableValidationExpr.ProtoReflect.Descriptor instead.\nfunc (*ServiceVariableValidationExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{8}\n}\n\nfunc (x *ServiceVariableValidationExpr) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *ServiceVariableValidationExpr) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\n// EnvVar represents an environment variable.\ntype EnvVar struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is an environment variable name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// type is an environment variable type.\n\tType *EnvType `protobuf:\"bytes,2,opt,name=type,proto3\" json:\"type,omitempty\"`\n\t// option is an additional option for parsing environment variable.\n\tOption *EnvVarOption `protobuf:\"bytes,3,opt,name=option,proto3,oneof\" json:\"option,omitempty\"`\n}\n\nfunc (x *EnvVar) Reset() {\n\t*x = EnvVar{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvVar) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvVar) ProtoMessage() {}\n\nfunc (x *EnvVar) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvVar.ProtoReflect.Descriptor instead.\nfunc (*EnvVar) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{9}\n}\n\nfunc (x *EnvVar) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnvVar) GetType() *EnvType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nfunc (x *EnvVar) GetOption() *EnvVarOption {\n\tif x != nil {\n\t\treturn x.Option\n\t}\n\treturn nil\n}\n\n// EnvType represents type information for environment variable.\ntype EnvType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to Type:\n\t//\n\t//\t*EnvType_Kind\n\t//\t*EnvType_Repeated\n\t//\t*EnvType_Map\n\tType isEnvType_Type `protobuf_oneof:\"type\"`\n}\n\nfunc (x *EnvType) Reset() {\n\t*x = EnvType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[10]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvType) ProtoMessage() {}\n\nfunc (x *EnvType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[10]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvType.ProtoReflect.Descriptor instead.\nfunc (*EnvType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{10}\n}\n\nfunc (m *EnvType) GetType() isEnvType_Type {\n\tif m != nil {\n\t\treturn m.Type\n\t}\n\treturn nil\n}\n\nfunc (x *EnvType) GetKind() TypeKind {\n\tif x, ok := x.GetType().(*EnvType_Kind); ok {\n\t\treturn x.Kind\n\t}\n\treturn TypeKind_UNKNOWN\n}\n\nfunc (x *EnvType) GetRepeated() *EnvType {\n\tif x, ok := x.GetType().(*EnvType_Repeated); ok {\n\t\treturn x.Repeated\n\t}\n\treturn nil\n}\n\nfunc (x *EnvType) GetMap() *EnvMapType {\n\tif x, ok := x.GetType().(*EnvType_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\ntype isEnvType_Type interface {\n\tisEnvType_Type()\n}\n\ntype EnvType_Kind struct {\n\t// kind is used when the type is a primitive type.\n\tKind TypeKind `protobuf:\"varint,1,opt,name=kind,proto3,enum=grpc.federation.TypeKind,oneof\"`\n}\n\ntype EnvType_Repeated struct {\n\t// repeated is used when the type is a repeated type.\n\tRepeated *EnvType `protobuf:\"bytes,2,opt,name=repeated,proto3,oneof\"`\n}\n\ntype EnvType_Map struct {\n\t// map is used when the type is a map type.\n\tMap *EnvMapType `protobuf:\"bytes,3,opt,name=map,proto3,oneof\"`\n}\n\nfunc (*EnvType_Kind) isEnvType_Type() {}\n\nfunc (*EnvType_Repeated) isEnvType_Type() {}\n\nfunc (*EnvType_Map) isEnvType_Type() {}\n\n// EnvMapType represents map type.\ntype EnvMapType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// key represents map's key type.\n\tKey *EnvType `protobuf:\"bytes,1,opt,name=key,proto3\" json:\"key,omitempty\"`\n\t// value represents map's value type.\n\tValue *EnvType `protobuf:\"bytes,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *EnvMapType) Reset() {\n\t*x = EnvMapType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[11]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvMapType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvMapType) ProtoMessage() {}\n\nfunc (x *EnvMapType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[11]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvMapType.ProtoReflect.Descriptor instead.\nfunc (*EnvMapType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{11}\n}\n\nfunc (x *EnvMapType) GetKey() *EnvType {\n\tif x != nil {\n\t\treturn x.Key\n\t}\n\treturn nil\n}\n\nfunc (x *EnvMapType) GetValue() *EnvType {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn nil\n}\n\n// EnvVarOption represents additional option for environment variable.\n// The option work with the `envconfig` library in Go language.\n// For detailed specifications, please refer to the library's documentation ( https://pkg.go.dev/github.com/kelseyhightower/envconfig#section-readme ).\ntype EnvVarOption struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// alternate use this option if you want to use an environment variable with a different name than the value specified in `EnvVar.name`.\n\tAlternate *string `protobuf:\"bytes,1,opt,name=alternate,proto3,oneof\" json:\"alternate,omitempty\"`\n\t// default specify the value to use as a fallback if the specified environment variable is not found.\n\tDefault *string `protobuf:\"bytes,2,opt,name=default,proto3,oneof\" json:\"default,omitempty\"`\n\t// required require the environment variable to exist.\n\t// If it does not exist, an error will occur at startup.\n\tRequired *bool `protobuf:\"varint,3,opt,name=required,proto3,oneof\" json:\"required,omitempty\"`\n\t// ignored if ignored is true, it does nothing even if the environment variable exists.\n\tIgnored *bool `protobuf:\"varint,4,opt,name=ignored,proto3,oneof\" json:\"ignored,omitempty\"`\n}\n\nfunc (x *EnvVarOption) Reset() {\n\t*x = EnvVarOption{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[12]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvVarOption) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvVarOption) ProtoMessage() {}\n\nfunc (x *EnvVarOption) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[12]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvVarOption.ProtoReflect.Descriptor instead.\nfunc (*EnvVarOption) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{12}\n}\n\nfunc (x *EnvVarOption) GetAlternate() string {\n\tif x != nil && x.Alternate != nil {\n\t\treturn *x.Alternate\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnvVarOption) GetDefault() string {\n\tif x != nil && x.Default != nil {\n\t\treturn *x.Default\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnvVarOption) GetRequired() bool {\n\tif x != nil && x.Required != nil {\n\t\treturn *x.Required\n\t}\n\treturn false\n}\n\nfunc (x *EnvVarOption) GetIgnored() bool {\n\tif x != nil && x.Ignored != nil {\n\t\treturn *x.Ignored\n\t}\n\treturn false\n}\n\ntype MethodRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// the time to timeout. If the specified time period elapses, DEADLINE_EXCEEDED status is returned.\n\t// If you want to handle this error, you need to implement a custom error handler in Go.\n\t// The format is the same as Go's time.Duration format. See https://pkg.go.dev/time#ParseDuration.\n\tTimeout *string `protobuf:\"bytes,1,opt,name=timeout,proto3,oneof\" json:\"timeout,omitempty\"`\n\t// response specify the name of the message you want to use to create the response value.\n\t// If you specify a reserved type like `google.protobuf.Empty` as the response, you cannot define gRPC Federation options.\n\t// In such cases, you can specify a separate message to create the response value.\n\t// The specified response message must contain fields with the same names and types as all the fields in the original response.\n\tResponse *string `protobuf:\"bytes,2,opt,name=response,proto3,oneof\" json:\"response,omitempty\"`\n}\n\nfunc (x *MethodRule) Reset() {\n\t*x = MethodRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[13]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MethodRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MethodRule) ProtoMessage() {}\n\nfunc (x *MethodRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[13]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MethodRule.ProtoReflect.Descriptor instead.\nfunc (*MethodRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{13}\n}\n\nfunc (x *MethodRule) GetTimeout() string {\n\tif x != nil && x.Timeout != nil {\n\t\treturn *x.Timeout\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodRule) GetResponse() string {\n\tif x != nil && x.Response != nil {\n\t\treturn *x.Response\n\t}\n\treturn \"\"\n}\n\n// MessageRule define gRPC Federation rules for the message.\ntype MessageRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// def specify variables to be used in field binding by `grpc.federation.field` option.\n\tDef []*VariableDefinition `protobuf:\"bytes,1,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// if custom_resolver is true, the resolver for this message is implemented by Go.\n\t// If there are any values retrieved by resolver or messages, they are passed as arguments for custom resolver.\n\t// Each field of the message returned by the custom resolver is automatically bound.\n\t// If you want to change the binding process for a particular field, set `custom_resolver=true` option for that field.\n\tCustomResolver *bool `protobuf:\"varint,2,opt,name=custom_resolver,json=customResolver,proto3,oneof\" json:\"custom_resolver,omitempty\"`\n\t// alias mapping between messages defined in other packages and messages defined on the federation service side.\n\t// The alias is the FQDN ( <package-name>.<message-name> ) to the message.\n\t// If this definition exists, type conversion is automatically performed before the field assignment operation.\n\t// If a message with this option has a field that is not present in the message specified by alias, and the alias option is not specified for that field, an error is occurred.\n\t// You can specify multiple aliases. In that case, only fields common to all aliases will be considered.\n\t// Specifying a field that is not included in either alias will result in an error.\n\tAlias []string `protobuf:\"bytes,3,rep,name=alias,proto3\" json:\"alias,omitempty\"`\n}\n\nfunc (x *MessageRule) Reset() {\n\t*x = MessageRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[14]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MessageRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MessageRule) ProtoMessage() {}\n\nfunc (x *MessageRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[14]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MessageRule.ProtoReflect.Descriptor instead.\nfunc (*MessageRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{14}\n}\n\nfunc (x *MessageRule) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *MessageRule) GetCustomResolver() bool {\n\tif x != nil && x.CustomResolver != nil {\n\t\treturn *x.CustomResolver\n\t}\n\treturn false\n}\n\nfunc (x *MessageRule) GetAlias() []string {\n\tif x != nil {\n\t\treturn x.Alias\n\t}\n\treturn nil\n}\n\n// VariableDefinition represents variable definition.\ntype VariableDefinition struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is a variable name.\n\t// This name can be referenced in all CELs defined after itself in the same message.\n\t// It can also be referenced in `grpc.federation.field` option.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// if specify the condition for evaluating expr.\n\t// this value evaluated by CEL and it must return a boolean value.\n\t// If the result of evaluation is `false`, the value assigned to name is the default value of the result of evaluation of `expr`.\n\tIf *string `protobuf:\"bytes,2,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n\t// autobind if the result value of `expr` is a message type,\n\t// the value of a field with the same name and type as the field name of its own message is automatically assigned to the value of the field in the message.\n\t// If multiple autobinds are used at the same message,\n\t// you must explicitly use the `grpc.federation.field` option to do the binding yourself, since duplicate field names cannot be correctly determined as one.\n\tAutobind *bool `protobuf:\"varint,3,opt,name=autobind,proto3,oneof\" json:\"autobind,omitempty\"`\n\t// expr specify the value to be assigned to name.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*VariableDefinition_By\n\t//\t*VariableDefinition_Map\n\t//\t*VariableDefinition_Message\n\t//\t*VariableDefinition_Call\n\t//\t*VariableDefinition_Validation\n\t//\t*VariableDefinition_Enum\n\t//\t*VariableDefinition_Switch\n\tExpr isVariableDefinition_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *VariableDefinition) Reset() {\n\t*x = VariableDefinition{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[15]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *VariableDefinition) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*VariableDefinition) ProtoMessage() {}\n\nfunc (x *VariableDefinition) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[15]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use VariableDefinition.ProtoReflect.Descriptor instead.\nfunc (*VariableDefinition) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{15}\n}\n\nfunc (x *VariableDefinition) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *VariableDefinition) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *VariableDefinition) GetAutobind() bool {\n\tif x != nil && x.Autobind != nil {\n\t\treturn *x.Autobind\n\t}\n\treturn false\n}\n\nfunc (m *VariableDefinition) GetExpr() isVariableDefinition_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetBy() string {\n\tif x, ok := x.GetExpr().(*VariableDefinition_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *VariableDefinition) GetMap() *MapExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetMessage() *MessageExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetCall() *CallExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Call); ok {\n\t\treturn x.Call\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetValidation() *ValidationExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Validation); ok {\n\t\treturn x.Validation\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetEnum() *EnumExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetSwitch() *SwitchExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Switch); ok {\n\t\treturn x.Switch\n\t}\n\treturn nil\n}\n\ntype isVariableDefinition_Expr interface {\n\tisVariableDefinition_Expr()\n}\n\ntype VariableDefinition_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\ntype VariableDefinition_Map struct {\n\t// map apply map operation for the specified repeated type.\n\tMap *MapExpr `protobuf:\"bytes,12,opt,name=map,proto3,oneof\"`\n}\n\ntype VariableDefinition_Message struct {\n\t// message gets with message arguments.\n\tMessage *MessageExpr `protobuf:\"bytes,13,opt,name=message,proto3,oneof\"`\n}\n\ntype VariableDefinition_Call struct {\n\t// call specifies how to call gRPC method.\n\tCall *CallExpr `protobuf:\"bytes,14,opt,name=call,proto3,oneof\"`\n}\n\ntype VariableDefinition_Validation struct {\n\t// validation defines the validation rule and error.\n\tValidation *ValidationExpr `protobuf:\"bytes,15,opt,name=validation,proto3,oneof\"`\n}\n\ntype VariableDefinition_Enum struct {\n\t// enum gets with cel value.\n\tEnum *EnumExpr `protobuf:\"bytes,16,opt,name=enum,proto3,oneof\"`\n}\n\ntype VariableDefinition_Switch struct {\n\t// switch provides conditional evaluation with multiple branches.\n\tSwitch *SwitchExpr `protobuf:\"bytes,17,opt,name=switch,proto3,oneof\"`\n}\n\nfunc (*VariableDefinition_By) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Map) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Message) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Call) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Validation) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Enum) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Switch) isVariableDefinition_Expr() {}\n\n// MapExpr apply map operation for the specified repeated type.\ntype MapExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// iterator define iterator variable.\n\t// When evaluating CEL in `expr`, we can refer to the name defined in iterator.\n\tIterator *Iterator `protobuf:\"bytes,1,opt,name=iterator,proto3\" json:\"iterator,omitempty\"`\n\t// expr creates map elements using iterator variable.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*MapExpr_By\n\t//\t*MapExpr_Message\n\t//\t*MapExpr_Enum\n\tExpr isMapExpr_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *MapExpr) Reset() {\n\t*x = MapExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[16]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MapExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MapExpr) ProtoMessage() {}\n\nfunc (x *MapExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[16]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MapExpr.ProtoReflect.Descriptor instead.\nfunc (*MapExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{16}\n}\n\nfunc (x *MapExpr) GetIterator() *Iterator {\n\tif x != nil {\n\t\treturn x.Iterator\n\t}\n\treturn nil\n}\n\nfunc (m *MapExpr) GetExpr() isMapExpr_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *MapExpr) GetBy() string {\n\tif x, ok := x.GetExpr().(*MapExpr_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *MapExpr) GetMessage() *MessageExpr {\n\tif x, ok := x.GetExpr().(*MapExpr_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *MapExpr) GetEnum() *EnumExpr {\n\tif x, ok := x.GetExpr().(*MapExpr_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn nil\n}\n\ntype isMapExpr_Expr interface {\n\tisMapExpr_Expr()\n}\n\ntype MapExpr_By struct {\n\t// `by` evaluates with CEL.\n\t// this can refer to the variable declared by `iterator`.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\ntype MapExpr_Message struct {\n\t// message gets with message arguments, and it is made an element of the map.\n\t// The result type of MapExpr is the repeated type of the specified message.\n\tMessage *MessageExpr `protobuf:\"bytes,12,opt,name=message,proto3,oneof\"`\n}\n\ntype MapExpr_Enum struct {\n\t// enum creates enum value for each element of the map.\n\t// The result type of MapExpr is the repeated type of the specified enum.\n\tEnum *EnumExpr `protobuf:\"bytes,13,opt,name=enum,proto3,oneof\"`\n}\n\nfunc (*MapExpr_By) isMapExpr_Expr() {}\n\nfunc (*MapExpr_Message) isMapExpr_Expr() {}\n\nfunc (*MapExpr_Enum) isMapExpr_Expr() {}\n\n// Iterator represents iterator variable.\ntype Iterator struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// variable name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// src the value that will be the source for creating the iterator.\n\t// src must be a repeated type.\n\tSrc string `protobuf:\"bytes,2,opt,name=src,proto3\" json:\"src,omitempty\"`\n}\n\nfunc (x *Iterator) Reset() {\n\t*x = Iterator{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[17]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Iterator) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Iterator) ProtoMessage() {}\n\nfunc (x *Iterator) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[17]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Iterator.ProtoReflect.Descriptor instead.\nfunc (*Iterator) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{17}\n}\n\nfunc (x *Iterator) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Iterator) GetSrc() string {\n\tif x != nil {\n\t\treturn x.Src\n\t}\n\treturn \"\"\n}\n\n// MessageExpr represents dependent message.\ntype MessageExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name specify the message name by FQDN. format is `<package-name>.<message-name>`.\n\t// <package-name> can be omitted when referring to messages in the same package.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// args specify the parameters needed to get the message. This is called the \"message arguments\".\n\tArgs []*Argument `protobuf:\"bytes,2,rep,name=args,proto3\" json:\"args,omitempty\"`\n}\n\nfunc (x *MessageExpr) Reset() {\n\t*x = MessageExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[18]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MessageExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MessageExpr) ProtoMessage() {}\n\nfunc (x *MessageExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[18]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MessageExpr.ProtoReflect.Descriptor instead.\nfunc (*MessageExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{18}\n}\n\nfunc (x *MessageExpr) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *MessageExpr) GetArgs() []*Argument {\n\tif x != nil {\n\t\treturn x.Args\n\t}\n\treturn nil\n}\n\n// EnumExpr represents dependent enum.\ntype EnumExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name specify the enum name by FQDN. format is `<package-name>.<enum-name>`.\n\t// <package-name> can be omitted when referring to enum in the same package.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,2,opt,name=by,proto3\" json:\"by,omitempty\"`\n}\n\nfunc (x *EnumExpr) Reset() {\n\t*x = EnumExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[19]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumExpr) ProtoMessage() {}\n\nfunc (x *EnumExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[19]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumExpr.ProtoReflect.Descriptor instead.\nfunc (*EnumExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{19}\n}\n\nfunc (x *EnumExpr) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnumExpr) GetBy() string {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\n// CallExpr represents how to call gRPC method.\ntype CallExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// method specify the FQDN for the gRPC method. format is `<package-name>.<service-name>/<method-name>`.\n\tMethod string `protobuf:\"bytes,1,opt,name=method,proto3\" json:\"method,omitempty\"`\n\t// request specify request parameters for the gRPC method.\n\tRequest []*MethodRequest `protobuf:\"bytes,2,rep,name=request,proto3\" json:\"request,omitempty\"`\n\t// the time to timeout. If the specified time period elapses, DEADLINE_EXCEEDED status is returned.\n\t// If you want to handle this error, you need to implement a custom error handler in Go.\n\t// The format is the same as Go's time.Duration format. See https://pkg.go.dev/time#ParseDuration.\n\tTimeout *string `protobuf:\"bytes,3,opt,name=timeout,proto3,oneof\" json:\"timeout,omitempty\"`\n\t// retry specifies the retry policy if the method call fails.\n\tRetry *RetryPolicy `protobuf:\"bytes,4,opt,name=retry,proto3,oneof\" json:\"retry,omitempty\"`\n\t// error evaluated when an error occurs during a method call.\n\t// Multiple errors can be defined and are evaluated in the order in which they are described.\n\t// If an error occurs while creating an gRPC status error, original error will be returned.\n\tError []*GRPCError `protobuf:\"bytes,5,rep,name=error,proto3\" json:\"error,omitempty\"`\n\t// option is the gRPC's call option (https://pkg.go.dev/google.golang.org/grpc#CallOption).\n\tOption *GRPCCallOption `protobuf:\"bytes,6,opt,name=option,proto3,oneof\" json:\"option,omitempty\"`\n\t// metadata specify outgoing metadata with CEL value.\n\t// The specified type must always be of type map<string, repeated string>.\n\tMetadata *string `protobuf:\"bytes,7,opt,name=metadata,proto3,oneof\" json:\"metadata,omitempty\"`\n}\n\nfunc (x *CallExpr) Reset() {\n\t*x = CallExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[20]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CallExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CallExpr) ProtoMessage() {}\n\nfunc (x *CallExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[20]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CallExpr.ProtoReflect.Descriptor instead.\nfunc (*CallExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{20}\n}\n\nfunc (x *CallExpr) GetMethod() string {\n\tif x != nil {\n\t\treturn x.Method\n\t}\n\treturn \"\"\n}\n\nfunc (x *CallExpr) GetRequest() []*MethodRequest {\n\tif x != nil {\n\t\treturn x.Request\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetTimeout() string {\n\tif x != nil && x.Timeout != nil {\n\t\treturn *x.Timeout\n\t}\n\treturn \"\"\n}\n\nfunc (x *CallExpr) GetRetry() *RetryPolicy {\n\tif x != nil {\n\t\treturn x.Retry\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetError() []*GRPCError {\n\tif x != nil {\n\t\treturn x.Error\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetOption() *GRPCCallOption {\n\tif x != nil {\n\t\treturn x.Option\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetMetadata() string {\n\tif x != nil && x.Metadata != nil {\n\t\treturn *x.Metadata\n\t}\n\treturn \"\"\n}\n\n// SwitchExpr represents a switch statement. At least one \"case\", and \"default\", must be defined. All\n// case.if expressions must evaluate to a boolean value. All case.by expressions, and default.by, must\n// evaluate to the same type (the return type of the switch).\n//\n// When executed, the case.if expressions are evaluated in order, and, for the first case whose\n// case.if expression evaluates to true, its case.by is evaluated to make the return value of the\n// SwitchExpr.\n// If no case.if evaluates to true, default.by is evaluated to make the return value.\ntype SwitchExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Cases for the switch expression.\n\tCase []*SwitchCaseExpr `protobuf:\"bytes,1,rep,name=case,proto3\" json:\"case,omitempty\"`\n\t// The default case, if none of the \"case.if\" expressions evaluate to true.\n\tDefault *SwitchDefaultExpr `protobuf:\"bytes,2,opt,name=default,proto3\" json:\"default,omitempty\"`\n}\n\nfunc (x *SwitchExpr) Reset() {\n\t*x = SwitchExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[21]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SwitchExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SwitchExpr) ProtoMessage() {}\n\nfunc (x *SwitchExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[21]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SwitchExpr.ProtoReflect.Descriptor instead.\nfunc (*SwitchExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{21}\n}\n\nfunc (x *SwitchExpr) GetCase() []*SwitchCaseExpr {\n\tif x != nil {\n\t\treturn x.Case\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchExpr) GetDefault() *SwitchDefaultExpr {\n\tif x != nil {\n\t\treturn x.Default\n\t}\n\treturn nil\n}\n\n// SwitchCaseExpr represents a single case for a switch expression.\ntype SwitchCaseExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// if specify the condition for evaluating expr.\n\t// this value evaluated by CEL and it must return a boolean value.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3\" json:\"if,omitempty\"`\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,2,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// expr specify the value to return for the case.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*SwitchCaseExpr_By\n\tExpr isSwitchCaseExpr_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *SwitchCaseExpr) Reset() {\n\t*x = SwitchCaseExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[22]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SwitchCaseExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SwitchCaseExpr) ProtoMessage() {}\n\nfunc (x *SwitchCaseExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[22]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SwitchCaseExpr.ProtoReflect.Descriptor instead.\nfunc (*SwitchCaseExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{22}\n}\n\nfunc (x *SwitchCaseExpr) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *SwitchCaseExpr) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (m *SwitchCaseExpr) GetExpr() isSwitchCaseExpr_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchCaseExpr) GetBy() string {\n\tif x, ok := x.GetExpr().(*SwitchCaseExpr_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\ntype isSwitchCaseExpr_Expr interface {\n\tisSwitchCaseExpr_Expr()\n}\n\ntype SwitchCaseExpr_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\nfunc (*SwitchCaseExpr_By) isSwitchCaseExpr_Expr() {}\n\n// SwitchDefaultExpr represents the default case for a switch expression.\ntype SwitchDefaultExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,1,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// expr specify the value to return for the default case.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*SwitchDefaultExpr_By\n\tExpr isSwitchDefaultExpr_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *SwitchDefaultExpr) Reset() {\n\t*x = SwitchDefaultExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[23]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SwitchDefaultExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SwitchDefaultExpr) ProtoMessage() {}\n\nfunc (x *SwitchDefaultExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[23]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SwitchDefaultExpr.ProtoReflect.Descriptor instead.\nfunc (*SwitchDefaultExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{23}\n}\n\nfunc (x *SwitchDefaultExpr) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (m *SwitchDefaultExpr) GetExpr() isSwitchDefaultExpr_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchDefaultExpr) GetBy() string {\n\tif x, ok := x.GetExpr().(*SwitchDefaultExpr_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\ntype isSwitchDefaultExpr_Expr interface {\n\tisSwitchDefaultExpr_Expr()\n}\n\ntype SwitchDefaultExpr_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\nfunc (*SwitchDefaultExpr_By) isSwitchDefaultExpr_Expr() {}\n\n// GRPCError create gRPC status value.\ntype GRPCError struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,1,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// if specifies condition in CEL. If the condition is true, it returns defined error information.\n\t// If this field is omitted, it is always treated as 'true' and returns defined error information.\n\t// The return value must always be of type boolean.\n\tIf *string `protobuf:\"bytes,2,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n\t// code is a gRPC status code.\n\tCode *code.Code `protobuf:\"varint,3,opt,name=code,proto3,enum=google.rpc.Code,oneof\" json:\"code,omitempty\"`\n\t// message is a gRPC status message.\n\t// If omitted, the message will be auto-generated from the configurations.\n\tMessage *string `protobuf:\"bytes,4,opt,name=message,proto3,oneof\" json:\"message,omitempty\"`\n\t// details is a list of error details.\n\t// If returns error, the corresponding error details are set.\n\tDetails []*GRPCErrorDetail `protobuf:\"bytes,5,rep,name=details,proto3\" json:\"details,omitempty\"`\n\t// ignore ignore the error if the condition in the \"if\" field is true and \"ignore\" field is set to true.\n\t// When an error is ignored, the returned response is always null value.\n\t// If you want to return a response that is not null, please use `ignore_and_response` feature.\n\t// Therefore, `ignore` and `ignore_and_response` cannot be specified same.\n\tIgnore *bool `protobuf:\"varint,6,opt,name=ignore,proto3,oneof\" json:\"ignore,omitempty\"`\n\t// ignore_and_response ignore the error if the condition in the \"if\" field is true and it returns response specified in CEL.\n\t// The evaluation value of CEL must always be the same as the response message type.\n\t// `ignore` and `ignore_and_response` cannot be specified same.\n\tIgnoreAndResponse *string `protobuf:\"bytes,7,opt,name=ignore_and_response,json=ignoreAndResponse,proto3,oneof\" json:\"ignore_and_response,omitempty\"`\n\t// log_level can be configured to output logs as any log level.\n\t// If DEBUG is specified for the log_level, logs are output as debug logs.\n\t// default value is ERROR.\n\tLogLevel *GRPCError_LogLevel `protobuf:\"varint,8,opt,name=log_level,json=logLevel,proto3,enum=grpc.federation.GRPCError_LogLevel,oneof\" json:\"log_level,omitempty\"`\n}\n\nfunc (x *GRPCError) Reset() {\n\t*x = GRPCError{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[24]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GRPCError) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GRPCError) ProtoMessage() {}\n\nfunc (x *GRPCError) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[24]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GRPCError.ProtoReflect.Descriptor instead.\nfunc (*GRPCError) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{24}\n}\n\nfunc (x *GRPCError) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCError) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCError) GetCode() code.Code {\n\tif x != nil && x.Code != nil {\n\t\treturn *x.Code\n\t}\n\treturn code.Code(0)\n}\n\nfunc (x *GRPCError) GetMessage() string {\n\tif x != nil && x.Message != nil {\n\t\treturn *x.Message\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCError) GetDetails() []*GRPCErrorDetail {\n\tif x != nil {\n\t\treturn x.Details\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCError) GetIgnore() bool {\n\tif x != nil && x.Ignore != nil {\n\t\treturn *x.Ignore\n\t}\n\treturn false\n}\n\nfunc (x *GRPCError) GetIgnoreAndResponse() string {\n\tif x != nil && x.IgnoreAndResponse != nil {\n\t\treturn *x.IgnoreAndResponse\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCError) GetLogLevel() GRPCError_LogLevel {\n\tif x != nil && x.LogLevel != nil {\n\t\treturn *x.LogLevel\n\t}\n\treturn GRPCError_UNKNOWN\n}\n\ntype GRPCErrorDetail struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// if specifies condition rule in CEL. If the condition is true, gRPC error detail is added to the error.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3\" json:\"if,omitempty\"`\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,2,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// message represents arbitrary messages to describe the detail of the error.\n\tMessage []*MessageExpr `protobuf:\"bytes,3,rep,name=message,proto3\" json:\"message,omitempty\"`\n\t// error_info describes the cause of the error with structured details.\n\tErrorInfo []*errdetails.ErrorInfo `protobuf:\"bytes,4,rep,name=error_info,json=errorInfo,proto3\" json:\"error_info,omitempty\"`\n\t// retry_info describes when the clients can retry a failed request.\n\tRetryInfo []*errdetails.RetryInfo `protobuf:\"bytes,5,rep,name=retry_info,json=retryInfo,proto3\" json:\"retry_info,omitempty\"`\n\t// debug_info describes additional debugging info.\n\tDebugInfo []*errdetails.DebugInfo `protobuf:\"bytes,6,rep,name=debug_info,json=debugInfo,proto3\" json:\"debug_info,omitempty\"`\n\t// quota_failure describes how a quota check failed.\n\tQuotaFailure []*errdetails.QuotaFailure `protobuf:\"bytes,7,rep,name=quota_failure,json=quotaFailure,proto3\" json:\"quota_failure,omitempty\"`\n\t// precondition_failure describes what preconditions have failed.\n\tPreconditionFailure []*errdetails.PreconditionFailure `protobuf:\"bytes,8,rep,name=precondition_failure,json=preconditionFailure,proto3\" json:\"precondition_failure,omitempty\"`\n\t// bad_request describes violations in a client request.\n\tBadRequest []*errdetails.BadRequest `protobuf:\"bytes,9,rep,name=bad_request,json=badRequest,proto3\" json:\"bad_request,omitempty\"`\n\t// request_info contains metadata about the request that clients can attach.\n\tRequestInfo []*errdetails.RequestInfo `protobuf:\"bytes,10,rep,name=request_info,json=requestInfo,proto3\" json:\"request_info,omitempty\"`\n\t// resource_info describes the resource that is being accessed.\n\tResourceInfo []*errdetails.ResourceInfo `protobuf:\"bytes,11,rep,name=resource_info,json=resourceInfo,proto3\" json:\"resource_info,omitempty\"`\n\t// help provides links to documentation or for performing an out of band action.\n\tHelp []*errdetails.Help `protobuf:\"bytes,12,rep,name=help,proto3\" json:\"help,omitempty\"`\n\t// localized_message provides a localized error message that is safe to return to the user.\n\tLocalizedMessage []*errdetails.LocalizedMessage `protobuf:\"bytes,13,rep,name=localized_message,json=localizedMessage,proto3\" json:\"localized_message,omitempty\"`\n\t// by specify a message in CEL to express the details of the error.\n\tBy []string `protobuf:\"bytes,14,rep,name=by,proto3\" json:\"by,omitempty\"`\n}\n\nfunc (x *GRPCErrorDetail) Reset() {\n\t*x = GRPCErrorDetail{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[25]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GRPCErrorDetail) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GRPCErrorDetail) ProtoMessage() {}\n\nfunc (x *GRPCErrorDetail) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[25]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GRPCErrorDetail.ProtoReflect.Descriptor instead.\nfunc (*GRPCErrorDetail) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{25}\n}\n\nfunc (x *GRPCErrorDetail) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCErrorDetail) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetMessage() []*MessageExpr {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetErrorInfo() []*errdetails.ErrorInfo {\n\tif x != nil {\n\t\treturn x.ErrorInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetRetryInfo() []*errdetails.RetryInfo {\n\tif x != nil {\n\t\treturn x.RetryInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetDebugInfo() []*errdetails.DebugInfo {\n\tif x != nil {\n\t\treturn x.DebugInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetQuotaFailure() []*errdetails.QuotaFailure {\n\tif x != nil {\n\t\treturn x.QuotaFailure\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetPreconditionFailure() []*errdetails.PreconditionFailure {\n\tif x != nil {\n\t\treturn x.PreconditionFailure\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetBadRequest() []*errdetails.BadRequest {\n\tif x != nil {\n\t\treturn x.BadRequest\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetRequestInfo() []*errdetails.RequestInfo {\n\tif x != nil {\n\t\treturn x.RequestInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetResourceInfo() []*errdetails.ResourceInfo {\n\tif x != nil {\n\t\treturn x.ResourceInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetHelp() []*errdetails.Help {\n\tif x != nil {\n\t\treturn x.Help\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetLocalizedMessage() []*errdetails.LocalizedMessage {\n\tif x != nil {\n\t\treturn x.LocalizedMessage\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetBy() []string {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn nil\n}\n\n// GRPCCallOption configures a gRPC Call before it starts or extracts information from a gRPC Call after it completes.\ntype GRPCCallOption struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// set the content-subtype. For example, if content-subtype is \"json\", the Content-Type over the wire will be \"application/grpc+json\".\n\t// The content-subtype is converted to lowercase before being included in Content-Type.\n\t// See Content-Type on https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests for more details.\n\t// If no such codec is found, the call will result in an error with code INTERNAL.\n\tContentSubtype *string `protobuf:\"bytes,1,opt,name=content_subtype,json=contentSubtype,proto3,oneof\" json:\"content_subtype,omitempty\"`\n\t// header retrieves the header metadata for a unary RPC.\n\t// In order to obtain the metadata, you must specify a variable of type map<string, repeated string> in the header.\n\t// e.g.)\n\t// def [\n\t//\n\t//\t{ name: \"hdr\" by: \"grpc.federation.metadata.new()\" }\n\t//\t{ call { method: \"pkg.Method\" option { header: \"hdr\" } } }\n\t//\n\t// ]\n\tHeader *string `protobuf:\"bytes,2,opt,name=header,proto3,oneof\" json:\"header,omitempty\"`\n\t// max_call_recv_msg_size sets the maximum message size in bytes the client can receive.\n\t// If this is not set, gRPC uses the default 4MB.\n\tMaxCallRecvMsgSize *int64 `protobuf:\"varint,3,opt,name=max_call_recv_msg_size,json=maxCallRecvMsgSize,proto3,oneof\" json:\"max_call_recv_msg_size,omitempty\"`\n\t// max_call_send_msg_size sets the maximum message size in bytes the client can send.\n\t// If this is not set, gRPC uses the default maximum number of int32 range.\n\tMaxCallSendMsgSize *int64 `protobuf:\"varint,4,opt,name=max_call_send_msg_size,json=maxCallSendMsgSize,proto3,oneof\" json:\"max_call_send_msg_size,omitempty\"`\n\t// static_method specifies that a call is being made to a method that is static,\n\t// which means the method is known at compile time and doesn't change at runtime.\n\t// This can be used as a signal to stats plugins that this method is safe to include as a key to a measurement.\n\tStaticMethod *bool `protobuf:\"varint,5,opt,name=static_method,json=staticMethod,proto3,oneof\" json:\"static_method,omitempty\"`\n\t// trailer retrieves the trailer metadata for a unary RPC.\n\t// In order to obtain the metadata, you must specify a variable of type map<string, repeated string> in the trailer.\n\t// e.g.)\n\t// def [\n\t//\n\t//\t{ name: \"trl\" by: \"grpc.federation.metadata.new()\" }\n\t//\t{ call { method: \"pkg.Method\" option { trailer: \"trl\" } } }\n\t//\n\t// ]\n\tTrailer *string `protobuf:\"bytes,6,opt,name=trailer,proto3,oneof\" json:\"trailer,omitempty\"`\n\t// wait_for_ready configures the RPC's behavior when the client is in TRANSIENT_FAILURE,\n\t// which occurs when all addresses fail to connect.\n\t// If wait_for_ready is false, the RPC will fail immediately.\n\t// Otherwise, the client will wait until a connection becomes available or the RPC's deadline is reached.\n\t// By default, RPCs do not \"wait for ready\".\n\tWaitForReady *bool `protobuf:\"varint,7,opt,name=wait_for_ready,json=waitForReady,proto3,oneof\" json:\"wait_for_ready,omitempty\"`\n}\n\nfunc (x *GRPCCallOption) Reset() {\n\t*x = GRPCCallOption{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[26]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GRPCCallOption) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GRPCCallOption) ProtoMessage() {}\n\nfunc (x *GRPCCallOption) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[26]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GRPCCallOption.ProtoReflect.Descriptor instead.\nfunc (*GRPCCallOption) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{26}\n}\n\nfunc (x *GRPCCallOption) GetContentSubtype() string {\n\tif x != nil && x.ContentSubtype != nil {\n\t\treturn *x.ContentSubtype\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCCallOption) GetHeader() string {\n\tif x != nil && x.Header != nil {\n\t\treturn *x.Header\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCCallOption) GetMaxCallRecvMsgSize() int64 {\n\tif x != nil && x.MaxCallRecvMsgSize != nil {\n\t\treturn *x.MaxCallRecvMsgSize\n\t}\n\treturn 0\n}\n\nfunc (x *GRPCCallOption) GetMaxCallSendMsgSize() int64 {\n\tif x != nil && x.MaxCallSendMsgSize != nil {\n\t\treturn *x.MaxCallSendMsgSize\n\t}\n\treturn 0\n}\n\nfunc (x *GRPCCallOption) GetStaticMethod() bool {\n\tif x != nil && x.StaticMethod != nil {\n\t\treturn *x.StaticMethod\n\t}\n\treturn false\n}\n\nfunc (x *GRPCCallOption) GetTrailer() string {\n\tif x != nil && x.Trailer != nil {\n\t\treturn *x.Trailer\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCCallOption) GetWaitForReady() bool {\n\tif x != nil && x.WaitForReady != nil {\n\t\treturn *x.WaitForReady\n\t}\n\treturn false\n}\n\n// Validation represents a validation rule against variables defined within the current scope.\ntype ValidationExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is a unique name for the validation.\n\t// If set, the validation error type will be <message-name><name>Error.\n\t// If omitted, the validation error type will be ValidationError.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// error defines the actual validation rules and an error to returned if the validation fails.\n\tError *GRPCError `protobuf:\"bytes,2,opt,name=error,proto3\" json:\"error,omitempty\"`\n}\n\nfunc (x *ValidationExpr) Reset() {\n\t*x = ValidationExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[27]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ValidationExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ValidationExpr) ProtoMessage() {}\n\nfunc (x *ValidationExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[27]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ValidationExpr.ProtoReflect.Descriptor instead.\nfunc (*ValidationExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{27}\n}\n\nfunc (x *ValidationExpr) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *ValidationExpr) GetError() *GRPCError {\n\tif x != nil {\n\t\treturn x.Error\n\t}\n\treturn nil\n}\n\n// RetryPolicy define the retry policy if the method call fails.\ntype RetryPolicy struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to Policy:\n\t//\n\t//\t*RetryPolicy_Constant\n\t//\t*RetryPolicy_Exponential\n\tPolicy isRetryPolicy_Policy `protobuf_oneof:\"policy\"`\n\t// if specifies condition in CEL. If the condition is true, run the retry process according to the policy.\n\t// If this field is omitted, it is always treated as 'true' and run the retry process.\n\t// The return value must always be of type boolean.\n\tIf string `protobuf:\"bytes,3,opt,name=if,proto3\" json:\"if,omitempty\"`\n}\n\nfunc (x *RetryPolicy) Reset() {\n\t*x = RetryPolicy{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[28]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RetryPolicy) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RetryPolicy) ProtoMessage() {}\n\nfunc (x *RetryPolicy) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[28]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RetryPolicy.ProtoReflect.Descriptor instead.\nfunc (*RetryPolicy) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{28}\n}\n\nfunc (m *RetryPolicy) GetPolicy() isRetryPolicy_Policy {\n\tif m != nil {\n\t\treturn m.Policy\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicy) GetConstant() *RetryPolicyConstant {\n\tif x, ok := x.GetPolicy().(*RetryPolicy_Constant); ok {\n\t\treturn x.Constant\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicy) GetExponential() *RetryPolicyExponential {\n\tif x, ok := x.GetPolicy().(*RetryPolicy_Exponential); ok {\n\t\treturn x.Exponential\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicy) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\ntype isRetryPolicy_Policy interface {\n\tisRetryPolicy_Policy()\n}\n\ntype RetryPolicy_Constant struct {\n\t// retry according to the \"constant\" policy.\n\tConstant *RetryPolicyConstant `protobuf:\"bytes,1,opt,name=constant,proto3,oneof\"`\n}\n\ntype RetryPolicy_Exponential struct {\n\t// retry according to the \"exponential backoff\" policy.\n\t// The following Go library is used in the implementation,\n\t// so please refer to the library documentation for how to specify each parameter.\n\t// https://pkg.go.dev/github.com/cenkalti/backoff/v4#section-readme.\n\tExponential *RetryPolicyExponential `protobuf:\"bytes,2,opt,name=exponential,proto3,oneof\"`\n}\n\nfunc (*RetryPolicy_Constant) isRetryPolicy_Policy() {}\n\nfunc (*RetryPolicy_Exponential) isRetryPolicy_Policy() {}\n\n// RetryPolicyConstant define \"constant\" based retry policy.\ntype RetryPolicyConstant struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// interval value. ( default value is 1s ).\n\tInterval *string `protobuf:\"bytes,1,opt,name=interval,proto3,oneof\" json:\"interval,omitempty\"`\n\t// max retry count. ( default value is 5. If zero is specified, it never stops )\n\tMaxRetries *uint64 `protobuf:\"varint,2,opt,name=max_retries,json=maxRetries,proto3,oneof\" json:\"max_retries,omitempty\"`\n}\n\nfunc (x *RetryPolicyConstant) Reset() {\n\t*x = RetryPolicyConstant{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[29]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RetryPolicyConstant) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RetryPolicyConstant) ProtoMessage() {}\n\nfunc (x *RetryPolicyConstant) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[29]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RetryPolicyConstant.ProtoReflect.Descriptor instead.\nfunc (*RetryPolicyConstant) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{29}\n}\n\nfunc (x *RetryPolicyConstant) GetInterval() string {\n\tif x != nil && x.Interval != nil {\n\t\treturn *x.Interval\n\t}\n\treturn \"\"\n}\n\nfunc (x *RetryPolicyConstant) GetMaxRetries() uint64 {\n\tif x != nil && x.MaxRetries != nil {\n\t\treturn *x.MaxRetries\n\t}\n\treturn 0\n}\n\n// RetryPolicyExponential define \"exponential backoff\" based retry policy.\ntype RetryPolicyExponential struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// initial interval value. ( default value is \"500ms\" ).\n\tInitialInterval *string `protobuf:\"bytes,1,opt,name=initial_interval,json=initialInterval,proto3,oneof\" json:\"initial_interval,omitempty\"`\n\t// randomization factor value. ( default value is 0.5 ).\n\tRandomizationFactor *float64 `protobuf:\"fixed64,2,opt,name=randomization_factor,json=randomizationFactor,proto3,oneof\" json:\"randomization_factor,omitempty\"`\n\t// multiplier. ( default value is 1.5 ).\n\tMultiplier *float64 `protobuf:\"fixed64,3,opt,name=multiplier,proto3,oneof\" json:\"multiplier,omitempty\"`\n\t// max interval value. ( default value is \"60s\" ).\n\tMaxInterval *string `protobuf:\"bytes,4,opt,name=max_interval,json=maxInterval,proto3,oneof\" json:\"max_interval,omitempty\"`\n\t// max retry count. ( default value is 5. If zero is specified, it never stops ).\n\tMaxRetries *uint64 `protobuf:\"varint,5,opt,name=max_retries,json=maxRetries,proto3,oneof\" json:\"max_retries,omitempty\"`\n}\n\nfunc (x *RetryPolicyExponential) Reset() {\n\t*x = RetryPolicyExponential{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[30]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RetryPolicyExponential) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RetryPolicyExponential) ProtoMessage() {}\n\nfunc (x *RetryPolicyExponential) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[30]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RetryPolicyExponential.ProtoReflect.Descriptor instead.\nfunc (*RetryPolicyExponential) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{30}\n}\n\nfunc (x *RetryPolicyExponential) GetInitialInterval() string {\n\tif x != nil && x.InitialInterval != nil {\n\t\treturn *x.InitialInterval\n\t}\n\treturn \"\"\n}\n\nfunc (x *RetryPolicyExponential) GetRandomizationFactor() float64 {\n\tif x != nil && x.RandomizationFactor != nil {\n\t\treturn *x.RandomizationFactor\n\t}\n\treturn 0\n}\n\nfunc (x *RetryPolicyExponential) GetMultiplier() float64 {\n\tif x != nil && x.Multiplier != nil {\n\t\treturn *x.Multiplier\n\t}\n\treturn 0\n}\n\nfunc (x *RetryPolicyExponential) GetMaxInterval() string {\n\tif x != nil && x.MaxInterval != nil {\n\t\treturn *x.MaxInterval\n\t}\n\treturn \"\"\n}\n\nfunc (x *RetryPolicyExponential) GetMaxRetries() uint64 {\n\tif x != nil && x.MaxRetries != nil {\n\t\treturn *x.MaxRetries\n\t}\n\treturn 0\n}\n\n// MethodRequest define parameters to be used for gRPC method request.\ntype MethodRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// field name of the request message.\n\tField string `protobuf:\"bytes,1,opt,name=field,proto3\" json:\"field,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tBy *string `protobuf:\"bytes,2,opt,name=by,proto3,oneof\" json:\"by,omitempty\"`\n\t// if describes the condition to be assigned to field.\n\t// The return value must be of type bool.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\t// If the field is a 'oneof' field, it must be specified.\n\tIf *string `protobuf:\"bytes,3,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n}\n\nfunc (x *MethodRequest) Reset() {\n\t*x = MethodRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[31]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MethodRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MethodRequest) ProtoMessage() {}\n\nfunc (x *MethodRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[31]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MethodRequest.ProtoReflect.Descriptor instead.\nfunc (*MethodRequest) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{31}\n}\n\nfunc (x *MethodRequest) GetField() string {\n\tif x != nil {\n\t\treturn x.Field\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodRequest) GetBy() string {\n\tif x != nil && x.By != nil {\n\t\treturn *x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodRequest) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\n// MethodResponse define which value of the method response is referenced.\ntype MethodResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name specify the unique name that can be used in a `MessageRule` / `FieldRule` for the same message for a specific field in the response.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// field name in response message.\n\tField *string `protobuf:\"bytes,2,opt,name=field,proto3,oneof\" json:\"field,omitempty\"`\n\t// autobind if the value referenced by `field` is a message type,\n\t// the value of a field with the same name and type as the field name of its own message is automatically assigned to the value of the field in the message.\n\t// If multiple autobinds are used at the same message,\n\t// you must explicitly use the `grpc.federation.field` option to do the binding yourself, since duplicate field names cannot be correctly determined as one.\n\tAutobind *bool `protobuf:\"varint,3,opt,name=autobind,proto3,oneof\" json:\"autobind,omitempty\"`\n}\n\nfunc (x *MethodResponse) Reset() {\n\t*x = MethodResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[32]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MethodResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MethodResponse) ProtoMessage() {}\n\nfunc (x *MethodResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[32]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MethodResponse.ProtoReflect.Descriptor instead.\nfunc (*MethodResponse) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{32}\n}\n\nfunc (x *MethodResponse) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodResponse) GetField() string {\n\tif x != nil && x.Field != nil {\n\t\treturn *x.Field\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodResponse) GetAutobind() bool {\n\tif x != nil && x.Autobind != nil {\n\t\treturn *x.Autobind\n\t}\n\treturn false\n}\n\n// Argument define message argument.\ntype Argument struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name of the message argument.\n\t// Use this name to refer to the message argument.\n\t// For example, if `foo` is specified as the name, it is referenced by `$.foo`.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tBy *string `protobuf:\"bytes,2,opt,name=by,proto3,oneof\" json:\"by,omitempty\"`\n\t// inline like by, it refers to the specified value and expands all fields beyond it.\n\t// For this reason, the referenced value must always be of message type.\n\tInline *string `protobuf:\"bytes,3,opt,name=inline,proto3,oneof\" json:\"inline,omitempty\"`\n}\n\nfunc (x *Argument) Reset() {\n\t*x = Argument{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[33]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Argument) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Argument) ProtoMessage() {}\n\nfunc (x *Argument) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[33]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Argument.ProtoReflect.Descriptor instead.\nfunc (*Argument) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{33}\n}\n\nfunc (x *Argument) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Argument) GetBy() string {\n\tif x != nil && x.By != nil {\n\t\treturn *x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *Argument) GetInline() string {\n\tif x != nil && x.Inline != nil {\n\t\treturn *x.Inline\n\t}\n\treturn \"\"\n}\n\n// FieldRule define gRPC Federation rules for the field of message.\ntype FieldRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// If custom_resolver is true, the field binding process is to be implemented in Go.\n\t// If there are any values retrieved by grpc.federation.message option, they are passed as arguments for custom resolver.\n\tCustomResolver *bool `protobuf:\"varint,1,opt,name=custom_resolver,json=customResolver,proto3,oneof\" json:\"custom_resolver,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tBy *string `protobuf:\"bytes,2,opt,name=by,proto3,oneof\" json:\"by,omitempty\"`\n\t// alias can be used when alias is specified in grpc.federation.message option,\n\t// and specifies the field name to be referenced among the messages specified in alias of message option.\n\t// If the specified field has the same type or can be converted automatically, its value is assigned.\n\tAlias *string `protobuf:\"bytes,3,opt,name=alias,proto3,oneof\" json:\"alias,omitempty\"`\n\t// use to evaluate any one of fields. this field only available in oneof.\n\tOneof *FieldOneof `protobuf:\"bytes,4,opt,name=oneof,proto3\" json:\"oneof,omitempty\"`\n\t// when defining an environment variable, use it for fields where you want to set additional options.\n\tEnv *EnvVarOption `protobuf:\"bytes,5,opt,name=env,proto3\" json:\"env,omitempty\"`\n}\n\nfunc (x *FieldRule) Reset() {\n\t*x = FieldRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[34]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *FieldRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*FieldRule) ProtoMessage() {}\n\nfunc (x *FieldRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[34]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use FieldRule.ProtoReflect.Descriptor instead.\nfunc (*FieldRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{34}\n}\n\nfunc (x *FieldRule) GetCustomResolver() bool {\n\tif x != nil && x.CustomResolver != nil {\n\t\treturn *x.CustomResolver\n\t}\n\treturn false\n}\n\nfunc (x *FieldRule) GetBy() string {\n\tif x != nil && x.By != nil {\n\t\treturn *x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *FieldRule) GetAlias() string {\n\tif x != nil && x.Alias != nil {\n\t\treturn *x.Alias\n\t}\n\treturn \"\"\n}\n\nfunc (x *FieldRule) GetOneof() *FieldOneof {\n\tif x != nil {\n\t\treturn x.Oneof\n\t}\n\treturn nil\n}\n\nfunc (x *FieldRule) GetEnv() *EnvVarOption {\n\tif x != nil {\n\t\treturn x.Env\n\t}\n\treturn nil\n}\n\n// FieldOneof evaluate \"messages\" or other field only if expr is true and assign to the oneof field.\n// This feature only available in oneof.\ntype FieldOneof struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// cond specify either `expr` or `default`. Only one `default` can be set per oneof.\n\t//\n\t// Types that are assignable to Cond:\n\t//\n\t//\t*FieldOneof_If\n\t//\t*FieldOneof_Default\n\tCond isFieldOneof_Cond `protobuf_oneof:\"cond\"`\n\t// def specify variables to be used in current oneof field's scope for field binding.\n\tDef []*VariableDefinition `protobuf:\"bytes,3,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule and FieldOneOf can be used.\n\tBy string `protobuf:\"bytes,4,opt,name=by,proto3\" json:\"by,omitempty\"`\n}\n\nfunc (x *FieldOneof) Reset() {\n\t*x = FieldOneof{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[35]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *FieldOneof) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*FieldOneof) ProtoMessage() {}\n\nfunc (x *FieldOneof) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[35]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use FieldOneof.ProtoReflect.Descriptor instead.\nfunc (*FieldOneof) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{35}\n}\n\nfunc (m *FieldOneof) GetCond() isFieldOneof_Cond {\n\tif m != nil {\n\t\treturn m.Cond\n\t}\n\treturn nil\n}\n\nfunc (x *FieldOneof) GetIf() string {\n\tif x, ok := x.GetCond().(*FieldOneof_If); ok {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *FieldOneof) GetDefault() bool {\n\tif x, ok := x.GetCond().(*FieldOneof_Default); ok {\n\t\treturn x.Default\n\t}\n\treturn false\n}\n\nfunc (x *FieldOneof) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *FieldOneof) GetBy() string {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\ntype isFieldOneof_Cond interface {\n\tisFieldOneof_Cond()\n}\n\ntype FieldOneof_If struct {\n\t// if describes the condition to be assigned to field.\n\t// The return value must be of type bool.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3,oneof\"`\n}\n\ntype FieldOneof_Default struct {\n\t// default used to assign a value when none of the other fields match any of the specified expressions.\n\t// Only one value can be defined per oneof.\n\tDefault bool `protobuf:\"varint,2,opt,name=default,proto3,oneof\"`\n}\n\nfunc (*FieldOneof_If) isFieldOneof_Cond() {}\n\nfunc (*FieldOneof_Default) isFieldOneof_Cond() {}\n\n// CELPlugin define schema of CEL plugin.\ntype CELPlugin struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tExport []*CELPluginExport `protobuf:\"bytes,1,rep,name=export,proto3\" json:\"export,omitempty\"`\n}\n\nfunc (x *CELPlugin) Reset() {\n\t*x = CELPlugin{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[36]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPlugin) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPlugin) ProtoMessage() {}\n\nfunc (x *CELPlugin) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[36]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPlugin.ProtoReflect.Descriptor instead.\nfunc (*CELPlugin) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{36}\n}\n\nfunc (x *CELPlugin) GetExport() []*CELPluginExport {\n\tif x != nil {\n\t\treturn x.Export\n\t}\n\treturn nil\n}\n\n// CELPluginExport describe the schema to be exposed as a CEL plugin.\ntype CELPluginExport struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the plugin name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// types describe the message type you want to expose.\n\tTypes []*CELReceiverType `protobuf:\"bytes,3,rep,name=types,proto3\" json:\"types,omitempty\"`\n\t// functions describe the definition of the function you want to expose.\n\tFunctions []*CELFunction `protobuf:\"bytes,4,rep,name=functions,proto3\" json:\"functions,omitempty\"`\n\t// variables describe the definition of the variable you want to expose.\n\tVariables  []*CELVariable       `protobuf:\"bytes,5,rep,name=variables,proto3\" json:\"variables,omitempty\"`\n\tCapability *CELPluginCapability `protobuf:\"bytes,6,opt,name=capability,proto3\" json:\"capability,omitempty\"`\n}\n\nfunc (x *CELPluginExport) Reset() {\n\t*x = CELPluginExport{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[37]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginExport) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginExport) ProtoMessage() {}\n\nfunc (x *CELPluginExport) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[37]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginExport.ProtoReflect.Descriptor instead.\nfunc (*CELPluginExport) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{37}\n}\n\nfunc (x *CELPluginExport) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELPluginExport) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELPluginExport) GetTypes() []*CELReceiverType {\n\tif x != nil {\n\t\treturn x.Types\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginExport) GetFunctions() []*CELFunction {\n\tif x != nil {\n\t\treturn x.Functions\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginExport) GetVariables() []*CELVariable {\n\tif x != nil {\n\t\treturn x.Variables\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginExport) GetCapability() *CELPluginCapability {\n\tif x != nil {\n\t\treturn x.Capability\n\t}\n\treturn nil\n}\n\n// CELPluginCapability controls the permissions granted to the WebAssembly plugin.\ntype CELPluginCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// env is the capability for environment variable.\n\tEnv *CELPluginEnvCapability `protobuf:\"bytes,1,opt,name=env,proto3,oneof\" json:\"env,omitempty\"`\n\t// file_system is the capability for file system.\n\tFileSystem *CELPluginFileSystemCapability `protobuf:\"bytes,2,opt,name=file_system,json=fileSystem,proto3,oneof\" json:\"file_system,omitempty\"`\n\t// network is the capability for network.\n\tNetwork *CELPluginNetworkCapability `protobuf:\"bytes,3,opt,name=network,proto3,oneof\" json:\"network,omitempty\"`\n}\n\nfunc (x *CELPluginCapability) Reset() {\n\t*x = CELPluginCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[38]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginCapability) ProtoMessage() {}\n\nfunc (x *CELPluginCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[38]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{38}\n}\n\nfunc (x *CELPluginCapability) GetEnv() *CELPluginEnvCapability {\n\tif x != nil {\n\t\treturn x.Env\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginCapability) GetFileSystem() *CELPluginFileSystemCapability {\n\tif x != nil {\n\t\treturn x.FileSystem\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginCapability) GetNetwork() *CELPluginNetworkCapability {\n\tif x != nil {\n\t\treturn x.Network\n\t}\n\treturn nil\n}\n\n// CELPluginEnvCapability controls access to the environment variable.\ntype CELPluginEnvCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// all allows access to all environment variables.\n\tAll bool `protobuf:\"varint,1,opt,name=all,proto3\" json:\"all,omitempty\"`\n\t// specifies accessible names. If \"all\" is true, it takes precedence.\n\tNames []string `protobuf:\"bytes,2,rep,name=names,proto3\" json:\"names,omitempty\"`\n}\n\nfunc (x *CELPluginEnvCapability) Reset() {\n\t*x = CELPluginEnvCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[39]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginEnvCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginEnvCapability) ProtoMessage() {}\n\nfunc (x *CELPluginEnvCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[39]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginEnvCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginEnvCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{39}\n}\n\nfunc (x *CELPluginEnvCapability) GetAll() bool {\n\tif x != nil {\n\t\treturn x.All\n\t}\n\treturn false\n}\n\nfunc (x *CELPluginEnvCapability) GetNames() []string {\n\tif x != nil {\n\t\treturn x.Names\n\t}\n\treturn nil\n}\n\n// CELPluginFileSystemCapability controls access to the file system.\ntype CELPluginFileSystemCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// mount_path specifies the file path of the host to mount.\n\t// If not specified, the root directory will be used.\n\tMountPath string `protobuf:\"bytes,1,opt,name=mount_path,json=mountPath,proto3\" json:\"mount_path,omitempty\"`\n}\n\nfunc (x *CELPluginFileSystemCapability) Reset() {\n\t*x = CELPluginFileSystemCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[40]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginFileSystemCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginFileSystemCapability) ProtoMessage() {}\n\nfunc (x *CELPluginFileSystemCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[40]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginFileSystemCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginFileSystemCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{40}\n}\n\nfunc (x *CELPluginFileSystemCapability) GetMountPath() string {\n\tif x != nil {\n\t\treturn x.MountPath\n\t}\n\treturn \"\"\n}\n\n// CELPluginNetworkCapability sets permissions related to network access.\n// This is an experimental feature.\ntype CELPluginNetworkCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *CELPluginNetworkCapability) Reset() {\n\t*x = CELPluginNetworkCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[41]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginNetworkCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginNetworkCapability) ProtoMessage() {}\n\nfunc (x *CELPluginNetworkCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[41]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginNetworkCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginNetworkCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{41}\n}\n\n// CELFunction represents the CEL function definition.\ntype CELFunction struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the function name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of function.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// args describe the definition of the function argument.\n\tArgs []*CELFunctionArgument `protobuf:\"bytes,3,rep,name=args,proto3\" json:\"args,omitempty\"`\n\t// return describe the definition of return type of function.\n\tReturn *CELType `protobuf:\"bytes,4,opt,name=return,proto3\" json:\"return,omitempty\"`\n}\n\nfunc (x *CELFunction) Reset() {\n\t*x = CELFunction{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[42]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELFunction) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELFunction) ProtoMessage() {}\n\nfunc (x *CELFunction) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[42]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELFunction.ProtoReflect.Descriptor instead.\nfunc (*CELFunction) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{42}\n}\n\nfunc (x *CELFunction) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunction) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunction) GetArgs() []*CELFunctionArgument {\n\tif x != nil {\n\t\treturn x.Args\n\t}\n\treturn nil\n}\n\nfunc (x *CELFunction) GetReturn() *CELType {\n\tif x != nil {\n\t\treturn x.Return\n\t}\n\treturn nil\n}\n\n// CELReceiverType represents methods tied to the message.\ntype CELReceiverType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the message name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// methods describe the definition of the method for the message.\n\tMethods []*CELFunction `protobuf:\"bytes,3,rep,name=methods,proto3\" json:\"methods,omitempty\"`\n}\n\nfunc (x *CELReceiverType) Reset() {\n\t*x = CELReceiverType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[43]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELReceiverType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELReceiverType) ProtoMessage() {}\n\nfunc (x *CELReceiverType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[43]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELReceiverType.ProtoReflect.Descriptor instead.\nfunc (*CELReceiverType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{43}\n}\n\nfunc (x *CELReceiverType) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELReceiverType) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELReceiverType) GetMethods() []*CELFunction {\n\tif x != nil {\n\t\treturn x.Methods\n\t}\n\treturn nil\n}\n\n// CELFunctionArgument represents the function argument.\ntype CELFunctionArgument struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the argument value name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// type is the argument type.\n\tType *CELType `protobuf:\"bytes,3,opt,name=type,proto3\" json:\"type,omitempty\"`\n}\n\nfunc (x *CELFunctionArgument) Reset() {\n\t*x = CELFunctionArgument{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[44]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELFunctionArgument) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELFunctionArgument) ProtoMessage() {}\n\nfunc (x *CELFunctionArgument) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[44]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELFunctionArgument.ProtoReflect.Descriptor instead.\nfunc (*CELFunctionArgument) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{44}\n}\n\nfunc (x *CELFunctionArgument) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunctionArgument) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunctionArgument) GetType() *CELType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\n// CELType represents type information for CEL plugin interface.\ntype CELType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to Type:\n\t//\n\t//\t*CELType_Kind\n\t//\t*CELType_Repeated\n\t//\t*CELType_Map\n\t//\t*CELType_Message\n\t//\t*CELType_Enum\n\tType isCELType_Type `protobuf_oneof:\"type\"`\n}\n\nfunc (x *CELType) Reset() {\n\t*x = CELType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[45]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELType) ProtoMessage() {}\n\nfunc (x *CELType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[45]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELType.ProtoReflect.Descriptor instead.\nfunc (*CELType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{45}\n}\n\nfunc (m *CELType) GetType() isCELType_Type {\n\tif m != nil {\n\t\treturn m.Type\n\t}\n\treturn nil\n}\n\nfunc (x *CELType) GetKind() TypeKind {\n\tif x, ok := x.GetType().(*CELType_Kind); ok {\n\t\treturn x.Kind\n\t}\n\treturn TypeKind_UNKNOWN\n}\n\nfunc (x *CELType) GetRepeated() *CELType {\n\tif x, ok := x.GetType().(*CELType_Repeated); ok {\n\t\treturn x.Repeated\n\t}\n\treturn nil\n}\n\nfunc (x *CELType) GetMap() *CELMapType {\n\tif x, ok := x.GetType().(*CELType_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\nfunc (x *CELType) GetMessage() string {\n\tif x, ok := x.GetType().(*CELType_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELType) GetEnum() string {\n\tif x, ok := x.GetType().(*CELType_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn \"\"\n}\n\ntype isCELType_Type interface {\n\tisCELType_Type()\n}\n\ntype CELType_Kind struct {\n\t// kind is used when the type is a primitive type.\n\tKind TypeKind `protobuf:\"varint,1,opt,name=kind,proto3,enum=grpc.federation.TypeKind,oneof\"`\n}\n\ntype CELType_Repeated struct {\n\t// repeated is used when the type is a repeated type.\n\tRepeated *CELType `protobuf:\"bytes,2,opt,name=repeated,proto3,oneof\"`\n}\n\ntype CELType_Map struct {\n\t// map is used when the type is a map type.\n\tMap *CELMapType `protobuf:\"bytes,3,opt,name=map,proto3,oneof\"`\n}\n\ntype CELType_Message struct {\n\t// message is a fqdn to the message type.\n\tMessage string `protobuf:\"bytes,4,opt,name=message,proto3,oneof\"`\n}\n\ntype CELType_Enum struct {\n\t// enum is a fqdn to the enum type.\n\tEnum string `protobuf:\"bytes,5,opt,name=enum,proto3,oneof\"`\n}\n\nfunc (*CELType_Kind) isCELType_Type() {}\n\nfunc (*CELType_Repeated) isCELType_Type() {}\n\nfunc (*CELType_Map) isCELType_Type() {}\n\nfunc (*CELType_Message) isCELType_Type() {}\n\nfunc (*CELType_Enum) isCELType_Type() {}\n\n// CELMapType represents map type.\ntype CELMapType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// key represents map's key type.\n\tKey *CELType `protobuf:\"bytes,1,opt,name=key,proto3\" json:\"key,omitempty\"`\n\t// value represents map's value type.\n\tValue *CELType `protobuf:\"bytes,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *CELMapType) Reset() {\n\t*x = CELMapType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[46]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELMapType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELMapType) ProtoMessage() {}\n\nfunc (x *CELMapType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[46]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELMapType.ProtoReflect.Descriptor instead.\nfunc (*CELMapType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{46}\n}\n\nfunc (x *CELMapType) GetKey() *CELType {\n\tif x != nil {\n\t\treturn x.Key\n\t}\n\treturn nil\n}\n\nfunc (x *CELMapType) GetValue() *CELType {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn nil\n}\n\n// CELVariable represents CEL variable.\ntype CELVariable struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the variable name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// type is the variable type.\n\tType *CELType `protobuf:\"bytes,3,opt,name=type,proto3\" json:\"type,omitempty\"`\n}\n\nfunc (x *CELVariable) Reset() {\n\t*x = CELVariable{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[47]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELVariable) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELVariable) ProtoMessage() {}\n\nfunc (x *CELVariable) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[47]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELVariable.ProtoReflect.Descriptor instead.\nfunc (*CELVariable) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{47}\n}\n\nfunc (x *CELVariable) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELVariable) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELVariable) GetType() *CELType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nvar file_grpc_federation_federation_proto_extTypes = []protoimpl.ExtensionInfo{\n\t{\n\t\tExtendedType:  (*descriptorpb.FileOptions)(nil),\n\t\tExtensionType: (*FileRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.file\",\n\t\tTag:           \"bytes,1187,opt,name=file\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*ServiceRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.service\",\n\t\tTag:           \"bytes,1187,opt,name=service\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*MethodRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.method\",\n\t\tTag:           \"bytes,1187,opt,name=method\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MessageOptions)(nil),\n\t\tExtensionType: (*MessageRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.message\",\n\t\tTag:           \"bytes,1187,opt,name=message\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*FieldRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.field\",\n\t\tTag:           \"bytes,1187,opt,name=field\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.EnumOptions)(nil),\n\t\tExtensionType: (*EnumRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.enum\",\n\t\tTag:           \"bytes,1187,opt,name=enum\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.EnumValueOptions)(nil),\n\t\tExtensionType: (*EnumValueRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.enum_value\",\n\t\tTag:           \"bytes,1187,opt,name=enum_value\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.OneofOptions)(nil),\n\t\tExtensionType: (*OneofRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.oneof\",\n\t\tTag:           \"bytes,1187,opt,name=oneof\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n}\n\n// Extension fields to descriptorpb.FileOptions.\nvar (\n\t// optional grpc.federation.FileRule file = 1187;\n\tE_File = &file_grpc_federation_federation_proto_extTypes[0]\n)\n\n// Extension fields to descriptorpb.ServiceOptions.\nvar (\n\t// optional grpc.federation.ServiceRule service = 1187;\n\tE_Service = &file_grpc_federation_federation_proto_extTypes[1]\n)\n\n// Extension fields to descriptorpb.MethodOptions.\nvar (\n\t// optional grpc.federation.MethodRule method = 1187;\n\tE_Method = &file_grpc_federation_federation_proto_extTypes[2]\n)\n\n// Extension fields to descriptorpb.MessageOptions.\nvar (\n\t// optional grpc.federation.MessageRule message = 1187;\n\tE_Message = &file_grpc_federation_federation_proto_extTypes[3]\n)\n\n// Extension fields to descriptorpb.FieldOptions.\nvar (\n\t// optional grpc.federation.FieldRule field = 1187;\n\tE_Field = &file_grpc_federation_federation_proto_extTypes[4]\n)\n\n// Extension fields to descriptorpb.EnumOptions.\nvar (\n\t// optional grpc.federation.EnumRule enum = 1187;\n\tE_Enum = &file_grpc_federation_federation_proto_extTypes[5]\n)\n\n// Extension fields to descriptorpb.EnumValueOptions.\nvar (\n\t// optional grpc.federation.EnumValueRule enum_value = 1187;\n\tE_EnumValue = &file_grpc_federation_federation_proto_extTypes[6]\n)\n\n// Extension fields to descriptorpb.OneofOptions.\nvar (\n\t// optional grpc.federation.OneofRule oneof = 1187;\n\tE_Oneof = &file_grpc_federation_federation_proto_extTypes[7]\n)\n\nvar File_grpc_federation_federation_proto protoreflect.FileDescriptor\n\nvar file_grpc_federation_federation_proto_rawDesc = []byte{\n\t0x0a, 0x20, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x12, 0x0f, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70,\n\t0x63, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x64,\n\t0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x67, 0x72,\n\t0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x70, 0x72,\n\t0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x67, 0x72, 0x70,\n\t0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x74, 0x69, 0x6d,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x56, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x52,\n\t0x75, 0x6c, 0x65, 0x12, 0x32, 0x0a, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52,\n\t0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6d, 0x70, 0x6f, 0x72,\n\t0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x22,\n\t0x20, 0x0a, 0x08, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61,\n\t0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61,\n\t0x73, 0x22, 0xb4, 0x01, 0x0a, 0x0d, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52,\n\t0x75, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x88,\n\t0x01, 0x01, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,\n\t0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x37, 0x0a, 0x04, 0x61, 0x74, 0x74, 0x72,\n\t0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c,\n\t0x75, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, 0x04, 0x61, 0x74, 0x74,\n\t0x72, 0x12, 0x1d, 0x0a, 0x07, 0x6e, 0x6f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x04, 0x20, 0x01,\n\t0x28, 0x08, 0x48, 0x01, 0x52, 0x07, 0x6e, 0x6f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x88, 0x01, 0x01,\n\t0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x42, 0x0a, 0x0a, 0x08,\n\t0x5f, 0x6e, 0x6f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x3e, 0x0a, 0x12, 0x45, 0x6e, 0x75, 0x6d,\n\t0x56, 0x61, 0x6c, 0x75, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x12, 0x12,\n\t0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x0b, 0x0a, 0x09, 0x4f, 0x6e, 0x65, 0x6f,\n\t0x66, 0x52, 0x75, 0x6c, 0x65, 0x22, 0x69, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n\t0x52, 0x75, 0x6c, 0x65, 0x12, 0x26, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x14, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x32, 0x0a, 0x03,\n\t0x76, 0x61, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x03, 0x76, 0x61, 0x72,\n\t0x22, 0x4a, 0x0a, 0x03, 0x45, 0x6e, 0x76, 0x12, 0x29, 0x0a, 0x03, 0x76, 0x61, 0x72, 0x18, 0x01,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x52, 0x03, 0x76,\n\t0x61, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x8b, 0x03, 0x0a,\n\t0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65,\n\t0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01,\n\t0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x66, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x02, 0x69, 0x66, 0x88, 0x01, 0x01, 0x12, 0x10,\n\t0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x62, 0x79,\n\t0x12, 0x2c, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x4d, 0x61, 0x70, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x70, 0x12, 0x38,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52,\n\t0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x50, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x69,\n\t0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x61,\n\t0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x0a,\n\t0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x04, 0x65, 0x6e,\n\t0x75, 0x6d, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x45,\n\t0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x35, 0x0a, 0x06, 0x73,\n\t0x77, 0x69, 0x74, 0x63, 0x68, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x77,\n\t0x69, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x06, 0x73, 0x77, 0x69, 0x74,\n\t0x63, 0x68, 0x42, 0x06, 0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e,\n\t0x61, 0x6d, 0x65, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x66, 0x22, 0x49, 0x0a, 0x1d, 0x53, 0x65,\n\t0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c,\n\t0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69,\n\t0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x66, 0x12, 0x18, 0x0a, 0x07, 0x6d,\n\t0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65,\n\t0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x06, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72,\n\t0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79,\n\t0x70, 0x65, 0x12, 0x3a, 0x0a, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x48, 0x00, 0x52, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x09,\n\t0x0a, 0x07, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xab, 0x01, 0x0a, 0x07, 0x45, 0x6e,\n\t0x76, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2f, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x00,\n\t0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x36, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74,\n\t0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79,\n\t0x70, 0x65, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2f,\n\t0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e,\n\t0x76, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x70, 0x42,\n\t0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x68, 0x0a, 0x0a, 0x45, 0x6e, 0x76, 0x4d, 0x61,\n\t0x70, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2a, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79, 0x70, 0x65, 0x52, 0x03, 0x6b, 0x65,\n\t0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,\n\t0x65, 0x22, 0xc3, 0x01, 0x0a, 0x0c, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x09, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61,\n\t0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c,\n\t0x74, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72,\n\t0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64,\n\t0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x07, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65,\n\t0x64, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61,\n\t0x74, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x42, 0x0b,\n\t0x0a, 0x09, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x5f,\n\t0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x22, 0x65, 0x0a, 0x0a, 0x4d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75,\n\t0x74, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e,\n\t0x73, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75,\n\t0x74, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9c,\n\t0x01, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x35,\n\t0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61,\n\t0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e,\n\t0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f,\n\t0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00,\n\t0x52, 0x0e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72,\n\t0x88, 0x01, 0x01, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x03, 0x20, 0x03,\n\t0x28, 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x75,\n\t0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x22, 0xde, 0x03,\n\t0x0a, 0x12, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69,\n\t0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x48, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x13, 0x0a,\n\t0x02, 0x69, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x02, 0x69, 0x66, 0x88,\n\t0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x18, 0x03,\n\t0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64,\n\t0x88, 0x01, 0x01, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48,\n\t0x00, 0x52, 0x02, 0x62, 0x79, 0x12, 0x2c, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x0c, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x61, 0x70, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x03,\n\t0x6d, 0x61, 0x70, 0x12, 0x38, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0d,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78,\n\t0x70, 0x72, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2f, 0x0a,\n\t0x04, 0x63, 0x61, 0x6c, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x61,\n\t0x6c, 0x6c, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x63, 0x61, 0x6c, 0x6c, 0x12, 0x41,\n\t0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45,\n\t0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x12, 0x2f, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e,\n\t0x75, 0x6d, 0x12, 0x35, 0x0a, 0x06, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x18, 0x11, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x48,\n\t0x00, 0x52, 0x06, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x42, 0x06, 0x0a, 0x04, 0x65, 0x78, 0x70,\n\t0x72, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69,\n\t0x66, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x22, 0xc5,\n\t0x01, 0x0a, 0x07, 0x4d, 0x61, 0x70, 0x45, 0x78, 0x70, 0x72, 0x12, 0x35, 0x0a, 0x08, 0x69, 0x74,\n\t0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49,\n\t0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f,\n\t0x72, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,\n\t0x02, 0x62, 0x79, 0x12, 0x38, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0c,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78,\n\t0x70, 0x72, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2f, 0x0a,\n\t0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e,\n\t0x75, 0x6d, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x42, 0x06,\n\t0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x22, 0x30, 0x0a, 0x08, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74,\n\t0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x72, 0x63, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x72, 0x63, 0x22, 0x50, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x45, 0x78, 0x70, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x04, 0x61,\n\t0x72, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x41, 0x72, 0x67, 0x75,\n\t0x6d, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x22, 0x2e, 0x0a, 0x08, 0x45, 0x6e,\n\t0x75, 0x6d, 0x45, 0x78, 0x70, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x62, 0x79,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x62, 0x79, 0x22, 0xf3, 0x02, 0x0a, 0x08, 0x43,\n\t0x61, 0x6c, 0x6c, 0x45, 0x78, 0x70, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12,\n\t0x38, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x07, 0x74, 0x69, 0x6d,\n\t0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x74, 0x69,\n\t0x6d, 0x65, 0x6f, 0x75, 0x74, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x05, 0x72, 0x65, 0x74, 0x72,\n\t0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50,\n\t0x6f, 0x6c, 0x69, 0x63, 0x79, 0x48, 0x01, 0x52, 0x05, 0x72, 0x65, 0x74, 0x72, 0x79, 0x88, 0x01,\n\t0x01, 0x12, 0x30, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72,\n\t0x72, 0x6f, 0x72, 0x12, 0x3c, 0x0a, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x43, 0x61, 0x6c, 0x6c, 0x4f, 0x70,\n\t0x74, 0x69, 0x6f, 0x6e, 0x48, 0x02, 0x52, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01,\n\t0x01, 0x12, 0x1f, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20,\n\t0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x88,\n\t0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x42, 0x08,\n\t0x0a, 0x06, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x79, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,\n\t0x22, 0x7f, 0x0a, 0x0a, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x12, 0x33,\n\t0x0a, 0x04, 0x63, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53,\n\t0x77, 0x69, 0x74, 0x63, 0x68, 0x43, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x72, 0x52, 0x04, 0x63,\n\t0x61, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x44, 0x65, 0x66,\n\t0x61, 0x75, 0x6c, 0x74, 0x45, 0x78, 0x70, 0x72, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c,\n\t0x74, 0x22, 0x71, 0x0a, 0x0e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x43, 0x61, 0x73, 0x65, 0x45,\n\t0x78, 0x70, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x02, 0x69, 0x66, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e,\n\t0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x79,\n\t0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x62, 0x79, 0x42, 0x06, 0x0a, 0x04,\n\t0x65, 0x78, 0x70, 0x72, 0x22, 0x64, 0x0a, 0x11, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x44, 0x65,\n\t0x66, 0x61, 0x75, 0x6c, 0x74, 0x45, 0x78, 0x70, 0x72, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66,\n\t0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c,\n\t0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66,\n\t0x12, 0x10, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02,\n\t0x62, 0x79, 0x42, 0x06, 0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x22, 0x86, 0x04, 0x0a, 0x09, 0x47,\n\t0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18,\n\t0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65,\n\t0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12,\n\t0x13, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x69,\n\t0x66, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x0e, 0x32, 0x10, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e,\n\t0x43, 0x6f, 0x64, 0x65, 0x48, 0x01, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12,\n\t0x1d, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,\n\t0x48, 0x02, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a,\n\t0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x20, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69,\n\t0x6c, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x69, 0x67,\n\t0x6e, 0x6f, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x06, 0x69, 0x67,\n\t0x6e, 0x6f, 0x72, 0x65, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x67, 0x6e, 0x6f, 0x72,\n\t0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x07,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x11, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x41, 0x6e,\n\t0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x88, 0x01, 0x01, 0x12, 0x45, 0x0a, 0x09,\n\t0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32,\n\t0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x4c, 0x6f, 0x67, 0x4c,\n\t0x65, 0x76, 0x65, 0x6c, 0x48, 0x05, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c,\n\t0x88, 0x01, 0x01, 0x22, 0x41, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12,\n\t0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05,\n\t0x44, 0x45, 0x42, 0x55, 0x47, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x4e, 0x46, 0x4f, 0x10,\n\t0x02, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x41, 0x52, 0x4e, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x45,\n\t0x52, 0x52, 0x4f, 0x52, 0x10, 0x04, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x66, 0x42, 0x07, 0x0a,\n\t0x05, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61,\n\t0x67, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x42, 0x16, 0x0a,\n\t0x14, 0x5f, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x72, 0x65, 0x73,\n\t0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65,\n\t0x76, 0x65, 0x6c, 0x22, 0xfa, 0x05, 0x0a, 0x0f, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f,\n\t0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x66, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x02,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44,\n\t0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x36,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78, 0x70, 0x72, 0x52, 0x07, 0x6d,\n\t0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f,\n\t0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66,\n\t0x6f, 0x52, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x34, 0x0a, 0x0a,\n\t0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65,\n\t0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x72, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e,\n\t0x66, 0x6f, 0x12, 0x34, 0x0a, 0x0a, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x69, 0x6e, 0x66, 0x6f,\n\t0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x64,\n\t0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3d, 0x0a, 0x0d, 0x71, 0x75, 0x6f, 0x74,\n\t0x61, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x6f,\n\t0x74, 0x61, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x0c, 0x71, 0x75, 0x6f, 0x74, 0x61,\n\t0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x52, 0x0a, 0x14, 0x70, 0x72, 0x65, 0x63, 0x6f,\n\t0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18,\n\t0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72,\n\t0x70, 0x63, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x46,\n\t0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x13, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69,\n\t0x74, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x62,\n\t0x61, 0x64, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61,\n\t0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x62, 0x61, 0x64, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f,\n\t0x69, 0x6e, 0x66, 0x6f, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49,\n\t0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f,\n\t0x12, 0x3d, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66,\n\t0x6f, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66,\n\t0x6f, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12,\n\t0x24, 0x0a, 0x04, 0x68, 0x65, 0x6c, 0x70, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x48, 0x65, 0x6c, 0x70, 0x52,\n\t0x04, 0x68, 0x65, 0x6c, 0x70, 0x12, 0x49, 0x0a, 0x11, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a,\n\t0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f,\n\t0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x10,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,\n\t0x12, 0x0e, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x02, 0x62, 0x79,\n\t0x22, 0xc7, 0x03, 0x0a, 0x0e, 0x47, 0x52, 0x50, 0x43, 0x43, 0x61, 0x6c, 0x6c, 0x4f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x73,\n\t0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0e,\n\t0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x88, 0x01,\n\t0x01, 0x12, 0x1b, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x48, 0x01, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x37,\n\t0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x72, 0x65, 0x63, 0x76, 0x5f,\n\t0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02,\n\t0x52, 0x12, 0x6d, 0x61, 0x78, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x63, 0x76, 0x4d, 0x73, 0x67,\n\t0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x63,\n\t0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a,\n\t0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x43, 0x61,\n\t0x6c, 0x6c, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01,\n\t0x12, 0x28, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x48, 0x04, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x69,\n\t0x63, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x74, 0x72,\n\t0x61, 0x69, 0x6c, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x07, 0x74,\n\t0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x0e, 0x77, 0x61, 0x69,\n\t0x74, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28,\n\t0x08, 0x48, 0x06, 0x52, 0x0c, 0x77, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x52, 0x65, 0x61, 0x64,\n\t0x79, 0x88, 0x01, 0x01, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,\n\t0x5f, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x68, 0x65, 0x61,\n\t0x64, 0x65, 0x72, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c,\n\t0x5f, 0x72, 0x65, 0x63, 0x76, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x19,\n\t0x0a, 0x17, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x65, 0x6e, 0x64,\n\t0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x74,\n\t0x61, 0x74, 0x69, 0x63, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x5f,\n\t0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x77, 0x61, 0x69, 0x74,\n\t0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x22, 0x64, 0x0a, 0x0e, 0x56, 0x61,\n\t0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72, 0x12, 0x17, 0x0a, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72,\n\t0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65,\n\t0x22, 0xb8, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,\n\t0x12, 0x42, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,\n\t0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x73,\n\t0x74, 0x61, 0x6e, 0x74, 0x12, 0x4b, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74,\n\t0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x72,\n\t0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x69,\n\t0x61, 0x6c, 0x48, 0x00, 0x52, 0x0b, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x69, 0x61,\n\t0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,\n\t0x66, 0x42, 0x08, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x79, 0x0a, 0x13, 0x52,\n\t0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61,\n\t0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c,\n\t0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69,\n\t0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, 0x01, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x52,\n\t0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x69, 0x6e,\n\t0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x72,\n\t0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0xd1, 0x02, 0x0a, 0x16, 0x52, 0x65, 0x74, 0x72, 0x79,\n\t0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x69, 0x61,\n\t0x6c, 0x12, 0x2e, 0x0a, 0x10, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x74,\n\t0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0f, 0x69,\n\t0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x88, 0x01,\n\t0x01, 0x12, 0x36, 0x0a, 0x14, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x48,\n\t0x01, 0x52, 0x13, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0a, 0x6d, 0x75, 0x6c,\n\t0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x48, 0x02, 0x52,\n\t0x0a, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x26,\n\t0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x04,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x49, 0x6e, 0x74, 0x65, 0x72,\n\t0x76, 0x61, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65,\n\t0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x48, 0x04, 0x52, 0x0a, 0x6d,\n\t0x61, 0x78, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x42, 0x13, 0x0a, 0x11,\n\t0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61,\n\t0x6c, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x6d,\n\t0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6d, 0x61,\n\t0x78, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d,\n\t0x61, 0x78, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x5d, 0x0a, 0x0d, 0x4d, 0x65,\n\t0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x66,\n\t0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c,\n\t0x64, 0x12, 0x13, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,\n\t0x02, 0x62, 0x79, 0x88, 0x01, 0x01, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x48, 0x01, 0x52, 0x02, 0x69, 0x66, 0x88, 0x01, 0x01, 0x42, 0x05, 0x0a, 0x03, 0x5f,\n\t0x62, 0x79, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x66, 0x22, 0x85, 0x01, 0x0a, 0x0e, 0x4d, 0x65,\n\t0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x17, 0x0a, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x88, 0x01, 0x01,\n\t0x12, 0x1f, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x08, 0x48, 0x02, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x88, 0x01,\n\t0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x66,\n\t0x69, 0x65, 0x6c, 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e,\n\t0x64, 0x22, 0x62, 0x0a, 0x08, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x12, 0x13, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,\n\t0x02, 0x62, 0x79, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x06, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65,\n\t0x88, 0x01, 0x01, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x62, 0x79, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x69,\n\t0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0xf2, 0x01, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52,\n\t0x75, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65,\n\t0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0e,\n\t0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x88, 0x01,\n\t0x01, 0x12, 0x13, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52,\n\t0x02, 0x62, 0x79, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x88, 0x01,\n\t0x01, 0x12, 0x31, 0x0a, 0x05, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x52, 0x05, 0x6f,\n\t0x6e, 0x65, 0x6f, 0x66, 0x12, 0x2f, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x05, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x52, 0x03, 0x65, 0x6e, 0x76, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d,\n\t0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x62, 0x79,\n\t0x42, 0x08, 0x0a, 0x06, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x89, 0x01, 0x0a, 0x0a, 0x46,\n\t0x69, 0x65, 0x6c, 0x64, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x12, 0x10, 0x0a, 0x02, 0x69, 0x66, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x69, 0x66, 0x12, 0x1a, 0x0a, 0x07, 0x64,\n\t0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x07,\n\t0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x03,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44,\n\t0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x0e,\n\t0x0a, 0x02, 0x62, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x62, 0x79, 0x42, 0x06,\n\t0x0a, 0x04, 0x63, 0x6f, 0x6e, 0x64, 0x22, 0x45, 0x0a, 0x09, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75,\n\t0x67, 0x69, 0x6e, 0x12, 0x38, 0x0a, 0x06, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20,\n\t0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x45,\n\t0x78, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x06, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x22, 0xaf, 0x02,\n\t0x0a, 0x0f, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x45, 0x78, 0x70, 0x6f, 0x72,\n\t0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x36, 0x0a, 0x05, 0x74, 0x79, 0x70,\n\t0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x52, 0x65,\n\t0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x74, 0x79, 0x70, 0x65,\n\t0x73, 0x12, 0x3a, 0x0a, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69,\n\t0x6f, 0x6e, 0x52, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3a, 0x0a,\n\t0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x09,\n\t0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x44, 0x0a, 0x0a, 0x63, 0x61, 0x70,\n\t0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c,\n\t0x69, 0x74, 0x79, 0x52, 0x0a, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22,\n\t0x9b, 0x02, 0x0a, 0x13, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x70,\n\t0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x3e, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e,\n\t0x45, 0x6e, 0x76, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x48, 0x00, 0x52,\n\t0x03, 0x65, 0x6e, 0x76, 0x88, 0x01, 0x01, 0x12, 0x54, 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x65, 0x5f,\n\t0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43,\n\t0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x73, 0x74,\n\t0x65, 0x6d, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x48, 0x01, 0x52, 0x0a,\n\t0x66, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x4a, 0x0a,\n\t0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b,\n\t0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72,\n\t0x6b, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x48, 0x02, 0x52, 0x07, 0x6e,\n\t0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x88, 0x01, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x65, 0x6e,\n\t0x76, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65,\n\t0x6d, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x40, 0x0a,\n\t0x16, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x45, 0x6e, 0x76, 0x43, 0x61, 0x70,\n\t0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d,\n\t0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22,\n\t0x3e, 0x0a, 0x1d, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65,\n\t0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79,\n\t0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 0x74, 0x68, 0x22,\n\t0x1c, 0x0a, 0x1a, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x4e, 0x65, 0x74, 0x77,\n\t0x6f, 0x72, 0x6b, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22, 0xa1, 0x01,\n\t0x0a, 0x0b, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x38, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x03, 0x20,\n\t0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,\n\t0x6e, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12,\n\t0x30, 0x0a, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72,\n\t0x6e, 0x22, 0x71, 0x0a, 0x0f, 0x43, 0x45, 0x4c, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72,\n\t0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x36, 0x0a, 0x07,\n\t0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x6d, 0x65, 0x74,\n\t0x68, 0x6f, 0x64, 0x73, 0x22, 0x6b, 0x0a, 0x13, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74,\n\t0x69, 0x6f, 0x6e, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,\n\t0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64,\n\t0x65, 0x73, 0x63, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70,\n\t0x65, 0x22, 0xdd, 0x01, 0x0a, 0x07, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2f, 0x0a,\n\t0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x79,\n\t0x70, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x36,\n\t0x0a, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65,\n\t0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2f, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65,\n\t0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x70, 0x12, 0x1a, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61,\n\t0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28,\n\t0x09, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70,\n\t0x65, 0x22, 0x68, 0x0a, 0x0a, 0x43, 0x45, 0x4c, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65, 0x12,\n\t0x2a, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43,\n\t0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76,\n\t0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70,\n\t0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c,\n\t0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x63, 0x0a, 0x0b, 0x43,\n\t0x45, 0x4c, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12,\n\t0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65,\n\t0x73, 0x63, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65,\n\t0x2a, 0x5e, 0x0a, 0x08, 0x54, 0x79, 0x70, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x0b, 0x0a, 0x07,\n\t0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52,\n\t0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x4f, 0x4f, 0x4c, 0x10, 0x02, 0x12,\n\t0x09, 0x0a, 0x05, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x49,\n\t0x4e, 0x54, 0x36, 0x34, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45,\n\t0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x06,\n\t0x3a, 0x4c, 0x0a, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x46, 0x69, 0x6c, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x3a, 0x58,\n\t0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52,\n\t0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x3a, 0x54, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a, 0x58,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52,\n\t0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x50, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c,\n\t0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52,\n\t0x75, 0x6c, 0x65, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x3a, 0x4c, 0x0a, 0x04, 0x65, 0x6e,\n\t0x75, 0x6d, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x75,\n\t0x6c, 0x65, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x3a, 0x61, 0x0a, 0x0a, 0x65, 0x6e, 0x75, 0x6d,\n\t0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c,\n\t0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x1e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x75, 0x6c, 0x65,\n\t0x52, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x50, 0x0a, 0x05, 0x6f,\n\t0x6e, 0x65, 0x6f, 0x66, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70,\n\t0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x6e, 0x65,\n\t0x6f, 0x66, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x42, 0xc2, 0x01,\n\t0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0f, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,\n\t0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x65, 0x72, 0x63, 0x61, 0x72, 0x69, 0x2f, 0x67, 0x72, 0x70,\n\t0x63, 0x2d, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x67, 0x72, 0x70,\n\t0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xa2, 0x02, 0x03, 0x47, 0x46, 0x58, 0xaa, 0x02, 0x0f,\n\t0x47, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xca,\n\t0x02, 0x0f, 0x47, 0x72, 0x70, 0x63, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0xe2, 0x02, 0x1b, 0x47, 0x72, 0x70, 0x63, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea,\n\t0x02, 0x10, 0x47, 0x72, 0x70, 0x63, 0x3a, 0x3a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_grpc_federation_federation_proto_rawDescOnce sync.Once\n\tfile_grpc_federation_federation_proto_rawDescData = file_grpc_federation_federation_proto_rawDesc\n)\n\nfunc file_grpc_federation_federation_proto_rawDescGZIP() []byte {\n\tfile_grpc_federation_federation_proto_rawDescOnce.Do(func() {\n\t\tfile_grpc_federation_federation_proto_rawDescData = protoimpl.X.CompressGZIP(file_grpc_federation_federation_proto_rawDescData)\n\t})\n\treturn file_grpc_federation_federation_proto_rawDescData\n}\n\nvar file_grpc_federation_federation_proto_enumTypes = make([]protoimpl.EnumInfo, 2)\nvar file_grpc_federation_federation_proto_msgTypes = make([]protoimpl.MessageInfo, 48)\nvar file_grpc_federation_federation_proto_goTypes = []interface{}{\n\t(TypeKind)(0),                          // 0: grpc.federation.TypeKind\n\t(GRPCError_LogLevel)(0),                // 1: grpc.federation.GRPCError.LogLevel\n\t(*FileRule)(nil),                       // 2: grpc.federation.FileRule\n\t(*EnumRule)(nil),                       // 3: grpc.federation.EnumRule\n\t(*EnumValueRule)(nil),                  // 4: grpc.federation.EnumValueRule\n\t(*EnumValueAttribute)(nil),             // 5: grpc.federation.EnumValueAttribute\n\t(*OneofRule)(nil),                      // 6: grpc.federation.OneofRule\n\t(*ServiceRule)(nil),                    // 7: grpc.federation.ServiceRule\n\t(*Env)(nil),                            // 8: grpc.federation.Env\n\t(*ServiceVariable)(nil),                // 9: grpc.federation.ServiceVariable\n\t(*ServiceVariableValidationExpr)(nil),  // 10: grpc.federation.ServiceVariableValidationExpr\n\t(*EnvVar)(nil),                         // 11: grpc.federation.EnvVar\n\t(*EnvType)(nil),                        // 12: grpc.federation.EnvType\n\t(*EnvMapType)(nil),                     // 13: grpc.federation.EnvMapType\n\t(*EnvVarOption)(nil),                   // 14: grpc.federation.EnvVarOption\n\t(*MethodRule)(nil),                     // 15: grpc.federation.MethodRule\n\t(*MessageRule)(nil),                    // 16: grpc.federation.MessageRule\n\t(*VariableDefinition)(nil),             // 17: grpc.federation.VariableDefinition\n\t(*MapExpr)(nil),                        // 18: grpc.federation.MapExpr\n\t(*Iterator)(nil),                       // 19: grpc.federation.Iterator\n\t(*MessageExpr)(nil),                    // 20: grpc.federation.MessageExpr\n\t(*EnumExpr)(nil),                       // 21: grpc.federation.EnumExpr\n\t(*CallExpr)(nil),                       // 22: grpc.federation.CallExpr\n\t(*SwitchExpr)(nil),                     // 23: grpc.federation.SwitchExpr\n\t(*SwitchCaseExpr)(nil),                 // 24: grpc.federation.SwitchCaseExpr\n\t(*SwitchDefaultExpr)(nil),              // 25: grpc.federation.SwitchDefaultExpr\n\t(*GRPCError)(nil),                      // 26: grpc.federation.GRPCError\n\t(*GRPCErrorDetail)(nil),                // 27: grpc.federation.GRPCErrorDetail\n\t(*GRPCCallOption)(nil),                 // 28: grpc.federation.GRPCCallOption\n\t(*ValidationExpr)(nil),                 // 29: grpc.federation.ValidationExpr\n\t(*RetryPolicy)(nil),                    // 30: grpc.federation.RetryPolicy\n\t(*RetryPolicyConstant)(nil),            // 31: grpc.federation.RetryPolicyConstant\n\t(*RetryPolicyExponential)(nil),         // 32: grpc.federation.RetryPolicyExponential\n\t(*MethodRequest)(nil),                  // 33: grpc.federation.MethodRequest\n\t(*MethodResponse)(nil),                 // 34: grpc.federation.MethodResponse\n\t(*Argument)(nil),                       // 35: grpc.federation.Argument\n\t(*FieldRule)(nil),                      // 36: grpc.federation.FieldRule\n\t(*FieldOneof)(nil),                     // 37: grpc.federation.FieldOneof\n\t(*CELPlugin)(nil),                      // 38: grpc.federation.CELPlugin\n\t(*CELPluginExport)(nil),                // 39: grpc.federation.CELPluginExport\n\t(*CELPluginCapability)(nil),            // 40: grpc.federation.CELPluginCapability\n\t(*CELPluginEnvCapability)(nil),         // 41: grpc.federation.CELPluginEnvCapability\n\t(*CELPluginFileSystemCapability)(nil),  // 42: grpc.federation.CELPluginFileSystemCapability\n\t(*CELPluginNetworkCapability)(nil),     // 43: grpc.federation.CELPluginNetworkCapability\n\t(*CELFunction)(nil),                    // 44: grpc.federation.CELFunction\n\t(*CELReceiverType)(nil),                // 45: grpc.federation.CELReceiverType\n\t(*CELFunctionArgument)(nil),            // 46: grpc.federation.CELFunctionArgument\n\t(*CELType)(nil),                        // 47: grpc.federation.CELType\n\t(*CELMapType)(nil),                     // 48: grpc.federation.CELMapType\n\t(*CELVariable)(nil),                    // 49: grpc.federation.CELVariable\n\t(code.Code)(0),                         // 50: google.rpc.Code\n\t(*errdetails.ErrorInfo)(nil),           // 51: google.rpc.ErrorInfo\n\t(*errdetails.RetryInfo)(nil),           // 52: google.rpc.RetryInfo\n\t(*errdetails.DebugInfo)(nil),           // 53: google.rpc.DebugInfo\n\t(*errdetails.QuotaFailure)(nil),        // 54: google.rpc.QuotaFailure\n\t(*errdetails.PreconditionFailure)(nil), // 55: google.rpc.PreconditionFailure\n\t(*errdetails.BadRequest)(nil),          // 56: google.rpc.BadRequest\n\t(*errdetails.RequestInfo)(nil),         // 57: google.rpc.RequestInfo\n\t(*errdetails.ResourceInfo)(nil),        // 58: google.rpc.ResourceInfo\n\t(*errdetails.Help)(nil),                // 59: google.rpc.Help\n\t(*errdetails.LocalizedMessage)(nil),    // 60: google.rpc.LocalizedMessage\n\t(*descriptorpb.FileOptions)(nil),       // 61: google.protobuf.FileOptions\n\t(*descriptorpb.ServiceOptions)(nil),    // 62: google.protobuf.ServiceOptions\n\t(*descriptorpb.MethodOptions)(nil),     // 63: google.protobuf.MethodOptions\n\t(*descriptorpb.MessageOptions)(nil),    // 64: google.protobuf.MessageOptions\n\t(*descriptorpb.FieldOptions)(nil),      // 65: google.protobuf.FieldOptions\n\t(*descriptorpb.EnumOptions)(nil),       // 66: google.protobuf.EnumOptions\n\t(*descriptorpb.EnumValueOptions)(nil),  // 67: google.protobuf.EnumValueOptions\n\t(*descriptorpb.OneofOptions)(nil),      // 68: google.protobuf.OneofOptions\n}\nvar file_grpc_federation_federation_proto_depIdxs = []int32{\n\t38, // 0: grpc.federation.FileRule.plugin:type_name -> grpc.federation.CELPlugin\n\t5,  // 1: grpc.federation.EnumValueRule.attr:type_name -> grpc.federation.EnumValueAttribute\n\t8,  // 2: grpc.federation.ServiceRule.env:type_name -> grpc.federation.Env\n\t9,  // 3: grpc.federation.ServiceRule.var:type_name -> grpc.federation.ServiceVariable\n\t11, // 4: grpc.federation.Env.var:type_name -> grpc.federation.EnvVar\n\t18, // 5: grpc.federation.ServiceVariable.map:type_name -> grpc.federation.MapExpr\n\t20, // 6: grpc.federation.ServiceVariable.message:type_name -> grpc.federation.MessageExpr\n\t10, // 7: grpc.federation.ServiceVariable.validation:type_name -> grpc.federation.ServiceVariableValidationExpr\n\t21, // 8: grpc.federation.ServiceVariable.enum:type_name -> grpc.federation.EnumExpr\n\t23, // 9: grpc.federation.ServiceVariable.switch:type_name -> grpc.federation.SwitchExpr\n\t12, // 10: grpc.federation.EnvVar.type:type_name -> grpc.federation.EnvType\n\t14, // 11: grpc.federation.EnvVar.option:type_name -> grpc.federation.EnvVarOption\n\t0,  // 12: grpc.federation.EnvType.kind:type_name -> grpc.federation.TypeKind\n\t12, // 13: grpc.federation.EnvType.repeated:type_name -> grpc.federation.EnvType\n\t13, // 14: grpc.federation.EnvType.map:type_name -> grpc.federation.EnvMapType\n\t12, // 15: grpc.federation.EnvMapType.key:type_name -> grpc.federation.EnvType\n\t12, // 16: grpc.federation.EnvMapType.value:type_name -> grpc.federation.EnvType\n\t17, // 17: grpc.federation.MessageRule.def:type_name -> grpc.federation.VariableDefinition\n\t18, // 18: grpc.federation.VariableDefinition.map:type_name -> grpc.federation.MapExpr\n\t20, // 19: grpc.federation.VariableDefinition.message:type_name -> grpc.federation.MessageExpr\n\t22, // 20: grpc.federation.VariableDefinition.call:type_name -> grpc.federation.CallExpr\n\t29, // 21: grpc.federation.VariableDefinition.validation:type_name -> grpc.federation.ValidationExpr\n\t21, // 22: grpc.federation.VariableDefinition.enum:type_name -> grpc.federation.EnumExpr\n\t23, // 23: grpc.federation.VariableDefinition.switch:type_name -> grpc.federation.SwitchExpr\n\t19, // 24: grpc.federation.MapExpr.iterator:type_name -> grpc.federation.Iterator\n\t20, // 25: grpc.federation.MapExpr.message:type_name -> grpc.federation.MessageExpr\n\t21, // 26: grpc.federation.MapExpr.enum:type_name -> grpc.federation.EnumExpr\n\t35, // 27: grpc.federation.MessageExpr.args:type_name -> grpc.federation.Argument\n\t33, // 28: grpc.federation.CallExpr.request:type_name -> grpc.federation.MethodRequest\n\t30, // 29: grpc.federation.CallExpr.retry:type_name -> grpc.federation.RetryPolicy\n\t26, // 30: grpc.federation.CallExpr.error:type_name -> grpc.federation.GRPCError\n\t28, // 31: grpc.federation.CallExpr.option:type_name -> grpc.federation.GRPCCallOption\n\t24, // 32: grpc.federation.SwitchExpr.case:type_name -> grpc.federation.SwitchCaseExpr\n\t25, // 33: grpc.federation.SwitchExpr.default:type_name -> grpc.federation.SwitchDefaultExpr\n\t17, // 34: grpc.federation.SwitchCaseExpr.def:type_name -> grpc.federation.VariableDefinition\n\t17, // 35: grpc.federation.SwitchDefaultExpr.def:type_name -> grpc.federation.VariableDefinition\n\t17, // 36: grpc.federation.GRPCError.def:type_name -> grpc.federation.VariableDefinition\n\t50, // 37: grpc.federation.GRPCError.code:type_name -> google.rpc.Code\n\t27, // 38: grpc.federation.GRPCError.details:type_name -> grpc.federation.GRPCErrorDetail\n\t1,  // 39: grpc.federation.GRPCError.log_level:type_name -> grpc.federation.GRPCError.LogLevel\n\t17, // 40: grpc.federation.GRPCErrorDetail.def:type_name -> grpc.federation.VariableDefinition\n\t20, // 41: grpc.federation.GRPCErrorDetail.message:type_name -> grpc.federation.MessageExpr\n\t51, // 42: grpc.federation.GRPCErrorDetail.error_info:type_name -> google.rpc.ErrorInfo\n\t52, // 43: grpc.federation.GRPCErrorDetail.retry_info:type_name -> google.rpc.RetryInfo\n\t53, // 44: grpc.federation.GRPCErrorDetail.debug_info:type_name -> google.rpc.DebugInfo\n\t54, // 45: grpc.federation.GRPCErrorDetail.quota_failure:type_name -> google.rpc.QuotaFailure\n\t55, // 46: grpc.federation.GRPCErrorDetail.precondition_failure:type_name -> google.rpc.PreconditionFailure\n\t56, // 47: grpc.federation.GRPCErrorDetail.bad_request:type_name -> google.rpc.BadRequest\n\t57, // 48: grpc.federation.GRPCErrorDetail.request_info:type_name -> google.rpc.RequestInfo\n\t58, // 49: grpc.federation.GRPCErrorDetail.resource_info:type_name -> google.rpc.ResourceInfo\n\t59, // 50: grpc.federation.GRPCErrorDetail.help:type_name -> google.rpc.Help\n\t60, // 51: grpc.federation.GRPCErrorDetail.localized_message:type_name -> google.rpc.LocalizedMessage\n\t26, // 52: grpc.federation.ValidationExpr.error:type_name -> grpc.federation.GRPCError\n\t31, // 53: grpc.federation.RetryPolicy.constant:type_name -> grpc.federation.RetryPolicyConstant\n\t32, // 54: grpc.federation.RetryPolicy.exponential:type_name -> grpc.federation.RetryPolicyExponential\n\t37, // 55: grpc.federation.FieldRule.oneof:type_name -> grpc.federation.FieldOneof\n\t14, // 56: grpc.federation.FieldRule.env:type_name -> grpc.federation.EnvVarOption\n\t17, // 57: grpc.federation.FieldOneof.def:type_name -> grpc.federation.VariableDefinition\n\t39, // 58: grpc.federation.CELPlugin.export:type_name -> grpc.federation.CELPluginExport\n\t45, // 59: grpc.federation.CELPluginExport.types:type_name -> grpc.federation.CELReceiverType\n\t44, // 60: grpc.federation.CELPluginExport.functions:type_name -> grpc.federation.CELFunction\n\t49, // 61: grpc.federation.CELPluginExport.variables:type_name -> grpc.federation.CELVariable\n\t40, // 62: grpc.federation.CELPluginExport.capability:type_name -> grpc.federation.CELPluginCapability\n\t41, // 63: grpc.federation.CELPluginCapability.env:type_name -> grpc.federation.CELPluginEnvCapability\n\t42, // 64: grpc.federation.CELPluginCapability.file_system:type_name -> grpc.federation.CELPluginFileSystemCapability\n\t43, // 65: grpc.federation.CELPluginCapability.network:type_name -> grpc.federation.CELPluginNetworkCapability\n\t46, // 66: grpc.federation.CELFunction.args:type_name -> grpc.federation.CELFunctionArgument\n\t47, // 67: grpc.federation.CELFunction.return:type_name -> grpc.federation.CELType\n\t44, // 68: grpc.federation.CELReceiverType.methods:type_name -> grpc.federation.CELFunction\n\t47, // 69: grpc.federation.CELFunctionArgument.type:type_name -> grpc.federation.CELType\n\t0,  // 70: grpc.federation.CELType.kind:type_name -> grpc.federation.TypeKind\n\t47, // 71: grpc.federation.CELType.repeated:type_name -> grpc.federation.CELType\n\t48, // 72: grpc.federation.CELType.map:type_name -> grpc.federation.CELMapType\n\t47, // 73: grpc.federation.CELMapType.key:type_name -> grpc.federation.CELType\n\t47, // 74: grpc.federation.CELMapType.value:type_name -> grpc.federation.CELType\n\t47, // 75: grpc.federation.CELVariable.type:type_name -> grpc.federation.CELType\n\t61, // 76: grpc.federation.file:extendee -> google.protobuf.FileOptions\n\t62, // 77: grpc.federation.service:extendee -> google.protobuf.ServiceOptions\n\t63, // 78: grpc.federation.method:extendee -> google.protobuf.MethodOptions\n\t64, // 79: grpc.federation.message:extendee -> google.protobuf.MessageOptions\n\t65, // 80: grpc.federation.field:extendee -> google.protobuf.FieldOptions\n\t66, // 81: grpc.federation.enum:extendee -> google.protobuf.EnumOptions\n\t67, // 82: grpc.federation.enum_value:extendee -> google.protobuf.EnumValueOptions\n\t68, // 83: grpc.federation.oneof:extendee -> google.protobuf.OneofOptions\n\t2,  // 84: grpc.federation.file:type_name -> grpc.federation.FileRule\n\t7,  // 85: grpc.federation.service:type_name -> grpc.federation.ServiceRule\n\t15, // 86: grpc.federation.method:type_name -> grpc.federation.MethodRule\n\t16, // 87: grpc.federation.message:type_name -> grpc.federation.MessageRule\n\t36, // 88: grpc.federation.field:type_name -> grpc.federation.FieldRule\n\t3,  // 89: grpc.federation.enum:type_name -> grpc.federation.EnumRule\n\t4,  // 90: grpc.federation.enum_value:type_name -> grpc.federation.EnumValueRule\n\t6,  // 91: grpc.federation.oneof:type_name -> grpc.federation.OneofRule\n\t92, // [92:92] is the sub-list for method output_type\n\t92, // [92:92] is the sub-list for method input_type\n\t84, // [84:92] is the sub-list for extension type_name\n\t76, // [76:84] is the sub-list for extension extendee\n\t0,  // [0:76] is the sub-list for field type_name\n}\n\nfunc init() { file_grpc_federation_federation_proto_init() }\nfunc file_grpc_federation_federation_proto_init() {\n\tif File_grpc_federation_federation_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_grpc_federation_federation_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*FileRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumValueRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumValueAttribute); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*OneofRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Env); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceVariable); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceVariableValidationExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvVar); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvMapType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvVarOption); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MethodRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MessageRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*VariableDefinition); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MapExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Iterator); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MessageExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CallExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SwitchExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SwitchCaseExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SwitchDefaultExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GRPCError); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GRPCErrorDetail); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GRPCCallOption); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ValidationExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RetryPolicy); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RetryPolicyConstant); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RetryPolicyExponential); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MethodRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MethodResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Argument); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*FieldRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*FieldOneof); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPlugin); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginExport); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginEnvCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginFileSystemCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginNetworkCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELFunction); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELReceiverType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELFunctionArgument); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELMapType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELVariable); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[2].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[7].OneofWrappers = []interface{}{\n\t\t(*ServiceVariable_By)(nil),\n\t\t(*ServiceVariable_Map)(nil),\n\t\t(*ServiceVariable_Message)(nil),\n\t\t(*ServiceVariable_Validation)(nil),\n\t\t(*ServiceVariable_Enum)(nil),\n\t\t(*ServiceVariable_Switch)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[9].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[10].OneofWrappers = []interface{}{\n\t\t(*EnvType_Kind)(nil),\n\t\t(*EnvType_Repeated)(nil),\n\t\t(*EnvType_Map)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[12].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[13].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[14].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[15].OneofWrappers = []interface{}{\n\t\t(*VariableDefinition_By)(nil),\n\t\t(*VariableDefinition_Map)(nil),\n\t\t(*VariableDefinition_Message)(nil),\n\t\t(*VariableDefinition_Call)(nil),\n\t\t(*VariableDefinition_Validation)(nil),\n\t\t(*VariableDefinition_Enum)(nil),\n\t\t(*VariableDefinition_Switch)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[16].OneofWrappers = []interface{}{\n\t\t(*MapExpr_By)(nil),\n\t\t(*MapExpr_Message)(nil),\n\t\t(*MapExpr_Enum)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[20].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[22].OneofWrappers = []interface{}{\n\t\t(*SwitchCaseExpr_By)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[23].OneofWrappers = []interface{}{\n\t\t(*SwitchDefaultExpr_By)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[24].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[26].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[27].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[28].OneofWrappers = []interface{}{\n\t\t(*RetryPolicy_Constant)(nil),\n\t\t(*RetryPolicy_Exponential)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[29].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[30].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[31].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[32].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[33].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[34].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[35].OneofWrappers = []interface{}{\n\t\t(*FieldOneof_If)(nil),\n\t\t(*FieldOneof_Default)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[38].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[45].OneofWrappers = []interface{}{\n\t\t(*CELType_Kind)(nil),\n\t\t(*CELType_Repeated)(nil),\n\t\t(*CELType_Map)(nil),\n\t\t(*CELType_Message)(nil),\n\t\t(*CELType_Enum)(nil),\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_grpc_federation_federation_proto_rawDesc,\n\t\t\tNumEnums:      2,\n\t\t\tNumMessages:   48,\n\t\t\tNumExtensions: 8,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_grpc_federation_federation_proto_goTypes,\n\t\tDependencyIndexes: file_grpc_federation_federation_proto_depIdxs,\n\t\tEnumInfos:         file_grpc_federation_federation_proto_enumTypes,\n\t\tMessageInfos:      file_grpc_federation_federation_proto_msgTypes,\n\t\tExtensionInfos:    file_grpc_federation_federation_proto_extTypes,\n\t}.Build()\n\tFile_grpc_federation_federation_proto = out.File\n\tfile_grpc_federation_federation_proto_rawDesc = nil\n\tfile_grpc_federation_federation_proto_goTypes = nil\n\tfile_grpc_federation_federation_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/17_error_handler/grpc/federation/generator.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: grpc/federation/generator.proto\n\npackage plugin\n\nimport (\n\tcode \"google.golang.org/genproto/googleapis/rpc/code\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tdurationpb \"google.golang.org/protobuf/types/known/durationpb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype ActionType int32\n\nconst (\n\tActionType_GENERATE_ACTION ActionType = 0\n\tActionType_KEEP_ACTION     ActionType = 1\n\tActionType_CREATE_ACTION   ActionType = 2\n\tActionType_DELETE_ACTION   ActionType = 3\n\tActionType_UPDATE_ACTION   ActionType = 4\n)\n\n// Enum value maps for ActionType.\nvar (\n\tActionType_name = map[int32]string{\n\t\t0: \"GENERATE_ACTION\",\n\t\t1: \"KEEP_ACTION\",\n\t\t2: \"CREATE_ACTION\",\n\t\t3: \"DELETE_ACTION\",\n\t\t4: \"UPDATE_ACTION\",\n\t}\n\tActionType_value = map[string]int32{\n\t\t\"GENERATE_ACTION\": 0,\n\t\t\"KEEP_ACTION\":     1,\n\t\t\"CREATE_ACTION\":   2,\n\t\t\"DELETE_ACTION\":   3,\n\t\t\"UPDATE_ACTION\":   4,\n\t}\n)\n\nfunc (x ActionType) Enum() *ActionType {\n\tp := new(ActionType)\n\t*p = x\n\treturn p\n}\n\nfunc (x ActionType) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (ActionType) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_grpc_federation_generator_proto_enumTypes[0].Descriptor()\n}\n\nfunc (ActionType) Type() protoreflect.EnumType {\n\treturn &file_grpc_federation_generator_proto_enumTypes[0]\n}\n\nfunc (x ActionType) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use ActionType.Descriptor instead.\nfunc (ActionType) EnumDescriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{0}\n}\n\ntype OutputFilePathMode int32\n\nconst (\n\tOutputFilePathMode_OUTPUT_FILE_PATH_MODE_UNSPECIFIED     OutputFilePathMode = 0\n\tOutputFilePathMode_OUTPUT_FILE_PATH_MODE_IMPORT          OutputFilePathMode = 1\n\tOutputFilePathMode_OUTPUT_FILE_PATH_MODE_MODULE_PREFIX   OutputFilePathMode = 2\n\tOutputFilePathMode_OUTPUT_FILE_PATH_MODE_SOURCE_RELATIVE OutputFilePathMode = 3\n)\n\n// Enum value maps for OutputFilePathMode.\nvar (\n\tOutputFilePathMode_name = map[int32]string{\n\t\t0: \"OUTPUT_FILE_PATH_MODE_UNSPECIFIED\",\n\t\t1: \"OUTPUT_FILE_PATH_MODE_IMPORT\",\n\t\t2: \"OUTPUT_FILE_PATH_MODE_MODULE_PREFIX\",\n\t\t3: \"OUTPUT_FILE_PATH_MODE_SOURCE_RELATIVE\",\n\t}\n\tOutputFilePathMode_value = map[string]int32{\n\t\t\"OUTPUT_FILE_PATH_MODE_UNSPECIFIED\":     0,\n\t\t\"OUTPUT_FILE_PATH_MODE_IMPORT\":          1,\n\t\t\"OUTPUT_FILE_PATH_MODE_MODULE_PREFIX\":   2,\n\t\t\"OUTPUT_FILE_PATH_MODE_SOURCE_RELATIVE\": 3,\n\t}\n)\n\nfunc (x OutputFilePathMode) Enum() *OutputFilePathMode {\n\tp := new(OutputFilePathMode)\n\t*p = x\n\treturn p\n}\n\nfunc (x OutputFilePathMode) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (OutputFilePathMode) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_grpc_federation_generator_proto_enumTypes[1].Descriptor()\n}\n\nfunc (OutputFilePathMode) Type() protoreflect.EnumType {\n\treturn &file_grpc_federation_generator_proto_enumTypes[1]\n}\n\nfunc (x OutputFilePathMode) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use OutputFilePathMode.Descriptor instead.\nfunc (OutputFilePathMode) EnumDescriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{1}\n}\n\ntype TypeKind int32\n\nconst (\n\tTypeKind_UNKNOWN_TYPE  TypeKind = 0\n\tTypeKind_DOUBLE_TYPE   TypeKind = 1\n\tTypeKind_FLOAT_TYPE    TypeKind = 2\n\tTypeKind_INT64_TYPE    TypeKind = 3\n\tTypeKind_UINT64_TYPE   TypeKind = 4\n\tTypeKind_INT32_TYPE    TypeKind = 5\n\tTypeKind_FIXED64_TYPE  TypeKind = 6\n\tTypeKind_FIXED32_TYPE  TypeKind = 7\n\tTypeKind_BOOL_TYPE     TypeKind = 8\n\tTypeKind_STRING_TYPE   TypeKind = 9\n\tTypeKind_GROUP_TYPE    TypeKind = 10\n\tTypeKind_MESSAGE_TYPE  TypeKind = 11\n\tTypeKind_BYTES_TYPE    TypeKind = 12\n\tTypeKind_UINT32_TYPE   TypeKind = 13\n\tTypeKind_ENUM_TYPE     TypeKind = 14\n\tTypeKind_SFIXED32_TYPE TypeKind = 15\n\tTypeKind_SFIXED64_TYPE TypeKind = 16\n\tTypeKind_SINT32_TYPE   TypeKind = 17\n\tTypeKind_SINT64_TYPE   TypeKind = 18\n)\n\n// Enum value maps for TypeKind.\nvar (\n\tTypeKind_name = map[int32]string{\n\t\t0:  \"UNKNOWN_TYPE\",\n\t\t1:  \"DOUBLE_TYPE\",\n\t\t2:  \"FLOAT_TYPE\",\n\t\t3:  \"INT64_TYPE\",\n\t\t4:  \"UINT64_TYPE\",\n\t\t5:  \"INT32_TYPE\",\n\t\t6:  \"FIXED64_TYPE\",\n\t\t7:  \"FIXED32_TYPE\",\n\t\t8:  \"BOOL_TYPE\",\n\t\t9:  \"STRING_TYPE\",\n\t\t10: \"GROUP_TYPE\",\n\t\t11: \"MESSAGE_TYPE\",\n\t\t12: \"BYTES_TYPE\",\n\t\t13: \"UINT32_TYPE\",\n\t\t14: \"ENUM_TYPE\",\n\t\t15: \"SFIXED32_TYPE\",\n\t\t16: \"SFIXED64_TYPE\",\n\t\t17: \"SINT32_TYPE\",\n\t\t18: \"SINT64_TYPE\",\n\t}\n\tTypeKind_value = map[string]int32{\n\t\t\"UNKNOWN_TYPE\":  0,\n\t\t\"DOUBLE_TYPE\":   1,\n\t\t\"FLOAT_TYPE\":    2,\n\t\t\"INT64_TYPE\":    3,\n\t\t\"UINT64_TYPE\":   4,\n\t\t\"INT32_TYPE\":    5,\n\t\t\"FIXED64_TYPE\":  6,\n\t\t\"FIXED32_TYPE\":  7,\n\t\t\"BOOL_TYPE\":     8,\n\t\t\"STRING_TYPE\":   9,\n\t\t\"GROUP_TYPE\":    10,\n\t\t\"MESSAGE_TYPE\":  11,\n\t\t\"BYTES_TYPE\":    12,\n\t\t\"UINT32_TYPE\":   13,\n\t\t\"ENUM_TYPE\":     14,\n\t\t\"SFIXED32_TYPE\": 15,\n\t\t\"SFIXED64_TYPE\": 16,\n\t\t\"SINT32_TYPE\":   17,\n\t\t\"SINT64_TYPE\":   18,\n\t}\n)\n\nfunc (x TypeKind) Enum() *TypeKind {\n\tp := new(TypeKind)\n\t*p = x\n\treturn p\n}\n\nfunc (x TypeKind) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (TypeKind) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_grpc_federation_generator_proto_enumTypes[2].Descriptor()\n}\n\nfunc (TypeKind) Type() protoreflect.EnumType {\n\treturn &file_grpc_federation_generator_proto_enumTypes[2]\n}\n\nfunc (x TypeKind) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use TypeKind.Descriptor instead.\nfunc (TypeKind) EnumDescriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{2}\n}\n\ntype ProtoCodeGeneratorResponse_Feature int32\n\nconst (\n\tProtoCodeGeneratorResponse_FEATURE_NONE              ProtoCodeGeneratorResponse_Feature = 0\n\tProtoCodeGeneratorResponse_FEATURE_PROTO3_OPTIONAL   ProtoCodeGeneratorResponse_Feature = 1\n\tProtoCodeGeneratorResponse_FEATURE_SUPPORTS_EDITIONS ProtoCodeGeneratorResponse_Feature = 2\n)\n\n// Enum value maps for ProtoCodeGeneratorResponse_Feature.\nvar (\n\tProtoCodeGeneratorResponse_Feature_name = map[int32]string{\n\t\t0: \"FEATURE_NONE\",\n\t\t1: \"FEATURE_PROTO3_OPTIONAL\",\n\t\t2: \"FEATURE_SUPPORTS_EDITIONS\",\n\t}\n\tProtoCodeGeneratorResponse_Feature_value = map[string]int32{\n\t\t\"FEATURE_NONE\":              0,\n\t\t\"FEATURE_PROTO3_OPTIONAL\":   1,\n\t\t\"FEATURE_SUPPORTS_EDITIONS\": 2,\n\t}\n)\n\nfunc (x ProtoCodeGeneratorResponse_Feature) Enum() *ProtoCodeGeneratorResponse_Feature {\n\tp := new(ProtoCodeGeneratorResponse_Feature)\n\t*p = x\n\treturn p\n}\n\nfunc (x ProtoCodeGeneratorResponse_Feature) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (ProtoCodeGeneratorResponse_Feature) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_grpc_federation_generator_proto_enumTypes[3].Descriptor()\n}\n\nfunc (ProtoCodeGeneratorResponse_Feature) Type() protoreflect.EnumType {\n\treturn &file_grpc_federation_generator_proto_enumTypes[3]\n}\n\nfunc (x ProtoCodeGeneratorResponse_Feature) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use ProtoCodeGeneratorResponse_Feature.Descriptor instead.\nfunc (ProtoCodeGeneratorResponse_Feature) EnumDescriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{0, 0}\n}\n\ntype ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic int32\n\nconst (\n\tProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_NONE  ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic = 0\n\tProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_SET   ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic = 1\n\tProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_ALIAS ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic = 2\n)\n\n// Enum value maps for ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic.\nvar (\n\tProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic_name = map[int32]string{\n\t\t0: \"NONE\",\n\t\t1: \"SET\",\n\t\t2: \"ALIAS\",\n\t}\n\tProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic_value = map[string]int32{\n\t\t\"NONE\":  0,\n\t\t\"SET\":   1,\n\t\t\"ALIAS\": 2,\n\t}\n)\n\nfunc (x ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic) Enum() *ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic {\n\tp := new(ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic)\n\t*p = x\n\treturn p\n}\n\nfunc (x ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_grpc_federation_generator_proto_enumTypes[4].Descriptor()\n}\n\nfunc (ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic) Type() protoreflect.EnumType {\n\treturn &file_grpc_federation_generator_proto_enumTypes[4]\n}\n\nfunc (x ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic.Descriptor instead.\nfunc (ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic) EnumDescriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{0, 0, 0, 0}\n}\n\ntype ProtoCodeGeneratorResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tError             *string                            `protobuf:\"bytes,1,opt,name=error,proto3,oneof\" json:\"error,omitempty\"`\n\tSupportedFeatures *uint64                            `protobuf:\"varint,2,opt,name=supported_features,json=supportedFeatures,proto3,oneof\" json:\"supported_features,omitempty\"`\n\tMinimumEdition    *int32                             `protobuf:\"varint,3,opt,name=minimum_edition,json=minimumEdition,proto3,oneof\" json:\"minimum_edition,omitempty\"`\n\tMaximumEdition    *int32                             `protobuf:\"varint,4,opt,name=maximum_edition,json=maximumEdition,proto3,oneof\" json:\"maximum_edition,omitempty\"`\n\tFile              []*ProtoCodeGeneratorResponse_File `protobuf:\"bytes,15,rep,name=file,proto3\" json:\"file,omitempty\"`\n}\n\nfunc (x *ProtoCodeGeneratorResponse) Reset() {\n\t*x = ProtoCodeGeneratorResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ProtoCodeGeneratorResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ProtoCodeGeneratorResponse) ProtoMessage() {}\n\nfunc (x *ProtoCodeGeneratorResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ProtoCodeGeneratorResponse.ProtoReflect.Descriptor instead.\nfunc (*ProtoCodeGeneratorResponse) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *ProtoCodeGeneratorResponse) GetError() string {\n\tif x != nil && x.Error != nil {\n\t\treturn *x.Error\n\t}\n\treturn \"\"\n}\n\nfunc (x *ProtoCodeGeneratorResponse) GetSupportedFeatures() uint64 {\n\tif x != nil && x.SupportedFeatures != nil {\n\t\treturn *x.SupportedFeatures\n\t}\n\treturn 0\n}\n\nfunc (x *ProtoCodeGeneratorResponse) GetMinimumEdition() int32 {\n\tif x != nil && x.MinimumEdition != nil {\n\t\treturn *x.MinimumEdition\n\t}\n\treturn 0\n}\n\nfunc (x *ProtoCodeGeneratorResponse) GetMaximumEdition() int32 {\n\tif x != nil && x.MaximumEdition != nil {\n\t\treturn *x.MaximumEdition\n\t}\n\treturn 0\n}\n\nfunc (x *ProtoCodeGeneratorResponse) GetFile() []*ProtoCodeGeneratorResponse_File {\n\tif x != nil {\n\t\treturn x.File\n\t}\n\treturn nil\n}\n\n// CodeGeneratorRequest.\ntype CodeGeneratorRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tType      ActionType `protobuf:\"varint,1,opt,name=type,proto3,enum=grpc.federation.generator.plugin.ActionType\" json:\"type,omitempty\"`\n\tProtoPath string     `protobuf:\"bytes,2,opt,name=proto_path,json=protoPath,proto3\" json:\"proto_path,omitempty\"`\n\t// Deprecated: Marked as deprecated in grpc/federation/generator.proto.\n\tOutDir                string                             `protobuf:\"bytes,3,opt,name=out_dir,json=outDir,proto3\" json:\"out_dir,omitempty\"`\n\tFiles                 []*ProtoCodeGeneratorResponse_File `protobuf:\"bytes,4,rep,name=files,proto3\" json:\"files,omitempty\"`\n\tGrpcFederationFileIds []string                           `protobuf:\"bytes,5,rep,name=grpc_federation_file_ids,json=grpcFederationFileIds,proto3\" json:\"grpc_federation_file_ids,omitempty\"`\n\tReference             *Reference                         `protobuf:\"bytes,6,opt,name=reference,proto3\" json:\"reference,omitempty\"`\n\tOutputFilePathConfig  *OutputFilePathConfig              `protobuf:\"bytes,7,opt,name=output_file_path_config,json=outputFilePathConfig,proto3\" json:\"output_file_path_config,omitempty\"`\n}\n\nfunc (x *CodeGeneratorRequest) Reset() {\n\t*x = CodeGeneratorRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CodeGeneratorRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CodeGeneratorRequest) ProtoMessage() {}\n\nfunc (x *CodeGeneratorRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CodeGeneratorRequest.ProtoReflect.Descriptor instead.\nfunc (*CodeGeneratorRequest) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *CodeGeneratorRequest) GetType() ActionType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn ActionType_GENERATE_ACTION\n}\n\nfunc (x *CodeGeneratorRequest) GetProtoPath() string {\n\tif x != nil {\n\t\treturn x.ProtoPath\n\t}\n\treturn \"\"\n}\n\n// Deprecated: Marked as deprecated in grpc/federation/generator.proto.\nfunc (x *CodeGeneratorRequest) GetOutDir() string {\n\tif x != nil {\n\t\treturn x.OutDir\n\t}\n\treturn \"\"\n}\n\nfunc (x *CodeGeneratorRequest) GetFiles() []*ProtoCodeGeneratorResponse_File {\n\tif x != nil {\n\t\treturn x.Files\n\t}\n\treturn nil\n}\n\nfunc (x *CodeGeneratorRequest) GetGrpcFederationFileIds() []string {\n\tif x != nil {\n\t\treturn x.GrpcFederationFileIds\n\t}\n\treturn nil\n}\n\nfunc (x *CodeGeneratorRequest) GetReference() *Reference {\n\tif x != nil {\n\t\treturn x.Reference\n\t}\n\treturn nil\n}\n\nfunc (x *CodeGeneratorRequest) GetOutputFilePathConfig() *OutputFilePathConfig {\n\tif x != nil {\n\t\treturn x.OutputFilePathConfig\n\t}\n\treturn nil\n}\n\ntype OutputFilePathConfig struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMode        OutputFilePathMode `protobuf:\"varint,1,opt,name=mode,proto3,enum=grpc.federation.generator.plugin.OutputFilePathMode\" json:\"mode,omitempty\"`\n\tPrefix      string             `protobuf:\"bytes,2,opt,name=prefix,proto3\" json:\"prefix,omitempty\"`\n\tFilePath    string             `protobuf:\"bytes,3,opt,name=file_path,json=filePath,proto3\" json:\"file_path,omitempty\"`\n\tImportPaths []string           `protobuf:\"bytes,4,rep,name=import_paths,json=importPaths,proto3\" json:\"import_paths,omitempty\"`\n}\n\nfunc (x *OutputFilePathConfig) Reset() {\n\t*x = OutputFilePathConfig{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *OutputFilePathConfig) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*OutputFilePathConfig) ProtoMessage() {}\n\nfunc (x *OutputFilePathConfig) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use OutputFilePathConfig.ProtoReflect.Descriptor instead.\nfunc (*OutputFilePathConfig) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *OutputFilePathConfig) GetMode() OutputFilePathMode {\n\tif x != nil {\n\t\treturn x.Mode\n\t}\n\treturn OutputFilePathMode_OUTPUT_FILE_PATH_MODE_UNSPECIFIED\n}\n\nfunc (x *OutputFilePathConfig) GetPrefix() string {\n\tif x != nil {\n\t\treturn x.Prefix\n\t}\n\treturn \"\"\n}\n\nfunc (x *OutputFilePathConfig) GetFilePath() string {\n\tif x != nil {\n\t\treturn x.FilePath\n\t}\n\treturn \"\"\n}\n\nfunc (x *OutputFilePathConfig) GetImportPaths() []string {\n\tif x != nil {\n\t\treturn x.ImportPaths\n\t}\n\treturn nil\n}\n\ntype Reference struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tFileMap                    map[string]*File                       `protobuf:\"bytes,1,rep,name=file_map,json=fileMap,proto3\" json:\"file_map,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\tServiceMap                 map[string]*Service                    `protobuf:\"bytes,2,rep,name=service_map,json=serviceMap,proto3\" json:\"service_map,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\tMethodMap                  map[string]*Method                     `protobuf:\"bytes,3,rep,name=method_map,json=methodMap,proto3\" json:\"method_map,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\tMessageMap                 map[string]*Message                    `protobuf:\"bytes,4,rep,name=message_map,json=messageMap,proto3\" json:\"message_map,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\tFieldMap                   map[string]*Field                      `protobuf:\"bytes,5,rep,name=field_map,json=fieldMap,proto3\" json:\"field_map,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\tEnumMap                    map[string]*Enum                       `protobuf:\"bytes,6,rep,name=enum_map,json=enumMap,proto3\" json:\"enum_map,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\tEnumValueMap               map[string]*EnumValue                  `protobuf:\"bytes,7,rep,name=enum_value_map,json=enumValueMap,proto3\" json:\"enum_value_map,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\tOneofMap                   map[string]*Oneof                      `protobuf:\"bytes,8,rep,name=oneof_map,json=oneofMap,proto3\" json:\"oneof_map,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\tCelPluginMap               map[string]*CELPlugin                  `protobuf:\"bytes,9,rep,name=cel_plugin_map,json=celPluginMap,proto3\" json:\"cel_plugin_map,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\tGraphMap                   map[string]*MessageDependencyGraph     `protobuf:\"bytes,10,rep,name=graph_map,json=graphMap,proto3\" json:\"graph_map,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\tVariableDefinitionMap      map[string]*VariableDefinition         `protobuf:\"bytes,11,rep,name=variable_definition_map,json=variableDefinitionMap,proto3\" json:\"variable_definition_map,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\tVariableDefinitionGroupMap map[string]*VariableDefinitionGroup    `protobuf:\"bytes,12,rep,name=variable_definition_group_map,json=variableDefinitionGroupMap,proto3\" json:\"variable_definition_group_map,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\tGraphNodeMap               map[string]*MessageDependencyGraphNode `protobuf:\"bytes,13,rep,name=graph_node_map,json=graphNodeMap,proto3\" json:\"graph_node_map,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n}\n\nfunc (x *Reference) Reset() {\n\t*x = Reference{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Reference) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Reference) ProtoMessage() {}\n\nfunc (x *Reference) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Reference.ProtoReflect.Descriptor instead.\nfunc (*Reference) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *Reference) GetFileMap() map[string]*File {\n\tif x != nil {\n\t\treturn x.FileMap\n\t}\n\treturn nil\n}\n\nfunc (x *Reference) GetServiceMap() map[string]*Service {\n\tif x != nil {\n\t\treturn x.ServiceMap\n\t}\n\treturn nil\n}\n\nfunc (x *Reference) GetMethodMap() map[string]*Method {\n\tif x != nil {\n\t\treturn x.MethodMap\n\t}\n\treturn nil\n}\n\nfunc (x *Reference) GetMessageMap() map[string]*Message {\n\tif x != nil {\n\t\treturn x.MessageMap\n\t}\n\treturn nil\n}\n\nfunc (x *Reference) GetFieldMap() map[string]*Field {\n\tif x != nil {\n\t\treturn x.FieldMap\n\t}\n\treturn nil\n}\n\nfunc (x *Reference) GetEnumMap() map[string]*Enum {\n\tif x != nil {\n\t\treturn x.EnumMap\n\t}\n\treturn nil\n}\n\nfunc (x *Reference) GetEnumValueMap() map[string]*EnumValue {\n\tif x != nil {\n\t\treturn x.EnumValueMap\n\t}\n\treturn nil\n}\n\nfunc (x *Reference) GetOneofMap() map[string]*Oneof {\n\tif x != nil {\n\t\treturn x.OneofMap\n\t}\n\treturn nil\n}\n\nfunc (x *Reference) GetCelPluginMap() map[string]*CELPlugin {\n\tif x != nil {\n\t\treturn x.CelPluginMap\n\t}\n\treturn nil\n}\n\nfunc (x *Reference) GetGraphMap() map[string]*MessageDependencyGraph {\n\tif x != nil {\n\t\treturn x.GraphMap\n\t}\n\treturn nil\n}\n\nfunc (x *Reference) GetVariableDefinitionMap() map[string]*VariableDefinition {\n\tif x != nil {\n\t\treturn x.VariableDefinitionMap\n\t}\n\treturn nil\n}\n\nfunc (x *Reference) GetVariableDefinitionGroupMap() map[string]*VariableDefinitionGroup {\n\tif x != nil {\n\t\treturn x.VariableDefinitionGroupMap\n\t}\n\treturn nil\n}\n\nfunc (x *Reference) GetGraphNodeMap() map[string]*MessageDependencyGraphNode {\n\tif x != nil {\n\t\treturn x.GraphNodeMap\n\t}\n\treturn nil\n}\n\ntype File struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId            string     `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tPackage       *Package   `protobuf:\"bytes,2,opt,name=package,proto3\" json:\"package,omitempty\"`\n\tGoPackage     *GoPackage `protobuf:\"bytes,3,opt,name=go_package,json=goPackage,proto3\" json:\"go_package,omitempty\"`\n\tName          string     `protobuf:\"bytes,4,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tServiceIds    []string   `protobuf:\"bytes,5,rep,name=service_ids,json=serviceIds,proto3\" json:\"service_ids,omitempty\"`\n\tMessageIds    []string   `protobuf:\"bytes,6,rep,name=message_ids,json=messageIds,proto3\" json:\"message_ids,omitempty\"`\n\tEnumIds       []string   `protobuf:\"bytes,7,rep,name=enum_ids,json=enumIds,proto3\" json:\"enum_ids,omitempty\"`\n\tCelPluginIds  []string   `protobuf:\"bytes,8,rep,name=cel_plugin_ids,json=celPluginIds,proto3\" json:\"cel_plugin_ids,omitempty\"`\n\tImportFileIds []string   `protobuf:\"bytes,9,rep,name=import_file_ids,json=importFileIds,proto3\" json:\"import_file_ids,omitempty\"`\n}\n\nfunc (x *File) Reset() {\n\t*x = File{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *File) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*File) ProtoMessage() {}\n\nfunc (x *File) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use File.ProtoReflect.Descriptor instead.\nfunc (*File) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *File) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *File) GetPackage() *Package {\n\tif x != nil {\n\t\treturn x.Package\n\t}\n\treturn nil\n}\n\nfunc (x *File) GetGoPackage() *GoPackage {\n\tif x != nil {\n\t\treturn x.GoPackage\n\t}\n\treturn nil\n}\n\nfunc (x *File) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *File) GetServiceIds() []string {\n\tif x != nil {\n\t\treturn x.ServiceIds\n\t}\n\treturn nil\n}\n\nfunc (x *File) GetMessageIds() []string {\n\tif x != nil {\n\t\treturn x.MessageIds\n\t}\n\treturn nil\n}\n\nfunc (x *File) GetEnumIds() []string {\n\tif x != nil {\n\t\treturn x.EnumIds\n\t}\n\treturn nil\n}\n\nfunc (x *File) GetCelPluginIds() []string {\n\tif x != nil {\n\t\treturn x.CelPluginIds\n\t}\n\treturn nil\n}\n\nfunc (x *File) GetImportFileIds() []string {\n\tif x != nil {\n\t\treturn x.ImportFileIds\n\t}\n\treturn nil\n}\n\ntype Package struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName    string   `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tFileIds []string `protobuf:\"bytes,2,rep,name=file_ids,json=fileIds,proto3\" json:\"file_ids,omitempty\"`\n}\n\nfunc (x *Package) Reset() {\n\t*x = Package{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Package) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Package) ProtoMessage() {}\n\nfunc (x *Package) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Package.ProtoReflect.Descriptor instead.\nfunc (*Package) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *Package) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Package) GetFileIds() []string {\n\tif x != nil {\n\t\treturn x.FileIds\n\t}\n\treturn nil\n}\n\ntype GoPackage struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName       string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tImportPath string `protobuf:\"bytes,2,opt,name=import_path,json=importPath,proto3\" json:\"import_path,omitempty\"`\n\tAliasName  string `protobuf:\"bytes,3,opt,name=alias_name,json=aliasName,proto3\" json:\"alias_name,omitempty\"`\n}\n\nfunc (x *GoPackage) Reset() {\n\t*x = GoPackage{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GoPackage) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GoPackage) ProtoMessage() {}\n\nfunc (x *GoPackage) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GoPackage.ProtoReflect.Descriptor instead.\nfunc (*GoPackage) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *GoPackage) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *GoPackage) GetImportPath() string {\n\tif x != nil {\n\t\treturn x.ImportPath\n\t}\n\treturn \"\"\n}\n\nfunc (x *GoPackage) GetAliasName() string {\n\tif x != nil {\n\t\treturn x.AliasName\n\t}\n\treturn \"\"\n}\n\ntype Service struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId            string       `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName          string       `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tMethodIds     []string     `protobuf:\"bytes,3,rep,name=method_ids,json=methodIds,proto3\" json:\"method_ids,omitempty\"`\n\tFileId        string       `protobuf:\"bytes,4,opt,name=file_id,json=fileId,proto3\" json:\"file_id,omitempty\"`\n\tMessageIds    []string     `protobuf:\"bytes,5,rep,name=message_ids,json=messageIds,proto3\" json:\"message_ids,omitempty\"`\n\tMessageArgIds []string     `protobuf:\"bytes,6,rep,name=message_arg_ids,json=messageArgIds,proto3\" json:\"message_arg_ids,omitempty\"`\n\tCelPluginIds  []string     `protobuf:\"bytes,7,rep,name=cel_plugin_ids,json=celPluginIds,proto3\" json:\"cel_plugin_ids,omitempty\"`\n\tRule          *ServiceRule `protobuf:\"bytes,8,opt,name=rule,proto3\" json:\"rule,omitempty\"`\n}\n\nfunc (x *Service) Reset() {\n\t*x = Service{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Service) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Service) ProtoMessage() {}\n\nfunc (x *Service) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Service.ProtoReflect.Descriptor instead.\nfunc (*Service) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{7}\n}\n\nfunc (x *Service) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *Service) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Service) GetMethodIds() []string {\n\tif x != nil {\n\t\treturn x.MethodIds\n\t}\n\treturn nil\n}\n\nfunc (x *Service) GetFileId() string {\n\tif x != nil {\n\t\treturn x.FileId\n\t}\n\treturn \"\"\n}\n\nfunc (x *Service) GetMessageIds() []string {\n\tif x != nil {\n\t\treturn x.MessageIds\n\t}\n\treturn nil\n}\n\nfunc (x *Service) GetMessageArgIds() []string {\n\tif x != nil {\n\t\treturn x.MessageArgIds\n\t}\n\treturn nil\n}\n\nfunc (x *Service) GetCelPluginIds() []string {\n\tif x != nil {\n\t\treturn x.CelPluginIds\n\t}\n\treturn nil\n}\n\nfunc (x *Service) GetRule() *ServiceRule {\n\tif x != nil {\n\t\treturn x.Rule\n\t}\n\treturn nil\n}\n\ntype ServiceRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEnv  *Env               `protobuf:\"bytes,1,opt,name=env,proto3\" json:\"env,omitempty\"`\n\tVars []*ServiceVariable `protobuf:\"bytes,2,rep,name=vars,proto3\" json:\"vars,omitempty\"`\n}\n\nfunc (x *ServiceRule) Reset() {\n\t*x = ServiceRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceRule) ProtoMessage() {}\n\nfunc (x *ServiceRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceRule.ProtoReflect.Descriptor instead.\nfunc (*ServiceRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{8}\n}\n\nfunc (x *ServiceRule) GetEnv() *Env {\n\tif x != nil {\n\t\treturn x.Env\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceRule) GetVars() []*ServiceVariable {\n\tif x != nil {\n\t\treturn x.Vars\n\t}\n\treturn nil\n}\n\ntype Env struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tVars []*EnvVar `protobuf:\"bytes,1,rep,name=vars,proto3\" json:\"vars,omitempty\"`\n}\n\nfunc (x *Env) Reset() {\n\t*x = Env{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Env) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Env) ProtoMessage() {}\n\nfunc (x *Env) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Env.ProtoReflect.Descriptor instead.\nfunc (*Env) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{9}\n}\n\nfunc (x *Env) GetVars() []*EnvVar {\n\tif x != nil {\n\t\treturn x.Vars\n\t}\n\treturn nil\n}\n\ntype EnvVar struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName   string        `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tType   *Type         `protobuf:\"bytes,2,opt,name=type,proto3\" json:\"type,omitempty\"`\n\tOption *EnvVarOption `protobuf:\"bytes,3,opt,name=option,proto3\" json:\"option,omitempty\"`\n}\n\nfunc (x *EnvVar) Reset() {\n\t*x = EnvVar{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[10]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvVar) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvVar) ProtoMessage() {}\n\nfunc (x *EnvVar) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[10]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvVar.ProtoReflect.Descriptor instead.\nfunc (*EnvVar) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{10}\n}\n\nfunc (x *EnvVar) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnvVar) GetType() *Type {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nfunc (x *EnvVar) GetOption() *EnvVarOption {\n\tif x != nil {\n\t\treturn x.Option\n\t}\n\treturn nil\n}\n\ntype EnvVarOption struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tAlternate string `protobuf:\"bytes,1,opt,name=alternate,proto3\" json:\"alternate,omitempty\"`\n\tDefault   string `protobuf:\"bytes,2,opt,name=default,proto3\" json:\"default,omitempty\"`\n\tRequired  bool   `protobuf:\"varint,3,opt,name=required,proto3\" json:\"required,omitempty\"`\n\tIgnored   bool   `protobuf:\"varint,4,opt,name=ignored,proto3\" json:\"ignored,omitempty\"`\n}\n\nfunc (x *EnvVarOption) Reset() {\n\t*x = EnvVarOption{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[11]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvVarOption) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvVarOption) ProtoMessage() {}\n\nfunc (x *EnvVarOption) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[11]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvVarOption.ProtoReflect.Descriptor instead.\nfunc (*EnvVarOption) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{11}\n}\n\nfunc (x *EnvVarOption) GetAlternate() string {\n\tif x != nil {\n\t\treturn x.Alternate\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnvVarOption) GetDefault() string {\n\tif x != nil {\n\t\treturn x.Default\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnvVarOption) GetRequired() bool {\n\tif x != nil {\n\t\treturn x.Required\n\t}\n\treturn false\n}\n\nfunc (x *EnvVarOption) GetIgnored() bool {\n\tif x != nil {\n\t\treturn x.Ignored\n\t}\n\treturn false\n}\n\ntype ServiceVariable struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName string               `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tIf   *CELValue            `protobuf:\"bytes,2,opt,name=if,proto3\" json:\"if,omitempty\"`\n\tExpr *ServiceVariableExpr `protobuf:\"bytes,3,opt,name=expr,proto3\" json:\"expr,omitempty\"`\n}\n\nfunc (x *ServiceVariable) Reset() {\n\t*x = ServiceVariable{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[12]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceVariable) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceVariable) ProtoMessage() {}\n\nfunc (x *ServiceVariable) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[12]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceVariable.ProtoReflect.Descriptor instead.\nfunc (*ServiceVariable) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{12}\n}\n\nfunc (x *ServiceVariable) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *ServiceVariable) GetIf() *CELValue {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetExpr() *ServiceVariableExpr {\n\tif x != nil {\n\t\treturn x.Expr\n\t}\n\treturn nil\n}\n\ntype ServiceVariableExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tType *Type `protobuf:\"bytes,1,opt,name=type,proto3\" json:\"type,omitempty\"`\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*ServiceVariableExpr_By\n\t//\t*ServiceVariableExpr_Map\n\t//\t*ServiceVariableExpr_Message\n\t//\t*ServiceVariableExpr_Validation\n\t//\t*ServiceVariableExpr_Enum\n\t//\t*ServiceVariableExpr_Switch\n\tExpr isServiceVariableExpr_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *ServiceVariableExpr) Reset() {\n\t*x = ServiceVariableExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[13]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceVariableExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceVariableExpr) ProtoMessage() {}\n\nfunc (x *ServiceVariableExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[13]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceVariableExpr.ProtoReflect.Descriptor instead.\nfunc (*ServiceVariableExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{13}\n}\n\nfunc (x *ServiceVariableExpr) GetType() *Type {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nfunc (m *ServiceVariableExpr) GetExpr() isServiceVariableExpr_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariableExpr) GetBy() *CELValue {\n\tif x, ok := x.GetExpr().(*ServiceVariableExpr_By); ok {\n\t\treturn x.By\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariableExpr) GetMap() *MapExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariableExpr_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariableExpr) GetMessage() *MessageExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariableExpr_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariableExpr) GetValidation() *ServiceVariableValidationExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariableExpr_Validation); ok {\n\t\treturn x.Validation\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariableExpr) GetEnum() *EnumExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariableExpr_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariableExpr) GetSwitch() *SwitchExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariableExpr_Switch); ok {\n\t\treturn x.Switch\n\t}\n\treturn nil\n}\n\ntype isServiceVariableExpr_Expr interface {\n\tisServiceVariableExpr_Expr()\n}\n\ntype ServiceVariableExpr_By struct {\n\tBy *CELValue `protobuf:\"bytes,2,opt,name=by,proto3,oneof\"`\n}\n\ntype ServiceVariableExpr_Map struct {\n\tMap *MapExpr `protobuf:\"bytes,3,opt,name=map,proto3,oneof\"`\n}\n\ntype ServiceVariableExpr_Message struct {\n\tMessage *MessageExpr `protobuf:\"bytes,4,opt,name=message,proto3,oneof\"`\n}\n\ntype ServiceVariableExpr_Validation struct {\n\tValidation *ServiceVariableValidationExpr `protobuf:\"bytes,5,opt,name=validation,proto3,oneof\"`\n}\n\ntype ServiceVariableExpr_Enum struct {\n\tEnum *EnumExpr `protobuf:\"bytes,6,opt,name=enum,proto3,oneof\"`\n}\n\ntype ServiceVariableExpr_Switch struct {\n\tSwitch *SwitchExpr `protobuf:\"bytes,7,opt,name=switch,proto3,oneof\"`\n}\n\nfunc (*ServiceVariableExpr_By) isServiceVariableExpr_Expr() {}\n\nfunc (*ServiceVariableExpr_Map) isServiceVariableExpr_Expr() {}\n\nfunc (*ServiceVariableExpr_Message) isServiceVariableExpr_Expr() {}\n\nfunc (*ServiceVariableExpr_Validation) isServiceVariableExpr_Expr() {}\n\nfunc (*ServiceVariableExpr_Enum) isServiceVariableExpr_Expr() {}\n\nfunc (*ServiceVariableExpr_Switch) isServiceVariableExpr_Expr() {}\n\ntype ServiceVariableValidationExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tIf      *CELValue `protobuf:\"bytes,1,opt,name=if,proto3\" json:\"if,omitempty\"`\n\tMessage *CELValue `protobuf:\"bytes,2,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *ServiceVariableValidationExpr) Reset() {\n\t*x = ServiceVariableValidationExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[14]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceVariableValidationExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceVariableValidationExpr) ProtoMessage() {}\n\nfunc (x *ServiceVariableValidationExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[14]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceVariableValidationExpr.ProtoReflect.Descriptor instead.\nfunc (*ServiceVariableValidationExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{14}\n}\n\nfunc (x *ServiceVariableValidationExpr) GetIf() *CELValue {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariableValidationExpr) GetMessage() *CELValue {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\ntype Method struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId         string      `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName       string      `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tRequestId  string      `protobuf:\"bytes,3,opt,name=request_id,json=requestId,proto3\" json:\"request_id,omitempty\"`\n\tResponseId string      `protobuf:\"bytes,4,opt,name=response_id,json=responseId,proto3\" json:\"response_id,omitempty\"`\n\tServiceId  string      `protobuf:\"bytes,5,opt,name=service_id,json=serviceId,proto3\" json:\"service_id,omitempty\"`\n\tRule       *MethodRule `protobuf:\"bytes,6,opt,name=rule,proto3\" json:\"rule,omitempty\"`\n}\n\nfunc (x *Method) Reset() {\n\t*x = Method{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[15]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Method) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Method) ProtoMessage() {}\n\nfunc (x *Method) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[15]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Method.ProtoReflect.Descriptor instead.\nfunc (*Method) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{15}\n}\n\nfunc (x *Method) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *Method) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Method) GetRequestId() string {\n\tif x != nil {\n\t\treturn x.RequestId\n\t}\n\treturn \"\"\n}\n\nfunc (x *Method) GetResponseId() string {\n\tif x != nil {\n\t\treturn x.ResponseId\n\t}\n\treturn \"\"\n}\n\nfunc (x *Method) GetServiceId() string {\n\tif x != nil {\n\t\treturn x.ServiceId\n\t}\n\treturn \"\"\n}\n\nfunc (x *Method) GetRule() *MethodRule {\n\tif x != nil {\n\t\treturn x.Rule\n\t}\n\treturn nil\n}\n\ntype MethodRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tTimeout    *durationpb.Duration `protobuf:\"bytes,1,opt,name=timeout,proto3\" json:\"timeout,omitempty\"`\n\tResponseId string               `protobuf:\"bytes,2,opt,name=response_id,json=responseId,proto3\" json:\"response_id,omitempty\"`\n}\n\nfunc (x *MethodRule) Reset() {\n\t*x = MethodRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[16]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MethodRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MethodRule) ProtoMessage() {}\n\nfunc (x *MethodRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[16]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MethodRule.ProtoReflect.Descriptor instead.\nfunc (*MethodRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{16}\n}\n\nfunc (x *MethodRule) GetTimeout() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.Timeout\n\t}\n\treturn nil\n}\n\nfunc (x *MethodRule) GetResponseId() string {\n\tif x != nil {\n\t\treturn x.ResponseId\n\t}\n\treturn \"\"\n}\n\ntype Message struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId               string       `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName             string       `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tIsMapEntry       bool         `protobuf:\"varint,3,opt,name=is_map_entry,json=isMapEntry,proto3\" json:\"is_map_entry,omitempty\"`\n\tFileId           string       `protobuf:\"bytes,4,opt,name=file_id,json=fileId,proto3\" json:\"file_id,omitempty\"`\n\tParentMessageId  string       `protobuf:\"bytes,5,opt,name=parent_message_id,json=parentMessageId,proto3\" json:\"parent_message_id,omitempty\"`\n\tNestedMessageIds []string     `protobuf:\"bytes,6,rep,name=nested_message_ids,json=nestedMessageIds,proto3\" json:\"nested_message_ids,omitempty\"`\n\tEnumIds          []string     `protobuf:\"bytes,7,rep,name=enum_ids,json=enumIds,proto3\" json:\"enum_ids,omitempty\"`\n\tFieldIds         []string     `protobuf:\"bytes,8,rep,name=field_ids,json=fieldIds,proto3\" json:\"field_ids,omitempty\"`\n\tOneofIds         []string     `protobuf:\"bytes,9,rep,name=oneof_ids,json=oneofIds,proto3\" json:\"oneof_ids,omitempty\"`\n\tRule             *MessageRule `protobuf:\"bytes,10,opt,name=rule,proto3\" json:\"rule,omitempty\"`\n}\n\nfunc (x *Message) Reset() {\n\t*x = Message{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[17]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Message) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Message) ProtoMessage() {}\n\nfunc (x *Message) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[17]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Message.ProtoReflect.Descriptor instead.\nfunc (*Message) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{17}\n}\n\nfunc (x *Message) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *Message) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Message) GetIsMapEntry() bool {\n\tif x != nil {\n\t\treturn x.IsMapEntry\n\t}\n\treturn false\n}\n\nfunc (x *Message) GetFileId() string {\n\tif x != nil {\n\t\treturn x.FileId\n\t}\n\treturn \"\"\n}\n\nfunc (x *Message) GetParentMessageId() string {\n\tif x != nil {\n\t\treturn x.ParentMessageId\n\t}\n\treturn \"\"\n}\n\nfunc (x *Message) GetNestedMessageIds() []string {\n\tif x != nil {\n\t\treturn x.NestedMessageIds\n\t}\n\treturn nil\n}\n\nfunc (x *Message) GetEnumIds() []string {\n\tif x != nil {\n\t\treturn x.EnumIds\n\t}\n\treturn nil\n}\n\nfunc (x *Message) GetFieldIds() []string {\n\tif x != nil {\n\t\treturn x.FieldIds\n\t}\n\treturn nil\n}\n\nfunc (x *Message) GetOneofIds() []string {\n\tif x != nil {\n\t\treturn x.OneofIds\n\t}\n\treturn nil\n}\n\nfunc (x *Message) GetRule() *MessageRule {\n\tif x != nil {\n\t\treturn x.Rule\n\t}\n\treturn nil\n}\n\ntype MessageRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessageArgumentId string                 `protobuf:\"bytes,1,opt,name=message_argument_id,json=messageArgumentId,proto3\" json:\"message_argument_id,omitempty\"`\n\tCustomResolver    bool                   `protobuf:\"varint,2,opt,name=custom_resolver,json=customResolver,proto3\" json:\"custom_resolver,omitempty\"`\n\tAliasIds          []string               `protobuf:\"bytes,3,rep,name=alias_ids,json=aliasIds,proto3\" json:\"alias_ids,omitempty\"`\n\tDefSet            *VariableDefinitionSet `protobuf:\"bytes,4,opt,name=def_set,json=defSet,proto3\" json:\"def_set,omitempty\"`\n}\n\nfunc (x *MessageRule) Reset() {\n\t*x = MessageRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[18]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MessageRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MessageRule) ProtoMessage() {}\n\nfunc (x *MessageRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[18]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MessageRule.ProtoReflect.Descriptor instead.\nfunc (*MessageRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{18}\n}\n\nfunc (x *MessageRule) GetMessageArgumentId() string {\n\tif x != nil {\n\t\treturn x.MessageArgumentId\n\t}\n\treturn \"\"\n}\n\nfunc (x *MessageRule) GetCustomResolver() bool {\n\tif x != nil {\n\t\treturn x.CustomResolver\n\t}\n\treturn false\n}\n\nfunc (x *MessageRule) GetAliasIds() []string {\n\tif x != nil {\n\t\treturn x.AliasIds\n\t}\n\treturn nil\n}\n\nfunc (x *MessageRule) GetDefSet() *VariableDefinitionSet {\n\tif x != nil {\n\t\treturn x.DefSet\n\t}\n\treturn nil\n}\n\ntype VariableDefinitionSet struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tVariableDefinitionIds      []string `protobuf:\"bytes,1,rep,name=variable_definition_ids,json=variableDefinitionIds,proto3\" json:\"variable_definition_ids,omitempty\"`\n\tVariableDefinitionGroupIds []string `protobuf:\"bytes,2,rep,name=variable_definition_group_ids,json=variableDefinitionGroupIds,proto3\" json:\"variable_definition_group_ids,omitempty\"`\n\tDependencyGraphId          string   `protobuf:\"bytes,3,opt,name=dependency_graph_id,json=dependencyGraphId,proto3\" json:\"dependency_graph_id,omitempty\"`\n}\n\nfunc (x *VariableDefinitionSet) Reset() {\n\t*x = VariableDefinitionSet{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[19]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *VariableDefinitionSet) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*VariableDefinitionSet) ProtoMessage() {}\n\nfunc (x *VariableDefinitionSet) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[19]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use VariableDefinitionSet.ProtoReflect.Descriptor instead.\nfunc (*VariableDefinitionSet) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{19}\n}\n\nfunc (x *VariableDefinitionSet) GetVariableDefinitionIds() []string {\n\tif x != nil {\n\t\treturn x.VariableDefinitionIds\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinitionSet) GetVariableDefinitionGroupIds() []string {\n\tif x != nil {\n\t\treturn x.VariableDefinitionGroupIds\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinitionSet) GetDependencyGraphId() string {\n\tif x != nil {\n\t\treturn x.DependencyGraphId\n\t}\n\treturn \"\"\n}\n\ntype VariableDefinition struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId       string        `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tIndex    int64         `protobuf:\"varint,2,opt,name=index,proto3\" json:\"index,omitempty\"`\n\tName     string        `protobuf:\"bytes,3,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tIf       *CELValue     `protobuf:\"bytes,4,opt,name=if,proto3\" json:\"if,omitempty\"`\n\tAutoBind bool          `protobuf:\"varint,5,opt,name=auto_bind,json=autoBind,proto3\" json:\"auto_bind,omitempty\"`\n\tUsed     bool          `protobuf:\"varint,6,opt,name=used,proto3\" json:\"used,omitempty\"`\n\tExpr     *VariableExpr `protobuf:\"bytes,7,opt,name=expr,proto3\" json:\"expr,omitempty\"`\n}\n\nfunc (x *VariableDefinition) Reset() {\n\t*x = VariableDefinition{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[20]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *VariableDefinition) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*VariableDefinition) ProtoMessage() {}\n\nfunc (x *VariableDefinition) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[20]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use VariableDefinition.ProtoReflect.Descriptor instead.\nfunc (*VariableDefinition) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{20}\n}\n\nfunc (x *VariableDefinition) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *VariableDefinition) GetIndex() int64 {\n\tif x != nil {\n\t\treturn x.Index\n\t}\n\treturn 0\n}\n\nfunc (x *VariableDefinition) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *VariableDefinition) GetIf() *CELValue {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetAutoBind() bool {\n\tif x != nil {\n\t\treturn x.AutoBind\n\t}\n\treturn false\n}\n\nfunc (x *VariableDefinition) GetUsed() bool {\n\tif x != nil {\n\t\treturn x.Used\n\t}\n\treturn false\n}\n\nfunc (x *VariableDefinition) GetExpr() *VariableExpr {\n\tif x != nil {\n\t\treturn x.Expr\n\t}\n\treturn nil\n}\n\ntype Field struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId        string     `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName      string     `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tType      *Type      `protobuf:\"bytes,3,opt,name=type,proto3\" json:\"type,omitempty\"`\n\tOneofId   string     `protobuf:\"bytes,4,opt,name=oneof_id,json=oneofId,proto3\" json:\"oneof_id,omitempty\"`\n\tRule      *FieldRule `protobuf:\"bytes,5,opt,name=rule,proto3\" json:\"rule,omitempty\"`\n\tMessageId string     `protobuf:\"bytes,6,opt,name=message_id,json=messageId,proto3\" json:\"message_id,omitempty\"`\n}\n\nfunc (x *Field) Reset() {\n\t*x = Field{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[21]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Field) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Field) ProtoMessage() {}\n\nfunc (x *Field) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[21]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Field.ProtoReflect.Descriptor instead.\nfunc (*Field) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{21}\n}\n\nfunc (x *Field) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *Field) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Field) GetType() *Type {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nfunc (x *Field) GetOneofId() string {\n\tif x != nil {\n\t\treturn x.OneofId\n\t}\n\treturn \"\"\n}\n\nfunc (x *Field) GetRule() *FieldRule {\n\tif x != nil {\n\t\treturn x.Rule\n\t}\n\treturn nil\n}\n\nfunc (x *Field) GetMessageId() string {\n\tif x != nil {\n\t\treturn x.MessageId\n\t}\n\treturn \"\"\n}\n\ntype FieldRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tValue                 *Value          `protobuf:\"bytes,1,opt,name=value,proto3\" json:\"value,omitempty\"`\n\tCustomResolver        bool            `protobuf:\"varint,2,opt,name=custom_resolver,json=customResolver,proto3\" json:\"custom_resolver,omitempty\"`\n\tMessageCustomResolver bool            `protobuf:\"varint,3,opt,name=message_custom_resolver,json=messageCustomResolver,proto3\" json:\"message_custom_resolver,omitempty\"`\n\tAliasIds              []string        `protobuf:\"bytes,4,rep,name=alias_ids,json=aliasIds,proto3\" json:\"alias_ids,omitempty\"`\n\tAutoBindField         *AutoBindField  `protobuf:\"bytes,5,opt,name=auto_bind_field,json=autoBindField,proto3\" json:\"auto_bind_field,omitempty\"`\n\tOneofRule             *FieldOneofRule `protobuf:\"bytes,6,opt,name=oneof_rule,json=oneofRule,proto3\" json:\"oneof_rule,omitempty\"`\n}\n\nfunc (x *FieldRule) Reset() {\n\t*x = FieldRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[22]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *FieldRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*FieldRule) ProtoMessage() {}\n\nfunc (x *FieldRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[22]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use FieldRule.ProtoReflect.Descriptor instead.\nfunc (*FieldRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{22}\n}\n\nfunc (x *FieldRule) GetValue() *Value {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn nil\n}\n\nfunc (x *FieldRule) GetCustomResolver() bool {\n\tif x != nil {\n\t\treturn x.CustomResolver\n\t}\n\treturn false\n}\n\nfunc (x *FieldRule) GetMessageCustomResolver() bool {\n\tif x != nil {\n\t\treturn x.MessageCustomResolver\n\t}\n\treturn false\n}\n\nfunc (x *FieldRule) GetAliasIds() []string {\n\tif x != nil {\n\t\treturn x.AliasIds\n\t}\n\treturn nil\n}\n\nfunc (x *FieldRule) GetAutoBindField() *AutoBindField {\n\tif x != nil {\n\t\treturn x.AutoBindField\n\t}\n\treturn nil\n}\n\nfunc (x *FieldRule) GetOneofRule() *FieldOneofRule {\n\tif x != nil {\n\t\treturn x.OneofRule\n\t}\n\treturn nil\n}\n\ntype AutoBindField struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tVariableDefinitionId string `protobuf:\"bytes,1,opt,name=variable_definition_id,json=variableDefinitionId,proto3\" json:\"variable_definition_id,omitempty\"`\n\tFieldId              string `protobuf:\"bytes,2,opt,name=field_id,json=fieldId,proto3\" json:\"field_id,omitempty\"`\n}\n\nfunc (x *AutoBindField) Reset() {\n\t*x = AutoBindField{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[23]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AutoBindField) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AutoBindField) ProtoMessage() {}\n\nfunc (x *AutoBindField) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[23]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AutoBindField.ProtoReflect.Descriptor instead.\nfunc (*AutoBindField) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{23}\n}\n\nfunc (x *AutoBindField) GetVariableDefinitionId() string {\n\tif x != nil {\n\t\treturn x.VariableDefinitionId\n\t}\n\treturn \"\"\n}\n\nfunc (x *AutoBindField) GetFieldId() string {\n\tif x != nil {\n\t\treturn x.FieldId\n\t}\n\treturn \"\"\n}\n\ntype FieldOneofRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tIf      *CELValue              `protobuf:\"bytes,1,opt,name=if,proto3\" json:\"if,omitempty\"`\n\tDefault bool                   `protobuf:\"varint,2,opt,name=default,proto3\" json:\"default,omitempty\"`\n\tBy      *CELValue              `protobuf:\"bytes,3,opt,name=by,proto3\" json:\"by,omitempty\"`\n\tDefSet  *VariableDefinitionSet `protobuf:\"bytes,4,opt,name=def_set,json=defSet,proto3\" json:\"def_set,omitempty\"`\n}\n\nfunc (x *FieldOneofRule) Reset() {\n\t*x = FieldOneofRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[24]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *FieldOneofRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*FieldOneofRule) ProtoMessage() {}\n\nfunc (x *FieldOneofRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[24]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use FieldOneofRule.ProtoReflect.Descriptor instead.\nfunc (*FieldOneofRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{24}\n}\n\nfunc (x *FieldOneofRule) GetIf() *CELValue {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn nil\n}\n\nfunc (x *FieldOneofRule) GetDefault() bool {\n\tif x != nil {\n\t\treturn x.Default\n\t}\n\treturn false\n}\n\nfunc (x *FieldOneofRule) GetBy() *CELValue {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn nil\n}\n\nfunc (x *FieldOneofRule) GetDefSet() *VariableDefinitionSet {\n\tif x != nil {\n\t\treturn x.DefSet\n\t}\n\treturn nil\n}\n\ntype VariableDefinitionGroup struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\t// Types that are assignable to Group:\n\t//\n\t//\t*VariableDefinitionGroup_Sequential\n\t//\t*VariableDefinitionGroup_Concurrent\n\tGroup isVariableDefinitionGroup_Group `protobuf_oneof:\"group\"`\n}\n\nfunc (x *VariableDefinitionGroup) Reset() {\n\t*x = VariableDefinitionGroup{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[25]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *VariableDefinitionGroup) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*VariableDefinitionGroup) ProtoMessage() {}\n\nfunc (x *VariableDefinitionGroup) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[25]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use VariableDefinitionGroup.ProtoReflect.Descriptor instead.\nfunc (*VariableDefinitionGroup) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{25}\n}\n\nfunc (x *VariableDefinitionGroup) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (m *VariableDefinitionGroup) GetGroup() isVariableDefinitionGroup_Group {\n\tif m != nil {\n\t\treturn m.Group\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinitionGroup) GetSequential() *SequentialVariableDefinitionGroup {\n\tif x, ok := x.GetGroup().(*VariableDefinitionGroup_Sequential); ok {\n\t\treturn x.Sequential\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinitionGroup) GetConcurrent() *ConcurrentVariableDefinitionGroup {\n\tif x, ok := x.GetGroup().(*VariableDefinitionGroup_Concurrent); ok {\n\t\treturn x.Concurrent\n\t}\n\treturn nil\n}\n\ntype isVariableDefinitionGroup_Group interface {\n\tisVariableDefinitionGroup_Group()\n}\n\ntype VariableDefinitionGroup_Sequential struct {\n\tSequential *SequentialVariableDefinitionGroup `protobuf:\"bytes,2,opt,name=sequential,proto3,oneof\"`\n}\n\ntype VariableDefinitionGroup_Concurrent struct {\n\tConcurrent *ConcurrentVariableDefinitionGroup `protobuf:\"bytes,3,opt,name=concurrent,proto3,oneof\"`\n}\n\nfunc (*VariableDefinitionGroup_Sequential) isVariableDefinitionGroup_Group() {}\n\nfunc (*VariableDefinitionGroup_Concurrent) isVariableDefinitionGroup_Group() {}\n\ntype SequentialVariableDefinitionGroup struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tStart string `protobuf:\"bytes,1,opt,name=start,proto3\" json:\"start,omitempty\"`\n\tEnd   string `protobuf:\"bytes,2,opt,name=end,proto3\" json:\"end,omitempty\"`\n}\n\nfunc (x *SequentialVariableDefinitionGroup) Reset() {\n\t*x = SequentialVariableDefinitionGroup{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[26]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SequentialVariableDefinitionGroup) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SequentialVariableDefinitionGroup) ProtoMessage() {}\n\nfunc (x *SequentialVariableDefinitionGroup) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[26]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SequentialVariableDefinitionGroup.ProtoReflect.Descriptor instead.\nfunc (*SequentialVariableDefinitionGroup) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{26}\n}\n\nfunc (x *SequentialVariableDefinitionGroup) GetStart() string {\n\tif x != nil {\n\t\treturn x.Start\n\t}\n\treturn \"\"\n}\n\nfunc (x *SequentialVariableDefinitionGroup) GetEnd() string {\n\tif x != nil {\n\t\treturn x.End\n\t}\n\treturn \"\"\n}\n\ntype ConcurrentVariableDefinitionGroup struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tStarts []string `protobuf:\"bytes,1,rep,name=starts,proto3\" json:\"starts,omitempty\"`\n\tEnd    string   `protobuf:\"bytes,2,opt,name=end,proto3\" json:\"end,omitempty\"`\n}\n\nfunc (x *ConcurrentVariableDefinitionGroup) Reset() {\n\t*x = ConcurrentVariableDefinitionGroup{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[27]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ConcurrentVariableDefinitionGroup) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ConcurrentVariableDefinitionGroup) ProtoMessage() {}\n\nfunc (x *ConcurrentVariableDefinitionGroup) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[27]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ConcurrentVariableDefinitionGroup.ProtoReflect.Descriptor instead.\nfunc (*ConcurrentVariableDefinitionGroup) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{27}\n}\n\nfunc (x *ConcurrentVariableDefinitionGroup) GetStarts() []string {\n\tif x != nil {\n\t\treturn x.Starts\n\t}\n\treturn nil\n}\n\nfunc (x *ConcurrentVariableDefinitionGroup) GetEnd() string {\n\tif x != nil {\n\t\treturn x.End\n\t}\n\treturn \"\"\n}\n\ntype MessageDependencyGraph struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId          string   `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tRootNodeIds []string `protobuf:\"bytes,2,rep,name=root_node_ids,json=rootNodeIds,proto3\" json:\"root_node_ids,omitempty\"`\n}\n\nfunc (x *MessageDependencyGraph) Reset() {\n\t*x = MessageDependencyGraph{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[28]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MessageDependencyGraph) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MessageDependencyGraph) ProtoMessage() {}\n\nfunc (x *MessageDependencyGraph) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[28]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MessageDependencyGraph.ProtoReflect.Descriptor instead.\nfunc (*MessageDependencyGraph) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{28}\n}\n\nfunc (x *MessageDependencyGraph) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *MessageDependencyGraph) GetRootNodeIds() []string {\n\tif x != nil {\n\t\treturn x.RootNodeIds\n\t}\n\treturn nil\n}\n\ntype MessageDependencyGraphNode struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId                   string   `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tChildIds             []string `protobuf:\"bytes,2,rep,name=child_ids,json=childIds,proto3\" json:\"child_ids,omitempty\"`\n\tBaseMessageId        string   `protobuf:\"bytes,3,opt,name=base_message_id,json=baseMessageId,proto3\" json:\"base_message_id,omitempty\"`\n\tVariableDefinitionId string   `protobuf:\"bytes,4,opt,name=variable_definition_id,json=variableDefinitionId,proto3\" json:\"variable_definition_id,omitempty\"`\n}\n\nfunc (x *MessageDependencyGraphNode) Reset() {\n\t*x = MessageDependencyGraphNode{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[29]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MessageDependencyGraphNode) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MessageDependencyGraphNode) ProtoMessage() {}\n\nfunc (x *MessageDependencyGraphNode) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[29]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MessageDependencyGraphNode.ProtoReflect.Descriptor instead.\nfunc (*MessageDependencyGraphNode) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{29}\n}\n\nfunc (x *MessageDependencyGraphNode) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *MessageDependencyGraphNode) GetChildIds() []string {\n\tif x != nil {\n\t\treturn x.ChildIds\n\t}\n\treturn nil\n}\n\nfunc (x *MessageDependencyGraphNode) GetBaseMessageId() string {\n\tif x != nil {\n\t\treturn x.BaseMessageId\n\t}\n\treturn \"\"\n}\n\nfunc (x *MessageDependencyGraphNode) GetVariableDefinitionId() string {\n\tif x != nil {\n\t\treturn x.VariableDefinitionId\n\t}\n\treturn \"\"\n}\n\ntype VariableExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tType *Type `protobuf:\"bytes,1,opt,name=type,proto3\" json:\"type,omitempty\"`\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*VariableExpr_By\n\t//\t*VariableExpr_Map\n\t//\t*VariableExpr_Call\n\t//\t*VariableExpr_Message\n\t//\t*VariableExpr_Validation\n\t//\t*VariableExpr_Enum\n\t//\t*VariableExpr_Switch\n\tExpr isVariableExpr_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *VariableExpr) Reset() {\n\t*x = VariableExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[30]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *VariableExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*VariableExpr) ProtoMessage() {}\n\nfunc (x *VariableExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[30]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use VariableExpr.ProtoReflect.Descriptor instead.\nfunc (*VariableExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{30}\n}\n\nfunc (x *VariableExpr) GetType() *Type {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nfunc (m *VariableExpr) GetExpr() isVariableExpr_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *VariableExpr) GetBy() *CELValue {\n\tif x, ok := x.GetExpr().(*VariableExpr_By); ok {\n\t\treturn x.By\n\t}\n\treturn nil\n}\n\nfunc (x *VariableExpr) GetMap() *MapExpr {\n\tif x, ok := x.GetExpr().(*VariableExpr_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\nfunc (x *VariableExpr) GetCall() *CallExpr {\n\tif x, ok := x.GetExpr().(*VariableExpr_Call); ok {\n\t\treturn x.Call\n\t}\n\treturn nil\n}\n\nfunc (x *VariableExpr) GetMessage() *MessageExpr {\n\tif x, ok := x.GetExpr().(*VariableExpr_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *VariableExpr) GetValidation() *ValidationExpr {\n\tif x, ok := x.GetExpr().(*VariableExpr_Validation); ok {\n\t\treturn x.Validation\n\t}\n\treturn nil\n}\n\nfunc (x *VariableExpr) GetEnum() *EnumExpr {\n\tif x, ok := x.GetExpr().(*VariableExpr_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn nil\n}\n\nfunc (x *VariableExpr) GetSwitch() *SwitchExpr {\n\tif x, ok := x.GetExpr().(*VariableExpr_Switch); ok {\n\t\treturn x.Switch\n\t}\n\treturn nil\n}\n\ntype isVariableExpr_Expr interface {\n\tisVariableExpr_Expr()\n}\n\ntype VariableExpr_By struct {\n\tBy *CELValue `protobuf:\"bytes,2,opt,name=by,proto3,oneof\"`\n}\n\ntype VariableExpr_Map struct {\n\tMap *MapExpr `protobuf:\"bytes,3,opt,name=map,proto3,oneof\"`\n}\n\ntype VariableExpr_Call struct {\n\tCall *CallExpr `protobuf:\"bytes,4,opt,name=call,proto3,oneof\"`\n}\n\ntype VariableExpr_Message struct {\n\tMessage *MessageExpr `protobuf:\"bytes,5,opt,name=message,proto3,oneof\"`\n}\n\ntype VariableExpr_Validation struct {\n\tValidation *ValidationExpr `protobuf:\"bytes,6,opt,name=validation,proto3,oneof\"`\n}\n\ntype VariableExpr_Enum struct {\n\tEnum *EnumExpr `protobuf:\"bytes,7,opt,name=enum,proto3,oneof\"`\n}\n\ntype VariableExpr_Switch struct {\n\tSwitch *SwitchExpr `protobuf:\"bytes,8,opt,name=switch,proto3,oneof\"`\n}\n\nfunc (*VariableExpr_By) isVariableExpr_Expr() {}\n\nfunc (*VariableExpr_Map) isVariableExpr_Expr() {}\n\nfunc (*VariableExpr_Call) isVariableExpr_Expr() {}\n\nfunc (*VariableExpr_Message) isVariableExpr_Expr() {}\n\nfunc (*VariableExpr_Validation) isVariableExpr_Expr() {}\n\nfunc (*VariableExpr_Enum) isVariableExpr_Expr() {}\n\nfunc (*VariableExpr_Switch) isVariableExpr_Expr() {}\n\ntype Type struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tKind     TypeKind `protobuf:\"varint,1,opt,name=kind,proto3,enum=grpc.federation.generator.plugin.TypeKind\" json:\"kind,omitempty\"`\n\tRepeated bool     `protobuf:\"varint,2,opt,name=repeated,proto3\" json:\"repeated,omitempty\"`\n\tIsNull   bool     `protobuf:\"varint,3,opt,name=is_null,json=isNull,proto3\" json:\"is_null,omitempty\"`\n\t// Types that are assignable to Ref:\n\t//\n\t//\t*Type_MessageId\n\t//\t*Type_EnumId\n\t//\t*Type_OneofFieldId\n\tRef isType_Ref `protobuf_oneof:\"ref\"`\n}\n\nfunc (x *Type) Reset() {\n\t*x = Type{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[31]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Type) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Type) ProtoMessage() {}\n\nfunc (x *Type) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[31]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Type.ProtoReflect.Descriptor instead.\nfunc (*Type) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{31}\n}\n\nfunc (x *Type) GetKind() TypeKind {\n\tif x != nil {\n\t\treturn x.Kind\n\t}\n\treturn TypeKind_UNKNOWN_TYPE\n}\n\nfunc (x *Type) GetRepeated() bool {\n\tif x != nil {\n\t\treturn x.Repeated\n\t}\n\treturn false\n}\n\nfunc (x *Type) GetIsNull() bool {\n\tif x != nil {\n\t\treturn x.IsNull\n\t}\n\treturn false\n}\n\nfunc (m *Type) GetRef() isType_Ref {\n\tif m != nil {\n\t\treturn m.Ref\n\t}\n\treturn nil\n}\n\nfunc (x *Type) GetMessageId() string {\n\tif x, ok := x.GetRef().(*Type_MessageId); ok {\n\t\treturn x.MessageId\n\t}\n\treturn \"\"\n}\n\nfunc (x *Type) GetEnumId() string {\n\tif x, ok := x.GetRef().(*Type_EnumId); ok {\n\t\treturn x.EnumId\n\t}\n\treturn \"\"\n}\n\nfunc (x *Type) GetOneofFieldId() string {\n\tif x, ok := x.GetRef().(*Type_OneofFieldId); ok {\n\t\treturn x.OneofFieldId\n\t}\n\treturn \"\"\n}\n\ntype isType_Ref interface {\n\tisType_Ref()\n}\n\ntype Type_MessageId struct {\n\tMessageId string `protobuf:\"bytes,4,opt,name=message_id,json=messageId,proto3,oneof\"`\n}\n\ntype Type_EnumId struct {\n\tEnumId string `protobuf:\"bytes,5,opt,name=enum_id,json=enumId,proto3,oneof\"`\n}\n\ntype Type_OneofFieldId struct {\n\tOneofFieldId string `protobuf:\"bytes,6,opt,name=oneof_field_id,json=oneofFieldId,proto3,oneof\"`\n}\n\nfunc (*Type_MessageId) isType_Ref() {}\n\nfunc (*Type_EnumId) isType_Ref() {}\n\nfunc (*Type_OneofFieldId) isType_Ref() {}\n\ntype CELValue struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tExpr string `protobuf:\"bytes,1,opt,name=expr,proto3\" json:\"expr,omitempty\"`\n\tOut  *Type  `protobuf:\"bytes,2,opt,name=out,proto3\" json:\"out,omitempty\"`\n}\n\nfunc (x *CELValue) Reset() {\n\t*x = CELValue{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[32]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELValue) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELValue) ProtoMessage() {}\n\nfunc (x *CELValue) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[32]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELValue.ProtoReflect.Descriptor instead.\nfunc (*CELValue) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{32}\n}\n\nfunc (x *CELValue) GetExpr() string {\n\tif x != nil {\n\t\treturn x.Expr\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELValue) GetOut() *Type {\n\tif x != nil {\n\t\treturn x.Out\n\t}\n\treturn nil\n}\n\ntype MapExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tIterator *Iterator        `protobuf:\"bytes,1,opt,name=iterator,proto3\" json:\"iterator,omitempty\"`\n\tExpr     *MapIteratorExpr `protobuf:\"bytes,2,opt,name=expr,proto3\" json:\"expr,omitempty\"`\n}\n\nfunc (x *MapExpr) Reset() {\n\t*x = MapExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[33]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MapExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MapExpr) ProtoMessage() {}\n\nfunc (x *MapExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[33]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MapExpr.ProtoReflect.Descriptor instead.\nfunc (*MapExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{33}\n}\n\nfunc (x *MapExpr) GetIterator() *Iterator {\n\tif x != nil {\n\t\treturn x.Iterator\n\t}\n\treturn nil\n}\n\nfunc (x *MapExpr) GetExpr() *MapIteratorExpr {\n\tif x != nil {\n\t\treturn x.Expr\n\t}\n\treturn nil\n}\n\ntype Iterator struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName     string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tSourceId string `protobuf:\"bytes,2,opt,name=source_id,json=sourceId,proto3\" json:\"source_id,omitempty\"`\n}\n\nfunc (x *Iterator) Reset() {\n\t*x = Iterator{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[34]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Iterator) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Iterator) ProtoMessage() {}\n\nfunc (x *Iterator) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[34]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Iterator.ProtoReflect.Descriptor instead.\nfunc (*Iterator) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{34}\n}\n\nfunc (x *Iterator) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Iterator) GetSourceId() string {\n\tif x != nil {\n\t\treturn x.SourceId\n\t}\n\treturn \"\"\n}\n\ntype MapIteratorExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tType *Type `protobuf:\"bytes,1,opt,name=type,proto3\" json:\"type,omitempty\"`\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*MapIteratorExpr_By\n\t//\t*MapIteratorExpr_Message\n\t//\t*MapIteratorExpr_Enum\n\tExpr isMapIteratorExpr_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *MapIteratorExpr) Reset() {\n\t*x = MapIteratorExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[35]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MapIteratorExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MapIteratorExpr) ProtoMessage() {}\n\nfunc (x *MapIteratorExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[35]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MapIteratorExpr.ProtoReflect.Descriptor instead.\nfunc (*MapIteratorExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{35}\n}\n\nfunc (x *MapIteratorExpr) GetType() *Type {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nfunc (m *MapIteratorExpr) GetExpr() isMapIteratorExpr_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *MapIteratorExpr) GetBy() *CELValue {\n\tif x, ok := x.GetExpr().(*MapIteratorExpr_By); ok {\n\t\treturn x.By\n\t}\n\treturn nil\n}\n\nfunc (x *MapIteratorExpr) GetMessage() *MessageExpr {\n\tif x, ok := x.GetExpr().(*MapIteratorExpr_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *MapIteratorExpr) GetEnum() *EnumExpr {\n\tif x, ok := x.GetExpr().(*MapIteratorExpr_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn nil\n}\n\ntype isMapIteratorExpr_Expr interface {\n\tisMapIteratorExpr_Expr()\n}\n\ntype MapIteratorExpr_By struct {\n\tBy *CELValue `protobuf:\"bytes,2,opt,name=by,proto3,oneof\"`\n}\n\ntype MapIteratorExpr_Message struct {\n\tMessage *MessageExpr `protobuf:\"bytes,3,opt,name=message,proto3,oneof\"`\n}\n\ntype MapIteratorExpr_Enum struct {\n\tEnum *EnumExpr `protobuf:\"bytes,4,opt,name=enum,proto3,oneof\"`\n}\n\nfunc (*MapIteratorExpr_By) isMapIteratorExpr_Expr() {}\n\nfunc (*MapIteratorExpr_Message) isMapIteratorExpr_Expr() {}\n\nfunc (*MapIteratorExpr_Enum) isMapIteratorExpr_Expr() {}\n\ntype CallExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMethodId string               `protobuf:\"bytes,1,opt,name=method_id,json=methodId,proto3\" json:\"method_id,omitempty\"`\n\tRequest  *Request             `protobuf:\"bytes,2,opt,name=request,proto3\" json:\"request,omitempty\"`\n\tTimeout  *durationpb.Duration `protobuf:\"bytes,3,opt,name=timeout,proto3\" json:\"timeout,omitempty\"`\n\tRetry    *RetryPolicy         `protobuf:\"bytes,4,opt,name=retry,proto3\" json:\"retry,omitempty\"`\n\tErrors   []*GRPCError         `protobuf:\"bytes,5,rep,name=errors,proto3\" json:\"errors,omitempty\"`\n\tOption   *GRPCCallOption      `protobuf:\"bytes,6,opt,name=option,proto3\" json:\"option,omitempty\"`\n\tMetadata *CELValue            `protobuf:\"bytes,7,opt,name=metadata,proto3\" json:\"metadata,omitempty\"`\n}\n\nfunc (x *CallExpr) Reset() {\n\t*x = CallExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[36]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CallExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CallExpr) ProtoMessage() {}\n\nfunc (x *CallExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[36]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CallExpr.ProtoReflect.Descriptor instead.\nfunc (*CallExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{36}\n}\n\nfunc (x *CallExpr) GetMethodId() string {\n\tif x != nil {\n\t\treturn x.MethodId\n\t}\n\treturn \"\"\n}\n\nfunc (x *CallExpr) GetRequest() *Request {\n\tif x != nil {\n\t\treturn x.Request\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetTimeout() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.Timeout\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetRetry() *RetryPolicy {\n\tif x != nil {\n\t\treturn x.Retry\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetErrors() []*GRPCError {\n\tif x != nil {\n\t\treturn x.Errors\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetOption() *GRPCCallOption {\n\tif x != nil {\n\t\treturn x.Option\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetMetadata() *CELValue {\n\tif x != nil {\n\t\treturn x.Metadata\n\t}\n\treturn nil\n}\n\ntype RetryPolicy struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to Policy:\n\t//\n\t//\t*RetryPolicy_Constant\n\t//\t*RetryPolicy_Exponential\n\tPolicy isRetryPolicy_Policy `protobuf_oneof:\"policy\"`\n\tIf     *CELValue            `protobuf:\"bytes,3,opt,name=if,proto3\" json:\"if,omitempty\"`\n}\n\nfunc (x *RetryPolicy) Reset() {\n\t*x = RetryPolicy{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[37]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RetryPolicy) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RetryPolicy) ProtoMessage() {}\n\nfunc (x *RetryPolicy) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[37]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RetryPolicy.ProtoReflect.Descriptor instead.\nfunc (*RetryPolicy) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{37}\n}\n\nfunc (m *RetryPolicy) GetPolicy() isRetryPolicy_Policy {\n\tif m != nil {\n\t\treturn m.Policy\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicy) GetConstant() *RetryPolicyConstant {\n\tif x, ok := x.GetPolicy().(*RetryPolicy_Constant); ok {\n\t\treturn x.Constant\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicy) GetExponential() *RetryPolicyExponential {\n\tif x, ok := x.GetPolicy().(*RetryPolicy_Exponential); ok {\n\t\treturn x.Exponential\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicy) GetIf() *CELValue {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn nil\n}\n\ntype isRetryPolicy_Policy interface {\n\tisRetryPolicy_Policy()\n}\n\ntype RetryPolicy_Constant struct {\n\tConstant *RetryPolicyConstant `protobuf:\"bytes,1,opt,name=constant,proto3,oneof\"`\n}\n\ntype RetryPolicy_Exponential struct {\n\tExponential *RetryPolicyExponential `protobuf:\"bytes,2,opt,name=exponential,proto3,oneof\"`\n}\n\nfunc (*RetryPolicy_Constant) isRetryPolicy_Policy() {}\n\nfunc (*RetryPolicy_Exponential) isRetryPolicy_Policy() {}\n\ntype RetryPolicyConstant struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tInterval   *durationpb.Duration `protobuf:\"bytes,1,opt,name=interval,proto3\" json:\"interval,omitempty\"`\n\tMaxRetries uint64               `protobuf:\"varint,2,opt,name=max_retries,json=maxRetries,proto3\" json:\"max_retries,omitempty\"`\n}\n\nfunc (x *RetryPolicyConstant) Reset() {\n\t*x = RetryPolicyConstant{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[38]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RetryPolicyConstant) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RetryPolicyConstant) ProtoMessage() {}\n\nfunc (x *RetryPolicyConstant) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[38]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RetryPolicyConstant.ProtoReflect.Descriptor instead.\nfunc (*RetryPolicyConstant) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{38}\n}\n\nfunc (x *RetryPolicyConstant) GetInterval() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.Interval\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicyConstant) GetMaxRetries() uint64 {\n\tif x != nil {\n\t\treturn x.MaxRetries\n\t}\n\treturn 0\n}\n\ntype RetryPolicyExponential struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tInitialInterval     *durationpb.Duration `protobuf:\"bytes,1,opt,name=initial_interval,json=initialInterval,proto3\" json:\"initial_interval,omitempty\"`\n\tRandomizationFactor float64              `protobuf:\"fixed64,2,opt,name=randomization_factor,json=randomizationFactor,proto3\" json:\"randomization_factor,omitempty\"`\n\tMultiplier          float64              `protobuf:\"fixed64,3,opt,name=multiplier,proto3\" json:\"multiplier,omitempty\"`\n\tMaxInterval         *durationpb.Duration `protobuf:\"bytes,4,opt,name=max_interval,json=maxInterval,proto3\" json:\"max_interval,omitempty\"`\n\tMaxRetries          uint64               `protobuf:\"varint,5,opt,name=max_retries,json=maxRetries,proto3\" json:\"max_retries,omitempty\"`\n\tMaxElapsedTime      *durationpb.Duration `protobuf:\"bytes,6,opt,name=max_elapsed_time,json=maxElapsedTime,proto3\" json:\"max_elapsed_time,omitempty\"`\n}\n\nfunc (x *RetryPolicyExponential) Reset() {\n\t*x = RetryPolicyExponential{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[39]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RetryPolicyExponential) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RetryPolicyExponential) ProtoMessage() {}\n\nfunc (x *RetryPolicyExponential) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[39]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RetryPolicyExponential.ProtoReflect.Descriptor instead.\nfunc (*RetryPolicyExponential) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{39}\n}\n\nfunc (x *RetryPolicyExponential) GetInitialInterval() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.InitialInterval\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicyExponential) GetRandomizationFactor() float64 {\n\tif x != nil {\n\t\treturn x.RandomizationFactor\n\t}\n\treturn 0\n}\n\nfunc (x *RetryPolicyExponential) GetMultiplier() float64 {\n\tif x != nil {\n\t\treturn x.Multiplier\n\t}\n\treturn 0\n}\n\nfunc (x *RetryPolicyExponential) GetMaxInterval() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.MaxInterval\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicyExponential) GetMaxRetries() uint64 {\n\tif x != nil {\n\t\treturn x.MaxRetries\n\t}\n\treturn 0\n}\n\nfunc (x *RetryPolicyExponential) GetMaxElapsedTime() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.MaxElapsedTime\n\t}\n\treturn nil\n}\n\ntype Request struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tArgs   []*Argument `protobuf:\"bytes,1,rep,name=args,proto3\" json:\"args,omitempty\"`\n\tTypeId string      `protobuf:\"bytes,2,opt,name=type_id,json=typeId,proto3\" json:\"type_id,omitempty\"`\n}\n\nfunc (x *Request) Reset() {\n\t*x = Request{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[40]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Request) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Request) ProtoMessage() {}\n\nfunc (x *Request) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[40]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Request.ProtoReflect.Descriptor instead.\nfunc (*Request) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{40}\n}\n\nfunc (x *Request) GetArgs() []*Argument {\n\tif x != nil {\n\t\treturn x.Args\n\t}\n\treturn nil\n}\n\nfunc (x *Request) GetTypeId() string {\n\tif x != nil {\n\t\treturn x.TypeId\n\t}\n\treturn \"\"\n}\n\ntype MessageExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessageId string      `protobuf:\"bytes,1,opt,name=message_id,json=messageId,proto3\" json:\"message_id,omitempty\"`\n\tArgs      []*Argument `protobuf:\"bytes,2,rep,name=args,proto3\" json:\"args,omitempty\"`\n}\n\nfunc (x *MessageExpr) Reset() {\n\t*x = MessageExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[41]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MessageExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MessageExpr) ProtoMessage() {}\n\nfunc (x *MessageExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[41]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MessageExpr.ProtoReflect.Descriptor instead.\nfunc (*MessageExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{41}\n}\n\nfunc (x *MessageExpr) GetMessageId() string {\n\tif x != nil {\n\t\treturn x.MessageId\n\t}\n\treturn \"\"\n}\n\nfunc (x *MessageExpr) GetArgs() []*Argument {\n\tif x != nil {\n\t\treturn x.Args\n\t}\n\treturn nil\n}\n\ntype EnumExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEnumId string    `protobuf:\"bytes,1,opt,name=enum_id,json=enumId,proto3\" json:\"enum_id,omitempty\"`\n\tBy     *CELValue `protobuf:\"bytes,2,opt,name=by,proto3\" json:\"by,omitempty\"`\n}\n\nfunc (x *EnumExpr) Reset() {\n\t*x = EnumExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[42]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumExpr) ProtoMessage() {}\n\nfunc (x *EnumExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[42]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumExpr.ProtoReflect.Descriptor instead.\nfunc (*EnumExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{42}\n}\n\nfunc (x *EnumExpr) GetEnumId() string {\n\tif x != nil {\n\t\treturn x.EnumId\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnumExpr) GetBy() *CELValue {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn nil\n}\n\ntype Argument struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName  string    `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tType  *Type     `protobuf:\"bytes,2,opt,name=type,proto3\" json:\"type,omitempty\"`\n\tValue *Value    `protobuf:\"bytes,3,opt,name=value,proto3\" json:\"value,omitempty\"`\n\tIf    *CELValue `protobuf:\"bytes,4,opt,name=if,proto3\" json:\"if,omitempty\"`\n}\n\nfunc (x *Argument) Reset() {\n\t*x = Argument{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[43]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Argument) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Argument) ProtoMessage() {}\n\nfunc (x *Argument) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[43]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Argument.ProtoReflect.Descriptor instead.\nfunc (*Argument) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{43}\n}\n\nfunc (x *Argument) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Argument) GetType() *Type {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nfunc (x *Argument) GetValue() *Value {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn nil\n}\n\nfunc (x *Argument) GetIf() *CELValue {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn nil\n}\n\ntype Value struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tInline bool      `protobuf:\"varint,1,opt,name=inline,proto3\" json:\"inline,omitempty\"`\n\tCel    *CELValue `protobuf:\"bytes,2,opt,name=cel,proto3\" json:\"cel,omitempty\"`\n}\n\nfunc (x *Value) Reset() {\n\t*x = Value{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[44]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Value) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Value) ProtoMessage() {}\n\nfunc (x *Value) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[44]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Value.ProtoReflect.Descriptor instead.\nfunc (*Value) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{44}\n}\n\nfunc (x *Value) GetInline() bool {\n\tif x != nil {\n\t\treturn x.Inline\n\t}\n\treturn false\n}\n\nfunc (x *Value) GetCel() *CELValue {\n\tif x != nil {\n\t\treturn x.Cel\n\t}\n\treturn nil\n}\n\ntype SwitchExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tType    *Type          `protobuf:\"bytes,1,opt,name=type,proto3\" json:\"type,omitempty\"`\n\tCases   []*SwitchCase  `protobuf:\"bytes,2,rep,name=cases,proto3\" json:\"cases,omitempty\"`\n\tDefault *SwitchDefault `protobuf:\"bytes,3,opt,name=default,proto3\" json:\"default,omitempty\"`\n}\n\nfunc (x *SwitchExpr) Reset() {\n\t*x = SwitchExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[45]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SwitchExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SwitchExpr) ProtoMessage() {}\n\nfunc (x *SwitchExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[45]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SwitchExpr.ProtoReflect.Descriptor instead.\nfunc (*SwitchExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{45}\n}\n\nfunc (x *SwitchExpr) GetType() *Type {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchExpr) GetCases() []*SwitchCase {\n\tif x != nil {\n\t\treturn x.Cases\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchExpr) GetDefault() *SwitchDefault {\n\tif x != nil {\n\t\treturn x.Default\n\t}\n\treturn nil\n}\n\ntype SwitchCase struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tIf     *CELValue              `protobuf:\"bytes,1,opt,name=if,proto3\" json:\"if,omitempty\"`\n\tBy     *CELValue              `protobuf:\"bytes,2,opt,name=by,proto3\" json:\"by,omitempty\"`\n\tDefSet *VariableDefinitionSet `protobuf:\"bytes,3,opt,name=def_set,json=defSet,proto3\" json:\"def_set,omitempty\"`\n}\n\nfunc (x *SwitchCase) Reset() {\n\t*x = SwitchCase{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[46]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SwitchCase) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SwitchCase) ProtoMessage() {}\n\nfunc (x *SwitchCase) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[46]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SwitchCase.ProtoReflect.Descriptor instead.\nfunc (*SwitchCase) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{46}\n}\n\nfunc (x *SwitchCase) GetIf() *CELValue {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchCase) GetBy() *CELValue {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchCase) GetDefSet() *VariableDefinitionSet {\n\tif x != nil {\n\t\treturn x.DefSet\n\t}\n\treturn nil\n}\n\ntype SwitchDefault struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tBy     *CELValue              `protobuf:\"bytes,1,opt,name=by,proto3\" json:\"by,omitempty\"`\n\tDefSet *VariableDefinitionSet `protobuf:\"bytes,2,opt,name=def_set,json=defSet,proto3\" json:\"def_set,omitempty\"`\n}\n\nfunc (x *SwitchDefault) Reset() {\n\t*x = SwitchDefault{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[47]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SwitchDefault) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SwitchDefault) ProtoMessage() {}\n\nfunc (x *SwitchDefault) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[47]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SwitchDefault.ProtoReflect.Descriptor instead.\nfunc (*SwitchDefault) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{47}\n}\n\nfunc (x *SwitchDefault) GetBy() *CELValue {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchDefault) GetDefSet() *VariableDefinitionSet {\n\tif x != nil {\n\t\treturn x.DefSet\n\t}\n\treturn nil\n}\n\ntype ValidationExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName  string     `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tError *GRPCError `protobuf:\"bytes,2,opt,name=error,proto3\" json:\"error,omitempty\"`\n}\n\nfunc (x *ValidationExpr) Reset() {\n\t*x = ValidationExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[48]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ValidationExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ValidationExpr) ProtoMessage() {}\n\nfunc (x *ValidationExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[48]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ValidationExpr.ProtoReflect.Descriptor instead.\nfunc (*ValidationExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{48}\n}\n\nfunc (x *ValidationExpr) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *ValidationExpr) GetError() *GRPCError {\n\tif x != nil {\n\t\treturn x.Error\n\t}\n\treturn nil\n}\n\ntype GRPCError struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tDefSet            *VariableDefinitionSet `protobuf:\"bytes,1,opt,name=def_set,json=defSet,proto3\" json:\"def_set,omitempty\"`\n\tIf                *CELValue              `protobuf:\"bytes,2,opt,name=if,proto3\" json:\"if,omitempty\"`\n\tCode              *code.Code             `protobuf:\"varint,3,opt,name=code,proto3,enum=google.rpc.Code,oneof\" json:\"code,omitempty\"`\n\tMessage           *CELValue              `protobuf:\"bytes,4,opt,name=message,proto3\" json:\"message,omitempty\"`\n\tDetails           []*GRPCErrorDetail     `protobuf:\"bytes,5,rep,name=details,proto3\" json:\"details,omitempty\"`\n\tIgnore            bool                   `protobuf:\"varint,6,opt,name=ignore,proto3\" json:\"ignore,omitempty\"`\n\tIgnoreAndResponse *CELValue              `protobuf:\"bytes,7,opt,name=ignore_and_response,json=ignoreAndResponse,proto3\" json:\"ignore_and_response,omitempty\"`\n\tLogLevel          int32                  `protobuf:\"varint,8,opt,name=log_level,json=logLevel,proto3\" json:\"log_level,omitempty\"`\n}\n\nfunc (x *GRPCError) Reset() {\n\t*x = GRPCError{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[49]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GRPCError) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GRPCError) ProtoMessage() {}\n\nfunc (x *GRPCError) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[49]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GRPCError.ProtoReflect.Descriptor instead.\nfunc (*GRPCError) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{49}\n}\n\nfunc (x *GRPCError) GetDefSet() *VariableDefinitionSet {\n\tif x != nil {\n\t\treturn x.DefSet\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCError) GetIf() *CELValue {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCError) GetCode() code.Code {\n\tif x != nil && x.Code != nil {\n\t\treturn *x.Code\n\t}\n\treturn code.Code(0)\n}\n\nfunc (x *GRPCError) GetMessage() *CELValue {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCError) GetDetails() []*GRPCErrorDetail {\n\tif x != nil {\n\t\treturn x.Details\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCError) GetIgnore() bool {\n\tif x != nil {\n\t\treturn x.Ignore\n\t}\n\treturn false\n}\n\nfunc (x *GRPCError) GetIgnoreAndResponse() *CELValue {\n\tif x != nil {\n\t\treturn x.IgnoreAndResponse\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCError) GetLogLevel() int32 {\n\tif x != nil {\n\t\treturn x.LogLevel\n\t}\n\treturn 0\n}\n\ntype GRPCErrorDetail struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tDefSet               *VariableDefinitionSet `protobuf:\"bytes,1,opt,name=def_set,json=defSet,proto3\" json:\"def_set,omitempty\"`\n\tIf                   *CELValue              `protobuf:\"bytes,2,opt,name=if,proto3\" json:\"if,omitempty\"`\n\tMessages             *VariableDefinitionSet `protobuf:\"bytes,3,opt,name=messages,proto3\" json:\"messages,omitempty\"`\n\tPreconditionFailures []*PreconditionFailure `protobuf:\"bytes,4,rep,name=precondition_failures,json=preconditionFailures,proto3\" json:\"precondition_failures,omitempty\"`\n\tBadRequests          []*BadRequest          `protobuf:\"bytes,5,rep,name=bad_requests,json=badRequests,proto3\" json:\"bad_requests,omitempty\"`\n\tLocalizedMessages    []*LocalizedMessage    `protobuf:\"bytes,6,rep,name=localized_messages,json=localizedMessages,proto3\" json:\"localized_messages,omitempty\"`\n\tBy                   []*CELValue            `protobuf:\"bytes,7,rep,name=by,proto3\" json:\"by,omitempty\"`\n}\n\nfunc (x *GRPCErrorDetail) Reset() {\n\t*x = GRPCErrorDetail{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[50]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GRPCErrorDetail) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GRPCErrorDetail) ProtoMessage() {}\n\nfunc (x *GRPCErrorDetail) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[50]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GRPCErrorDetail.ProtoReflect.Descriptor instead.\nfunc (*GRPCErrorDetail) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{50}\n}\n\nfunc (x *GRPCErrorDetail) GetDefSet() *VariableDefinitionSet {\n\tif x != nil {\n\t\treturn x.DefSet\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetIf() *CELValue {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetMessages() *VariableDefinitionSet {\n\tif x != nil {\n\t\treturn x.Messages\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetPreconditionFailures() []*PreconditionFailure {\n\tif x != nil {\n\t\treturn x.PreconditionFailures\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetBadRequests() []*BadRequest {\n\tif x != nil {\n\t\treturn x.BadRequests\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetLocalizedMessages() []*LocalizedMessage {\n\tif x != nil {\n\t\treturn x.LocalizedMessages\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetBy() []*CELValue {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn nil\n}\n\ntype PreconditionFailure struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tViolations []*PreconditionFailureViolation `protobuf:\"bytes,1,rep,name=violations,proto3\" json:\"violations,omitempty\"`\n}\n\nfunc (x *PreconditionFailure) Reset() {\n\t*x = PreconditionFailure{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[51]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *PreconditionFailure) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*PreconditionFailure) ProtoMessage() {}\n\nfunc (x *PreconditionFailure) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[51]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use PreconditionFailure.ProtoReflect.Descriptor instead.\nfunc (*PreconditionFailure) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{51}\n}\n\nfunc (x *PreconditionFailure) GetViolations() []*PreconditionFailureViolation {\n\tif x != nil {\n\t\treturn x.Violations\n\t}\n\treturn nil\n}\n\ntype PreconditionFailureViolation struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tType        *CELValue `protobuf:\"bytes,1,opt,name=type,proto3\" json:\"type,omitempty\"`\n\tSubject     *CELValue `protobuf:\"bytes,2,opt,name=subject,proto3\" json:\"subject,omitempty\"`\n\tDescription *CELValue `protobuf:\"bytes,3,opt,name=description,proto3\" json:\"description,omitempty\"`\n}\n\nfunc (x *PreconditionFailureViolation) Reset() {\n\t*x = PreconditionFailureViolation{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[52]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *PreconditionFailureViolation) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*PreconditionFailureViolation) ProtoMessage() {}\n\nfunc (x *PreconditionFailureViolation) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[52]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use PreconditionFailureViolation.ProtoReflect.Descriptor instead.\nfunc (*PreconditionFailureViolation) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{52}\n}\n\nfunc (x *PreconditionFailureViolation) GetType() *CELValue {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nfunc (x *PreconditionFailureViolation) GetSubject() *CELValue {\n\tif x != nil {\n\t\treturn x.Subject\n\t}\n\treturn nil\n}\n\nfunc (x *PreconditionFailureViolation) GetDescription() *CELValue {\n\tif x != nil {\n\t\treturn x.Description\n\t}\n\treturn nil\n}\n\ntype BadRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tFieldViolations []*BadRequestFieldViolation `protobuf:\"bytes,1,rep,name=field_violations,json=fieldViolations,proto3\" json:\"field_violations,omitempty\"`\n}\n\nfunc (x *BadRequest) Reset() {\n\t*x = BadRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[53]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *BadRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*BadRequest) ProtoMessage() {}\n\nfunc (x *BadRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[53]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use BadRequest.ProtoReflect.Descriptor instead.\nfunc (*BadRequest) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{53}\n}\n\nfunc (x *BadRequest) GetFieldViolations() []*BadRequestFieldViolation {\n\tif x != nil {\n\t\treturn x.FieldViolations\n\t}\n\treturn nil\n}\n\ntype BadRequestFieldViolation struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tField       *CELValue `protobuf:\"bytes,1,opt,name=field,proto3\" json:\"field,omitempty\"`\n\tDescription *CELValue `protobuf:\"bytes,2,opt,name=description,proto3\" json:\"description,omitempty\"`\n}\n\nfunc (x *BadRequestFieldViolation) Reset() {\n\t*x = BadRequestFieldViolation{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[54]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *BadRequestFieldViolation) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*BadRequestFieldViolation) ProtoMessage() {}\n\nfunc (x *BadRequestFieldViolation) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[54]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use BadRequestFieldViolation.ProtoReflect.Descriptor instead.\nfunc (*BadRequestFieldViolation) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{54}\n}\n\nfunc (x *BadRequestFieldViolation) GetField() *CELValue {\n\tif x != nil {\n\t\treturn x.Field\n\t}\n\treturn nil\n}\n\nfunc (x *BadRequestFieldViolation) GetDescription() *CELValue {\n\tif x != nil {\n\t\treturn x.Description\n\t}\n\treturn nil\n}\n\ntype LocalizedMessage struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tLocale  string    `protobuf:\"bytes,1,opt,name=locale,proto3\" json:\"locale,omitempty\"`\n\tMessage *CELValue `protobuf:\"bytes,2,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *LocalizedMessage) Reset() {\n\t*x = LocalizedMessage{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[55]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *LocalizedMessage) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*LocalizedMessage) ProtoMessage() {}\n\nfunc (x *LocalizedMessage) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[55]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use LocalizedMessage.ProtoReflect.Descriptor instead.\nfunc (*LocalizedMessage) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{55}\n}\n\nfunc (x *LocalizedMessage) GetLocale() string {\n\tif x != nil {\n\t\treturn x.Locale\n\t}\n\treturn \"\"\n}\n\nfunc (x *LocalizedMessage) GetMessage() *CELValue {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\ntype GRPCCallOption struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tContentSubtype     *string `protobuf:\"bytes,1,opt,name=content_subtype,json=contentSubtype,proto3,oneof\" json:\"content_subtype,omitempty\"`\n\tHeaderId           *string `protobuf:\"bytes,2,opt,name=header_id,json=headerId,proto3,oneof\" json:\"header_id,omitempty\"`\n\tMaxCallRecvMsgSize *int64  `protobuf:\"varint,3,opt,name=max_call_recv_msg_size,json=maxCallRecvMsgSize,proto3,oneof\" json:\"max_call_recv_msg_size,omitempty\"`\n\tMaxCallSendMsgSize *int64  `protobuf:\"varint,4,opt,name=max_call_send_msg_size,json=maxCallSendMsgSize,proto3,oneof\" json:\"max_call_send_msg_size,omitempty\"`\n\tStaticMethod       *bool   `protobuf:\"varint,5,opt,name=static_method,json=staticMethod,proto3,oneof\" json:\"static_method,omitempty\"`\n\tTrailerId          *string `protobuf:\"bytes,6,opt,name=trailer_id,json=trailerId,proto3,oneof\" json:\"trailer_id,omitempty\"`\n\tWaitForReady       *bool   `protobuf:\"varint,7,opt,name=wait_for_ready,json=waitForReady,proto3,oneof\" json:\"wait_for_ready,omitempty\"`\n}\n\nfunc (x *GRPCCallOption) Reset() {\n\t*x = GRPCCallOption{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[56]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GRPCCallOption) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GRPCCallOption) ProtoMessage() {}\n\nfunc (x *GRPCCallOption) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[56]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GRPCCallOption.ProtoReflect.Descriptor instead.\nfunc (*GRPCCallOption) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{56}\n}\n\nfunc (x *GRPCCallOption) GetContentSubtype() string {\n\tif x != nil && x.ContentSubtype != nil {\n\t\treturn *x.ContentSubtype\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCCallOption) GetHeaderId() string {\n\tif x != nil && x.HeaderId != nil {\n\t\treturn *x.HeaderId\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCCallOption) GetMaxCallRecvMsgSize() int64 {\n\tif x != nil && x.MaxCallRecvMsgSize != nil {\n\t\treturn *x.MaxCallRecvMsgSize\n\t}\n\treturn 0\n}\n\nfunc (x *GRPCCallOption) GetMaxCallSendMsgSize() int64 {\n\tif x != nil && x.MaxCallSendMsgSize != nil {\n\t\treturn *x.MaxCallSendMsgSize\n\t}\n\treturn 0\n}\n\nfunc (x *GRPCCallOption) GetStaticMethod() bool {\n\tif x != nil && x.StaticMethod != nil {\n\t\treturn *x.StaticMethod\n\t}\n\treturn false\n}\n\nfunc (x *GRPCCallOption) GetTrailerId() string {\n\tif x != nil && x.TrailerId != nil {\n\t\treturn *x.TrailerId\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCCallOption) GetWaitForReady() bool {\n\tif x != nil && x.WaitForReady != nil {\n\t\treturn *x.WaitForReady\n\t}\n\treturn false\n}\n\ntype Oneof struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId        string   `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName      string   `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tMessageId string   `protobuf:\"bytes,3,opt,name=message_id,json=messageId,proto3\" json:\"message_id,omitempty\"`\n\tFieldIds  []string `protobuf:\"bytes,4,rep,name=field_ids,json=fieldIds,proto3\" json:\"field_ids,omitempty\"`\n}\n\nfunc (x *Oneof) Reset() {\n\t*x = Oneof{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[57]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Oneof) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Oneof) ProtoMessage() {}\n\nfunc (x *Oneof) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[57]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Oneof.ProtoReflect.Descriptor instead.\nfunc (*Oneof) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{57}\n}\n\nfunc (x *Oneof) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *Oneof) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Oneof) GetMessageId() string {\n\tif x != nil {\n\t\treturn x.MessageId\n\t}\n\treturn \"\"\n}\n\nfunc (x *Oneof) GetFieldIds() []string {\n\tif x != nil {\n\t\treturn x.FieldIds\n\t}\n\treturn nil\n}\n\ntype Enum struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId        string    `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName      string    `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tValueIds  []string  `protobuf:\"bytes,3,rep,name=value_ids,json=valueIds,proto3\" json:\"value_ids,omitempty\"`\n\tMessageId string    `protobuf:\"bytes,4,opt,name=message_id,json=messageId,proto3\" json:\"message_id,omitempty\"`\n\tFileId    string    `protobuf:\"bytes,5,opt,name=file_id,json=fileId,proto3\" json:\"file_id,omitempty\"`\n\tRule      *EnumRule `protobuf:\"bytes,6,opt,name=rule,proto3\" json:\"rule,omitempty\"`\n}\n\nfunc (x *Enum) Reset() {\n\t*x = Enum{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[58]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Enum) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Enum) ProtoMessage() {}\n\nfunc (x *Enum) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[58]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Enum.ProtoReflect.Descriptor instead.\nfunc (*Enum) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{58}\n}\n\nfunc (x *Enum) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *Enum) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Enum) GetValueIds() []string {\n\tif x != nil {\n\t\treturn x.ValueIds\n\t}\n\treturn nil\n}\n\nfunc (x *Enum) GetMessageId() string {\n\tif x != nil {\n\t\treturn x.MessageId\n\t}\n\treturn \"\"\n}\n\nfunc (x *Enum) GetFileId() string {\n\tif x != nil {\n\t\treturn x.FileId\n\t}\n\treturn \"\"\n}\n\nfunc (x *Enum) GetRule() *EnumRule {\n\tif x != nil {\n\t\treturn x.Rule\n\t}\n\treturn nil\n}\n\ntype EnumValue struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId     string         `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tValue  string         `protobuf:\"bytes,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n\tEnumId string         `protobuf:\"bytes,3,opt,name=enum_id,json=enumId,proto3\" json:\"enum_id,omitempty\"`\n\tRule   *EnumValueRule `protobuf:\"bytes,4,opt,name=rule,proto3\" json:\"rule,omitempty\"`\n}\n\nfunc (x *EnumValue) Reset() {\n\t*x = EnumValue{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[59]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumValue) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumValue) ProtoMessage() {}\n\nfunc (x *EnumValue) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[59]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumValue.ProtoReflect.Descriptor instead.\nfunc (*EnumValue) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{59}\n}\n\nfunc (x *EnumValue) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnumValue) GetValue() string {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnumValue) GetEnumId() string {\n\tif x != nil {\n\t\treturn x.EnumId\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnumValue) GetRule() *EnumValueRule {\n\tif x != nil {\n\t\treturn x.Rule\n\t}\n\treturn nil\n}\n\ntype EnumRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tAliasIds []string `protobuf:\"bytes,1,rep,name=alias_ids,json=aliasIds,proto3\" json:\"alias_ids,omitempty\"`\n}\n\nfunc (x *EnumRule) Reset() {\n\t*x = EnumRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[60]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumRule) ProtoMessage() {}\n\nfunc (x *EnumRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[60]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumRule.ProtoReflect.Descriptor instead.\nfunc (*EnumRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{60}\n}\n\nfunc (x *EnumRule) GetAliasIds() []string {\n\tif x != nil {\n\t\treturn x.AliasIds\n\t}\n\treturn nil\n}\n\ntype EnumValueRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tDefault bool                  `protobuf:\"varint,1,opt,name=default,proto3\" json:\"default,omitempty\"`\n\tAliases []*EnumValueAlias     `protobuf:\"bytes,2,rep,name=aliases,proto3\" json:\"aliases,omitempty\"`\n\tAttrs   []*EnumValueAttribute `protobuf:\"bytes,3,rep,name=attrs,proto3\" json:\"attrs,omitempty\"`\n\tNoalias bool                  `protobuf:\"varint,4,opt,name=noalias,proto3\" json:\"noalias,omitempty\"`\n}\n\nfunc (x *EnumValueRule) Reset() {\n\t*x = EnumValueRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[61]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumValueRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumValueRule) ProtoMessage() {}\n\nfunc (x *EnumValueRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[61]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumValueRule.ProtoReflect.Descriptor instead.\nfunc (*EnumValueRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{61}\n}\n\nfunc (x *EnumValueRule) GetDefault() bool {\n\tif x != nil {\n\t\treturn x.Default\n\t}\n\treturn false\n}\n\nfunc (x *EnumValueRule) GetAliases() []*EnumValueAlias {\n\tif x != nil {\n\t\treturn x.Aliases\n\t}\n\treturn nil\n}\n\nfunc (x *EnumValueRule) GetAttrs() []*EnumValueAttribute {\n\tif x != nil {\n\t\treturn x.Attrs\n\t}\n\treturn nil\n}\n\nfunc (x *EnumValueRule) GetNoalias() bool {\n\tif x != nil {\n\t\treturn x.Noalias\n\t}\n\treturn false\n}\n\ntype EnumValueAlias struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEnumAliasId string   `protobuf:\"bytes,1,opt,name=enum_alias_id,json=enumAliasId,proto3\" json:\"enum_alias_id,omitempty\"`\n\tAliasIds    []string `protobuf:\"bytes,2,rep,name=alias_ids,json=aliasIds,proto3\" json:\"alias_ids,omitempty\"`\n}\n\nfunc (x *EnumValueAlias) Reset() {\n\t*x = EnumValueAlias{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[62]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumValueAlias) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumValueAlias) ProtoMessage() {}\n\nfunc (x *EnumValueAlias) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[62]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumValueAlias.ProtoReflect.Descriptor instead.\nfunc (*EnumValueAlias) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{62}\n}\n\nfunc (x *EnumValueAlias) GetEnumAliasId() string {\n\tif x != nil {\n\t\treturn x.EnumAliasId\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnumValueAlias) GetAliasIds() []string {\n\tif x != nil {\n\t\treturn x.AliasIds\n\t}\n\treturn nil\n}\n\ntype EnumValueAttribute struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName  string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tValue string `protobuf:\"bytes,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *EnumValueAttribute) Reset() {\n\t*x = EnumValueAttribute{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[63]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumValueAttribute) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumValueAttribute) ProtoMessage() {}\n\nfunc (x *EnumValueAttribute) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[63]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumValueAttribute.ProtoReflect.Descriptor instead.\nfunc (*EnumValueAttribute) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{63}\n}\n\nfunc (x *EnumValueAttribute) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnumValueAttribute) GetValue() string {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn \"\"\n}\n\ntype CELPlugin struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId          string         `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName        string         `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tDescription string         `protobuf:\"bytes,3,opt,name=description,proto3\" json:\"description,omitempty\"`\n\tFunctions   []*CELFunction `protobuf:\"bytes,4,rep,name=functions,proto3\" json:\"functions,omitempty\"`\n}\n\nfunc (x *CELPlugin) Reset() {\n\t*x = CELPlugin{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[64]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPlugin) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPlugin) ProtoMessage() {}\n\nfunc (x *CELPlugin) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[64]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPlugin.ProtoReflect.Descriptor instead.\nfunc (*CELPlugin) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{64}\n}\n\nfunc (x *CELPlugin) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELPlugin) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELPlugin) GetDescription() string {\n\tif x != nil {\n\t\treturn x.Description\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELPlugin) GetFunctions() []*CELFunction {\n\tif x != nil {\n\t\treturn x.Functions\n\t}\n\treturn nil\n}\n\ntype CELFunction struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName       string  `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tId         string  `protobuf:\"bytes,2,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tArgs       []*Type `protobuf:\"bytes,3,rep,name=args,proto3\" json:\"args,omitempty\"`\n\tReturn     *Type   `protobuf:\"bytes,4,opt,name=return,proto3\" json:\"return,omitempty\"`\n\tReceiverId string  `protobuf:\"bytes,5,opt,name=receiver_id,json=receiverId,proto3\" json:\"receiver_id,omitempty\"`\n}\n\nfunc (x *CELFunction) Reset() {\n\t*x = CELFunction{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[65]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELFunction) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELFunction) ProtoMessage() {}\n\nfunc (x *CELFunction) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[65]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELFunction.ProtoReflect.Descriptor instead.\nfunc (*CELFunction) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{65}\n}\n\nfunc (x *CELFunction) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunction) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunction) GetArgs() []*Type {\n\tif x != nil {\n\t\treturn x.Args\n\t}\n\treturn nil\n}\n\nfunc (x *CELFunction) GetReturn() *Type {\n\tif x != nil {\n\t\treturn x.Return\n\t}\n\treturn nil\n}\n\nfunc (x *CELFunction) GetReceiverId() string {\n\tif x != nil {\n\t\treturn x.ReceiverId\n\t}\n\treturn \"\"\n}\n\ntype ProtoCodeGeneratorResponse_GeneratedCodeInfo struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tAnnotation []*ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation `protobuf:\"bytes,1,rep,name=annotation,proto3\" json:\"annotation,omitempty\"`\n}\n\nfunc (x *ProtoCodeGeneratorResponse_GeneratedCodeInfo) Reset() {\n\t*x = ProtoCodeGeneratorResponse_GeneratedCodeInfo{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[66]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ProtoCodeGeneratorResponse_GeneratedCodeInfo) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ProtoCodeGeneratorResponse_GeneratedCodeInfo) ProtoMessage() {}\n\nfunc (x *ProtoCodeGeneratorResponse_GeneratedCodeInfo) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[66]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ProtoCodeGeneratorResponse_GeneratedCodeInfo.ProtoReflect.Descriptor instead.\nfunc (*ProtoCodeGeneratorResponse_GeneratedCodeInfo) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{0, 0}\n}\n\nfunc (x *ProtoCodeGeneratorResponse_GeneratedCodeInfo) GetAnnotation() []*ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation {\n\tif x != nil {\n\t\treturn x.Annotation\n\t}\n\treturn nil\n}\n\ntype ProtoCodeGeneratorResponse_File struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName              *string                                       `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\tInsertionPoint    *string                                       `protobuf:\"bytes,2,opt,name=insertion_point,json=insertionPoint,proto3,oneof\" json:\"insertion_point,omitempty\"`\n\tContent           *string                                       `protobuf:\"bytes,15,opt,name=content,proto3,oneof\" json:\"content,omitempty\"`\n\tGeneratedCodeInfo *ProtoCodeGeneratorResponse_GeneratedCodeInfo `protobuf:\"bytes,16,opt,name=generated_code_info,json=generatedCodeInfo,proto3,oneof\" json:\"generated_code_info,omitempty\"`\n}\n\nfunc (x *ProtoCodeGeneratorResponse_File) Reset() {\n\t*x = ProtoCodeGeneratorResponse_File{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[67]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ProtoCodeGeneratorResponse_File) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ProtoCodeGeneratorResponse_File) ProtoMessage() {}\n\nfunc (x *ProtoCodeGeneratorResponse_File) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[67]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ProtoCodeGeneratorResponse_File.ProtoReflect.Descriptor instead.\nfunc (*ProtoCodeGeneratorResponse_File) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{0, 1}\n}\n\nfunc (x *ProtoCodeGeneratorResponse_File) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *ProtoCodeGeneratorResponse_File) GetInsertionPoint() string {\n\tif x != nil && x.InsertionPoint != nil {\n\t\treturn *x.InsertionPoint\n\t}\n\treturn \"\"\n}\n\nfunc (x *ProtoCodeGeneratorResponse_File) GetContent() string {\n\tif x != nil && x.Content != nil {\n\t\treturn *x.Content\n\t}\n\treturn \"\"\n}\n\nfunc (x *ProtoCodeGeneratorResponse_File) GetGeneratedCodeInfo() *ProtoCodeGeneratorResponse_GeneratedCodeInfo {\n\tif x != nil {\n\t\treturn x.GeneratedCodeInfo\n\t}\n\treturn nil\n}\n\ntype ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPath       []int32                                                           `protobuf:\"varint,1,rep,packed,name=path,proto3\" json:\"path,omitempty\"`\n\tSourceFile *string                                                           `protobuf:\"bytes,2,opt,name=source_file,json=sourceFile,proto3,oneof\" json:\"source_file,omitempty\"`\n\tBegin      *int32                                                            `protobuf:\"varint,3,opt,name=begin,proto3,oneof\" json:\"begin,omitempty\"`\n\tEnd        *int32                                                            `protobuf:\"varint,4,opt,name=end,proto3,oneof\" json:\"end,omitempty\"`\n\tSemantic   *ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic `protobuf:\"varint,5,opt,name=semantic,proto3,enum=grpc.federation.generator.plugin.ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic,oneof\" json:\"semantic,omitempty\"`\n}\n\nfunc (x *ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation) Reset() {\n\t*x = ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[68]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation) ProtoMessage() {}\n\nfunc (x *ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[68]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation.ProtoReflect.Descriptor instead.\nfunc (*ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{0, 0, 0}\n}\n\nfunc (x *ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation) GetPath() []int32 {\n\tif x != nil {\n\t\treturn x.Path\n\t}\n\treturn nil\n}\n\nfunc (x *ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation) GetSourceFile() string {\n\tif x != nil && x.SourceFile != nil {\n\t\treturn *x.SourceFile\n\t}\n\treturn \"\"\n}\n\nfunc (x *ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation) GetBegin() int32 {\n\tif x != nil && x.Begin != nil {\n\t\treturn *x.Begin\n\t}\n\treturn 0\n}\n\nfunc (x *ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation) GetEnd() int32 {\n\tif x != nil && x.End != nil {\n\t\treturn *x.End\n\t}\n\treturn 0\n}\n\nfunc (x *ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation) GetSemantic() ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic {\n\tif x != nil && x.Semantic != nil {\n\t\treturn *x.Semantic\n\t}\n\treturn ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_NONE\n}\n\nvar File_grpc_federation_generator_proto protoreflect.FileDescriptor\n\nvar file_grpc_federation_generator_proto_rawDesc = []byte{\n\t0x0a, 0x1f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x20, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75,\n\t0x67, 0x69, 0x6e, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f,\n\t0x63, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe5, 0x09, 0x0a, 0x1a, 0x50,\n\t0x72, 0x6f, 0x74, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f,\n\t0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19, 0x0a, 0x05, 0x65, 0x72, 0x72,\n\t0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f,\n\t0x72, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x12, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65,\n\t0x64, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04,\n\t0x48, 0x01, 0x52, 0x11, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x46, 0x65, 0x61,\n\t0x74, 0x75, 0x72, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x69,\n\t0x6d, 0x75, 0x6d, 0x5f, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x05, 0x48, 0x02, 0x52, 0x0e, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x45, 0x64, 0x69, 0x74,\n\t0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75,\n\t0x6d, 0x5f, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48,\n\t0x03, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x45, 0x64, 0x69, 0x74, 0x69, 0x6f,\n\t0x6e, 0x88, 0x01, 0x01, 0x12, 0x55, 0x0a, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x0f, 0x20, 0x03,\n\t0x28, 0x0b, 0x32, 0x41, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70,\n\t0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x47,\n\t0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x1a, 0xec, 0x03, 0x0a, 0x11,\n\t0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66,\n\t0x6f, 0x12, 0x79, 0x0a, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18,\n\t0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x59, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f,\n\t0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x43, 0x6f,\n\t0x64, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f,\n\t0x6e, 0x73, 0x65, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x64,\n\t0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x52, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xdb, 0x02, 0x0a,\n\t0x0a, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x04, 0x70,\n\t0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x42, 0x02, 0x10, 0x01, 0x52, 0x04, 0x70,\n\t0x61, 0x74, 0x68, 0x12, 0x24, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x66, 0x69,\n\t0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72,\n\t0x63, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x62, 0x65, 0x67,\n\t0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x05, 0x62, 0x65, 0x67, 0x69,\n\t0x6e, 0x88, 0x01, 0x01, 0x12, 0x15, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28,\n\t0x05, 0x48, 0x02, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12, 0x83, 0x01, 0x0a, 0x08,\n\t0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x62,\n\t0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69,\n\t0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x47, 0x65, 0x6e,\n\t0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x41,\n\t0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x6d, 0x61, 0x6e, 0x74,\n\t0x69, 0x63, 0x48, 0x03, 0x52, 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x88, 0x01,\n\t0x01, 0x22, 0x28, 0x0a, 0x08, 0x53, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x12, 0x08, 0x0a,\n\t0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x45, 0x54, 0x10, 0x01,\n\t0x12, 0x09, 0x0a, 0x05, 0x41, 0x4c, 0x49, 0x41, 0x53, 0x10, 0x02, 0x42, 0x0e, 0x0a, 0x0c, 0x5f,\n\t0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x5f,\n\t0x62, 0x65, 0x67, 0x69, 0x6e, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x65, 0x6e, 0x64, 0x42, 0x0b, 0x0a,\n\t0x09, 0x5f, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x1a, 0xb3, 0x02, 0x0a, 0x04, 0x46,\n\t0x69, 0x6c, 0x65, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x0f,\n\t0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x69,\n\t0x6f, 0x6e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x63, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x07, 0x63,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x83, 0x01, 0x0a, 0x13, 0x67, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x6e, 0x66,\n\t0x6f, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,\n\t0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f,\n\t0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73,\n\t0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x43,\n\t0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x03, 0x52, 0x11, 0x67, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x88, 0x01, 0x01, 0x42,\n\t0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x69, 0x6e, 0x73,\n\t0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x42, 0x0a, 0x0a, 0x08,\n\t0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x67, 0x65, 0x6e,\n\t0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f,\n\t0x22, 0x57, 0x0a, 0x07, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x46,\n\t0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x1b, 0x0a,\n\t0x17, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x33, 0x5f,\n\t0x4f, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x1d, 0x0a, 0x19, 0x46, 0x45,\n\t0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x53, 0x55, 0x50, 0x50, 0x4f, 0x52, 0x54, 0x53, 0x5f, 0x45,\n\t0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x10, 0x02, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x65, 0x72,\n\t0x72, 0x6f, 0x72, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65,\n\t0x64, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x6d,\n\t0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x12,\n\t0x0a, 0x10, 0x5f, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x65, 0x64, 0x69, 0x74, 0x69,\n\t0x6f, 0x6e, 0x22, 0xe0, 0x03, 0x0a, 0x14, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x04, 0x74,\n\t0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65,\n\t0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x41, 0x63, 0x74,\n\t0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a,\n\t0x0a, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1b, 0x0a, 0x07,\n\t0x6f, 0x75, 0x74, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18,\n\t0x01, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x44, 0x69, 0x72, 0x12, 0x57, 0x0a, 0x05, 0x66, 0x69, 0x6c,\n\t0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x74,\n\t0x6f, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65,\n\t0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x66, 0x69, 0x6c,\n\t0x65, 0x73, 0x12, 0x37, 0x0a, 0x18, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x05,\n\t0x20, 0x03, 0x28, 0x09, 0x52, 0x15, 0x67, 0x72, 0x70, 0x63, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x73, 0x12, 0x49, 0x0a, 0x09, 0x72,\n\t0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b,\n\t0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69,\n\t0x6e, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x09, 0x72, 0x65, 0x66,\n\t0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x6d, 0x0a, 0x17, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74,\n\t0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69,\n\t0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,\n\t0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75,\n\t0x74, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52,\n\t0x14, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x43,\n\t0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xb8, 0x01, 0x0a, 0x14, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74,\n\t0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x48,\n\t0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x34, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67,\n\t0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e,\n\t0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x6f,\n\t0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66,\n\t0x69, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,\n\t0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x21, 0x0a,\n\t0x0c, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x04, 0x20,\n\t0x03, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x61, 0x74, 0x68, 0x73,\n\t0x22, 0xc1, 0x15, 0x0a, 0x09, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x53,\n\t0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x38, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75,\n\t0x67, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x46, 0x69,\n\t0x6c, 0x65, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x65,\n\t0x4d, 0x61, 0x70, 0x12, 0x5c, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6d,\n\t0x61, 0x70, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x66, 0x65,\n\t0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x70,\n\t0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x61,\n\t0x70, 0x12, 0x59, 0x0a, 0x0a, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x6d, 0x61, 0x70, 0x18,\n\t0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f,\n\t0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e,\n\t0x63, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72,\n\t0x79, 0x52, 0x09, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4d, 0x61, 0x70, 0x12, 0x5c, 0x0a, 0x0b,\n\t0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28,\n\t0x0b, 0x32, 0x3b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c,\n\t0x75, 0x67, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x4d,\n\t0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a,\n\t0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4d, 0x61, 0x70, 0x12, 0x56, 0x0a, 0x09, 0x66, 0x69,\n\t0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e,\n\t0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4d,\n\t0x61, 0x70, 0x12, 0x53, 0x0a, 0x08, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x06,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72,\n\t0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,\n\t0x65, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07,\n\t0x65, 0x6e, 0x75, 0x6d, 0x4d, 0x61, 0x70, 0x12, 0x63, 0x0a, 0x0e, 0x65, 0x6e, 0x75, 0x6d, 0x5f,\n\t0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x3d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67,\n\t0x69, 0x6e, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x45, 0x6e, 0x75,\n\t0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c,\n\t0x65, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x61, 0x70, 0x12, 0x56, 0x0a, 0x09,\n\t0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x39, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67,\n\t0x69, 0x6e, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x4f, 0x6e, 0x65,\n\t0x6f, 0x66, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6f, 0x6e, 0x65, 0x6f,\n\t0x66, 0x4d, 0x61, 0x70, 0x12, 0x63, 0x0a, 0x0e, 0x63, 0x65, 0x6c, 0x5f, 0x70, 0x6c, 0x75, 0x67,\n\t0x69, 0x6e, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67,\n\t0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e,\n\t0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x43, 0x65, 0x6c, 0x50, 0x6c, 0x75,\n\t0x67, 0x69, 0x6e, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x65, 0x6c,\n\t0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x4d, 0x61, 0x70, 0x12, 0x56, 0x0a, 0x09, 0x67, 0x72, 0x61,\n\t0x70, 0x68, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67,\n\t0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e,\n\t0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x4d,\n\t0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x67, 0x72, 0x61, 0x70, 0x68, 0x4d, 0x61,\n\t0x70, 0x12, 0x7e, 0x0a, 0x17, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x64, 0x65,\n\t0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x0b, 0x20, 0x03,\n\t0x28, 0x0b, 0x32, 0x46, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70,\n\t0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e,\n\t0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69,\n\t0x6f, 0x6e, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x15, 0x76, 0x61, 0x72, 0x69,\n\t0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61,\n\t0x70, 0x12, 0x8e, 0x01, 0x0a, 0x1d, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x64,\n\t0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f,\n\t0x6d, 0x61, 0x70, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4b, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65,\n\t0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x66,\n\t0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44,\n\t0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x61,\n\t0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x1a, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65,\n\t0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d,\n\t0x61, 0x70, 0x12, 0x63, 0x0a, 0x0e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x5f, 0x6e, 0x6f, 0x64, 0x65,\n\t0x5f, 0x6d, 0x61, 0x70, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x67, 0x72, 0x70,\n\t0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e,\n\t0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x52, 0x65,\n\t0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x4e, 0x6f, 0x64,\n\t0x65, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x67, 0x72, 0x61, 0x70, 0x68,\n\t0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x61, 0x70, 0x1a, 0x62, 0x0a, 0x0c, 0x46, 0x69, 0x6c, 0x65, 0x4d,\n\t0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3c, 0x0a, 0x05, 0x76, 0x61, 0x6c,\n\t0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x46, 0x69, 0x6c, 0x65,\n\t0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x68, 0x0a, 0x0f, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10,\n\t0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79,\n\t0x12, 0x3f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x29, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67,\n\t0x69, 0x6e, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,\n\t0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x66, 0x0a, 0x0e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4d,\n\t0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3e, 0x0a, 0x05, 0x76, 0x61, 0x6c,\n\t0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x68, 0x0a,\n\t0x0f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79,\n\t0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b,\n\t0x65, 0x79, 0x12, 0x3f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x29, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c,\n\t0x75, 0x67, 0x69, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61,\n\t0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x64, 0x0a, 0x0d, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3d, 0x0a, 0x05, 0x76, 0x61,\n\t0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65,\n\t0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x46, 0x69, 0x65,\n\t0x6c, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x62, 0x0a,\n\t0x0c, 0x45, 0x6e, 0x75, 0x6d, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a,\n\t0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12,\n\t0x3c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26,\n\t0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69,\n\t0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38,\n\t0x01, 0x1a, 0x6c, 0x0a, 0x11, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x61,\n\t0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x41, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75,\n\t0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,\n\t0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56,\n\t0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a,\n\t0x64, 0x0a, 0x0d, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79,\n\t0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b,\n\t0x65, 0x79, 0x12, 0x3d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x27, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c,\n\t0x75, 0x67, 0x69, 0x6e, 0x2e, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,\n\t0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x6c, 0x0a, 0x11, 0x43, 0x65, 0x6c, 0x50, 0x6c, 0x75, 0x67,\n\t0x69, 0x6e, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65,\n\t0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x41, 0x0a, 0x05,\n\t0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43,\n\t0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a,\n\t0x02, 0x38, 0x01, 0x1a, 0x75, 0x0a, 0x0d, 0x47, 0x72, 0x61, 0x70, 0x68, 0x4d, 0x61, 0x70, 0x45,\n\t0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f,\n\t0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,\n\t0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52,\n\t0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x7e, 0x0a, 0x1a, 0x56, 0x61,\n\t0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e,\n\t0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4a, 0x0a, 0x05, 0x76, 0x61,\n\t0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65,\n\t0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x56, 0x61, 0x72,\n\t0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52,\n\t0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x88, 0x01, 0x0a, 0x1f, 0x56,\n\t0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f,\n\t0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10,\n\t0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79,\n\t0x12, 0x4f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x39, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67,\n\t0x69, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e,\n\t0x69, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,\n\t0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x7d, 0x0a, 0x11, 0x47, 0x72, 0x61, 0x70, 0x68, 0x4e, 0x6f,\n\t0x64, 0x65, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65,\n\t0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x52, 0x0a, 0x05,\n\t0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x4d,\n\t0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79,\n\t0x47, 0x72, 0x61, 0x70, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,\n\t0x3a, 0x02, 0x38, 0x01, 0x22, 0xe6, 0x02, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x0e, 0x0a,\n\t0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x43, 0x0a,\n\t0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29,\n\t0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69,\n\t0x6e, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61,\n\t0x67, 0x65, 0x12, 0x4a, 0x0a, 0x0a, 0x67, 0x6f, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,\n\t0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x47, 0x6f, 0x50, 0x61, 0x63, 0x6b,\n\t0x61, 0x67, 0x65, 0x52, 0x09, 0x67, 0x6f, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x12,\n\t0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64,\n\t0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n\t0x49, 0x64, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69,\n\t0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,\n\t0x65, 0x49, 0x64, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x69, 0x64, 0x73,\n\t0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x65, 0x6e, 0x75, 0x6d, 0x49, 0x64, 0x73, 0x12,\n\t0x24, 0x0a, 0x0e, 0x63, 0x65, 0x6c, 0x5f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x69, 0x64,\n\t0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x65, 0x6c, 0x50, 0x6c, 0x75, 0x67,\n\t0x69, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f,\n\t0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d,\n\t0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x73, 0x22, 0x38, 0x0a,\n\t0x07, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08,\n\t0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07,\n\t0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x73, 0x22, 0x5f, 0x0a, 0x09, 0x47, 0x6f, 0x50, 0x61, 0x63,\n\t0x6b, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6d, 0x70, 0x6f,\n\t0x72, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69,\n\t0x6d, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x6c, 0x69,\n\t0x61, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61,\n\t0x6c, 0x69, 0x61, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x97, 0x02, 0x0a, 0x07, 0x53, 0x65, 0x72,\n\t0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x65,\n\t0x74, 0x68, 0x6f, 0x64, 0x49, 0x64, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x5f,\n\t0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64,\n\t0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18,\n\t0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64,\n\t0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x61, 0x72, 0x67,\n\t0x5f, 0x69, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x6d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x41, 0x72, 0x67, 0x49, 0x64, 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x63, 0x65, 0x6c,\n\t0x5f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28,\n\t0x09, 0x52, 0x0c, 0x63, 0x65, 0x6c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x49, 0x64, 0x73, 0x12,\n\t0x41, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e,\n\t0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x75,\n\t0x6c, 0x65, 0x22, 0x8d, 0x01, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x75,\n\t0x6c, 0x65, 0x12, 0x37, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x25, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67,\n\t0x69, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x45, 0x0a, 0x04, 0x76,\n\t0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65,\n\t0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x53, 0x65, 0x72,\n\t0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x04, 0x76, 0x61,\n\t0x72, 0x73, 0x22, 0x43, 0x0a, 0x03, 0x45, 0x6e, 0x76, 0x12, 0x3c, 0x0a, 0x04, 0x76, 0x61, 0x72,\n\t0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,\n\t0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x56, 0x61,\n\t0x72, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x22, 0xa0, 0x01, 0x0a, 0x06, 0x45, 0x6e, 0x76, 0x56,\n\t0x61, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72,\n\t0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79,\n\t0x70, 0x65, 0x12, 0x46, 0x0a, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70,\n\t0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x52, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x7c, 0x0a, 0x0c, 0x45, 0x6e,\n\t0x76, 0x56, 0x61, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x6c,\n\t0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61,\n\t0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61,\n\t0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75,\n\t0x6c, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x03,\n\t0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x18,\n\t0x0a, 0x07, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52,\n\t0x07, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x22, 0xac, 0x01, 0x0a, 0x0f, 0x53, 0x65, 0x72,\n\t0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,\n\t0x12, 0x3a, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67,\n\t0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e,\n\t0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x02, 0x69, 0x66, 0x12, 0x49, 0x0a, 0x04,\n\t0x65, 0x78, 0x70, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x67, 0x72, 0x70,\n\t0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e,\n\t0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x53, 0x65,\n\t0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x78, 0x70,\n\t0x72, 0x52, 0x04, 0x65, 0x78, 0x70, 0x72, 0x22, 0x8e, 0x04, 0x0a, 0x13, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x78, 0x70, 0x72, 0x12,\n\t0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e,\n\t0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x3c, 0x0a, 0x02, 0x62,\n\t0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,\n\t0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61,\n\t0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x02, 0x62, 0x79, 0x12, 0x3d, 0x0a, 0x03, 0x6d, 0x61, 0x70,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,\n\t0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x4d, 0x61, 0x70, 0x45, 0x78, 0x70,\n\t0x72, 0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x70, 0x12, 0x49, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65,\n\t0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x4d, 0x65, 0x73,\n\t0x73, 0x61, 0x67, 0x65, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x12, 0x61, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,\n\t0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69,\n\t0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x69,\n\t0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x06,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72,\n\t0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x45, 0x78, 0x70, 0x72,\n\t0x48, 0x00, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x46, 0x0a, 0x06, 0x73, 0x77, 0x69, 0x74,\n\t0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x53, 0x77, 0x69, 0x74,\n\t0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x06, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68,\n\t0x42, 0x06, 0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x22, 0xa1, 0x01, 0x0a, 0x1d, 0x53, 0x65, 0x72,\n\t0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x69,\n\t0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72, 0x12, 0x3a, 0x0a, 0x02, 0x69, 0x66,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,\n\t0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c,\n\t0x75, 0x65, 0x52, 0x02, 0x69, 0x66, 0x12, 0x44, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,\n\t0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,\n\t0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61,\n\t0x6c, 0x75, 0x65, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xcd, 0x01, 0x0a,\n\t0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x72,\n\t0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65,\n\t0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x0a, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x40, 0x0a, 0x04, 0x72, 0x75,\n\t0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x22, 0x62, 0x0a, 0x0a,\n\t0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69,\n\t0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12,\n\t0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x49, 0x64,\n\t0x22, 0xda, 0x02, 0x0a, 0x07, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02,\n\t0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,\n\t0x12, 0x20, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x6d, 0x61, 0x70, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74,\n\t0x72, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x70,\n\t0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64,\n\t0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65,\n\t0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x12, 0x6e, 0x65, 0x73, 0x74, 0x65,\n\t0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x06, 0x20,\n\t0x03, 0x28, 0x09, 0x52, 0x10, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61,\n\t0x67, 0x65, 0x49, 0x64, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x69, 0x64,\n\t0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x65, 0x6e, 0x75, 0x6d, 0x49, 0x64, 0x73,\n\t0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x08, 0x20,\n\t0x03, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x49, 0x64, 0x73, 0x12, 0x1b, 0x0a,\n\t0x09, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09,\n\t0x52, 0x08, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x49, 0x64, 0x73, 0x12, 0x41, 0x0a, 0x04, 0x72, 0x75,\n\t0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x22, 0xd5, 0x01,\n\t0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x2e, 0x0a,\n\t0x13, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e,\n\t0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x27, 0x0a,\n\t0x0f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65,\n\t0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x5f,\n\t0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x61, 0x6c, 0x69, 0x61, 0x73,\n\t0x49, 0x64, 0x73, 0x12, 0x50, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x04,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72,\n\t0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65,\n\t0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x52, 0x06, 0x64,\n\t0x65, 0x66, 0x53, 0x65, 0x74, 0x22, 0xc2, 0x01, 0x0a, 0x15, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,\n\t0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x12,\n\t0x36, 0x0a, 0x17, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x69,\n\t0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09,\n\t0x52, 0x15, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69,\n\t0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x41, 0x0a, 0x1d, 0x76, 0x61, 0x72, 0x69, 0x61,\n\t0x62, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x67,\n\t0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x1a,\n\t0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69,\n\t0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x64, 0x65,\n\t0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x5f, 0x69,\n\t0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65,\n\t0x6e, 0x63, 0x79, 0x47, 0x72, 0x61, 0x70, 0x68, 0x49, 0x64, 0x22, 0xff, 0x01, 0x0a, 0x12, 0x56,\n\t0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f,\n\t0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,\n\t0x64, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03,\n\t0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x02, 0x69,\n\t0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,\n\t0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61,\n\t0x6c, 0x75, 0x65, 0x52, 0x02, 0x69, 0x66, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x5f,\n\t0x62, 0x69, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f,\n\t0x42, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01,\n\t0x28, 0x08, 0x52, 0x04, 0x75, 0x73, 0x65, 0x64, 0x12, 0x42, 0x0a, 0x04, 0x65, 0x78, 0x70, 0x72,\n\t0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,\n\t0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,\n\t0x6c, 0x65, 0x45, 0x78, 0x70, 0x72, 0x52, 0x04, 0x65, 0x78, 0x70, 0x72, 0x22, 0xe2, 0x01, 0x0a,\n\t0x05, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79,\n\t0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65,\n\t0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x5f,\n\t0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x49,\n\t0x64, 0x12, 0x3f, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x2b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67,\n\t0x69, 0x6e, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x75,\n\t0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64,\n\t0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49,\n\t0x64, 0x22, 0xf2, 0x02, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x12,\n\t0x3d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27,\n\t0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69,\n\t0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x27,\n\t0x0a, 0x0f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65,\n\t0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52,\n\t0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x17, 0x6d, 0x65, 0x73, 0x73, 0x61,\n\t0x67, 0x65, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76,\n\t0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,\n\t0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x12,\n\t0x1b, 0x0a, 0x09, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03,\n\t0x28, 0x09, 0x52, 0x08, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x49, 0x64, 0x73, 0x12, 0x57, 0x0a, 0x0f,\n\t0x61, 0x75, 0x74, 0x6f, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18,\n\t0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f,\n\t0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x42, 0x69, 0x6e,\n\t0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x0d, 0x61, 0x75, 0x74, 0x6f, 0x42, 0x69, 0x6e, 0x64,\n\t0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x4f, 0x0a, 0x0a, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x5f, 0x72,\n\t0x75, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65,\n\t0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x46, 0x69, 0x65,\n\t0x6c, 0x64, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x09, 0x6f, 0x6e, 0x65,\n\t0x6f, 0x66, 0x52, 0x75, 0x6c, 0x65, 0x22, 0x60, 0x0a, 0x0d, 0x41, 0x75, 0x74, 0x6f, 0x42, 0x69,\n\t0x6e, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x76, 0x61, 0x72, 0x69, 0x61,\n\t0x62, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69,\n\t0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c,\n\t0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x19, 0x0a,\n\t0x08, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x07, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x49, 0x64, 0x22, 0xf4, 0x01, 0x0a, 0x0e, 0x46, 0x69, 0x65,\n\t0x6c, 0x64, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x3a, 0x0a, 0x02, 0x69,\n\t0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,\n\t0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61,\n\t0x6c, 0x75, 0x65, 0x52, 0x02, 0x69, 0x66, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75,\n\t0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c,\n\t0x74, 0x12, 0x3a, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e,\n\t0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x02, 0x62, 0x79, 0x12, 0x50, 0x0a,\n\t0x07, 0x64, 0x65, 0x66, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37,\n\t0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69,\n\t0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69,\n\t0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x52, 0x06, 0x64, 0x65, 0x66, 0x53, 0x65, 0x74, 0x22,\n\t0x80, 0x02, 0x0a, 0x17, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69,\n\t0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69,\n\t0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x65, 0x0a, 0x0a, 0x73,\n\t0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x43, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67,\n\t0x69, 0x6e, 0x2e, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x56, 0x61, 0x72,\n\t0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x47,\n\t0x72, 0x6f, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0a, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69,\n\t0x61, 0x6c, 0x12, 0x65, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,\n\t0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72,\n\t0x72, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69,\n\t0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0a, 0x63,\n\t0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x07, 0x0a, 0x05, 0x67, 0x72, 0x6f,\n\t0x75, 0x70, 0x22, 0x4b, 0x0a, 0x21, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c,\n\t0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69,\n\t0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a,\n\t0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22,\n\t0x4d, 0x0a, 0x21, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x72,\n\t0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x47,\n\t0x72, 0x6f, 0x75, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x18, 0x01,\n\t0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x12, 0x10, 0x0a, 0x03,\n\t0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0x4c,\n\t0x0a, 0x16, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65,\n\t0x6e, 0x63, 0x79, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x72, 0x6f, 0x6f, 0x74,\n\t0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52,\n\t0x0b, 0x72, 0x6f, 0x6f, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x73, 0x22, 0xa7, 0x01, 0x0a,\n\t0x1a, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e,\n\t0x63, 0x79, 0x47, 0x72, 0x61, 0x70, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69,\n\t0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x63,\n\t0x68, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08,\n\t0x63, 0x68, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x62, 0x61, 0x73, 0x65,\n\t0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x0d, 0x62, 0x61, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64,\n\t0x12, 0x34, 0x0a, 0x16, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x66,\n\t0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x14, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69,\n\t0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xba, 0x04, 0x0a, 0x0c, 0x56, 0x61, 0x72, 0x69, 0x61,\n\t0x62, 0x6c, 0x65, 0x45, 0x78, 0x70, 0x72, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f,\n\t0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74,\n\t0x79, 0x70, 0x65, 0x12, 0x3c, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67,\n\t0x69, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x02, 0x62,\n\t0x79, 0x12, 0x3d, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29,\n\t0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69,\n\t0x6e, 0x2e, 0x4d, 0x61, 0x70, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x70,\n\t0x12, 0x40, 0x0a, 0x04, 0x63, 0x61, 0x6c, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a,\n\t0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69,\n\t0x6e, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x63, 0x61,\n\t0x6c, 0x6c, 0x12, 0x49, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e,\n\t0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78,\n\t0x70, 0x72, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x52, 0x0a,\n\t0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x30, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c,\n\t0x75, 0x67, 0x69, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45,\n\t0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x12, 0x40, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67,\n\t0x69, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x65,\n\t0x6e, 0x75, 0x6d, 0x12, 0x46, 0x0a, 0x06, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x18, 0x08, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e,\n\t0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70,\n\t0x72, 0x48, 0x00, 0x52, 0x06, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x42, 0x06, 0x0a, 0x04, 0x65,\n\t0x78, 0x70, 0x72, 0x22, 0xe6, 0x01, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x3e, 0x0a, 0x04,\n\t0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70,\n\t0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e,\n\t0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x54, 0x79,\n\t0x70, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x1a, 0x0a, 0x08,\n\t0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08,\n\t0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x6e,\n\t0x75, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x73, 0x4e, 0x75, 0x6c,\n\t0x6c, 0x12, 0x1f, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18,\n\t0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,\n\t0x49, 0x64, 0x12, 0x19, 0x0a, 0x07, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20,\n\t0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x75, 0x6d, 0x49, 0x64, 0x12, 0x26, 0x0a,\n\t0x0e, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18,\n\t0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x46, 0x69,\n\t0x65, 0x6c, 0x64, 0x49, 0x64, 0x42, 0x05, 0x0a, 0x03, 0x72, 0x65, 0x66, 0x22, 0x58, 0x0a, 0x08,\n\t0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x78, 0x70, 0x72,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x78, 0x70, 0x72, 0x12, 0x38, 0x0a, 0x03,\n\t0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65,\n\t0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x54, 0x79, 0x70,\n\t0x65, 0x52, 0x03, 0x6f, 0x75, 0x74, 0x22, 0x98, 0x01, 0x0a, 0x07, 0x4d, 0x61, 0x70, 0x45, 0x78,\n\t0x70, 0x72, 0x12, 0x46, 0x0a, 0x08, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72,\n\t0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72,\n\t0x52, 0x08, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x45, 0x0a, 0x04, 0x65, 0x78,\n\t0x70, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x4d, 0x61, 0x70, 0x49,\n\t0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x45, 0x78, 0x70, 0x72, 0x52, 0x04, 0x65, 0x78, 0x70,\n\t0x72, 0x22, 0x3b, 0x0a, 0x08, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x12, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x22, 0xa0,\n\t0x02, 0x0a, 0x0f, 0x4d, 0x61, 0x70, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x45, 0x78,\n\t0x70, 0x72, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x26, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75,\n\t0x67, 0x69, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x3c,\n\t0x0a, 0x02, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70,\n\t0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e,\n\t0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43, 0x45,\n\t0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x02, 0x62, 0x79, 0x12, 0x49, 0x0a, 0x07,\n\t0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e,\n\t0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x07,\n\t0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x40, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18,\n\t0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f,\n\t0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x45, 0x78, 0x70,\n\t0x72, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x42, 0x06, 0x0a, 0x04, 0x65, 0x78, 0x70,\n\t0x72, 0x22, 0xbd, 0x03, 0x0a, 0x08, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x70, 0x72, 0x12, 0x1b,\n\t0x0a, 0x09, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x07, 0x72,\n\t0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67,\n\t0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e,\n\t0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69,\n\t0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x43, 0x0a, 0x05, 0x72, 0x65, 0x74, 0x72, 0x79, 0x18, 0x04,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72,\n\t0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c,\n\t0x69, 0x63, 0x79, 0x52, 0x05, 0x72, 0x65, 0x74, 0x72, 0x79, 0x12, 0x43, 0x0a, 0x06, 0x65, 0x72,\n\t0x72, 0x6f, 0x72, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x72, 0x70,\n\t0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e,\n\t0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x47, 0x52,\n\t0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12,\n\t0x48, 0x0a, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x30, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67,\n\t0x69, 0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x43, 0x61, 0x6c, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x52, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x08, 0x6d, 0x65, 0x74,\n\t0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43,\n\t0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,\n\t0x61, 0x22, 0x86, 0x02, 0x0a, 0x0b, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63,\n\t0x79, 0x12, 0x53, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e,\n\t0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69,\n\t0x63, 0x79, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x08, 0x63, 0x6f,\n\t0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x12, 0x5c, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65,\n\t0x6e, 0x74, 0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x52,\n\t0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65,\n\t0x6e, 0x74, 0x69, 0x61, 0x6c, 0x48, 0x00, 0x52, 0x0b, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e,\n\t0x74, 0x69, 0x61, 0x6c, 0x12, 0x3a, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75,\n\t0x67, 0x69, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x02, 0x69, 0x66,\n\t0x42, 0x08, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x6d, 0x0a, 0x13, 0x52, 0x65,\n\t0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e,\n\t0x74, 0x12, 0x35, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08,\n\t0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f,\n\t0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x6d,\n\t0x61, 0x78, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0xd5, 0x02, 0x0a, 0x16, 0x52, 0x65,\n\t0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e,\n\t0x74, 0x69, 0x61, 0x6c, 0x12, 0x44, 0x0a, 0x10, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f,\n\t0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,\n\t0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x69, 0x6e, 0x69, 0x74, 0x69,\n\t0x61, 0x6c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x31, 0x0a, 0x14, 0x72, 0x61,\n\t0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74,\n\t0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x13, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d,\n\t0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x1e, 0x0a,\n\t0x0a, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x01, 0x52, 0x0a, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x12, 0x3c, 0x0a,\n\t0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x04, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b,\n\t0x6d, 0x61, 0x78, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x6d,\n\t0x61, 0x78, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04,\n\t0x52, 0x0a, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x43, 0x0a, 0x10,\n\t0x6d, 0x61, 0x78, 0x5f, 0x65, 0x6c, 0x61, 0x70, 0x73, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65,\n\t0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x45, 0x6c, 0x61, 0x70, 0x73, 0x65, 0x64, 0x54, 0x69, 0x6d,\n\t0x65, 0x22, 0x62, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x04,\n\t0x61, 0x72, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70,\n\t0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e,\n\t0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x41, 0x72,\n\t0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12, 0x17, 0x0a, 0x07,\n\t0x74, 0x79, 0x70, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74,\n\t0x79, 0x70, 0x65, 0x49, 0x64, 0x22, 0x6c, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,\n\t0x45, 0x78, 0x70, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f,\n\t0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,\n\t0x65, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,\n\t0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c,\n\t0x75, 0x67, 0x69, 0x6e, 0x2e, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x61,\n\t0x72, 0x67, 0x73, 0x22, 0x5f, 0x0a, 0x08, 0x45, 0x6e, 0x75, 0x6d, 0x45, 0x78, 0x70, 0x72, 0x12,\n\t0x17, 0x0a, 0x07, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x06, 0x65, 0x6e, 0x75, 0x6d, 0x49, 0x64, 0x12, 0x3a, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72,\n\t0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65,\n\t0x52, 0x02, 0x62, 0x79, 0x22, 0xd5, 0x01, 0x0a, 0x08, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e,\n\t0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e,\n\t0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70,\n\t0x65, 0x12, 0x3d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x27, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75,\n\t0x67, 0x69, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,\n\t0x12, 0x3a, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67,\n\t0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e,\n\t0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x02, 0x69, 0x66, 0x22, 0x5d, 0x0a, 0x05,\n\t0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x3c, 0x0a,\n\t0x03, 0x63, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70,\n\t0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e,\n\t0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43, 0x45,\n\t0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x03, 0x63, 0x65, 0x6c, 0x22, 0xd7, 0x01, 0x0a, 0x0a,\n\t0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79,\n\t0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65,\n\t0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x42, 0x0a, 0x05, 0x63, 0x61, 0x73, 0x65, 0x73, 0x18,\n\t0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f,\n\t0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x43,\n\t0x61, 0x73, 0x65, 0x52, 0x05, 0x63, 0x61, 0x73, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x07, 0x64, 0x65,\n\t0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x53,\n\t0x77, 0x69, 0x74, 0x63, 0x68, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x64, 0x65,\n\t0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0xd6, 0x01, 0x0a, 0x0a, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68,\n\t0x43, 0x61, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75,\n\t0x67, 0x69, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x02, 0x69, 0x66,\n\t0x12, 0x3a, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67,\n\t0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e,\n\t0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x02, 0x62, 0x79, 0x12, 0x50, 0x0a, 0x07,\n\t0x64, 0x65, 0x66, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e,\n\t0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74,\n\t0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x52, 0x06, 0x64, 0x65, 0x66, 0x53, 0x65, 0x74, 0x22, 0x9d,\n\t0x01, 0x0a, 0x0d, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74,\n\t0x12, 0x3a, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67,\n\t0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e,\n\t0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x02, 0x62, 0x79, 0x12, 0x50, 0x0a, 0x07,\n\t0x64, 0x65, 0x66, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e,\n\t0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74,\n\t0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x52, 0x06, 0x64, 0x65, 0x66, 0x53, 0x65, 0x74, 0x22, 0x67,\n\t0x0a, 0x0e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72,\n\t0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x12, 0x41, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e,\n\t0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72,\n\t0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xf1, 0x03, 0x0a, 0x09, 0x47, 0x52, 0x50, 0x43,\n\t0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x50, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x5f, 0x73, 0x65, 0x74,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,\n\t0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,\n\t0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x52,\n\t0x06, 0x64, 0x65, 0x66, 0x53, 0x65, 0x74, 0x12, 0x3a, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e,\n\t0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52,\n\t0x02, 0x69, 0x66, 0x12, 0x29, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x0e, 0x32, 0x10, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x43,\n\t0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x44,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67,\n\t0x69, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x6d, 0x65, 0x73,\n\t0x73, 0x61, 0x67, 0x65, 0x12, 0x4b, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18,\n\t0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f,\n\t0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72,\n\t0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c,\n\t0x73, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28,\n\t0x08, 0x52, 0x06, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x12, 0x5a, 0x0a, 0x13, 0x69, 0x67, 0x6e,\n\t0x6f, 0x72, 0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,\n\t0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c,\n\t0x75, 0x65, 0x52, 0x11, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x41, 0x6e, 0x64, 0x52, 0x65, 0x73,\n\t0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76,\n\t0x65, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76,\n\t0x65, 0x6c, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x22, 0xd0, 0x04, 0x0a, 0x0f,\n\t0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12,\n\t0x50, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x37, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75,\n\t0x67, 0x69, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69,\n\t0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x52, 0x06, 0x64, 0x65, 0x66, 0x53, 0x65,\n\t0x74, 0x12, 0x3a, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e,\n\t0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x02, 0x69, 0x66, 0x12, 0x53, 0x0a,\n\t0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x37, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67,\n\t0x69, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e,\n\t0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x52, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,\n\t0x65, 0x73, 0x12, 0x6a, 0x0a, 0x15, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28,\n\t0x0b, 0x32, 0x35, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c,\n\t0x75, 0x67, 0x69, 0x6e, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f,\n\t0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x14, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e,\n\t0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x12, 0x4f,\n\t0x0a, 0x0c, 0x62, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x05,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72,\n\t0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x42, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65,\n\t0x73, 0x74, 0x52, 0x0b, 0x62, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12,\n\t0x61, 0x0a, 0x12, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73,\n\t0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x4c,\n\t0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52,\n\t0x11, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67,\n\t0x65, 0x73, 0x12, 0x3a, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a,\n\t0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69,\n\t0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x02, 0x62, 0x79, 0x22, 0x75,\n\t0x0a, 0x13, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x61,\n\t0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x5e, 0x0a, 0x0a, 0x76, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65,\n\t0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x50, 0x72, 0x65,\n\t0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65,\n\t0x56, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x76, 0x69, 0x6f, 0x6c, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xf2, 0x01, 0x0a, 0x1c, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e,\n\t0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x56, 0x69, 0x6f,\n\t0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72,\n\t0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65,\n\t0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x44, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63,\n\t0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,\n\t0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61,\n\t0x6c, 0x75, 0x65, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x4c, 0x0a, 0x0b,\n\t0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c,\n\t0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x64,\n\t0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x73, 0x0a, 0x0a, 0x42, 0x61,\n\t0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x65, 0x0a, 0x10, 0x66, 0x69, 0x65, 0x6c,\n\t0x64, 0x5f, 0x76, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03,\n\t0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70,\n\t0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x42, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x46, 0x69, 0x65, 0x6c, 0x64, 0x56, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f,\n\t0x66, 0x69, 0x65, 0x6c, 0x64, 0x56, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22,\n\t0xaa, 0x01, 0x0a, 0x18, 0x42, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x46, 0x69,\n\t0x65, 0x6c, 0x64, 0x56, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x05,\n\t0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43,\n\t0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x4c,\n\t0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e,\n\t0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52,\n\t0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x70, 0x0a, 0x10,\n\t0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,\n\t0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x06, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x44, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65,\n\t0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43, 0x45, 0x4c,\n\t0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xd7,\n\t0x03, 0x0a, 0x0e, 0x47, 0x52, 0x50, 0x43, 0x43, 0x61, 0x6c, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x75, 0x62,\n\t0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0e, 0x63, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x12,\n\t0x20, 0x0a, 0x09, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x09, 0x48, 0x01, 0x52, 0x08, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01,\n\t0x01, 0x12, 0x37, 0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x72, 0x65,\n\t0x63, 0x76, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x03, 0x48, 0x02, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x63, 0x76,\n\t0x4d, 0x73, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x16, 0x6d, 0x61,\n\t0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x6d, 0x73, 0x67, 0x5f,\n\t0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x12, 0x6d, 0x61,\n\t0x78, 0x43, 0x61, 0x6c, 0x6c, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53, 0x69, 0x7a, 0x65,\n\t0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x6d, 0x65,\n\t0x74, 0x68, 0x6f, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x48, 0x04, 0x52, 0x0c, 0x73, 0x74,\n\t0x61, 0x74, 0x69, 0x63, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a,\n\t0x0a, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28,\n\t0x09, 0x48, 0x05, 0x52, 0x09, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01,\n\t0x01, 0x12, 0x29, 0x0a, 0x0e, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x72, 0x65,\n\t0x61, 0x64, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x48, 0x06, 0x52, 0x0c, 0x77, 0x61, 0x69,\n\t0x74, 0x46, 0x6f, 0x72, 0x52, 0x65, 0x61, 0x64, 0x79, 0x88, 0x01, 0x01, 0x42, 0x12, 0x0a, 0x10,\n\t0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65,\n\t0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x19,\n\t0x0a, 0x17, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x72, 0x65, 0x63, 0x76,\n\t0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x6d, 0x61,\n\t0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x6d, 0x73, 0x67, 0x5f,\n\t0x73, 0x69, 0x7a, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f,\n\t0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x74, 0x72, 0x61, 0x69, 0x6c,\n\t0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x66,\n\t0x6f, 0x72, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x22, 0x67, 0x0a, 0x05, 0x4f, 0x6e, 0x65, 0x6f,\n\t0x66, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,\n\t0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,\n\t0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61,\n\t0x67, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x69, 0x64,\n\t0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x49, 0x64,\n\t0x73, 0x22, 0xbf, 0x01, 0x0a, 0x04, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b,\n\t0x0a, 0x09, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28,\n\t0x09, 0x52, 0x08, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x49, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6d,\n\t0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x66, 0x69,\n\t0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c,\n\t0x65, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c,\n\t0x75, 0x67, 0x69, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x72,\n\t0x75, 0x6c, 0x65, 0x22, 0x8f, 0x01, 0x0a, 0x09, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75,\n\t0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,\n\t0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x6e, 0x75, 0x6d, 0x5f,\n\t0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x6e, 0x75, 0x6d, 0x49, 0x64,\n\t0x12, 0x43, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f,\n\t0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69,\n\t0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52,\n\t0x04, 0x72, 0x75, 0x6c, 0x65, 0x22, 0x27, 0x0a, 0x08, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x75, 0x6c,\n\t0x65, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01,\n\t0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x49, 0x64, 0x73, 0x22, 0xdb,\n\t0x01, 0x0a, 0x0d, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x75, 0x6c, 0x65,\n\t0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x4a, 0x0a, 0x07, 0x61, 0x6c,\n\t0x69, 0x61, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x45,\n\t0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x07, 0x61,\n\t0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x12, 0x4a, 0x0a, 0x05, 0x61, 0x74, 0x74, 0x72, 0x73, 0x18,\n\t0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f,\n\t0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c,\n\t0x75, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, 0x05, 0x61, 0x74, 0x74,\n\t0x72, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x6f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x04, 0x20,\n\t0x01, 0x28, 0x08, 0x52, 0x07, 0x6e, 0x6f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x51, 0x0a, 0x0e,\n\t0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x22,\n\t0x0a, 0x0d, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x5f, 0x69, 0x64, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x75, 0x6d, 0x41, 0x6c, 0x69, 0x61, 0x73,\n\t0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x5f, 0x69, 0x64, 0x73, 0x18,\n\t0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x49, 0x64, 0x73, 0x22,\n\t0x3e, 0x0a, 0x12, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x41, 0x74, 0x74, 0x72,\n\t0x69, 0x62, 0x75, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c,\n\t0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22,\n\t0x9e, 0x01, 0x0a, 0x09, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x0e, 0x0a,\n\t0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x12, 0x4b, 0x0a, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,\n\t0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e,\n\t0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x22, 0xce, 0x01, 0x0a, 0x0b, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e,\n\t0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x02, 0x69, 0x64, 0x12, 0x3a, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03,\n\t0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70,\n\t0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73,\n\t0x12, 0x3e, 0x0a, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x26, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75,\n\t0x67, 0x69, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e,\n\t0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18,\n\t0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x49,\n\t0x64, 0x2a, 0x6b, 0x0a, 0x0a, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12,\n\t0x13, 0x0a, 0x0f, 0x47, 0x45, 0x4e, 0x45, 0x52, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49,\n\t0x4f, 0x4e, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4b, 0x45, 0x45, 0x50, 0x5f, 0x41, 0x43, 0x54,\n\t0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x5f,\n\t0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x44, 0x45, 0x4c, 0x45,\n\t0x54, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x12, 0x11, 0x0a, 0x0d, 0x55,\n\t0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x04, 0x2a, 0xb1,\n\t0x01, 0x0a, 0x12, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74,\n\t0x68, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x25, 0x0a, 0x21, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f,\n\t0x46, 0x49, 0x4c, 0x45, 0x5f, 0x50, 0x41, 0x54, 0x48, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55,\n\t0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x20, 0x0a, 0x1c,\n\t0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x50, 0x41, 0x54, 0x48,\n\t0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x10, 0x01, 0x12, 0x27,\n\t0x0a, 0x23, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x50, 0x41,\n\t0x54, 0x48, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x4d, 0x4f, 0x44, 0x55, 0x4c, 0x45, 0x5f, 0x50,\n\t0x52, 0x45, 0x46, 0x49, 0x58, 0x10, 0x02, 0x12, 0x29, 0x0a, 0x25, 0x4f, 0x55, 0x54, 0x50, 0x55,\n\t0x54, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x50, 0x41, 0x54, 0x48, 0x5f, 0x4d, 0x4f, 0x44, 0x45,\n\t0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x56, 0x45,\n\t0x10, 0x03, 0x2a, 0xcc, 0x02, 0x0a, 0x08, 0x54, 0x79, 0x70, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12,\n\t0x10, 0x0a, 0x0c, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10,\n\t0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45,\n\t0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45,\n\t0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x5f, 0x54, 0x59, 0x50, 0x45,\n\t0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x5f, 0x54, 0x59, 0x50,\n\t0x45, 0x10, 0x04, 0x12, 0x0e, 0x0a, 0x0a, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x5f, 0x54, 0x59, 0x50,\n\t0x45, 0x10, 0x05, 0x12, 0x10, 0x0a, 0x0c, 0x46, 0x49, 0x58, 0x45, 0x44, 0x36, 0x34, 0x5f, 0x54,\n\t0x59, 0x50, 0x45, 0x10, 0x06, 0x12, 0x10, 0x0a, 0x0c, 0x46, 0x49, 0x58, 0x45, 0x44, 0x33, 0x32,\n\t0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x42, 0x4f, 0x4f, 0x4c, 0x5f,\n\t0x54, 0x59, 0x50, 0x45, 0x10, 0x08, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47,\n\t0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x09, 0x12, 0x0e, 0x0a, 0x0a, 0x47, 0x52, 0x4f, 0x55, 0x50,\n\t0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x0a, 0x12, 0x10, 0x0a, 0x0c, 0x4d, 0x45, 0x53, 0x53, 0x41,\n\t0x47, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x0b, 0x12, 0x0e, 0x0a, 0x0a, 0x42, 0x59, 0x54,\n\t0x45, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x0c, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x49, 0x4e,\n\t0x54, 0x33, 0x32, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x0d, 0x12, 0x0d, 0x0a, 0x09, 0x45, 0x4e,\n\t0x55, 0x4d, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x0e, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x46, 0x49,\n\t0x58, 0x45, 0x44, 0x33, 0x32, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x0f, 0x12, 0x11, 0x0a, 0x0d,\n\t0x53, 0x46, 0x49, 0x58, 0x45, 0x44, 0x36, 0x34, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x10, 0x12,\n\t0x0f, 0x0a, 0x0b, 0x53, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x11,\n\t0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10,\n\t0x12, 0x42, 0xa8, 0x02, 0x0a, 0x24, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,\n\t0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x42, 0x0e, 0x47, 0x65, 0x6e, 0x65,\n\t0x72, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4a, 0x67, 0x69,\n\t0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x65, 0x72, 0x63, 0x61, 0x72, 0x69,\n\t0x2f, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69,\n\t0x6e, 0x3b, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0xa2, 0x02, 0x04, 0x47, 0x46, 0x47, 0x50, 0xaa,\n\t0x02, 0x20, 0x47, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x50, 0x6c, 0x75, 0x67,\n\t0x69, 0x6e, 0xca, 0x02, 0x21, 0x47, 0x72, 0x70, 0x63, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x5c,\n\t0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0xe2, 0x02, 0x2d, 0x47, 0x72, 0x70, 0x63, 0x5c, 0x46, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,\n\t0x6f, 0x72, 0x5f, 0x5c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65,\n\t0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x23, 0x47, 0x72, 0x70, 0x63, 0x3a, 0x3a, 0x46,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x3a, 0x47, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x6f, 0x72, 0x3a, 0x3a, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x62, 0x06, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_grpc_federation_generator_proto_rawDescOnce sync.Once\n\tfile_grpc_federation_generator_proto_rawDescData = file_grpc_federation_generator_proto_rawDesc\n)\n\nfunc file_grpc_federation_generator_proto_rawDescGZIP() []byte {\n\tfile_grpc_federation_generator_proto_rawDescOnce.Do(func() {\n\t\tfile_grpc_federation_generator_proto_rawDescData = protoimpl.X.CompressGZIP(file_grpc_federation_generator_proto_rawDescData)\n\t})\n\treturn file_grpc_federation_generator_proto_rawDescData\n}\n\nvar file_grpc_federation_generator_proto_enumTypes = make([]protoimpl.EnumInfo, 5)\nvar file_grpc_federation_generator_proto_msgTypes = make([]protoimpl.MessageInfo, 82)\nvar file_grpc_federation_generator_proto_goTypes = []interface{}{\n\t(ActionType)(0),                         // 0: grpc.federation.generator.plugin.ActionType\n\t(OutputFilePathMode)(0),                 // 1: grpc.federation.generator.plugin.OutputFilePathMode\n\t(TypeKind)(0),                           // 2: grpc.federation.generator.plugin.TypeKind\n\t(ProtoCodeGeneratorResponse_Feature)(0), // 3: grpc.federation.generator.plugin.ProtoCodeGeneratorResponse.Feature\n\t(ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic)(0), // 4: grpc.federation.generator.plugin.ProtoCodeGeneratorResponse.GeneratedCodeInfo.Annotation.Semantic\n\t(*ProtoCodeGeneratorResponse)(nil),                                    // 5: grpc.federation.generator.plugin.ProtoCodeGeneratorResponse\n\t(*CodeGeneratorRequest)(nil),                                          // 6: grpc.federation.generator.plugin.CodeGeneratorRequest\n\t(*OutputFilePathConfig)(nil),                                          // 7: grpc.federation.generator.plugin.OutputFilePathConfig\n\t(*Reference)(nil),                                                     // 8: grpc.federation.generator.plugin.Reference\n\t(*File)(nil),                                                          // 9: grpc.federation.generator.plugin.File\n\t(*Package)(nil),                                                       // 10: grpc.federation.generator.plugin.Package\n\t(*GoPackage)(nil),                                                     // 11: grpc.federation.generator.plugin.GoPackage\n\t(*Service)(nil),                                                       // 12: grpc.federation.generator.plugin.Service\n\t(*ServiceRule)(nil),                                                   // 13: grpc.federation.generator.plugin.ServiceRule\n\t(*Env)(nil),                                                           // 14: grpc.federation.generator.plugin.Env\n\t(*EnvVar)(nil),                                                        // 15: grpc.federation.generator.plugin.EnvVar\n\t(*EnvVarOption)(nil),                                                  // 16: grpc.federation.generator.plugin.EnvVarOption\n\t(*ServiceVariable)(nil),                                               // 17: grpc.federation.generator.plugin.ServiceVariable\n\t(*ServiceVariableExpr)(nil),                                           // 18: grpc.federation.generator.plugin.ServiceVariableExpr\n\t(*ServiceVariableValidationExpr)(nil),                                 // 19: grpc.federation.generator.plugin.ServiceVariableValidationExpr\n\t(*Method)(nil),                                                        // 20: grpc.federation.generator.plugin.Method\n\t(*MethodRule)(nil),                                                    // 21: grpc.federation.generator.plugin.MethodRule\n\t(*Message)(nil),                                                       // 22: grpc.federation.generator.plugin.Message\n\t(*MessageRule)(nil),                                                   // 23: grpc.federation.generator.plugin.MessageRule\n\t(*VariableDefinitionSet)(nil),                                         // 24: grpc.federation.generator.plugin.VariableDefinitionSet\n\t(*VariableDefinition)(nil),                                            // 25: grpc.federation.generator.plugin.VariableDefinition\n\t(*Field)(nil),                                                         // 26: grpc.federation.generator.plugin.Field\n\t(*FieldRule)(nil),                                                     // 27: grpc.federation.generator.plugin.FieldRule\n\t(*AutoBindField)(nil),                                                 // 28: grpc.federation.generator.plugin.AutoBindField\n\t(*FieldOneofRule)(nil),                                                // 29: grpc.federation.generator.plugin.FieldOneofRule\n\t(*VariableDefinitionGroup)(nil),                                       // 30: grpc.federation.generator.plugin.VariableDefinitionGroup\n\t(*SequentialVariableDefinitionGroup)(nil),                             // 31: grpc.federation.generator.plugin.SequentialVariableDefinitionGroup\n\t(*ConcurrentVariableDefinitionGroup)(nil),                             // 32: grpc.federation.generator.plugin.ConcurrentVariableDefinitionGroup\n\t(*MessageDependencyGraph)(nil),                                        // 33: grpc.federation.generator.plugin.MessageDependencyGraph\n\t(*MessageDependencyGraphNode)(nil),                                    // 34: grpc.federation.generator.plugin.MessageDependencyGraphNode\n\t(*VariableExpr)(nil),                                                  // 35: grpc.federation.generator.plugin.VariableExpr\n\t(*Type)(nil),                                                          // 36: grpc.federation.generator.plugin.Type\n\t(*CELValue)(nil),                                                      // 37: grpc.federation.generator.plugin.CELValue\n\t(*MapExpr)(nil),                                                       // 38: grpc.federation.generator.plugin.MapExpr\n\t(*Iterator)(nil),                                                      // 39: grpc.federation.generator.plugin.Iterator\n\t(*MapIteratorExpr)(nil),                                               // 40: grpc.federation.generator.plugin.MapIteratorExpr\n\t(*CallExpr)(nil),                                                      // 41: grpc.federation.generator.plugin.CallExpr\n\t(*RetryPolicy)(nil),                                                   // 42: grpc.federation.generator.plugin.RetryPolicy\n\t(*RetryPolicyConstant)(nil),                                           // 43: grpc.federation.generator.plugin.RetryPolicyConstant\n\t(*RetryPolicyExponential)(nil),                                        // 44: grpc.federation.generator.plugin.RetryPolicyExponential\n\t(*Request)(nil),                                                       // 45: grpc.federation.generator.plugin.Request\n\t(*MessageExpr)(nil),                                                   // 46: grpc.federation.generator.plugin.MessageExpr\n\t(*EnumExpr)(nil),                                                      // 47: grpc.federation.generator.plugin.EnumExpr\n\t(*Argument)(nil),                                                      // 48: grpc.federation.generator.plugin.Argument\n\t(*Value)(nil),                                                         // 49: grpc.federation.generator.plugin.Value\n\t(*SwitchExpr)(nil),                                                    // 50: grpc.federation.generator.plugin.SwitchExpr\n\t(*SwitchCase)(nil),                                                    // 51: grpc.federation.generator.plugin.SwitchCase\n\t(*SwitchDefault)(nil),                                                 // 52: grpc.federation.generator.plugin.SwitchDefault\n\t(*ValidationExpr)(nil),                                                // 53: grpc.federation.generator.plugin.ValidationExpr\n\t(*GRPCError)(nil),                                                     // 54: grpc.federation.generator.plugin.GRPCError\n\t(*GRPCErrorDetail)(nil),                                               // 55: grpc.federation.generator.plugin.GRPCErrorDetail\n\t(*PreconditionFailure)(nil),                                           // 56: grpc.federation.generator.plugin.PreconditionFailure\n\t(*PreconditionFailureViolation)(nil),                                  // 57: grpc.federation.generator.plugin.PreconditionFailureViolation\n\t(*BadRequest)(nil),                                                    // 58: grpc.federation.generator.plugin.BadRequest\n\t(*BadRequestFieldViolation)(nil),                                      // 59: grpc.federation.generator.plugin.BadRequestFieldViolation\n\t(*LocalizedMessage)(nil),                                              // 60: grpc.federation.generator.plugin.LocalizedMessage\n\t(*GRPCCallOption)(nil),                                                // 61: grpc.federation.generator.plugin.GRPCCallOption\n\t(*Oneof)(nil),                                                         // 62: grpc.federation.generator.plugin.Oneof\n\t(*Enum)(nil),                                                          // 63: grpc.federation.generator.plugin.Enum\n\t(*EnumValue)(nil),                                                     // 64: grpc.federation.generator.plugin.EnumValue\n\t(*EnumRule)(nil),                                                      // 65: grpc.federation.generator.plugin.EnumRule\n\t(*EnumValueRule)(nil),                                                 // 66: grpc.federation.generator.plugin.EnumValueRule\n\t(*EnumValueAlias)(nil),                                                // 67: grpc.federation.generator.plugin.EnumValueAlias\n\t(*EnumValueAttribute)(nil),                                            // 68: grpc.federation.generator.plugin.EnumValueAttribute\n\t(*CELPlugin)(nil),                                                     // 69: grpc.federation.generator.plugin.CELPlugin\n\t(*CELFunction)(nil),                                                   // 70: grpc.federation.generator.plugin.CELFunction\n\t(*ProtoCodeGeneratorResponse_GeneratedCodeInfo)(nil),            // 71: grpc.federation.generator.plugin.ProtoCodeGeneratorResponse.GeneratedCodeInfo\n\t(*ProtoCodeGeneratorResponse_File)(nil),                         // 72: grpc.federation.generator.plugin.ProtoCodeGeneratorResponse.File\n\t(*ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation)(nil), // 73: grpc.federation.generator.plugin.ProtoCodeGeneratorResponse.GeneratedCodeInfo.Annotation\n\tnil,                         // 74: grpc.federation.generator.plugin.Reference.FileMapEntry\n\tnil,                         // 75: grpc.federation.generator.plugin.Reference.ServiceMapEntry\n\tnil,                         // 76: grpc.federation.generator.plugin.Reference.MethodMapEntry\n\tnil,                         // 77: grpc.federation.generator.plugin.Reference.MessageMapEntry\n\tnil,                         // 78: grpc.federation.generator.plugin.Reference.FieldMapEntry\n\tnil,                         // 79: grpc.federation.generator.plugin.Reference.EnumMapEntry\n\tnil,                         // 80: grpc.federation.generator.plugin.Reference.EnumValueMapEntry\n\tnil,                         // 81: grpc.federation.generator.plugin.Reference.OneofMapEntry\n\tnil,                         // 82: grpc.federation.generator.plugin.Reference.CelPluginMapEntry\n\tnil,                         // 83: grpc.federation.generator.plugin.Reference.GraphMapEntry\n\tnil,                         // 84: grpc.federation.generator.plugin.Reference.VariableDefinitionMapEntry\n\tnil,                         // 85: grpc.federation.generator.plugin.Reference.VariableDefinitionGroupMapEntry\n\tnil,                         // 86: grpc.federation.generator.plugin.Reference.GraphNodeMapEntry\n\t(*durationpb.Duration)(nil), // 87: google.protobuf.Duration\n\t(code.Code)(0),              // 88: google.rpc.Code\n}\nvar file_grpc_federation_generator_proto_depIdxs = []int32{\n\t72,  // 0: grpc.federation.generator.plugin.ProtoCodeGeneratorResponse.file:type_name -> grpc.federation.generator.plugin.ProtoCodeGeneratorResponse.File\n\t0,   // 1: grpc.federation.generator.plugin.CodeGeneratorRequest.type:type_name -> grpc.federation.generator.plugin.ActionType\n\t72,  // 2: grpc.federation.generator.plugin.CodeGeneratorRequest.files:type_name -> grpc.federation.generator.plugin.ProtoCodeGeneratorResponse.File\n\t8,   // 3: grpc.federation.generator.plugin.CodeGeneratorRequest.reference:type_name -> grpc.federation.generator.plugin.Reference\n\t7,   // 4: grpc.federation.generator.plugin.CodeGeneratorRequest.output_file_path_config:type_name -> grpc.federation.generator.plugin.OutputFilePathConfig\n\t1,   // 5: grpc.federation.generator.plugin.OutputFilePathConfig.mode:type_name -> grpc.federation.generator.plugin.OutputFilePathMode\n\t74,  // 6: grpc.federation.generator.plugin.Reference.file_map:type_name -> grpc.federation.generator.plugin.Reference.FileMapEntry\n\t75,  // 7: grpc.federation.generator.plugin.Reference.service_map:type_name -> grpc.federation.generator.plugin.Reference.ServiceMapEntry\n\t76,  // 8: grpc.federation.generator.plugin.Reference.method_map:type_name -> grpc.federation.generator.plugin.Reference.MethodMapEntry\n\t77,  // 9: grpc.federation.generator.plugin.Reference.message_map:type_name -> grpc.federation.generator.plugin.Reference.MessageMapEntry\n\t78,  // 10: grpc.federation.generator.plugin.Reference.field_map:type_name -> grpc.federation.generator.plugin.Reference.FieldMapEntry\n\t79,  // 11: grpc.federation.generator.plugin.Reference.enum_map:type_name -> grpc.federation.generator.plugin.Reference.EnumMapEntry\n\t80,  // 12: grpc.federation.generator.plugin.Reference.enum_value_map:type_name -> grpc.federation.generator.plugin.Reference.EnumValueMapEntry\n\t81,  // 13: grpc.federation.generator.plugin.Reference.oneof_map:type_name -> grpc.federation.generator.plugin.Reference.OneofMapEntry\n\t82,  // 14: grpc.federation.generator.plugin.Reference.cel_plugin_map:type_name -> grpc.federation.generator.plugin.Reference.CelPluginMapEntry\n\t83,  // 15: grpc.federation.generator.plugin.Reference.graph_map:type_name -> grpc.federation.generator.plugin.Reference.GraphMapEntry\n\t84,  // 16: grpc.federation.generator.plugin.Reference.variable_definition_map:type_name -> grpc.federation.generator.plugin.Reference.VariableDefinitionMapEntry\n\t85,  // 17: grpc.federation.generator.plugin.Reference.variable_definition_group_map:type_name -> grpc.federation.generator.plugin.Reference.VariableDefinitionGroupMapEntry\n\t86,  // 18: grpc.federation.generator.plugin.Reference.graph_node_map:type_name -> grpc.federation.generator.plugin.Reference.GraphNodeMapEntry\n\t10,  // 19: grpc.federation.generator.plugin.File.package:type_name -> grpc.federation.generator.plugin.Package\n\t11,  // 20: grpc.federation.generator.plugin.File.go_package:type_name -> grpc.federation.generator.plugin.GoPackage\n\t13,  // 21: grpc.federation.generator.plugin.Service.rule:type_name -> grpc.federation.generator.plugin.ServiceRule\n\t14,  // 22: grpc.federation.generator.plugin.ServiceRule.env:type_name -> grpc.federation.generator.plugin.Env\n\t17,  // 23: grpc.federation.generator.plugin.ServiceRule.vars:type_name -> grpc.federation.generator.plugin.ServiceVariable\n\t15,  // 24: grpc.federation.generator.plugin.Env.vars:type_name -> grpc.federation.generator.plugin.EnvVar\n\t36,  // 25: grpc.federation.generator.plugin.EnvVar.type:type_name -> grpc.federation.generator.plugin.Type\n\t16,  // 26: grpc.federation.generator.plugin.EnvVar.option:type_name -> grpc.federation.generator.plugin.EnvVarOption\n\t37,  // 27: grpc.federation.generator.plugin.ServiceVariable.if:type_name -> grpc.federation.generator.plugin.CELValue\n\t18,  // 28: grpc.federation.generator.plugin.ServiceVariable.expr:type_name -> grpc.federation.generator.plugin.ServiceVariableExpr\n\t36,  // 29: grpc.federation.generator.plugin.ServiceVariableExpr.type:type_name -> grpc.federation.generator.plugin.Type\n\t37,  // 30: grpc.federation.generator.plugin.ServiceVariableExpr.by:type_name -> grpc.federation.generator.plugin.CELValue\n\t38,  // 31: grpc.federation.generator.plugin.ServiceVariableExpr.map:type_name -> grpc.federation.generator.plugin.MapExpr\n\t46,  // 32: grpc.federation.generator.plugin.ServiceVariableExpr.message:type_name -> grpc.federation.generator.plugin.MessageExpr\n\t19,  // 33: grpc.federation.generator.plugin.ServiceVariableExpr.validation:type_name -> grpc.federation.generator.plugin.ServiceVariableValidationExpr\n\t47,  // 34: grpc.federation.generator.plugin.ServiceVariableExpr.enum:type_name -> grpc.federation.generator.plugin.EnumExpr\n\t50,  // 35: grpc.federation.generator.plugin.ServiceVariableExpr.switch:type_name -> grpc.federation.generator.plugin.SwitchExpr\n\t37,  // 36: grpc.federation.generator.plugin.ServiceVariableValidationExpr.if:type_name -> grpc.federation.generator.plugin.CELValue\n\t37,  // 37: grpc.federation.generator.plugin.ServiceVariableValidationExpr.message:type_name -> grpc.federation.generator.plugin.CELValue\n\t21,  // 38: grpc.federation.generator.plugin.Method.rule:type_name -> grpc.federation.generator.plugin.MethodRule\n\t87,  // 39: grpc.federation.generator.plugin.MethodRule.timeout:type_name -> google.protobuf.Duration\n\t23,  // 40: grpc.federation.generator.plugin.Message.rule:type_name -> grpc.federation.generator.plugin.MessageRule\n\t24,  // 41: grpc.federation.generator.plugin.MessageRule.def_set:type_name -> grpc.federation.generator.plugin.VariableDefinitionSet\n\t37,  // 42: grpc.federation.generator.plugin.VariableDefinition.if:type_name -> grpc.federation.generator.plugin.CELValue\n\t35,  // 43: grpc.federation.generator.plugin.VariableDefinition.expr:type_name -> grpc.federation.generator.plugin.VariableExpr\n\t36,  // 44: grpc.federation.generator.plugin.Field.type:type_name -> grpc.federation.generator.plugin.Type\n\t27,  // 45: grpc.federation.generator.plugin.Field.rule:type_name -> grpc.federation.generator.plugin.FieldRule\n\t49,  // 46: grpc.federation.generator.plugin.FieldRule.value:type_name -> grpc.federation.generator.plugin.Value\n\t28,  // 47: grpc.federation.generator.plugin.FieldRule.auto_bind_field:type_name -> grpc.federation.generator.plugin.AutoBindField\n\t29,  // 48: grpc.federation.generator.plugin.FieldRule.oneof_rule:type_name -> grpc.federation.generator.plugin.FieldOneofRule\n\t37,  // 49: grpc.federation.generator.plugin.FieldOneofRule.if:type_name -> grpc.federation.generator.plugin.CELValue\n\t37,  // 50: grpc.federation.generator.plugin.FieldOneofRule.by:type_name -> grpc.federation.generator.plugin.CELValue\n\t24,  // 51: grpc.federation.generator.plugin.FieldOneofRule.def_set:type_name -> grpc.federation.generator.plugin.VariableDefinitionSet\n\t31,  // 52: grpc.federation.generator.plugin.VariableDefinitionGroup.sequential:type_name -> grpc.federation.generator.plugin.SequentialVariableDefinitionGroup\n\t32,  // 53: grpc.federation.generator.plugin.VariableDefinitionGroup.concurrent:type_name -> grpc.federation.generator.plugin.ConcurrentVariableDefinitionGroup\n\t36,  // 54: grpc.federation.generator.plugin.VariableExpr.type:type_name -> grpc.federation.generator.plugin.Type\n\t37,  // 55: grpc.federation.generator.plugin.VariableExpr.by:type_name -> grpc.federation.generator.plugin.CELValue\n\t38,  // 56: grpc.federation.generator.plugin.VariableExpr.map:type_name -> grpc.federation.generator.plugin.MapExpr\n\t41,  // 57: grpc.federation.generator.plugin.VariableExpr.call:type_name -> grpc.federation.generator.plugin.CallExpr\n\t46,  // 58: grpc.federation.generator.plugin.VariableExpr.message:type_name -> grpc.federation.generator.plugin.MessageExpr\n\t53,  // 59: grpc.federation.generator.plugin.VariableExpr.validation:type_name -> grpc.federation.generator.plugin.ValidationExpr\n\t47,  // 60: grpc.federation.generator.plugin.VariableExpr.enum:type_name -> grpc.federation.generator.plugin.EnumExpr\n\t50,  // 61: grpc.federation.generator.plugin.VariableExpr.switch:type_name -> grpc.federation.generator.plugin.SwitchExpr\n\t2,   // 62: grpc.federation.generator.plugin.Type.kind:type_name -> grpc.federation.generator.plugin.TypeKind\n\t36,  // 63: grpc.federation.generator.plugin.CELValue.out:type_name -> grpc.federation.generator.plugin.Type\n\t39,  // 64: grpc.federation.generator.plugin.MapExpr.iterator:type_name -> grpc.federation.generator.plugin.Iterator\n\t40,  // 65: grpc.federation.generator.plugin.MapExpr.expr:type_name -> grpc.federation.generator.plugin.MapIteratorExpr\n\t36,  // 66: grpc.federation.generator.plugin.MapIteratorExpr.type:type_name -> grpc.federation.generator.plugin.Type\n\t37,  // 67: grpc.federation.generator.plugin.MapIteratorExpr.by:type_name -> grpc.federation.generator.plugin.CELValue\n\t46,  // 68: grpc.federation.generator.plugin.MapIteratorExpr.message:type_name -> grpc.federation.generator.plugin.MessageExpr\n\t47,  // 69: grpc.federation.generator.plugin.MapIteratorExpr.enum:type_name -> grpc.federation.generator.plugin.EnumExpr\n\t45,  // 70: grpc.federation.generator.plugin.CallExpr.request:type_name -> grpc.federation.generator.plugin.Request\n\t87,  // 71: grpc.federation.generator.plugin.CallExpr.timeout:type_name -> google.protobuf.Duration\n\t42,  // 72: grpc.federation.generator.plugin.CallExpr.retry:type_name -> grpc.federation.generator.plugin.RetryPolicy\n\t54,  // 73: grpc.federation.generator.plugin.CallExpr.errors:type_name -> grpc.federation.generator.plugin.GRPCError\n\t61,  // 74: grpc.federation.generator.plugin.CallExpr.option:type_name -> grpc.federation.generator.plugin.GRPCCallOption\n\t37,  // 75: grpc.federation.generator.plugin.CallExpr.metadata:type_name -> grpc.federation.generator.plugin.CELValue\n\t43,  // 76: grpc.federation.generator.plugin.RetryPolicy.constant:type_name -> grpc.federation.generator.plugin.RetryPolicyConstant\n\t44,  // 77: grpc.federation.generator.plugin.RetryPolicy.exponential:type_name -> grpc.federation.generator.plugin.RetryPolicyExponential\n\t37,  // 78: grpc.federation.generator.plugin.RetryPolicy.if:type_name -> grpc.federation.generator.plugin.CELValue\n\t87,  // 79: grpc.federation.generator.plugin.RetryPolicyConstant.interval:type_name -> google.protobuf.Duration\n\t87,  // 80: grpc.federation.generator.plugin.RetryPolicyExponential.initial_interval:type_name -> google.protobuf.Duration\n\t87,  // 81: grpc.federation.generator.plugin.RetryPolicyExponential.max_interval:type_name -> google.protobuf.Duration\n\t87,  // 82: grpc.federation.generator.plugin.RetryPolicyExponential.max_elapsed_time:type_name -> google.protobuf.Duration\n\t48,  // 83: grpc.federation.generator.plugin.Request.args:type_name -> grpc.federation.generator.plugin.Argument\n\t48,  // 84: grpc.federation.generator.plugin.MessageExpr.args:type_name -> grpc.federation.generator.plugin.Argument\n\t37,  // 85: grpc.federation.generator.plugin.EnumExpr.by:type_name -> grpc.federation.generator.plugin.CELValue\n\t36,  // 86: grpc.federation.generator.plugin.Argument.type:type_name -> grpc.federation.generator.plugin.Type\n\t49,  // 87: grpc.federation.generator.plugin.Argument.value:type_name -> grpc.federation.generator.plugin.Value\n\t37,  // 88: grpc.federation.generator.plugin.Argument.if:type_name -> grpc.federation.generator.plugin.CELValue\n\t37,  // 89: grpc.federation.generator.plugin.Value.cel:type_name -> grpc.federation.generator.plugin.CELValue\n\t36,  // 90: grpc.federation.generator.plugin.SwitchExpr.type:type_name -> grpc.federation.generator.plugin.Type\n\t51,  // 91: grpc.federation.generator.plugin.SwitchExpr.cases:type_name -> grpc.federation.generator.plugin.SwitchCase\n\t52,  // 92: grpc.federation.generator.plugin.SwitchExpr.default:type_name -> grpc.federation.generator.plugin.SwitchDefault\n\t37,  // 93: grpc.federation.generator.plugin.SwitchCase.if:type_name -> grpc.federation.generator.plugin.CELValue\n\t37,  // 94: grpc.federation.generator.plugin.SwitchCase.by:type_name -> grpc.federation.generator.plugin.CELValue\n\t24,  // 95: grpc.federation.generator.plugin.SwitchCase.def_set:type_name -> grpc.federation.generator.plugin.VariableDefinitionSet\n\t37,  // 96: grpc.federation.generator.plugin.SwitchDefault.by:type_name -> grpc.federation.generator.plugin.CELValue\n\t24,  // 97: grpc.federation.generator.plugin.SwitchDefault.def_set:type_name -> grpc.federation.generator.plugin.VariableDefinitionSet\n\t54,  // 98: grpc.federation.generator.plugin.ValidationExpr.error:type_name -> grpc.federation.generator.plugin.GRPCError\n\t24,  // 99: grpc.federation.generator.plugin.GRPCError.def_set:type_name -> grpc.federation.generator.plugin.VariableDefinitionSet\n\t37,  // 100: grpc.federation.generator.plugin.GRPCError.if:type_name -> grpc.federation.generator.plugin.CELValue\n\t88,  // 101: grpc.federation.generator.plugin.GRPCError.code:type_name -> google.rpc.Code\n\t37,  // 102: grpc.federation.generator.plugin.GRPCError.message:type_name -> grpc.federation.generator.plugin.CELValue\n\t55,  // 103: grpc.federation.generator.plugin.GRPCError.details:type_name -> grpc.federation.generator.plugin.GRPCErrorDetail\n\t37,  // 104: grpc.federation.generator.plugin.GRPCError.ignore_and_response:type_name -> grpc.federation.generator.plugin.CELValue\n\t24,  // 105: grpc.federation.generator.plugin.GRPCErrorDetail.def_set:type_name -> grpc.federation.generator.plugin.VariableDefinitionSet\n\t37,  // 106: grpc.federation.generator.plugin.GRPCErrorDetail.if:type_name -> grpc.federation.generator.plugin.CELValue\n\t24,  // 107: grpc.federation.generator.plugin.GRPCErrorDetail.messages:type_name -> grpc.federation.generator.plugin.VariableDefinitionSet\n\t56,  // 108: grpc.federation.generator.plugin.GRPCErrorDetail.precondition_failures:type_name -> grpc.federation.generator.plugin.PreconditionFailure\n\t58,  // 109: grpc.federation.generator.plugin.GRPCErrorDetail.bad_requests:type_name -> grpc.federation.generator.plugin.BadRequest\n\t60,  // 110: grpc.federation.generator.plugin.GRPCErrorDetail.localized_messages:type_name -> grpc.federation.generator.plugin.LocalizedMessage\n\t37,  // 111: grpc.federation.generator.plugin.GRPCErrorDetail.by:type_name -> grpc.federation.generator.plugin.CELValue\n\t57,  // 112: grpc.federation.generator.plugin.PreconditionFailure.violations:type_name -> grpc.federation.generator.plugin.PreconditionFailureViolation\n\t37,  // 113: grpc.federation.generator.plugin.PreconditionFailureViolation.type:type_name -> grpc.federation.generator.plugin.CELValue\n\t37,  // 114: grpc.federation.generator.plugin.PreconditionFailureViolation.subject:type_name -> grpc.federation.generator.plugin.CELValue\n\t37,  // 115: grpc.federation.generator.plugin.PreconditionFailureViolation.description:type_name -> grpc.federation.generator.plugin.CELValue\n\t59,  // 116: grpc.federation.generator.plugin.BadRequest.field_violations:type_name -> grpc.federation.generator.plugin.BadRequestFieldViolation\n\t37,  // 117: grpc.federation.generator.plugin.BadRequestFieldViolation.field:type_name -> grpc.federation.generator.plugin.CELValue\n\t37,  // 118: grpc.federation.generator.plugin.BadRequestFieldViolation.description:type_name -> grpc.federation.generator.plugin.CELValue\n\t37,  // 119: grpc.federation.generator.plugin.LocalizedMessage.message:type_name -> grpc.federation.generator.plugin.CELValue\n\t65,  // 120: grpc.federation.generator.plugin.Enum.rule:type_name -> grpc.federation.generator.plugin.EnumRule\n\t66,  // 121: grpc.federation.generator.plugin.EnumValue.rule:type_name -> grpc.federation.generator.plugin.EnumValueRule\n\t67,  // 122: grpc.federation.generator.plugin.EnumValueRule.aliases:type_name -> grpc.federation.generator.plugin.EnumValueAlias\n\t68,  // 123: grpc.federation.generator.plugin.EnumValueRule.attrs:type_name -> grpc.federation.generator.plugin.EnumValueAttribute\n\t70,  // 124: grpc.federation.generator.plugin.CELPlugin.functions:type_name -> grpc.federation.generator.plugin.CELFunction\n\t36,  // 125: grpc.federation.generator.plugin.CELFunction.args:type_name -> grpc.federation.generator.plugin.Type\n\t36,  // 126: grpc.federation.generator.plugin.CELFunction.return:type_name -> grpc.federation.generator.plugin.Type\n\t73,  // 127: grpc.federation.generator.plugin.ProtoCodeGeneratorResponse.GeneratedCodeInfo.annotation:type_name -> grpc.federation.generator.plugin.ProtoCodeGeneratorResponse.GeneratedCodeInfo.Annotation\n\t71,  // 128: grpc.federation.generator.plugin.ProtoCodeGeneratorResponse.File.generated_code_info:type_name -> grpc.federation.generator.plugin.ProtoCodeGeneratorResponse.GeneratedCodeInfo\n\t4,   // 129: grpc.federation.generator.plugin.ProtoCodeGeneratorResponse.GeneratedCodeInfo.Annotation.semantic:type_name -> grpc.federation.generator.plugin.ProtoCodeGeneratorResponse.GeneratedCodeInfo.Annotation.Semantic\n\t9,   // 130: grpc.federation.generator.plugin.Reference.FileMapEntry.value:type_name -> grpc.federation.generator.plugin.File\n\t12,  // 131: grpc.federation.generator.plugin.Reference.ServiceMapEntry.value:type_name -> grpc.federation.generator.plugin.Service\n\t20,  // 132: grpc.federation.generator.plugin.Reference.MethodMapEntry.value:type_name -> grpc.federation.generator.plugin.Method\n\t22,  // 133: grpc.federation.generator.plugin.Reference.MessageMapEntry.value:type_name -> grpc.federation.generator.plugin.Message\n\t26,  // 134: grpc.federation.generator.plugin.Reference.FieldMapEntry.value:type_name -> grpc.federation.generator.plugin.Field\n\t63,  // 135: grpc.federation.generator.plugin.Reference.EnumMapEntry.value:type_name -> grpc.federation.generator.plugin.Enum\n\t64,  // 136: grpc.federation.generator.plugin.Reference.EnumValueMapEntry.value:type_name -> grpc.federation.generator.plugin.EnumValue\n\t62,  // 137: grpc.federation.generator.plugin.Reference.OneofMapEntry.value:type_name -> grpc.federation.generator.plugin.Oneof\n\t69,  // 138: grpc.federation.generator.plugin.Reference.CelPluginMapEntry.value:type_name -> grpc.federation.generator.plugin.CELPlugin\n\t33,  // 139: grpc.federation.generator.plugin.Reference.GraphMapEntry.value:type_name -> grpc.federation.generator.plugin.MessageDependencyGraph\n\t25,  // 140: grpc.federation.generator.plugin.Reference.VariableDefinitionMapEntry.value:type_name -> grpc.federation.generator.plugin.VariableDefinition\n\t30,  // 141: grpc.federation.generator.plugin.Reference.VariableDefinitionGroupMapEntry.value:type_name -> grpc.federation.generator.plugin.VariableDefinitionGroup\n\t34,  // 142: grpc.federation.generator.plugin.Reference.GraphNodeMapEntry.value:type_name -> grpc.federation.generator.plugin.MessageDependencyGraphNode\n\t143, // [143:143] is the sub-list for method output_type\n\t143, // [143:143] is the sub-list for method input_type\n\t143, // [143:143] is the sub-list for extension type_name\n\t143, // [143:143] is the sub-list for extension extendee\n\t0,   // [0:143] is the sub-list for field type_name\n}\n\nfunc init() { file_grpc_federation_generator_proto_init() }\nfunc file_grpc_federation_generator_proto_init() {\n\tif File_grpc_federation_generator_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_grpc_federation_generator_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ProtoCodeGeneratorResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CodeGeneratorRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*OutputFilePathConfig); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Reference); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*File); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Package); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GoPackage); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Service); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Env); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvVar); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvVarOption); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceVariable); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceVariableExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceVariableValidationExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Method); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MethodRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Message); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MessageRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*VariableDefinitionSet); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*VariableDefinition); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Field); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*FieldRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AutoBindField); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*FieldOneofRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*VariableDefinitionGroup); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SequentialVariableDefinitionGroup); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ConcurrentVariableDefinitionGroup); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MessageDependencyGraph); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MessageDependencyGraphNode); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*VariableExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Type); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELValue); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MapExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Iterator); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MapIteratorExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CallExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RetryPolicy); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RetryPolicyConstant); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RetryPolicyExponential); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Request); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MessageExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Argument); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Value); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SwitchExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SwitchCase); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SwitchDefault); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ValidationExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GRPCError); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GRPCErrorDetail); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*PreconditionFailure); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*PreconditionFailureViolation); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*BadRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*BadRequestFieldViolation); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*LocalizedMessage); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GRPCCallOption); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Oneof); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Enum); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumValue); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumValueRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumValueAlias); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumValueAttribute); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPlugin); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELFunction); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ProtoCodeGeneratorResponse_GeneratedCodeInfo); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ProtoCodeGeneratorResponse_File); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\tfile_grpc_federation_generator_proto_msgTypes[0].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_generator_proto_msgTypes[13].OneofWrappers = []interface{}{\n\t\t(*ServiceVariableExpr_By)(nil),\n\t\t(*ServiceVariableExpr_Map)(nil),\n\t\t(*ServiceVariableExpr_Message)(nil),\n\t\t(*ServiceVariableExpr_Validation)(nil),\n\t\t(*ServiceVariableExpr_Enum)(nil),\n\t\t(*ServiceVariableExpr_Switch)(nil),\n\t}\n\tfile_grpc_federation_generator_proto_msgTypes[25].OneofWrappers = []interface{}{\n\t\t(*VariableDefinitionGroup_Sequential)(nil),\n\t\t(*VariableDefinitionGroup_Concurrent)(nil),\n\t}\n\tfile_grpc_federation_generator_proto_msgTypes[30].OneofWrappers = []interface{}{\n\t\t(*VariableExpr_By)(nil),\n\t\t(*VariableExpr_Map)(nil),\n\t\t(*VariableExpr_Call)(nil),\n\t\t(*VariableExpr_Message)(nil),\n\t\t(*VariableExpr_Validation)(nil),\n\t\t(*VariableExpr_Enum)(nil),\n\t\t(*VariableExpr_Switch)(nil),\n\t}\n\tfile_grpc_federation_generator_proto_msgTypes[31].OneofWrappers = []interface{}{\n\t\t(*Type_MessageId)(nil),\n\t\t(*Type_EnumId)(nil),\n\t\t(*Type_OneofFieldId)(nil),\n\t}\n\tfile_grpc_federation_generator_proto_msgTypes[35].OneofWrappers = []interface{}{\n\t\t(*MapIteratorExpr_By)(nil),\n\t\t(*MapIteratorExpr_Message)(nil),\n\t\t(*MapIteratorExpr_Enum)(nil),\n\t}\n\tfile_grpc_federation_generator_proto_msgTypes[37].OneofWrappers = []interface{}{\n\t\t(*RetryPolicy_Constant)(nil),\n\t\t(*RetryPolicy_Exponential)(nil),\n\t}\n\tfile_grpc_federation_generator_proto_msgTypes[49].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_generator_proto_msgTypes[56].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_generator_proto_msgTypes[67].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_generator_proto_msgTypes[68].OneofWrappers = []interface{}{}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_grpc_federation_generator_proto_rawDesc,\n\t\t\tNumEnums:      5,\n\t\t\tNumMessages:   82,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_grpc_federation_generator_proto_goTypes,\n\t\tDependencyIndexes: file_grpc_federation_generator_proto_depIdxs,\n\t\tEnumInfos:         file_grpc_federation_generator_proto_enumTypes,\n\t\tMessageInfos:      file_grpc_federation_generator_proto_msgTypes,\n\t}.Build()\n\tFile_grpc_federation_generator_proto = out.File\n\tfile_grpc_federation_generator_proto_rawDesc = nil\n\tfile_grpc_federation_generator_proto_goTypes = nil\n\tfile_grpc_federation_generator_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/17_error_handler/grpc/federation/plugin.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: grpc/federation/plugin.proto\n\npackage plugin\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\t_ \"google.golang.org/protobuf/types/descriptorpb\"\n\tanypb \"google.golang.org/protobuf/types/known/anypb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CELPluginRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMethod   string                   `protobuf:\"bytes,1,opt,name=method,proto3\" json:\"method,omitempty\"`\n\tMetadata []*CELPluginGRPCMetadata `protobuf:\"bytes,2,rep,name=metadata,proto3\" json:\"metadata,omitempty\"`\n\tArgs     []*CELPluginValue        `protobuf:\"bytes,3,rep,name=args,proto3\" json:\"args,omitempty\"`\n}\n\nfunc (x *CELPluginRequest) Reset() {\n\t*x = CELPluginRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_plugin_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginRequest) ProtoMessage() {}\n\nfunc (x *CELPluginRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_plugin_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginRequest.ProtoReflect.Descriptor instead.\nfunc (*CELPluginRequest) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_plugin_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CELPluginRequest) GetMethod() string {\n\tif x != nil {\n\t\treturn x.Method\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELPluginRequest) GetMetadata() []*CELPluginGRPCMetadata {\n\tif x != nil {\n\t\treturn x.Metadata\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginRequest) GetArgs() []*CELPluginValue {\n\tif x != nil {\n\t\treturn x.Args\n\t}\n\treturn nil\n}\n\ntype CELPluginResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tValue *CELPluginValue `protobuf:\"bytes,1,opt,name=value,proto3\" json:\"value,omitempty\"`\n\tError string          `protobuf:\"bytes,2,opt,name=error,proto3\" json:\"error,omitempty\"`\n}\n\nfunc (x *CELPluginResponse) Reset() {\n\t*x = CELPluginResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_plugin_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginResponse) ProtoMessage() {}\n\nfunc (x *CELPluginResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_plugin_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginResponse.ProtoReflect.Descriptor instead.\nfunc (*CELPluginResponse) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_plugin_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *CELPluginResponse) GetValue() *CELPluginValue {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginResponse) GetError() string {\n\tif x != nil {\n\t\treturn x.Error\n\t}\n\treturn \"\"\n}\n\ntype CELPluginGRPCMetadata struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tKey    string   `protobuf:\"bytes,1,opt,name=key,proto3\" json:\"key,omitempty\"`\n\tValues []string `protobuf:\"bytes,2,rep,name=values,proto3\" json:\"values,omitempty\"`\n}\n\nfunc (x *CELPluginGRPCMetadata) Reset() {\n\t*x = CELPluginGRPCMetadata{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_plugin_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginGRPCMetadata) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginGRPCMetadata) ProtoMessage() {}\n\nfunc (x *CELPluginGRPCMetadata) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_plugin_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginGRPCMetadata.ProtoReflect.Descriptor instead.\nfunc (*CELPluginGRPCMetadata) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_plugin_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *CELPluginGRPCMetadata) GetKey() string {\n\tif x != nil {\n\t\treturn x.Key\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELPluginGRPCMetadata) GetValues() []string {\n\tif x != nil {\n\t\treturn x.Values\n\t}\n\treturn nil\n}\n\ntype CELPluginValue struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to Value:\n\t//\n\t//\t*CELPluginValue_Int64\n\t//\t*CELPluginValue_Uint64\n\t//\t*CELPluginValue_Double\n\t//\t*CELPluginValue_String_\n\t//\t*CELPluginValue_Bytes\n\t//\t*CELPluginValue_Bool\n\t//\t*CELPluginValue_Ptr\n\t//\t*CELPluginValue_Message\n\t//\t*CELPluginValue_List\n\tValue isCELPluginValue_Value `protobuf_oneof:\"value\"`\n}\n\nfunc (x *CELPluginValue) Reset() {\n\t*x = CELPluginValue{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_plugin_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginValue) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginValue) ProtoMessage() {}\n\nfunc (x *CELPluginValue) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_plugin_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginValue.ProtoReflect.Descriptor instead.\nfunc (*CELPluginValue) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_plugin_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (m *CELPluginValue) GetValue() isCELPluginValue_Value {\n\tif m != nil {\n\t\treturn m.Value\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginValue) GetInt64() int64 {\n\tif x, ok := x.GetValue().(*CELPluginValue_Int64); ok {\n\t\treturn x.Int64\n\t}\n\treturn 0\n}\n\nfunc (x *CELPluginValue) GetUint64() uint64 {\n\tif x, ok := x.GetValue().(*CELPluginValue_Uint64); ok {\n\t\treturn x.Uint64\n\t}\n\treturn 0\n}\n\nfunc (x *CELPluginValue) GetDouble() float64 {\n\tif x, ok := x.GetValue().(*CELPluginValue_Double); ok {\n\t\treturn x.Double\n\t}\n\treturn 0\n}\n\nfunc (x *CELPluginValue) GetString_() string {\n\tif x, ok := x.GetValue().(*CELPluginValue_String_); ok {\n\t\treturn x.String_\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELPluginValue) GetBytes() []byte {\n\tif x, ok := x.GetValue().(*CELPluginValue_Bytes); ok {\n\t\treturn x.Bytes\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginValue) GetBool() bool {\n\tif x, ok := x.GetValue().(*CELPluginValue_Bool); ok {\n\t\treturn x.Bool\n\t}\n\treturn false\n}\n\nfunc (x *CELPluginValue) GetPtr() uint64 {\n\tif x, ok := x.GetValue().(*CELPluginValue_Ptr); ok {\n\t\treturn x.Ptr\n\t}\n\treturn 0\n}\n\nfunc (x *CELPluginValue) GetMessage() *anypb.Any {\n\tif x, ok := x.GetValue().(*CELPluginValue_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginValue) GetList() *CELPluginListValue {\n\tif x, ok := x.GetValue().(*CELPluginValue_List); ok {\n\t\treturn x.List\n\t}\n\treturn nil\n}\n\ntype isCELPluginValue_Value interface {\n\tisCELPluginValue_Value()\n}\n\ntype CELPluginValue_Int64 struct {\n\tInt64 int64 `protobuf:\"varint,1,opt,name=int64,proto3,oneof\"`\n}\n\ntype CELPluginValue_Uint64 struct {\n\tUint64 uint64 `protobuf:\"varint,2,opt,name=uint64,proto3,oneof\"`\n}\n\ntype CELPluginValue_Double struct {\n\tDouble float64 `protobuf:\"fixed64,3,opt,name=double,proto3,oneof\"`\n}\n\ntype CELPluginValue_String_ struct {\n\tString_ string `protobuf:\"bytes,4,opt,name=string,proto3,oneof\"`\n}\n\ntype CELPluginValue_Bytes struct {\n\tBytes []byte `protobuf:\"bytes,5,opt,name=bytes,proto3,oneof\"`\n}\n\ntype CELPluginValue_Bool struct {\n\tBool bool `protobuf:\"varint,6,opt,name=bool,proto3,oneof\"`\n}\n\ntype CELPluginValue_Ptr struct {\n\tPtr uint64 `protobuf:\"varint,7,opt,name=ptr,proto3,oneof\"`\n}\n\ntype CELPluginValue_Message struct {\n\tMessage *anypb.Any `protobuf:\"bytes,8,opt,name=message,proto3,oneof\"`\n}\n\ntype CELPluginValue_List struct {\n\tList *CELPluginListValue `protobuf:\"bytes,9,opt,name=list,proto3,oneof\"`\n}\n\nfunc (*CELPluginValue_Int64) isCELPluginValue_Value() {}\n\nfunc (*CELPluginValue_Uint64) isCELPluginValue_Value() {}\n\nfunc (*CELPluginValue_Double) isCELPluginValue_Value() {}\n\nfunc (*CELPluginValue_String_) isCELPluginValue_Value() {}\n\nfunc (*CELPluginValue_Bytes) isCELPluginValue_Value() {}\n\nfunc (*CELPluginValue_Bool) isCELPluginValue_Value() {}\n\nfunc (*CELPluginValue_Ptr) isCELPluginValue_Value() {}\n\nfunc (*CELPluginValue_Message) isCELPluginValue_Value() {}\n\nfunc (*CELPluginValue_List) isCELPluginValue_Value() {}\n\ntype CELPluginListValue struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tValues []*CELPluginValue `protobuf:\"bytes,1,rep,name=values,proto3\" json:\"values,omitempty\"`\n}\n\nfunc (x *CELPluginListValue) Reset() {\n\t*x = CELPluginListValue{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_plugin_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginListValue) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginListValue) ProtoMessage() {}\n\nfunc (x *CELPluginListValue) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_plugin_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginListValue.ProtoReflect.Descriptor instead.\nfunc (*CELPluginListValue) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_plugin_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *CELPluginListValue) GetValues() []*CELPluginValue {\n\tif x != nil {\n\t\treturn x.Values\n\t}\n\treturn nil\n}\n\nvar File_grpc_federation_plugin_proto protoreflect.FileDescriptor\n\nvar file_grpc_federation_plugin_proto_rawDesc = []byte{\n\t0x0a, 0x1c, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a,\n\t0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,\n\t0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63,\n\t0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa3, 0x01, 0x0a,\n\t0x10, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,\n\t0x74, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x42, 0x0a, 0x08, 0x6d, 0x65, 0x74,\n\t0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45,\n\t0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x47, 0x52, 0x50, 0x43, 0x4d, 0x65, 0x74, 0x61, 0x64,\n\t0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x33, 0x0a,\n\t0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45,\n\t0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x61, 0x72,\n\t0x67, 0x73, 0x22, 0x60, 0x0a, 0x11, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52,\n\t0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67,\n\t0x69, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14,\n\t0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65,\n\t0x72, 0x72, 0x6f, 0x72, 0x22, 0x41, 0x0a, 0x15, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69,\n\t0x6e, 0x47, 0x52, 0x50, 0x43, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a,\n\t0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12,\n\t0x16, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52,\n\t0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xae, 0x02, 0x0a, 0x0e, 0x43, 0x45, 0x4c, 0x50,\n\t0x6c, 0x75, 0x67, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x16, 0x0a, 0x05, 0x69, 0x6e,\n\t0x74, 0x36, 0x34, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x05, 0x69, 0x6e, 0x74,\n\t0x36, 0x34, 0x12, 0x18, 0x0a, 0x06, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x04, 0x48, 0x00, 0x52, 0x06, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x18, 0x0a, 0x06,\n\t0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x06,\n\t0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,\n\t0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,\n\t0x12, 0x16, 0x0a, 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x48,\n\t0x00, 0x52, 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c,\n\t0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x12, 0x12,\n\t0x0a, 0x03, 0x70, 0x74, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x03, 0x70,\n\t0x74, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x08, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73,\n\t0x73, 0x61, 0x67, 0x65, 0x12, 0x39, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x4c, 0x69,\n\t0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x42,\n\t0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x4d, 0x0a, 0x12, 0x43, 0x45, 0x4c, 0x50,\n\t0x6c, 0x75, 0x67, 0x69, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x37,\n\t0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f,\n\t0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52,\n\t0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x42, 0xc5, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42,\n\t0x0b, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x44,\n\t0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x65, 0x72, 0x63, 0x61,\n\t0x72, 0x69, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2f, 0x63, 0x65, 0x6c, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x3b, 0x70, 0x6c,\n\t0x75, 0x67, 0x69, 0x6e, 0xa2, 0x02, 0x03, 0x47, 0x46, 0x58, 0xaa, 0x02, 0x0f, 0x47, 0x72, 0x70,\n\t0x63, 0x2e, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xca, 0x02, 0x0f, 0x47,\n\t0x72, 0x70, 0x63, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xe2, 0x02,\n\t0x1b, 0x47, 0x72, 0x70, 0x63, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x10, 0x47,\n\t0x72, 0x70, 0x63, 0x3a, 0x3a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62,\n\t0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_grpc_federation_plugin_proto_rawDescOnce sync.Once\n\tfile_grpc_federation_plugin_proto_rawDescData = file_grpc_federation_plugin_proto_rawDesc\n)\n\nfunc file_grpc_federation_plugin_proto_rawDescGZIP() []byte {\n\tfile_grpc_federation_plugin_proto_rawDescOnce.Do(func() {\n\t\tfile_grpc_federation_plugin_proto_rawDescData = protoimpl.X.CompressGZIP(file_grpc_federation_plugin_proto_rawDescData)\n\t})\n\treturn file_grpc_federation_plugin_proto_rawDescData\n}\n\nvar file_grpc_federation_plugin_proto_msgTypes = make([]protoimpl.MessageInfo, 5)\nvar file_grpc_federation_plugin_proto_goTypes = []interface{}{\n\t(*CELPluginRequest)(nil),      // 0: grpc.federation.CELPluginRequest\n\t(*CELPluginResponse)(nil),     // 1: grpc.federation.CELPluginResponse\n\t(*CELPluginGRPCMetadata)(nil), // 2: grpc.federation.CELPluginGRPCMetadata\n\t(*CELPluginValue)(nil),        // 3: grpc.federation.CELPluginValue\n\t(*CELPluginListValue)(nil),    // 4: grpc.federation.CELPluginListValue\n\t(*anypb.Any)(nil),             // 5: google.protobuf.Any\n}\nvar file_grpc_federation_plugin_proto_depIdxs = []int32{\n\t2, // 0: grpc.federation.CELPluginRequest.metadata:type_name -> grpc.federation.CELPluginGRPCMetadata\n\t3, // 1: grpc.federation.CELPluginRequest.args:type_name -> grpc.federation.CELPluginValue\n\t3, // 2: grpc.federation.CELPluginResponse.value:type_name -> grpc.federation.CELPluginValue\n\t5, // 3: grpc.federation.CELPluginValue.message:type_name -> google.protobuf.Any\n\t4, // 4: grpc.federation.CELPluginValue.list:type_name -> grpc.federation.CELPluginListValue\n\t3, // 5: grpc.federation.CELPluginListValue.values:type_name -> grpc.federation.CELPluginValue\n\t6, // [6:6] is the sub-list for method output_type\n\t6, // [6:6] is the sub-list for method input_type\n\t6, // [6:6] is the sub-list for extension type_name\n\t6, // [6:6] is the sub-list for extension extendee\n\t0, // [0:6] is the sub-list for field type_name\n}\n\nfunc init() { file_grpc_federation_plugin_proto_init() }\nfunc file_grpc_federation_plugin_proto_init() {\n\tif File_grpc_federation_plugin_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_grpc_federation_plugin_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_plugin_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_plugin_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginGRPCMetadata); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_plugin_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginValue); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_plugin_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginListValue); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\tfile_grpc_federation_plugin_proto_msgTypes[3].OneofWrappers = []interface{}{\n\t\t(*CELPluginValue_Int64)(nil),\n\t\t(*CELPluginValue_Uint64)(nil),\n\t\t(*CELPluginValue_Double)(nil),\n\t\t(*CELPluginValue_String_)(nil),\n\t\t(*CELPluginValue_Bytes)(nil),\n\t\t(*CELPluginValue_Bool)(nil),\n\t\t(*CELPluginValue_Ptr)(nil),\n\t\t(*CELPluginValue_Message)(nil),\n\t\t(*CELPluginValue_List)(nil),\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_grpc_federation_plugin_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   5,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_grpc_federation_plugin_proto_goTypes,\n\t\tDependencyIndexes: file_grpc_federation_plugin_proto_depIdxs,\n\t\tMessageInfos:      file_grpc_federation_plugin_proto_msgTypes,\n\t}.Build()\n\tFile_grpc_federation_plugin_proto = out.File\n\tfile_grpc_federation_plugin_proto_rawDesc = nil\n\tfile_grpc_federation_plugin_proto_goTypes = nil\n\tfile_grpc_federation_plugin_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/17_error_handler/main_test.go",
    "content": "package main_test\n\nimport (\n\t\"context\"\n\t\"log/slog\"\n\t\"net\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\"\n\t\"go.opentelemetry.io/otel/propagation\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\tsdktrace \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.4.0\"\n\t\"go.uber.org/goleak\"\n\t\"google.golang.org/genproto/googleapis/rpc/errdetails\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/codes\"\n\t\"google.golang.org/grpc/credentials/insecure\"\n\t\"google.golang.org/grpc/status\"\n\t\"google.golang.org/grpc/test/bufconn\"\n\t\"google.golang.org/protobuf/protoadapt\"\n\n\t\"example/federation\"\n\t\"example/post\"\n)\n\nconst bufSize = 1024\n\nvar (\n\tlistener   *bufconn.Listener\n\tpostClient post.PostServiceClient\n)\n\ntype clientConfig struct{}\n\nfunc (c *clientConfig) Post_PostServiceClient(cfg federation.FederationServiceClientConfig) (post.PostServiceClient, error) {\n\treturn postClient, nil\n}\n\ntype PostServer struct {\n\t*post.UnimplementedPostServiceServer\n}\n\nvar getPostError error\n\nfunc (s *PostServer) GetPost(ctx context.Context, req *post.GetPostRequest) (*post.GetPostResponse, error) {\n\treturn nil, getPostError\n}\n\nfunc dialer(ctx context.Context, address string) (net.Conn, error) {\n\treturn listener.Dial()\n}\n\nfunc TestFederation(t *testing.T) {\n\tdefer goleak.VerifyNone(t)\n\tctx := context.Background()\n\tlistener = bufconn.Listen(bufSize)\n\n\tif os.Getenv(\"ENABLE_JAEGER\") != \"\" {\n\t\texporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithInsecure())\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttp := sdktrace.NewTracerProvider(\n\t\t\tsdktrace.WithBatcher(exporter),\n\t\t\tsdktrace.WithResource(\n\t\t\t\tresource.NewWithAttributes(\n\t\t\t\t\tsemconv.SchemaURL,\n\t\t\t\t\tsemconv.ServiceNameKey.String(\"example17/error_handler\"),\n\t\t\t\t\tsemconv.ServiceVersionKey.String(\"1.0.0\"),\n\t\t\t\t\tattribute.String(\"environment\", \"dev\"),\n\t\t\t\t),\n\t\t\t),\n\t\t\tsdktrace.WithSampler(sdktrace.AlwaysSample()),\n\t\t)\n\t\tdefer tp.Shutdown(ctx)\n\t\totel.SetTextMapPropagator(propagation.TraceContext{})\n\t\totel.SetTracerProvider(tp)\n\t}\n\n\tconn, err := grpc.DialContext(\n\t\tctx, \"\",\n\t\tgrpc.WithContextDialer(dialer),\n\t\tgrpc.WithTransportCredentials(insecure.NewCredentials()),\n\t)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer conn.Close()\n\n\tpostClient = post.NewPostServiceClient(conn)\n\n\tgrpcServer := grpc.NewServer()\n\tdefer grpcServer.Stop()\n\n\tlogger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{\n\t\tLevel: slog.LevelDebug,\n\t}))\n\tfederationServer, err := federation.NewFederationService(federation.FederationServiceConfig{\n\t\tClient: new(clientConfig),\n\t\tLogger: logger,\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer federation.CleanupFederationService(ctx, federationServer)\n\n\tpost.RegisterPostServiceServer(grpcServer, &PostServer{})\n\tfederation.RegisterFederationServiceServer(grpcServer, federationServer)\n\n\tgo func() {\n\t\tif err := grpcServer.Serve(listener); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t}()\n\n\tclient := federation.NewFederationServiceClient(conn)\n\tt.Run(\"custom error\", func(t *testing.T) {\n\t\tst := status.New(codes.FailedPrecondition, \"failed to create post message\")\n\t\tvar details []protoadapt.MessageV1\n\t\tdetails = append(details, &errdetails.PreconditionFailure{\n\t\t\tViolations: []*errdetails.PreconditionFailure_Violation{\n\t\t\t\t{\n\t\t\t\t\tType:        \"foo\",\n\t\t\t\t\tSubject:     \"bar\",\n\t\t\t\t\tDescription: \"baz\",\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t\tdetails = append(details, &errdetails.LocalizedMessage{\n\t\t\tLocale:  \"en-US\",\n\t\t\tMessage: \"hello\",\n\t\t})\n\t\tdetails = append(details, &post.Post{Id: \"xxx\"})\n\t\tstWithDetails, _ := st.WithDetails(details...)\n\t\tgetPostError = stWithDetails.Err()\n\n\t\t_, err := client.GetPost(ctx, &federation.GetPostRequest{Id: \"x\"})\n\t\tif err == nil {\n\t\t\tt.Fatal(\"expected error\")\n\t\t}\n\t\ts, ok := status.FromError(err)\n\t\tif !ok {\n\t\t\tt.Fatalf(\"failed to extract gRPC Status from the error: %v\", err)\n\t\t}\n\t\tif s.Message() != `this is custom error message` {\n\t\t\tt.Fatalf(\"got unexpected error: %v\", err)\n\t\t}\n\t\tvar detailNum int\n\t\tfor _, detail := range s.Details() {\n\t\t\tif _, ok := detail.(protoadapt.MessageV1); !ok {\n\t\t\t\tt.Fatalf(\"failed to get proto message from error details: %T\", detail)\n\t\t\t}\n\t\t\tdetailNum++\n\t\t}\n\t\tif detailNum != 4 {\n\t\t\tt.Fatalf(\"failed to get error details. got detail num: %d\", detailNum)\n\t\t}\n\t})\n\tt.Run(\"ignore error and response\", func(t *testing.T) {\n\t\tst := status.New(codes.Unimplemented, \"unimplemented error\")\n\t\tgetPostError = st.Err()\n\n\t\tres, err := client.GetPost(ctx, &federation.GetPostRequest{Id: \"\"})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tif diff := cmp.Diff(res,\n\t\t\t&federation.GetPostResponse{\n\t\t\t\tPost: &federation.Post{\n\t\t\t\t\tId:   \"anonymous\",\n\t\t\t\t\tCode: int32(codes.Unimplemented),\n\t\t\t\t},\n\t\t\t},\n\t\t\tcmpopts.IgnoreUnexported(\n\t\t\t\tfederation.GetPostResponse{},\n\t\t\t\tfederation.Post{},\n\t\t\t),\n\t\t); diff != \"\" {\n\t\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t}\n\t})\n\tt.Run(\"ignore error\", func(t *testing.T) {\n\t\tst := status.New(codes.FailedPrecondition, \"failed to create post message\")\n\t\tgetPostError = st.Err()\n\n\t\tres, err := client.GetPost(ctx, &federation.GetPostRequest{Id: \"\"})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tif diff := cmp.Diff(res,\n\t\t\t&federation.GetPostResponse{\n\t\t\t\tPost: &federation.Post{\n\t\t\t\t\tCode: int32(codes.FailedPrecondition),\n\t\t\t\t},\n\t\t\t},\n\t\t\tcmpopts.IgnoreUnexported(\n\t\t\t\tfederation.GetPostResponse{},\n\t\t\t\tfederation.Post{},\n\t\t\t),\n\t\t); diff != \"\" {\n\t\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t}\n\t})\n\tt.Run(\"custom log level\", func(t *testing.T) {\n\t\tst := status.New(codes.InvalidArgument, \"failed to create post message\")\n\t\tgetPostError = st.Err()\n\n\t\t_, err := client.GetPost(ctx, &federation.GetPostRequest{Id: \"y\"})\n\t\tif err == nil {\n\t\t\tt.Fatal(\"expected error\")\n\t\t}\n\t\ts, ok := status.FromError(err)\n\t\tif !ok {\n\t\t\tt.Fatalf(\"failed to extract gRPC Status from the error: %v\", err)\n\t\t}\n\t\tif s.Message() != `this is custom log level` {\n\t\t\tt.Fatalf(\"got unexpected error: %v\", err)\n\t\t}\n\t})\n\tt.Run(\"pass through default error\", func(t *testing.T) {\n\t\tcode := codes.FailedPrecondition\n\t\tmsg := \"this is default error message\"\n\t\tdetail := &errdetails.PreconditionFailure{\n\t\t\tViolations: []*errdetails.PreconditionFailure_Violation{\n\t\t\t\t{\n\t\t\t\t\tType:        \"x\",\n\t\t\t\t\tSubject:     \"y\",\n\t\t\t\t\tDescription: \"z\",\n\t\t\t\t},\n\t\t\t},\n\t\t}\n\t\tst, _ := status.New(code, msg).WithDetails(detail)\n\t\tgetPostError = st.Err()\n\t\t_, err := client.GetPost2(ctx, &federation.GetPost2Request{Id: \"y\"})\n\t\tif err == nil {\n\t\t\tt.Fatal(\"expected error\")\n\t\t}\n\t\ts, ok := status.FromError(err)\n\t\tif !ok {\n\t\t\tt.Fatalf(\"failed to extract gRPC Status from the error: %v\", err)\n\t\t}\n\t\tif s.Code() != code {\n\t\t\tt.Fatalf(\"got unexpected error: %v\", err)\n\t\t}\n\t\tif s.Message() != msg {\n\t\t\tt.Fatalf(\"got unexpected error: %v\", err)\n\t\t}\n\t\tif len(s.Details()) != 1 {\n\t\t\tt.Fatalf(\"got unexpected error: %v\", err)\n\t\t}\n\t\tif diff := cmp.Diff(s.Details()[0], detail,\n\t\t\tcmpopts.IgnoreUnexported(\n\t\t\t\terrdetails.PreconditionFailure{},\n\t\t\t\terrdetails.PreconditionFailure_Violation{},\n\t\t\t),\n\t\t); diff != \"\" {\n\t\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t}\n\t})\n}\n"
  },
  {
    "path": "_examples/17_error_handler/post/post.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: post/post.proto\n\npackage post\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype GetPostRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetPostRequest) Reset() {\n\t*x = GetPostRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostRequest) ProtoMessage() {}\n\nfunc (x *GetPostRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostRequest.ProtoReflect.Descriptor instead.\nfunc (*GetPostRequest) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetPostRequest) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\ntype GetPostResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPost *Post `protobuf:\"bytes,1,opt,name=post,proto3\" json:\"post,omitempty\"`\n}\n\nfunc (x *GetPostResponse) Reset() {\n\t*x = GetPostResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostResponse) ProtoMessage() {}\n\nfunc (x *GetPostResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostResponse.ProtoReflect.Descriptor instead.\nfunc (*GetPostResponse) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetPostResponse) GetPost() *Post {\n\tif x != nil {\n\t\treturn x.Post\n\t}\n\treturn nil\n}\n\ntype Post struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId      string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tTitle   string `protobuf:\"bytes,2,opt,name=title,proto3\" json:\"title,omitempty\"`\n\tContent string `protobuf:\"bytes,3,opt,name=content,proto3\" json:\"content,omitempty\"`\n\tUserId  string `protobuf:\"bytes,4,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *Post) Reset() {\n\t*x = Post{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Post) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Post) ProtoMessage() {}\n\nfunc (x *Post) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Post.ProtoReflect.Descriptor instead.\nfunc (*Post) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *Post) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetTitle() string {\n\tif x != nil {\n\t\treturn x.Title\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetContent() string {\n\tif x != nil {\n\t\treturn x.Content\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetUserId() string {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn \"\"\n}\n\nvar File_post_post_proto protoreflect.FileDescriptor\n\nvar file_post_post_proto_rawDesc = []byte{\n\t0x0a, 0x0f, 0x70, 0x6f, 0x73, 0x74, 0x2f, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x20, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x6f,\n\t0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x31, 0x0a, 0x0f, 0x47, 0x65, 0x74,\n\t0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x04,\n\t0x70, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x6f, 0x73,\n\t0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x5f, 0x0a, 0x04,\n\t0x50, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18,\n\t0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x32, 0x47, 0x0a,\n\t0x0b, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x38, 0x0a, 0x07,\n\t0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x47,\n\t0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e,\n\t0x70, 0x6f, 0x73, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70,\n\t0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x58, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x6f,\n\t0x73, 0x74, 0x42, 0x09, 0x50, 0x6f, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a,\n\t0x11, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x70, 0x6f, 0x73, 0x74, 0x3b, 0x70, 0x6f,\n\t0x73, 0x74, 0xa2, 0x02, 0x03, 0x50, 0x58, 0x58, 0xaa, 0x02, 0x04, 0x50, 0x6f, 0x73, 0x74, 0xca,\n\t0x02, 0x04, 0x50, 0x6f, 0x73, 0x74, 0xe2, 0x02, 0x10, 0x50, 0x6f, 0x73, 0x74, 0x5c, 0x47, 0x50,\n\t0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x04, 0x50, 0x6f, 0x73, 0x74,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_post_post_proto_rawDescOnce sync.Once\n\tfile_post_post_proto_rawDescData = file_post_post_proto_rawDesc\n)\n\nfunc file_post_post_proto_rawDescGZIP() []byte {\n\tfile_post_post_proto_rawDescOnce.Do(func() {\n\t\tfile_post_post_proto_rawDescData = protoimpl.X.CompressGZIP(file_post_post_proto_rawDescData)\n\t})\n\treturn file_post_post_proto_rawDescData\n}\n\nvar file_post_post_proto_msgTypes = make([]protoimpl.MessageInfo, 3)\nvar file_post_post_proto_goTypes = []interface{}{\n\t(*GetPostRequest)(nil),  // 0: post.GetPostRequest\n\t(*GetPostResponse)(nil), // 1: post.GetPostResponse\n\t(*Post)(nil),            // 2: post.Post\n}\nvar file_post_post_proto_depIdxs = []int32{\n\t2, // 0: post.GetPostResponse.post:type_name -> post.Post\n\t0, // 1: post.PostService.GetPost:input_type -> post.GetPostRequest\n\t1, // 2: post.PostService.GetPost:output_type -> post.GetPostResponse\n\t2, // [2:3] is the sub-list for method output_type\n\t1, // [1:2] is the sub-list for method input_type\n\t1, // [1:1] is the sub-list for extension type_name\n\t1, // [1:1] is the sub-list for extension extendee\n\t0, // [0:1] is the sub-list for field type_name\n}\n\nfunc init() { file_post_post_proto_init() }\nfunc file_post_post_proto_init() {\n\tif File_post_post_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_post_post_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Post); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_post_post_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   3,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_post_post_proto_goTypes,\n\t\tDependencyIndexes: file_post_post_proto_depIdxs,\n\t\tMessageInfos:      file_post_post_proto_msgTypes,\n\t}.Build()\n\tFile_post_post_proto = out.File\n\tfile_post_post_proto_rawDesc = nil\n\tfile_post_post_proto_goTypes = nil\n\tfile_post_post_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/17_error_handler/post/post_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: post/post.proto\n\npackage post\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tPostService_GetPost_FullMethodName = \"/post.PostService/GetPost\"\n)\n\n// PostServiceClient is the client API for PostService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype PostServiceClient interface {\n\tGetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error)\n}\n\ntype postServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewPostServiceClient(cc grpc.ClientConnInterface) PostServiceClient {\n\treturn &postServiceClient{cc}\n}\n\nfunc (c *postServiceClient) GetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error) {\n\tout := new(GetPostResponse)\n\terr := c.cc.Invoke(ctx, PostService_GetPost_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// PostServiceServer is the server API for PostService service.\n// All implementations must embed UnimplementedPostServiceServer\n// for forward compatibility\ntype PostServiceServer interface {\n\tGetPost(context.Context, *GetPostRequest) (*GetPostResponse, error)\n\tmustEmbedUnimplementedPostServiceServer()\n}\n\n// UnimplementedPostServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedPostServiceServer struct {\n}\n\nfunc (UnimplementedPostServiceServer) GetPost(context.Context, *GetPostRequest) (*GetPostResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetPost not implemented\")\n}\nfunc (UnimplementedPostServiceServer) mustEmbedUnimplementedPostServiceServer() {}\n\n// UnsafePostServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to PostServiceServer will\n// result in compilation errors.\ntype UnsafePostServiceServer interface {\n\tmustEmbedUnimplementedPostServiceServer()\n}\n\nfunc RegisterPostServiceServer(s grpc.ServiceRegistrar, srv PostServiceServer) {\n\ts.RegisterService(&PostService_ServiceDesc, srv)\n}\n\nfunc _PostService_GetPost_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetPostRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(PostServiceServer).GetPost(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: PostService_GetPost_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(PostServiceServer).GetPost(ctx, req.(*GetPostRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// PostService_ServiceDesc is the grpc.ServiceDesc for PostService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar PostService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"post.PostService\",\n\tHandlerType: (*PostServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetPost\",\n\t\t\tHandler:    _PostService_GetPost_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"post/post.proto\",\n}\n"
  },
  {
    "path": "_examples/17_error_handler/proto/buf.yaml",
    "content": "version: v1\nbreaking:\n  use:\n    - FILE\nlint:\n  use:\n    - DEFAULT\n"
  },
  {
    "path": "_examples/17_error_handler/proto/federation/federation.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\noption (grpc.federation.file)= {\n  import: [\"post/post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n  rpc GetPost2(GetPost2Request) returns (GetPost2Response) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  org.federation.Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Z {\n  option (grpc.federation.message) = {\n    def { name: \"code\" by: \"$.error_info.code\" }\n  };\n  int32 code = 1 [(grpc.federation.field).by = \"code\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"res\"\n        call {\n          method: \"post.PostService/GetPost\"\n          request { field: \"id\" by: \"$.id\" }\n          error {\n            def { name: \"id\" by: \"$.id\" }\n            def { message { name: \"Z\" args { name: \"error_info\" by: \"error\" } }}\n            if: \"error.precondition_failures[?0].violations[?0].subject == optional.of('bar') && error.localized_messages[?0].message == optional.of('hello') && error.custom_messages[?0].id == optional.of('xxx')\"\n            code: FAILED_PRECONDITION\n            message: \"'this is custom error message'\"\n            details {\n              def { name: \"localized_msg\" message { name: \"LocalizedMessage\" args { name: \"value\" by: \"id\" } } }\n              def { message { name: \"Z\" args { name: \"error_info\" by: \"error\" } }}\n              message { name: \"CustomMessage\" args { name: \"error_info\" by: \"error\" } }\n              by: \"post.Post{id: 'foo'}\"\n              precondition_failure {\n                violations {\n                  type: \"'some-type'\"\n                  subject: \"'some-subject'\"\n                  description: \"'some-description'\"\n                }\n              }\n              localized_message {\n                locale: \"en-US\"\n                message: \"localized_msg.value\"\n              }\n            }\n          }\n          error {\n            log_level: WARN\n            if: \"error.code == google.rpc.Code.INVALID_ARGUMENT\"\n            code: INVALID_ARGUMENT\n            message: \"'this is custom log level'\"\n          }\n          error {\n            if: \"error.code == google.rpc.Code.UNIMPLEMENTED\"\n            ignore_and_response: \"post.GetPostResponse{post: post.Post{id: 'anonymous'}}\"\n          }\n          error {\n            ignore: true\n          }\n          error {\n            code: CANCELLED\n          }\n        }\n      },\n      { name: \"post\" by: \"res.post\" autobind: true },\n      { if: \"res.hasIgnoredError()\" name: \"code\" by: \"res.ignoredError().code\" }\n    ]\n  };\n  string id = 1;\n  string title = 2;\n  int32 code = 3 [(grpc.federation.field).by = \"code\"];\n}\n\nmessage LocalizedMessage {\n  string value = 1 [(grpc.federation.field).by = \"'localized value:' + $.value\"];\n}\n\nmessage CustomMessage {\n  string msg = 1 [(grpc.federation.field).by = \"'custom error message:' + $.error_info.message\"];\n}\n\n\nmessage GetPost2Request {\n  string id = 1;\n}\n\nmessage GetPost2Response {\n  option (grpc.federation.message) = {\n    def {\n      call {\n        method: \"post.PostService/GetPost\"\n        request { field: \"id\" by: \"$.id\" }\n        error {\n          def [\n            { name: \"code\" by: \"google.rpc.Code.from(error.code)\" },\n            { name: \"msg\" by: \"error.message\" }\n          ]\n          if: \"code == google.rpc.Code.FAILED_PRECONDITION\"\n          log_level: WARN\n        }\n        error {\n          def [\n            { name: \"code2\" by: \"google.rpc.Code.from(error.code)\" },\n            { name: \"msg2\" by: \"error.message\" }\n          ]\n          if: \"code2 == google.rpc.Code.INTERNAL\"\n          log_level: ERROR\n        }\n      }\n    }\n  };\n}"
  },
  {
    "path": "_examples/17_error_handler/proto/post/post.proto",
    "content": "syntax = \"proto3\";\n\npackage post;\n\noption go_package = \"example/post;post\";\n\nservice PostService {\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  Post post = 1;\n}\n\nmessage Post {\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  string user_id = 4;\n}\n"
  },
  {
    "path": "_examples/18_load/.gitignore",
    "content": "grpc/federation\n*.wasm\n"
  },
  {
    "path": "_examples/18_load/Makefile",
    "content": "MAKEFILE_DIR := $(dir $(lastword $(MAKEFILE_LIST)))\nGOBIN := $(MAKEFILE_DIR)/../../bin\nPATH := $(GOBIN):$(PATH)\n\nJAEGER_IMAGE := jaegertracing/all-in-one:latest\n\n.PHONY: generate\ngenerate:\n\t$(GOBIN)/buf generate\n\n.PHONY: lint\nlint:\n\t@$(GOBIN)/grpc-federation-linter -Iproto -Iproto_deps ./proto/federation/federation.proto\n\n.PHONY: test\ntest: build/wasm\n\tgo test -race ./ -count=1\n\n.PHONY: grpc-federation/generate\ngrpc-federation/generate:\n\t@$(GOBIN)/grpc-federation-generator ./proto/federation/federation.proto\n\n.PHONY: grpc-federation/watch\ngrpc-federation/watch:\n\t@$(GOBIN)/grpc-federation-generator -w\n\n.PHONY: jaeger/start\njaeger/start:\n\t@docker run \\\n\t\t-e COLLECTOR_OTLP_ENABLED=true \\\n\t\t-p 16686:16686 \\\n\t\t-p 4317:4317 \\\n\t\t-p 4318:4318 \\\n\t\t-d \\\n\t\t$(JAEGER_IMAGE)\n\n.PHONY: jaeger/stop\njaeger/stop:\n\t@docker stop $(shell docker ps -q  --filter ancestor=$(JAEGER_IMAGE))\n\nbuild/wasm:\n\tGOOS=wasip1 GOARCH=wasm go build -ldflags \"-w -s\" -o account.wasm ./cmd/plugin\n\n.PHONY: bench\nbench:\n\tgo test -bench=. -run Benchmark -benchmem -cpuprofile cpu.out --memprofile mem.out\n\n.PHONY: bench/graph\nbench/graph: bench\n\tgo tool pprof --svg cpu.out\n\tgo tool pprof --svg mem.out\n"
  },
  {
    "path": "_examples/18_load/buf.gen.yaml",
    "content": "version: v1\nmanaged:\n  enabled: true\nplugins:\n  - plugin: go\n    out: .\n    opt: paths=source_relative\n  - plugin: go-grpc\n    out: .\n    opt: paths=source_relative\n  - plugin: grpc-federation\n    out: .\n    opt:\n      - paths=source_relative\n      - import_paths=proto\n"
  },
  {
    "path": "_examples/18_load/buf.work.yaml",
    "content": "version: v1\ndirectories:\n  - proto\n  - proto_deps\n"
  },
  {
    "path": "_examples/18_load/cmd/plugin/main.go",
    "content": "package main\n\nimport (\n\t\"context\"\n\tpluginpb \"example/plugin\"\n\t\"fmt\"\n\n\t\"google.golang.org/grpc/metadata\"\n)\n\ntype plugin struct{}\n\nfunc (_ *plugin) Example_Account_GetId(ctx context.Context) (string, error) {\n\tmd, ok := metadata.FromIncomingContext(ctx)\n\tif !ok {\n\t\treturn \"\", fmt.Errorf(\"failed to get metadata\")\n\t}\n\tvalues := md[\"id\"]\n\tif len(values) == 0 {\n\t\treturn \"\", fmt.Errorf(\"failed to find id key in metadata\")\n\t}\n\treturn values[0], nil\n}\n\nfunc (_ *plugin) Example_Account_GetId2(ctx context.Context, ext string) (string, error) {\n\tmd, ok := metadata.FromIncomingContext(ctx)\n\tif !ok {\n\t\treturn \"\", fmt.Errorf(\"failed to get metadata\")\n\t}\n\tvalues := md[\"id\"]\n\tif len(values) == 0 {\n\t\treturn \"\", fmt.Errorf(\"failed to find id key in metadata\")\n\t}\n\treturn values[0], nil\n}\n\nfunc main() {\n\tpluginpb.RegisterAccountPlugin(&plugin{})\n}\n"
  },
  {
    "path": "_examples/18_load/federation/federation.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype GetRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *GetRequest) Reset() {\n\t*x = GetRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetRequest) ProtoMessage() {}\n\nfunc (x *GetRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetRequest.ProtoReflect.Descriptor instead.\nfunc (*GetRequest) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\ntype GetResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tIdFromPlugin   string `protobuf:\"bytes,1,opt,name=id_from_plugin,json=idFromPlugin,proto3\" json:\"id_from_plugin,omitempty\"`\n\tIdFromMetadata string `protobuf:\"bytes,2,opt,name=id_from_metadata,json=idFromMetadata,proto3\" json:\"id_from_metadata,omitempty\"`\n}\n\nfunc (x *GetResponse) Reset() {\n\t*x = GetResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetResponse) ProtoMessage() {}\n\nfunc (x *GetResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetResponse.ProtoReflect.Descriptor instead.\nfunc (*GetResponse) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetResponse) GetIdFromPlugin() string {\n\tif x != nil {\n\t\treturn x.IdFromPlugin\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetResponse) GetIdFromMetadata() string {\n\tif x != nil {\n\t\treturn x.IdFromMetadata\n\t}\n\treturn \"\"\n}\n\nvar File_federation_federation_proto protoreflect.FileDescriptor\n\nvar file_federation_federation_proto_rawDesc = []byte{\n\t0x0a, 0x1b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x6f,\n\t0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x20, 0x67,\n\t0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22,\n\t0x0c, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xfc, 0x01,\n\t0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a,\n\t0x0e, 0x69, 0x64, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x13, 0x9a, 0x4a, 0x10, 0x12, 0x0e, 0x69, 0x64, 0x5f, 0x66,\n\t0x72, 0x6f, 0x6d, 0x5f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52, 0x0c, 0x69, 0x64, 0x46, 0x72,\n\t0x6f, 0x6d, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x3f, 0x0a, 0x10, 0x69, 0x64, 0x5f, 0x66,\n\t0x72, 0x6f, 0x6d, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x09, 0x42, 0x15, 0x9a, 0x4a, 0x12, 0x12, 0x10, 0x69, 0x64, 0x5f, 0x66, 0x72, 0x6f, 0x6d,\n\t0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0e, 0x69, 0x64, 0x46, 0x72, 0x6f,\n\t0x6d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x71, 0x9a, 0x4a, 0x6e, 0x0a, 0x2a,\n\t0x0a, 0x0e, 0x69, 0x64, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e,\n\t0x5a, 0x18, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e,\n\t0x74, 0x2e, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x28, 0x29, 0x0a, 0x40, 0x0a, 0x10, 0x69, 0x64,\n\t0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5a, 0x2c,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e,\n\t0x67, 0x28, 0x29, 0x5b, 0x27, 0x69, 0x64, 0x27, 0x5d, 0x5b, 0x30, 0x5d, 0x32, 0x5a, 0x0a, 0x11,\n\t0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,\n\t0x65, 0x12, 0x40, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x1a, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,\n\t0x65, 0x22, 0x00, 0x1a, 0x03, 0x9a, 0x4a, 0x00, 0x42, 0xb5, 0x01, 0x9a, 0x4a, 0x15, 0x12, 0x13,\n\t0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0f, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x1d, 0x65, 0x78, 0x61, 0x6d,\n\t0x70, 0x6c, 0x65, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xa2, 0x02, 0x03, 0x4f, 0x46, 0x58, 0xaa,\n\t0x02, 0x0e, 0x4f, 0x72, 0x67, 0x2e, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0xca, 0x02, 0x0e, 0x4f, 0x72, 0x67, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0xe2, 0x02, 0x1a, 0x4f, 0x72, 0x67, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02,\n\t0x0f, 0x4f, 0x72, 0x67, 0x3a, 0x3a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_federation_federation_proto_rawDescOnce sync.Once\n\tfile_federation_federation_proto_rawDescData = file_federation_federation_proto_rawDesc\n)\n\nfunc file_federation_federation_proto_rawDescGZIP() []byte {\n\tfile_federation_federation_proto_rawDescOnce.Do(func() {\n\t\tfile_federation_federation_proto_rawDescData = protoimpl.X.CompressGZIP(file_federation_federation_proto_rawDescData)\n\t})\n\treturn file_federation_federation_proto_rawDescData\n}\n\nvar file_federation_federation_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_federation_federation_proto_goTypes = []interface{}{\n\t(*GetRequest)(nil),  // 0: org.federation.GetRequest\n\t(*GetResponse)(nil), // 1: org.federation.GetResponse\n}\nvar file_federation_federation_proto_depIdxs = []int32{\n\t0, // 0: org.federation.FederationService.Get:input_type -> org.federation.GetRequest\n\t1, // 1: org.federation.FederationService.Get:output_type -> org.federation.GetResponse\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_federation_federation_proto_init() }\nfunc file_federation_federation_proto_init() {\n\tif File_federation_federation_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_federation_federation_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_federation_federation_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_federation_federation_proto_goTypes,\n\t\tDependencyIndexes: file_federation_federation_proto_depIdxs,\n\t\tMessageInfos:      file_federation_federation_proto_msgTypes,\n\t}.Build()\n\tFile_federation_federation_proto = out.File\n\tfile_federation_federation_proto_rawDesc = nil\n\tfile_federation_federation_proto_goTypes = nil\n\tfile_federation_federation_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/18_load/federation/federation_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tFederationService_Get_FullMethodName = \"/org.federation.FederationService/Get\"\n)\n\n// FederationServiceClient is the client API for FederationService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype FederationServiceClient interface {\n\tGet(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error)\n}\n\ntype federationServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewFederationServiceClient(cc grpc.ClientConnInterface) FederationServiceClient {\n\treturn &federationServiceClient{cc}\n}\n\nfunc (c *federationServiceClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) {\n\tout := new(GetResponse)\n\terr := c.cc.Invoke(ctx, FederationService_Get_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// FederationServiceServer is the server API for FederationService service.\n// All implementations must embed UnimplementedFederationServiceServer\n// for forward compatibility\ntype FederationServiceServer interface {\n\tGet(context.Context, *GetRequest) (*GetResponse, error)\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\n// UnimplementedFederationServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedFederationServiceServer struct {\n}\n\nfunc (UnimplementedFederationServiceServer) Get(context.Context, *GetRequest) (*GetResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method Get not implemented\")\n}\nfunc (UnimplementedFederationServiceServer) mustEmbedUnimplementedFederationServiceServer() {}\n\n// UnsafeFederationServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to FederationServiceServer will\n// result in compilation errors.\ntype UnsafeFederationServiceServer interface {\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\nfunc RegisterFederationServiceServer(s grpc.ServiceRegistrar, srv FederationServiceServer) {\n\ts.RegisterService(&FederationService_ServiceDesc, srv)\n}\n\nfunc _FederationService_Get_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(FederationServiceServer).Get(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: FederationService_Get_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(FederationServiceServer).Get(ctx, req.(*GetRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// FederationService_ServiceDesc is the grpc.ServiceDesc for FederationService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar FederationService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"org.federation.FederationService\",\n\tHandlerType: (*FederationServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"Get\",\n\t\t\tHandler:    _FederationService_Get_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"federation/federation.proto\",\n}\n"
  },
  {
    "path": "_examples/18_load/federation/federation_grpc_federation.pb.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: federation/federation.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Org_Federation_GetResponseVariable represents variable definitions in \"org.federation.GetResponse\".\ntype FederationService_Org_Federation_GetResponseVariable struct {\n\tIdFromMetadata string\n\tIdFromPlugin   string\n}\n\n// Org_Federation_GetResponseArgument is argument for \"org.federation.GetResponse\" message.\ntype FederationService_Org_Federation_GetResponseArgument struct {\n\tFederationService_Org_Federation_GetResponseVariable\n}\n\n// FederationServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationServiceConfig struct {\n\t// CELPlugin If you use the plugin feature to extend the CEL API,\n\t// you must write a plugin and output WebAssembly.\n\t// In this field, configure to load wasm with the path to the WebAssembly file and the sha256 value.\n\tCELPlugin *FederationServiceCELPluginConfig\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationServiceClientFactory interface {\n}\n\n// FederationServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationServiceDependentClientSet struct {\n}\n\n// FederationServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationServiceResolver interface {\n}\n\n// FederationServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationServiceCELPluginConfig struct {\n\tAccount  FederationServiceCELPluginWasmConfig\n\tCacheDir string\n}\n\n// FederationServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationServiceUnimplementedResolver struct{}\n\n// FederationService represents Federation Service.\ntype FederationService struct {\n\tUnimplementedFederationServiceServer\n\tcfg             FederationServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationServiceDependentClientSet\n}\n\n// NewFederationService creates FederationService instance by FederationServiceConfig.\nfunc NewFederationService(cfg FederationServiceConfig) (*FederationService, error) {\n\tif cfg.CELPlugin == nil {\n\t\treturn nil, grpcfed.ErrCELPluginConfig\n\t}\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"org.federation.FederationService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.org.federation.GetResponseArgument\": {},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"org.federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tvar celPlugins []*grpcfedcel.CELPlugin\n\t{\n\t\tplugin, err := grpcfedcel.NewCELPlugin(ctx, grpcfedcel.CELPluginConfig{\n\t\t\tName:     \"account\",\n\t\t\tWasm:     cfg.CELPlugin.Account,\n\t\t\tCacheDir: cfg.CELPlugin.CacheDir,\n\t\t\tFunctions: []*grpcfedcel.CELFunction{\n\t\t\t\t{\n\t\t\t\t\tName:     \"example.account.get_id\",\n\t\t\t\t\tID:       \"example_account_get_id_string\",\n\t\t\t\t\tArgs:     []*grpcfed.CELTypeDeclare{},\n\t\t\t\t\tReturn:   grpcfed.CELStringType,\n\t\t\t\t\tIsMethod: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tName: \"example.account.get_id\",\n\t\t\t\t\tID:   \"example_account_get_id_string_string\",\n\t\t\t\t\tArgs: []*grpcfed.CELTypeDeclare{\n\t\t\t\t\t\tgrpcfed.CELStringType,\n\t\t\t\t\t},\n\t\t\t\t\tReturn:   grpcfed.CELStringType,\n\t\t\t\t\tIsMethod: false,\n\t\t\t\t},\n\t\t\t},\n\t\t\tCapability: &grpcfedcel.CELPluginCapability{},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tinstance, err := plugin.CreateInstance(ctx, celTypeHelper.CELRegistry())\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := instance.ValidatePlugin(ctx); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tcelPlugins = append(celPlugins, plugin)\n\t\tcelEnvOpts = append(celEnvOpts, grpcfed.CELLib(plugin))\n\t}\n\tsvc := &FederationService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tcelPlugins:      celPlugins,\n\t\tclient:          &FederationServiceDependentClientSet{},\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationService(ctx context.Context, svc *FederationService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n// Get implements \"org.federation.FederationService/Get\" method.\nfunc (s *FederationService) Get(ctx context.Context, req *GetRequest) (res *GetResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.FederationService/Get\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Org_Federation_GetResponse(ctx, &FederationService_Org_Federation_GetResponseArgument{})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Org_Federation_GetResponse resolve \"org.federation.GetResponse\" message.\nfunc (s *FederationService) resolve_Org_Federation_GetResponse(ctx context.Context, req *FederationService_Org_Federation_GetResponseArgument) (*GetResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.GetResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.GetResponse\", slog.Any(\"message_args\", s.logvalue_Org_Federation_GetResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tIdFromMetadata string\n\t\t\tIdFromPlugin   string\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.GetResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"id_from_plugin\"\n\t\t  by: \"example.account.get_id()\"\n\t\t}\n\t*/\n\tdef_id_from_plugin := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[string, *localValueType]{\n\t\t\tName: `id_from_plugin`,\n\t\t\tType: grpcfed.CELStringType,\n\t\t\tSetter: func(value *localValueType, v string) error {\n\t\t\t\tvalue.vars.IdFromPlugin = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `example.account.get_id()`,\n\t\t\tByCacheIndex: 1,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"id_from_metadata\"\n\t\t  by: \"grpc.federation.metadata.incoming()['id'][0]\"\n\t\t}\n\t*/\n\tdef_id_from_metadata := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[string, *localValueType]{\n\t\t\tName: `id_from_metadata`,\n\t\t\tType: grpcfed.CELStringType,\n\t\t\tSetter: func(value *localValueType, v string) error {\n\t\t\t\tvalue.vars.IdFromMetadata = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `grpc.federation.metadata.incoming()['id'][0]`,\n\t\t\tByCacheIndex: 2,\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t   id_from_metadata ─┐\n\t     id_from_plugin ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_id_from_metadata(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_id_from_plugin(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_GetResponseVariable.IdFromMetadata = value.vars.IdFromMetadata\n\treq.FederationService_Org_Federation_GetResponseVariable.IdFromPlugin = value.vars.IdFromPlugin\n\n\t// create a message value to be returned.\n\tret := &GetResponse{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"id_from_plugin\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `id_from_plugin`,\n\t\tCacheIndex: 3,\n\t\tSetter: func(v string) error {\n\t\t\tret.IdFromPlugin = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"id_from_metadata\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `id_from_metadata`,\n\t\tCacheIndex: 4,\n\t\tSetter: func(v string) error {\n\t\t\tret.IdFromMetadata = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.GetResponse\", slog.Any(\"org.federation.GetResponse\", s.logvalue_Org_Federation_GetResponse(ret)))\n\treturn ret, nil\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetResponse(v *GetResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id_from_plugin\", v.GetIdFromPlugin()),\n\t\tslog.String(\"id_from_metadata\", v.GetIdFromMetadata()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetResponseArgument(v *FederationService_Org_Federation_GetResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n"
  },
  {
    "path": "_examples/18_load/go.mod",
    "content": "module example\n\ngo 1.24.0\n\nreplace github.com/mercari/grpc-federation => ../../\n\nrequire (\n\tgithub.com/google/go-cmp v0.7.0\n\tgithub.com/mercari/grpc-federation v0.0.0-00010101000000-000000000000\n\tgo.opentelemetry.io/otel v1.24.0\n\tgo.opentelemetry.io/otel/trace v1.24.0\n\tgo.uber.org/goleak v1.3.0\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7\n\tgoogle.golang.org/grpc v1.65.0\n\tgoogle.golang.org/protobuf v1.34.2\n)\n\nrequire (\n\tcel.dev/expr v0.19.1 // indirect\n\tgithub.com/antlr4-go/antlr/v4 v4.13.0 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.2.1 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/goccy/wasi-go v0.3.2 // indirect\n\tgithub.com/google/cel-go v0.23.1 // indirect\n\tgithub.com/google/uuid v1.6.0 // indirect\n\tgithub.com/kelseyhightower/envconfig v1.4.0 // indirect\n\tgithub.com/stealthrocket/wazergo v0.19.1 // indirect\n\tgithub.com/stoewer/go-strcase v1.3.0 // indirect\n\tgithub.com/tetratelabs/wazero v1.10.1 // indirect\n\tgo.opentelemetry.io/otel/metric v1.24.0 // indirect\n\tgolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect\n\tgolang.org/x/net v0.38.0 // indirect\n\tgolang.org/x/sync v0.14.0 // indirect\n\tgolang.org/x/sys v0.37.0 // indirect\n\tgolang.org/x/text v0.23.0 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 // indirect\n)\n"
  },
  {
    "path": "_examples/18_load/go.sum",
    "content": "cel.dev/expr v0.19.1 h1:NciYrtDRIR0lNCnH1LFJegdjspNx9fI59O7TWcua/W4=\ncel.dev/expr v0.19.1/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw=\ngithub.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=\ngithub.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/goccy/wasi-go v0.3.2 h1:wAvGXmqCkfcp0B0AwIp5Ya53hzDwkKm9W8iuT3nCCz0=\ngithub.com/goccy/wasi-go v0.3.2/go.mod h1:nIKD204n9xa4Z20UV+XA483kIr9TAl2vXr+X5qVAO5M=\ngithub.com/google/cel-go v0.23.1 h1:91ThhEZlBcE5rB2adBVXqvDoqdL8BG2oyhd0bK1I/r4=\ngithub.com/google/cel-go v0.23.1/go.mod h1:52Pb6QsDbC5kvgxvZhiL9QX1oZEkcUF/ZqaPx1J5Wwo=\ngithub.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\ngithub.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=\ngithub.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/stealthrocket/wazergo v0.19.1 h1:BPrITETPgSFwiytwmToO0MbUC/+RGC39JScz1JmmG6c=\ngithub.com/stealthrocket/wazergo v0.19.1/go.mod h1:riI0hxw4ndZA5e6z7PesHg2BtTftcZaMxRcoiGGipTs=\ngithub.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs=\ngithub.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tetratelabs/wazero v1.10.1 h1:2DugeJf6VVk58KTPszlNfeeN8AhhpwcZqkJj2wwFuH8=\ngithub.com/tetratelabs/wazero v1.10.1/go.mod h1:DRm5twOQ5Gr1AoEdSi0CLjDQF1J9ZAuyqFIjl1KKfQU=\ngo.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo=\ngo.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=\ngo.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI=\ngo.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=\ngo.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=\ngo.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=\ngolang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=\ngolang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=\ngolang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=\ngolang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=\ngolang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=\ngolang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=\ngolang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 h1:YcyjlL1PRr2Q17/I0dPk2JmYS5CDXfcdb2Z3YRioEbw=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7 h1:2035KHhUv+EpyB+hWgJnaWKJOdX1E95w2S8Rr4uWKTs=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=\ngoogle.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=\ngoogle.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=\ngoogle.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=\ngoogle.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "_examples/18_load/main_test.go",
    "content": "package main_test\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"crypto/sha256\"\n\t_ \"embed\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"net\"\n\t\"os\"\n\t\"sync\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"go.uber.org/goleak\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/credentials/insecure\"\n\t\"google.golang.org/grpc/metadata\"\n\t\"google.golang.org/grpc/test/bufconn\"\n\n\t\"example/federation\"\n)\n\nconst bufSize = 1024\n\nvar (\n\tlistener *bufconn.Listener\n\t//go:embed account.wasm\n\twasm []byte\n)\n\nfunc dialer(ctx context.Context, address string) (net.Conn, error) {\n\treturn listener.Dial()\n}\n\nfunc toSha256(v []byte) string {\n\thash := sha256.Sum256(v)\n\treturn hex.EncodeToString(hash[:])\n}\n\nfunc TestCELEvaluation(t *testing.T) {\n\tdefer goleak.VerifyNone(t)\n\tctx := context.Background()\n\tlistener = bufconn.Listen(bufSize)\n\n\tconn, err := grpc.DialContext(\n\t\tctx, \"\",\n\t\tgrpc.WithContextDialer(dialer),\n\t\tgrpc.WithTransportCredentials(insecure.NewCredentials()),\n\t\tgrpc.WithDefaultCallOptions(grpc.WaitForReady(true)),\n\t)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer conn.Close()\n\n\tgrpcServer := grpc.NewServer()\n\tdefer grpcServer.Stop()\n\n\tlogger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{\n\t\tLevel: slog.LevelDebug,\n\t}))\n\tfederationServer, err := federation.NewFederationService(federation.FederationServiceConfig{\n\t\tCELPlugin: &federation.FederationServiceCELPluginConfig{\n\t\t\tAccount: federation.FederationServiceCELPluginWasmConfig{\n\t\t\t\tReader: bytes.NewReader(wasm),\n\t\t\t\tSha256: toSha256(wasm),\n\t\t\t},\n\t\t},\n\t\tLogger: logger,\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer federation.CleanupFederationService(ctx, federationServer)\n\n\tfederation.RegisterFederationServiceServer(grpcServer, federationServer)\n\n\tgo func() {\n\t\tif err := grpcServer.Serve(listener); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t}()\n\n\tclient := federation.NewFederationServiceClient(conn)\n\n\tvar wg sync.WaitGroup\n\tfor i := 0; i < 50; i++ {\n\t\ti := i\n\t\twg.Add(1)\n\t\tgo func() {\n\t\t\tdefer wg.Done()\n\t\t\tid := \"foo\" + fmt.Sprint(i)\n\t\t\tctx := metadata.AppendToOutgoingContext(context.Background(), \"id\", id)\n\t\t\tres, err := client.Get(ctx, &federation.GetRequest{})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tif diff := cmp.Diff(res, &federation.GetResponse{\n\t\t\t\tIdFromPlugin:   id,\n\t\t\t\tIdFromMetadata: id,\n\t\t\t}, cmpopts.IgnoreUnexported(\n\t\t\t\tfederation.GetResponse{},\n\t\t\t)); diff != \"\" {\n\t\t\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t}\n\t\t}()\n\t}\n\twg.Wait()\n}\n\nfunc Benchmark_CELEvaluation(b *testing.B) {\n\tctx := context.Background()\n\tlistener = bufconn.Listen(bufSize)\n\n\tconn, err := grpc.DialContext(\n\t\tctx, \"\",\n\t\tgrpc.WithContextDialer(dialer),\n\t\tgrpc.WithTransportCredentials(insecure.NewCredentials()),\n\t\tgrpc.WithDefaultCallOptions(grpc.WaitForReady(true)),\n\t)\n\tif err != nil {\n\t\tb.Fatal(err)\n\t}\n\tdefer conn.Close()\n\n\tgrpcServer := grpc.NewServer()\n\tlogger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{\n\t\tLevel: slog.LevelDebug,\n\t}))\n\tfederationServer, err := federation.NewFederationService(federation.FederationServiceConfig{\n\t\tCELPlugin: &federation.FederationServiceCELPluginConfig{\n\t\t\tAccount: federation.FederationServiceCELPluginWasmConfig{\n\t\t\t\tReader: bytes.NewReader(wasm),\n\t\t\t\tSha256: toSha256(wasm),\n\t\t\t},\n\t\t},\n\t\tLogger: logger,\n\t})\n\tif err != nil {\n\t\tb.Fatal(err)\n\t}\n\tfederation.RegisterFederationServiceServer(grpcServer, federationServer)\n\n\tgo func() {\n\t\tif err := grpcServer.Serve(listener); err != nil {\n\t\t\tb.Fatal(err)\n\t\t}\n\t}()\n\n\tclient := federation.NewFederationServiceClient(conn)\n\n\tb.ReportAllocs()\n\tvar wg sync.WaitGroup\n\tfor n := 0; n < 1000; n++ {\n\t\tn := n\n\t\twg.Add(1)\n\t\tgo func() {\n\t\t\tdefer wg.Done()\n\t\t\tid := \"foo\" + fmt.Sprint(n)\n\t\t\tctx := metadata.AppendToOutgoingContext(context.Background(), \"id\", id)\n\t\t\tres, err := client.Get(ctx, &federation.GetRequest{})\n\t\t\tif err != nil {\n\t\t\t\tb.Fatal(err)\n\t\t\t}\n\t\t\tif diff := cmp.Diff(res, &federation.GetResponse{\n\t\t\t\tIdFromPlugin:   id,\n\t\t\t\tIdFromMetadata: id,\n\t\t\t}, cmpopts.IgnoreUnexported(\n\t\t\t\tfederation.GetResponse{},\n\t\t\t)); diff != \"\" {\n\t\t\t\tb.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t}\n\t\t}()\n\t}\n\twg.Wait()\n}\n"
  },
  {
    "path": "_examples/18_load/plugin/plugin.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: plugin/plugin.proto\n\npackage pluginpb\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\nvar File_plugin_plugin_proto protoreflect.FileDescriptor\n\nvar file_plugin_plugin_proto_rawDesc = []byte{\n\t0x0a, 0x13, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x61,\n\t0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x1a, 0x20, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x42, 0x8f, 0x02, 0x9a, 0x4a, 0x74, 0x0a, 0x72,\n\t0x0a, 0x70, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x30, 0x0a, 0x06, 0x67,\n\t0x65, 0x74, 0x5f, 0x69, 0x64, 0x12, 0x22, 0x67, 0x65, 0x74, 0x20, 0x69, 0x64, 0x20, 0x74, 0x65,\n\t0x78, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67,\n\t0x20, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x02, 0x08, 0x01, 0x22, 0x33, 0x0a,\n\t0x06, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x12, 0x1a, 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x6f, 0x61,\n\t0x64, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x67, 0x65, 0x74,\n\t0x5f, 0x69, 0x64, 0x1a, 0x09, 0x0a, 0x03, 0x65, 0x78, 0x74, 0x1a, 0x02, 0x08, 0x01, 0x22, 0x02,\n\t0x08, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e,\n\t0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x0b, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x50,\n\t0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x17, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f,\n\t0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x3b, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x70, 0x62, 0xa2,\n\t0x02, 0x03, 0x45, 0x41, 0x58, 0xaa, 0x02, 0x0f, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e,\n\t0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0xca, 0x02, 0x0f, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c,\n\t0x65, 0x5c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0xe2, 0x02, 0x1b, 0x45, 0x78, 0x61, 0x6d,\n\t0x70, 0x6c, 0x65, 0x5c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d,\n\t0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x10, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c,\n\t0x65, 0x3a, 0x3a, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x33,\n}\n\nvar file_plugin_plugin_proto_goTypes = []interface{}{}\nvar file_plugin_plugin_proto_depIdxs = []int32{\n\t0, // [0:0] is the sub-list for method output_type\n\t0, // [0:0] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_plugin_plugin_proto_init() }\nfunc file_plugin_plugin_proto_init() {\n\tif File_plugin_plugin_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_plugin_plugin_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_plugin_plugin_proto_goTypes,\n\t\tDependencyIndexes: file_plugin_plugin_proto_depIdxs,\n\t}.Build()\n\tFile_plugin_plugin_proto = out.File\n\tfile_plugin_plugin_proto_rawDesc = nil\n\tfile_plugin_plugin_proto_goTypes = nil\n\tfile_plugin_plugin_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/18_load/plugin/plugin_grpc_federation.pb.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: plugin/plugin.proto\npackage pluginpb\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\ntype AccountPlugin interface {\n\tExample_Account_GetId(context.Context) (string, error)\n\tExample_Account_GetId2(context.Context, string) (string, error)\n}\n\nfunc RegisterAccountPlugin(plug AccountPlugin) {\n\tgrpcfed.PluginMainLoop(\n\t\tgrpcfed.CELPluginVersionSchema{\n\t\t\tProtocolVersion:   grpcfed.CELPluginProtocolVersion,\n\t\t\tFederationVersion: \"(devel)\",\n\t\t\tFunctions: []string{\n\t\t\t\t\"example_account_get_id_string\",\n\t\t\t\t\"example_account_get_id_string_string\",\n\t\t\t},\n\t\t},\n\t\tfunc(ctx context.Context, req *grpcfed.CELPluginRequest) (*grpcfed.CELPluginResponse, error) {\n\t\t\tswitch req.GetMethod() {\n\t\t\tcase \"example_account_get_id_string\":\n\t\t\t\tif len(req.GetArgs()) != 0 {\n\t\t\t\t\treturn nil, fmt.Errorf(\"%s: invalid argument number: %d. expected number is %d\", req.GetMethod(), len(req.GetArgs()), 0)\n\t\t\t\t}\n\t\t\t\tret, err := plug.Example_Account_GetId(ctx)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn grpcfed.ToStringCELPluginResponse(ret)\n\t\t\tcase \"example_account_get_id_string_string\":\n\t\t\t\tif len(req.GetArgs()) != 1 {\n\t\t\t\t\treturn nil, fmt.Errorf(\"%s: invalid argument number: %d. expected number is %d\", req.GetMethod(), len(req.GetArgs()), 1)\n\t\t\t\t}\n\t\t\t\targ0, err := grpcfed.ToString(req.GetArgs()[0])\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := plug.Example_Account_GetId2(ctx, arg0)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn grpcfed.ToStringCELPluginResponse(ret)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"unexpected method name: %s\", req.GetMethod())\n\t\t},\n\t)\n}\n"
  },
  {
    "path": "_examples/18_load/proto/buf.yaml",
    "content": "version: v1\nbreaking:\n  use:\n    - FILE\nlint:\n  use:\n    - DEFAULT\n"
  },
  {
    "path": "_examples/18_load/proto/federation/federation.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\noption (grpc.federation.file) = {\n  import: [\n    \"plugin/plugin.proto\"\n  ]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc Get(GetRequest) returns (GetResponse) {};\n}\n\nmessage GetRequest {}\n    \nmessage GetResponse {\n  option (grpc.federation.message) = {\n    def { name: \"id_from_plugin\" by: \"example.account.get_id()\" }\n    def { name: \"id_from_metadata\" by: \"grpc.federation.metadata.incoming()['id'][0]\" }\n  };\n  string id_from_plugin = 1 [(grpc.federation.field).by = \"id_from_plugin\"];\n  string id_from_metadata = 2 [(grpc.federation.field).by = \"id_from_metadata\"];\n}\n"
  },
  {
    "path": "_examples/18_load/proto/plugin/plugin.proto",
    "content": "syntax = \"proto3\";\n\npackage example.account;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/plugin;pluginpb\";\n\noption (grpc.federation.file).plugin.export = {\n  name: \"account\"\n  functions: [\n    {\n      name: \"get_id\"\n      desc: \"get id text from incoming metadata\"\n      return { kind: STRING }\n    },\n    {\n      name: \"get_id\"\n      desc: \"overload method for get_id\"\n      args { name: \"ext\" type { kind: STRING } }\n      return { kind: STRING }\n    }\n  ]\n};\n"
  },
  {
    "path": "_examples/19_retry/.gitignore",
    "content": "grpc/federation\n"
  },
  {
    "path": "_examples/19_retry/.vscode/settings.json",
    "content": "{\n    \"protoc\": {\n        \"options\": [\n            \"--proto_path=proto\",\n            \"--proto_path=proto_deps\"\n        ]\n    },\n    \"grpc-federation\": {\n        \"path\": \"../../bin/grpc-federation-language-server\",\n        \"import-paths\": [\n            \"proto\",\n            \"proto_deps\"\n        ]\n    }\n}\n"
  },
  {
    "path": "_examples/19_retry/Makefile",
    "content": "MAKEFILE_DIR := $(dir $(lastword $(MAKEFILE_LIST)))\nGOBIN := $(MAKEFILE_DIR)/../../bin\nPATH := $(GOBIN):$(PATH)\n\nJAEGER_IMAGE := jaegertracing/all-in-one:latest\n\n.PHONY: generate\ngenerate:\n\t$(GOBIN)/buf generate\n\n.PHONY: lint\nlint:\n\t@$(GOBIN)/grpc-federation-linter -Iproto -Iproto_deps ./proto/federation/federation.proto\n\n.PHONY: test\ntest:\n\tgo test -race ./ -count=1\n\n.PHONY: grpc-federation/generate\ngrpc-federation/generate:\n\t@$(GOBIN)/grpc-federation-generator ./proto/federation/federation.proto\n\n.PHONY: grpc-federation/watch\ngrpc-federation/watch:\n\t@$(GOBIN)/grpc-federation-generator -w\n\n.PHONY: jaeger/start\njaeger/start:\n\t@docker run \\\n\t\t-e COLLECTOR_OTLP_ENABLED=true \\\n\t\t-p 16686:16686 \\\n\t\t-p 4317:4317 \\\n\t\t-p 4318:4318 \\\n\t\t-d \\\n\t\t$(JAEGER_IMAGE)\n\n.PHONY: jaeger/stop\njaeger/stop:\n\t@docker stop $(shell docker ps -q  --filter ancestor=$(JAEGER_IMAGE))\n"
  },
  {
    "path": "_examples/19_retry/buf.gen.yaml",
    "content": "version: v1\nmanaged:\n  enabled: true\nplugins:\n  - plugin: go\n    out: .\n    opt: paths=source_relative\n  - plugin: go-grpc\n    out: .\n    opt: paths=source_relative\n  - plugin: grpc-federation\n    out: .\n    opt:\n    - paths=source_relative\n    - import_paths=proto\n"
  },
  {
    "path": "_examples/19_retry/buf.work.yaml",
    "content": "version: v1\ndirectories:\n  - proto\n  - proto_deps\n"
  },
  {
    "path": "_examples/19_retry/federation/federation.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\t_ \"google.golang.org/protobuf/types/known/anypb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype GetPostRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetPostRequest) Reset() {\n\t*x = GetPostRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostRequest) ProtoMessage() {}\n\nfunc (x *GetPostRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostRequest.ProtoReflect.Descriptor instead.\nfunc (*GetPostRequest) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetPostRequest) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\ntype GetPostResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *GetPostResponse) Reset() {\n\t*x = GetPostResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostResponse) ProtoMessage() {}\n\nfunc (x *GetPostResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostResponse.ProtoReflect.Descriptor instead.\nfunc (*GetPostResponse) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{1}\n}\n\ntype Post struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *Post) Reset() {\n\t*x = Post{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Post) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Post) ProtoMessage() {}\n\nfunc (x *Post) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Post.ProtoReflect.Descriptor instead.\nfunc (*Post) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{2}\n}\n\nvar File_federation_federation_proto protoreflect.FileDescriptor\n\nvar file_federation_federation_proto_rawDesc = []byte{\n\t0x0a, 0x1b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x20, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73,\n\t0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x32, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x50,\n\t0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3a, 0x1f, 0x9a, 0x4a, 0x1c,\n\t0x0a, 0x1a, 0x0a, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x6a, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x73, 0x74,\n\t0x12, 0x0a, 0x0a, 0x02, 0x69, 0x64, 0x12, 0x04, 0x24, 0x2e, 0x69, 0x64, 0x22, 0x73, 0x0a, 0x04,\n\t0x50, 0x6f, 0x73, 0x74, 0x3a, 0x6b, 0x9a, 0x4a, 0x68, 0x0a, 0x66, 0x72, 0x64, 0x0a, 0x18, 0x70,\n\t0x6f, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f,\n\t0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x12, 0x0a, 0x0a, 0x02, 0x69, 0x64, 0x12, 0x04, 0x24,\n\t0x2e, 0x69, 0x64, 0x1a, 0x03, 0x31, 0x30, 0x73, 0x22, 0x37, 0x1a, 0x2b, 0x65, 0x72, 0x72, 0x6f,\n\t0x72, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x21, 0x3d, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x2e, 0x55, 0x4e, 0x49, 0x4d, 0x50, 0x4c,\n\t0x45, 0x4d, 0x45, 0x4e, 0x54, 0x45, 0x44, 0x0a, 0x08, 0x0a, 0x04, 0x33, 0x30, 0x6d, 0x73, 0x10,\n\t0x03, 0x32, 0x5e, 0x0a, 0x11, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x44, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73,\n\t0x74, 0x12, 0x1a, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47,\n\t0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f,\n\t0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x1a, 0x03, 0x9a, 0x4a,\n\t0x00, 0x42, 0x9c, 0x01, 0x9a, 0x4a, 0x11, 0x12, 0x0f, 0x70, 0x6f, 0x73, 0x74, 0x2f, 0x70, 0x6f,\n\t0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0f, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x1d, 0x65, 0x78, 0x61,\n\t0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xa2, 0x02, 0x03, 0x46, 0x58, 0x58,\n\t0xaa, 0x02, 0x0a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xca, 0x02, 0x0a,\n\t0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xe2, 0x02, 0x16, 0x46, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64,\n\t0x61, 0x74, 0x61, 0xea, 0x02, 0x0a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_federation_federation_proto_rawDescOnce sync.Once\n\tfile_federation_federation_proto_rawDescData = file_federation_federation_proto_rawDesc\n)\n\nfunc file_federation_federation_proto_rawDescGZIP() []byte {\n\tfile_federation_federation_proto_rawDescOnce.Do(func() {\n\t\tfile_federation_federation_proto_rawDescData = protoimpl.X.CompressGZIP(file_federation_federation_proto_rawDescData)\n\t})\n\treturn file_federation_federation_proto_rawDescData\n}\n\nvar file_federation_federation_proto_msgTypes = make([]protoimpl.MessageInfo, 3)\nvar file_federation_federation_proto_goTypes = []interface{}{\n\t(*GetPostRequest)(nil),  // 0: federation.GetPostRequest\n\t(*GetPostResponse)(nil), // 1: federation.GetPostResponse\n\t(*Post)(nil),            // 2: federation.Post\n}\nvar file_federation_federation_proto_depIdxs = []int32{\n\t0, // 0: federation.FederationService.GetPost:input_type -> federation.GetPostRequest\n\t1, // 1: federation.FederationService.GetPost:output_type -> federation.GetPostResponse\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_federation_federation_proto_init() }\nfunc file_federation_federation_proto_init() {\n\tif File_federation_federation_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_federation_federation_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Post); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_federation_federation_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   3,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_federation_federation_proto_goTypes,\n\t\tDependencyIndexes: file_federation_federation_proto_depIdxs,\n\t\tMessageInfos:      file_federation_federation_proto_msgTypes,\n\t}.Build()\n\tFile_federation_federation_proto = out.File\n\tfile_federation_federation_proto_rawDesc = nil\n\tfile_federation_federation_proto_goTypes = nil\n\tfile_federation_federation_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/19_retry/federation/federation_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tFederationService_GetPost_FullMethodName = \"/federation.FederationService/GetPost\"\n)\n\n// FederationServiceClient is the client API for FederationService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype FederationServiceClient interface {\n\tGetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error)\n}\n\ntype federationServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewFederationServiceClient(cc grpc.ClientConnInterface) FederationServiceClient {\n\treturn &federationServiceClient{cc}\n}\n\nfunc (c *federationServiceClient) GetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error) {\n\tout := new(GetPostResponse)\n\terr := c.cc.Invoke(ctx, FederationService_GetPost_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// FederationServiceServer is the server API for FederationService service.\n// All implementations must embed UnimplementedFederationServiceServer\n// for forward compatibility\ntype FederationServiceServer interface {\n\tGetPost(context.Context, *GetPostRequest) (*GetPostResponse, error)\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\n// UnimplementedFederationServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedFederationServiceServer struct {\n}\n\nfunc (UnimplementedFederationServiceServer) GetPost(context.Context, *GetPostRequest) (*GetPostResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetPost not implemented\")\n}\nfunc (UnimplementedFederationServiceServer) mustEmbedUnimplementedFederationServiceServer() {}\n\n// UnsafeFederationServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to FederationServiceServer will\n// result in compilation errors.\ntype UnsafeFederationServiceServer interface {\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\nfunc RegisterFederationServiceServer(s grpc.ServiceRegistrar, srv FederationServiceServer) {\n\ts.RegisterService(&FederationService_ServiceDesc, srv)\n}\n\nfunc _FederationService_GetPost_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetPostRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(FederationServiceServer).GetPost(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: FederationService_GetPost_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(FederationServiceServer).GetPost(ctx, req.(*GetPostRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// FederationService_ServiceDesc is the grpc.ServiceDesc for FederationService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar FederationService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"federation.FederationService\",\n\tHandlerType: (*FederationServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetPost\",\n\t\t\tHandler:    _FederationService_GetPost_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"federation/federation.proto\",\n}\n"
  },
  {
    "path": "_examples/19_retry/federation/federation_grpc_federation.pb.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: federation/federation.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n\n\tpost \"example/post\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Federation_GetPostResponseVariable represents variable definitions in \"federation.GetPostResponse\".\ntype FederationService_Federation_GetPostResponseVariable struct {\n}\n\n// Federation_GetPostResponseArgument is argument for \"federation.GetPostResponse\" message.\ntype FederationService_Federation_GetPostResponseArgument struct {\n\tId string\n\tFederationService_Federation_GetPostResponseVariable\n}\n\n// Federation_PostVariable represents variable definitions in \"federation.Post\".\ntype FederationService_Federation_PostVariable struct {\n}\n\n// Federation_PostArgument is argument for \"federation.Post\" message.\ntype FederationService_Federation_PostArgument struct {\n\tId string\n\tFederationService_Federation_PostVariable\n}\n\n// FederationServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationServiceConfig struct {\n\t// Client provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\n\t// If this interface is not provided, an error is returned during initialization.\n\tClient FederationServiceClientFactory // required\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationServiceClientFactory interface {\n\t// Post_PostServiceClient create a gRPC Client to be used to call methods in post.PostService.\n\tPost_PostServiceClient(FederationServiceClientConfig) (post.PostServiceClient, error)\n}\n\n// FederationServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationServiceDependentClientSet struct {\n\tPost_PostServiceClient post.PostServiceClient\n}\n\n// FederationServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationServiceResolver interface {\n}\n\n// FederationServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// FederationServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationServiceUnimplementedResolver struct{}\n\nconst (\n\tFederationService_DependentMethod_Post_PostService_GetPost = \"/post.PostService/GetPost\"\n)\n\n// FederationService represents Federation Service.\ntype FederationService struct {\n\tUnimplementedFederationServiceServer\n\tcfg             FederationServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationServiceDependentClientSet\n}\n\n// NewFederationService creates FederationService instance by FederationServiceConfig.\nfunc NewFederationService(cfg FederationServiceConfig) (*FederationService, error) {\n\tif cfg.Client == nil {\n\t\treturn nil, grpcfed.ErrClientConfig\n\t}\n\tPost_PostServiceClient, err := cfg.Client.Post_PostServiceClient(FederationServiceClientConfig{\n\t\tService: \"post.PostService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"federation.FederationService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.federation.GetPostResponseArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.federation.PostArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.GRPCErrorAccessorOptions(celTypeHelper, \"post.GetPostResponse\")...)\n\tsvc := &FederationService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tclient: &FederationServiceDependentClientSet{\n\t\t\tPost_PostServiceClient: Post_PostServiceClient,\n\t\t},\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationService(ctx context.Context, svc *FederationService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n// GetPost implements \"federation.FederationService/GetPost\" method.\nfunc (s *FederationService) GetPost(ctx context.Context, req *GetPostRequest) (res *GetPostResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.FederationService/GetPost\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Federation_GetPostResponse(ctx, &FederationService_Federation_GetPostResponseArgument{\n\t\tId: req.GetId(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Federation_GetPostResponse resolve \"federation.GetPostResponse\" message.\nfunc (s *FederationService) resolve_Federation_GetPostResponse(ctx context.Context, req *FederationService_Federation_GetPostResponseArgument) (*GetPostResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.GetPostResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.GetPostResponse\", slog.Any(\"message_args\", s.logvalue_Federation_GetPostResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tPost *Post\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.federation.GetPostResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"post\"\n\t\t  message {\n\t\t    name: \"Post\"\n\t\t    args { name: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_post := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Post, *localValueType]{\n\t\t\tName: `post`,\n\t\t\tType: grpcfed.CELObjectType(\"federation.Post\"),\n\t\t\tSetter: func(value *localValueType, v *Post) error {\n\t\t\t\tvalue.vars.Post = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Federation_PostArgument{}\n\t\t\t\t// { name: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 1,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Federation_Post(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_post(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// create a message value to be returned.\n\tret := &GetPostResponse{}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.GetPostResponse\", slog.Any(\"federation.GetPostResponse\", s.logvalue_Federation_GetPostResponse(ret)))\n\treturn ret, nil\n}\n\n// resolve_Federation_Post resolve \"federation.Post\" message.\nfunc (s *FederationService) resolve_Federation_Post(ctx context.Context, req *FederationService_Federation_PostArgument) (*Post, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.Post\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.Post\", slog.Any(\"message_args\", s.logvalue_Federation_PostArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tXDef0 *post.GetPostResponse\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.federation.PostArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"_def0\"\n\t\t  call {\n\t\t    method: \"post.PostService/GetPost\"\n\t\t    request { field: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef__def0 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.GetPostResponse, *localValueType]{\n\t\t\tName: `_def0`,\n\t\t\tType: grpcfed.CELObjectType(\"post.GetPostResponse\"),\n\t\t\tSetter: func(value *localValueType, v *post.GetPostResponse) error {\n\t\t\t\tvalue.vars.XDef0 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &post.GetPostRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 2,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call post.PostService/GetPost\", slog.Any(\"post.GetPostRequest\", s.logvalue_Post_GetPostRequest(args)))\n\t\t\t\tret, err := grpcfed.WithTimeout[post.GetPostResponse](ctx, \"post.PostService/GetPost\", 10000000000 /* 10s */, func(ctx context.Context) (*post.GetPostResponse, error) {\n\t\t\t\t\tb := grpcfed.NewConstantBackOff(30000000) /* 30ms */\n\t\t\t\t\tb = grpcfed.BackOffWithMaxRetries(b, 3)\n\t\t\t\t\tb = grpcfed.BackOffWithContext(b, ctx)\n\t\t\t\t\treturn grpcfed.WithRetry(ctx, &grpcfed.RetryParam[post.GetPostResponse]{\n\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\tIf:         `error.code != google.rpc.Code.UNIMPLEMENTED`,\n\t\t\t\t\t\tCacheIndex: 3,\n\t\t\t\t\t\tBackOff:    b,\n\t\t\t\t\t\tBody: func() (*post.GetPostResponse, error) {\n\t\t\t\t\t\t\treturn s.client.Post_PostServiceClient.GetPost(ctx, args)\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Post_PostService_GetPost, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def__def0(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// create a message value to be returned.\n\tret := &Post{}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.Post\", slog.Any(\"federation.Post\", s.logvalue_Federation_Post(ret)))\n\treturn ret, nil\n}\n\nfunc (s *FederationService) logvalue_Federation_GetPostResponse(v *GetPostResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Federation_GetPostResponseArgument(v *FederationService_Federation_GetPostResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Federation_Post(v *Post) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Federation_PostArgument(v *FederationService_Federation_PostArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Post_GetPostRequest(v *post.GetPostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Post_GetPostsRequest(v *post.GetPostsRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.GetIds()),\n\t)\n}\n"
  },
  {
    "path": "_examples/19_retry/go.mod",
    "content": "module example\n\ngo 1.24.0\n\nreplace github.com/mercari/grpc-federation => ../../\n\nrequire (\n\tgithub.com/mercari/grpc-federation v0.0.0-00010101000000-000000000000\n\tgo.opentelemetry.io/otel v1.24.0\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0\n\tgo.opentelemetry.io/otel/sdk v1.24.0\n\tgo.opentelemetry.io/otel/trace v1.24.0\n\tgo.uber.org/goleak v1.3.0\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7\n\tgoogle.golang.org/grpc v1.65.0\n\tgoogle.golang.org/protobuf v1.34.2\n)\n\nrequire (\n\tcel.dev/expr v0.19.1 // indirect\n\tgithub.com/antlr4-go/antlr/v4 v4.13.0 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.2.1 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/goccy/wasi-go v0.3.2 // indirect\n\tgithub.com/google/cel-go v0.23.1 // indirect\n\tgithub.com/google/uuid v1.6.0 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect\n\tgithub.com/kelseyhightower/envconfig v1.4.0 // indirect\n\tgithub.com/stealthrocket/wazergo v0.19.1 // indirect\n\tgithub.com/stoewer/go-strcase v1.3.0 // indirect\n\tgithub.com/tetratelabs/wazero v1.10.1 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.24.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.0.0 // indirect\n\tgolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect\n\tgolang.org/x/net v0.38.0 // indirect\n\tgolang.org/x/sync v0.14.0 // indirect\n\tgolang.org/x/sys v0.37.0 // indirect\n\tgolang.org/x/text v0.23.0 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 // indirect\n)\n"
  },
  {
    "path": "_examples/19_retry/go.sum",
    "content": "cel.dev/expr v0.19.1 h1:NciYrtDRIR0lNCnH1LFJegdjspNx9fI59O7TWcua/W4=\ncel.dev/expr v0.19.1/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw=\ngithub.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=\ngithub.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/goccy/wasi-go v0.3.2 h1:wAvGXmqCkfcp0B0AwIp5Ya53hzDwkKm9W8iuT3nCCz0=\ngithub.com/goccy/wasi-go v0.3.2/go.mod h1:nIKD204n9xa4Z20UV+XA483kIr9TAl2vXr+X5qVAO5M=\ngithub.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4=\ngithub.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=\ngithub.com/google/cel-go v0.23.1 h1:91ThhEZlBcE5rB2adBVXqvDoqdL8BG2oyhd0bK1I/r4=\ngithub.com/google/cel-go v0.23.1/go.mod h1:52Pb6QsDbC5kvgxvZhiL9QX1oZEkcUF/ZqaPx1J5Wwo=\ngithub.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\ngithub.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg=\ngithub.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=\ngithub.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/stealthrocket/wazergo v0.19.1 h1:BPrITETPgSFwiytwmToO0MbUC/+RGC39JScz1JmmG6c=\ngithub.com/stealthrocket/wazergo v0.19.1/go.mod h1:riI0hxw4ndZA5e6z7PesHg2BtTftcZaMxRcoiGGipTs=\ngithub.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs=\ngithub.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tetratelabs/wazero v1.10.1 h1:2DugeJf6VVk58KTPszlNfeeN8AhhpwcZqkJj2wwFuH8=\ngithub.com/tetratelabs/wazero v1.10.1/go.mod h1:DRm5twOQ5Gr1AoEdSi0CLjDQF1J9ZAuyqFIjl1KKfQU=\ngo.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo=\ngo.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0=\ngo.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI=\ngo.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=\ngo.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw=\ngo.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg=\ngo.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=\ngo.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=\ngo.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=\ngo.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=\ngolang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=\ngolang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=\ngolang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=\ngolang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=\ngolang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=\ngolang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=\ngolang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 h1:YcyjlL1PRr2Q17/I0dPk2JmYS5CDXfcdb2Z3YRioEbw=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7 h1:2035KHhUv+EpyB+hWgJnaWKJOdX1E95w2S8Rr4uWKTs=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=\ngoogle.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=\ngoogle.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=\ngoogle.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=\ngoogle.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "_examples/19_retry/main_test.go",
    "content": "package main_test\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"net\"\n\t\"os\"\n\t\"testing\"\n\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\"\n\t\"go.opentelemetry.io/otel/propagation\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\tsdktrace \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.4.0\"\n\t\"go.uber.org/goleak\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/codes\"\n\t\"google.golang.org/grpc/credentials/insecure\"\n\t\"google.golang.org/grpc/status\"\n\t\"google.golang.org/grpc/test/bufconn\"\n\n\t\"example/federation\"\n\t\"example/post\"\n)\n\nconst bufSize = 1024\n\nvar (\n\tlistener   *bufconn.Listener\n\tpostClient post.PostServiceClient\n)\n\ntype clientConfig struct{}\n\nfunc (c *clientConfig) Post_PostServiceClient(cfg federation.FederationServiceClientConfig) (post.PostServiceClient, error) {\n\treturn postClient, nil\n}\n\ntype PostServer struct {\n\t*post.UnimplementedPostServiceServer\n}\n\nvar (\n\tgetPostErr  error\n\tcalledCount int\n)\n\nfunc (s *PostServer) GetPost(ctx context.Context, req *post.GetPostRequest) (*post.GetPostResponse, error) {\n\tcalledCount++\n\treturn nil, getPostErr\n}\n\nfunc (s *PostServer) GetPosts(ctx context.Context, req *post.GetPostsRequest) (*post.GetPostsResponse, error) {\n\tvar posts []*post.Post\n\tfor _, id := range req.Ids {\n\t\tposts = append(posts, &post.Post{\n\t\t\tId:      id,\n\t\t\tTitle:   \"foo\",\n\t\t\tContent: \"bar\",\n\t\t\tUserId:  fmt.Sprintf(\"user:%s\", id),\n\t\t})\n\t}\n\treturn &post.GetPostsResponse{Posts: posts}, nil\n}\nfunc dialer(ctx context.Context, address string) (net.Conn, error) {\n\treturn listener.Dial()\n}\n\nfunc TestFederation(t *testing.T) {\n\tdefer goleak.VerifyNone(t)\n\tctx := context.Background()\n\tlistener = bufconn.Listen(bufSize)\n\n\tif os.Getenv(\"ENABLE_JAEGER\") != \"\" {\n\t\texporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithInsecure())\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttp := sdktrace.NewTracerProvider(\n\t\t\tsdktrace.WithBatcher(exporter),\n\t\t\tsdktrace.WithResource(\n\t\t\t\tresource.NewWithAttributes(\n\t\t\t\t\tsemconv.SchemaURL,\n\t\t\t\t\tsemconv.ServiceNameKey.String(\"example19/retry\"),\n\t\t\t\t\tsemconv.ServiceVersionKey.String(\"1.0.0\"),\n\t\t\t\t\tattribute.String(\"environment\", \"dev\"),\n\t\t\t\t),\n\t\t\t),\n\t\t\tsdktrace.WithSampler(sdktrace.AlwaysSample()),\n\t\t)\n\t\tdefer tp.Shutdown(ctx)\n\t\totel.SetTextMapPropagator(propagation.TraceContext{})\n\t\totel.SetTracerProvider(tp)\n\t}\n\n\tconn, err := grpc.DialContext(\n\t\tctx, \"\",\n\t\tgrpc.WithContextDialer(dialer),\n\t\tgrpc.WithTransportCredentials(insecure.NewCredentials()),\n\t)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer conn.Close()\n\n\tpostClient = post.NewPostServiceClient(conn)\n\n\tgrpcServer := grpc.NewServer()\n\tdefer grpcServer.Stop()\n\n\tlogger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{\n\t\tLevel: slog.LevelDebug,\n\t}))\n\tfederationServer, err := federation.NewFederationService(federation.FederationServiceConfig{\n\t\tClient: new(clientConfig),\n\t\tLogger: logger,\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer federation.CleanupFederationService(ctx, federationServer)\n\n\tpost.RegisterPostServiceServer(grpcServer, &PostServer{})\n\tfederation.RegisterFederationServiceServer(grpcServer, federationServer)\n\n\tgo func() {\n\t\tif err := grpcServer.Serve(listener); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t}()\n\n\tclient := federation.NewFederationServiceClient(conn)\n\n\tgetPostErr = status.New(codes.Unimplemented, \"unimplemented get post\").Err()\n\tif _, err := client.GetPost(ctx, &federation.GetPostRequest{Id: \"foo\"}); err != nil {\n\t\tt.Logf(\"err: %v\", err)\n\t} else {\n\t\tt.Fatal(\"expected error\")\n\t}\n\tif calledCount != 1 {\n\t\tt.Fatalf(\"failed to retry count. expected 1 but got %d\", calledCount)\n\t}\n\n\tcalledCount = 0\n\tgetPostErr = status.New(codes.Unavailable, \"unavailable get post\").Err()\n\tif _, err := client.GetPost(ctx, &federation.GetPostRequest{Id: \"foo\"}); err != nil {\n\t\tt.Logf(\"err: %v\", err)\n\t} else {\n\t\tt.Fatal(\"expected error\")\n\t}\n\n\tif calledCount != 4 {\n\t\tt.Fatalf(\"failed to retry count. expected 4 but got %d\", calledCount)\n\t}\n}\n"
  },
  {
    "path": "_examples/19_retry/post/post.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: post/post.proto\n\npackage post\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype GetPostRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetPostRequest) Reset() {\n\t*x = GetPostRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostRequest) ProtoMessage() {}\n\nfunc (x *GetPostRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostRequest.ProtoReflect.Descriptor instead.\nfunc (*GetPostRequest) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetPostRequest) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\ntype GetPostResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPost *Post `protobuf:\"bytes,1,opt,name=post,proto3\" json:\"post,omitempty\"`\n}\n\nfunc (x *GetPostResponse) Reset() {\n\t*x = GetPostResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostResponse) ProtoMessage() {}\n\nfunc (x *GetPostResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostResponse.ProtoReflect.Descriptor instead.\nfunc (*GetPostResponse) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetPostResponse) GetPost() *Post {\n\tif x != nil {\n\t\treturn x.Post\n\t}\n\treturn nil\n}\n\ntype GetPostsRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tIds []string `protobuf:\"bytes,1,rep,name=ids,proto3\" json:\"ids,omitempty\"`\n}\n\nfunc (x *GetPostsRequest) Reset() {\n\t*x = GetPostsRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostsRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostsRequest) ProtoMessage() {}\n\nfunc (x *GetPostsRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostsRequest.ProtoReflect.Descriptor instead.\nfunc (*GetPostsRequest) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *GetPostsRequest) GetIds() []string {\n\tif x != nil {\n\t\treturn x.Ids\n\t}\n\treturn nil\n}\n\ntype GetPostsResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPosts []*Post `protobuf:\"bytes,1,rep,name=posts,proto3\" json:\"posts,omitempty\"`\n}\n\nfunc (x *GetPostsResponse) Reset() {\n\t*x = GetPostsResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostsResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostsResponse) ProtoMessage() {}\n\nfunc (x *GetPostsResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostsResponse.ProtoReflect.Descriptor instead.\nfunc (*GetPostsResponse) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *GetPostsResponse) GetPosts() []*Post {\n\tif x != nil {\n\t\treturn x.Posts\n\t}\n\treturn nil\n}\n\ntype Post struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId      string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tTitle   string `protobuf:\"bytes,2,opt,name=title,proto3\" json:\"title,omitempty\"`\n\tContent string `protobuf:\"bytes,3,opt,name=content,proto3\" json:\"content,omitempty\"`\n\tUserId  string `protobuf:\"bytes,4,opt,name=user_id,json=userId,proto3\" json:\"user_id,omitempty\"`\n}\n\nfunc (x *Post) Reset() {\n\t*x = Post{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Post) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Post) ProtoMessage() {}\n\nfunc (x *Post) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Post.ProtoReflect.Descriptor instead.\nfunc (*Post) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *Post) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetTitle() string {\n\tif x != nil {\n\t\treturn x.Title\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetContent() string {\n\tif x != nil {\n\t\treturn x.Content\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetUserId() string {\n\tif x != nil {\n\t\treturn x.UserId\n\t}\n\treturn \"\"\n}\n\nvar File_post_post_proto protoreflect.FileDescriptor\n\nvar file_post_post_proto_rawDesc = []byte{\n\t0x0a, 0x0f, 0x70, 0x6f, 0x73, 0x74, 0x2f, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x20, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x6f,\n\t0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x31, 0x0a, 0x0f, 0x47, 0x65, 0x74,\n\t0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x04,\n\t0x70, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x6f, 0x73,\n\t0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x23, 0x0a, 0x0f,\n\t0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,\n\t0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64,\n\t0x73, 0x22, 0x34, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65, 0x73,\n\t0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x05, 0x70, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74,\n\t0x52, 0x05, 0x70, 0x6f, 0x73, 0x74, 0x73, 0x22, 0x5f, 0x0a, 0x04, 0x50, 0x6f, 0x73, 0x74, 0x12,\n\t0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12,\n\t0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,\n\t0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12,\n\t0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x32, 0x84, 0x01, 0x0a, 0x0b, 0x50, 0x6f, 0x73,\n\t0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x38, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x50,\n\t0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f,\n\t0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x70, 0x6f, 0x73, 0x74,\n\t0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x22, 0x00, 0x12, 0x3b, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x15,\n\t0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65,\n\t0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x47, 0x65, 0x74,\n\t0x50, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42,\n\t0x58, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x42, 0x09, 0x50, 0x6f, 0x73,\n\t0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x11, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c,\n\t0x65, 0x2f, 0x70, 0x6f, 0x73, 0x74, 0x3b, 0x70, 0x6f, 0x73, 0x74, 0xa2, 0x02, 0x03, 0x50, 0x58,\n\t0x58, 0xaa, 0x02, 0x04, 0x50, 0x6f, 0x73, 0x74, 0xca, 0x02, 0x04, 0x50, 0x6f, 0x73, 0x74, 0xe2,\n\t0x02, 0x10, 0x50, 0x6f, 0x73, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61,\n\t0x74, 0x61, 0xea, 0x02, 0x04, 0x50, 0x6f, 0x73, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x33,\n}\n\nvar (\n\tfile_post_post_proto_rawDescOnce sync.Once\n\tfile_post_post_proto_rawDescData = file_post_post_proto_rawDesc\n)\n\nfunc file_post_post_proto_rawDescGZIP() []byte {\n\tfile_post_post_proto_rawDescOnce.Do(func() {\n\t\tfile_post_post_proto_rawDescData = protoimpl.X.CompressGZIP(file_post_post_proto_rawDescData)\n\t})\n\treturn file_post_post_proto_rawDescData\n}\n\nvar file_post_post_proto_msgTypes = make([]protoimpl.MessageInfo, 5)\nvar file_post_post_proto_goTypes = []interface{}{\n\t(*GetPostRequest)(nil),   // 0: post.GetPostRequest\n\t(*GetPostResponse)(nil),  // 1: post.GetPostResponse\n\t(*GetPostsRequest)(nil),  // 2: post.GetPostsRequest\n\t(*GetPostsResponse)(nil), // 3: post.GetPostsResponse\n\t(*Post)(nil),             // 4: post.Post\n}\nvar file_post_post_proto_depIdxs = []int32{\n\t4, // 0: post.GetPostResponse.post:type_name -> post.Post\n\t4, // 1: post.GetPostsResponse.posts:type_name -> post.Post\n\t0, // 2: post.PostService.GetPost:input_type -> post.GetPostRequest\n\t2, // 3: post.PostService.GetPosts:input_type -> post.GetPostsRequest\n\t1, // 4: post.PostService.GetPost:output_type -> post.GetPostResponse\n\t3, // 5: post.PostService.GetPosts:output_type -> post.GetPostsResponse\n\t4, // [4:6] is the sub-list for method output_type\n\t2, // [2:4] is the sub-list for method input_type\n\t2, // [2:2] is the sub-list for extension type_name\n\t2, // [2:2] is the sub-list for extension extendee\n\t0, // [0:2] is the sub-list for field type_name\n}\n\nfunc init() { file_post_post_proto_init() }\nfunc file_post_post_proto_init() {\n\tif File_post_post_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_post_post_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostsRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostsResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Post); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_post_post_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   5,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_post_post_proto_goTypes,\n\t\tDependencyIndexes: file_post_post_proto_depIdxs,\n\t\tMessageInfos:      file_post_post_proto_msgTypes,\n\t}.Build()\n\tFile_post_post_proto = out.File\n\tfile_post_post_proto_rawDesc = nil\n\tfile_post_post_proto_goTypes = nil\n\tfile_post_post_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/19_retry/post/post_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: post/post.proto\n\npackage post\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tPostService_GetPost_FullMethodName  = \"/post.PostService/GetPost\"\n\tPostService_GetPosts_FullMethodName = \"/post.PostService/GetPosts\"\n)\n\n// PostServiceClient is the client API for PostService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype PostServiceClient interface {\n\tGetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error)\n\tGetPosts(ctx context.Context, in *GetPostsRequest, opts ...grpc.CallOption) (*GetPostsResponse, error)\n}\n\ntype postServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewPostServiceClient(cc grpc.ClientConnInterface) PostServiceClient {\n\treturn &postServiceClient{cc}\n}\n\nfunc (c *postServiceClient) GetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error) {\n\tout := new(GetPostResponse)\n\terr := c.cc.Invoke(ctx, PostService_GetPost_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *postServiceClient) GetPosts(ctx context.Context, in *GetPostsRequest, opts ...grpc.CallOption) (*GetPostsResponse, error) {\n\tout := new(GetPostsResponse)\n\terr := c.cc.Invoke(ctx, PostService_GetPosts_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// PostServiceServer is the server API for PostService service.\n// All implementations must embed UnimplementedPostServiceServer\n// for forward compatibility\ntype PostServiceServer interface {\n\tGetPost(context.Context, *GetPostRequest) (*GetPostResponse, error)\n\tGetPosts(context.Context, *GetPostsRequest) (*GetPostsResponse, error)\n\tmustEmbedUnimplementedPostServiceServer()\n}\n\n// UnimplementedPostServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedPostServiceServer struct {\n}\n\nfunc (UnimplementedPostServiceServer) GetPost(context.Context, *GetPostRequest) (*GetPostResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetPost not implemented\")\n}\nfunc (UnimplementedPostServiceServer) GetPosts(context.Context, *GetPostsRequest) (*GetPostsResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetPosts not implemented\")\n}\nfunc (UnimplementedPostServiceServer) mustEmbedUnimplementedPostServiceServer() {}\n\n// UnsafePostServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to PostServiceServer will\n// result in compilation errors.\ntype UnsafePostServiceServer interface {\n\tmustEmbedUnimplementedPostServiceServer()\n}\n\nfunc RegisterPostServiceServer(s grpc.ServiceRegistrar, srv PostServiceServer) {\n\ts.RegisterService(&PostService_ServiceDesc, srv)\n}\n\nfunc _PostService_GetPost_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetPostRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(PostServiceServer).GetPost(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: PostService_GetPost_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(PostServiceServer).GetPost(ctx, req.(*GetPostRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _PostService_GetPosts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetPostsRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(PostServiceServer).GetPosts(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: PostService_GetPosts_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(PostServiceServer).GetPosts(ctx, req.(*GetPostsRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// PostService_ServiceDesc is the grpc.ServiceDesc for PostService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar PostService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"post.PostService\",\n\tHandlerType: (*PostServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetPost\",\n\t\t\tHandler:    _PostService_GetPost_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetPosts\",\n\t\t\tHandler:    _PostService_GetPosts_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"post/post.proto\",\n}\n"
  },
  {
    "path": "_examples/19_retry/proto/buf.yaml",
    "content": "version: v1\nbreaking:\n  use:\n    - FILE\nlint:\n  use:\n    - DEFAULT\n"
  },
  {
    "path": "_examples/19_retry/proto/federation/federation.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"google/protobuf/any.proto\";\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\noption (grpc.federation.file)= {\n  import: [\"post/post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (.grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def {\n      call {\n        method: \"post.PostService/GetPost\"\n        request { field: \"id\", by: \"$.id\" }      \n        timeout: \"10s\"\n        retry {\n          if: \"error.code != google.rpc.Code.UNIMPLEMENTED\"\n          constant {\n            interval: \"30ms\"\n            max_retries: 3\n          }\n        }\n      }\n    }\n  };\n}"
  },
  {
    "path": "_examples/19_retry/proto/post/post.proto",
    "content": "syntax = \"proto3\";\n\npackage post;\n\noption go_package = \"example/post;post\";\n\nservice PostService {\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n  rpc GetPosts(GetPostsRequest) returns (GetPostsResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  Post post = 1;\n}\n\nmessage GetPostsRequest {\n  repeated string ids = 1;\n}\n\nmessage GetPostsResponse {\n  repeated Post posts = 1;\n}\n\nmessage Post {\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  string user_id = 4;\n}\n"
  },
  {
    "path": "_examples/20_callopt/.gitignore",
    "content": "grpc/federation\n"
  },
  {
    "path": "_examples/20_callopt/Makefile",
    "content": "MAKEFILE_DIR := $(dir $(lastword $(MAKEFILE_LIST)))\nGOBIN := $(MAKEFILE_DIR)/../../bin\nPATH := $(GOBIN):$(PATH)\n\nJAEGER_IMAGE := jaegertracing/all-in-one:latest\n\n.PHONY: generate\ngenerate:\n\t$(GOBIN)/buf generate\n\n.PHONY: lint\nlint:\n\t@$(GOBIN)/grpc-federation-linter -Iproto -Iproto_deps ./proto/federation/federation.proto\n\n.PHONY: test\ntest:\n\tgo test -race ./ -count=1\n\n.PHONY: grpc-federation/generate\ngrpc-federation/generate:\n\t@$(GOBIN)/grpc-federation-generator ./proto/federation/federation.proto\n\n.PHONY: grpc-federation/watch\ngrpc-federation/watch:\n\t@$(GOBIN)/grpc-federation-generator -w\n\n.PHONY: jaeger/start\njaeger/start:\n\t@docker run \\\n\t\t-e COLLECTOR_OTLP_ENABLED=true \\\n\t\t-p 16686:16686 \\\n\t\t-p 4317:4317 \\\n\t\t-p 4318:4318 \\\n\t\t-d \\\n\t\t$(JAEGER_IMAGE)\n\n.PHONY: jaeger/stop\njaeger/stop:\n\t@docker stop $(shell docker ps -q  --filter ancestor=$(JAEGER_IMAGE))\n"
  },
  {
    "path": "_examples/20_callopt/buf.gen.yaml",
    "content": "version: v1\nmanaged:\n  enabled: true\nplugins:\n  - plugin: go\n    out: .\n    opt: paths=source_relative\n  - plugin: go-grpc\n    out: .\n    opt: paths=source_relative\n  - plugin: grpc-federation\n    out: .\n    opt:\n    - paths=source_relative\n    - import_paths=proto\n"
  },
  {
    "path": "_examples/20_callopt/buf.work.yaml",
    "content": "version: v1\ndirectories:\n  - proto\n  - proto_deps\n"
  },
  {
    "path": "_examples/20_callopt/federation/federation.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\t_ \"google.golang.org/protobuf/types/descriptorpb\"\n\t_ \"google.golang.org/protobuf/types/known/emptypb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype GetPostRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetPostRequest) Reset() {\n\t*x = GetPostRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostRequest) ProtoMessage() {}\n\nfunc (x *GetPostRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostRequest.ProtoReflect.Descriptor instead.\nfunc (*GetPostRequest) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetPostRequest) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\ntype GetPostResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tHeader  []string `protobuf:\"bytes,1,rep,name=header,proto3\" json:\"header,omitempty\"`\n\tTrailer []string `protobuf:\"bytes,2,rep,name=trailer,proto3\" json:\"trailer,omitempty\"`\n}\n\nfunc (x *GetPostResponse) Reset() {\n\t*x = GetPostResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostResponse) ProtoMessage() {}\n\nfunc (x *GetPostResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostResponse.ProtoReflect.Descriptor instead.\nfunc (*GetPostResponse) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetPostResponse) GetHeader() []string {\n\tif x != nil {\n\t\treturn x.Header\n\t}\n\treturn nil\n}\n\nfunc (x *GetPostResponse) GetTrailer() []string {\n\tif x != nil {\n\t\treturn x.Trailer\n\t}\n\treturn nil\n}\n\nvar File_federation_federation_proto protoreflect.FileDescriptor\n\nvar file_federation_federation_proto_rawDesc = []byte{\n\t0x0a, 0x1b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x20, 0x67, 0x72, 0x70, 0x63, 0x2f,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73,\n\t0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65,\n\t0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x20, 0x0a, 0x0e, 0x47, 0x65,\n\t0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02,\n\t0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x99, 0x03, 0x0a,\n\t0x0f, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x12, 0x33, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09,\n\t0x42, 0x1b, 0x9a, 0x4a, 0x18, 0x12, 0x16, 0x68, 0x64, 0x72, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e,\n\t0x73, 0x6f, 0x72, 0x74, 0x41, 0x73, 0x63, 0x28, 0x76, 0x2c, 0x20, 0x76, 0x29, 0x52, 0x06, 0x68,\n\t0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x35, 0x0a, 0x07, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72,\n\t0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x1b, 0x9a, 0x4a, 0x18, 0x12, 0x16, 0x74, 0x6c, 0x72,\n\t0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x41, 0x73, 0x63, 0x28, 0x76, 0x2c,\n\t0x20, 0x76, 0x29, 0x52, 0x07, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x3a, 0x99, 0x02, 0x9a,\n\t0x4a, 0x95, 0x02, 0x0a, 0x25, 0x0a, 0x03, 0x68, 0x64, 0x72, 0x5a, 0x1e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6d, 0x65, 0x74, 0x61,\n\t0x64, 0x61, 0x74, 0x61, 0x2e, 0x6e, 0x65, 0x77, 0x28, 0x29, 0x0a, 0x25, 0x0a, 0x03, 0x74, 0x6c,\n\t0x72, 0x5a, 0x1e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6e, 0x65, 0x77, 0x28,\n\t0x29, 0x0a, 0x27, 0x0a, 0x02, 0x6d, 0x64, 0x5a, 0x21, 0x7b, 0x27, 0x61, 0x75, 0x74, 0x68, 0x6f,\n\t0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x3a, 0x20, 0x5b, 0x27, 0x42, 0x65, 0x61,\n\t0x72, 0x65, 0x72, 0x20, 0x78, 0x78, 0x78, 0x27, 0x5d, 0x7d, 0x0a, 0x4c, 0x0a, 0x03, 0x72, 0x65,\n\t0x73, 0x72, 0x45, 0x0a, 0x18, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x65,\n\t0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x12, 0x0a, 0x0a,\n\t0x02, 0x69, 0x64, 0x12, 0x04, 0x24, 0x2e, 0x69, 0x64, 0x2a, 0x05, 0x0a, 0x03, 0x5a, 0x01, 0x31,\n\t0x32, 0x12, 0x12, 0x03, 0x68, 0x64, 0x72, 0x18, 0x64, 0x20, 0x64, 0x28, 0x01, 0x32, 0x03, 0x74,\n\t0x6c, 0x72, 0x38, 0x01, 0x3a, 0x02, 0x6d, 0x64, 0x0a, 0x26, 0x0a, 0x08, 0x68, 0x64, 0x72, 0x5f,\n\t0x6b, 0x65, 0x79, 0x73, 0x12, 0x0b, 0x72, 0x65, 0x73, 0x20, 0x21, 0x3d, 0x20, 0x6e, 0x75, 0x6c,\n\t0x6c, 0x5a, 0x0d, 0x68, 0x64, 0x72, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6b, 0x2c, 0x20, 0x6b, 0x29,\n\t0x0a, 0x26, 0x0a, 0x08, 0x74, 0x6c, 0x72, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x0b, 0x72, 0x65,\n\t0x73, 0x20, 0x21, 0x3d, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x5a, 0x0d, 0x74, 0x6c, 0x72, 0x2e, 0x6d,\n\t0x61, 0x70, 0x28, 0x6b, 0x2c, 0x20, 0x6b, 0x29, 0x32, 0x5e, 0x0a, 0x11, 0x46, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x44, 0x0a,\n\t0x07, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x12, 0x1a, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,\n\t0x65, 0x22, 0x00, 0x1a, 0x03, 0x9a, 0x4a, 0x00, 0x42, 0x9c, 0x01, 0x9a, 0x4a, 0x11, 0x12, 0x0f,\n\t0x70, 0x6f, 0x73, 0x74, 0x2f, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x0a,\n\t0x0e, 0x63, 0x6f, 0x6d, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42,\n\t0x0f, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f,\n\t0x50, 0x01, 0x5a, 0x1d, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0xa2, 0x02, 0x03, 0x46, 0x58, 0x58, 0xaa, 0x02, 0x0a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0xca, 0x02, 0x0a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0xe2, 0x02, 0x16, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x47,\n\t0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0a, 0x46, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_federation_federation_proto_rawDescOnce sync.Once\n\tfile_federation_federation_proto_rawDescData = file_federation_federation_proto_rawDesc\n)\n\nfunc file_federation_federation_proto_rawDescGZIP() []byte {\n\tfile_federation_federation_proto_rawDescOnce.Do(func() {\n\t\tfile_federation_federation_proto_rawDescData = protoimpl.X.CompressGZIP(file_federation_federation_proto_rawDescData)\n\t})\n\treturn file_federation_federation_proto_rawDescData\n}\n\nvar file_federation_federation_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_federation_federation_proto_goTypes = []interface{}{\n\t(*GetPostRequest)(nil),  // 0: federation.GetPostRequest\n\t(*GetPostResponse)(nil), // 1: federation.GetPostResponse\n}\nvar file_federation_federation_proto_depIdxs = []int32{\n\t0, // 0: federation.FederationService.GetPost:input_type -> federation.GetPostRequest\n\t1, // 1: federation.FederationService.GetPost:output_type -> federation.GetPostResponse\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_federation_federation_proto_init() }\nfunc file_federation_federation_proto_init() {\n\tif File_federation_federation_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_federation_federation_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_federation_federation_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_federation_federation_proto_goTypes,\n\t\tDependencyIndexes: file_federation_federation_proto_depIdxs,\n\t\tMessageInfos:      file_federation_federation_proto_msgTypes,\n\t}.Build()\n\tFile_federation_federation_proto = out.File\n\tfile_federation_federation_proto_rawDesc = nil\n\tfile_federation_federation_proto_goTypes = nil\n\tfile_federation_federation_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/20_callopt/federation/federation_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tFederationService_GetPost_FullMethodName = \"/federation.FederationService/GetPost\"\n)\n\n// FederationServiceClient is the client API for FederationService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype FederationServiceClient interface {\n\tGetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error)\n}\n\ntype federationServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewFederationServiceClient(cc grpc.ClientConnInterface) FederationServiceClient {\n\treturn &federationServiceClient{cc}\n}\n\nfunc (c *federationServiceClient) GetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error) {\n\tout := new(GetPostResponse)\n\terr := c.cc.Invoke(ctx, FederationService_GetPost_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// FederationServiceServer is the server API for FederationService service.\n// All implementations must embed UnimplementedFederationServiceServer\n// for forward compatibility\ntype FederationServiceServer interface {\n\tGetPost(context.Context, *GetPostRequest) (*GetPostResponse, error)\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\n// UnimplementedFederationServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedFederationServiceServer struct {\n}\n\nfunc (UnimplementedFederationServiceServer) GetPost(context.Context, *GetPostRequest) (*GetPostResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetPost not implemented\")\n}\nfunc (UnimplementedFederationServiceServer) mustEmbedUnimplementedFederationServiceServer() {}\n\n// UnsafeFederationServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to FederationServiceServer will\n// result in compilation errors.\ntype UnsafeFederationServiceServer interface {\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\nfunc RegisterFederationServiceServer(s grpc.ServiceRegistrar, srv FederationServiceServer) {\n\ts.RegisterService(&FederationService_ServiceDesc, srv)\n}\n\nfunc _FederationService_GetPost_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetPostRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(FederationServiceServer).GetPost(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: FederationService_GetPost_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(FederationServiceServer).GetPost(ctx, req.(*GetPostRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// FederationService_ServiceDesc is the grpc.ServiceDesc for FederationService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar FederationService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"federation.FederationService\",\n\tHandlerType: (*FederationServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetPost\",\n\t\t\tHandler:    _FederationService_GetPost_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"federation/federation.proto\",\n}\n"
  },
  {
    "path": "_examples/20_callopt/federation/federation_grpc_federation.pb.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: federation/federation.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n\n\tpost \"example/post\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Federation_GetPostResponseVariable represents variable definitions in \"federation.GetPostResponse\".\ntype FederationService_Federation_GetPostResponseVariable struct {\n\tHdr     map[string][]string\n\tHdrKeys []string\n\tMd      map[string][]string\n\tRes     *post.GetPostResponse\n\tTlr     map[string][]string\n\tTlrKeys []string\n}\n\n// Federation_GetPostResponseArgument is argument for \"federation.GetPostResponse\" message.\ntype FederationService_Federation_GetPostResponseArgument struct {\n\tId string\n\tFederationService_Federation_GetPostResponseVariable\n}\n\n// FederationServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationServiceConfig struct {\n\t// Client provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\n\t// If this interface is not provided, an error is returned during initialization.\n\tClient FederationServiceClientFactory // required\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationServiceClientFactory interface {\n\t// Post_PostServiceClient create a gRPC Client to be used to call methods in post.PostService.\n\tPost_PostServiceClient(FederationServiceClientConfig) (post.PostServiceClient, error)\n}\n\n// FederationServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationServiceDependentClientSet struct {\n\tPost_PostServiceClient post.PostServiceClient\n}\n\n// FederationServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationServiceResolver interface {\n}\n\n// FederationServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// FederationServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationServiceUnimplementedResolver struct{}\n\nconst (\n\tFederationService_DependentMethod_Post_PostService_GetPost = \"/post.PostService/GetPost\"\n)\n\n// FederationService represents Federation Service.\ntype FederationService struct {\n\tUnimplementedFederationServiceServer\n\tcfg             FederationServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationServiceDependentClientSet\n}\n\n// NewFederationService creates FederationService instance by FederationServiceConfig.\nfunc NewFederationService(cfg FederationServiceConfig) (*FederationService, error) {\n\tif cfg.Client == nil {\n\t\treturn nil, grpcfed.ErrClientConfig\n\t}\n\tPost_PostServiceClient, err := cfg.Client.Post_PostServiceClient(FederationServiceClientConfig{\n\t\tService: \"post.PostService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"federation.FederationService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.federation.GetPostResponseArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.GRPCErrorAccessorOptions(celTypeHelper, \"post.GetPostResponse\")...)\n\tsvc := &FederationService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tclient: &FederationServiceDependentClientSet{\n\t\t\tPost_PostServiceClient: Post_PostServiceClient,\n\t\t},\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationService(ctx context.Context, svc *FederationService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n// GetPost implements \"federation.FederationService/GetPost\" method.\nfunc (s *FederationService) GetPost(ctx context.Context, req *GetPostRequest) (res *GetPostResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.FederationService/GetPost\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Federation_GetPostResponse(ctx, &FederationService_Federation_GetPostResponseArgument{\n\t\tId: req.GetId(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Federation_GetPostResponse resolve \"federation.GetPostResponse\" message.\nfunc (s *FederationService) resolve_Federation_GetPostResponse(ctx context.Context, req *FederationService_Federation_GetPostResponseArgument) (*GetPostResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"federation.GetPostResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve federation.GetPostResponse\", slog.Any(\"message_args\", s.logvalue_Federation_GetPostResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tHdr       map[string][]string\n\t\t\tHdrKeys   []string\n\t\t\tMd        map[string][]string\n\t\t\tRes       *post.GetPostResponse\n\t\t\tTlr       map[string][]string\n\t\t\tTlrKeys   []string\n\t\t\tXDef3Def0 int64\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.federation.GetPostResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"hdr\"\n\t\t  by: \"grpc.federation.metadata.new()\"\n\t\t}\n\t*/\n\tdef_hdr := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[map[string][]string, *localValueType]{\n\t\t\tName: `hdr`,\n\t\t\tType: grpcfed.NewCELMapType(grpcfed.CELStringType, grpcfed.CELListType(grpcfed.CELStringType)),\n\t\t\tSetter: func(value *localValueType, v map[string][]string) error {\n\t\t\t\tvalue.vars.Hdr = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `grpc.federation.metadata.new()`,\n\t\t\tByCacheIndex: 1,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"tlr\"\n\t\t  by: \"grpc.federation.metadata.new()\"\n\t\t}\n\t*/\n\tdef_tlr := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[map[string][]string, *localValueType]{\n\t\t\tName: `tlr`,\n\t\t\tType: grpcfed.NewCELMapType(grpcfed.CELStringType, grpcfed.CELListType(grpcfed.CELStringType)),\n\t\t\tSetter: func(value *localValueType, v map[string][]string) error {\n\t\t\t\tvalue.vars.Tlr = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `grpc.federation.metadata.new()`,\n\t\t\tByCacheIndex: 2,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"md\"\n\t\t  by: \"{'authorization': ['Bearer xxx']}\"\n\t\t}\n\t*/\n\tdef_md := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[map[string][]string, *localValueType]{\n\t\t\tName: `md`,\n\t\t\tType: grpcfed.NewCELMapType(grpcfed.CELStringType, grpcfed.CELListType(grpcfed.CELStringType)),\n\t\t\tSetter: func(value *localValueType, v map[string][]string) error {\n\t\t\t\tvalue.vars.Md = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `{'authorization': ['Bearer xxx']}`,\n\t\t\tByCacheIndex: 3,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"post.PostService/GetPost\"\n\t\t    request { field: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.GetPostResponse, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"post.GetPostResponse\"),\n\t\t\tSetter: func(value *localValueType, v *post.GetPostResponse) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &post.GetPostRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 4,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call post.PostService/GetPost\", slog.Any(\"post.GetPostRequest\", s.logvalue_Post_GetPostRequest(args)))\n\t\t\t\tmd, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `md`,\n\t\t\t\t\tOutType:    reflect.TypeOf(map[string][]string{}),\n\t\t\t\t\tCacheIndex: 5,\n\t\t\t\t})\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tfor k, v := range md.(map[string][]string) {\n\t\t\t\t\tfor _, vv := range v {\n\t\t\t\t\t\tctx = grpcfed.AppendToOutgoingContext(ctx, k, vv)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar callOpts []grpcfed.CallOption\n\t\t\t\tvar hdr grpcfed.GRPCMetadata\n\t\t\t\tcallOpts = append(callOpts, grpcfed.GRPCCallOptionHeader(&hdr))\n\t\t\t\tvar tlr grpcfed.GRPCMetadata\n\t\t\t\tcallOpts = append(callOpts, grpcfed.GRPCCallOptionTrailer(&tlr))\n\t\t\t\tcallOpts = append(callOpts, grpcfed.GRPCCallOptionMaxCallRecvMsgSize(100))\n\t\t\t\tcallOpts = append(callOpts, grpcfed.GRPCCallOptionMaxCallSendMsgSize(100))\n\t\t\t\tcallOpts = append(callOpts, grpcfed.GRPCCallOptionStaticMethod())\n\t\t\t\tcallOpts = append(callOpts, grpcfed.GRPCCallOptionWaitForReady(true))\n\n\t\t\t\tret, err := s.client.Post_PostServiceClient.GetPost(ctx, args, callOpts...)\n\t\t\t\tvalue.WithLock(func() {\n\t\t\t\t\tif value.vars.Hdr != nil {\n\t\t\t\t\t\tfor k, v := range hdr {\n\t\t\t\t\t\t\tvalue.vars.Hdr[k] = v\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif value.vars.Tlr != nil {\n\t\t\t\t\t\tfor k, v := range tlr {\n\t\t\t\t\t\t\tvalue.vars.Tlr[k] = v\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tif err != nil {\n\t\t\t\t\tgrpcErr := grpcfed.ToGRPCError(ctx, err)\n\t\t\t\t\tctx = grpcfed.WithGRPCError(ctx, grpcErr)\n\t\t\t\t\tvar (\n\t\t\t\t\t\tdefaultMsg     string\n\t\t\t\t\t\tdefaultCode    grpcfed.Code\n\t\t\t\t\t\tdefaultDetails []grpcfed.ProtoMessage\n\t\t\t\t\t)\n\t\t\t\t\tif stat, exists := grpcfed.GRPCStatusFromError(err); exists {\n\t\t\t\t\t\tdefaultMsg = stat.Message()\n\t\t\t\t\t\tdefaultCode = stat.Code()\n\t\t\t\t\t\tdetails := stat.Details()\n\t\t\t\t\t\tdefaultDetails = make([]grpcfed.ProtoMessage, 0, len(details))\n\t\t\t\t\t\tfor _, detail := range details {\n\t\t\t\t\t\t\tmsg, ok := detail.(grpcfed.ProtoMessage)\n\t\t\t\t\t\t\tif ok {\n\t\t\t\t\t\t\t\tdefaultDetails = append(defaultDetails, msg)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t_ = defaultMsg\n\t\t\t\t\t\t_ = defaultCode\n\t\t\t\t\t\t_ = defaultDetails\n\t\t\t\t\t}\n\n\t\t\t\t\ttype localStatusType struct {\n\t\t\t\t\t\tstatus   *grpcfed.Status\n\t\t\t\t\t\tlogLevel slog.Level\n\t\t\t\t\t}\n\t\t\t\t\tstat, handleErr := func() (*localStatusType, error) {\n\t\t\t\t\t\tvar stat *grpcfed.Status\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t\tdef {\n\t\t\t\t\t\t\t\t  name: \"_def3_def0\"\n\t\t\t\t\t\t\t\t  by: \"1\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\tdef__def3_def0 := func(ctx context.Context) error {\n\t\t\t\t\t\t\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[int64, *localValueType]{\n\t\t\t\t\t\t\t\t\tName: `_def3_def0`,\n\t\t\t\t\t\t\t\t\tType: grpcfed.CELIntType,\n\t\t\t\t\t\t\t\t\tSetter: func(value *localValueType, v int64) error {\n\t\t\t\t\t\t\t\t\t\tvalue.vars.XDef3Def0 = v\n\t\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tBy:           `1`,\n\t\t\t\t\t\t\t\t\tByCacheIndex: 6,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif err := def__def3_def0(ctx); err != nil {\n\t\t\t\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\t\tExpr:       `true`,\n\t\t\t\t\t\t\t\tCacheIndex: 7,\n\t\t\t\t\t\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t\t\t\t\t\tvar errorMessage string\n\t\t\t\t\t\t\t\t\tif defaultMsg != \"\" {\n\t\t\t\t\t\t\t\t\t\terrorMessage = defaultMsg\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\terrorMessage = \"error\"\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tvar code grpcfed.Code\n\t\t\t\t\t\t\t\t\tcode = defaultCode\n\t\t\t\t\t\t\t\t\tstatus := grpcfed.NewGRPCStatus(code, errorMessage)\n\t\t\t\t\t\t\t\t\tstatusWithDetails, err := status.WithDetails(defaultDetails...)\n\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\tgrpcfed.Logger(ctx).ErrorContext(ctx, \"failed setting error details\", slog.String(\"error\", err.Error()))\n\t\t\t\t\t\t\t\t\t\tstat = status\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tstat = statusWithDetails\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif stat != nil {\n\t\t\t\t\t\t\t\treturn &localStatusType{status: stat, logLevel: slog.LevelError}, nil\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn nil, nil\n\t\t\t\t\t}()\n\t\t\t\t\tif handleErr != nil {\n\t\t\t\t\t\tgrpcfed.Logger(ctx).ErrorContext(ctx, \"failed to handle error\", slog.String(\"error\", handleErr.Error()))\n\t\t\t\t\t\t// If it fails during error handling, return the original error.\n\t\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Post_PostService_GetPost, err); err != nil {\n\t\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if stat != nil {\n\t\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Post_PostService_GetPost, stat.status.Err()); err != nil {\n\t\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, stat.logLevel, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Post_PostService_GetPost, err); err != nil {\n\t\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tvalue.SetGRPCError(ret, grpcErr)\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"hdr_keys\"\n\t\t  if: \"res != null\"\n\t\t  by: \"hdr.map(k, k)\"\n\t\t}\n\t*/\n\tdef_hdr_keys := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[[]string, *localValueType]{\n\t\t\tIf:           `res != null`,\n\t\t\tIfCacheIndex: 8,\n\t\t\tName:         `hdr_keys`,\n\t\t\tType:         grpcfed.CELListType(grpcfed.CELStringType),\n\t\t\tSetter: func(value *localValueType, v []string) error {\n\t\t\t\tvalue.vars.HdrKeys = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `hdr.map(k, k)`,\n\t\t\tByCacheIndex: 9,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"tlr_keys\"\n\t\t  if: \"res != null\"\n\t\t  by: \"tlr.map(k, k)\"\n\t\t}\n\t*/\n\tdef_tlr_keys := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[[]string, *localValueType]{\n\t\t\tIf:           `res != null`,\n\t\t\tIfCacheIndex: 10,\n\t\t\tName:         `tlr_keys`,\n\t\t\tType:         grpcfed.CELListType(grpcfed.CELStringType),\n\t\t\tSetter: func(value *localValueType, v []string) error {\n\t\t\t\tvalue.vars.TlrKeys = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `tlr.map(k, k)`,\n\t\t\tByCacheIndex: 11,\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t        hdr ─┐\n\t   hdr ─┐    │\n\t    md ─┤    │\n\t   tlr ─┤    │\n\t        res ─┤\n\t             hdr_keys ─┐\n\t   hdr ─┐              │\n\t    md ─┤              │\n\t   tlr ─┤              │\n\t        res ─┐         │\n\t        tlr ─┤         │\n\t             tlr_keys ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\teg, ctx2 := grpcfed.ErrorGroupWithContext(ctx1)\n\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\tif err := def_hdr(ctx2); err != nil {\n\t\t\t\tgrpcfed.RecordErrorToSpan(ctx2, err)\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn nil, nil\n\t\t})\n\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\teg, ctx3 := grpcfed.ErrorGroupWithContext(ctx2)\n\t\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\t\tif err := def_hdr(ctx3); err != nil {\n\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx3, err)\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn nil, nil\n\t\t\t})\n\t\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\t\tif err := def_md(ctx3); err != nil {\n\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx3, err)\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn nil, nil\n\t\t\t})\n\t\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\t\tif err := def_tlr(ctx3); err != nil {\n\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx3, err)\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn nil, nil\n\t\t\t})\n\t\t\tif err := eg.Wait(); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif err := def_res(ctx2); err != nil {\n\t\t\t\tgrpcfed.RecordErrorToSpan(ctx2, err)\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn nil, nil\n\t\t})\n\t\tif err := eg.Wait(); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_hdr_keys(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\teg, ctx2 := grpcfed.ErrorGroupWithContext(ctx1)\n\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\teg, ctx3 := grpcfed.ErrorGroupWithContext(ctx2)\n\t\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\t\tif err := def_hdr(ctx3); err != nil {\n\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx3, err)\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn nil, nil\n\t\t\t})\n\t\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\t\tif err := def_md(ctx3); err != nil {\n\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx3, err)\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn nil, nil\n\t\t\t})\n\t\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\t\tif err := def_tlr(ctx3); err != nil {\n\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx3, err)\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn nil, nil\n\t\t\t})\n\t\t\tif err := eg.Wait(); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif err := def_res(ctx2); err != nil {\n\t\t\t\tgrpcfed.RecordErrorToSpan(ctx2, err)\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn nil, nil\n\t\t})\n\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\tif err := def_tlr(ctx2); err != nil {\n\t\t\t\tgrpcfed.RecordErrorToSpan(ctx2, err)\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn nil, nil\n\t\t})\n\t\tif err := eg.Wait(); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_tlr_keys(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Federation_GetPostResponseVariable.Hdr = value.vars.Hdr\n\treq.FederationService_Federation_GetPostResponseVariable.HdrKeys = value.vars.HdrKeys\n\treq.FederationService_Federation_GetPostResponseVariable.Md = value.vars.Md\n\treq.FederationService_Federation_GetPostResponseVariable.Res = value.vars.Res\n\treq.FederationService_Federation_GetPostResponseVariable.Tlr = value.vars.Tlr\n\treq.FederationService_Federation_GetPostResponseVariable.TlrKeys = value.vars.TlrKeys\n\n\t// create a message value to be returned.\n\tret := &GetPostResponse{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"hdr_keys.sortAsc(v, v)\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]string]{\n\t\tValue:      value,\n\t\tExpr:       `hdr_keys.sortAsc(v, v)`,\n\t\tCacheIndex: 12,\n\t\tSetter: func(v []string) error {\n\t\t\tret.Header = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"tlr_keys.sortAsc(v, v)\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]string]{\n\t\tValue:      value,\n\t\tExpr:       `tlr_keys.sortAsc(v, v)`,\n\t\tCacheIndex: 13,\n\t\tSetter: func(v []string) error {\n\t\t\tret.Trailer = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved federation.GetPostResponse\", slog.Any(\"federation.GetPostResponse\", s.logvalue_Federation_GetPostResponse(ret)))\n\treturn ret, nil\n}\n\nfunc (s *FederationService) logvalue_Federation_GetPostResponse(v *GetPostResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"header\", v.GetHeader()),\n\t\tslog.Any(\"trailer\", v.GetTrailer()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Federation_GetPostResponseArgument(v *FederationService_Federation_GetPostResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Post_GetPostRequest(v *post.GetPostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t)\n}\n"
  },
  {
    "path": "_examples/20_callopt/go.mod",
    "content": "module example\n\ngo 1.24.0\n\nreplace github.com/mercari/grpc-federation => ../../\n\nrequire (\n\tgithub.com/google/go-cmp v0.7.0\n\tgithub.com/mercari/grpc-federation v0.0.0-00010101000000-000000000000\n\tgo.opentelemetry.io/otel v1.24.0\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0\n\tgo.opentelemetry.io/otel/sdk v1.24.0\n\tgo.opentelemetry.io/otel/trace v1.24.0\n\tgo.uber.org/goleak v1.3.0\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7\n\tgoogle.golang.org/grpc v1.65.0\n\tgoogle.golang.org/protobuf v1.34.2\n)\n\nrequire (\n\tcel.dev/expr v0.19.1 // indirect\n\tgithub.com/antlr4-go/antlr/v4 v4.13.0 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.2.1 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/goccy/wasi-go v0.3.2 // indirect\n\tgithub.com/google/cel-go v0.23.1 // indirect\n\tgithub.com/google/uuid v1.6.0 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect\n\tgithub.com/kelseyhightower/envconfig v1.4.0 // indirect\n\tgithub.com/stealthrocket/wazergo v0.19.1 // indirect\n\tgithub.com/stoewer/go-strcase v1.3.0 // indirect\n\tgithub.com/tetratelabs/wazero v1.10.1 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.24.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.0.0 // indirect\n\tgolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect\n\tgolang.org/x/net v0.38.0 // indirect\n\tgolang.org/x/sync v0.14.0 // indirect\n\tgolang.org/x/sys v0.37.0 // indirect\n\tgolang.org/x/text v0.23.0 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 // indirect\n)\n"
  },
  {
    "path": "_examples/20_callopt/go.sum",
    "content": "cel.dev/expr v0.19.1 h1:NciYrtDRIR0lNCnH1LFJegdjspNx9fI59O7TWcua/W4=\ncel.dev/expr v0.19.1/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw=\ngithub.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=\ngithub.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/goccy/wasi-go v0.3.2 h1:wAvGXmqCkfcp0B0AwIp5Ya53hzDwkKm9W8iuT3nCCz0=\ngithub.com/goccy/wasi-go v0.3.2/go.mod h1:nIKD204n9xa4Z20UV+XA483kIr9TAl2vXr+X5qVAO5M=\ngithub.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4=\ngithub.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=\ngithub.com/google/cel-go v0.23.1 h1:91ThhEZlBcE5rB2adBVXqvDoqdL8BG2oyhd0bK1I/r4=\ngithub.com/google/cel-go v0.23.1/go.mod h1:52Pb6QsDbC5kvgxvZhiL9QX1oZEkcUF/ZqaPx1J5Wwo=\ngithub.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\ngithub.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg=\ngithub.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=\ngithub.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/stealthrocket/wazergo v0.19.1 h1:BPrITETPgSFwiytwmToO0MbUC/+RGC39JScz1JmmG6c=\ngithub.com/stealthrocket/wazergo v0.19.1/go.mod h1:riI0hxw4ndZA5e6z7PesHg2BtTftcZaMxRcoiGGipTs=\ngithub.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs=\ngithub.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/tetratelabs/wazero v1.10.1 h1:2DugeJf6VVk58KTPszlNfeeN8AhhpwcZqkJj2wwFuH8=\ngithub.com/tetratelabs/wazero v1.10.1/go.mod h1:DRm5twOQ5Gr1AoEdSi0CLjDQF1J9ZAuyqFIjl1KKfQU=\ngo.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo=\ngo.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0=\ngo.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI=\ngo.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=\ngo.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw=\ngo.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg=\ngo.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=\ngo.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=\ngo.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=\ngo.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=\ngolang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=\ngolang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=\ngolang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=\ngolang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=\ngolang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=\ngolang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=\ngolang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 h1:YcyjlL1PRr2Q17/I0dPk2JmYS5CDXfcdb2Z3YRioEbw=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7 h1:2035KHhUv+EpyB+hWgJnaWKJOdX1E95w2S8Rr4uWKTs=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=\ngoogle.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=\ngoogle.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=\ngoogle.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=\ngoogle.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "_examples/20_callopt/grpc-federation.yaml",
    "content": "imports:\n  - proto\nsrc:\n  - proto\nout: .\nplugins:\n  - plugin: go\n    opt: paths=source_relative\n  - plugin: go-grpc\n    opt: paths=source_relative\n  - plugin: grpc-federation\n    opt: paths=source_relative\n"
  },
  {
    "path": "_examples/20_callopt/main_test.go",
    "content": "package main_test\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"net\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\"\n\t\"go.opentelemetry.io/otel/propagation\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\tsdktrace \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.4.0\"\n\t\"go.uber.org/goleak\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/metadata\"\n\t\"google.golang.org/grpc/test/bufconn\"\n\n\t\"example/federation\"\n\t\"example/post\"\n)\n\nconst bufSize = 1024\n\nvar (\n\tlistener   *bufconn.Listener\n\tpostClient post.PostServiceClient\n)\n\ntype clientConfig struct{}\n\nfunc (c *clientConfig) Post_PostServiceClient(cfg federation.FederationServiceClientConfig) (post.PostServiceClient, error) {\n\treturn postClient, nil\n}\n\ntype PostServer struct {\n\t*post.UnimplementedPostServiceServer\n}\n\nfunc (s *PostServer) GetPost(ctx context.Context, req *post.GetPostRequest) (*post.GetPostResponse, error) {\n\tmd, ok := metadata.FromIncomingContext(ctx)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"failed to get incoming metadata\")\n\t}\n\thdr, exists := md[\"authorization\"]\n\tif !exists || len(hdr) == 0 || hdr[0] == \"\" {\n\t\treturn nil, fmt.Errorf(\"failed to get authorization header value\")\n\t}\n\tif err := grpc.SendHeader(ctx, metadata.Pairs(\"x-custom-header\", \"header-value\")); err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to send header: %w\", err)\n\t}\n\tgrpc.SetTrailer(ctx, metadata.Pairs(\"x-custom-trailer\", \"trailer-value\"))\n\treturn &post.GetPostResponse{\n\t\tPost: &post.Post{\n\t\t\tId:      req.Id,\n\t\t\tContent: \"foo\",\n\t\t},\n\t}, nil\n}\n\nfunc dialer(ctx context.Context, address string) (net.Conn, error) {\n\treturn listener.Dial()\n}\n\nfunc TestFederation(t *testing.T) {\n\tdefer goleak.VerifyNone(t)\n\n\tctx := context.Background()\n\tlistener = bufconn.Listen(bufSize)\n\n\tif os.Getenv(\"ENABLE_JAEGER\") != \"\" {\n\t\texporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithInsecure())\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttp := sdktrace.NewTracerProvider(\n\t\t\tsdktrace.WithBatcher(exporter),\n\t\t\tsdktrace.WithResource(\n\t\t\t\tresource.NewWithAttributes(\n\t\t\t\t\tsemconv.SchemaURL,\n\t\t\t\t\tsemconv.ServiceNameKey.String(\"example20/callopt\"),\n\t\t\t\t\tsemconv.ServiceVersionKey.String(\"1.0.0\"),\n\t\t\t\t\tattribute.String(\"environment\", \"dev\"),\n\t\t\t\t),\n\t\t\t),\n\t\t\tsdktrace.WithSampler(sdktrace.AlwaysSample()),\n\t\t)\n\t\tdefer tp.Shutdown(ctx)\n\t\totel.SetTextMapPropagator(propagation.TraceContext{})\n\t\totel.SetTracerProvider(tp)\n\t}\n\n\tconn, err := grpc.DialContext(ctx, \"\", grpc.WithContextDialer(dialer), grpc.WithInsecure())\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer conn.Close()\n\n\tpostClient = post.NewPostServiceClient(conn)\n\n\tgrpcServer := grpc.NewServer()\n\tdefer grpcServer.Stop()\n\n\tlogger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{\n\t\tLevel: slog.LevelDebug,\n\t}))\n\tfederationServer, err := federation.NewFederationService(federation.FederationServiceConfig{\n\t\tClient: new(clientConfig),\n\t\tLogger: logger,\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer federation.CleanupFederationService(ctx, federationServer)\n\n\tpost.RegisterPostServiceServer(grpcServer, &PostServer{})\n\tfederation.RegisterFederationServiceServer(grpcServer, federationServer)\n\n\tgo func() {\n\t\tif err := grpcServer.Serve(listener); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t}()\n\n\tclient := federation.NewFederationServiceClient(conn)\n\n\tt.Run(\"GetPost\", func(t *testing.T) {\n\t\tres, err := client.GetPost(ctx, &federation.GetPostRequest{\n\t\t\tId: \"foo\",\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tif diff := cmp.Diff(res, &federation.GetPostResponse{\n\t\t\tHeader:  []string{\"content-type\", \"x-custom-header\"},\n\t\t\tTrailer: []string{\"x-custom-trailer\"},\n\t\t}, cmpopts.IgnoreUnexported(\n\t\t\tfederation.GetPostResponse{},\n\t\t)); diff != \"\" {\n\t\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t}\n\t})\n}\n"
  },
  {
    "path": "_examples/20_callopt/post/post.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: post/post.proto\n\npackage post\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype GetPostRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetPostRequest) Reset() {\n\t*x = GetPostRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostRequest) ProtoMessage() {}\n\nfunc (x *GetPostRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostRequest.ProtoReflect.Descriptor instead.\nfunc (*GetPostRequest) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetPostRequest) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\ntype GetPostResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPost *Post `protobuf:\"bytes,1,opt,name=post,proto3\" json:\"post,omitempty\"`\n}\n\nfunc (x *GetPostResponse) Reset() {\n\t*x = GetPostResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostResponse) ProtoMessage() {}\n\nfunc (x *GetPostResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostResponse.ProtoReflect.Descriptor instead.\nfunc (*GetPostResponse) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetPostResponse) GetPost() *Post {\n\tif x != nil {\n\t\treturn x.Post\n\t}\n\treturn nil\n}\n\ntype Post struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId      string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tContent string `protobuf:\"bytes,2,opt,name=content,proto3\" json:\"content,omitempty\"`\n}\n\nfunc (x *Post) Reset() {\n\t*x = Post{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_post_post_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Post) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Post) ProtoMessage() {}\n\nfunc (x *Post) ProtoReflect() protoreflect.Message {\n\tmi := &file_post_post_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Post.ProtoReflect.Descriptor instead.\nfunc (*Post) Descriptor() ([]byte, []int) {\n\treturn file_post_post_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *Post) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *Post) GetContent() string {\n\tif x != nil {\n\t\treturn x.Content\n\t}\n\treturn \"\"\n}\n\nvar File_post_post_proto protoreflect.FileDescriptor\n\nvar file_post_post_proto_rawDesc = []byte{\n\t0x0a, 0x0f, 0x70, 0x6f, 0x73, 0x74, 0x2f, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x20, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x6f,\n\t0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x31, 0x0a, 0x0f, 0x47, 0x65, 0x74,\n\t0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x04,\n\t0x70, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x6f, 0x73,\n\t0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x30, 0x0a, 0x04,\n\t0x50, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x32, 0x47,\n\t0x0a, 0x0b, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x38, 0x0a,\n\t0x07, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e,\n\t0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15,\n\t0x2e, 0x70, 0x6f, 0x73, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73,\n\t0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x58, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x2e, 0x70,\n\t0x6f, 0x73, 0x74, 0x42, 0x09, 0x50, 0x6f, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01,\n\t0x5a, 0x11, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x70, 0x6f, 0x73, 0x74, 0x3b, 0x70,\n\t0x6f, 0x73, 0x74, 0xa2, 0x02, 0x03, 0x50, 0x58, 0x58, 0xaa, 0x02, 0x04, 0x50, 0x6f, 0x73, 0x74,\n\t0xca, 0x02, 0x04, 0x50, 0x6f, 0x73, 0x74, 0xe2, 0x02, 0x10, 0x50, 0x6f, 0x73, 0x74, 0x5c, 0x47,\n\t0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x04, 0x50, 0x6f, 0x73,\n\t0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_post_post_proto_rawDescOnce sync.Once\n\tfile_post_post_proto_rawDescData = file_post_post_proto_rawDesc\n)\n\nfunc file_post_post_proto_rawDescGZIP() []byte {\n\tfile_post_post_proto_rawDescOnce.Do(func() {\n\t\tfile_post_post_proto_rawDescData = protoimpl.X.CompressGZIP(file_post_post_proto_rawDescData)\n\t})\n\treturn file_post_post_proto_rawDescData\n}\n\nvar file_post_post_proto_msgTypes = make([]protoimpl.MessageInfo, 3)\nvar file_post_post_proto_goTypes = []interface{}{\n\t(*GetPostRequest)(nil),  // 0: post.GetPostRequest\n\t(*GetPostResponse)(nil), // 1: post.GetPostResponse\n\t(*Post)(nil),            // 2: post.Post\n}\nvar file_post_post_proto_depIdxs = []int32{\n\t2, // 0: post.GetPostResponse.post:type_name -> post.Post\n\t0, // 1: post.PostService.GetPost:input_type -> post.GetPostRequest\n\t1, // 2: post.PostService.GetPost:output_type -> post.GetPostResponse\n\t2, // [2:3] is the sub-list for method output_type\n\t1, // [1:2] is the sub-list for method input_type\n\t1, // [1:1] is the sub-list for extension type_name\n\t1, // [1:1] is the sub-list for extension extendee\n\t0, // [0:1] is the sub-list for field type_name\n}\n\nfunc init() { file_post_post_proto_init() }\nfunc file_post_post_proto_init() {\n\tif File_post_post_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_post_post_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_post_post_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Post); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_post_post_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   3,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_post_post_proto_goTypes,\n\t\tDependencyIndexes: file_post_post_proto_depIdxs,\n\t\tMessageInfos:      file_post_post_proto_msgTypes,\n\t}.Build()\n\tFile_post_post_proto = out.File\n\tfile_post_post_proto_rawDesc = nil\n\tfile_post_post_proto_goTypes = nil\n\tfile_post_post_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/20_callopt/post/post_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: post/post.proto\n\npackage post\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tPostService_GetPost_FullMethodName = \"/post.PostService/GetPost\"\n)\n\n// PostServiceClient is the client API for PostService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype PostServiceClient interface {\n\tGetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error)\n}\n\ntype postServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewPostServiceClient(cc grpc.ClientConnInterface) PostServiceClient {\n\treturn &postServiceClient{cc}\n}\n\nfunc (c *postServiceClient) GetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error) {\n\tout := new(GetPostResponse)\n\terr := c.cc.Invoke(ctx, PostService_GetPost_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// PostServiceServer is the server API for PostService service.\n// All implementations must embed UnimplementedPostServiceServer\n// for forward compatibility\ntype PostServiceServer interface {\n\tGetPost(context.Context, *GetPostRequest) (*GetPostResponse, error)\n\tmustEmbedUnimplementedPostServiceServer()\n}\n\n// UnimplementedPostServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedPostServiceServer struct {\n}\n\nfunc (UnimplementedPostServiceServer) GetPost(context.Context, *GetPostRequest) (*GetPostResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetPost not implemented\")\n}\nfunc (UnimplementedPostServiceServer) mustEmbedUnimplementedPostServiceServer() {}\n\n// UnsafePostServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to PostServiceServer will\n// result in compilation errors.\ntype UnsafePostServiceServer interface {\n\tmustEmbedUnimplementedPostServiceServer()\n}\n\nfunc RegisterPostServiceServer(s grpc.ServiceRegistrar, srv PostServiceServer) {\n\ts.RegisterService(&PostService_ServiceDesc, srv)\n}\n\nfunc _PostService_GetPost_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetPostRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(PostServiceServer).GetPost(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: PostService_GetPost_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(PostServiceServer).GetPost(ctx, req.(*GetPostRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// PostService_ServiceDesc is the grpc.ServiceDesc for PostService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar PostService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"post.PostService\",\n\tHandlerType: (*PostServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetPost\",\n\t\t\tHandler:    _PostService_GetPost_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"post/post.proto\",\n}\n"
  },
  {
    "path": "_examples/20_callopt/proto/buf.yaml",
    "content": "version: v1\nbreaking:\n  use:\n    - FILE\nlint:\n  use:\n    - DEFAULT\n"
  },
  {
    "path": "_examples/20_callopt/proto/federation/federation.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"grpc/federation/federation.proto\";\nimport \"google/protobuf/descriptor.proto\";\nimport \"google/protobuf/empty.proto\";\n\noption go_package = \"example/federation;federation\";\n\noption (grpc.federation.file)= {\n  import: [\"post/post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (.grpc.federation.message) = {\n    def { name: \"hdr\" by: \"grpc.federation.metadata.new()\" }\n    def { name: \"tlr\" by: \"grpc.federation.metadata.new()\" }\n    def { name: \"md\" by: \"{'authorization': ['Bearer xxx']}\" }\n    def {\n      name: \"res\"\n      call {\n        method: \"post.PostService/GetPost\"\n        request { field: \"id\", by: \"$.id\" }\n        metadata: \"md\"\n        option {\n          header: \"hdr\"\n          trailer: \"tlr\"\n          static_method: true\n          wait_for_ready: true\n          max_call_recv_msg_size: 100\n          max_call_send_msg_size: 100\n        }\n        error {\n          def { by: \"1\" }\n        }\n      }\n    }\n    def {name: \"hdr_keys\" by: \"hdr.map(k, k)\" if: \"res != null\"}\n    def {name: \"tlr_keys\" by: \"tlr.map(k, k)\" if: \"res != null\"}\n  };\n  repeated string header = 1 [(grpc.federation.field).by = \"hdr_keys.sortAsc(v, v)\"];\n  repeated string trailer = 2 [(grpc.federation.field).by = \"tlr_keys.sortAsc(v, v)\"];\n}\n"
  },
  {
    "path": "_examples/20_callopt/proto/post/post.proto",
    "content": "syntax = \"proto3\";\n\npackage post;\n\noption go_package = \"example/post;post\";\n\nservice PostService {\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  Post post = 1;\n}\n\nmessage Post {\n  string id = 1;\n  string content = 2;\n}"
  },
  {
    "path": "_examples/21_wasm_net/.gitignore",
    "content": "grpc/federation\n*.wasm\n"
  },
  {
    "path": "_examples/21_wasm_net/Makefile",
    "content": "MAKEFILE_DIR := $(dir $(lastword $(MAKEFILE_LIST)))\nGOBIN := $(MAKEFILE_DIR)/../../bin\nPATH := $(GOBIN):$(PATH)\n\nJAEGER_IMAGE := jaegertracing/all-in-one:latest\n\n.PHONY: generate\ngenerate:\n\t$(GOBIN)/buf generate\n\n.PHONY: lint\nlint:\n\t@$(GOBIN)/grpc-federation-linter -Iproto -Iproto_deps ./proto/federation/federation.proto\n\n.PHONY: test\ntest: build/wasm\n\tgo test -v ./ -count=1\n\n.PHONY: grpc-federation/generate\ngrpc-federation/generate:\n\t@$(GOBIN)/grpc-federation-generator ./proto/federation/federation.proto\n\n.PHONY: grpc-federation/watch\ngrpc-federation/watch:\n\t@$(GOBIN)/grpc-federation-generator -w\n\n.PHONY: jaeger/start\njaeger/start:\n\t@docker run \\\n\t\t-e COLLECTOR_OTLP_ENABLED=true \\\n\t\t-p 16686:16686 \\\n\t\t-p 4317:4317 \\\n\t\t-p 4318:4318 \\\n\t\t-d \\\n\t\t$(JAEGER_IMAGE)\n\n.PHONY: jaeger/stop\njaeger/stop:\n\t@docker stop $(shell docker ps -q  --filter ancestor=$(JAEGER_IMAGE))\n\nbuild/wasm:\n\tGOOS=wasip1 GOARCH=wasm go build -ldflags \"-w -s\" -o net.wasm ./cmd/plugin\n"
  },
  {
    "path": "_examples/21_wasm_net/buf.gen.yaml",
    "content": "version: v1\nmanaged:\n  enabled: true\nplugins:\n  - plugin: go\n    out: .\n    opt: paths=source_relative\n  - plugin: go-grpc\n    out: .\n    opt: paths=source_relative\n  - plugin: grpc-federation\n    out: .\n    opt:\n    - paths=source_relative\n    - import_paths=proto\n"
  },
  {
    "path": "_examples/21_wasm_net/buf.work.yaml",
    "content": "version: v1\ndirectories:\n  - proto\n  - proto_deps\n"
  },
  {
    "path": "_examples/21_wasm_net/cmd/plugin/main.go",
    "content": "package main\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"net/http\"\n\t\"os\"\n\n\tpluginpb \"example/plugin\"\n)\n\ntype plugin struct{}\n\nfunc (_ *plugin) Example_Net_HttpGet(ctx context.Context, url string) (string, error) {\n\tresp, err := http.Get(url)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tdefer resp.Body.Close()\n\tb, err := io.ReadAll(resp.Body)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn string(b), nil\n}\n\nfunc (_ *plugin) Example_Net_GetFooEnv(_ context.Context) (string, error) {\n\treturn os.Getenv(\"FOO\"), nil\n}\n\nfunc (_ *plugin) Example_Net_GetGOGCEnv(_ context.Context) (string, error) {\n\treturn os.Getenv(\"GOGC\"), nil\n}\n\nfunc (_ *plugin) Example_Net_GetFileContent(_ context.Context, path string) (string, error) {\n\tf, err := os.ReadFile(path)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn string(f), nil\n}\n\nfunc main() {\n\tpluginpb.RegisterNetPlugin(new(plugin))\n}\n"
  },
  {
    "path": "_examples/21_wasm_net/federation/federation.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype GetRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUrl  string `protobuf:\"bytes,1,opt,name=url,proto3\" json:\"url,omitempty\"`\n\tPath string `protobuf:\"bytes,2,opt,name=path,proto3\" json:\"path,omitempty\"`\n}\n\nfunc (x *GetRequest) Reset() {\n\t*x = GetRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetRequest) ProtoMessage() {}\n\nfunc (x *GetRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetRequest.ProtoReflect.Descriptor instead.\nfunc (*GetRequest) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetRequest) GetUrl() string {\n\tif x != nil {\n\t\treturn x.Url\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetRequest) GetPath() string {\n\tif x != nil {\n\t\treturn x.Path\n\t}\n\treturn \"\"\n}\n\ntype GetResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tBody string `protobuf:\"bytes,1,opt,name=body,proto3\" json:\"body,omitempty\"`\n\tFoo  string `protobuf:\"bytes,2,opt,name=foo,proto3\" json:\"foo,omitempty\"`\n\tFile string `protobuf:\"bytes,3,opt,name=file,proto3\" json:\"file,omitempty\"`\n\tGogc string `protobuf:\"bytes,4,opt,name=gogc,proto3\" json:\"gogc,omitempty\"`\n}\n\nfunc (x *GetResponse) Reset() {\n\t*x = GetResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetResponse) ProtoMessage() {}\n\nfunc (x *GetResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetResponse.ProtoReflect.Descriptor instead.\nfunc (*GetResponse) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetResponse) GetBody() string {\n\tif x != nil {\n\t\treturn x.Body\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetResponse) GetFoo() string {\n\tif x != nil {\n\t\treturn x.Foo\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetResponse) GetFile() string {\n\tif x != nil {\n\t\treturn x.File\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetResponse) GetGogc() string {\n\tif x != nil {\n\t\treturn x.Gogc\n\t}\n\treturn \"\"\n}\n\nvar File_federation_federation_proto protoreflect.FileDescriptor\n\nvar file_federation_federation_proto_rawDesc = []byte{\n\t0x0a, 0x1b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x6f,\n\t0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x20, 0x67,\n\t0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22,\n\t0x32, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a,\n\t0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12,\n\t0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70,\n\t0x61, 0x74, 0x68, 0x22, 0x9f, 0x02, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f,\n\t0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x42, 0x09, 0x9a, 0x4a, 0x06, 0x12, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x52, 0x04, 0x62, 0x6f,\n\t0x64, 0x79, 0x12, 0x1a, 0x0a, 0x03, 0x66, 0x6f, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42,\n\t0x08, 0x9a, 0x4a, 0x05, 0x12, 0x03, 0x66, 0x6f, 0x6f, 0x52, 0x03, 0x66, 0x6f, 0x6f, 0x12, 0x1d,\n\t0x0a, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0x9a, 0x4a,\n\t0x06, 0x12, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1d, 0x0a,\n\t0x04, 0x67, 0x6f, 0x67, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0x9a, 0x4a, 0x06,\n\t0x12, 0x04, 0x67, 0x6f, 0x67, 0x63, 0x52, 0x04, 0x67, 0x6f, 0x67, 0x63, 0x3a, 0x96, 0x01, 0x9a,\n\t0x4a, 0x92, 0x01, 0x0a, 0x22, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x5a, 0x1a, 0x65, 0x78, 0x61,\n\t0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x47, 0x65, 0x74,\n\t0x28, 0x24, 0x2e, 0x75, 0x72, 0x6c, 0x29, 0x0a, 0x1e, 0x0a, 0x03, 0x66, 0x6f, 0x6f, 0x5a, 0x17,\n\t0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x46,\n\t0x6f, 0x6f, 0x45, 0x6e, 0x76, 0x28, 0x29, 0x0a, 0x20, 0x0a, 0x04, 0x67, 0x6f, 0x67, 0x63, 0x5a,\n\t0x18, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x67, 0x65, 0x74,\n\t0x47, 0x4f, 0x47, 0x43, 0x45, 0x6e, 0x76, 0x28, 0x29, 0x0a, 0x2a, 0x0a, 0x04, 0x66, 0x69, 0x6c,\n\t0x65, 0x5a, 0x22, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x67,\n\t0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x28, 0x24, 0x2e,\n\t0x70, 0x61, 0x74, 0x68, 0x29, 0x32, 0x5a, 0x0a, 0x11, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x40, 0x0a, 0x03, 0x47, 0x65,\n\t0x74, 0x12, 0x1a, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e,\n\t0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47,\n\t0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x1a, 0x03, 0x9a, 0x4a,\n\t0x00, 0x42, 0xb5, 0x01, 0x9a, 0x4a, 0x15, 0x12, 0x13, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2f,\n\t0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x0a, 0x12, 0x63, 0x6f,\n\t0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x42, 0x0f, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74,\n\t0x6f, 0x50, 0x01, 0x5a, 0x1d, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0xa2, 0x02, 0x03, 0x4f, 0x46, 0x58, 0xaa, 0x02, 0x0e, 0x4f, 0x72, 0x67, 0x2e, 0x46,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xca, 0x02, 0x0e, 0x4f, 0x72, 0x67, 0x5c,\n\t0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xe2, 0x02, 0x1a, 0x4f, 0x72, 0x67,\n\t0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x47, 0x50, 0x42, 0x4d,\n\t0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0f, 0x4f, 0x72, 0x67, 0x3a, 0x3a, 0x46,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x33,\n}\n\nvar (\n\tfile_federation_federation_proto_rawDescOnce sync.Once\n\tfile_federation_federation_proto_rawDescData = file_federation_federation_proto_rawDesc\n)\n\nfunc file_federation_federation_proto_rawDescGZIP() []byte {\n\tfile_federation_federation_proto_rawDescOnce.Do(func() {\n\t\tfile_federation_federation_proto_rawDescData = protoimpl.X.CompressGZIP(file_federation_federation_proto_rawDescData)\n\t})\n\treturn file_federation_federation_proto_rawDescData\n}\n\nvar file_federation_federation_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_federation_federation_proto_goTypes = []interface{}{\n\t(*GetRequest)(nil),  // 0: org.federation.GetRequest\n\t(*GetResponse)(nil), // 1: org.federation.GetResponse\n}\nvar file_federation_federation_proto_depIdxs = []int32{\n\t0, // 0: org.federation.FederationService.Get:input_type -> org.federation.GetRequest\n\t1, // 1: org.federation.FederationService.Get:output_type -> org.federation.GetResponse\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_federation_federation_proto_init() }\nfunc file_federation_federation_proto_init() {\n\tif File_federation_federation_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_federation_federation_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_federation_federation_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_federation_federation_proto_goTypes,\n\t\tDependencyIndexes: file_federation_federation_proto_depIdxs,\n\t\tMessageInfos:      file_federation_federation_proto_msgTypes,\n\t}.Build()\n\tFile_federation_federation_proto = out.File\n\tfile_federation_federation_proto_rawDesc = nil\n\tfile_federation_federation_proto_goTypes = nil\n\tfile_federation_federation_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/21_wasm_net/federation/federation_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tFederationService_Get_FullMethodName = \"/org.federation.FederationService/Get\"\n)\n\n// FederationServiceClient is the client API for FederationService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype FederationServiceClient interface {\n\tGet(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error)\n}\n\ntype federationServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewFederationServiceClient(cc grpc.ClientConnInterface) FederationServiceClient {\n\treturn &federationServiceClient{cc}\n}\n\nfunc (c *federationServiceClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) {\n\tout := new(GetResponse)\n\terr := c.cc.Invoke(ctx, FederationService_Get_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// FederationServiceServer is the server API for FederationService service.\n// All implementations must embed UnimplementedFederationServiceServer\n// for forward compatibility\ntype FederationServiceServer interface {\n\tGet(context.Context, *GetRequest) (*GetResponse, error)\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\n// UnimplementedFederationServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedFederationServiceServer struct {\n}\n\nfunc (UnimplementedFederationServiceServer) Get(context.Context, *GetRequest) (*GetResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method Get not implemented\")\n}\nfunc (UnimplementedFederationServiceServer) mustEmbedUnimplementedFederationServiceServer() {}\n\n// UnsafeFederationServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to FederationServiceServer will\n// result in compilation errors.\ntype UnsafeFederationServiceServer interface {\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\nfunc RegisterFederationServiceServer(s grpc.ServiceRegistrar, srv FederationServiceServer) {\n\ts.RegisterService(&FederationService_ServiceDesc, srv)\n}\n\nfunc _FederationService_Get_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(FederationServiceServer).Get(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: FederationService_Get_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(FederationServiceServer).Get(ctx, req.(*GetRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// FederationService_ServiceDesc is the grpc.ServiceDesc for FederationService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar FederationService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"org.federation.FederationService\",\n\tHandlerType: (*FederationServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"Get\",\n\t\t\tHandler:    _FederationService_Get_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"federation/federation.proto\",\n}\n"
  },
  {
    "path": "_examples/21_wasm_net/federation/federation_grpc_federation.pb.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: federation/federation.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Org_Federation_GetResponseVariable represents variable definitions in \"org.federation.GetResponse\".\ntype FederationService_Org_Federation_GetResponseVariable struct {\n\tBody string\n\tFile string\n\tFoo  string\n\tGogc string\n}\n\n// Org_Federation_GetResponseArgument is argument for \"org.federation.GetResponse\" message.\ntype FederationService_Org_Federation_GetResponseArgument struct {\n\tPath string\n\tUrl  string\n\tFederationService_Org_Federation_GetResponseVariable\n}\n\n// FederationServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationServiceConfig struct {\n\t// CELPlugin If you use the plugin feature to extend the CEL API,\n\t// you must write a plugin and output WebAssembly.\n\t// In this field, configure to load wasm with the path to the WebAssembly file and the sha256 value.\n\tCELPlugin *FederationServiceCELPluginConfig\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationServiceClientFactory interface {\n}\n\n// FederationServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationServiceDependentClientSet struct {\n}\n\n// FederationServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationServiceResolver interface {\n}\n\n// FederationServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationServiceCELPluginConfig struct {\n\tNet      FederationServiceCELPluginWasmConfig\n\tCacheDir string\n}\n\n// FederationServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationServiceUnimplementedResolver struct{}\n\n// FederationService represents Federation Service.\ntype FederationService struct {\n\tUnimplementedFederationServiceServer\n\tcfg             FederationServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationServiceDependentClientSet\n}\n\n// NewFederationService creates FederationService instance by FederationServiceConfig.\nfunc NewFederationService(cfg FederationServiceConfig) (*FederationService, error) {\n\tif cfg.CELPlugin == nil {\n\t\treturn nil, grpcfed.ErrCELPluginConfig\n\t}\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"org.federation.FederationService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.org.federation.GetResponseArgument\": {\n\t\t\t\"url\":  grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Url\"),\n\t\t\t\"path\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Path\"),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"org.federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tvar celPlugins []*grpcfedcel.CELPlugin\n\t{\n\t\tplugin, err := grpcfedcel.NewCELPlugin(ctx, grpcfedcel.CELPluginConfig{\n\t\t\tName:     \"net\",\n\t\t\tWasm:     cfg.CELPlugin.Net,\n\t\t\tCacheDir: cfg.CELPlugin.CacheDir,\n\t\t\tFunctions: []*grpcfedcel.CELFunction{\n\t\t\t\t{\n\t\t\t\t\tName: \"example.net.httpGet\",\n\t\t\t\t\tID:   \"example_net_httpGet_string_string\",\n\t\t\t\t\tArgs: []*grpcfed.CELTypeDeclare{\n\t\t\t\t\t\tgrpcfed.CELStringType,\n\t\t\t\t\t},\n\t\t\t\t\tReturn:   grpcfed.CELStringType,\n\t\t\t\t\tIsMethod: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tName:     \"example.net.getFooEnv\",\n\t\t\t\t\tID:       \"example_net_getFooEnv_string\",\n\t\t\t\t\tArgs:     []*grpcfed.CELTypeDeclare{},\n\t\t\t\t\tReturn:   grpcfed.CELStringType,\n\t\t\t\t\tIsMethod: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tName:     \"example.net.getGOGCEnv\",\n\t\t\t\t\tID:       \"example_net_getGOGCEnv_string\",\n\t\t\t\t\tArgs:     []*grpcfed.CELTypeDeclare{},\n\t\t\t\t\tReturn:   grpcfed.CELStringType,\n\t\t\t\t\tIsMethod: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tName: \"example.net.getFileContent\",\n\t\t\t\t\tID:   \"example_net_getFileContent_string_string\",\n\t\t\t\t\tArgs: []*grpcfed.CELTypeDeclare{\n\t\t\t\t\t\tgrpcfed.CELStringType,\n\t\t\t\t\t},\n\t\t\t\t\tReturn:   grpcfed.CELStringType,\n\t\t\t\t\tIsMethod: false,\n\t\t\t\t},\n\t\t\t},\n\t\t\tCapability: &grpcfedcel.CELPluginCapability{\n\t\t\t\tEnv: &grpcfedcel.CELPluginEnvCapability{\n\t\t\t\t\tAll:   true,\n\t\t\t\t\tNames: []string{},\n\t\t\t\t},\n\t\t\t\tFileSystem: &grpcfedcel.CELPluginFileSystemCapability{\n\t\t\t\t\tMountPath: \"/\",\n\t\t\t\t},\n\t\t\t\tNetwork: &grpcfedcel.CELPluginNetworkCapability{},\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tinstance, err := plugin.CreateInstance(ctx, celTypeHelper.CELRegistry())\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := instance.ValidatePlugin(ctx); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tcelPlugins = append(celPlugins, plugin)\n\t\tcelEnvOpts = append(celEnvOpts, grpcfed.CELLib(plugin))\n\t}\n\tsvc := &FederationService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tcelPlugins:      celPlugins,\n\t\tclient:          &FederationServiceDependentClientSet{},\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationService(ctx context.Context, svc *FederationService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n// Get implements \"org.federation.FederationService/Get\" method.\nfunc (s *FederationService) Get(ctx context.Context, req *GetRequest) (res *GetResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.FederationService/Get\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Org_Federation_GetResponse(ctx, &FederationService_Org_Federation_GetResponseArgument{\n\t\tUrl:  req.GetUrl(),\n\t\tPath: req.GetPath(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Org_Federation_GetResponse resolve \"org.federation.GetResponse\" message.\nfunc (s *FederationService) resolve_Org_Federation_GetResponse(ctx context.Context, req *FederationService_Org_Federation_GetResponseArgument) (*GetResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.GetResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.GetResponse\", slog.Any(\"message_args\", s.logvalue_Org_Federation_GetResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tBody string\n\t\t\tFile string\n\t\t\tFoo  string\n\t\t\tGogc string\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.GetResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"body\"\n\t\t  by: \"example.net.httpGet($.url)\"\n\t\t}\n\t*/\n\tdef_body := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[string, *localValueType]{\n\t\t\tName: `body`,\n\t\t\tType: grpcfed.CELStringType,\n\t\t\tSetter: func(value *localValueType, v string) error {\n\t\t\t\tvalue.vars.Body = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `example.net.httpGet($.url)`,\n\t\t\tByCacheIndex: 1,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"foo\"\n\t\t  by: \"example.net.getFooEnv()\"\n\t\t}\n\t*/\n\tdef_foo := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[string, *localValueType]{\n\t\t\tName: `foo`,\n\t\t\tType: grpcfed.CELStringType,\n\t\t\tSetter: func(value *localValueType, v string) error {\n\t\t\t\tvalue.vars.Foo = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `example.net.getFooEnv()`,\n\t\t\tByCacheIndex: 2,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"gogc\"\n\t\t  by: \"example.net.getGOGCEnv()\"\n\t\t}\n\t*/\n\tdef_gogc := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[string, *localValueType]{\n\t\t\tName: `gogc`,\n\t\t\tType: grpcfed.CELStringType,\n\t\t\tSetter: func(value *localValueType, v string) error {\n\t\t\t\tvalue.vars.Gogc = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `example.net.getGOGCEnv()`,\n\t\t\tByCacheIndex: 3,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"file\"\n\t\t  by: \"example.net.getFileContent($.path)\"\n\t\t}\n\t*/\n\tdef_file := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[string, *localValueType]{\n\t\t\tName: `file`,\n\t\t\tType: grpcfed.CELStringType,\n\t\t\tSetter: func(value *localValueType, v string) error {\n\t\t\t\tvalue.vars.File = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `example.net.getFileContent($.path)`,\n\t\t\tByCacheIndex: 4,\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t   body ─┐\n\t   file ─┤\n\t    foo ─┤\n\t   gogc ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_body(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_file(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_foo(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_gogc(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_GetResponseVariable.Body = value.vars.Body\n\treq.FederationService_Org_Federation_GetResponseVariable.File = value.vars.File\n\treq.FederationService_Org_Federation_GetResponseVariable.Foo = value.vars.Foo\n\treq.FederationService_Org_Federation_GetResponseVariable.Gogc = value.vars.Gogc\n\n\t// create a message value to be returned.\n\tret := &GetResponse{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"body\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `body`,\n\t\tCacheIndex: 5,\n\t\tSetter: func(v string) error {\n\t\t\tret.Body = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"foo\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `foo`,\n\t\tCacheIndex: 6,\n\t\tSetter: func(v string) error {\n\t\t\tret.Foo = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"file\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `file`,\n\t\tCacheIndex: 7,\n\t\tSetter: func(v string) error {\n\t\t\tret.File = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"gogc\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `gogc`,\n\t\tCacheIndex: 8,\n\t\tSetter: func(v string) error {\n\t\t\tret.Gogc = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.GetResponse\", slog.Any(\"org.federation.GetResponse\", s.logvalue_Org_Federation_GetResponse(ret)))\n\treturn ret, nil\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetResponse(v *GetResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"body\", v.GetBody()),\n\t\tslog.String(\"foo\", v.GetFoo()),\n\t\tslog.String(\"file\", v.GetFile()),\n\t\tslog.String(\"gogc\", v.GetGogc()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetResponseArgument(v *FederationService_Org_Federation_GetResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"url\", v.Url),\n\t\tslog.String(\"path\", v.Path),\n\t)\n}\n"
  },
  {
    "path": "_examples/21_wasm_net/go.mod",
    "content": "module example\n\ngo 1.24.0\n\nreplace github.com/mercari/grpc-federation => ../../\n\nrequire (\n\tgithub.com/mercari/grpc-federation v0.0.0-00010101000000-000000000000\n\tgo.opentelemetry.io/otel v1.24.0\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0\n\tgo.opentelemetry.io/otel/sdk v1.24.0\n\tgo.opentelemetry.io/otel/trace v1.24.0\n\tgo.uber.org/goleak v1.3.0\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7\n\tgoogle.golang.org/grpc v1.65.0\n\tgoogle.golang.org/protobuf v1.34.2\n)\n\nrequire (\n\tcel.dev/expr v0.19.1 // indirect\n\tgithub.com/antlr4-go/antlr/v4 v4.13.0 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.2.1 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/goccy/wasi-go v0.3.2 // indirect\n\tgithub.com/goccy/wasi-go-net v0.3.0 // indirect\n\tgithub.com/google/cel-go v0.23.1 // indirect\n\tgithub.com/google/uuid v1.6.0 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect\n\tgithub.com/kelseyhightower/envconfig v1.4.0 // indirect\n\tgithub.com/stealthrocket/wazergo v0.19.1 // indirect\n\tgithub.com/stoewer/go-strcase v1.3.0 // indirect\n\tgithub.com/stretchr/testify v1.10.0 // indirect\n\tgithub.com/tetratelabs/wazero v1.10.1 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.24.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.0.0 // indirect\n\tgolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect\n\tgolang.org/x/net v0.38.0 // indirect\n\tgolang.org/x/sync v0.14.0 // indirect\n\tgolang.org/x/sys v0.37.0 // indirect\n\tgolang.org/x/text v0.23.0 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 // indirect\n)\n"
  },
  {
    "path": "_examples/21_wasm_net/go.sum",
    "content": "cel.dev/expr v0.19.1 h1:NciYrtDRIR0lNCnH1LFJegdjspNx9fI59O7TWcua/W4=\ncel.dev/expr v0.19.1/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw=\ngithub.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=\ngithub.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/goccy/wasi-go v0.3.2 h1:wAvGXmqCkfcp0B0AwIp5Ya53hzDwkKm9W8iuT3nCCz0=\ngithub.com/goccy/wasi-go v0.3.2/go.mod h1:nIKD204n9xa4Z20UV+XA483kIr9TAl2vXr+X5qVAO5M=\ngithub.com/goccy/wasi-go-net v0.3.0 h1:I7s6m0lrDBDslxVcEty2SQ7cbSllqXngKZPYav6aZ+A=\ngithub.com/goccy/wasi-go-net v0.3.0/go.mod h1:TwJyFeFt+nPsjt0+640ccN/c/Y3ERaC91gybpOT59CM=\ngithub.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4=\ngithub.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=\ngithub.com/google/cel-go v0.23.1 h1:91ThhEZlBcE5rB2adBVXqvDoqdL8BG2oyhd0bK1I/r4=\ngithub.com/google/cel-go v0.23.1/go.mod h1:52Pb6QsDbC5kvgxvZhiL9QX1oZEkcUF/ZqaPx1J5Wwo=\ngithub.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\ngithub.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg=\ngithub.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=\ngithub.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/stealthrocket/wazergo v0.19.1 h1:BPrITETPgSFwiytwmToO0MbUC/+RGC39JScz1JmmG6c=\ngithub.com/stealthrocket/wazergo v0.19.1/go.mod h1:riI0hxw4ndZA5e6z7PesHg2BtTftcZaMxRcoiGGipTs=\ngithub.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs=\ngithub.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=\ngithub.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tetratelabs/wazero v1.10.1 h1:2DugeJf6VVk58KTPszlNfeeN8AhhpwcZqkJj2wwFuH8=\ngithub.com/tetratelabs/wazero v1.10.1/go.mod h1:DRm5twOQ5Gr1AoEdSi0CLjDQF1J9ZAuyqFIjl1KKfQU=\ngo.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo=\ngo.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0=\ngo.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI=\ngo.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=\ngo.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw=\ngo.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg=\ngo.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=\ngo.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=\ngo.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=\ngo.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=\ngolang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=\ngolang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=\ngolang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=\ngolang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=\ngolang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=\ngolang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=\ngolang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 h1:YcyjlL1PRr2Q17/I0dPk2JmYS5CDXfcdb2Z3YRioEbw=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7 h1:2035KHhUv+EpyB+hWgJnaWKJOdX1E95w2S8Rr4uWKTs=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=\ngoogle.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=\ngoogle.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=\ngoogle.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=\ngoogle.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "_examples/21_wasm_net/main_test.go",
    "content": "package main_test\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"crypto/sha256\"\n\t_ \"embed\"\n\t\"encoding/hex\"\n\t\"log/slog\"\n\t\"net\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\"\n\t\"go.opentelemetry.io/otel/propagation\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\tsdktrace \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.4.0\"\n\t\"go.uber.org/goleak\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/credentials/insecure\"\n\t\"google.golang.org/grpc/test/bufconn\"\n\n\t\"example/federation\"\n)\n\nconst bufSize = 1024\n\nvar (\n\tlistener *bufconn.Listener\n\t//go:embed net.wasm\n\twasm []byte\n)\n\nfunc dialer(ctx context.Context, address string) (net.Conn, error) {\n\treturn listener.Dial()\n}\n\nfunc toSha256(v []byte) string {\n\thash := sha256.Sum256(v)\n\treturn hex.EncodeToString(hash[:])\n}\n\nfunc TestFederation(t *testing.T) {\n\tdefer goleak.VerifyNone(t)\n\n\tctx := context.Background()\n\tlistener = bufconn.Listen(bufSize)\n\n\tenvValue := \"TEST_ENV_CAPABILITY\"\n\tt.Setenv(\"FOO\", envValue)\n\tt.Setenv(\"GOMAXPROCS\", \"2\")\n\tt.Setenv(\"GRPC_FEDERATION_PLUGIN_GOGC\", \"off\")\n\n\ttestFileContent := `{\"hello\":\"world\"}`\n\ttestFilePath := filepath.Join(t.TempDir(), \"test.json\")\n\tif err := os.WriteFile(testFilePath, []byte(testFileContent), 0o644); err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tif os.Getenv(\"ENABLE_JAEGER\") != \"\" {\n\t\texporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithInsecure())\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttp := sdktrace.NewTracerProvider(\n\t\t\tsdktrace.WithBatcher(exporter),\n\t\t\tsdktrace.WithResource(\n\t\t\t\tresource.NewWithAttributes(\n\t\t\t\t\tsemconv.SchemaURL,\n\t\t\t\t\tsemconv.ServiceNameKey.String(\"example21/wasm_net\"),\n\t\t\t\t\tsemconv.ServiceVersionKey.String(\"1.0.0\"),\n\t\t\t\t\tattribute.String(\"environment\", \"dev\"),\n\t\t\t\t),\n\t\t\t),\n\t\t\tsdktrace.WithSampler(sdktrace.AlwaysSample()),\n\t\t)\n\t\tdefer tp.Shutdown(ctx)\n\t\totel.SetTextMapPropagator(propagation.TraceContext{})\n\t\totel.SetTracerProvider(tp)\n\t}\n\n\tconn, err := grpc.DialContext(\n\t\tctx, \"\",\n\t\tgrpc.WithContextDialer(dialer),\n\t\tgrpc.WithTransportCredentials(insecure.NewCredentials()),\n\t\tgrpc.WithDefaultCallOptions(grpc.WaitForReady(true)),\n\t)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer conn.Close()\n\n\tgrpcServer := grpc.NewServer()\n\tdefer grpcServer.Stop()\n\n\tlogger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{\n\t\tLevel: slog.LevelDebug,\n\t}))\n\tfederationServer, err := federation.NewFederationService(federation.FederationServiceConfig{\n\t\tCELPlugin: &federation.FederationServiceCELPluginConfig{\n\t\t\tNet: federation.FederationServiceCELPluginWasmConfig{\n\t\t\t\tReader: bytes.NewReader(wasm),\n\t\t\t\tSha256: toSha256(wasm),\n\t\t\t},\n\t\t},\n\t\tLogger: logger,\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer federation.CleanupFederationService(ctx, federationServer)\n\n\tfederation.RegisterFederationServiceServer(grpcServer, federationServer)\n\n\tgo func() {\n\t\tif err := grpcServer.Serve(listener); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t}()\n\n\tclient := federation.NewFederationServiceClient(conn)\n\n\tres, err := client.Get(ctx, &federation.GetRequest{\n\t\tUrl:  \"https://example.com\",\n\t\tPath: testFilePath,\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif len(res.Body) == 0 {\n\t\tt.Fatalf(\"failed to get body\")\n\t}\n\tif res.Foo != envValue {\n\t\tt.Fatalf(\"failed to get env value: %s\", res.Foo)\n\t}\n\tif res.Gogc != \"off\" {\n\t\tt.Fatalf(\"failed to get gogc value: %s\", res.Gogc)\n\t}\n\tif res.File != testFileContent {\n\t\tt.Fatalf(\"failed to get file content: %s\", res.File)\n\t}\n}\n"
  },
  {
    "path": "_examples/21_wasm_net/plugin/plugin.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: plugin/plugin.proto\n\npackage pluginpb\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\nvar File_plugin_plugin_proto protoreflect.FileDescriptor\n\nvar file_plugin_plugin_proto_rawDesc = []byte{\n\t0x0a, 0x13, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0b, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x6e,\n\t0x65, 0x74, 0x1a, 0x20, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x42, 0x89, 0x02, 0x9a, 0x4a, 0x81, 0x01, 0x0a, 0x7f, 0x0a, 0x7d, 0x0a,\n\t0x03, 0x6e, 0x65, 0x74, 0x22, 0x24, 0x0a, 0x07, 0x68, 0x74, 0x74, 0x70, 0x47, 0x65, 0x74, 0x1a,\n\t0x15, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x0a, 0x75, 0x72, 0x6c, 0x20, 0x73, 0x74, 0x72, 0x69,\n\t0x6e, 0x67, 0x1a, 0x02, 0x08, 0x01, 0x22, 0x02, 0x08, 0x01, 0x22, 0x0f, 0x0a, 0x09, 0x67, 0x65,\n\t0x74, 0x46, 0x6f, 0x6f, 0x45, 0x6e, 0x76, 0x22, 0x02, 0x08, 0x01, 0x22, 0x10, 0x0a, 0x0a, 0x67,\n\t0x65, 0x74, 0x47, 0x4f, 0x47, 0x43, 0x45, 0x6e, 0x76, 0x22, 0x02, 0x08, 0x01, 0x22, 0x20, 0x0a,\n\t0x0e, 0x67, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a,\n\t0x0a, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x1a, 0x02, 0x08, 0x01, 0x22, 0x02, 0x08, 0x01, 0x32,\n\t0x0b, 0x0a, 0x02, 0x08, 0x01, 0x12, 0x03, 0x0a, 0x01, 0x2f, 0x1a, 0x00, 0x0a, 0x0f, 0x63, 0x6f,\n\t0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x6e, 0x65, 0x74, 0x42, 0x0b, 0x50,\n\t0x6c, 0x75, 0x67, 0x69, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x17, 0x65, 0x78,\n\t0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x3b, 0x70, 0x6c, 0x75,\n\t0x67, 0x69, 0x6e, 0x70, 0x62, 0xa2, 0x02, 0x03, 0x45, 0x4e, 0x58, 0xaa, 0x02, 0x0b, 0x45, 0x78,\n\t0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x4e, 0x65, 0x74, 0xca, 0x02, 0x0b, 0x45, 0x78, 0x61, 0x6d,\n\t0x70, 0x6c, 0x65, 0x5c, 0x4e, 0x65, 0x74, 0xe2, 0x02, 0x17, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c,\n\t0x65, 0x5c, 0x4e, 0x65, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,\n\t0x61, 0xea, 0x02, 0x0c, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x3a, 0x3a, 0x4e, 0x65, 0x74,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar file_plugin_plugin_proto_goTypes = []interface{}{}\nvar file_plugin_plugin_proto_depIdxs = []int32{\n\t0, // [0:0] is the sub-list for method output_type\n\t0, // [0:0] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_plugin_plugin_proto_init() }\nfunc file_plugin_plugin_proto_init() {\n\tif File_plugin_plugin_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_plugin_plugin_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_plugin_plugin_proto_goTypes,\n\t\tDependencyIndexes: file_plugin_plugin_proto_depIdxs,\n\t}.Build()\n\tFile_plugin_plugin_proto = out.File\n\tfile_plugin_plugin_proto_rawDesc = nil\n\tfile_plugin_plugin_proto_goTypes = nil\n\tfile_plugin_plugin_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/21_wasm_net/plugin/plugin_grpc_federation.pb.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: plugin/plugin.proto\npackage pluginpb\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfednet \"github.com/mercari/grpc-federation/grpc/federation/net\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\ntype NetPlugin interface {\n\tExample_Net_HttpGet(context.Context, string) (string, error)\n\tExample_Net_GetFooEnv(context.Context) (string, error)\n\tExample_Net_GetGOGCEnv(context.Context) (string, error)\n\tExample_Net_GetFileContent(context.Context, string) (string, error)\n}\n\nfunc init() {\n\thttp.DefaultTransport = grpcfednet.DefaultTransport()\n}\n\nfunc RegisterNetPlugin(plug NetPlugin) {\n\tgrpcfed.PluginMainLoop(\n\t\tgrpcfed.CELPluginVersionSchema{\n\t\t\tProtocolVersion:   grpcfed.CELPluginProtocolVersion,\n\t\t\tFederationVersion: \"(devel)\",\n\t\t\tFunctions: []string{\n\t\t\t\t\"example_net_httpGet_string_string\",\n\t\t\t\t\"example_net_getFooEnv_string\",\n\t\t\t\t\"example_net_getGOGCEnv_string\",\n\t\t\t\t\"example_net_getFileContent_string_string\",\n\t\t\t},\n\t\t},\n\t\tfunc(ctx context.Context, req *grpcfed.CELPluginRequest) (*grpcfed.CELPluginResponse, error) {\n\t\t\tswitch req.GetMethod() {\n\t\t\tcase \"example_net_httpGet_string_string\":\n\t\t\t\tif len(req.GetArgs()) != 1 {\n\t\t\t\t\treturn nil, fmt.Errorf(\"%s: invalid argument number: %d. expected number is %d\", req.GetMethod(), len(req.GetArgs()), 1)\n\t\t\t\t}\n\t\t\t\targ0, err := grpcfed.ToString(req.GetArgs()[0])\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := plug.Example_Net_HttpGet(ctx, arg0)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn grpcfed.ToStringCELPluginResponse(ret)\n\t\t\tcase \"example_net_getFooEnv_string\":\n\t\t\t\tif len(req.GetArgs()) != 0 {\n\t\t\t\t\treturn nil, fmt.Errorf(\"%s: invalid argument number: %d. expected number is %d\", req.GetMethod(), len(req.GetArgs()), 0)\n\t\t\t\t}\n\t\t\t\tret, err := plug.Example_Net_GetFooEnv(ctx)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn grpcfed.ToStringCELPluginResponse(ret)\n\t\t\tcase \"example_net_getGOGCEnv_string\":\n\t\t\t\tif len(req.GetArgs()) != 0 {\n\t\t\t\t\treturn nil, fmt.Errorf(\"%s: invalid argument number: %d. expected number is %d\", req.GetMethod(), len(req.GetArgs()), 0)\n\t\t\t\t}\n\t\t\t\tret, err := plug.Example_Net_GetGOGCEnv(ctx)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn grpcfed.ToStringCELPluginResponse(ret)\n\t\t\tcase \"example_net_getFileContent_string_string\":\n\t\t\t\tif len(req.GetArgs()) != 1 {\n\t\t\t\t\treturn nil, fmt.Errorf(\"%s: invalid argument number: %d. expected number is %d\", req.GetMethod(), len(req.GetArgs()), 1)\n\t\t\t\t}\n\t\t\t\targ0, err := grpcfed.ToString(req.GetArgs()[0])\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := plug.Example_Net_GetFileContent(ctx, arg0)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn grpcfed.ToStringCELPluginResponse(ret)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"unexpected method name: %s\", req.GetMethod())\n\t\t},\n\t)\n}\n"
  },
  {
    "path": "_examples/21_wasm_net/proto/buf.yaml",
    "content": "version: v1\nbreaking:\n  use:\n    - FILE\nlint:\n  use:\n    - DEFAULT\n"
  },
  {
    "path": "_examples/21_wasm_net/proto/federation/federation.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file)= {\n  import: [\n    \"plugin/plugin.proto\"\n  ]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc Get(GetRequest) returns (GetResponse) {};\n}\n\nmessage GetRequest {\n  string url = 1;\n  string path = 2;\n}\n    \nmessage GetResponse {\n  option (grpc.federation.message) = {\n    def { name: \"body\" by: \"example.net.httpGet($.url)\" }\n    def { name: \"foo\" by: \"example.net.getFooEnv()\" }\n    def { name: \"gogc\" by: \"example.net.getGOGCEnv()\" }\n    def { name: \"file\" by: \"example.net.getFileContent($.path)\" }\n  };\n  string body = 1 [(grpc.federation.field).by = \"body\"];\n  string foo = 2 [(grpc.federation.field).by = \"foo\"];\n  string file = 3 [(grpc.federation.field).by = \"file\"];\n  string gogc = 4 [(grpc.federation.field).by = \"gogc\"];\n}\n"
  },
  {
    "path": "_examples/21_wasm_net/proto/plugin/plugin.proto",
    "content": "syntax = \"proto3\";\n\npackage example.net;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/plugin;pluginpb\";\n\noption (grpc.federation.file).plugin.export = {\n  name: \"net\"\n  capability {\n    network: {}\n    env { all: true }\n    file_system { mount_path: \"/\" }\n  }\n  functions: [\n    {\n      name: \"httpGet\"\n      args {\n        name: \"url\"\n        type { kind: STRING }\n        desc: \"url string\"\n      }\n      return { kind: STRING }\n    },\n    {\n      name: \"getFooEnv\"\n      return { kind: STRING }\n    },\n    {\n      name: \"getGOGCEnv\"\n      return { kind: STRING }\n    },\n    {\n      name: \"getFileContent\"\n      args {\n        name: \"path\"\n        type { kind: STRING }\n      }\n      return { kind: STRING }\n    }\n  ]\n};\n"
  },
  {
    "path": "_examples/22_switch/.gitignore",
    "content": "grpc/federation\n"
  },
  {
    "path": "_examples/22_switch/Makefile",
    "content": "MAKEFILE_DIR := $(dir $(lastword $(MAKEFILE_LIST)))\nGOBIN := $(MAKEFILE_DIR)/../../bin\nPATH := $(GOBIN):$(PATH)\n\nJAEGER_IMAGE := jaegertracing/all-in-one:latest\n\n.PHONY: generate\ngenerate:\n\t$(GOBIN)/buf generate\n\n.PHONY: lint\nlint:\n\t@$(GOBIN)/grpc-federation-linter -Iproto -Iproto_deps ./proto/federation/federation.proto\n\n.PHONY: test\ntest:\n\tgo test -race ./ -count=1\n\n.PHONY: grpc-federation/generate\ngrpc-federation/generate:\n\t@$(GOBIN)/grpc-federation-generator ./proto/federation/federation.proto\n\n.PHONY: grpc-federation/watch\ngrpc-federation/watch:\n\t@$(GOBIN)/grpc-federation-generator -w\n\n.PHONY: jaeger/start\njaeger/start:\n\t@docker run \\\n\t\t-e COLLECTOR_OTLP_ENABLED=true \\\n\t\t-p 16686:16686 \\\n\t\t-p 4317:4317 \\\n\t\t-p 4318:4318 \\\n\t\t-d \\\n\t\t$(JAEGER_IMAGE)\n\n.PHONY: jaeger/stop\njaeger/stop:\n\t@docker stop $(shell docker ps -q  --filter ancestor=$(JAEGER_IMAGE))\n"
  },
  {
    "path": "_examples/22_switch/buf.gen.yaml",
    "content": "version: v1\nmanaged:\n  enabled: true\nplugins:\n  - plugin: go\n    out: .\n    opt: paths=source_relative\n  - plugin: go-grpc\n    out: .\n    opt: paths=source_relative\n  - plugin: grpc-federation\n    out: .\n    opt:\n    - paths=source_relative\n    - import_paths=proto\n"
  },
  {
    "path": "_examples/22_switch/buf.work.yaml",
    "content": "version: v1\ndirectories:\n  - proto\n  - proto_deps\n"
  },
  {
    "path": "_examples/22_switch/federation/federation.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype GetPostRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetPostRequest) Reset() {\n\t*x = GetPostRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostRequest) ProtoMessage() {}\n\nfunc (x *GetPostRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostRequest.ProtoReflect.Descriptor instead.\nfunc (*GetPostRequest) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetPostRequest) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\ntype GetPostResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tSvar   int64 `protobuf:\"varint,1,opt,name=svar,proto3\" json:\"svar,omitempty\"`\n\tSwitch int64 `protobuf:\"varint,2,opt,name=switch,proto3\" json:\"switch,omitempty\"`\n}\n\nfunc (x *GetPostResponse) Reset() {\n\t*x = GetPostResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_federation_federation_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPostResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPostResponse) ProtoMessage() {}\n\nfunc (x *GetPostResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_federation_federation_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPostResponse.ProtoReflect.Descriptor instead.\nfunc (*GetPostResponse) Descriptor() ([]byte, []int) {\n\treturn file_federation_federation_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetPostResponse) GetSvar() int64 {\n\tif x != nil {\n\t\treturn x.Svar\n\t}\n\treturn 0\n}\n\nfunc (x *GetPostResponse) GetSwitch() int64 {\n\tif x != nil {\n\t\treturn x.Switch\n\t}\n\treturn 0\n}\n\nvar File_federation_federation_proto protoreflect.FileDescriptor\n\nvar file_federation_federation_proto_rawDesc = []byte{\n\t0x0a, 0x1b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x6f,\n\t0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x20, 0x67,\n\t0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22,\n\t0x20, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,\n\t0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,\n\t0x64, 0x22, 0xc9, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73,\n\t0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x04, 0x73, 0x76, 0x61, 0x72, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x03, 0x42, 0x1d, 0x9a, 0x4a, 0x1a, 0x12, 0x18, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x61, 0x72, 0x2e, 0x73, 0x76,\n\t0x61, 0x72, 0x52, 0x04, 0x73, 0x76, 0x61, 0x72, 0x12, 0x23, 0x0a, 0x06, 0x73, 0x77, 0x69, 0x74,\n\t0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x42, 0x0b, 0x9a, 0x4a, 0x08, 0x12, 0x06, 0x73,\n\t0x77, 0x69, 0x74, 0x63, 0x68, 0x52, 0x06, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x3a, 0x5e, 0x9a,\n\t0x4a, 0x5b, 0x0a, 0x59, 0x0a, 0x06, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x8a, 0x01, 0x4e, 0x0a,\n\t0x13, 0x0a, 0x0e, 0x24, 0x2e, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x62, 0x6c, 0x75, 0x65,\n\t0x27, 0x5a, 0x01, 0x33, 0x0a, 0x1e, 0x0a, 0x0d, 0x24, 0x2e, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x20,\n\t0x27, 0x72, 0x65, 0x64, 0x27, 0x12, 0x08, 0x0a, 0x03, 0x72, 0x65, 0x64, 0x5a, 0x01, 0x34, 0x5a,\n\t0x03, 0x72, 0x65, 0x64, 0x12, 0x17, 0x0a, 0x0c, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c,\n\t0x74, 0x5a, 0x01, 0x35, 0x5a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x32, 0xae, 0x01,\n\t0x0a, 0x11, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x12, 0x4c, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x12, 0x1e,\n\t0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f,\n\t0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x47, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,\n\t0x00, 0x1a, 0x4b, 0x9a, 0x4a, 0x48, 0x0a, 0x11, 0x0a, 0x0f, 0x0a, 0x01, 0x61, 0x12, 0x02, 0x08,\n\t0x01, 0x1a, 0x06, 0x12, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x12, 0x33, 0x0a, 0x04, 0x73, 0x76, 0x61,\n\t0x72, 0x82, 0x01, 0x2a, 0x0a, 0x23, 0x0a, 0x1e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x65, 0x6e, 0x76, 0x2e, 0x61, 0x20, 0x3d, 0x3d,\n\t0x20, 0x27, 0x72, 0x65, 0x64, 0x27, 0x5a, 0x01, 0x31, 0x12, 0x03, 0x5a, 0x01, 0x32, 0x42, 0x9d,\n\t0x01, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0f, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x1d, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c,\n\t0x65, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xa2, 0x02, 0x03, 0x4f, 0x46, 0x58, 0xaa, 0x02, 0x0e,\n\t0x4f, 0x72, 0x67, 0x2e, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xca, 0x02,\n\t0x0e, 0x4f, 0x72, 0x67, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xe2,\n\t0x02, 0x1a, 0x4f, 0x72, 0x67, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0f, 0x4f,\n\t0x72, 0x67, 0x3a, 0x3a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x06,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_federation_federation_proto_rawDescOnce sync.Once\n\tfile_federation_federation_proto_rawDescData = file_federation_federation_proto_rawDesc\n)\n\nfunc file_federation_federation_proto_rawDescGZIP() []byte {\n\tfile_federation_federation_proto_rawDescOnce.Do(func() {\n\t\tfile_federation_federation_proto_rawDescData = protoimpl.X.CompressGZIP(file_federation_federation_proto_rawDescData)\n\t})\n\treturn file_federation_federation_proto_rawDescData\n}\n\nvar file_federation_federation_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_federation_federation_proto_goTypes = []interface{}{\n\t(*GetPostRequest)(nil),  // 0: org.federation.GetPostRequest\n\t(*GetPostResponse)(nil), // 1: org.federation.GetPostResponse\n}\nvar file_federation_federation_proto_depIdxs = []int32{\n\t0, // 0: org.federation.FederationService.GetPost:input_type -> org.federation.GetPostRequest\n\t1, // 1: org.federation.FederationService.GetPost:output_type -> org.federation.GetPostResponse\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_federation_federation_proto_init() }\nfunc file_federation_federation_proto_init() {\n\tif File_federation_federation_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_federation_federation_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_federation_federation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPostResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_federation_federation_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_federation_federation_proto_goTypes,\n\t\tDependencyIndexes: file_federation_federation_proto_depIdxs,\n\t\tMessageInfos:      file_federation_federation_proto_msgTypes,\n\t}.Build()\n\tFile_federation_federation_proto = out.File\n\tfile_federation_federation_proto_rawDesc = nil\n\tfile_federation_federation_proto_goTypes = nil\n\tfile_federation_federation_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/22_switch/federation/federation_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.3.0\n// - protoc             (unknown)\n// source: federation/federation.proto\n\npackage federation\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.32.0 or later.\nconst _ = grpc.SupportPackageIsVersion7\n\nconst (\n\tFederationService_GetPost_FullMethodName = \"/org.federation.FederationService/GetPost\"\n)\n\n// FederationServiceClient is the client API for FederationService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype FederationServiceClient interface {\n\tGetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error)\n}\n\ntype federationServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewFederationServiceClient(cc grpc.ClientConnInterface) FederationServiceClient {\n\treturn &federationServiceClient{cc}\n}\n\nfunc (c *federationServiceClient) GetPost(ctx context.Context, in *GetPostRequest, opts ...grpc.CallOption) (*GetPostResponse, error) {\n\tout := new(GetPostResponse)\n\terr := c.cc.Invoke(ctx, FederationService_GetPost_FullMethodName, in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// FederationServiceServer is the server API for FederationService service.\n// All implementations must embed UnimplementedFederationServiceServer\n// for forward compatibility\ntype FederationServiceServer interface {\n\tGetPost(context.Context, *GetPostRequest) (*GetPostResponse, error)\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\n// UnimplementedFederationServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedFederationServiceServer struct {\n}\n\nfunc (UnimplementedFederationServiceServer) GetPost(context.Context, *GetPostRequest) (*GetPostResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetPost not implemented\")\n}\nfunc (UnimplementedFederationServiceServer) mustEmbedUnimplementedFederationServiceServer() {}\n\n// UnsafeFederationServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to FederationServiceServer will\n// result in compilation errors.\ntype UnsafeFederationServiceServer interface {\n\tmustEmbedUnimplementedFederationServiceServer()\n}\n\nfunc RegisterFederationServiceServer(s grpc.ServiceRegistrar, srv FederationServiceServer) {\n\ts.RegisterService(&FederationService_ServiceDesc, srv)\n}\n\nfunc _FederationService_GetPost_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetPostRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(FederationServiceServer).GetPost(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: FederationService_GetPost_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(FederationServiceServer).GetPost(ctx, req.(*GetPostRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// FederationService_ServiceDesc is the grpc.ServiceDesc for FederationService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar FederationService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"org.federation.FederationService\",\n\tHandlerType: (*FederationServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetPost\",\n\t\t\tHandler:    _FederationService_GetPost_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"federation/federation.proto\",\n}\n"
  },
  {
    "path": "_examples/22_switch/federation/federation_grpc_federation.pb.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: federation/federation.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Org_Federation_GetPostResponseVariable represents variable definitions in \"org.federation.GetPostResponse\".\ntype FederationService_Org_Federation_GetPostResponseVariable struct {\n\tDefault int64\n\tRed     int64\n\tSwitch  int64\n}\n\n// Org_Federation_GetPostResponseArgument is argument for \"org.federation.GetPostResponse\" message.\ntype FederationService_Org_Federation_GetPostResponseArgument struct {\n\tId string\n\tFederationService_Org_Federation_GetPostResponseVariable\n}\n\n// FederationServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationServiceConfig struct {\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationServiceClientFactory interface {\n}\n\n// FederationServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationServiceDependentClientSet struct {\n}\n\n// FederationServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationServiceResolver interface {\n}\n\n// FederationServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// FederationServiceEnv keeps the values read from environment variables.\ntype FederationServiceEnv struct {\n\tA string `envconfig:\"A\" default:\"none\"`\n}\n\ntype keyFederationServiceEnv struct{}\n\n// GetFederationServiceEnv gets environment variables.\nfunc GetFederationServiceEnv(ctx context.Context) *FederationServiceEnv {\n\tvalue := ctx.Value(keyFederationServiceEnv{})\n\tif value == nil {\n\t\treturn nil\n\t}\n\treturn value.(*FederationServiceEnv)\n}\n\nfunc withFederationServiceEnv(ctx context.Context, env *FederationServiceEnv) context.Context {\n\treturn context.WithValue(ctx, keyFederationServiceEnv{}, env)\n}\n\n// FederationServiceVariable keeps the initial values.\ntype FederationServiceVariable struct {\n\tSvar int64\n}\n\ntype keyFederationServiceVariable struct{}\n\n// GetFederationServiceVariable gets initial variables.\nfunc GetFederationServiceVariable(ctx context.Context) *FederationServiceVariable {\n\tvalue := ctx.Value(keyFederationServiceVariable{})\n\tif value == nil {\n\t\treturn nil\n\t}\n\treturn value.(*FederationServiceVariable)\n}\n\nfunc withFederationServiceVariable(ctx context.Context, svcVar *FederationServiceVariable) context.Context {\n\treturn context.WithValue(ctx, keyFederationServiceVariable{}, svcVar)\n}\n\n// FederationServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationServiceUnimplementedResolver struct{}\n\n// FederationService represents Federation Service.\ntype FederationService struct {\n\tUnimplementedFederationServiceServer\n\tcfg             FederationServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tenv             *FederationServiceEnv\n\tsvcVar          *FederationServiceVariable\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationServiceDependentClientSet\n}\n\n// NewFederationService creates FederationService instance by FederationServiceConfig.\nfunc NewFederationService(cfg FederationServiceConfig) (*FederationService, error) {\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"org.federation.FederationService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.org.federation.GetPostResponseArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.Env\": {\n\t\t\t\"a\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"A\"),\n\t\t},\n\t\t\"grpc.federation.private.ServiceVariable\": {\n\t\t\t\"svar\": grpcfed.NewCELFieldType(grpcfed.CELIntType, \"Svar\"),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"org.federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewCELVariable(\"grpc.federation.env\", grpcfed.CELObjectType(\"grpc.federation.private.Env\")))\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewCELVariable(\"grpc.federation.var\", grpcfed.CELObjectType(\"grpc.federation.private.ServiceVariable\")))\n\tvar env FederationServiceEnv\n\tif err := grpcfed.LoadEnv(\"\", &env); err != nil {\n\t\treturn nil, err\n\t}\n\tsvc := &FederationService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tenv:             &env,\n\t\tsvcVar:          new(FederationServiceVariable),\n\t\tclient:          &FederationServiceDependentClientSet{},\n\t}\n\tif err := svc.initServiceVariables(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationService(ctx context.Context, svc *FederationService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\nfunc (s *FederationService) initServiceVariables(ctx context.Context) error {\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars *FederationServiceVariable\n\t}\n\tvalue := &localValueType{\n\t\tLocalValue: grpcfed.NewServiceVariableLocalValue(s.celEnvOpts),\n\t\tvars:       s.svcVar,\n\t}\n\tvalue.AddEnv(s.env)\n\tvalue.AddServiceVariable(s.svcVar)\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t/*\n\t\tdef {\n\t\t  name: \"svar\"\n\t\t  switch {\n\t\t    case {\n\t\t      if: \"grpc.federation.env.a == 'red'\"\n\t\t      by: \"1\"\n\t\t    }\n\t\t    default {\n\t\t      by: \"2\"\n\t\t    }\n\t\t  }\n\t\t}\n\t*/\n\tdef_svar := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[int64, *localValueType]{\n\t\t\tName: `svar`,\n\t\t\tType: grpcfed.CELIntType,\n\t\t\tSetter: func(value *localValueType, v int64) error {\n\t\t\t\tvalue.vars.Svar = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tSwitch: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\tcases := []*grpcfed.EvalSwitchCase[*localValueType]{}\n\t\t\t\tcases = append(cases, &grpcfed.EvalSwitchCase[*localValueType]{\n\t\t\t\t\tIf:           `grpc.federation.env.a == 'red'`,\n\t\t\t\t\tIfCacheIndex: 1,\n\t\t\t\t\tBy:           `1`,\n\t\t\t\t\tByCacheIndex: 2,\n\t\t\t\t})\n\t\t\t\treturn grpcfed.EvalSwitch[int64](ctx, value, cases, &grpcfed.EvalSwitchDefault[*localValueType]{\n\t\t\t\t\tBy:           `2`,\n\t\t\t\t\tByCacheIndex: 3,\n\t\t\t\t})\n\t\t\t},\n\t\t})\n\t}\n\tif err := def_svar(ctx); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// GetPost implements \"org.federation.FederationService/GetPost\" method.\nfunc (s *FederationService) GetPost(ctx context.Context, req *GetPostRequest) (res *GetPostResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.FederationService/GetPost\")\n\tdefer span.End()\n\tctx = withFederationServiceEnv(ctx, s.env)\n\tctx = withFederationServiceVariable(ctx, s.svcVar)\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Org_Federation_GetPostResponse(ctx, &FederationService_Org_Federation_GetPostResponseArgument{\n\t\tId: req.GetId(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Org_Federation_GetPostResponse resolve \"org.federation.GetPostResponse\" message.\nfunc (s *FederationService) resolve_Org_Federation_GetPostResponse(ctx context.Context, req *FederationService_Org_Federation_GetPostResponseArgument) (*GetPostResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.GetPostResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.GetPostResponse\", slog.Any(\"message_args\", s.logvalue_Org_Federation_GetPostResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tDefault int64\n\t\t\tRed     int64\n\t\t\tSwitch  int64\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.GetPostResponseArgument\", req)}\n\tvalue.AddEnv(s.env)\n\tvalue.AddServiceVariable(s.svcVar)\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"switch\"\n\t\t  switch {\n\t\t    case {\n\t\t      if: \"$.id == 'blue'\"\n\t\t      by: \"3\"\n\t\t    }\n\t\t    case {\n\t\t      def {\n\t\t        name: \"red\"\n\t\t        by: \"4\"\n\t\t      }\n\t\t      if: \"$.id == 'red'\"\n\t\t      by: \"red\"\n\t\t    }\n\t\t    default {\n\t\t      def {\n\t\t        name: \"default\"\n\t\t        by: \"5\"\n\t\t      }\n\t\t      by: \"default\"\n\t\t    }\n\t\t  }\n\t\t}\n\t*/\n\tdef_switch := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[int64, *localValueType]{\n\t\t\tName: `switch`,\n\t\t\tType: grpcfed.CELIntType,\n\t\t\tSetter: func(value *localValueType, v int64) error {\n\t\t\t\tvalue.vars.Switch = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tSwitch: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\tcases := []*grpcfed.EvalSwitchCase[*localValueType]{}\n\t\t\t\tcases = append(cases, &grpcfed.EvalSwitchCase[*localValueType]{\n\t\t\t\t\tIf:           `$.id == 'blue'`,\n\t\t\t\t\tIfCacheIndex: 4,\n\t\t\t\t\tBy:           `3`,\n\t\t\t\t\tByCacheIndex: 5,\n\t\t\t\t})\n\t\t\t\tcases = append(cases, &grpcfed.EvalSwitchCase[*localValueType]{\n\t\t\t\t\tDefs: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t\tdef {\n\t\t\t\t\t\t\t  name: \"red\"\n\t\t\t\t\t\t\t  by: \"4\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t*/\n\t\t\t\t\t\tdef_red := func(ctx context.Context) error {\n\t\t\t\t\t\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[int64, *localValueType]{\n\t\t\t\t\t\t\t\tName: `red`,\n\t\t\t\t\t\t\t\tType: grpcfed.CELIntType,\n\t\t\t\t\t\t\t\tSetter: func(value *localValueType, v int64) error {\n\t\t\t\t\t\t\t\t\tvalue.vars.Red = v\n\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tBy:           `4`,\n\t\t\t\t\t\t\t\tByCacheIndex: 6,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif err := def_red(ctx); err != nil {\n\t\t\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn nil, nil\n\t\t\t\t\t},\n\t\t\t\t\tIf:           `$.id == 'red'`,\n\t\t\t\t\tIfCacheIndex: 7,\n\t\t\t\t\tBy:           `red`,\n\t\t\t\t\tByCacheIndex: 8,\n\t\t\t\t})\n\t\t\t\treturn grpcfed.EvalSwitch[int64](ctx, value, cases, &grpcfed.EvalSwitchDefault[*localValueType]{\n\t\t\t\t\tDefs: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t\tdef {\n\t\t\t\t\t\t\t  name: \"default\"\n\t\t\t\t\t\t\t  by: \"5\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t*/\n\t\t\t\t\t\tdef_default := func(ctx context.Context) error {\n\t\t\t\t\t\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[int64, *localValueType]{\n\t\t\t\t\t\t\t\tName: `default`,\n\t\t\t\t\t\t\t\tType: grpcfed.CELIntType,\n\t\t\t\t\t\t\t\tSetter: func(value *localValueType, v int64) error {\n\t\t\t\t\t\t\t\t\tvalue.vars.Default = v\n\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tBy:           `5`,\n\t\t\t\t\t\t\t\tByCacheIndex: 9,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif err := def_default(ctx); err != nil {\n\t\t\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn nil, nil\n\t\t\t\t\t},\n\t\t\t\t\tBy:           `default`,\n\t\t\t\t\tByCacheIndex: 10,\n\t\t\t\t})\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_switch(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_GetPostResponseVariable.Default = value.vars.Default\n\treq.FederationService_Org_Federation_GetPostResponseVariable.Red = value.vars.Red\n\treq.FederationService_Org_Federation_GetPostResponseVariable.Switch = value.vars.Switch\n\n\t// create a message value to be returned.\n\tret := &GetPostResponse{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"grpc.federation.var.svar\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[int64]{\n\t\tValue:      value,\n\t\tExpr:       `grpc.federation.var.svar`,\n\t\tCacheIndex: 11,\n\t\tSetter: func(v int64) error {\n\t\t\tret.Svar = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"switch\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[int64]{\n\t\tValue:      value,\n\t\tExpr:       `switch`,\n\t\tCacheIndex: 12,\n\t\tSetter: func(v int64) error {\n\t\t\tret.Switch = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.GetPostResponse\", slog.Any(\"org.federation.GetPostResponse\", s.logvalue_Org_Federation_GetPostResponse(ret)))\n\treturn ret, nil\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostResponse(v *GetPostResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Int64(\"svar\", v.GetSvar()),\n\t\tslog.Int64(\"switch\", v.GetSwitch()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostResponseArgument(v *FederationService_Org_Federation_GetPostResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n"
  },
  {
    "path": "_examples/22_switch/go.mod",
    "content": "module example\n\ngo 1.24.0\n\nreplace github.com/mercari/grpc-federation => ../../\n\nrequire (\n\tgithub.com/google/go-cmp v0.7.0\n\tgithub.com/mercari/grpc-federation v0.0.0-00010101000000-000000000000\n\tgo.opentelemetry.io/otel v1.24.0\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0\n\tgo.opentelemetry.io/otel/sdk v1.24.0\n\tgo.opentelemetry.io/otel/trace v1.24.0\n\tgo.uber.org/goleak v1.3.0\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7\n\tgoogle.golang.org/grpc v1.65.0\n\tgoogle.golang.org/protobuf v1.34.2\n)\n\nrequire (\n\tcel.dev/expr v0.19.1 // indirect\n\tgithub.com/antlr4-go/antlr/v4 v4.13.0 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.2.1 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/goccy/wasi-go v0.3.2 // indirect\n\tgithub.com/google/cel-go v0.23.1 // indirect\n\tgithub.com/google/uuid v1.6.0 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect\n\tgithub.com/kelseyhightower/envconfig v1.4.0 // indirect\n\tgithub.com/stealthrocket/wazergo v0.19.1 // indirect\n\tgithub.com/stoewer/go-strcase v1.3.0 // indirect\n\tgithub.com/stretchr/testify v1.10.0 // indirect\n\tgithub.com/tetratelabs/wazero v1.10.1 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.24.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.0.0 // indirect\n\tgolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect\n\tgolang.org/x/net v0.38.0 // indirect\n\tgolang.org/x/sync v0.14.0 // indirect\n\tgolang.org/x/sys v0.37.0 // indirect\n\tgolang.org/x/text v0.23.0 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 // indirect\n)\n"
  },
  {
    "path": "_examples/22_switch/go.sum",
    "content": "cel.dev/expr v0.19.1 h1:NciYrtDRIR0lNCnH1LFJegdjspNx9fI59O7TWcua/W4=\ncel.dev/expr v0.19.1/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw=\ngithub.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=\ngithub.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/goccy/wasi-go v0.3.2 h1:wAvGXmqCkfcp0B0AwIp5Ya53hzDwkKm9W8iuT3nCCz0=\ngithub.com/goccy/wasi-go v0.3.2/go.mod h1:nIKD204n9xa4Z20UV+XA483kIr9TAl2vXr+X5qVAO5M=\ngithub.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4=\ngithub.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=\ngithub.com/google/cel-go v0.23.1 h1:91ThhEZlBcE5rB2adBVXqvDoqdL8BG2oyhd0bK1I/r4=\ngithub.com/google/cel-go v0.23.1/go.mod h1:52Pb6QsDbC5kvgxvZhiL9QX1oZEkcUF/ZqaPx1J5Wwo=\ngithub.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\ngithub.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg=\ngithub.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=\ngithub.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/stealthrocket/wazergo v0.19.1 h1:BPrITETPgSFwiytwmToO0MbUC/+RGC39JScz1JmmG6c=\ngithub.com/stealthrocket/wazergo v0.19.1/go.mod h1:riI0hxw4ndZA5e6z7PesHg2BtTftcZaMxRcoiGGipTs=\ngithub.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs=\ngithub.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=\ngithub.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tetratelabs/wazero v1.10.1 h1:2DugeJf6VVk58KTPszlNfeeN8AhhpwcZqkJj2wwFuH8=\ngithub.com/tetratelabs/wazero v1.10.1/go.mod h1:DRm5twOQ5Gr1AoEdSi0CLjDQF1J9ZAuyqFIjl1KKfQU=\ngo.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo=\ngo.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0=\ngo.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI=\ngo.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=\ngo.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw=\ngo.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg=\ngo.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=\ngo.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=\ngo.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=\ngo.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=\ngolang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=\ngolang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=\ngolang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=\ngolang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=\ngolang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=\ngolang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=\ngolang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 h1:YcyjlL1PRr2Q17/I0dPk2JmYS5CDXfcdb2Z3YRioEbw=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7 h1:2035KHhUv+EpyB+hWgJnaWKJOdX1E95w2S8Rr4uWKTs=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=\ngoogle.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=\ngoogle.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=\ngoogle.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=\ngoogle.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "_examples/22_switch/grpc/federation/federation.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: grpc/federation/federation.proto\n\npackage federation\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\tcode \"google.golang.org/genproto/googleapis/rpc/code\"\n\terrdetails \"google.golang.org/genproto/googleapis/rpc/errdetails\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tdescriptorpb \"google.golang.org/protobuf/types/descriptorpb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// TypeKind is primitive kind list.\ntype TypeKind int32\n\nconst (\n\t// UNKNOWN represents unexpected value.\n\tTypeKind_UNKNOWN TypeKind = 0\n\t// STRING is used to convert the input value to `string` type.\n\tTypeKind_STRING TypeKind = 1\n\t// BOOL is used to convert the input value to `bool` type.\n\tTypeKind_BOOL TypeKind = 2\n\t// INT64 is used to convert the input value to `int64` type.\n\tTypeKind_INT64 TypeKind = 3\n\t// UINT64 is used to convert the input value to `uint64` type.\n\tTypeKind_UINT64 TypeKind = 4\n\t// DOUBLE is used to convert the input value to `double` type.\n\tTypeKind_DOUBLE TypeKind = 5\n\t// DURATION is used to convert the input value to the `google.protobuf.Duration` type.\n\tTypeKind_DURATION TypeKind = 6\n)\n\n// Enum value maps for TypeKind.\nvar (\n\tTypeKind_name = map[int32]string{\n\t\t0: \"UNKNOWN\",\n\t\t1: \"STRING\",\n\t\t2: \"BOOL\",\n\t\t3: \"INT64\",\n\t\t4: \"UINT64\",\n\t\t5: \"DOUBLE\",\n\t\t6: \"DURATION\",\n\t}\n\tTypeKind_value = map[string]int32{\n\t\t\"UNKNOWN\":  0,\n\t\t\"STRING\":   1,\n\t\t\"BOOL\":     2,\n\t\t\"INT64\":    3,\n\t\t\"UINT64\":   4,\n\t\t\"DOUBLE\":   5,\n\t\t\"DURATION\": 6,\n\t}\n)\n\nfunc (x TypeKind) Enum() *TypeKind {\n\tp := new(TypeKind)\n\t*p = x\n\treturn p\n}\n\nfunc (x TypeKind) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (TypeKind) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_grpc_federation_federation_proto_enumTypes[0].Descriptor()\n}\n\nfunc (TypeKind) Type() protoreflect.EnumType {\n\treturn &file_grpc_federation_federation_proto_enumTypes[0]\n}\n\nfunc (x TypeKind) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use TypeKind.Descriptor instead.\nfunc (TypeKind) EnumDescriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\n// LogLevel is the importance or severity of a log event.\ntype GRPCError_LogLevel int32\n\nconst (\n\t// UNKNOWN represents unexpected value.\n\tGRPCError_UNKNOWN GRPCError_LogLevel = 0\n\t// DEBUG is used for detailed information that is useful during development and debugging.\n\tGRPCError_DEBUG GRPCError_LogLevel = 1\n\t// INFO logs are used to provide information about the normal functioning of the application.\n\tGRPCError_INFO GRPCError_LogLevel = 2\n\t// WARN signifies a potential problem or warning that does not necessarily stop the program from working but may lead to issues in the future.\n\tGRPCError_WARN GRPCError_LogLevel = 3\n\t// ERROR indicates a serious issue that has caused a failure in the application.\n\tGRPCError_ERROR GRPCError_LogLevel = 4\n)\n\n// Enum value maps for GRPCError_LogLevel.\nvar (\n\tGRPCError_LogLevel_name = map[int32]string{\n\t\t0: \"UNKNOWN\",\n\t\t1: \"DEBUG\",\n\t\t2: \"INFO\",\n\t\t3: \"WARN\",\n\t\t4: \"ERROR\",\n\t}\n\tGRPCError_LogLevel_value = map[string]int32{\n\t\t\"UNKNOWN\": 0,\n\t\t\"DEBUG\":   1,\n\t\t\"INFO\":    2,\n\t\t\"WARN\":    3,\n\t\t\"ERROR\":   4,\n\t}\n)\n\nfunc (x GRPCError_LogLevel) Enum() *GRPCError_LogLevel {\n\tp := new(GRPCError_LogLevel)\n\t*p = x\n\treturn p\n}\n\nfunc (x GRPCError_LogLevel) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (GRPCError_LogLevel) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_grpc_federation_federation_proto_enumTypes[1].Descriptor()\n}\n\nfunc (GRPCError_LogLevel) Type() protoreflect.EnumType {\n\treturn &file_grpc_federation_federation_proto_enumTypes[1]\n}\n\nfunc (x GRPCError_LogLevel) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use GRPCError_LogLevel.Descriptor instead.\nfunc (GRPCError_LogLevel) EnumDescriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{24, 0}\n}\n\ntype FileRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPlugin *CELPlugin `protobuf:\"bytes,1,opt,name=plugin,proto3\" json:\"plugin,omitempty\"`\n\t// import can be used to resolve methods, messages, etc. that are referenced in gRPC Federation rules.\n\tImport []string `protobuf:\"bytes,2,rep,name=import,proto3\" json:\"import,omitempty\"`\n}\n\nfunc (x *FileRule) Reset() {\n\t*x = FileRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *FileRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*FileRule) ProtoMessage() {}\n\nfunc (x *FileRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use FileRule.ProtoReflect.Descriptor instead.\nfunc (*FileRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *FileRule) GetPlugin() *CELPlugin {\n\tif x != nil {\n\t\treturn x.Plugin\n\t}\n\treturn nil\n}\n\nfunc (x *FileRule) GetImport() []string {\n\tif x != nil {\n\t\treturn x.Import\n\t}\n\treturn nil\n}\n\ntype EnumRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// alias mapping between enums defined in other packages and enums defined on the federation service side.\n\t// The alias is the FQDN ( <package-name>.<enum-name> ) to the enum.\n\t// If this definition exists, type conversion is automatically performed before the enum value assignment operation.\n\t// If a enum with this option has a value that is not present in the enum specified by alias, and the alias option is not specified for that value, an error is occurred.\n\t// You can specify multiple aliases. In that case, only values common to all aliases will be considered.\n\t// Specifying a value that is not included in either alias will result in an error.\n\tAlias []string `protobuf:\"bytes,1,rep,name=alias,proto3\" json:\"alias,omitempty\"`\n}\n\nfunc (x *EnumRule) Reset() {\n\t*x = EnumRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumRule) ProtoMessage() {}\n\nfunc (x *EnumRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumRule.ProtoReflect.Descriptor instead.\nfunc (*EnumRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *EnumRule) GetAlias() []string {\n\tif x != nil {\n\t\treturn x.Alias\n\t}\n\treturn nil\n}\n\ntype EnumValueRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// specifies the default value of the enum.\n\t// All values other than those specified in alias will be default values.\n\tDefault *bool `protobuf:\"varint,1,opt,name=default,proto3,oneof\" json:\"default,omitempty\"`\n\t// alias can be used when alias is specified in grpc.federation.enum option,\n\t// and specifies the value name to be referenced among the enums specified in alias of enum option.\n\t// multiple value names can be specified for alias.\n\tAlias []string `protobuf:\"bytes,2,rep,name=alias,proto3\" json:\"alias,omitempty\"`\n\t// attr is used to hold multiple name-value pairs corresponding to an enum value.\n\t// The values specified by the name must be consistently specified for all enum values.\n\t// The values stored using this feature can be retrieved using the `attr()` method of the enum API.\n\tAttr []*EnumValueAttribute `protobuf:\"bytes,3,rep,name=attr,proto3\" json:\"attr,omitempty\"`\n\t// noalias exclude from the target of alias.\n\t// This option cannot be specified simultaneously with `default` or `alias`.\n\tNoalias *bool `protobuf:\"varint,4,opt,name=noalias,proto3,oneof\" json:\"noalias,omitempty\"`\n}\n\nfunc (x *EnumValueRule) Reset() {\n\t*x = EnumValueRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumValueRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumValueRule) ProtoMessage() {}\n\nfunc (x *EnumValueRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumValueRule.ProtoReflect.Descriptor instead.\nfunc (*EnumValueRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *EnumValueRule) GetDefault() bool {\n\tif x != nil && x.Default != nil {\n\t\treturn *x.Default\n\t}\n\treturn false\n}\n\nfunc (x *EnumValueRule) GetAlias() []string {\n\tif x != nil {\n\t\treturn x.Alias\n\t}\n\treturn nil\n}\n\nfunc (x *EnumValueRule) GetAttr() []*EnumValueAttribute {\n\tif x != nil {\n\t\treturn x.Attr\n\t}\n\treturn nil\n}\n\nfunc (x *EnumValueRule) GetNoalias() bool {\n\tif x != nil && x.Noalias != nil {\n\t\treturn *x.Noalias\n\t}\n\treturn false\n}\n\ntype EnumValueAttribute struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the attribute key.\n\t// This value is used to search for values using the `attr(<name>)` method.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// value represents the value corresponding to `name`.\n\tValue string `protobuf:\"bytes,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *EnumValueAttribute) Reset() {\n\t*x = EnumValueAttribute{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumValueAttribute) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumValueAttribute) ProtoMessage() {}\n\nfunc (x *EnumValueAttribute) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumValueAttribute.ProtoReflect.Descriptor instead.\nfunc (*EnumValueAttribute) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *EnumValueAttribute) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnumValueAttribute) GetValue() string {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn \"\"\n}\n\ntype OneofRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *OneofRule) Reset() {\n\t*x = OneofRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *OneofRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*OneofRule) ProtoMessage() {}\n\nfunc (x *OneofRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use OneofRule.ProtoReflect.Descriptor instead.\nfunc (*OneofRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{4}\n}\n\n// ServiceRule define gRPC Federation rules for the service.\ntype ServiceRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// env defines the environment variable.\n\tEnv *Env `protobuf:\"bytes,1,opt,name=env,proto3\" json:\"env,omitempty\"`\n\t// var defines the service-level variables.\n\tVar []*ServiceVariable `protobuf:\"bytes,2,rep,name=var,proto3\" json:\"var,omitempty\"`\n}\n\nfunc (x *ServiceRule) Reset() {\n\t*x = ServiceRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceRule) ProtoMessage() {}\n\nfunc (x *ServiceRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceRule.ProtoReflect.Descriptor instead.\nfunc (*ServiceRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *ServiceRule) GetEnv() *Env {\n\tif x != nil {\n\t\treturn x.Env\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceRule) GetVar() []*ServiceVariable {\n\tif x != nil {\n\t\treturn x.Var\n\t}\n\treturn nil\n}\n\n// Env is used when setting environment variables.\n// There are two ways to configure it.\ntype Env struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// var is used to directly list environment variables.\n\tVar []*EnvVar `protobuf:\"bytes,1,rep,name=var,proto3\" json:\"var,omitempty\"`\n\t// message is used to reference an already defined Protocol Buffers' message for defining environment variables.\n\t// If you want to set detailed options for the fields of the message, use the `env` option in FieldRule.\n\tMessage string `protobuf:\"bytes,2,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Env) Reset() {\n\t*x = Env{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Env) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Env) ProtoMessage() {}\n\nfunc (x *Env) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Env.ProtoReflect.Descriptor instead.\nfunc (*Env) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *Env) GetVar() []*EnvVar {\n\tif x != nil {\n\t\treturn x.Var\n\t}\n\treturn nil\n}\n\nfunc (x *Env) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\n// ServiceVariable define variables at the service level.\n// This definition is executed at server startup, after the initialization of Env.\n// The defined variables can be used across all messages that the service depends on.\ntype ServiceVariable struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is a variable name.\n\t// This name can be referenced in all CELs related to the service by using `grpc.federation.var.` prefix.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// if specify the condition for evaluating expr.\n\t// this value evaluated by CEL and it must return a boolean value.\n\t// If the result of evaluation is `false`, the value assigned to name is the default value of the result of evaluation of `expr`.\n\tIf *string `protobuf:\"bytes,2,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n\t// expr specify the value to be assigned to name.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*ServiceVariable_By\n\t//\t*ServiceVariable_Map\n\t//\t*ServiceVariable_Message\n\t//\t*ServiceVariable_Validation\n\t//\t*ServiceVariable_Enum\n\t//\t*ServiceVariable_Switch\n\tExpr isServiceVariable_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *ServiceVariable) Reset() {\n\t*x = ServiceVariable{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceVariable) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceVariable) ProtoMessage() {}\n\nfunc (x *ServiceVariable) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceVariable.ProtoReflect.Descriptor instead.\nfunc (*ServiceVariable) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{7}\n}\n\nfunc (x *ServiceVariable) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *ServiceVariable) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\nfunc (m *ServiceVariable) GetExpr() isServiceVariable_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetBy() string {\n\tif x, ok := x.GetExpr().(*ServiceVariable_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *ServiceVariable) GetMap() *MapExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetMessage() *MessageExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetValidation() *ServiceVariableValidationExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Validation); ok {\n\t\treturn x.Validation\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetEnum() *EnumExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetSwitch() *SwitchExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Switch); ok {\n\t\treturn x.Switch\n\t}\n\treturn nil\n}\n\ntype isServiceVariable_Expr interface {\n\tisServiceVariable_Expr()\n}\n\ntype ServiceVariable_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\ntype ServiceVariable_Map struct {\n\t// map apply map operation for the specified repeated type.\n\tMap *MapExpr `protobuf:\"bytes,12,opt,name=map,proto3,oneof\"`\n}\n\ntype ServiceVariable_Message struct {\n\t// message gets with message arguments.\n\tMessage *MessageExpr `protobuf:\"bytes,13,opt,name=message,proto3,oneof\"`\n}\n\ntype ServiceVariable_Validation struct {\n\t// validation defines the validation rule and message.\n\tValidation *ServiceVariableValidationExpr `protobuf:\"bytes,14,opt,name=validation,proto3,oneof\"`\n}\n\ntype ServiceVariable_Enum struct {\n\t// enum gets with cel value.\n\tEnum *EnumExpr `protobuf:\"bytes,15,opt,name=enum,proto3,oneof\"`\n}\n\ntype ServiceVariable_Switch struct {\n\t// switch provides conditional evaluation with multiple branches.\n\tSwitch *SwitchExpr `protobuf:\"bytes,16,opt,name=switch,proto3,oneof\"`\n}\n\nfunc (*ServiceVariable_By) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Map) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Message) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Validation) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Enum) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Switch) isServiceVariable_Expr() {}\n\n// ServiceVariableValidationExpr represents validation rule and error message.\ntype ServiceVariableValidationExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// if specifies condition in CEL. If the condition is true, it returns error.\n\t// The return value must always be of type boolean.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3\" json:\"if,omitempty\"`\n\t// message is a error message in CEL.\n\tMessage string `protobuf:\"bytes,2,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *ServiceVariableValidationExpr) Reset() {\n\t*x = ServiceVariableValidationExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceVariableValidationExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceVariableValidationExpr) ProtoMessage() {}\n\nfunc (x *ServiceVariableValidationExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceVariableValidationExpr.ProtoReflect.Descriptor instead.\nfunc (*ServiceVariableValidationExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{8}\n}\n\nfunc (x *ServiceVariableValidationExpr) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *ServiceVariableValidationExpr) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\n// EnvVar represents an environment variable.\ntype EnvVar struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is an environment variable name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// type is an environment variable type.\n\tType *EnvType `protobuf:\"bytes,2,opt,name=type,proto3\" json:\"type,omitempty\"`\n\t// option is an additional option for parsing environment variable.\n\tOption *EnvVarOption `protobuf:\"bytes,3,opt,name=option,proto3,oneof\" json:\"option,omitempty\"`\n}\n\nfunc (x *EnvVar) Reset() {\n\t*x = EnvVar{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvVar) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvVar) ProtoMessage() {}\n\nfunc (x *EnvVar) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvVar.ProtoReflect.Descriptor instead.\nfunc (*EnvVar) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{9}\n}\n\nfunc (x *EnvVar) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnvVar) GetType() *EnvType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nfunc (x *EnvVar) GetOption() *EnvVarOption {\n\tif x != nil {\n\t\treturn x.Option\n\t}\n\treturn nil\n}\n\n// EnvType represents type information for environment variable.\ntype EnvType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to Type:\n\t//\n\t//\t*EnvType_Kind\n\t//\t*EnvType_Repeated\n\t//\t*EnvType_Map\n\tType isEnvType_Type `protobuf_oneof:\"type\"`\n}\n\nfunc (x *EnvType) Reset() {\n\t*x = EnvType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[10]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvType) ProtoMessage() {}\n\nfunc (x *EnvType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[10]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvType.ProtoReflect.Descriptor instead.\nfunc (*EnvType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{10}\n}\n\nfunc (m *EnvType) GetType() isEnvType_Type {\n\tif m != nil {\n\t\treturn m.Type\n\t}\n\treturn nil\n}\n\nfunc (x *EnvType) GetKind() TypeKind {\n\tif x, ok := x.GetType().(*EnvType_Kind); ok {\n\t\treturn x.Kind\n\t}\n\treturn TypeKind_UNKNOWN\n}\n\nfunc (x *EnvType) GetRepeated() *EnvType {\n\tif x, ok := x.GetType().(*EnvType_Repeated); ok {\n\t\treturn x.Repeated\n\t}\n\treturn nil\n}\n\nfunc (x *EnvType) GetMap() *EnvMapType {\n\tif x, ok := x.GetType().(*EnvType_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\ntype isEnvType_Type interface {\n\tisEnvType_Type()\n}\n\ntype EnvType_Kind struct {\n\t// kind is used when the type is a primitive type.\n\tKind TypeKind `protobuf:\"varint,1,opt,name=kind,proto3,enum=grpc.federation.TypeKind,oneof\"`\n}\n\ntype EnvType_Repeated struct {\n\t// repeated is used when the type is a repeated type.\n\tRepeated *EnvType `protobuf:\"bytes,2,opt,name=repeated,proto3,oneof\"`\n}\n\ntype EnvType_Map struct {\n\t// map is used when the type is a map type.\n\tMap *EnvMapType `protobuf:\"bytes,3,opt,name=map,proto3,oneof\"`\n}\n\nfunc (*EnvType_Kind) isEnvType_Type() {}\n\nfunc (*EnvType_Repeated) isEnvType_Type() {}\n\nfunc (*EnvType_Map) isEnvType_Type() {}\n\n// EnvMapType represents map type.\ntype EnvMapType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// key represents map's key type.\n\tKey *EnvType `protobuf:\"bytes,1,opt,name=key,proto3\" json:\"key,omitempty\"`\n\t// value represents map's value type.\n\tValue *EnvType `protobuf:\"bytes,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *EnvMapType) Reset() {\n\t*x = EnvMapType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[11]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvMapType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvMapType) ProtoMessage() {}\n\nfunc (x *EnvMapType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[11]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvMapType.ProtoReflect.Descriptor instead.\nfunc (*EnvMapType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{11}\n}\n\nfunc (x *EnvMapType) GetKey() *EnvType {\n\tif x != nil {\n\t\treturn x.Key\n\t}\n\treturn nil\n}\n\nfunc (x *EnvMapType) GetValue() *EnvType {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn nil\n}\n\n// EnvVarOption represents additional option for environment variable.\n// The option work with the `envconfig` library in Go language.\n// For detailed specifications, please refer to the library's documentation ( https://pkg.go.dev/github.com/kelseyhightower/envconfig#section-readme ).\ntype EnvVarOption struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// alternate use this option if you want to use an environment variable with a different name than the value specified in `EnvVar.name`.\n\tAlternate *string `protobuf:\"bytes,1,opt,name=alternate,proto3,oneof\" json:\"alternate,omitempty\"`\n\t// default specify the value to use as a fallback if the specified environment variable is not found.\n\tDefault *string `protobuf:\"bytes,2,opt,name=default,proto3,oneof\" json:\"default,omitempty\"`\n\t// required require the environment variable to exist.\n\t// If it does not exist, an error will occur at startup.\n\tRequired *bool `protobuf:\"varint,3,opt,name=required,proto3,oneof\" json:\"required,omitempty\"`\n\t// ignored if ignored is true, it does nothing even if the environment variable exists.\n\tIgnored *bool `protobuf:\"varint,4,opt,name=ignored,proto3,oneof\" json:\"ignored,omitempty\"`\n}\n\nfunc (x *EnvVarOption) Reset() {\n\t*x = EnvVarOption{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[12]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvVarOption) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvVarOption) ProtoMessage() {}\n\nfunc (x *EnvVarOption) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[12]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvVarOption.ProtoReflect.Descriptor instead.\nfunc (*EnvVarOption) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{12}\n}\n\nfunc (x *EnvVarOption) GetAlternate() string {\n\tif x != nil && x.Alternate != nil {\n\t\treturn *x.Alternate\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnvVarOption) GetDefault() string {\n\tif x != nil && x.Default != nil {\n\t\treturn *x.Default\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnvVarOption) GetRequired() bool {\n\tif x != nil && x.Required != nil {\n\t\treturn *x.Required\n\t}\n\treturn false\n}\n\nfunc (x *EnvVarOption) GetIgnored() bool {\n\tif x != nil && x.Ignored != nil {\n\t\treturn *x.Ignored\n\t}\n\treturn false\n}\n\ntype MethodRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// the time to timeout. If the specified time period elapses, DEADLINE_EXCEEDED status is returned.\n\t// If you want to handle this error, you need to implement a custom error handler in Go.\n\t// The format is the same as Go's time.Duration format. See https://pkg.go.dev/time#ParseDuration.\n\tTimeout *string `protobuf:\"bytes,1,opt,name=timeout,proto3,oneof\" json:\"timeout,omitempty\"`\n\t// response specify the name of the message you want to use to create the response value.\n\t// If you specify a reserved type like `google.protobuf.Empty` as the response, you cannot define gRPC Federation options.\n\t// In such cases, you can specify a separate message to create the response value.\n\t// The specified response message must contain fields with the same names and types as all the fields in the original response.\n\tResponse *string `protobuf:\"bytes,2,opt,name=response,proto3,oneof\" json:\"response,omitempty\"`\n}\n\nfunc (x *MethodRule) Reset() {\n\t*x = MethodRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[13]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MethodRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MethodRule) ProtoMessage() {}\n\nfunc (x *MethodRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[13]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MethodRule.ProtoReflect.Descriptor instead.\nfunc (*MethodRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{13}\n}\n\nfunc (x *MethodRule) GetTimeout() string {\n\tif x != nil && x.Timeout != nil {\n\t\treturn *x.Timeout\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodRule) GetResponse() string {\n\tif x != nil && x.Response != nil {\n\t\treturn *x.Response\n\t}\n\treturn \"\"\n}\n\n// MessageRule define gRPC Federation rules for the message.\ntype MessageRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// def specify variables to be used in field binding by `grpc.federation.field` option.\n\tDef []*VariableDefinition `protobuf:\"bytes,1,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// if custom_resolver is true, the resolver for this message is implemented by Go.\n\t// If there are any values retrieved by resolver or messages, they are passed as arguments for custom resolver.\n\t// Each field of the message returned by the custom resolver is automatically bound.\n\t// If you want to change the binding process for a particular field, set `custom_resolver=true` option for that field.\n\tCustomResolver *bool `protobuf:\"varint,2,opt,name=custom_resolver,json=customResolver,proto3,oneof\" json:\"custom_resolver,omitempty\"`\n\t// alias mapping between messages defined in other packages and messages defined on the federation service side.\n\t// The alias is the FQDN ( <package-name>.<message-name> ) to the message.\n\t// If this definition exists, type conversion is automatically performed before the field assignment operation.\n\t// If a message with this option has a field that is not present in the message specified by alias, and the alias option is not specified for that field, an error is occurred.\n\t// You can specify multiple aliases. In that case, only fields common to all aliases will be considered.\n\t// Specifying a field that is not included in either alias will result in an error.\n\tAlias []string `protobuf:\"bytes,3,rep,name=alias,proto3\" json:\"alias,omitempty\"`\n}\n\nfunc (x *MessageRule) Reset() {\n\t*x = MessageRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[14]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MessageRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MessageRule) ProtoMessage() {}\n\nfunc (x *MessageRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[14]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MessageRule.ProtoReflect.Descriptor instead.\nfunc (*MessageRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{14}\n}\n\nfunc (x *MessageRule) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *MessageRule) GetCustomResolver() bool {\n\tif x != nil && x.CustomResolver != nil {\n\t\treturn *x.CustomResolver\n\t}\n\treturn false\n}\n\nfunc (x *MessageRule) GetAlias() []string {\n\tif x != nil {\n\t\treturn x.Alias\n\t}\n\treturn nil\n}\n\n// VariableDefinition represents variable definition.\ntype VariableDefinition struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is a variable name.\n\t// This name can be referenced in all CELs defined after itself in the same message.\n\t// It can also be referenced in `grpc.federation.field` option.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// if specify the condition for evaluating expr.\n\t// this value evaluated by CEL and it must return a boolean value.\n\t// If the result of evaluation is `false`, the value assigned to name is the default value of the result of evaluation of `expr`.\n\tIf *string `protobuf:\"bytes,2,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n\t// autobind if the result value of `expr` is a message type,\n\t// the value of a field with the same name and type as the field name of its own message is automatically assigned to the value of the field in the message.\n\t// If multiple autobinds are used at the same message,\n\t// you must explicitly use the `grpc.federation.field` option to do the binding yourself, since duplicate field names cannot be correctly determined as one.\n\tAutobind *bool `protobuf:\"varint,3,opt,name=autobind,proto3,oneof\" json:\"autobind,omitempty\"`\n\t// expr specify the value to be assigned to name.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*VariableDefinition_By\n\t//\t*VariableDefinition_Map\n\t//\t*VariableDefinition_Message\n\t//\t*VariableDefinition_Call\n\t//\t*VariableDefinition_Validation\n\t//\t*VariableDefinition_Enum\n\t//\t*VariableDefinition_Switch\n\tExpr isVariableDefinition_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *VariableDefinition) Reset() {\n\t*x = VariableDefinition{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[15]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *VariableDefinition) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*VariableDefinition) ProtoMessage() {}\n\nfunc (x *VariableDefinition) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[15]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use VariableDefinition.ProtoReflect.Descriptor instead.\nfunc (*VariableDefinition) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{15}\n}\n\nfunc (x *VariableDefinition) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *VariableDefinition) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *VariableDefinition) GetAutobind() bool {\n\tif x != nil && x.Autobind != nil {\n\t\treturn *x.Autobind\n\t}\n\treturn false\n}\n\nfunc (m *VariableDefinition) GetExpr() isVariableDefinition_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetBy() string {\n\tif x, ok := x.GetExpr().(*VariableDefinition_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *VariableDefinition) GetMap() *MapExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetMessage() *MessageExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetCall() *CallExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Call); ok {\n\t\treturn x.Call\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetValidation() *ValidationExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Validation); ok {\n\t\treturn x.Validation\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetEnum() *EnumExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetSwitch() *SwitchExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Switch); ok {\n\t\treturn x.Switch\n\t}\n\treturn nil\n}\n\ntype isVariableDefinition_Expr interface {\n\tisVariableDefinition_Expr()\n}\n\ntype VariableDefinition_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\ntype VariableDefinition_Map struct {\n\t// map apply map operation for the specified repeated type.\n\tMap *MapExpr `protobuf:\"bytes,12,opt,name=map,proto3,oneof\"`\n}\n\ntype VariableDefinition_Message struct {\n\t// message gets with message arguments.\n\tMessage *MessageExpr `protobuf:\"bytes,13,opt,name=message,proto3,oneof\"`\n}\n\ntype VariableDefinition_Call struct {\n\t// call specifies how to call gRPC method.\n\tCall *CallExpr `protobuf:\"bytes,14,opt,name=call,proto3,oneof\"`\n}\n\ntype VariableDefinition_Validation struct {\n\t// validation defines the validation rule and error.\n\tValidation *ValidationExpr `protobuf:\"bytes,15,opt,name=validation,proto3,oneof\"`\n}\n\ntype VariableDefinition_Enum struct {\n\t// enum gets with cel value.\n\tEnum *EnumExpr `protobuf:\"bytes,16,opt,name=enum,proto3,oneof\"`\n}\n\ntype VariableDefinition_Switch struct {\n\t// switch provides conditional evaluation with multiple branches.\n\tSwitch *SwitchExpr `protobuf:\"bytes,17,opt,name=switch,proto3,oneof\"`\n}\n\nfunc (*VariableDefinition_By) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Map) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Message) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Call) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Validation) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Enum) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Switch) isVariableDefinition_Expr() {}\n\n// MapExpr apply map operation for the specified repeated type.\ntype MapExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// iterator define iterator variable.\n\t// When evaluating CEL in `expr`, we can refer to the name defined in iterator.\n\tIterator *Iterator `protobuf:\"bytes,1,opt,name=iterator,proto3\" json:\"iterator,omitempty\"`\n\t// expr creates map elements using iterator variable.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*MapExpr_By\n\t//\t*MapExpr_Message\n\t//\t*MapExpr_Enum\n\tExpr isMapExpr_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *MapExpr) Reset() {\n\t*x = MapExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[16]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MapExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MapExpr) ProtoMessage() {}\n\nfunc (x *MapExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[16]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MapExpr.ProtoReflect.Descriptor instead.\nfunc (*MapExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{16}\n}\n\nfunc (x *MapExpr) GetIterator() *Iterator {\n\tif x != nil {\n\t\treturn x.Iterator\n\t}\n\treturn nil\n}\n\nfunc (m *MapExpr) GetExpr() isMapExpr_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *MapExpr) GetBy() string {\n\tif x, ok := x.GetExpr().(*MapExpr_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *MapExpr) GetMessage() *MessageExpr {\n\tif x, ok := x.GetExpr().(*MapExpr_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *MapExpr) GetEnum() *EnumExpr {\n\tif x, ok := x.GetExpr().(*MapExpr_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn nil\n}\n\ntype isMapExpr_Expr interface {\n\tisMapExpr_Expr()\n}\n\ntype MapExpr_By struct {\n\t// `by` evaluates with CEL.\n\t// this can refer to the variable declared by `iterator`.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\ntype MapExpr_Message struct {\n\t// message gets with message arguments, and it is made an element of the map.\n\t// The result type of MapExpr is the repeated type of the specified message.\n\tMessage *MessageExpr `protobuf:\"bytes,12,opt,name=message,proto3,oneof\"`\n}\n\ntype MapExpr_Enum struct {\n\t// enum creates enum value for each element of the map.\n\t// The result type of MapExpr is the repeated type of the specified enum.\n\tEnum *EnumExpr `protobuf:\"bytes,13,opt,name=enum,proto3,oneof\"`\n}\n\nfunc (*MapExpr_By) isMapExpr_Expr() {}\n\nfunc (*MapExpr_Message) isMapExpr_Expr() {}\n\nfunc (*MapExpr_Enum) isMapExpr_Expr() {}\n\n// Iterator represents iterator variable.\ntype Iterator struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// variable name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// src the value that will be the source for creating the iterator.\n\t// src must be a repeated type.\n\tSrc string `protobuf:\"bytes,2,opt,name=src,proto3\" json:\"src,omitempty\"`\n}\n\nfunc (x *Iterator) Reset() {\n\t*x = Iterator{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[17]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Iterator) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Iterator) ProtoMessage() {}\n\nfunc (x *Iterator) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[17]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Iterator.ProtoReflect.Descriptor instead.\nfunc (*Iterator) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{17}\n}\n\nfunc (x *Iterator) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Iterator) GetSrc() string {\n\tif x != nil {\n\t\treturn x.Src\n\t}\n\treturn \"\"\n}\n\n// MessageExpr represents dependent message.\ntype MessageExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name specify the message name by FQDN. format is `<package-name>.<message-name>`.\n\t// <package-name> can be omitted when referring to messages in the same package.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// args specify the parameters needed to get the message. This is called the \"message arguments\".\n\tArgs []*Argument `protobuf:\"bytes,2,rep,name=args,proto3\" json:\"args,omitempty\"`\n}\n\nfunc (x *MessageExpr) Reset() {\n\t*x = MessageExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[18]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MessageExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MessageExpr) ProtoMessage() {}\n\nfunc (x *MessageExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[18]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MessageExpr.ProtoReflect.Descriptor instead.\nfunc (*MessageExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{18}\n}\n\nfunc (x *MessageExpr) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *MessageExpr) GetArgs() []*Argument {\n\tif x != nil {\n\t\treturn x.Args\n\t}\n\treturn nil\n}\n\n// EnumExpr represents dependent enum.\ntype EnumExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name specify the enum name by FQDN. format is `<package-name>.<enum-name>`.\n\t// <package-name> can be omitted when referring to enum in the same package.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,2,opt,name=by,proto3\" json:\"by,omitempty\"`\n}\n\nfunc (x *EnumExpr) Reset() {\n\t*x = EnumExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[19]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumExpr) ProtoMessage() {}\n\nfunc (x *EnumExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[19]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumExpr.ProtoReflect.Descriptor instead.\nfunc (*EnumExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{19}\n}\n\nfunc (x *EnumExpr) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnumExpr) GetBy() string {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\n// CallExpr represents how to call gRPC method.\ntype CallExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// method specify the FQDN for the gRPC method. format is `<package-name>.<service-name>/<method-name>`.\n\tMethod string `protobuf:\"bytes,1,opt,name=method,proto3\" json:\"method,omitempty\"`\n\t// request specify request parameters for the gRPC method.\n\tRequest []*MethodRequest `protobuf:\"bytes,2,rep,name=request,proto3\" json:\"request,omitempty\"`\n\t// the time to timeout. If the specified time period elapses, DEADLINE_EXCEEDED status is returned.\n\t// If you want to handle this error, you need to implement a custom error handler in Go.\n\t// The format is the same as Go's time.Duration format. See https://pkg.go.dev/time#ParseDuration.\n\tTimeout *string `protobuf:\"bytes,3,opt,name=timeout,proto3,oneof\" json:\"timeout,omitempty\"`\n\t// retry specifies the retry policy if the method call fails.\n\tRetry *RetryPolicy `protobuf:\"bytes,4,opt,name=retry,proto3,oneof\" json:\"retry,omitempty\"`\n\t// error evaluated when an error occurs during a method call.\n\t// Multiple errors can be defined and are evaluated in the order in which they are described.\n\t// If an error occurs while creating an gRPC status error, original error will be returned.\n\tError []*GRPCError `protobuf:\"bytes,5,rep,name=error,proto3\" json:\"error,omitempty\"`\n\t// option is the gRPC's call option (https://pkg.go.dev/google.golang.org/grpc#CallOption).\n\tOption *GRPCCallOption `protobuf:\"bytes,6,opt,name=option,proto3,oneof\" json:\"option,omitempty\"`\n\t// metadata specify outgoing metadata with CEL value.\n\t// The specified type must always be of type map<string, repeated string>.\n\tMetadata *string `protobuf:\"bytes,7,opt,name=metadata,proto3,oneof\" json:\"metadata,omitempty\"`\n}\n\nfunc (x *CallExpr) Reset() {\n\t*x = CallExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[20]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CallExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CallExpr) ProtoMessage() {}\n\nfunc (x *CallExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[20]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CallExpr.ProtoReflect.Descriptor instead.\nfunc (*CallExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{20}\n}\n\nfunc (x *CallExpr) GetMethod() string {\n\tif x != nil {\n\t\treturn x.Method\n\t}\n\treturn \"\"\n}\n\nfunc (x *CallExpr) GetRequest() []*MethodRequest {\n\tif x != nil {\n\t\treturn x.Request\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetTimeout() string {\n\tif x != nil && x.Timeout != nil {\n\t\treturn *x.Timeout\n\t}\n\treturn \"\"\n}\n\nfunc (x *CallExpr) GetRetry() *RetryPolicy {\n\tif x != nil {\n\t\treturn x.Retry\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetError() []*GRPCError {\n\tif x != nil {\n\t\treturn x.Error\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetOption() *GRPCCallOption {\n\tif x != nil {\n\t\treturn x.Option\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetMetadata() string {\n\tif x != nil && x.Metadata != nil {\n\t\treturn *x.Metadata\n\t}\n\treturn \"\"\n}\n\n// SwitchExpr represents a switch statement. At least one \"case\", and \"default\", must be defined. All\n// case.if expressions must evaluate to a boolean value. All case.by expressions, and default.by, must\n// evaluate to the same type (the return type of the switch).\n//\n// When executed, the case.if expressions are evaluated in order, and, for the first case whose\n// case.if expression evaluates to true, its case.by is evaluated to make the return value of the\n// SwitchExpr.\n// If no case.if evaluates to true, default.by is evaluated to make the return value.\ntype SwitchExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Cases for the switch expression.\n\tCase []*SwitchCaseExpr `protobuf:\"bytes,1,rep,name=case,proto3\" json:\"case,omitempty\"`\n\t// The default case, if none of the \"case.if\" expressions evaluate to true.\n\tDefault *SwitchDefaultExpr `protobuf:\"bytes,2,opt,name=default,proto3\" json:\"default,omitempty\"`\n}\n\nfunc (x *SwitchExpr) Reset() {\n\t*x = SwitchExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[21]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SwitchExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SwitchExpr) ProtoMessage() {}\n\nfunc (x *SwitchExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[21]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SwitchExpr.ProtoReflect.Descriptor instead.\nfunc (*SwitchExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{21}\n}\n\nfunc (x *SwitchExpr) GetCase() []*SwitchCaseExpr {\n\tif x != nil {\n\t\treturn x.Case\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchExpr) GetDefault() *SwitchDefaultExpr {\n\tif x != nil {\n\t\treturn x.Default\n\t}\n\treturn nil\n}\n\n// SwitchCaseExpr represents a single case for a switch expression.\ntype SwitchCaseExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// if specify the condition for evaluating expr.\n\t// this value evaluated by CEL and it must return a boolean value.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3\" json:\"if,omitempty\"`\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,2,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// expr specify the value to return for the case.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*SwitchCaseExpr_By\n\tExpr isSwitchCaseExpr_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *SwitchCaseExpr) Reset() {\n\t*x = SwitchCaseExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[22]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SwitchCaseExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SwitchCaseExpr) ProtoMessage() {}\n\nfunc (x *SwitchCaseExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[22]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SwitchCaseExpr.ProtoReflect.Descriptor instead.\nfunc (*SwitchCaseExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{22}\n}\n\nfunc (x *SwitchCaseExpr) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *SwitchCaseExpr) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (m *SwitchCaseExpr) GetExpr() isSwitchCaseExpr_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchCaseExpr) GetBy() string {\n\tif x, ok := x.GetExpr().(*SwitchCaseExpr_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\ntype isSwitchCaseExpr_Expr interface {\n\tisSwitchCaseExpr_Expr()\n}\n\ntype SwitchCaseExpr_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\nfunc (*SwitchCaseExpr_By) isSwitchCaseExpr_Expr() {}\n\n// SwitchDefaultExpr represents the default case for a switch expression.\ntype SwitchDefaultExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,1,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// expr specify the value to return for the default case.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*SwitchDefaultExpr_By\n\tExpr isSwitchDefaultExpr_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *SwitchDefaultExpr) Reset() {\n\t*x = SwitchDefaultExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[23]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SwitchDefaultExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SwitchDefaultExpr) ProtoMessage() {}\n\nfunc (x *SwitchDefaultExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[23]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SwitchDefaultExpr.ProtoReflect.Descriptor instead.\nfunc (*SwitchDefaultExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{23}\n}\n\nfunc (x *SwitchDefaultExpr) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (m *SwitchDefaultExpr) GetExpr() isSwitchDefaultExpr_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchDefaultExpr) GetBy() string {\n\tif x, ok := x.GetExpr().(*SwitchDefaultExpr_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\ntype isSwitchDefaultExpr_Expr interface {\n\tisSwitchDefaultExpr_Expr()\n}\n\ntype SwitchDefaultExpr_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\nfunc (*SwitchDefaultExpr_By) isSwitchDefaultExpr_Expr() {}\n\n// GRPCError create gRPC status value.\ntype GRPCError struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,1,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// if specifies condition in CEL. If the condition is true, it returns defined error information.\n\t// If this field is omitted, it is always treated as 'true' and returns defined error information.\n\t// The return value must always be of type boolean.\n\tIf *string `protobuf:\"bytes,2,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n\t// code is a gRPC status code.\n\tCode *code.Code `protobuf:\"varint,3,opt,name=code,proto3,enum=google.rpc.Code,oneof\" json:\"code,omitempty\"`\n\t// message is a gRPC status message.\n\t// If omitted, the message will be auto-generated from the configurations.\n\tMessage *string `protobuf:\"bytes,4,opt,name=message,proto3,oneof\" json:\"message,omitempty\"`\n\t// details is a list of error details.\n\t// If returns error, the corresponding error details are set.\n\tDetails []*GRPCErrorDetail `protobuf:\"bytes,5,rep,name=details,proto3\" json:\"details,omitempty\"`\n\t// ignore ignore the error if the condition in the \"if\" field is true and \"ignore\" field is set to true.\n\t// When an error is ignored, the returned response is always null value.\n\t// If you want to return a response that is not null, please use `ignore_and_response` feature.\n\t// Therefore, `ignore` and `ignore_and_response` cannot be specified same.\n\tIgnore *bool `protobuf:\"varint,6,opt,name=ignore,proto3,oneof\" json:\"ignore,omitempty\"`\n\t// ignore_and_response ignore the error if the condition in the \"if\" field is true and it returns response specified in CEL.\n\t// The evaluation value of CEL must always be the same as the response message type.\n\t// `ignore` and `ignore_and_response` cannot be specified same.\n\tIgnoreAndResponse *string `protobuf:\"bytes,7,opt,name=ignore_and_response,json=ignoreAndResponse,proto3,oneof\" json:\"ignore_and_response,omitempty\"`\n\t// log_level can be configured to output logs as any log level.\n\t// If DEBUG is specified for the log_level, logs are output as debug logs.\n\t// default value is ERROR.\n\tLogLevel *GRPCError_LogLevel `protobuf:\"varint,8,opt,name=log_level,json=logLevel,proto3,enum=grpc.federation.GRPCError_LogLevel,oneof\" json:\"log_level,omitempty\"`\n}\n\nfunc (x *GRPCError) Reset() {\n\t*x = GRPCError{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[24]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GRPCError) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GRPCError) ProtoMessage() {}\n\nfunc (x *GRPCError) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[24]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GRPCError.ProtoReflect.Descriptor instead.\nfunc (*GRPCError) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{24}\n}\n\nfunc (x *GRPCError) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCError) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCError) GetCode() code.Code {\n\tif x != nil && x.Code != nil {\n\t\treturn *x.Code\n\t}\n\treturn code.Code(0)\n}\n\nfunc (x *GRPCError) GetMessage() string {\n\tif x != nil && x.Message != nil {\n\t\treturn *x.Message\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCError) GetDetails() []*GRPCErrorDetail {\n\tif x != nil {\n\t\treturn x.Details\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCError) GetIgnore() bool {\n\tif x != nil && x.Ignore != nil {\n\t\treturn *x.Ignore\n\t}\n\treturn false\n}\n\nfunc (x *GRPCError) GetIgnoreAndResponse() string {\n\tif x != nil && x.IgnoreAndResponse != nil {\n\t\treturn *x.IgnoreAndResponse\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCError) GetLogLevel() GRPCError_LogLevel {\n\tif x != nil && x.LogLevel != nil {\n\t\treturn *x.LogLevel\n\t}\n\treturn GRPCError_UNKNOWN\n}\n\ntype GRPCErrorDetail struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// if specifies condition rule in CEL. If the condition is true, gRPC error detail is added to the error.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3\" json:\"if,omitempty\"`\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,2,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// message represents arbitrary messages to describe the detail of the error.\n\tMessage []*MessageExpr `protobuf:\"bytes,3,rep,name=message,proto3\" json:\"message,omitempty\"`\n\t// error_info describes the cause of the error with structured details.\n\tErrorInfo []*errdetails.ErrorInfo `protobuf:\"bytes,4,rep,name=error_info,json=errorInfo,proto3\" json:\"error_info,omitempty\"`\n\t// retry_info describes when the clients can retry a failed request.\n\tRetryInfo []*errdetails.RetryInfo `protobuf:\"bytes,5,rep,name=retry_info,json=retryInfo,proto3\" json:\"retry_info,omitempty\"`\n\t// debug_info describes additional debugging info.\n\tDebugInfo []*errdetails.DebugInfo `protobuf:\"bytes,6,rep,name=debug_info,json=debugInfo,proto3\" json:\"debug_info,omitempty\"`\n\t// quota_failure describes how a quota check failed.\n\tQuotaFailure []*errdetails.QuotaFailure `protobuf:\"bytes,7,rep,name=quota_failure,json=quotaFailure,proto3\" json:\"quota_failure,omitempty\"`\n\t// precondition_failure describes what preconditions have failed.\n\tPreconditionFailure []*errdetails.PreconditionFailure `protobuf:\"bytes,8,rep,name=precondition_failure,json=preconditionFailure,proto3\" json:\"precondition_failure,omitempty\"`\n\t// bad_request describes violations in a client request.\n\tBadRequest []*errdetails.BadRequest `protobuf:\"bytes,9,rep,name=bad_request,json=badRequest,proto3\" json:\"bad_request,omitempty\"`\n\t// request_info contains metadata about the request that clients can attach.\n\tRequestInfo []*errdetails.RequestInfo `protobuf:\"bytes,10,rep,name=request_info,json=requestInfo,proto3\" json:\"request_info,omitempty\"`\n\t// resource_info describes the resource that is being accessed.\n\tResourceInfo []*errdetails.ResourceInfo `protobuf:\"bytes,11,rep,name=resource_info,json=resourceInfo,proto3\" json:\"resource_info,omitempty\"`\n\t// help provides links to documentation or for performing an out of band action.\n\tHelp []*errdetails.Help `protobuf:\"bytes,12,rep,name=help,proto3\" json:\"help,omitempty\"`\n\t// localized_message provides a localized error message that is safe to return to the user.\n\tLocalizedMessage []*errdetails.LocalizedMessage `protobuf:\"bytes,13,rep,name=localized_message,json=localizedMessage,proto3\" json:\"localized_message,omitempty\"`\n\t// by specify a message in CEL to express the details of the error.\n\tBy []string `protobuf:\"bytes,14,rep,name=by,proto3\" json:\"by,omitempty\"`\n}\n\nfunc (x *GRPCErrorDetail) Reset() {\n\t*x = GRPCErrorDetail{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[25]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GRPCErrorDetail) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GRPCErrorDetail) ProtoMessage() {}\n\nfunc (x *GRPCErrorDetail) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[25]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GRPCErrorDetail.ProtoReflect.Descriptor instead.\nfunc (*GRPCErrorDetail) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{25}\n}\n\nfunc (x *GRPCErrorDetail) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCErrorDetail) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetMessage() []*MessageExpr {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetErrorInfo() []*errdetails.ErrorInfo {\n\tif x != nil {\n\t\treturn x.ErrorInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetRetryInfo() []*errdetails.RetryInfo {\n\tif x != nil {\n\t\treturn x.RetryInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetDebugInfo() []*errdetails.DebugInfo {\n\tif x != nil {\n\t\treturn x.DebugInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetQuotaFailure() []*errdetails.QuotaFailure {\n\tif x != nil {\n\t\treturn x.QuotaFailure\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetPreconditionFailure() []*errdetails.PreconditionFailure {\n\tif x != nil {\n\t\treturn x.PreconditionFailure\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetBadRequest() []*errdetails.BadRequest {\n\tif x != nil {\n\t\treturn x.BadRequest\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetRequestInfo() []*errdetails.RequestInfo {\n\tif x != nil {\n\t\treturn x.RequestInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetResourceInfo() []*errdetails.ResourceInfo {\n\tif x != nil {\n\t\treturn x.ResourceInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetHelp() []*errdetails.Help {\n\tif x != nil {\n\t\treturn x.Help\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetLocalizedMessage() []*errdetails.LocalizedMessage {\n\tif x != nil {\n\t\treturn x.LocalizedMessage\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetBy() []string {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn nil\n}\n\n// GRPCCallOption configures a gRPC Call before it starts or extracts information from a gRPC Call after it completes.\ntype GRPCCallOption struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// set the content-subtype. For example, if content-subtype is \"json\", the Content-Type over the wire will be \"application/grpc+json\".\n\t// The content-subtype is converted to lowercase before being included in Content-Type.\n\t// See Content-Type on https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests for more details.\n\t// If no such codec is found, the call will result in an error with code INTERNAL.\n\tContentSubtype *string `protobuf:\"bytes,1,opt,name=content_subtype,json=contentSubtype,proto3,oneof\" json:\"content_subtype,omitempty\"`\n\t// header retrieves the header metadata for a unary RPC.\n\t// In order to obtain the metadata, you must specify a variable of type map<string, repeated string> in the header.\n\t// e.g.)\n\t// def [\n\t//\n\t//\t{ name: \"hdr\" by: \"grpc.federation.metadata.new()\" }\n\t//\t{ call { method: \"pkg.Method\" option { header: \"hdr\" } } }\n\t//\n\t// ]\n\tHeader *string `protobuf:\"bytes,2,opt,name=header,proto3,oneof\" json:\"header,omitempty\"`\n\t// max_call_recv_msg_size sets the maximum message size in bytes the client can receive.\n\t// If this is not set, gRPC uses the default 4MB.\n\tMaxCallRecvMsgSize *int64 `protobuf:\"varint,3,opt,name=max_call_recv_msg_size,json=maxCallRecvMsgSize,proto3,oneof\" json:\"max_call_recv_msg_size,omitempty\"`\n\t// max_call_send_msg_size sets the maximum message size in bytes the client can send.\n\t// If this is not set, gRPC uses the default maximum number of int32 range.\n\tMaxCallSendMsgSize *int64 `protobuf:\"varint,4,opt,name=max_call_send_msg_size,json=maxCallSendMsgSize,proto3,oneof\" json:\"max_call_send_msg_size,omitempty\"`\n\t// static_method specifies that a call is being made to a method that is static,\n\t// which means the method is known at compile time and doesn't change at runtime.\n\t// This can be used as a signal to stats plugins that this method is safe to include as a key to a measurement.\n\tStaticMethod *bool `protobuf:\"varint,5,opt,name=static_method,json=staticMethod,proto3,oneof\" json:\"static_method,omitempty\"`\n\t// trailer retrieves the trailer metadata for a unary RPC.\n\t// In order to obtain the metadata, you must specify a variable of type map<string, repeated string> in the trailer.\n\t// e.g.)\n\t// def [\n\t//\n\t//\t{ name: \"trl\" by: \"grpc.federation.metadata.new()\" }\n\t//\t{ call { method: \"pkg.Method\" option { trailer: \"trl\" } } }\n\t//\n\t// ]\n\tTrailer *string `protobuf:\"bytes,6,opt,name=trailer,proto3,oneof\" json:\"trailer,omitempty\"`\n\t// wait_for_ready configures the RPC's behavior when the client is in TRANSIENT_FAILURE,\n\t// which occurs when all addresses fail to connect.\n\t// If wait_for_ready is false, the RPC will fail immediately.\n\t// Otherwise, the client will wait until a connection becomes available or the RPC's deadline is reached.\n\t// By default, RPCs do not \"wait for ready\".\n\tWaitForReady *bool `protobuf:\"varint,7,opt,name=wait_for_ready,json=waitForReady,proto3,oneof\" json:\"wait_for_ready,omitempty\"`\n}\n\nfunc (x *GRPCCallOption) Reset() {\n\t*x = GRPCCallOption{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[26]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GRPCCallOption) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GRPCCallOption) ProtoMessage() {}\n\nfunc (x *GRPCCallOption) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[26]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GRPCCallOption.ProtoReflect.Descriptor instead.\nfunc (*GRPCCallOption) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{26}\n}\n\nfunc (x *GRPCCallOption) GetContentSubtype() string {\n\tif x != nil && x.ContentSubtype != nil {\n\t\treturn *x.ContentSubtype\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCCallOption) GetHeader() string {\n\tif x != nil && x.Header != nil {\n\t\treturn *x.Header\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCCallOption) GetMaxCallRecvMsgSize() int64 {\n\tif x != nil && x.MaxCallRecvMsgSize != nil {\n\t\treturn *x.MaxCallRecvMsgSize\n\t}\n\treturn 0\n}\n\nfunc (x *GRPCCallOption) GetMaxCallSendMsgSize() int64 {\n\tif x != nil && x.MaxCallSendMsgSize != nil {\n\t\treturn *x.MaxCallSendMsgSize\n\t}\n\treturn 0\n}\n\nfunc (x *GRPCCallOption) GetStaticMethod() bool {\n\tif x != nil && x.StaticMethod != nil {\n\t\treturn *x.StaticMethod\n\t}\n\treturn false\n}\n\nfunc (x *GRPCCallOption) GetTrailer() string {\n\tif x != nil && x.Trailer != nil {\n\t\treturn *x.Trailer\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCCallOption) GetWaitForReady() bool {\n\tif x != nil && x.WaitForReady != nil {\n\t\treturn *x.WaitForReady\n\t}\n\treturn false\n}\n\n// Validation represents a validation rule against variables defined within the current scope.\ntype ValidationExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is a unique name for the validation.\n\t// If set, the validation error type will be <message-name><name>Error.\n\t// If omitted, the validation error type will be ValidationError.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// error defines the actual validation rules and an error to returned if the validation fails.\n\tError *GRPCError `protobuf:\"bytes,2,opt,name=error,proto3\" json:\"error,omitempty\"`\n}\n\nfunc (x *ValidationExpr) Reset() {\n\t*x = ValidationExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[27]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ValidationExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ValidationExpr) ProtoMessage() {}\n\nfunc (x *ValidationExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[27]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ValidationExpr.ProtoReflect.Descriptor instead.\nfunc (*ValidationExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{27}\n}\n\nfunc (x *ValidationExpr) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *ValidationExpr) GetError() *GRPCError {\n\tif x != nil {\n\t\treturn x.Error\n\t}\n\treturn nil\n}\n\n// RetryPolicy define the retry policy if the method call fails.\ntype RetryPolicy struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to Policy:\n\t//\n\t//\t*RetryPolicy_Constant\n\t//\t*RetryPolicy_Exponential\n\tPolicy isRetryPolicy_Policy `protobuf_oneof:\"policy\"`\n\t// if specifies condition in CEL. If the condition is true, run the retry process according to the policy.\n\t// If this field is omitted, it is always treated as 'true' and run the retry process.\n\t// The return value must always be of type boolean.\n\tIf string `protobuf:\"bytes,3,opt,name=if,proto3\" json:\"if,omitempty\"`\n}\n\nfunc (x *RetryPolicy) Reset() {\n\t*x = RetryPolicy{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[28]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RetryPolicy) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RetryPolicy) ProtoMessage() {}\n\nfunc (x *RetryPolicy) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[28]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RetryPolicy.ProtoReflect.Descriptor instead.\nfunc (*RetryPolicy) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{28}\n}\n\nfunc (m *RetryPolicy) GetPolicy() isRetryPolicy_Policy {\n\tif m != nil {\n\t\treturn m.Policy\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicy) GetConstant() *RetryPolicyConstant {\n\tif x, ok := x.GetPolicy().(*RetryPolicy_Constant); ok {\n\t\treturn x.Constant\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicy) GetExponential() *RetryPolicyExponential {\n\tif x, ok := x.GetPolicy().(*RetryPolicy_Exponential); ok {\n\t\treturn x.Exponential\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicy) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\ntype isRetryPolicy_Policy interface {\n\tisRetryPolicy_Policy()\n}\n\ntype RetryPolicy_Constant struct {\n\t// retry according to the \"constant\" policy.\n\tConstant *RetryPolicyConstant `protobuf:\"bytes,1,opt,name=constant,proto3,oneof\"`\n}\n\ntype RetryPolicy_Exponential struct {\n\t// retry according to the \"exponential backoff\" policy.\n\t// The following Go library is used in the implementation,\n\t// so please refer to the library documentation for how to specify each parameter.\n\t// https://pkg.go.dev/github.com/cenkalti/backoff/v4#section-readme.\n\tExponential *RetryPolicyExponential `protobuf:\"bytes,2,opt,name=exponential,proto3,oneof\"`\n}\n\nfunc (*RetryPolicy_Constant) isRetryPolicy_Policy() {}\n\nfunc (*RetryPolicy_Exponential) isRetryPolicy_Policy() {}\n\n// RetryPolicyConstant define \"constant\" based retry policy.\ntype RetryPolicyConstant struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// interval value. ( default value is 1s ).\n\tInterval *string `protobuf:\"bytes,1,opt,name=interval,proto3,oneof\" json:\"interval,omitempty\"`\n\t// max retry count. ( default value is 5. If zero is specified, it never stops )\n\tMaxRetries *uint64 `protobuf:\"varint,2,opt,name=max_retries,json=maxRetries,proto3,oneof\" json:\"max_retries,omitempty\"`\n}\n\nfunc (x *RetryPolicyConstant) Reset() {\n\t*x = RetryPolicyConstant{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[29]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RetryPolicyConstant) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RetryPolicyConstant) ProtoMessage() {}\n\nfunc (x *RetryPolicyConstant) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[29]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RetryPolicyConstant.ProtoReflect.Descriptor instead.\nfunc (*RetryPolicyConstant) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{29}\n}\n\nfunc (x *RetryPolicyConstant) GetInterval() string {\n\tif x != nil && x.Interval != nil {\n\t\treturn *x.Interval\n\t}\n\treturn \"\"\n}\n\nfunc (x *RetryPolicyConstant) GetMaxRetries() uint64 {\n\tif x != nil && x.MaxRetries != nil {\n\t\treturn *x.MaxRetries\n\t}\n\treturn 0\n}\n\n// RetryPolicyExponential define \"exponential backoff\" based retry policy.\ntype RetryPolicyExponential struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// initial interval value. ( default value is \"500ms\" ).\n\tInitialInterval *string `protobuf:\"bytes,1,opt,name=initial_interval,json=initialInterval,proto3,oneof\" json:\"initial_interval,omitempty\"`\n\t// randomization factor value. ( default value is 0.5 ).\n\tRandomizationFactor *float64 `protobuf:\"fixed64,2,opt,name=randomization_factor,json=randomizationFactor,proto3,oneof\" json:\"randomization_factor,omitempty\"`\n\t// multiplier. ( default value is 1.5 ).\n\tMultiplier *float64 `protobuf:\"fixed64,3,opt,name=multiplier,proto3,oneof\" json:\"multiplier,omitempty\"`\n\t// max interval value. ( default value is \"60s\" ).\n\tMaxInterval *string `protobuf:\"bytes,4,opt,name=max_interval,json=maxInterval,proto3,oneof\" json:\"max_interval,omitempty\"`\n\t// max retry count. ( default value is 5. If zero is specified, it never stops ).\n\tMaxRetries *uint64 `protobuf:\"varint,5,opt,name=max_retries,json=maxRetries,proto3,oneof\" json:\"max_retries,omitempty\"`\n}\n\nfunc (x *RetryPolicyExponential) Reset() {\n\t*x = RetryPolicyExponential{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[30]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RetryPolicyExponential) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RetryPolicyExponential) ProtoMessage() {}\n\nfunc (x *RetryPolicyExponential) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[30]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RetryPolicyExponential.ProtoReflect.Descriptor instead.\nfunc (*RetryPolicyExponential) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{30}\n}\n\nfunc (x *RetryPolicyExponential) GetInitialInterval() string {\n\tif x != nil && x.InitialInterval != nil {\n\t\treturn *x.InitialInterval\n\t}\n\treturn \"\"\n}\n\nfunc (x *RetryPolicyExponential) GetRandomizationFactor() float64 {\n\tif x != nil && x.RandomizationFactor != nil {\n\t\treturn *x.RandomizationFactor\n\t}\n\treturn 0\n}\n\nfunc (x *RetryPolicyExponential) GetMultiplier() float64 {\n\tif x != nil && x.Multiplier != nil {\n\t\treturn *x.Multiplier\n\t}\n\treturn 0\n}\n\nfunc (x *RetryPolicyExponential) GetMaxInterval() string {\n\tif x != nil && x.MaxInterval != nil {\n\t\treturn *x.MaxInterval\n\t}\n\treturn \"\"\n}\n\nfunc (x *RetryPolicyExponential) GetMaxRetries() uint64 {\n\tif x != nil && x.MaxRetries != nil {\n\t\treturn *x.MaxRetries\n\t}\n\treturn 0\n}\n\n// MethodRequest define parameters to be used for gRPC method request.\ntype MethodRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// field name of the request message.\n\tField string `protobuf:\"bytes,1,opt,name=field,proto3\" json:\"field,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tBy *string `protobuf:\"bytes,2,opt,name=by,proto3,oneof\" json:\"by,omitempty\"`\n\t// if describes the condition to be assigned to field.\n\t// The return value must be of type bool.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\t// If the field is a 'oneof' field, it must be specified.\n\tIf *string `protobuf:\"bytes,3,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n}\n\nfunc (x *MethodRequest) Reset() {\n\t*x = MethodRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[31]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MethodRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MethodRequest) ProtoMessage() {}\n\nfunc (x *MethodRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[31]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MethodRequest.ProtoReflect.Descriptor instead.\nfunc (*MethodRequest) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{31}\n}\n\nfunc (x *MethodRequest) GetField() string {\n\tif x != nil {\n\t\treturn x.Field\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodRequest) GetBy() string {\n\tif x != nil && x.By != nil {\n\t\treturn *x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodRequest) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\n// MethodResponse define which value of the method response is referenced.\ntype MethodResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name specify the unique name that can be used in a `MessageRule` / `FieldRule` for the same message for a specific field in the response.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// field name in response message.\n\tField *string `protobuf:\"bytes,2,opt,name=field,proto3,oneof\" json:\"field,omitempty\"`\n\t// autobind if the value referenced by `field` is a message type,\n\t// the value of a field with the same name and type as the field name of its own message is automatically assigned to the value of the field in the message.\n\t// If multiple autobinds are used at the same message,\n\t// you must explicitly use the `grpc.federation.field` option to do the binding yourself, since duplicate field names cannot be correctly determined as one.\n\tAutobind *bool `protobuf:\"varint,3,opt,name=autobind,proto3,oneof\" json:\"autobind,omitempty\"`\n}\n\nfunc (x *MethodResponse) Reset() {\n\t*x = MethodResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[32]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MethodResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MethodResponse) ProtoMessage() {}\n\nfunc (x *MethodResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[32]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MethodResponse.ProtoReflect.Descriptor instead.\nfunc (*MethodResponse) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{32}\n}\n\nfunc (x *MethodResponse) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodResponse) GetField() string {\n\tif x != nil && x.Field != nil {\n\t\treturn *x.Field\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodResponse) GetAutobind() bool {\n\tif x != nil && x.Autobind != nil {\n\t\treturn *x.Autobind\n\t}\n\treturn false\n}\n\n// Argument define message argument.\ntype Argument struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name of the message argument.\n\t// Use this name to refer to the message argument.\n\t// For example, if `foo` is specified as the name, it is referenced by `$.foo`.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tBy *string `protobuf:\"bytes,2,opt,name=by,proto3,oneof\" json:\"by,omitempty\"`\n\t// inline like by, it refers to the specified value and expands all fields beyond it.\n\t// For this reason, the referenced value must always be of message type.\n\tInline *string `protobuf:\"bytes,3,opt,name=inline,proto3,oneof\" json:\"inline,omitempty\"`\n}\n\nfunc (x *Argument) Reset() {\n\t*x = Argument{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[33]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Argument) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Argument) ProtoMessage() {}\n\nfunc (x *Argument) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[33]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Argument.ProtoReflect.Descriptor instead.\nfunc (*Argument) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{33}\n}\n\nfunc (x *Argument) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Argument) GetBy() string {\n\tif x != nil && x.By != nil {\n\t\treturn *x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *Argument) GetInline() string {\n\tif x != nil && x.Inline != nil {\n\t\treturn *x.Inline\n\t}\n\treturn \"\"\n}\n\n// FieldRule define gRPC Federation rules for the field of message.\ntype FieldRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// If custom_resolver is true, the field binding process is to be implemented in Go.\n\t// If there are any values retrieved by grpc.federation.message option, they are passed as arguments for custom resolver.\n\tCustomResolver *bool `protobuf:\"varint,1,opt,name=custom_resolver,json=customResolver,proto3,oneof\" json:\"custom_resolver,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tBy *string `protobuf:\"bytes,2,opt,name=by,proto3,oneof\" json:\"by,omitempty\"`\n\t// alias can be used when alias is specified in grpc.federation.message option,\n\t// and specifies the field name to be referenced among the messages specified in alias of message option.\n\t// If the specified field has the same type or can be converted automatically, its value is assigned.\n\tAlias *string `protobuf:\"bytes,3,opt,name=alias,proto3,oneof\" json:\"alias,omitempty\"`\n\t// use to evaluate any one of fields. this field only available in oneof.\n\tOneof *FieldOneof `protobuf:\"bytes,4,opt,name=oneof,proto3\" json:\"oneof,omitempty\"`\n\t// when defining an environment variable, use it for fields where you want to set additional options.\n\tEnv *EnvVarOption `protobuf:\"bytes,5,opt,name=env,proto3\" json:\"env,omitempty\"`\n}\n\nfunc (x *FieldRule) Reset() {\n\t*x = FieldRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[34]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *FieldRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*FieldRule) ProtoMessage() {}\n\nfunc (x *FieldRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[34]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use FieldRule.ProtoReflect.Descriptor instead.\nfunc (*FieldRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{34}\n}\n\nfunc (x *FieldRule) GetCustomResolver() bool {\n\tif x != nil && x.CustomResolver != nil {\n\t\treturn *x.CustomResolver\n\t}\n\treturn false\n}\n\nfunc (x *FieldRule) GetBy() string {\n\tif x != nil && x.By != nil {\n\t\treturn *x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *FieldRule) GetAlias() string {\n\tif x != nil && x.Alias != nil {\n\t\treturn *x.Alias\n\t}\n\treturn \"\"\n}\n\nfunc (x *FieldRule) GetOneof() *FieldOneof {\n\tif x != nil {\n\t\treturn x.Oneof\n\t}\n\treturn nil\n}\n\nfunc (x *FieldRule) GetEnv() *EnvVarOption {\n\tif x != nil {\n\t\treturn x.Env\n\t}\n\treturn nil\n}\n\n// FieldOneof evaluate \"messages\" or other field only if expr is true and assign to the oneof field.\n// This feature only available in oneof.\ntype FieldOneof struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// cond specify either `expr` or `default`. Only one `default` can be set per oneof.\n\t//\n\t// Types that are assignable to Cond:\n\t//\n\t//\t*FieldOneof_If\n\t//\t*FieldOneof_Default\n\tCond isFieldOneof_Cond `protobuf_oneof:\"cond\"`\n\t// def specify variables to be used in current oneof field's scope for field binding.\n\tDef []*VariableDefinition `protobuf:\"bytes,3,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule and FieldOneOf can be used.\n\tBy string `protobuf:\"bytes,4,opt,name=by,proto3\" json:\"by,omitempty\"`\n}\n\nfunc (x *FieldOneof) Reset() {\n\t*x = FieldOneof{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[35]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *FieldOneof) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*FieldOneof) ProtoMessage() {}\n\nfunc (x *FieldOneof) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[35]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use FieldOneof.ProtoReflect.Descriptor instead.\nfunc (*FieldOneof) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{35}\n}\n\nfunc (m *FieldOneof) GetCond() isFieldOneof_Cond {\n\tif m != nil {\n\t\treturn m.Cond\n\t}\n\treturn nil\n}\n\nfunc (x *FieldOneof) GetIf() string {\n\tif x, ok := x.GetCond().(*FieldOneof_If); ok {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *FieldOneof) GetDefault() bool {\n\tif x, ok := x.GetCond().(*FieldOneof_Default); ok {\n\t\treturn x.Default\n\t}\n\treturn false\n}\n\nfunc (x *FieldOneof) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *FieldOneof) GetBy() string {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\ntype isFieldOneof_Cond interface {\n\tisFieldOneof_Cond()\n}\n\ntype FieldOneof_If struct {\n\t// if describes the condition to be assigned to field.\n\t// The return value must be of type bool.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3,oneof\"`\n}\n\ntype FieldOneof_Default struct {\n\t// default used to assign a value when none of the other fields match any of the specified expressions.\n\t// Only one value can be defined per oneof.\n\tDefault bool `protobuf:\"varint,2,opt,name=default,proto3,oneof\"`\n}\n\nfunc (*FieldOneof_If) isFieldOneof_Cond() {}\n\nfunc (*FieldOneof_Default) isFieldOneof_Cond() {}\n\n// CELPlugin define schema of CEL plugin.\ntype CELPlugin struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tExport []*CELPluginExport `protobuf:\"bytes,1,rep,name=export,proto3\" json:\"export,omitempty\"`\n}\n\nfunc (x *CELPlugin) Reset() {\n\t*x = CELPlugin{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[36]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPlugin) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPlugin) ProtoMessage() {}\n\nfunc (x *CELPlugin) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[36]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPlugin.ProtoReflect.Descriptor instead.\nfunc (*CELPlugin) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{36}\n}\n\nfunc (x *CELPlugin) GetExport() []*CELPluginExport {\n\tif x != nil {\n\t\treturn x.Export\n\t}\n\treturn nil\n}\n\n// CELPluginExport describe the schema to be exposed as a CEL plugin.\ntype CELPluginExport struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the plugin name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// types describe the message type you want to expose.\n\tTypes []*CELReceiverType `protobuf:\"bytes,3,rep,name=types,proto3\" json:\"types,omitempty\"`\n\t// functions describe the definition of the function you want to expose.\n\tFunctions []*CELFunction `protobuf:\"bytes,4,rep,name=functions,proto3\" json:\"functions,omitempty\"`\n\t// variables describe the definition of the variable you want to expose.\n\tVariables  []*CELVariable       `protobuf:\"bytes,5,rep,name=variables,proto3\" json:\"variables,omitempty\"`\n\tCapability *CELPluginCapability `protobuf:\"bytes,6,opt,name=capability,proto3\" json:\"capability,omitempty\"`\n}\n\nfunc (x *CELPluginExport) Reset() {\n\t*x = CELPluginExport{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[37]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginExport) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginExport) ProtoMessage() {}\n\nfunc (x *CELPluginExport) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[37]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginExport.ProtoReflect.Descriptor instead.\nfunc (*CELPluginExport) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{37}\n}\n\nfunc (x *CELPluginExport) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELPluginExport) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELPluginExport) GetTypes() []*CELReceiverType {\n\tif x != nil {\n\t\treturn x.Types\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginExport) GetFunctions() []*CELFunction {\n\tif x != nil {\n\t\treturn x.Functions\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginExport) GetVariables() []*CELVariable {\n\tif x != nil {\n\t\treturn x.Variables\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginExport) GetCapability() *CELPluginCapability {\n\tif x != nil {\n\t\treturn x.Capability\n\t}\n\treturn nil\n}\n\n// CELPluginCapability controls the permissions granted to the WebAssembly plugin.\ntype CELPluginCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// env is the capability for environment variable.\n\tEnv *CELPluginEnvCapability `protobuf:\"bytes,1,opt,name=env,proto3,oneof\" json:\"env,omitempty\"`\n\t// file_system is the capability for file system.\n\tFileSystem *CELPluginFileSystemCapability `protobuf:\"bytes,2,opt,name=file_system,json=fileSystem,proto3,oneof\" json:\"file_system,omitempty\"`\n\t// network is the capability for network.\n\tNetwork *CELPluginNetworkCapability `protobuf:\"bytes,3,opt,name=network,proto3,oneof\" json:\"network,omitempty\"`\n}\n\nfunc (x *CELPluginCapability) Reset() {\n\t*x = CELPluginCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[38]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginCapability) ProtoMessage() {}\n\nfunc (x *CELPluginCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[38]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{38}\n}\n\nfunc (x *CELPluginCapability) GetEnv() *CELPluginEnvCapability {\n\tif x != nil {\n\t\treturn x.Env\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginCapability) GetFileSystem() *CELPluginFileSystemCapability {\n\tif x != nil {\n\t\treturn x.FileSystem\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginCapability) GetNetwork() *CELPluginNetworkCapability {\n\tif x != nil {\n\t\treturn x.Network\n\t}\n\treturn nil\n}\n\n// CELPluginEnvCapability controls access to the environment variable.\ntype CELPluginEnvCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// all allows access to all environment variables.\n\tAll bool `protobuf:\"varint,1,opt,name=all,proto3\" json:\"all,omitempty\"`\n\t// specifies accessible names. If \"all\" is true, it takes precedence.\n\tNames []string `protobuf:\"bytes,2,rep,name=names,proto3\" json:\"names,omitempty\"`\n}\n\nfunc (x *CELPluginEnvCapability) Reset() {\n\t*x = CELPluginEnvCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[39]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginEnvCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginEnvCapability) ProtoMessage() {}\n\nfunc (x *CELPluginEnvCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[39]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginEnvCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginEnvCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{39}\n}\n\nfunc (x *CELPluginEnvCapability) GetAll() bool {\n\tif x != nil {\n\t\treturn x.All\n\t}\n\treturn false\n}\n\nfunc (x *CELPluginEnvCapability) GetNames() []string {\n\tif x != nil {\n\t\treturn x.Names\n\t}\n\treturn nil\n}\n\n// CELPluginFileSystemCapability controls access to the file system.\ntype CELPluginFileSystemCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// mount_path specifies the file path of the host to mount.\n\t// If not specified, the root directory will be used.\n\tMountPath string `protobuf:\"bytes,1,opt,name=mount_path,json=mountPath,proto3\" json:\"mount_path,omitempty\"`\n}\n\nfunc (x *CELPluginFileSystemCapability) Reset() {\n\t*x = CELPluginFileSystemCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[40]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginFileSystemCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginFileSystemCapability) ProtoMessage() {}\n\nfunc (x *CELPluginFileSystemCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[40]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginFileSystemCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginFileSystemCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{40}\n}\n\nfunc (x *CELPluginFileSystemCapability) GetMountPath() string {\n\tif x != nil {\n\t\treturn x.MountPath\n\t}\n\treturn \"\"\n}\n\n// CELPluginNetworkCapability sets permissions related to network access.\n// This is an experimental feature.\ntype CELPluginNetworkCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *CELPluginNetworkCapability) Reset() {\n\t*x = CELPluginNetworkCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[41]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginNetworkCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginNetworkCapability) ProtoMessage() {}\n\nfunc (x *CELPluginNetworkCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[41]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginNetworkCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginNetworkCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{41}\n}\n\n// CELFunction represents the CEL function definition.\ntype CELFunction struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the function name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of function.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// args describe the definition of the function argument.\n\tArgs []*CELFunctionArgument `protobuf:\"bytes,3,rep,name=args,proto3\" json:\"args,omitempty\"`\n\t// return describe the definition of return type of function.\n\tReturn *CELType `protobuf:\"bytes,4,opt,name=return,proto3\" json:\"return,omitempty\"`\n}\n\nfunc (x *CELFunction) Reset() {\n\t*x = CELFunction{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[42]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELFunction) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELFunction) ProtoMessage() {}\n\nfunc (x *CELFunction) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[42]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELFunction.ProtoReflect.Descriptor instead.\nfunc (*CELFunction) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{42}\n}\n\nfunc (x *CELFunction) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunction) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunction) GetArgs() []*CELFunctionArgument {\n\tif x != nil {\n\t\treturn x.Args\n\t}\n\treturn nil\n}\n\nfunc (x *CELFunction) GetReturn() *CELType {\n\tif x != nil {\n\t\treturn x.Return\n\t}\n\treturn nil\n}\n\n// CELReceiverType represents methods tied to the message.\ntype CELReceiverType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the message name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// methods describe the definition of the method for the message.\n\tMethods []*CELFunction `protobuf:\"bytes,3,rep,name=methods,proto3\" json:\"methods,omitempty\"`\n}\n\nfunc (x *CELReceiverType) Reset() {\n\t*x = CELReceiverType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[43]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELReceiverType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELReceiverType) ProtoMessage() {}\n\nfunc (x *CELReceiverType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[43]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELReceiverType.ProtoReflect.Descriptor instead.\nfunc (*CELReceiverType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{43}\n}\n\nfunc (x *CELReceiverType) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELReceiverType) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELReceiverType) GetMethods() []*CELFunction {\n\tif x != nil {\n\t\treturn x.Methods\n\t}\n\treturn nil\n}\n\n// CELFunctionArgument represents the function argument.\ntype CELFunctionArgument struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the argument value name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// type is the argument type.\n\tType *CELType `protobuf:\"bytes,3,opt,name=type,proto3\" json:\"type,omitempty\"`\n}\n\nfunc (x *CELFunctionArgument) Reset() {\n\t*x = CELFunctionArgument{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[44]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELFunctionArgument) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELFunctionArgument) ProtoMessage() {}\n\nfunc (x *CELFunctionArgument) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[44]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELFunctionArgument.ProtoReflect.Descriptor instead.\nfunc (*CELFunctionArgument) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{44}\n}\n\nfunc (x *CELFunctionArgument) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunctionArgument) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunctionArgument) GetType() *CELType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\n// CELType represents type information for CEL plugin interface.\ntype CELType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to Type:\n\t//\n\t//\t*CELType_Kind\n\t//\t*CELType_Repeated\n\t//\t*CELType_Map\n\t//\t*CELType_Message\n\t//\t*CELType_Enum\n\tType isCELType_Type `protobuf_oneof:\"type\"`\n}\n\nfunc (x *CELType) Reset() {\n\t*x = CELType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[45]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELType) ProtoMessage() {}\n\nfunc (x *CELType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[45]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELType.ProtoReflect.Descriptor instead.\nfunc (*CELType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{45}\n}\n\nfunc (m *CELType) GetType() isCELType_Type {\n\tif m != nil {\n\t\treturn m.Type\n\t}\n\treturn nil\n}\n\nfunc (x *CELType) GetKind() TypeKind {\n\tif x, ok := x.GetType().(*CELType_Kind); ok {\n\t\treturn x.Kind\n\t}\n\treturn TypeKind_UNKNOWN\n}\n\nfunc (x *CELType) GetRepeated() *CELType {\n\tif x, ok := x.GetType().(*CELType_Repeated); ok {\n\t\treturn x.Repeated\n\t}\n\treturn nil\n}\n\nfunc (x *CELType) GetMap() *CELMapType {\n\tif x, ok := x.GetType().(*CELType_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\nfunc (x *CELType) GetMessage() string {\n\tif x, ok := x.GetType().(*CELType_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELType) GetEnum() string {\n\tif x, ok := x.GetType().(*CELType_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn \"\"\n}\n\ntype isCELType_Type interface {\n\tisCELType_Type()\n}\n\ntype CELType_Kind struct {\n\t// kind is used when the type is a primitive type.\n\tKind TypeKind `protobuf:\"varint,1,opt,name=kind,proto3,enum=grpc.federation.TypeKind,oneof\"`\n}\n\ntype CELType_Repeated struct {\n\t// repeated is used when the type is a repeated type.\n\tRepeated *CELType `protobuf:\"bytes,2,opt,name=repeated,proto3,oneof\"`\n}\n\ntype CELType_Map struct {\n\t// map is used when the type is a map type.\n\tMap *CELMapType `protobuf:\"bytes,3,opt,name=map,proto3,oneof\"`\n}\n\ntype CELType_Message struct {\n\t// message is a fqdn to the message type.\n\tMessage string `protobuf:\"bytes,4,opt,name=message,proto3,oneof\"`\n}\n\ntype CELType_Enum struct {\n\t// enum is a fqdn to the enum type.\n\tEnum string `protobuf:\"bytes,5,opt,name=enum,proto3,oneof\"`\n}\n\nfunc (*CELType_Kind) isCELType_Type() {}\n\nfunc (*CELType_Repeated) isCELType_Type() {}\n\nfunc (*CELType_Map) isCELType_Type() {}\n\nfunc (*CELType_Message) isCELType_Type() {}\n\nfunc (*CELType_Enum) isCELType_Type() {}\n\n// CELMapType represents map type.\ntype CELMapType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// key represents map's key type.\n\tKey *CELType `protobuf:\"bytes,1,opt,name=key,proto3\" json:\"key,omitempty\"`\n\t// value represents map's value type.\n\tValue *CELType `protobuf:\"bytes,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *CELMapType) Reset() {\n\t*x = CELMapType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[46]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELMapType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELMapType) ProtoMessage() {}\n\nfunc (x *CELMapType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[46]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELMapType.ProtoReflect.Descriptor instead.\nfunc (*CELMapType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{46}\n}\n\nfunc (x *CELMapType) GetKey() *CELType {\n\tif x != nil {\n\t\treturn x.Key\n\t}\n\treturn nil\n}\n\nfunc (x *CELMapType) GetValue() *CELType {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn nil\n}\n\n// CELVariable represents CEL variable.\ntype CELVariable struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the variable name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// type is the variable type.\n\tType *CELType `protobuf:\"bytes,3,opt,name=type,proto3\" json:\"type,omitempty\"`\n}\n\nfunc (x *CELVariable) Reset() {\n\t*x = CELVariable{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[47]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELVariable) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELVariable) ProtoMessage() {}\n\nfunc (x *CELVariable) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[47]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELVariable.ProtoReflect.Descriptor instead.\nfunc (*CELVariable) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{47}\n}\n\nfunc (x *CELVariable) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELVariable) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELVariable) GetType() *CELType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nvar file_grpc_federation_federation_proto_extTypes = []protoimpl.ExtensionInfo{\n\t{\n\t\tExtendedType:  (*descriptorpb.FileOptions)(nil),\n\t\tExtensionType: (*FileRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.file\",\n\t\tTag:           \"bytes,1187,opt,name=file\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*ServiceRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.service\",\n\t\tTag:           \"bytes,1187,opt,name=service\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*MethodRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.method\",\n\t\tTag:           \"bytes,1187,opt,name=method\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MessageOptions)(nil),\n\t\tExtensionType: (*MessageRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.message\",\n\t\tTag:           \"bytes,1187,opt,name=message\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*FieldRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.field\",\n\t\tTag:           \"bytes,1187,opt,name=field\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.EnumOptions)(nil),\n\t\tExtensionType: (*EnumRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.enum\",\n\t\tTag:           \"bytes,1187,opt,name=enum\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.EnumValueOptions)(nil),\n\t\tExtensionType: (*EnumValueRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.enum_value\",\n\t\tTag:           \"bytes,1187,opt,name=enum_value\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.OneofOptions)(nil),\n\t\tExtensionType: (*OneofRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.oneof\",\n\t\tTag:           \"bytes,1187,opt,name=oneof\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n}\n\n// Extension fields to descriptorpb.FileOptions.\nvar (\n\t// optional grpc.federation.FileRule file = 1187;\n\tE_File = &file_grpc_federation_federation_proto_extTypes[0]\n)\n\n// Extension fields to descriptorpb.ServiceOptions.\nvar (\n\t// optional grpc.federation.ServiceRule service = 1187;\n\tE_Service = &file_grpc_federation_federation_proto_extTypes[1]\n)\n\n// Extension fields to descriptorpb.MethodOptions.\nvar (\n\t// optional grpc.federation.MethodRule method = 1187;\n\tE_Method = &file_grpc_federation_federation_proto_extTypes[2]\n)\n\n// Extension fields to descriptorpb.MessageOptions.\nvar (\n\t// optional grpc.federation.MessageRule message = 1187;\n\tE_Message = &file_grpc_federation_federation_proto_extTypes[3]\n)\n\n// Extension fields to descriptorpb.FieldOptions.\nvar (\n\t// optional grpc.federation.FieldRule field = 1187;\n\tE_Field = &file_grpc_federation_federation_proto_extTypes[4]\n)\n\n// Extension fields to descriptorpb.EnumOptions.\nvar (\n\t// optional grpc.federation.EnumRule enum = 1187;\n\tE_Enum = &file_grpc_federation_federation_proto_extTypes[5]\n)\n\n// Extension fields to descriptorpb.EnumValueOptions.\nvar (\n\t// optional grpc.federation.EnumValueRule enum_value = 1187;\n\tE_EnumValue = &file_grpc_federation_federation_proto_extTypes[6]\n)\n\n// Extension fields to descriptorpb.OneofOptions.\nvar (\n\t// optional grpc.federation.OneofRule oneof = 1187;\n\tE_Oneof = &file_grpc_federation_federation_proto_extTypes[7]\n)\n\nvar File_grpc_federation_federation_proto protoreflect.FileDescriptor\n\nvar file_grpc_federation_federation_proto_rawDesc = []byte{\n\t0x0a, 0x20, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x12, 0x0f, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70,\n\t0x63, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x64,\n\t0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x67, 0x72,\n\t0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x70, 0x72,\n\t0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x67, 0x72, 0x70,\n\t0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x74, 0x69, 0x6d,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x56, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x52,\n\t0x75, 0x6c, 0x65, 0x12, 0x32, 0x0a, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52,\n\t0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6d, 0x70, 0x6f, 0x72,\n\t0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x22,\n\t0x20, 0x0a, 0x08, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61,\n\t0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61,\n\t0x73, 0x22, 0xb4, 0x01, 0x0a, 0x0d, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52,\n\t0x75, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x88,\n\t0x01, 0x01, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,\n\t0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x37, 0x0a, 0x04, 0x61, 0x74, 0x74, 0x72,\n\t0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c,\n\t0x75, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, 0x04, 0x61, 0x74, 0x74,\n\t0x72, 0x12, 0x1d, 0x0a, 0x07, 0x6e, 0x6f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x04, 0x20, 0x01,\n\t0x28, 0x08, 0x48, 0x01, 0x52, 0x07, 0x6e, 0x6f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x88, 0x01, 0x01,\n\t0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x42, 0x0a, 0x0a, 0x08,\n\t0x5f, 0x6e, 0x6f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x3e, 0x0a, 0x12, 0x45, 0x6e, 0x75, 0x6d,\n\t0x56, 0x61, 0x6c, 0x75, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x12, 0x12,\n\t0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x0b, 0x0a, 0x09, 0x4f, 0x6e, 0x65, 0x6f,\n\t0x66, 0x52, 0x75, 0x6c, 0x65, 0x22, 0x69, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n\t0x52, 0x75, 0x6c, 0x65, 0x12, 0x26, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x14, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x32, 0x0a, 0x03,\n\t0x76, 0x61, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x03, 0x76, 0x61, 0x72,\n\t0x22, 0x4a, 0x0a, 0x03, 0x45, 0x6e, 0x76, 0x12, 0x29, 0x0a, 0x03, 0x76, 0x61, 0x72, 0x18, 0x01,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x52, 0x03, 0x76,\n\t0x61, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x8b, 0x03, 0x0a,\n\t0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65,\n\t0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01,\n\t0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x66, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x02, 0x69, 0x66, 0x88, 0x01, 0x01, 0x12, 0x10,\n\t0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x62, 0x79,\n\t0x12, 0x2c, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x4d, 0x61, 0x70, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x70, 0x12, 0x38,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52,\n\t0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x50, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x69,\n\t0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x61,\n\t0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x0a,\n\t0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x04, 0x65, 0x6e,\n\t0x75, 0x6d, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x45,\n\t0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x35, 0x0a, 0x06, 0x73,\n\t0x77, 0x69, 0x74, 0x63, 0x68, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x77,\n\t0x69, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x06, 0x73, 0x77, 0x69, 0x74,\n\t0x63, 0x68, 0x42, 0x06, 0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e,\n\t0x61, 0x6d, 0x65, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x66, 0x22, 0x49, 0x0a, 0x1d, 0x53, 0x65,\n\t0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c,\n\t0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69,\n\t0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x66, 0x12, 0x18, 0x0a, 0x07, 0x6d,\n\t0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65,\n\t0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x06, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72,\n\t0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79,\n\t0x70, 0x65, 0x12, 0x3a, 0x0a, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x48, 0x00, 0x52, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x09,\n\t0x0a, 0x07, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xab, 0x01, 0x0a, 0x07, 0x45, 0x6e,\n\t0x76, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2f, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x00,\n\t0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x36, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74,\n\t0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79,\n\t0x70, 0x65, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2f,\n\t0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e,\n\t0x76, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x70, 0x42,\n\t0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x68, 0x0a, 0x0a, 0x45, 0x6e, 0x76, 0x4d, 0x61,\n\t0x70, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2a, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79, 0x70, 0x65, 0x52, 0x03, 0x6b, 0x65,\n\t0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,\n\t0x65, 0x22, 0xc3, 0x01, 0x0a, 0x0c, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x09, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61,\n\t0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c,\n\t0x74, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72,\n\t0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64,\n\t0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x07, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65,\n\t0x64, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61,\n\t0x74, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x42, 0x0b,\n\t0x0a, 0x09, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x5f,\n\t0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x22, 0x65, 0x0a, 0x0a, 0x4d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75,\n\t0x74, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e,\n\t0x73, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75,\n\t0x74, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9c,\n\t0x01, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x35,\n\t0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61,\n\t0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e,\n\t0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f,\n\t0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00,\n\t0x52, 0x0e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72,\n\t0x88, 0x01, 0x01, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x03, 0x20, 0x03,\n\t0x28, 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x75,\n\t0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x22, 0xde, 0x03,\n\t0x0a, 0x12, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69,\n\t0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x48, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x13, 0x0a,\n\t0x02, 0x69, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x02, 0x69, 0x66, 0x88,\n\t0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x18, 0x03,\n\t0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64,\n\t0x88, 0x01, 0x01, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48,\n\t0x00, 0x52, 0x02, 0x62, 0x79, 0x12, 0x2c, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x0c, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x61, 0x70, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x03,\n\t0x6d, 0x61, 0x70, 0x12, 0x38, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0d,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78,\n\t0x70, 0x72, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2f, 0x0a,\n\t0x04, 0x63, 0x61, 0x6c, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x61,\n\t0x6c, 0x6c, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x63, 0x61, 0x6c, 0x6c, 0x12, 0x41,\n\t0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45,\n\t0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x12, 0x2f, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e,\n\t0x75, 0x6d, 0x12, 0x35, 0x0a, 0x06, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x18, 0x11, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x48,\n\t0x00, 0x52, 0x06, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x42, 0x06, 0x0a, 0x04, 0x65, 0x78, 0x70,\n\t0x72, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69,\n\t0x66, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x22, 0xc5,\n\t0x01, 0x0a, 0x07, 0x4d, 0x61, 0x70, 0x45, 0x78, 0x70, 0x72, 0x12, 0x35, 0x0a, 0x08, 0x69, 0x74,\n\t0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49,\n\t0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f,\n\t0x72, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,\n\t0x02, 0x62, 0x79, 0x12, 0x38, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0c,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78,\n\t0x70, 0x72, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2f, 0x0a,\n\t0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e,\n\t0x75, 0x6d, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x42, 0x06,\n\t0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x22, 0x30, 0x0a, 0x08, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74,\n\t0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x72, 0x63, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x72, 0x63, 0x22, 0x50, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x45, 0x78, 0x70, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x04, 0x61,\n\t0x72, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x41, 0x72, 0x67, 0x75,\n\t0x6d, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x22, 0x2e, 0x0a, 0x08, 0x45, 0x6e,\n\t0x75, 0x6d, 0x45, 0x78, 0x70, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x62, 0x79,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x62, 0x79, 0x22, 0xf3, 0x02, 0x0a, 0x08, 0x43,\n\t0x61, 0x6c, 0x6c, 0x45, 0x78, 0x70, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12,\n\t0x38, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x07, 0x74, 0x69, 0x6d,\n\t0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x74, 0x69,\n\t0x6d, 0x65, 0x6f, 0x75, 0x74, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x05, 0x72, 0x65, 0x74, 0x72,\n\t0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50,\n\t0x6f, 0x6c, 0x69, 0x63, 0x79, 0x48, 0x01, 0x52, 0x05, 0x72, 0x65, 0x74, 0x72, 0x79, 0x88, 0x01,\n\t0x01, 0x12, 0x30, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72,\n\t0x72, 0x6f, 0x72, 0x12, 0x3c, 0x0a, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x43, 0x61, 0x6c, 0x6c, 0x4f, 0x70,\n\t0x74, 0x69, 0x6f, 0x6e, 0x48, 0x02, 0x52, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01,\n\t0x01, 0x12, 0x1f, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20,\n\t0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x88,\n\t0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x42, 0x08,\n\t0x0a, 0x06, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x79, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,\n\t0x22, 0x7f, 0x0a, 0x0a, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x12, 0x33,\n\t0x0a, 0x04, 0x63, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53,\n\t0x77, 0x69, 0x74, 0x63, 0x68, 0x43, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x72, 0x52, 0x04, 0x63,\n\t0x61, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x44, 0x65, 0x66,\n\t0x61, 0x75, 0x6c, 0x74, 0x45, 0x78, 0x70, 0x72, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c,\n\t0x74, 0x22, 0x71, 0x0a, 0x0e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x43, 0x61, 0x73, 0x65, 0x45,\n\t0x78, 0x70, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x02, 0x69, 0x66, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e,\n\t0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x79,\n\t0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x62, 0x79, 0x42, 0x06, 0x0a, 0x04,\n\t0x65, 0x78, 0x70, 0x72, 0x22, 0x64, 0x0a, 0x11, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x44, 0x65,\n\t0x66, 0x61, 0x75, 0x6c, 0x74, 0x45, 0x78, 0x70, 0x72, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66,\n\t0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c,\n\t0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66,\n\t0x12, 0x10, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02,\n\t0x62, 0x79, 0x42, 0x06, 0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x22, 0x86, 0x04, 0x0a, 0x09, 0x47,\n\t0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18,\n\t0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65,\n\t0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12,\n\t0x13, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x69,\n\t0x66, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x0e, 0x32, 0x10, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e,\n\t0x43, 0x6f, 0x64, 0x65, 0x48, 0x01, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12,\n\t0x1d, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,\n\t0x48, 0x02, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a,\n\t0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x20, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69,\n\t0x6c, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x69, 0x67,\n\t0x6e, 0x6f, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x06, 0x69, 0x67,\n\t0x6e, 0x6f, 0x72, 0x65, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x67, 0x6e, 0x6f, 0x72,\n\t0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x07,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x11, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x41, 0x6e,\n\t0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x88, 0x01, 0x01, 0x12, 0x45, 0x0a, 0x09,\n\t0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32,\n\t0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x4c, 0x6f, 0x67, 0x4c,\n\t0x65, 0x76, 0x65, 0x6c, 0x48, 0x05, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c,\n\t0x88, 0x01, 0x01, 0x22, 0x41, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12,\n\t0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05,\n\t0x44, 0x45, 0x42, 0x55, 0x47, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x4e, 0x46, 0x4f, 0x10,\n\t0x02, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x41, 0x52, 0x4e, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x45,\n\t0x52, 0x52, 0x4f, 0x52, 0x10, 0x04, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x66, 0x42, 0x07, 0x0a,\n\t0x05, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61,\n\t0x67, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x42, 0x16, 0x0a,\n\t0x14, 0x5f, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x72, 0x65, 0x73,\n\t0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65,\n\t0x76, 0x65, 0x6c, 0x22, 0xfa, 0x05, 0x0a, 0x0f, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f,\n\t0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x66, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x02,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44,\n\t0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x36,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78, 0x70, 0x72, 0x52, 0x07, 0x6d,\n\t0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f,\n\t0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66,\n\t0x6f, 0x52, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x34, 0x0a, 0x0a,\n\t0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65,\n\t0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x72, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e,\n\t0x66, 0x6f, 0x12, 0x34, 0x0a, 0x0a, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x69, 0x6e, 0x66, 0x6f,\n\t0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x64,\n\t0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3d, 0x0a, 0x0d, 0x71, 0x75, 0x6f, 0x74,\n\t0x61, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x6f,\n\t0x74, 0x61, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x0c, 0x71, 0x75, 0x6f, 0x74, 0x61,\n\t0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x52, 0x0a, 0x14, 0x70, 0x72, 0x65, 0x63, 0x6f,\n\t0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18,\n\t0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72,\n\t0x70, 0x63, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x46,\n\t0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x13, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69,\n\t0x74, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x62,\n\t0x61, 0x64, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61,\n\t0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x62, 0x61, 0x64, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f,\n\t0x69, 0x6e, 0x66, 0x6f, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49,\n\t0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f,\n\t0x12, 0x3d, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66,\n\t0x6f, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66,\n\t0x6f, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12,\n\t0x24, 0x0a, 0x04, 0x68, 0x65, 0x6c, 0x70, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x48, 0x65, 0x6c, 0x70, 0x52,\n\t0x04, 0x68, 0x65, 0x6c, 0x70, 0x12, 0x49, 0x0a, 0x11, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a,\n\t0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f,\n\t0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x10,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,\n\t0x12, 0x0e, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x02, 0x62, 0x79,\n\t0x22, 0xc7, 0x03, 0x0a, 0x0e, 0x47, 0x52, 0x50, 0x43, 0x43, 0x61, 0x6c, 0x6c, 0x4f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x73,\n\t0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0e,\n\t0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x88, 0x01,\n\t0x01, 0x12, 0x1b, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x48, 0x01, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x37,\n\t0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x72, 0x65, 0x63, 0x76, 0x5f,\n\t0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02,\n\t0x52, 0x12, 0x6d, 0x61, 0x78, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x63, 0x76, 0x4d, 0x73, 0x67,\n\t0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x63,\n\t0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a,\n\t0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x43, 0x61,\n\t0x6c, 0x6c, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01,\n\t0x12, 0x28, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x48, 0x04, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x69,\n\t0x63, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x74, 0x72,\n\t0x61, 0x69, 0x6c, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x07, 0x74,\n\t0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x0e, 0x77, 0x61, 0x69,\n\t0x74, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28,\n\t0x08, 0x48, 0x06, 0x52, 0x0c, 0x77, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x52, 0x65, 0x61, 0x64,\n\t0x79, 0x88, 0x01, 0x01, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,\n\t0x5f, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x68, 0x65, 0x61,\n\t0x64, 0x65, 0x72, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c,\n\t0x5f, 0x72, 0x65, 0x63, 0x76, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x19,\n\t0x0a, 0x17, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x65, 0x6e, 0x64,\n\t0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x74,\n\t0x61, 0x74, 0x69, 0x63, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x5f,\n\t0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x77, 0x61, 0x69, 0x74,\n\t0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x22, 0x64, 0x0a, 0x0e, 0x56, 0x61,\n\t0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72, 0x12, 0x17, 0x0a, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72,\n\t0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65,\n\t0x22, 0xb8, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,\n\t0x12, 0x42, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,\n\t0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x73,\n\t0x74, 0x61, 0x6e, 0x74, 0x12, 0x4b, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74,\n\t0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x72,\n\t0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x69,\n\t0x61, 0x6c, 0x48, 0x00, 0x52, 0x0b, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x69, 0x61,\n\t0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,\n\t0x66, 0x42, 0x08, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x79, 0x0a, 0x13, 0x52,\n\t0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61,\n\t0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c,\n\t0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69,\n\t0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, 0x01, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x52,\n\t0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x69, 0x6e,\n\t0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x72,\n\t0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0xd1, 0x02, 0x0a, 0x16, 0x52, 0x65, 0x74, 0x72, 0x79,\n\t0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x69, 0x61,\n\t0x6c, 0x12, 0x2e, 0x0a, 0x10, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x74,\n\t0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0f, 0x69,\n\t0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x88, 0x01,\n\t0x01, 0x12, 0x36, 0x0a, 0x14, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x48,\n\t0x01, 0x52, 0x13, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0a, 0x6d, 0x75, 0x6c,\n\t0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x48, 0x02, 0x52,\n\t0x0a, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x26,\n\t0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x04,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x49, 0x6e, 0x74, 0x65, 0x72,\n\t0x76, 0x61, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65,\n\t0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x48, 0x04, 0x52, 0x0a, 0x6d,\n\t0x61, 0x78, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x42, 0x13, 0x0a, 0x11,\n\t0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61,\n\t0x6c, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x6d,\n\t0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6d, 0x61,\n\t0x78, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d,\n\t0x61, 0x78, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x5d, 0x0a, 0x0d, 0x4d, 0x65,\n\t0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x66,\n\t0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c,\n\t0x64, 0x12, 0x13, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,\n\t0x02, 0x62, 0x79, 0x88, 0x01, 0x01, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x48, 0x01, 0x52, 0x02, 0x69, 0x66, 0x88, 0x01, 0x01, 0x42, 0x05, 0x0a, 0x03, 0x5f,\n\t0x62, 0x79, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x66, 0x22, 0x85, 0x01, 0x0a, 0x0e, 0x4d, 0x65,\n\t0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x17, 0x0a, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x88, 0x01, 0x01,\n\t0x12, 0x1f, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x08, 0x48, 0x02, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x88, 0x01,\n\t0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x66,\n\t0x69, 0x65, 0x6c, 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e,\n\t0x64, 0x22, 0x62, 0x0a, 0x08, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x12, 0x13, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,\n\t0x02, 0x62, 0x79, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x06, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65,\n\t0x88, 0x01, 0x01, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x62, 0x79, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x69,\n\t0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0xf2, 0x01, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52,\n\t0x75, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65,\n\t0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0e,\n\t0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x88, 0x01,\n\t0x01, 0x12, 0x13, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52,\n\t0x02, 0x62, 0x79, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x88, 0x01,\n\t0x01, 0x12, 0x31, 0x0a, 0x05, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x52, 0x05, 0x6f,\n\t0x6e, 0x65, 0x6f, 0x66, 0x12, 0x2f, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x05, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x52, 0x03, 0x65, 0x6e, 0x76, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d,\n\t0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x62, 0x79,\n\t0x42, 0x08, 0x0a, 0x06, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x89, 0x01, 0x0a, 0x0a, 0x46,\n\t0x69, 0x65, 0x6c, 0x64, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x12, 0x10, 0x0a, 0x02, 0x69, 0x66, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x69, 0x66, 0x12, 0x1a, 0x0a, 0x07, 0x64,\n\t0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x07,\n\t0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x03,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44,\n\t0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x0e,\n\t0x0a, 0x02, 0x62, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x62, 0x79, 0x42, 0x06,\n\t0x0a, 0x04, 0x63, 0x6f, 0x6e, 0x64, 0x22, 0x45, 0x0a, 0x09, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75,\n\t0x67, 0x69, 0x6e, 0x12, 0x38, 0x0a, 0x06, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20,\n\t0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x45,\n\t0x78, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x06, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x22, 0xaf, 0x02,\n\t0x0a, 0x0f, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x45, 0x78, 0x70, 0x6f, 0x72,\n\t0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x36, 0x0a, 0x05, 0x74, 0x79, 0x70,\n\t0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x52, 0x65,\n\t0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x74, 0x79, 0x70, 0x65,\n\t0x73, 0x12, 0x3a, 0x0a, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69,\n\t0x6f, 0x6e, 0x52, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3a, 0x0a,\n\t0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x09,\n\t0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x44, 0x0a, 0x0a, 0x63, 0x61, 0x70,\n\t0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c,\n\t0x69, 0x74, 0x79, 0x52, 0x0a, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22,\n\t0x9b, 0x02, 0x0a, 0x13, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x70,\n\t0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x3e, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e,\n\t0x45, 0x6e, 0x76, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x48, 0x00, 0x52,\n\t0x03, 0x65, 0x6e, 0x76, 0x88, 0x01, 0x01, 0x12, 0x54, 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x65, 0x5f,\n\t0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43,\n\t0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x73, 0x74,\n\t0x65, 0x6d, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x48, 0x01, 0x52, 0x0a,\n\t0x66, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x4a, 0x0a,\n\t0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b,\n\t0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72,\n\t0x6b, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x48, 0x02, 0x52, 0x07, 0x6e,\n\t0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x88, 0x01, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x65, 0x6e,\n\t0x76, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65,\n\t0x6d, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x40, 0x0a,\n\t0x16, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x45, 0x6e, 0x76, 0x43, 0x61, 0x70,\n\t0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d,\n\t0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22,\n\t0x3e, 0x0a, 0x1d, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65,\n\t0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79,\n\t0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 0x74, 0x68, 0x22,\n\t0x1c, 0x0a, 0x1a, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x4e, 0x65, 0x74, 0x77,\n\t0x6f, 0x72, 0x6b, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22, 0xa1, 0x01,\n\t0x0a, 0x0b, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x38, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x03, 0x20,\n\t0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,\n\t0x6e, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12,\n\t0x30, 0x0a, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72,\n\t0x6e, 0x22, 0x71, 0x0a, 0x0f, 0x43, 0x45, 0x4c, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72,\n\t0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x36, 0x0a, 0x07,\n\t0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x6d, 0x65, 0x74,\n\t0x68, 0x6f, 0x64, 0x73, 0x22, 0x6b, 0x0a, 0x13, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74,\n\t0x69, 0x6f, 0x6e, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,\n\t0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64,\n\t0x65, 0x73, 0x63, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70,\n\t0x65, 0x22, 0xdd, 0x01, 0x0a, 0x07, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2f, 0x0a,\n\t0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x79,\n\t0x70, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x36,\n\t0x0a, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65,\n\t0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2f, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65,\n\t0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x70, 0x12, 0x1a, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61,\n\t0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28,\n\t0x09, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70,\n\t0x65, 0x22, 0x68, 0x0a, 0x0a, 0x43, 0x45, 0x4c, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65, 0x12,\n\t0x2a, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43,\n\t0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76,\n\t0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70,\n\t0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c,\n\t0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x63, 0x0a, 0x0b, 0x43,\n\t0x45, 0x4c, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12,\n\t0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65,\n\t0x73, 0x63, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65,\n\t0x2a, 0x5e, 0x0a, 0x08, 0x54, 0x79, 0x70, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x0b, 0x0a, 0x07,\n\t0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52,\n\t0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x4f, 0x4f, 0x4c, 0x10, 0x02, 0x12,\n\t0x09, 0x0a, 0x05, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x49,\n\t0x4e, 0x54, 0x36, 0x34, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45,\n\t0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x06,\n\t0x3a, 0x4c, 0x0a, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x46, 0x69, 0x6c, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x3a, 0x58,\n\t0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52,\n\t0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x3a, 0x54, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a, 0x58,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52,\n\t0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x50, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c,\n\t0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52,\n\t0x75, 0x6c, 0x65, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x3a, 0x4c, 0x0a, 0x04, 0x65, 0x6e,\n\t0x75, 0x6d, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x75,\n\t0x6c, 0x65, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x3a, 0x61, 0x0a, 0x0a, 0x65, 0x6e, 0x75, 0x6d,\n\t0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c,\n\t0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x1e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x75, 0x6c, 0x65,\n\t0x52, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x50, 0x0a, 0x05, 0x6f,\n\t0x6e, 0x65, 0x6f, 0x66, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70,\n\t0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x6e, 0x65,\n\t0x6f, 0x66, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x42, 0xc2, 0x01,\n\t0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0f, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,\n\t0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x65, 0x72, 0x63, 0x61, 0x72, 0x69, 0x2f, 0x67, 0x72, 0x70,\n\t0x63, 0x2d, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x67, 0x72, 0x70,\n\t0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xa2, 0x02, 0x03, 0x47, 0x46, 0x58, 0xaa, 0x02, 0x0f,\n\t0x47, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xca,\n\t0x02, 0x0f, 0x47, 0x72, 0x70, 0x63, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0xe2, 0x02, 0x1b, 0x47, 0x72, 0x70, 0x63, 0x5c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea,\n\t0x02, 0x10, 0x47, 0x72, 0x70, 0x63, 0x3a, 0x3a, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_grpc_federation_federation_proto_rawDescOnce sync.Once\n\tfile_grpc_federation_federation_proto_rawDescData = file_grpc_federation_federation_proto_rawDesc\n)\n\nfunc file_grpc_federation_federation_proto_rawDescGZIP() []byte {\n\tfile_grpc_federation_federation_proto_rawDescOnce.Do(func() {\n\t\tfile_grpc_federation_federation_proto_rawDescData = protoimpl.X.CompressGZIP(file_grpc_federation_federation_proto_rawDescData)\n\t})\n\treturn file_grpc_federation_federation_proto_rawDescData\n}\n\nvar file_grpc_federation_federation_proto_enumTypes = make([]protoimpl.EnumInfo, 2)\nvar file_grpc_federation_federation_proto_msgTypes = make([]protoimpl.MessageInfo, 48)\nvar file_grpc_federation_federation_proto_goTypes = []interface{}{\n\t(TypeKind)(0),                          // 0: grpc.federation.TypeKind\n\t(GRPCError_LogLevel)(0),                // 1: grpc.federation.GRPCError.LogLevel\n\t(*FileRule)(nil),                       // 2: grpc.federation.FileRule\n\t(*EnumRule)(nil),                       // 3: grpc.federation.EnumRule\n\t(*EnumValueRule)(nil),                  // 4: grpc.federation.EnumValueRule\n\t(*EnumValueAttribute)(nil),             // 5: grpc.federation.EnumValueAttribute\n\t(*OneofRule)(nil),                      // 6: grpc.federation.OneofRule\n\t(*ServiceRule)(nil),                    // 7: grpc.federation.ServiceRule\n\t(*Env)(nil),                            // 8: grpc.federation.Env\n\t(*ServiceVariable)(nil),                // 9: grpc.federation.ServiceVariable\n\t(*ServiceVariableValidationExpr)(nil),  // 10: grpc.federation.ServiceVariableValidationExpr\n\t(*EnvVar)(nil),                         // 11: grpc.federation.EnvVar\n\t(*EnvType)(nil),                        // 12: grpc.federation.EnvType\n\t(*EnvMapType)(nil),                     // 13: grpc.federation.EnvMapType\n\t(*EnvVarOption)(nil),                   // 14: grpc.federation.EnvVarOption\n\t(*MethodRule)(nil),                     // 15: grpc.federation.MethodRule\n\t(*MessageRule)(nil),                    // 16: grpc.federation.MessageRule\n\t(*VariableDefinition)(nil),             // 17: grpc.federation.VariableDefinition\n\t(*MapExpr)(nil),                        // 18: grpc.federation.MapExpr\n\t(*Iterator)(nil),                       // 19: grpc.federation.Iterator\n\t(*MessageExpr)(nil),                    // 20: grpc.federation.MessageExpr\n\t(*EnumExpr)(nil),                       // 21: grpc.federation.EnumExpr\n\t(*CallExpr)(nil),                       // 22: grpc.federation.CallExpr\n\t(*SwitchExpr)(nil),                     // 23: grpc.federation.SwitchExpr\n\t(*SwitchCaseExpr)(nil),                 // 24: grpc.federation.SwitchCaseExpr\n\t(*SwitchDefaultExpr)(nil),              // 25: grpc.federation.SwitchDefaultExpr\n\t(*GRPCError)(nil),                      // 26: grpc.federation.GRPCError\n\t(*GRPCErrorDetail)(nil),                // 27: grpc.federation.GRPCErrorDetail\n\t(*GRPCCallOption)(nil),                 // 28: grpc.federation.GRPCCallOption\n\t(*ValidationExpr)(nil),                 // 29: grpc.federation.ValidationExpr\n\t(*RetryPolicy)(nil),                    // 30: grpc.federation.RetryPolicy\n\t(*RetryPolicyConstant)(nil),            // 31: grpc.federation.RetryPolicyConstant\n\t(*RetryPolicyExponential)(nil),         // 32: grpc.federation.RetryPolicyExponential\n\t(*MethodRequest)(nil),                  // 33: grpc.federation.MethodRequest\n\t(*MethodResponse)(nil),                 // 34: grpc.federation.MethodResponse\n\t(*Argument)(nil),                       // 35: grpc.federation.Argument\n\t(*FieldRule)(nil),                      // 36: grpc.federation.FieldRule\n\t(*FieldOneof)(nil),                     // 37: grpc.federation.FieldOneof\n\t(*CELPlugin)(nil),                      // 38: grpc.federation.CELPlugin\n\t(*CELPluginExport)(nil),                // 39: grpc.federation.CELPluginExport\n\t(*CELPluginCapability)(nil),            // 40: grpc.federation.CELPluginCapability\n\t(*CELPluginEnvCapability)(nil),         // 41: grpc.federation.CELPluginEnvCapability\n\t(*CELPluginFileSystemCapability)(nil),  // 42: grpc.federation.CELPluginFileSystemCapability\n\t(*CELPluginNetworkCapability)(nil),     // 43: grpc.federation.CELPluginNetworkCapability\n\t(*CELFunction)(nil),                    // 44: grpc.federation.CELFunction\n\t(*CELReceiverType)(nil),                // 45: grpc.federation.CELReceiverType\n\t(*CELFunctionArgument)(nil),            // 46: grpc.federation.CELFunctionArgument\n\t(*CELType)(nil),                        // 47: grpc.federation.CELType\n\t(*CELMapType)(nil),                     // 48: grpc.federation.CELMapType\n\t(*CELVariable)(nil),                    // 49: grpc.federation.CELVariable\n\t(code.Code)(0),                         // 50: google.rpc.Code\n\t(*errdetails.ErrorInfo)(nil),           // 51: google.rpc.ErrorInfo\n\t(*errdetails.RetryInfo)(nil),           // 52: google.rpc.RetryInfo\n\t(*errdetails.DebugInfo)(nil),           // 53: google.rpc.DebugInfo\n\t(*errdetails.QuotaFailure)(nil),        // 54: google.rpc.QuotaFailure\n\t(*errdetails.PreconditionFailure)(nil), // 55: google.rpc.PreconditionFailure\n\t(*errdetails.BadRequest)(nil),          // 56: google.rpc.BadRequest\n\t(*errdetails.RequestInfo)(nil),         // 57: google.rpc.RequestInfo\n\t(*errdetails.ResourceInfo)(nil),        // 58: google.rpc.ResourceInfo\n\t(*errdetails.Help)(nil),                // 59: google.rpc.Help\n\t(*errdetails.LocalizedMessage)(nil),    // 60: google.rpc.LocalizedMessage\n\t(*descriptorpb.FileOptions)(nil),       // 61: google.protobuf.FileOptions\n\t(*descriptorpb.ServiceOptions)(nil),    // 62: google.protobuf.ServiceOptions\n\t(*descriptorpb.MethodOptions)(nil),     // 63: google.protobuf.MethodOptions\n\t(*descriptorpb.MessageOptions)(nil),    // 64: google.protobuf.MessageOptions\n\t(*descriptorpb.FieldOptions)(nil),      // 65: google.protobuf.FieldOptions\n\t(*descriptorpb.EnumOptions)(nil),       // 66: google.protobuf.EnumOptions\n\t(*descriptorpb.EnumValueOptions)(nil),  // 67: google.protobuf.EnumValueOptions\n\t(*descriptorpb.OneofOptions)(nil),      // 68: google.protobuf.OneofOptions\n}\nvar file_grpc_federation_federation_proto_depIdxs = []int32{\n\t38, // 0: grpc.federation.FileRule.plugin:type_name -> grpc.federation.CELPlugin\n\t5,  // 1: grpc.federation.EnumValueRule.attr:type_name -> grpc.federation.EnumValueAttribute\n\t8,  // 2: grpc.federation.ServiceRule.env:type_name -> grpc.federation.Env\n\t9,  // 3: grpc.federation.ServiceRule.var:type_name -> grpc.federation.ServiceVariable\n\t11, // 4: grpc.federation.Env.var:type_name -> grpc.federation.EnvVar\n\t18, // 5: grpc.federation.ServiceVariable.map:type_name -> grpc.federation.MapExpr\n\t20, // 6: grpc.federation.ServiceVariable.message:type_name -> grpc.federation.MessageExpr\n\t10, // 7: grpc.federation.ServiceVariable.validation:type_name -> grpc.federation.ServiceVariableValidationExpr\n\t21, // 8: grpc.federation.ServiceVariable.enum:type_name -> grpc.federation.EnumExpr\n\t23, // 9: grpc.federation.ServiceVariable.switch:type_name -> grpc.federation.SwitchExpr\n\t12, // 10: grpc.federation.EnvVar.type:type_name -> grpc.federation.EnvType\n\t14, // 11: grpc.federation.EnvVar.option:type_name -> grpc.federation.EnvVarOption\n\t0,  // 12: grpc.federation.EnvType.kind:type_name -> grpc.federation.TypeKind\n\t12, // 13: grpc.federation.EnvType.repeated:type_name -> grpc.federation.EnvType\n\t13, // 14: grpc.federation.EnvType.map:type_name -> grpc.federation.EnvMapType\n\t12, // 15: grpc.federation.EnvMapType.key:type_name -> grpc.federation.EnvType\n\t12, // 16: grpc.federation.EnvMapType.value:type_name -> grpc.federation.EnvType\n\t17, // 17: grpc.federation.MessageRule.def:type_name -> grpc.federation.VariableDefinition\n\t18, // 18: grpc.federation.VariableDefinition.map:type_name -> grpc.federation.MapExpr\n\t20, // 19: grpc.federation.VariableDefinition.message:type_name -> grpc.federation.MessageExpr\n\t22, // 20: grpc.federation.VariableDefinition.call:type_name -> grpc.federation.CallExpr\n\t29, // 21: grpc.federation.VariableDefinition.validation:type_name -> grpc.federation.ValidationExpr\n\t21, // 22: grpc.federation.VariableDefinition.enum:type_name -> grpc.federation.EnumExpr\n\t23, // 23: grpc.federation.VariableDefinition.switch:type_name -> grpc.federation.SwitchExpr\n\t19, // 24: grpc.federation.MapExpr.iterator:type_name -> grpc.federation.Iterator\n\t20, // 25: grpc.federation.MapExpr.message:type_name -> grpc.federation.MessageExpr\n\t21, // 26: grpc.federation.MapExpr.enum:type_name -> grpc.federation.EnumExpr\n\t35, // 27: grpc.federation.MessageExpr.args:type_name -> grpc.federation.Argument\n\t33, // 28: grpc.federation.CallExpr.request:type_name -> grpc.federation.MethodRequest\n\t30, // 29: grpc.federation.CallExpr.retry:type_name -> grpc.federation.RetryPolicy\n\t26, // 30: grpc.federation.CallExpr.error:type_name -> grpc.federation.GRPCError\n\t28, // 31: grpc.federation.CallExpr.option:type_name -> grpc.federation.GRPCCallOption\n\t24, // 32: grpc.federation.SwitchExpr.case:type_name -> grpc.federation.SwitchCaseExpr\n\t25, // 33: grpc.federation.SwitchExpr.default:type_name -> grpc.federation.SwitchDefaultExpr\n\t17, // 34: grpc.federation.SwitchCaseExpr.def:type_name -> grpc.federation.VariableDefinition\n\t17, // 35: grpc.federation.SwitchDefaultExpr.def:type_name -> grpc.federation.VariableDefinition\n\t17, // 36: grpc.federation.GRPCError.def:type_name -> grpc.federation.VariableDefinition\n\t50, // 37: grpc.federation.GRPCError.code:type_name -> google.rpc.Code\n\t27, // 38: grpc.federation.GRPCError.details:type_name -> grpc.federation.GRPCErrorDetail\n\t1,  // 39: grpc.federation.GRPCError.log_level:type_name -> grpc.federation.GRPCError.LogLevel\n\t17, // 40: grpc.federation.GRPCErrorDetail.def:type_name -> grpc.federation.VariableDefinition\n\t20, // 41: grpc.federation.GRPCErrorDetail.message:type_name -> grpc.federation.MessageExpr\n\t51, // 42: grpc.federation.GRPCErrorDetail.error_info:type_name -> google.rpc.ErrorInfo\n\t52, // 43: grpc.federation.GRPCErrorDetail.retry_info:type_name -> google.rpc.RetryInfo\n\t53, // 44: grpc.federation.GRPCErrorDetail.debug_info:type_name -> google.rpc.DebugInfo\n\t54, // 45: grpc.federation.GRPCErrorDetail.quota_failure:type_name -> google.rpc.QuotaFailure\n\t55, // 46: grpc.federation.GRPCErrorDetail.precondition_failure:type_name -> google.rpc.PreconditionFailure\n\t56, // 47: grpc.federation.GRPCErrorDetail.bad_request:type_name -> google.rpc.BadRequest\n\t57, // 48: grpc.federation.GRPCErrorDetail.request_info:type_name -> google.rpc.RequestInfo\n\t58, // 49: grpc.federation.GRPCErrorDetail.resource_info:type_name -> google.rpc.ResourceInfo\n\t59, // 50: grpc.federation.GRPCErrorDetail.help:type_name -> google.rpc.Help\n\t60, // 51: grpc.federation.GRPCErrorDetail.localized_message:type_name -> google.rpc.LocalizedMessage\n\t26, // 52: grpc.federation.ValidationExpr.error:type_name -> grpc.federation.GRPCError\n\t31, // 53: grpc.federation.RetryPolicy.constant:type_name -> grpc.federation.RetryPolicyConstant\n\t32, // 54: grpc.federation.RetryPolicy.exponential:type_name -> grpc.federation.RetryPolicyExponential\n\t37, // 55: grpc.federation.FieldRule.oneof:type_name -> grpc.federation.FieldOneof\n\t14, // 56: grpc.federation.FieldRule.env:type_name -> grpc.federation.EnvVarOption\n\t17, // 57: grpc.federation.FieldOneof.def:type_name -> grpc.federation.VariableDefinition\n\t39, // 58: grpc.federation.CELPlugin.export:type_name -> grpc.federation.CELPluginExport\n\t45, // 59: grpc.federation.CELPluginExport.types:type_name -> grpc.federation.CELReceiverType\n\t44, // 60: grpc.federation.CELPluginExport.functions:type_name -> grpc.federation.CELFunction\n\t49, // 61: grpc.federation.CELPluginExport.variables:type_name -> grpc.federation.CELVariable\n\t40, // 62: grpc.federation.CELPluginExport.capability:type_name -> grpc.federation.CELPluginCapability\n\t41, // 63: grpc.federation.CELPluginCapability.env:type_name -> grpc.federation.CELPluginEnvCapability\n\t42, // 64: grpc.federation.CELPluginCapability.file_system:type_name -> grpc.federation.CELPluginFileSystemCapability\n\t43, // 65: grpc.federation.CELPluginCapability.network:type_name -> grpc.federation.CELPluginNetworkCapability\n\t46, // 66: grpc.federation.CELFunction.args:type_name -> grpc.federation.CELFunctionArgument\n\t47, // 67: grpc.federation.CELFunction.return:type_name -> grpc.federation.CELType\n\t44, // 68: grpc.federation.CELReceiverType.methods:type_name -> grpc.federation.CELFunction\n\t47, // 69: grpc.federation.CELFunctionArgument.type:type_name -> grpc.federation.CELType\n\t0,  // 70: grpc.federation.CELType.kind:type_name -> grpc.federation.TypeKind\n\t47, // 71: grpc.federation.CELType.repeated:type_name -> grpc.federation.CELType\n\t48, // 72: grpc.federation.CELType.map:type_name -> grpc.federation.CELMapType\n\t47, // 73: grpc.federation.CELMapType.key:type_name -> grpc.federation.CELType\n\t47, // 74: grpc.federation.CELMapType.value:type_name -> grpc.federation.CELType\n\t47, // 75: grpc.federation.CELVariable.type:type_name -> grpc.federation.CELType\n\t61, // 76: grpc.federation.file:extendee -> google.protobuf.FileOptions\n\t62, // 77: grpc.federation.service:extendee -> google.protobuf.ServiceOptions\n\t63, // 78: grpc.federation.method:extendee -> google.protobuf.MethodOptions\n\t64, // 79: grpc.federation.message:extendee -> google.protobuf.MessageOptions\n\t65, // 80: grpc.federation.field:extendee -> google.protobuf.FieldOptions\n\t66, // 81: grpc.federation.enum:extendee -> google.protobuf.EnumOptions\n\t67, // 82: grpc.federation.enum_value:extendee -> google.protobuf.EnumValueOptions\n\t68, // 83: grpc.federation.oneof:extendee -> google.protobuf.OneofOptions\n\t2,  // 84: grpc.federation.file:type_name -> grpc.federation.FileRule\n\t7,  // 85: grpc.federation.service:type_name -> grpc.federation.ServiceRule\n\t15, // 86: grpc.federation.method:type_name -> grpc.federation.MethodRule\n\t16, // 87: grpc.federation.message:type_name -> grpc.federation.MessageRule\n\t36, // 88: grpc.federation.field:type_name -> grpc.federation.FieldRule\n\t3,  // 89: grpc.federation.enum:type_name -> grpc.federation.EnumRule\n\t4,  // 90: grpc.federation.enum_value:type_name -> grpc.federation.EnumValueRule\n\t6,  // 91: grpc.federation.oneof:type_name -> grpc.federation.OneofRule\n\t92, // [92:92] is the sub-list for method output_type\n\t92, // [92:92] is the sub-list for method input_type\n\t84, // [84:92] is the sub-list for extension type_name\n\t76, // [76:84] is the sub-list for extension extendee\n\t0,  // [0:76] is the sub-list for field type_name\n}\n\nfunc init() { file_grpc_federation_federation_proto_init() }\nfunc file_grpc_federation_federation_proto_init() {\n\tif File_grpc_federation_federation_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_grpc_federation_federation_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*FileRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumValueRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumValueAttribute); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*OneofRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Env); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceVariable); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceVariableValidationExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvVar); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvMapType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvVarOption); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MethodRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MessageRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*VariableDefinition); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MapExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Iterator); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MessageExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CallExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SwitchExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SwitchCaseExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SwitchDefaultExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GRPCError); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GRPCErrorDetail); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GRPCCallOption); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ValidationExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RetryPolicy); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RetryPolicyConstant); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RetryPolicyExponential); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MethodRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MethodResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Argument); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*FieldRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*FieldOneof); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPlugin); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginExport); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginEnvCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginFileSystemCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginNetworkCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELFunction); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELReceiverType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELFunctionArgument); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELMapType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELVariable); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[2].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[7].OneofWrappers = []interface{}{\n\t\t(*ServiceVariable_By)(nil),\n\t\t(*ServiceVariable_Map)(nil),\n\t\t(*ServiceVariable_Message)(nil),\n\t\t(*ServiceVariable_Validation)(nil),\n\t\t(*ServiceVariable_Enum)(nil),\n\t\t(*ServiceVariable_Switch)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[9].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[10].OneofWrappers = []interface{}{\n\t\t(*EnvType_Kind)(nil),\n\t\t(*EnvType_Repeated)(nil),\n\t\t(*EnvType_Map)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[12].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[13].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[14].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[15].OneofWrappers = []interface{}{\n\t\t(*VariableDefinition_By)(nil),\n\t\t(*VariableDefinition_Map)(nil),\n\t\t(*VariableDefinition_Message)(nil),\n\t\t(*VariableDefinition_Call)(nil),\n\t\t(*VariableDefinition_Validation)(nil),\n\t\t(*VariableDefinition_Enum)(nil),\n\t\t(*VariableDefinition_Switch)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[16].OneofWrappers = []interface{}{\n\t\t(*MapExpr_By)(nil),\n\t\t(*MapExpr_Message)(nil),\n\t\t(*MapExpr_Enum)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[20].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[22].OneofWrappers = []interface{}{\n\t\t(*SwitchCaseExpr_By)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[23].OneofWrappers = []interface{}{\n\t\t(*SwitchDefaultExpr_By)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[24].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[26].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[27].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[28].OneofWrappers = []interface{}{\n\t\t(*RetryPolicy_Constant)(nil),\n\t\t(*RetryPolicy_Exponential)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[29].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[30].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[31].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[32].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[33].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[34].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[35].OneofWrappers = []interface{}{\n\t\t(*FieldOneof_If)(nil),\n\t\t(*FieldOneof_Default)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[38].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[45].OneofWrappers = []interface{}{\n\t\t(*CELType_Kind)(nil),\n\t\t(*CELType_Repeated)(nil),\n\t\t(*CELType_Map)(nil),\n\t\t(*CELType_Message)(nil),\n\t\t(*CELType_Enum)(nil),\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_grpc_federation_federation_proto_rawDesc,\n\t\t\tNumEnums:      2,\n\t\t\tNumMessages:   48,\n\t\t\tNumExtensions: 8,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_grpc_federation_federation_proto_goTypes,\n\t\tDependencyIndexes: file_grpc_federation_federation_proto_depIdxs,\n\t\tEnumInfos:         file_grpc_federation_federation_proto_enumTypes,\n\t\tMessageInfos:      file_grpc_federation_federation_proto_msgTypes,\n\t\tExtensionInfos:    file_grpc_federation_federation_proto_extTypes,\n\t}.Build()\n\tFile_grpc_federation_federation_proto = out.File\n\tfile_grpc_federation_federation_proto_rawDesc = nil\n\tfile_grpc_federation_federation_proto_goTypes = nil\n\tfile_grpc_federation_federation_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "_examples/22_switch/grpc-federation.yaml",
    "content": "imports:\n  - proto\nsrc:\n  - proto\nout: .\nplugins:\n  - plugin: go\n    opt: paths=source_relative\n  - plugin: go-grpc\n    opt: paths=source_relative\n  - plugin: grpc-federation\n    opt:\n    - paths=source_relative\n    - import_paths=proto\n"
  },
  {
    "path": "_examples/22_switch/main_test.go",
    "content": "package main_test\n\nimport (\n\t\"context\"\n\t\"log/slog\"\n\t\"net\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\"\n\t\"go.opentelemetry.io/otel/propagation\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\tsdktrace \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.4.0\"\n\t\"go.uber.org/goleak\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/credentials/insecure\"\n\t\"google.golang.org/grpc/test/bufconn\"\n\n\t\"example/federation\"\n)\n\nconst bufSize = 1024\n\nvar (\n\tlistener *bufconn.Listener\n)\n\ntype clientConfig struct{}\n\nfunc dialer(ctx context.Context, address string) (net.Conn, error) {\n\treturn listener.Dial()\n}\n\nfunc TestFederation(t *testing.T) {\n\tdefer goleak.VerifyNone(t)\n\n\tctx := context.Background()\n\tlistener = bufconn.Listen(bufSize)\n\n\tif os.Getenv(\"ENABLE_JAEGER\") != \"\" {\n\t\texporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithInsecure())\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttp := sdktrace.NewTracerProvider(\n\t\t\tsdktrace.WithBatcher(exporter),\n\t\t\tsdktrace.WithResource(\n\t\t\t\tresource.NewWithAttributes(\n\t\t\t\t\tsemconv.SchemaURL,\n\t\t\t\t\tsemconv.ServiceNameKey.String(\"example22/switch\"),\n\t\t\t\t\tsemconv.ServiceVersionKey.String(\"1.0.0\"),\n\t\t\t\t\tattribute.String(\"environment\", \"dev\"),\n\t\t\t\t),\n\t\t\t),\n\t\t\tsdktrace.WithSampler(sdktrace.AlwaysSample()),\n\t\t)\n\t\tdefer tp.Shutdown(ctx)\n\t\totel.SetTextMapPropagator(propagation.TraceContext{})\n\t\totel.SetTracerProvider(tp)\n\t}\n\n\tconn, err := grpc.DialContext(\n\t\tctx, \"\",\n\t\tgrpc.WithContextDialer(dialer),\n\t\tgrpc.WithTransportCredentials(insecure.NewCredentials()),\n\t)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer conn.Close()\n\n\tgrpcServer := grpc.NewServer()\n\tdefer grpcServer.Stop()\n\n\tlogger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{\n\t\tLevel: slog.LevelDebug,\n\t}))\n\tfederationServer, err := federation.NewFederationService(federation.FederationServiceConfig{\n\t\tLogger: logger,\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer federation.CleanupFederationService(ctx, federationServer)\n\tfederation.RegisterFederationServiceServer(grpcServer, federationServer)\n\n\tgo func() {\n\t\tif err := grpcServer.Serve(listener); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t}()\n\n\ttests := []struct {\n\t\tdesc string\n\t\treq  *federation.GetPostRequest\n\t\twant *federation.GetPostResponse\n\t}{\n\t\t{\n\t\t\tdesc: \"blue\",\n\t\t\treq:  &federation.GetPostRequest{Id: \"blue\"},\n\t\t\twant: &federation.GetPostResponse{Svar: 2, Switch: 3},\n\t\t},\n\t\t{\n\t\t\tdesc: \"red\",\n\t\t\treq:  &federation.GetPostRequest{Id: \"red\"},\n\t\t\twant: &federation.GetPostResponse{Svar: 2, Switch: 4},\n\t\t},\n\t\t{\n\t\t\tdesc: \"default\",\n\t\t\treq:  &federation.GetPostRequest{Id: \"green\"},\n\t\t\twant: &federation.GetPostResponse{Svar: 2, Switch: 5},\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.desc, func(t *testing.T) {\n\t\t\tclient := federation.NewFederationServiceClient(conn)\n\t\t\tres, err := client.GetPost(ctx, tt.req)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tif diff := cmp.Diff(res, tt.want, cmpopts.IgnoreUnexported(\n\t\t\t\tfederation.GetPostResponse{},\n\t\t\t)); diff != \"\" {\n\t\t\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "_examples/22_switch/proto/buf.yaml",
    "content": "version: v1\nbreaking:\n  use:\n    - FILE\nlint:\n  use:\n    - DEFAULT\n"
  },
  {
    "path": "_examples/22_switch/proto/federation/federation.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {\n    env {\n      var { name: \"a\" type { kind: STRING } option { default: \"none\" } }\n    }\n    var {\n      name: \"svar\"\n      switch {\n        case { if: \"grpc.federation.env.a == 'red'\" by: \"1\" }\n        default { by: \"2\" }\n      }\n    }\n  };\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (.grpc.federation.message) = {\n    def {\n      name: \"switch\"\n      switch {\n        case { if: \"$.id == 'blue'\" by: \"3\" }\n        case {\n          def { name: \"red\" by: \"4\" }\n          if: \"$.id == 'red'\"\n          by: \"red\"\n        }\n        default {\n          def { name: \"default\" by: \"5\" }\n          by: \"default\"\n        }\n      }\n    }\n  };\n  int64 svar = 1 [(grpc.federation.field).by = \"grpc.federation.var.svar\"];\n  int64 switch = 2 [(grpc.federation.field).by = \"switch\"];\n}"
  },
  {
    "path": "buf.gen.yaml",
    "content": "version: v1\nplugins:\n  - plugin: go\n    out: .\n    opt: module=github.com/mercari/grpc-federation\n"
  },
  {
    "path": "buf.work.yaml",
    "content": "version: v1\ndirectories:\n  - proto\n"
  },
  {
    "path": "cmd/grpc-federation-generator/main.go",
    "content": "package main\n\nimport (\n\t\"context\"\n\t\"log\"\n\t\"os\"\n\n\t\"github.com/jessevdk/go-flags\"\n\n\t\"github.com/mercari/grpc-federation/generator\"\n)\n\ntype option struct {\n\tConfig    string `description:\"specify the config path\" long:\"config\" short:\"c\" default:\"grpc-federation.yaml\"`\n\tWatchMode bool   `description:\"enable 'watch' mode to monitor changes in proto files and generate interactively\" short:\"w\"`\n}\n\nconst (\n\texitOK  = 0\n\texitERR = 1\n)\n\nfunc main() {\n\targs, opt, err := parseOpt()\n\tif err != nil {\n\t\t// output error message to stderr by library\n\t\tos.Exit(exitOK)\n\t}\n\tif err := _main(context.Background(), args, opt); err != nil {\n\t\tlog.Printf(\"%+v\", err)\n\t\tos.Exit(exitERR)\n\t}\n\tos.Exit(exitOK)\n}\n\nfunc _main(ctx context.Context, args []string, opt *option) error {\n\tcfg, err := generator.LoadConfig(opt.Config)\n\tif err != nil {\n\t\treturn err\n\t}\n\tvar protoPath string\n\tif len(args) != 0 {\n\t\tprotoPath = args[0]\n\t}\n\tg := generator.New(cfg)\n\tdefer g.Close(ctx)\n\tvar opts []generator.Option\n\tif opt.WatchMode {\n\t\topts = append(opts, generator.WatchMode())\n\t}\n\tg.SetPostProcessHandler(func(ctx context.Context, path string, result generator.Result) error {\n\t\tfor _, r := range result {\n\t\t\tif err := r.WriteFiles(ctx); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t})\n\tif err := g.Generate(ctx, protoPath, opts...); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc parseOpt() ([]string, *option, error) {\n\tvar opt option\n\tparser := flags.NewParser(&opt, flags.Default)\n\targs, err := parser.Parse()\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\treturn args, &opt, nil\n}\n"
  },
  {
    "path": "cmd/grpc-federation-language-server/README.md",
    "content": "# gRPC Federation Language Server\n\n<img width=\"500px\" src=\"https://github.com/mercari/grpc-federation/blob/main/images/logo.png?raw=true\"/>\n\n## Features\n\n### Syntax Highlighting\n\nSemantic Highlighting allows for accurate recognition of gRPC Federation options.\nSyntax highlighting is available in quoted value. So, this is especially effective in CEL value.\n\n<img width=\"800px\" src=\"https://github.com/mercari/grpc-federation/blob/main/images/semantic_highlighting.png?raw=true\"/>\n\n### Goto Definition\n\nIt supports jumps to the following definition sources.\n\n- Imported file name\n  - e.g.) import \"<u>path/to/foo.proto</u>\"\n\n- Type of field definition\n  - e.g.) <u>Foo</u> foo = 1\n\n- gRPC method name\n  - e.g.) def { call { method: \"<u>foopkg.FooService/BarMethod</u>\" } }\n\n- Alias name\n  - e.g.) option (grpc.federation.message).alias = \"<u>foopkg.Bar</u>\"\n\n### Diagnostics\n\n### Code Completion\n\n## Installation\n\n```console\n$ go install github.com/mercari/grpc-federation/cmd/grpc-federation-language-server@latest\n```\n\n## Usage\n\n```console\nUsage:\n  grpc-federation-language-server [OPTIONS]\n\nApplication Options:\n      --log-file=    specify the log file path for debugging\n  -I, --import-path= specify the import path for loading proto file\n\nHelp Options:\n  -h, --help         Show this help message\n```\n\n## Clients\n\nThe list of extensions or plugins for the IDE.\n\n### Visual Studio Code\n\nhttps://marketplace.visualstudio.com/items?itemName=Mercari.grpc-federation"
  },
  {
    "path": "cmd/grpc-federation-language-server/main.go",
    "content": "package main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\n\t\"github.com/jessevdk/go-flags\"\n\n\t\"github.com/mercari/grpc-federation/lsp/server\"\n)\n\ntype option struct {\n\tLogFile     string   `description:\"specify the log file path for debugging\" long:\"log-file\"`\n\tImportPaths []string `description:\"specify the import path for loading proto file\" long:\"import-path\" short:\"I\"`\n}\n\nfunc main() {\n\tif err := run(context.Background()); err != nil {\n\t\tlog.Fatalf(\"[grpc-federation-language-server]: %+v\", err)\n\t}\n}\n\nfunc parseOpt() ([]string, *option, error) {\n\tvar opt option\n\tparser := flags.NewParser(&opt, flags.Default)\n\targs, err := parser.Parse()\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\treturn args, &opt, nil\n}\n\nfunc run(ctx context.Context) error {\n\t_, opt, err := parseOpt()\n\tif err != nil {\n\t\t// output error message to stderr by library\n\t\treturn nil\n\t}\n\n\tvar opts []server.ServerOption\n\tif opt.LogFile != \"\" {\n\t\tlogFile, err := os.OpenFile(opt.LogFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0666)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to open %s: %w\", opt.LogFile, err)\n\t\t}\n\t\tdefer logFile.Close()\n\t\topts = append(opts, server.LogFileOption(logFile))\n\t}\n\tif len(opt.ImportPaths) != 0 {\n\t\topts = append(opts, server.ImportPathsOption(opt.ImportPaths))\n\t}\n\tsvr := server.New(opts...)\n\tsvr.Run(ctx)\n\treturn nil\n}\n"
  },
  {
    "path": "cmd/grpc-federation-linter/main.go",
    "content": "package main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\n\t\"github.com/jessevdk/go-flags\"\n\n\t\"github.com/mercari/grpc-federation/source\"\n\t\"github.com/mercari/grpc-federation/validator\"\n)\n\ntype option struct {\n\tImportPaths []string `description:\"specify the import path for loading proto file\" long:\"import-path\" short:\"I\"`\n}\n\nconst (\n\texitOK  = 0\n\texitERR = 1\n)\n\nfunc main() {\n\targs, opt, err := parseOpt()\n\tif err != nil {\n\t\t// output error message to stderr by library\n\t\tos.Exit(exitERR)\n\t}\n\tif len(args) == 0 {\n\t\tlog.Fatal(\"[grpc-federation-linter]: required file path to validation\")\n\t}\n\tctx := context.Background()\n\tvar existsErr bool\n\tfor _, arg := range args {\n\t\tpath := arg\n\t\tf, err := os.ReadFile(path)\n\t\tif err != nil {\n\t\t\tlog.Fatalf(\"[grpc-federation-linter]: failed to read file %s: %v\", path, err)\n\t\t}\n\t\tfile, err := source.NewFile(path, f)\n\t\tif err != nil {\n\t\t\tlog.Fatalf(\"[grpc-federation-linter]: %v\", err)\n\t\t}\n\n\t\tv := validator.New()\n\t\touts := v.Validate(ctx, file, validator.ImportPathOption(opt.ImportPaths...))\n\t\tif len(outs) == 0 {\n\t\t\tcontinue\n\t\t}\n\t\tfmt.Println(validator.Format(outs))\n\t\tif validator.ExistsError(outs) {\n\t\t\texistsErr = true\n\t\t}\n\t}\n\tif existsErr {\n\t\tos.Exit(exitERR)\n\t}\n\tos.Exit(exitOK)\n}\n\nfunc parseOpt() ([]string, *option, error) {\n\tvar opt option\n\tparser := flags.NewParser(&opt, flags.Default)\n\targs, err := parser.Parse()\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\treturn args, &opt, nil\n}\n"
  },
  {
    "path": "cmd/grpc-federation-mcp-server/assets/docs.md",
    "content": "# How to use gRPC Federation\n\n## Understanding gRPC Federation\n\nFirst, read https://deepwiki.com/mercari/grpc-federation to understand gRPC Federation.\n\nThe `grpc/federation/federation.proto` is defined at https://github.com/mercari/grpc-federation/blob/main/proto/grpc/federation/federation.proto.\n\nThe schema defined in this proto represents the options configurable in gRPC Federation.\n\nDetailed explanations of these options can be found at https://github.com/mercari/grpc-federation/blob/main/docs/references.md.\n\nWhen describing gRPC Federation options, implement them based on this information.\n\n## Practices for Describing gRPC Federation Options\n\n- If you want to validate or process errors returned from dependent microservices, use the `(grpc.federation.message).def.call.error` option.\n- Avoid creating messages unrelated to the response structure of the microservice you are building.\n    - If the same value is always returned, use Service Variable. Otherwise, create a message only when the same process is used in multiple places and the process itself is complex.\n      If the process is not complex, even if it is the same process, it is preferable to write the process directly in the existing message. Actively use the alias functionality of messages or enums when simple mapping suffices.\n- To avoid redundant `grpc.federation.field` option descriptions, actively use the `autobind` feature.\n- You can associate enum values with strings using `(grpc.federation.enum_value).attr`. Use this feature actively if necessary.\n- gRPC Federation provides a wide range of standard libraries starting with `grpc.federation.*`. Consider whether these features can be utilized as needed.\n- When the package is the same, you can omit the package prefix when referencing other messages or enums using `(grpc.federation.message).def.message` or `(grpc.federation.message).def.enum`. Otherwise, always include the package prefix.\n- The CEL specification is available at https://github.com/google/cel-spec/blob/master/doc/langdef.md.\n    - Additionally, in gRPC Federation, you can use the optional keyword (`?`). Always consider using optional when the existence of the target value cannot be guaranteed during field access or index access (the optional feature is also explained at https://pkg.go.dev/github.com/google/cel-go/cel#hdr-Syntax_Changes-OptionalTypes).\n- Use `custom_resolver` only as a last resort. Use it only when it is impossible to express something in proto.\n\n## Examples of gRPC Federation\n\nTo learn more about how to describe gRPC Federation options, refer to the examples at https://github.com/mercari/grpc-federation/tree/main/_examples.\nEach example includes Go language files (`*_grpc_federation.pb.go`) and test codes generated automatically from the proto descriptions. Read these codes as needed to understand the meaning of the options.\n\n## When Changing gRPC Federation Options\n\nWhen changing gRPC Federation options, always compile the target proto file and repeat the process until it succeeds to verify the correctness of the description.\n\nFollow the steps below to compile the proto file:\n\n1. Extract the list of import files from the proto file to be compiled. Use the `get_import_proto_list` tool for extraction.\n2. Create the absolute path of the import path required to compile the obtained import file list. Analyze the current repository structure to use the correct information.\n3. Repeat steps 1 to 2 for the obtained import paths to create a unique and complete list of import paths required for compilation.\n4. Use the `compile_proto` tool with the extracted import path list to compile the target proto file.\n"
  },
  {
    "path": "cmd/grpc-federation-mcp-server/main.go",
    "content": "package main\n\nimport (\n\t\"context\"\n\t\"embed\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\n\t\"github.com/mark3labs/mcp-go/mcp\"\n\t\"github.com/mark3labs/mcp-go/server\"\n\n\t\"github.com/mercari/grpc-federation/source\"\n\t\"github.com/mercari/grpc-federation/validator\"\n)\n\n//go:embed assets/*\nvar assets embed.FS\n\nfunc main() {\n\tdocs, err := assets.ReadFile(\"assets/docs.md\")\n\tif err != nil {\n\t\tlog.Fatalf(\"failed to read document: %v\", err)\n\t}\n\n\t// Create a new MCP server\n\ts := server.NewMCPServer(\n\t\t\"gRPC Federation MCP Server\",\n\t\t\"1.0.0\",\n\t\tserver.WithToolCapabilities(false),\n\t\tserver.WithResourceCapabilities(false, false),\n\t\tserver.WithRecovery(),\n\t\tserver.WithInstructions(string(docs)),\n\t)\n\n\ts.AddTool(\n\t\tmcp.NewTool(\n\t\t\t\"get_import_proto_list\",\n\t\t\tmcp.WithDescription(\"Returns a list of import proto files used in the specified proto file\"),\n\t\t\tmcp.WithString(\n\t\t\t\t\"path\",\n\t\t\t\tmcp.Description(\"The absolute path to the proto file to be analyzed\"),\n\t\t\t\tmcp.Required(),\n\t\t\t),\n\t\t),\n\t\tfunc(ctx context.Context, r mcp.CallToolRequest) (*mcp.CallToolResult, error) {\n\t\t\targs, ok := r.Params.Arguments.(map[string]any)\n\t\t\tif !ok {\n\t\t\t\treturn nil, fmt.Errorf(\"unexpected argument format: %T\", r.Params.Arguments)\n\t\t\t}\n\t\t\tpath, ok := args[\"path\"].(string)\n\t\t\tif !ok {\n\t\t\t\treturn nil, fmt.Errorf(\"failed to find path parameter from arguments: %v\", args)\n\t\t\t}\n\t\t\tcontent, err := os.ReadFile(path)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"failed to read file: %w\", err)\n\t\t\t}\n\t\t\tf, err := source.NewFile(path, content)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tlist, err := json.Marshal(append(f.Imports(), f.ImportsByImportRule()...))\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn &mcp.CallToolResult{\n\t\t\t\tContent: []mcp.Content{\n\t\t\t\t\tmcp.TextContent{\n\t\t\t\t\t\tType: \"text\",\n\t\t\t\t\t\tText: string(list),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}, nil\n\t\t},\n\t)\n\n\ts.AddTool(\n\t\tmcp.NewTool(\n\t\t\t\"compile_proto\",\n\t\t\tmcp.WithDescription(\"Compile the proto file using the gRPC Federation option\"),\n\t\t\tmcp.WithString(\n\t\t\t\t\"path\",\n\t\t\t\tmcp.Description(\"The absolute path to the proto file to be analyzed\"),\n\t\t\t\tmcp.Required(),\n\t\t\t),\n\t\t\tmcp.WithArray(\n\t\t\t\t\"import_paths\",\n\t\t\t\tmcp.Description(\"Specify the list of import paths required to locate dependency files during compilation. It is recommended to obtain this list using the get_import_proto_list tool\"),\n\t\t\t\tmcp.Required(),\n\t\t\t),\n\t\t),\n\t\tfunc(ctx context.Context, r mcp.CallToolRequest) (*mcp.CallToolResult, error) {\n\t\t\targs, ok := r.Params.Arguments.(map[string]any)\n\t\t\tif !ok {\n\t\t\t\treturn nil, fmt.Errorf(\"unexpected argument format: %T\", r.Params.Arguments)\n\t\t\t}\n\t\t\tpath, ok := args[\"path\"].(string)\n\t\t\tif !ok {\n\t\t\t\treturn nil, fmt.Errorf(\"failed to find path parameter from arguments: %v\", args)\n\t\t\t}\n\t\t\timportPathsArg, ok := args[\"import_paths\"].([]any)\n\t\t\tif !ok {\n\t\t\t\treturn nil, fmt.Errorf(\"failed to find import_paths parameter from arguments: %v\", args)\n\t\t\t}\n\t\t\tcontent, err := os.ReadFile(path)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"failed to read file: %w\", err)\n\t\t\t}\n\t\t\tfile, err := source.NewFile(path, content)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\timportPaths := make([]string, 0, len(importPathsArg))\n\t\t\tfor _, p := range importPathsArg {\n\t\t\t\timportPath, ok := p.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn nil, fmt.Errorf(\"failed to get import_paths element. required type is string but got %T\", p)\n\t\t\t\t}\n\t\t\t\timportPaths = append(importPaths, importPath)\n\t\t\t}\n\t\t\tv := validator.New()\n\t\t\touts := v.Validate(context.Background(), file, validator.ImportPathOption(importPaths...))\n\t\t\tif validator.ExistsError(outs) {\n\t\t\t\treturn nil, fmt.Errorf(\"failed to compile:\\n%s\", validator.Format(outs))\n\t\t\t}\n\t\t\treturn &mcp.CallToolResult{\n\t\t\t\tContent: []mcp.Content{\n\t\t\t\t\tmcp.TextContent{\n\t\t\t\t\t\tType: \"text\",\n\t\t\t\t\t\tText: \"build successful\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}, nil\n\t\t},\n\t)\n\n\ts.AddResource(\n\t\tmcp.NewResource(\n\t\t\t\"grpc-federation\",\n\t\t\t\"grpc-federation\",\n\t\t\tmcp.WithResourceDescription(\"gRPC Federation Document\"),\n\t\t\tmcp.WithMIMEType(\"text/markdown\"),\n\t\t),\n\t\tfunc(ctx context.Context, request mcp.ReadResourceRequest) ([]mcp.ResourceContents, error) {\n\t\t\treturn []mcp.ResourceContents{\n\t\t\t\t&mcp.TextResourceContents{\n\t\t\t\t\tURI:      \"https://github.com/mercari/grpc-federation\",\n\t\t\t\t\tMIMEType: \"text/markdown\",\n\t\t\t\t\tText:     string(docs),\n\t\t\t\t},\n\t\t\t}, nil\n\t\t},\n\t)\n\n\ts.AddPrompt(\n\t\tmcp.NewPrompt(\n\t\t\t\"grpc_federation\",\n\t\t\tmcp.WithPromptDescription(\"How to use gRPC Federation\"),\n\t\t),\n\t\tfunc(ctx context.Context, request mcp.GetPromptRequest) (*mcp.GetPromptResult, error) {\n\t\t\treturn mcp.NewGetPromptResult(\"How to use gRPC Federation\",\n\t\t\t\t[]mcp.PromptMessage{\n\t\t\t\t\tmcp.NewPromptMessage(\n\t\t\t\t\t\tmcp.RoleAssistant,\n\t\t\t\t\t\tmcp.NewTextContent(string(docs)),\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t), nil\n\t\t},\n\t)\n\n\t// Start the server\n\tif err := server.ServeStdio(s); err != nil {\n\t\tlog.Fatalf(\"failed to start server: %v\", err)\n\t}\n}\n"
  },
  {
    "path": "cmd/grpcfedctl/main.go",
    "content": "package main\n\nimport (\n\t\"os\"\n\n\t\"github.com/jessevdk/go-flags\"\n)\n\ntype option struct {\n\tVersion VersionCommand `description:\"print version\" command:\"version\"`\n\tPlugin  PluginCommand  `description:\"manage plugin\" command:\"plugin\"`\n}\n\nconst (\n\texitOK  = 0\n\texitERR = 1\n)\n\nvar opt option\n\nfunc main() {\n\tparser := flags.NewParser(&opt, flags.Default)\n\tif _, err := parser.Parse(); err != nil {\n\t\tif !flags.WroteHelp(err) {\n\t\t\tos.Exit(exitERR)\n\t\t}\n\t}\n\tos.Exit(exitOK)\n}\n"
  },
  {
    "path": "cmd/grpcfedctl/plugin.go",
    "content": "package main\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"github.com/tetratelabs/wazero\"\n)\n\ntype PluginCommand struct {\n\tCache PluginCacheCommand `description:\"manage cache for plugin\" command:\"cache\"`\n}\n\ntype PluginCacheCommand struct {\n\tCreate PluginCacheCreateCommand `description:\"create cache for plugin\" command:\"create\"`\n}\n\ntype PluginCacheCreateCommand struct {\n\tName string `description:\"plugin name\" long:\"name\" required:\"true\"`\n\tOut  string `description:\"specify the output directory. If not specified, it will be created in the current directory\" short:\"o\" long:\"out\"`\n}\n\nfunc (c *PluginCacheCreateCommand) Execute(args []string) error {\n\tif len(args) != 1 {\n\t\treturn errors.New(\"you need to specify single wasm file\")\n\t}\n\tctx := context.Background()\n\toutDir := c.Out\n\tif outDir == \"\" {\n\t\toutDir = \".\"\n\t}\n\tcache, err := wazero.NewCompilationCacheWithDir(filepath.Join(outDir, \"grpc-federation\", c.Name))\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to setup cache directory %s: %w\", outDir, err)\n\t}\n\tpath := args[0]\n\tf, err := os.ReadFile(path)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to read file %s: %w\", path, err)\n\t}\n\tif _, err := wazero.NewRuntimeWithConfig(\n\t\tctx,\n\t\twazero.NewRuntimeConfigCompiler().WithCompilationCache(cache).WithCloseOnContextDone(true),\n\t).CompileModule(ctx, f); err != nil {\n\t\treturn fmt.Errorf(\"failed to compile wasm file: %w\", err)\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "cmd/grpcfedctl/version.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n)\n\ntype VersionCommand struct {\n}\n\nfunc (c *VersionCommand) Execute(_ []string) error {\n\tfmt.Fprintln(os.Stdout, grpcfed.Version)\n\treturn nil\n}\n"
  },
  {
    "path": "cmd/protoc-gen-grpc-federation/main.go",
    "content": "package main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"log\"\n\t\"os\"\n\n\t\"github.com/jessevdk/go-flags\"\n\t\"google.golang.org/protobuf/proto\"\n\t\"google.golang.org/protobuf/types/pluginpb\"\n\n\t\"github.com/mercari/grpc-federation/generator\"\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n)\n\ntype option struct {\n\tVersion bool `description:\"show the version\" long:\"version\" short:\"v\"`\n}\n\nconst (\n\texitOK  = 0\n\texitERR = 1\n)\n\nfunc main() {\n\t_, opt, err := parseOpt()\n\tif err != nil {\n\t\t// output error message to stderr by library\n\t\tos.Exit(exitOK)\n\t}\n\tif opt.Version {\n\t\tfmt.Fprintln(os.Stdout, grpcfed.Version)\n\t\treturn\n\t}\n\tif err := _main(); err != nil {\n\t\tlog.Fatal(err)\n\t}\n}\n\nfunc _main() error {\n\treq, err := parseRequest(os.Stdin)\n\tif err != nil {\n\t\treturn err\n\t}\n\tresp, err := generator.CreateCodeGeneratorResponse(context.Background(), req)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif resp == nil {\n\t\treturn nil\n\t}\n\tif err := outputResponse(resp); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc parseRequest(r io.Reader) (*pluginpb.CodeGeneratorRequest, error) {\n\tbuf, err := io.ReadAll(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar req pluginpb.CodeGeneratorRequest\n\tif err := proto.Unmarshal(buf, &req); err != nil {\n\t\treturn nil, err\n\t}\n\treturn &req, nil\n}\n\nfunc outputResponse(resp *pluginpb.CodeGeneratorResponse) error {\n\tbuf, err := proto.Marshal(resp)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif _, err = os.Stdout.Write(buf); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc parseOpt() ([]string, *option, error) {\n\tvar opt option\n\tparser := flags.NewParser(&opt, flags.Default)\n\targs, err := parser.Parse()\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\treturn args, &opt, nil\n}\n"
  },
  {
    "path": "compiler/compiler.go",
    "content": "package compiler\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/bufbuild/protocompile\"\n\t\"github.com/bufbuild/protocompile/linker\"\n\t\"github.com/bufbuild/protocompile/protoutil\"\n\t\"github.com/bufbuild/protocompile/reporter\"\n\t\"google.golang.org/protobuf/reflect/protoreflect\"\n\t\"google.golang.org/protobuf/types/descriptorpb\"\n\n\t\"github.com/mercari/grpc-federation/proto/grpc/federation\"\n\t\"github.com/mercari/grpc-federation/proto_deps/google/rpc\"\n\t\"github.com/mercari/grpc-federation/source\"\n\n\t_ \"embed\"\n)\n\n// Compiler provides a way to generate file descriptors from a Protocol Buffers file without relying on protoc command.\n// This allows you to do things like validate proto files without relying on protoc.\ntype Compiler struct {\n\timportPaths  []string\n\tmanualImport bool\n\timportRule   bool\n}\n\n// Option represents compiler option.\ntype Option func(*Compiler)\n\n// ImportPathOption used to add a path to reference a proto file.\n// By default, only the directory where the starting file exists is added to the import path.\nfunc ImportPathOption(path ...string) Option {\n\treturn func(c *Compiler) {\n\t\tc.importPaths = append(c.importPaths, path...)\n\t}\n}\n\n// ManualImportOption stops importing `grpc/federation/federation.proto` file and its dependencies\n// By default if `grpc/federation/federation.proto` file and its dependencies do not exist, automatically imports it.\n// The version of the proto file is the same as the version when the compiler is built.\nfunc ManualImportOption() Option {\n\treturn func(c *Compiler) {\n\t\tc.manualImport = true\n\t}\n}\n\n// ImportRuleOption used to reference proto files imported by grpc.federation.file.import rule.\nfunc ImportRuleOption() Option {\n\treturn func(c *Compiler) {\n\t\tc.importRule = true\n\t}\n}\n\n// New creates compiler instance.\nfunc New() *Compiler {\n\treturn &Compiler{}\n}\n\ntype errorReporter struct {\n\terrs []reporter.ErrorWithPos\n}\n\nfunc (r *errorReporter) Error(err reporter.ErrorWithPos) error {\n\tr.errs = append(r.errs, err)\n\treturn nil\n}\n\nfunc (r *errorReporter) Warning(_ reporter.ErrorWithPos) {\n}\n\n// CompilerError has error with source position.\ntype CompilerError struct {\n\tErr        error\n\tErrWithPos []reporter.ErrorWithPos\n}\n\nfunc (e *CompilerError) Error() string {\n\tif len(e.ErrWithPos) == 0 {\n\t\treturn e.Err.Error()\n\t}\n\tvar errs []string\n\tfor _, err := range e.ErrWithPos {\n\t\terrs = append(errs, err.Error())\n\t}\n\treturn fmt.Sprintf(\"%s\\n%s\", e.Err.Error(), strings.Join(errs, \"\\n\"))\n}\n\nconst (\n\tgrpcFederationFilePath        = \"grpc/federation/federation.proto\"\n\tgrpcFederationPrivateFilePath = \"grpc/federation/private.proto\"\n\tgrpcFederationTimeFilePath    = \"grpc/federation/time.proto\"\n\tgrpcFederationPluginFilePath  = \"grpc/federation/plugin.proto\"\n\tgoogleRPCCodeFilePath         = \"google/rpc/code.proto\"\n\tgoogleRPCErrorDetailsFilePath = \"google/rpc/error_details.proto\"\n)\n\nfunc RelativePathFromImportPaths(protoPath string, importPaths []string) (string, error) {\n\tif len(importPaths) == 0 {\n\t\treturn protoPath, nil\n\t}\n\n\tabsImportPaths := make([]string, 0, len(importPaths))\n\tfor _, path := range importPaths {\n\t\tif filepath.IsAbs(path) {\n\t\t\tabsImportPaths = append(absImportPaths, path)\n\t\t} else {\n\t\t\tabs, err := filepath.Abs(path)\n\t\t\tif err != nil {\n\t\t\t\treturn \"\", fmt.Errorf(\"failed to get absolute path from %s: %w\", path, err)\n\t\t\t}\n\t\t\tabsImportPaths = append(absImportPaths, abs)\n\t\t}\n\t}\n\n\tabsProtoPath := protoPath\n\tif !filepath.IsAbs(protoPath) {\n\t\tpath, err := filepath.Abs(protoPath)\n\t\tif err != nil {\n\t\t\treturn \"\", fmt.Errorf(\"failed to get absolute path from %s: %w\", protoPath, err)\n\t\t}\n\t\tabsProtoPath = path\n\t}\n\n\tfor _, importPath := range absImportPaths {\n\t\tif strings.HasPrefix(absProtoPath, importPath) {\n\t\t\trelPath, err := filepath.Rel(importPath, absProtoPath)\n\t\t\tif err != nil {\n\t\t\t\treturn \"\", fmt.Errorf(\"failed to get relative path from %s and %s: %w\", importPath, absProtoPath, err)\n\t\t\t}\n\t\t\treturn relPath, nil\n\t\t}\n\t}\n\treturn protoPath, nil\n}\n\ntype dependentProtoFileSet struct {\n\tpath string\n\tdata []byte\n}\n\n// Compile compile the target Protocol Buffers file and produces all file descriptors.\nfunc (c *Compiler) Compile(ctx context.Context, file *source.File, opts ...Option) ([]*descriptorpb.FileDescriptorProto, error) {\n\tc.importPaths = []string{}\n\n\tfor _, opt := range opts {\n\t\topt(c)\n\t}\n\n\trelPath, err := RelativePathFromImportPaths(file.Path(), c.importPaths)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar r errorReporter\n\n\tcompiler := protocompile.Compiler{\n\t\tResolver: protocompile.WithStandardImports(&protocompile.SourceResolver{\n\t\t\tImportPaths: append(c.importPaths, filepath.Dir(relPath), \"\"),\n\t\t\tAccessor: func(p string) (io.ReadCloser, error) {\n\t\t\t\tif p == file.Path() {\n\t\t\t\t\treturn io.NopCloser(bytes.NewBuffer(file.Content())), nil\n\t\t\t\t}\n\t\t\t\tf, err := os.Open(p)\n\t\t\t\tif err != nil {\n\t\t\t\t\tfor _, set := range []*dependentProtoFileSet{\n\t\t\t\t\t\t{path: grpcFederationFilePath, data: federation.ProtoFile},\n\t\t\t\t\t\t{path: grpcFederationPrivateFilePath, data: federation.PrivateProtoFile},\n\t\t\t\t\t\t{path: grpcFederationTimeFilePath, data: federation.TimeProtoFile},\n\t\t\t\t\t\t{path: grpcFederationPluginFilePath, data: federation.PluginProtoFile},\n\t\t\t\t\t\t{path: googleRPCCodeFilePath, data: rpc.GoogleRPCCodeProtoFile},\n\t\t\t\t\t\t{path: googleRPCErrorDetailsFilePath, data: rpc.GoogleRPCErrorDetailsProtoFile},\n\t\t\t\t\t} {\n\t\t\t\t\t\tif !c.manualImport && strings.HasSuffix(p, set.path) {\n\t\t\t\t\t\t\treturn io.NopCloser(bytes.NewBuffer(set.data)), nil\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn f, nil\n\t\t\t},\n\t\t}),\n\t\tSourceInfoMode: protocompile.SourceInfoStandard,\n\t\tReporter:       &r,\n\t}\n\tfiles := []string{relPath}\n\tfiles = append(files, file.Imports()...)\n\tif c.importRule {\n\t\tfiles = append(files, file.ImportsByImportRule()...)\n\t}\n\tlinkedFiles, err := compiler.Compile(ctx, files...)\n\tif err != nil {\n\t\treturn nil, &CompilerError{Err: err, ErrWithPos: r.errs}\n\t}\n\tprotoFiles := c.getProtoFiles(linkedFiles)\n\treturn protoFiles, nil\n}\n\nfunc (c *Compiler) getProtoFiles(linkedFiles []linker.File) []*descriptorpb.FileDescriptorProto {\n\tvar (\n\t\tprotos         []*descriptorpb.FileDescriptorProto\n\t\tprotoUniqueMap = make(map[string]struct{})\n\t)\n\tfor _, linkedFile := range linkedFiles {\n\t\tfor _, proto := range c.getFileDescriptors(linkedFile) {\n\t\t\tif _, exists := protoUniqueMap[proto.GetName()]; exists {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tprotos = append(protos, proto)\n\t\t\tprotoUniqueMap[proto.GetName()] = struct{}{}\n\t\t}\n\t}\n\treturn protos\n}\n\nfunc (c *Compiler) getFileDescriptors(file protoreflect.FileDescriptor) []*descriptorpb.FileDescriptorProto {\n\tvar protoFiles []*descriptorpb.FileDescriptorProto\n\tfileImports := file.Imports()\n\tfor i := 0; i < fileImports.Len(); i++ {\n\t\tprotoFiles = append(protoFiles, c.getFileDescriptors(fileImports.Get(i))...)\n\t}\n\tprotoFiles = append(protoFiles, protoutil.ProtoFromFileDescriptor(file))\n\treturn protoFiles\n}\n"
  },
  {
    "path": "compiler/compiler_test.go",
    "content": "package compiler_test\n\nimport (\n\t\"context\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/mercari/grpc-federation/compiler\"\n\t\"github.com/mercari/grpc-federation/source\"\n)\n\nfunc TestCompiler(t *testing.T) {\n\tctx := context.Background()\n\n\tpath := filepath.Join(\"testdata\", \"service.proto\")\n\tcontent, err := os.ReadFile(path)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tfile, err := source.NewFile(path, content)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tc := compiler.New()\n\tprotos, err := c.Compile(ctx, file)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\t//nolint: gocritic\n\t// service.proto\n\t// post.proto\n\t// user.proto\n\t// federation.proto\n\t// private.proto\n\t// time.proto\n\t// google/protobuf/descriptor.proto\n\t// google/protobuf/any.proto\n\t// google/protobuf/duration.proto\n\t// google/protobuf/timestamp.proto\n\t// google/rpc/error_details.proto\n\t// google/rpc/code.proto\n\tconst expectedProtoNum = 12\n\tif len(protos) != expectedProtoNum {\n\t\tt.Fatalf(\"failed to get protos. expected %d but got %d\", expectedProtoNum, len(protos))\n\t}\n}\n"
  },
  {
    "path": "compiler/testdata/post.proto",
    "content": "syntax = \"proto3\";\n\npackage post;\n\noption go_package = \"example/post;post\";\n\nservice PostService {\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n  rpc GetPosts(GetPostsRequest) returns (GetPostsResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  Post post = 1;\n}\n\nmessage GetPostsRequest {\n  repeated string ids = 1;\n}\n\nmessage GetPostsResponse {\n  repeated Post posts = 1;\n}\n\nmessage Post {\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  string user_id = 4;\n}\n"
  },
  {
    "path": "compiler/testdata/service.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"federation.proto\";\nimport \"post.proto\";\nimport \"user.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"res\"\n        call {\n          method: \"post.PostService/GetPost\"\n          request { field: \"id\", by: \"$.id\" }\n        }\n      },\n      { name: \"post\", by: \"res.post\", autobind: true },\n      {\n        name: \"user\"\n        message {\n          name: \"User\"\n          args { inline: \"post\" }\n        }\n      }\n    ]\n  };\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  User user = 4 [(grpc.federation.field).by = \"user\"];\n}\n\nmessage User {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"user.UserService/GetUser\"\n        request { field: \"id\", by: \"$.user_id\" }\n      }\n    }\n    def { name: \"user\", by: \"res.user\", autobind: true }\n  };\n  string id = 1;\n  string name = 2;\n}\n"
  },
  {
    "path": "compiler/testdata/user.proto",
    "content": "syntax = \"proto3\";\n\npackage user;\n\noption go_package = \"example/user;user\";\n\nservice UserService {\n  rpc GetUser(GetUserRequest) returns (GetUserResponse) {};\n  rpc GetUsers(GetUsersRequest) returns (GetUsersResponse) {};\n}\n\nmessage GetUserRequest {\n  string id = 1;\n}\n\nmessage GetUserResponse {\n  User user = 1;\n}\n\nmessage GetUsersRequest {\n  repeated string ids = 1;\n}\n\nmessage GetUsersResponse {\n  repeated User users = 1;\n}\n\nmessage User {\n  string id = 1;\n  string name = 2;\n}\n"
  },
  {
    "path": "demo/Makefile",
    "content": "export\n\nGOBIN := $(PWD)/bin\nPATH := $(GOBIN):$(PATH)\n\nKO_DOCKER_REPO := ko.local\nKO_DEFAULTPLATFORMS := linux/amd64\n\nSERVICES := swapi film person planet species starship vehicle\n\n.PHONY: tools\ntools:\n\tgo install github.com/bufbuild/buf/cmd/buf@v1.32.2\n\tgo install github.com/google/ko@v0.15.4\n\tgo install github.com/fullstorydev/grpcurl/cmd/grpcurl@v1.9.1\n\n.PHONY: build\nbuild:\n\t$(foreach svc,$(SERVICES),$(MAKE) build/$(svc))\n\nbuild/%:\n\tko build ./cmd/$* -B --sbom=none\n\n.PHONY: up\nup:\n\tdocker compose up\n\n.PHONY: generate\ngenerate:\n\t$(GOBIN)/buf generate\n\n.PHONY: test\ntest:\n\tgo test -race ./... -count=1\n"
  },
  {
    "path": "demo/README.md",
    "content": "# SWAPI powered by gRPC Federation\n\nHere is an example of building a simple service using gRPC Federation with SWAPI.\n\n## What is SWAPI ?\n\n[SWAPI](https://swapi.dev/) is one of the public APIs. It frequently appears as an example for GraphQL and gRPC, so we are using it with gRPC Federation as well.\n\n## Background and Architecture\n\nThe service we are building this time with gRPC Federation is a BFF (Backend for Frontend) that consolidates the results of several pre-existing services ( `film` , `person` , `planet` , `species` , `starship` , `vehicle` ).\nPlease consider these pre-existing services as in-house microservices in a real-world scenario.\nEach of them is developed and managed by a different team.\n\nEach microservice exposes internal APIs using gRPC, with schemas managed by Protocol Buffers.\nOur goal is to build a gRPC service that aggregates the necessary information from each service and exposes it externally.\n\n[![Architecture](./images/arch.png)](./images/arch.png)\n\n## How to use\n\nThe Protocol Buffers files for each microservice are located under the `./proto` directory. Additionally, we will create the `swapi.proto` file for this project, which is already placed in `./proto/swapi.proto` .\n\nThe `swapi.proto` file contains the API schema and the gRPC Federation options.\n\nThe following is an excerpt from it.\n\n- swapi.proto\n\n```proto\n// GetPersonReply message for SWAPI.\nmessage GetPersonReply {\n  // gRPC Federation Options.\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"swapi.person.PersonService/GetPerson\"\n        request { field: \"id\" by: \"$.id\" }\n      }\n    }\n    ...\n  };\n}\n```\n\nIn this demo, we will use `Buf` to generate code from the proto files utilizing gRPC Federation. First, you need to install the Buf CLI by running the following command:\n\n```console\nmake tools\n```\n\nIf the installation is successful, the `buf` and `ko`  and `grpcurl` binaries will be installed under the `bin` directory.\n\nTo generate code using Buf, execute the following command:\n\n```console\nmake generate\n```\n\nThe code will be generated under the `./swapi/swapi` directory.\n\nNext, build the server and create the image. In this demo, it's necessary to start other microservices simultaneously, so the code for each is also provided. To build the code for all services and create images, execute the following command:\n\n```console\nmake build\n```\n\nFinally, start all services. Use `docker compose` for launching. The SWAPI service will be available on port `3000`. ( See [config file](./compose.yaml) )\n\n```console\nmake up\n```\n\nNow, let's send a request to confirm the functionality. If you receive a response after sending a request like the following, the application is running successfully.\n\n```\n./bin/grpcurl -plaintext -d '{\"id\": 1}' localhost:3000 swapi.SWAPI/GetPerson\n```\n\nAdditionally, we are using [JAEGER](https://www.jaegertracing.io/) to visualize OpenTelemetry traces. It is exposed on port `4000`, so please try accessing it in your browser. If you can see a page like the following, it means it's successful.\n\n- `http://localhost:4000`\n\n[![Jaeger UI](./images/jaeger.png)](./images/jaeger.png)\n\n## Conclusion\n\nThe team responsible for providing the SWAPI service needs to develop and maintain only the `swapi.proto` file and the `./cmd/swapi/main.go` file. The `swapi.proto` file utilizes gRPC Federation. In the `./cmd/swapi/main.go` file, additional tasks such as defining gRPC clients, which cannot be described solely with gRPC Federation, need to be addressed.\n\nPlease feel free to edit the `swapi.proto` file and explore the capabilities of gRPC Federation !!!\n"
  },
  {
    "path": "demo/buf.gen.yaml",
    "content": "version: v2\nmanaged:\n  enabled: true\nplugins:\n  - remote: buf.build/protocolbuffers/go:v1.34.1\n    out: .\n    opt: module=github.com/mercari/grpc-federation/demo\n  - remote: buf.build/grpc/go:v1.4.0\n    out: .\n    opt: module=github.com/mercari/grpc-federation/demo\n  - remote: buf.build/community/mercari-grpc-federation:v1.9.8\n    out: .\n    opt:\n      - module=github.com/mercari/grpc-federation/demo\n      - import_paths=proto\n"
  },
  {
    "path": "demo/buf.work.yaml",
    "content": "version: v1\ndirectories:\n  - proto\n"
  },
  {
    "path": "demo/cmd/film/main.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"net\"\n\t\"os\"\n\n\t\"google.golang.org/grpc\"\n\n\t\"github.com/mercari/grpc-federation/demo/services/film\"\n\tfilmpb \"github.com/mercari/grpc-federation/demo/swapi/film\"\n)\n\nfunc main() {\n\tif err := run(); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc run() error {\n\tport := os.Getenv(\"GRPC_PORT\")\n\tif port == \"\" {\n\t\treturn fmt.Errorf(\"must be specified GRPC_PORT environment\")\n\t}\n\tlistener, err := net.Listen(\"tcp\", fmt.Sprintf(\"0.0.0.0:%s\", port))\n\tif err != nil {\n\t\treturn err\n\t}\n\tgrpcServer := grpc.NewServer()\n\tfilmpb.RegisterFilmServiceServer(grpcServer, film.NewFilmService())\n\tlog.Printf(\"listening gRPC: %s\", port)\n\tif err := grpcServer.Serve(listener); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "demo/cmd/person/main.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"net\"\n\t\"os\"\n\n\t\"google.golang.org/grpc\"\n\n\t\"github.com/mercari/grpc-federation/demo/services/person\"\n\tpersonpb \"github.com/mercari/grpc-federation/demo/swapi/person\"\n)\n\nfunc main() {\n\tif err := run(); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc run() error {\n\tport := os.Getenv(\"GRPC_PORT\")\n\tif port == \"\" {\n\t\treturn fmt.Errorf(\"must be specified GRPC_PORT environment\")\n\t}\n\tlistener, err := net.Listen(\"tcp\", fmt.Sprintf(\"0.0.0.0:%s\", port))\n\tif err != nil {\n\t\treturn err\n\t}\n\tgrpcServer := grpc.NewServer()\n\tpersonpb.RegisterPersonServiceServer(grpcServer, person.NewPersonService())\n\tlog.Printf(\"listening gRPC: %s\", port)\n\tif err := grpcServer.Serve(listener); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "demo/cmd/planet/main.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"net\"\n\t\"os\"\n\n\t\"google.golang.org/grpc\"\n\n\t\"github.com/mercari/grpc-federation/demo/services/planet\"\n\tplanetpb \"github.com/mercari/grpc-federation/demo/swapi/planet\"\n)\n\nfunc main() {\n\tif err := run(); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc run() error {\n\tport := os.Getenv(\"GRPC_PORT\")\n\tif port == \"\" {\n\t\treturn fmt.Errorf(\"must be specified GRPC_PORT environment\")\n\t}\n\tlistener, err := net.Listen(\"tcp\", fmt.Sprintf(\"0.0.0.0:%s\", port))\n\tif err != nil {\n\t\treturn err\n\t}\n\tgrpcServer := grpc.NewServer()\n\tplanetpb.RegisterPlanetServiceServer(grpcServer, planet.NewPlanetService())\n\tlog.Printf(\"listening gRPC: %s\", port)\n\tif err := grpcServer.Serve(listener); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "demo/cmd/species/main.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"net\"\n\t\"os\"\n\n\t\"google.golang.org/grpc\"\n\n\t\"github.com/mercari/grpc-federation/demo/services/species\"\n\tspeciespb \"github.com/mercari/grpc-federation/demo/swapi/species\"\n)\n\nfunc main() {\n\tif err := run(); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc run() error {\n\tport := os.Getenv(\"GRPC_PORT\")\n\tif port == \"\" {\n\t\treturn fmt.Errorf(\"must be specified GRPC_PORT environment\")\n\t}\n\tlistener, err := net.Listen(\"tcp\", fmt.Sprintf(\"0.0.0.0:%s\", port))\n\tif err != nil {\n\t\treturn err\n\t}\n\tgrpcServer := grpc.NewServer()\n\tspeciespb.RegisterSpeciesServiceServer(grpcServer, species.NewSpeciesService())\n\tlog.Printf(\"listening gRPC: %s\", port)\n\tif err := grpcServer.Serve(listener); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "demo/cmd/starship/main.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"net\"\n\t\"os\"\n\n\t\"google.golang.org/grpc\"\n\n\t\"github.com/mercari/grpc-federation/demo/services/starship\"\n\tstarshippb \"github.com/mercari/grpc-federation/demo/swapi/starship\"\n)\n\nfunc main() {\n\tif err := run(); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc run() error {\n\tport := os.Getenv(\"GRPC_PORT\")\n\tif port == \"\" {\n\t\treturn fmt.Errorf(\"must be specified GRPC_PORT environment\")\n\t}\n\tlistener, err := net.Listen(\"tcp\", fmt.Sprintf(\"0.0.0.0:%s\", port))\n\tif err != nil {\n\t\treturn err\n\t}\n\tgrpcServer := grpc.NewServer()\n\tstarshippb.RegisterStarshipServiceServer(grpcServer, starship.NewStarshipService())\n\tlog.Printf(\"listening gRPC: %s\", port)\n\tif err := grpcServer.Serve(listener); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "demo/cmd/swapi/main.go",
    "content": "package main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log\"\n\t\"log/slog\"\n\t\"net\"\n\t\"os\"\n\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\"\n\t\"go.opentelemetry.io/otel/propagation\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\tsdktrace \"go.opentelemetry.io/otel/sdk/trace\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.4.0\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/credentials/insecure\"\n\t\"google.golang.org/grpc/reflection\"\n\n\tfilmpb \"github.com/mercari/grpc-federation/demo/swapi/film\"\n\tpersonpb \"github.com/mercari/grpc-federation/demo/swapi/person\"\n\tplanetpb \"github.com/mercari/grpc-federation/demo/swapi/planet\"\n\tspeciespb \"github.com/mercari/grpc-federation/demo/swapi/species\"\n\tstarshippb \"github.com/mercari/grpc-federation/demo/swapi/starship\"\n\tswapipb \"github.com/mercari/grpc-federation/demo/swapi/swapi\"\n\tvehiclepb \"github.com/mercari/grpc-federation/demo/swapi/vehicle\"\n)\n\nfunc main() {\n\tif err := run(context.Background()); err != nil {\n\t\tpanic(err)\n\t}\n}\n\ntype client struct{}\n\nfunc (c *client) Swapi_Film_FilmServiceClient(_ swapipb.SWAPIClientConfig) (filmpb.FilmServiceClient, error) {\n\tep := os.Getenv(\"FILM_SERVICE_ENDPOINT\")\n\tconn, err := grpc.DialContext(\n\t\tcontext.Background(), ep,\n\t\tgrpc.WithTransportCredentials(insecure.NewCredentials()),\n\t\tgrpc.WithDefaultCallOptions(grpc.WaitForReady(true)),\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn filmpb.NewFilmServiceClient(conn), nil\n}\n\nfunc (c *client) Swapi_Person_PersonServiceClient(_ swapipb.SWAPIClientConfig) (personpb.PersonServiceClient, error) {\n\tep := os.Getenv(\"PERSON_SERVICE_ENDPOINT\")\n\tconn, err := grpc.DialContext(\n\t\tcontext.Background(), ep,\n\t\tgrpc.WithTransportCredentials(insecure.NewCredentials()),\n\t\tgrpc.WithDefaultCallOptions(grpc.WaitForReady(true)),\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn personpb.NewPersonServiceClient(conn), nil\n}\n\nfunc (c *client) Swapi_Planet_PlanetServiceClient(_ swapipb.SWAPIClientConfig) (planetpb.PlanetServiceClient, error) {\n\tep := os.Getenv(\"PLANET_SERVICE_ENDPOINT\")\n\tconn, err := grpc.DialContext(\n\t\tcontext.Background(), ep,\n\t\tgrpc.WithTransportCredentials(insecure.NewCredentials()),\n\t\tgrpc.WithDefaultCallOptions(grpc.WaitForReady(true)),\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn planetpb.NewPlanetServiceClient(conn), nil\n}\n\nfunc (c *client) Swapi_Species_SpeciesServiceClient(_ swapipb.SWAPIClientConfig) (speciespb.SpeciesServiceClient, error) {\n\tep := os.Getenv(\"SPECIES_SERVICE_ENDPOINT\")\n\tconn, err := grpc.DialContext(\n\t\tcontext.Background(), ep,\n\t\tgrpc.WithTransportCredentials(insecure.NewCredentials()),\n\t\tgrpc.WithDefaultCallOptions(grpc.WaitForReady(true)),\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn speciespb.NewSpeciesServiceClient(conn), nil\n}\n\nfunc (c *client) Swapi_Starship_StarshipServiceClient(_ swapipb.SWAPIClientConfig) (starshippb.StarshipServiceClient, error) {\n\tep := os.Getenv(\"STARSHIP_SERVICE_ENDPOINT\")\n\tconn, err := grpc.DialContext(\n\t\tcontext.Background(), ep,\n\t\tgrpc.WithTransportCredentials(insecure.NewCredentials()),\n\t\tgrpc.WithDefaultCallOptions(grpc.WaitForReady(true)),\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn starshippb.NewStarshipServiceClient(conn), nil\n}\n\nfunc (c *client) Swapi_Vehicle_VehicleServiceClient(_ swapipb.SWAPIClientConfig) (vehiclepb.VehicleServiceClient, error) {\n\tep := os.Getenv(\"VEHICLE_SERVICE_ENDPOINT\")\n\tconn, err := grpc.DialContext(\n\t\tcontext.Background(), ep,\n\t\tgrpc.WithTransportCredentials(insecure.NewCredentials()),\n\t\tgrpc.WithDefaultCallOptions(grpc.WaitForReady(true)),\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn vehiclepb.NewVehicleServiceClient(conn), nil\n}\n\nfunc run(ctx context.Context) error {\n\tport := os.Getenv(\"GRPC_PORT\")\n\tif port == \"\" {\n\t\treturn fmt.Errorf(\"must be specified GRPC_PORT environment\")\n\t}\n\tlistener, err := net.Listen(\"tcp\", fmt.Sprintf(\"0.0.0.0:%s\", port))\n\tif err != nil {\n\t\treturn err\n\t}\n\n\texporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithInsecure())\n\tif err != nil {\n\t\treturn err\n\t}\n\ttp := sdktrace.NewTracerProvider(\n\t\tsdktrace.WithBatcher(exporter),\n\t\tsdktrace.WithResource(\n\t\t\tresource.NewWithAttributes(\n\t\t\t\tsemconv.SchemaURL,\n\t\t\t\tsemconv.ServiceNameKey.String(\"swapi\"),\n\t\t\t\tsemconv.ServiceVersionKey.String(\"1.0.0\"),\n\t\t\t\tattribute.String(\"environment\", \"dev\"),\n\t\t\t),\n\t\t),\n\t\tsdktrace.WithSampler(sdktrace.AlwaysSample()),\n\t)\n\tdefer tp.Shutdown(ctx)\n\totel.SetTextMapPropagator(propagation.TraceContext{})\n\totel.SetTracerProvider(tp)\n\n\tgrpcServer := grpc.NewServer()\n\tserver, err := swapipb.NewSWAPI(swapipb.SWAPIConfig{\n\t\tClient: new(client),\n\t\tLogger: slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{\n\t\t\tLevel: slog.LevelDebug,\n\t\t})),\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\treflection.Register(grpcServer)\n\tswapipb.RegisterSWAPIServer(grpcServer, server)\n\tlog.Printf(\"listening gRPC: %s\", port)\n\tif err := grpcServer.Serve(listener); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "demo/cmd/vehicle/main.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"net\"\n\t\"os\"\n\n\t\"google.golang.org/grpc\"\n\n\t\"github.com/mercari/grpc-federation/demo/services/vehicle\"\n\tvehiclepb \"github.com/mercari/grpc-federation/demo/swapi/vehicle\"\n)\n\nfunc main() {\n\tif err := run(); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc run() error {\n\tport := os.Getenv(\"GRPC_PORT\")\n\tif port == \"\" {\n\t\treturn fmt.Errorf(\"must be specified GRPC_PORT environment\")\n\t}\n\tlistener, err := net.Listen(\"tcp\", fmt.Sprintf(\"0.0.0.0:%s\", port))\n\tif err != nil {\n\t\treturn err\n\t}\n\tgrpcServer := grpc.NewServer()\n\tvehiclepb.RegisterVehicleServiceServer(grpcServer, vehicle.NewVehicleService())\n\tlog.Printf(\"listening gRPC: %s\", port)\n\tif err := grpcServer.Serve(listener); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "demo/compose.yaml",
    "content": "services:\n  swapi:\n    image: ko.local/swapi:latest\n    platform: linux/amd64\n    container_name: swapi\n    ports:\n      - \"3000:3000\"\n    environment:\n      - GRPC_PORT=3000\n      - FILM_SERVICE_ENDPOINT=film:3000\n      - PERSON_SERVICE_ENDPOINT=person:3000\n      - PLANET_SERVICE_ENDPOINT=planet:3000\n      - SPECIES_SERVICE_ENDPOINT=species:3000\n      - STARSHIP_SERVICE_ENDPOINT=starship:3000\n      - VEHICLE_SERVICE_ENDPOINT=vehicle:3000\n      - OTEL_EXPORTER_OTLP_ENDPOINT=http://jaeger:4317\n      - OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=http://jaeger:4317\n\n  jaeger:\n    image: jaegertracing/all-in-one:latest\n    ports:\n      - \"4000:16686\"\n    environment:\n      - COLLECTOR_OTLP_ENABLED=true\n\n  film:\n    image: ko.local/film:latest\n    platform: linux/amd64\n    container_name: film\n    environment:\n      - GRPC_PORT=3000\n\n  person:\n    image: ko.local/person:latest\n    platform: linux/amd64\n    container_name: person\n    environment:\n      - GRPC_PORT=3000\n\n  planet:\n    image: ko.local/planet:latest\n    platform: linux/amd64\n    container_name: planet\n    environment:\n      - GRPC_PORT=3000\n\n  species:\n    image: ko.local/species:latest\n    platform: linux/amd64\n    container_name: species\n    environment:\n      - GRPC_PORT=3000\n\n  starship:\n    image: ko.local/starship:latest\n    platform: linux/amd64\n    container_name: starship\n    environment:\n      - GRPC_PORT=3000\n\n  vehicle:\n    image: ko.local/vehicle:latest\n    platform: linux/amd64\n    container_name: vehicle\n    environment:\n      - GRPC_PORT=3000\n"
  },
  {
    "path": "demo/go.mod",
    "content": "module github.com/mercari/grpc-federation/demo\n\ngo 1.23.0\n\ntoolchain go1.23.7\n\nrequire (\n\tgithub.com/mercari/grpc-federation v1.9.8\n\tgithub.com/peterhellberg/swapi v0.0.0-20230222134402-c0bd79f5129c\n\tgo.opentelemetry.io/otel v1.27.0\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0\n\tgo.opentelemetry.io/otel/sdk v1.27.0\n\tgo.opentelemetry.io/otel/trace v1.27.0\n\tgoogle.golang.org/genproto v0.0.0-20240604185151-ef581f913117\n\tgoogle.golang.org/grpc v1.65.0\n\tgoogle.golang.org/protobuf v1.34.2\n)\n\nrequire (\n\tcel.dev/expr v0.19.1 // indirect\n\tgithub.com/antlr4-go/antlr/v4 v4.13.0 // indirect\n\tgithub.com/cenkalti/backoff/v4 v4.3.0 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/google/cel-go v0.23.1 // indirect\n\tgithub.com/google/uuid v1.6.0 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect\n\tgithub.com/kelseyhightower/envconfig v1.4.0 // indirect\n\tgithub.com/stoewer/go-strcase v1.3.0 // indirect\n\tgithub.com/tetratelabs/wazero v1.7.0 // indirect\n\tgo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.27.0 // indirect\n\tgo.opentelemetry.io/proto/otlp v1.2.0 // indirect\n\tgolang.org/x/exp v0.0.0-20240222234643-814bf88cf225 // indirect\n\tgolang.org/x/net v0.38.0 // indirect\n\tgolang.org/x/sync v0.12.0 // indirect\n\tgolang.org/x/sys v0.31.0 // indirect\n\tgolang.org/x/text v0.23.0 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7 // indirect\n)\n"
  },
  {
    "path": "demo/go.sum",
    "content": "cel.dev/expr v0.19.1 h1:NciYrtDRIR0lNCnH1LFJegdjspNx9fI59O7TWcua/W4=\ncel.dev/expr v0.19.1/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw=\ngithub.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=\ngithub.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=\ngithub.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=\ngithub.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/google/cel-go v0.23.1 h1:91ThhEZlBcE5rB2adBVXqvDoqdL8BG2oyhd0bK1I/r4=\ngithub.com/google/cel-go v0.23.1/go.mod h1:52Pb6QsDbC5kvgxvZhiL9QX1oZEkcUF/ZqaPx1J5Wwo=\ngithub.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\ngithub.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k=\ngithub.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=\ngithub.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=\ngithub.com/mercari/grpc-federation v1.9.8 h1:ydwgsj0bLmCJNxvQccHPiiKlxI45qnbNSnAfHNa9S8I=\ngithub.com/mercari/grpc-federation v1.9.8/go.mod h1:J2yE7b4ZIiLSx/gSQruA0Y97g7TCNTcXFjdA7GmIKaM=\ngithub.com/peterhellberg/swapi v0.0.0-20230222134402-c0bd79f5129c h1:FS5Yq0geZCGGFWq3yJJZhPWwsOlT8rUtOpSY3bDu6Jo=\ngithub.com/peterhellberg/swapi v0.0.0-20230222134402-c0bd79f5129c/go.mod h1:MCpYUv2wWgketLY9WhCmAiCPEFTf/oUh7N4g0SGAuXQ=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs=\ngithub.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tetratelabs/wazero v1.7.0 h1:jg5qPydno59wqjpGrHph81lbtHzTrWzwwtD4cD88+hQ=\ngithub.com/tetratelabs/wazero v1.7.0/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y=\ngo.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg=\ngo.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 h1:qFffATk0X+HD+f1Z8lswGiOQYKHRlzfmdJm0wEaVrFA=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h1:MOiCmryaYtc+V0Ei+Tx9o5S1ZjA7kzLucuVuyzBZloQ=\ngo.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik=\ngo.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak=\ngo.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI=\ngo.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A=\ngo.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw=\ngo.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4=\ngo.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94=\ngo.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngolang.org/x/exp v0.0.0-20240222234643-814bf88cf225 h1:LfspQV/FYTatPTr/3HzIcmiUFH7PGP+OQ6mgDYo3yuQ=\ngolang.org/x/exp v0.0.0-20240222234643-814bf88cf225/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc=\ngolang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=\ngolang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=\ngolang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw=\ngolang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=\ngolang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=\ngolang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=\ngoogle.golang.org/genproto v0.0.0-20240604185151-ef581f913117 h1:HCZ6DlkKtCDAtD8ForECsY3tKuaR+p4R3grlK80uCCc=\ngoogle.golang.org/genproto v0.0.0-20240604185151-ef581f913117/go.mod h1:lesfX/+9iA+3OdqeCpoDddJaNxVB1AB6tD7EfqMmprc=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 h1:YcyjlL1PRr2Q17/I0dPk2JmYS5CDXfcdb2Z3YRioEbw=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7 h1:2035KHhUv+EpyB+hWgJnaWKJOdX1E95w2S8Rr4uWKTs=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=\ngoogle.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=\ngoogle.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=\ngoogle.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=\ngoogle.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "demo/proto/buf.yaml",
    "content": "version: v1\ndeps:\n  - buf.build/mercari/grpc-federation\n  - buf.build/googleapis/googleapis\nbreaking:\n  use:\n    - FILE\nlint:\n  use:\n    - DEFAULT\n"
  },
  {
    "path": "demo/proto/film/film.proto",
    "content": "syntax = \"proto3\";\n\nimport \"google/type/date.proto\";\n\npackage swapi.film;\n\noption go_package = \"github.com/mercari/grpc-federation/demo/swapi/film;filmpb\";\n\nservice FilmService { \n  rpc GetFilm(GetFilmRequest) returns (GetFilmReply) {}\n  rpc ListFilms(ListFilmsRequest) returns (ListFilmsReply) {}\n}\n\n// GetFilmRequest.\nmessage GetFilmRequest {\n  // The film id.\n  int64 id = 1;\n}\n\n// GetFilmReply.\nmessage GetFilmReply {\n  Film film = 1;\n}\n\n// ListFilmsRequest.\nmessage ListFilmsRequest {\n  repeated int64 ids = 1;\n}\n\n// ListFilmsReply.\nmessage ListFilmsReply {\n  repeated Film films = 1;\n}\n\n// Film is a single film.\nmessage Film {\n  // film id.\n  int64 id = 1;\n  // The title of this film.\n  string title = 2;\n  // The episode number of this film.\n  int32 episode_id = 3;\n  // The opening paragraphs at the beginning of this film.\n  string opening_crawl = 4;\n  // The name of the director of this film.\n  string director = 5;\n  // The name(s) of the producer(s) of this film. Comma separated.\n  string producer = 6;\n  // The ISO 8601 date format of film release at original creator country.\n  google.type.Date release_date = 7;\n  // the hypermedia URL of this resource.\n  string url = 8;\n  // the ISO 8601 date format of the time that this resource was created.\n  string created = 9;\n  // the ISO 8601 date format of the time that this resource was edited.\n  string edited = 10;\n  // species ids.\n  repeated int64 species_ids = 11;\n  // starship ids.\n  repeated int64 starship_ids = 12;\n  // vehicle ids.\n  repeated int64 vehicle_ids = 13;\n  // character ids.\n  repeated int64 character_ids = 14;\n  // planet ids.\n  repeated int64 planet_ids = 15;\n}\n"
  },
  {
    "path": "demo/proto/person/person.proto",
    "content": "syntax = \"proto3\";\n\npackage swapi.person;\n\noption go_package = \"github.com/mercari/grpc-federation/demo/swapi/person;personpb\";\n\nservice PersonService { \n  rpc GetPerson(GetPersonRequest) returns (GetPersonReply) {}\n  rpc ListPeople(ListPeopleRequest) returns (ListPeopleReply) {}\n}\n\n// GetPersonRequest.\nmessage GetPersonRequest {\n  // The persion id.\n  int64 id = 1;\n}\n\n// GetPersonReply.\nmessage GetPersonReply {\n  Person person = 1;\n}\n\n// ListPeopleRequest.\nmessage ListPeopleRequest {\n  repeated int64 ids = 1;\n}\n\n// ListPeopleReply.\nmessage ListPeopleReply {\n  repeated Person people = 1;\n}\n\n// Person is an individual person or character within the Star Wars universe.\nmessage Person {\n  // person id.\n  int64 id = 1;\n  // The name of this person.\n  string name = 2;\n  // The birth year of the person,\n  // using the in-universe standard of BBY or ABY\n  // - Before the Battle of Yavin or After the Battle of Yavin.\n  // The Battle of Yavin is a battle that occurs at the end of Star Wars episode IV: A New Hope.\n  string birth_year = 3;\n  // The eye color of this person.\n  // Will be \"unknown\" if not known or \"n/a\" if the person does not have an eye.\n  string eye_color = 4;\n  // The gender of this person.\n  // Either \"Male\", \"Female\" or \"unknown\", \"n/a\" if the person does not have a gender.\n  string gender = 5;\n  // The hair color of this person.\n  // Will be \"unknown\" if not known or \"n/a\" if the person does not have hair.\n  string hair_color = 6;\n  // The height of the person in centimeters.\n  string height = 7;\n  // The mass of the person in kilograms.\n  string mass = 8;\n  // The skin color of this person.\n  string skin_color = 9;\n  // The URL of a planet resource, a planet that this person was born on or inhabits.\n  string homeworld = 10;\n  // the hypermedia URL of this resource.\n  string url = 11;\n  // the ISO 8601 date format of the time that this resource was created.\n  string created = 12;\n  // the ISO 8601 date format of the time that this resource was edited.\n  string edited = 13;\n  // film ids.\n  repeated int64 film_ids = 14;\n  // species ids.\n  repeated int64 species_ids = 15;\n  // starship ids.\n  repeated int64 starship_ids = 16;\n  // vehicle ids.\n  repeated int64 vehicle_ids = 17;\n}\n"
  },
  {
    "path": "demo/proto/planet/planet.proto",
    "content": "syntax = \"proto3\";\n\npackage swapi.planet;\n\noption go_package = \"github.com/mercari/grpc-federation/demo/swapi/planet;planetpb\";\n\nservice PlanetService { \n  rpc GetPlanet(GetPlanetRequest) returns (GetPlanetReply) {}\n  rpc ListPlanets(ListPlanetsRequest) returns (ListPlanetsReply) {}\n}\n\n// GetPlanetRequest.\nmessage GetPlanetRequest {\n  // planet id.\n  int64 id = 1;\n}\n\n// GetPlanetReply.\nmessage GetPlanetReply {\n  Planet planet = 1;\n}\n\n// ListPlanetsRequest.\nmessage ListPlanetsRequest {\n  repeated int64 ids = 1;\n}\n\n// ListPlanetsReply.\nmessage ListPlanetsReply {\n  repeated Planet planets = 1;\n}\n\n// Planet is a large mass, planet or planetoid in the Star Wars Universe, at the time of 0 ABY.\nmessage Planet {\n  // planet id.\n  int64 id = 1;\n  // The name of this planet.\n  string name = 2;\n  // The diameter of this planet in kilometers.\n  string diameter = 3;\n  // The number of standard hours it takes for this planet to complete a single rotation on its axis.\n  string rotation_period = 4;\n  // The number of standard days it takes for this planet to complete a single orbit of its local star.\n  string orbital_period = 5;\n  // A number denoting the gravity of this planet, where \"1\" is normal or 1 standard G.\n  // \"2\" is twice or 2 standard Gs. \"0.5\" is half or 0.5 standard Gs.\n  string gravity = 6;\n  // The average population of sentient beings inhabiting this planet.\n  string population = 7;\n  // The climate of this planet. Comma separated if diverse.\n  string climate = 8;\n  // The terrain of this planet. Comma separated if diverse.\n  string terrain = 9;\n  // The percentage of the planet surface that is naturally occurring water or bodies of water.\n  string surface_water = 10;\n  // the hypermedia URL of this resource.\n  string url = 11;\n  // the ISO 8601 date format of the time that this resource was created.\n  string created = 12;\n  // the ISO 8601 date format of the time that this resource was edited.\n  string edited = 13;\n  // the person that live on this planet ids.\n  repeated int64 resident_ids = 14;\n  // film ids.\n  repeated int64 film_ids = 15;\n}"
  },
  {
    "path": "demo/proto/species/species.proto",
    "content": "syntax = \"proto3\";\n\npackage swapi.species;\n\noption go_package = \"github.com/mercari/grpc-federation/demo/swapi/species;speciespb\";\n\nservice SpeciesService { \n  rpc GetSpecies(GetSpeciesRequest) returns (GetSpeciesReply) {}\n  rpc ListSpecies(ListSpeciesRequest) returns (ListSpeciesReply) {}\n}\n\n// GetSpeciesRequest.\nmessage GetSpeciesRequest {\n  // species id.\n  int64 id = 1;\n}\n\n// GetSpeciesReply.\nmessage GetSpeciesReply {\n  Species species = 1;\n}\n\n// ListSpeciesRequest.\nmessage ListSpeciesRequest {\n  repeated int64 ids = 1;\n}\n\n// ListSpeciesReply.\nmessage ListSpeciesReply {\n  repeated Species species = 1;\n}\n\n// Species is a type of person or character within the Star Wars Universe.\nmessage Species {\n  // species id.\n  int64 id = 1;\n  // The name of this species.\n  string name = 2;\n  // The classification of this species, such as \"mammal\" or \"reptile\".\n  string classification = 3;\n  // The designation of this species, such as \"sentient\".\n  string designation = 4;\n  // The average height of this species in centimeters.\n  string average_height = 5;\n  // The average lifespan of this species in years.\n  string average_lifespan = 6;\n  // A comma-separated string of common eye colors for this species,\n  // \"none\" if this species does not typically have eyes.\n  string eye_colors = 7;\n  // A comma-separated string of common hair colors for this species,\n  // \"none\" if this species does not typically have hair.\n  string hair_colors = 8;\n  // A comma-separated string of common skin colors for this species,\n  // \"none\" if this species does not typically have skin.\n  string skin_colors = 9;\n  // The language commonly spoken by this species.\n  string language = 10;\n  // The URL of a planet resource, a planet that this species originates from.\n  string homeworld = 11;\n  // the hypermedia URL of this resource.\n  string url = 12;\n  // the ISO 8601 date format of the time that this resource was created.\n  string created = 13;\n  // the ISO 8601 date format of the time that this resource was edited.\n  string edited = 14;\n  // person ids.\n  repeated int64 person_ids = 15;\n  // film ids.\n  repeated int64 film_ids = 16;\n}\n"
  },
  {
    "path": "demo/proto/starship/starship.proto",
    "content": "syntax = \"proto3\";\n\npackage swapi.starship;\n\noption go_package = \"github.com/mercari/grpc-federation/demo/swapi/starship;starshippb\";\n\nservice StarshipService { \n  rpc GetStarship(GetStarshipRequest) returns (GetStarshipReply) {}\n  rpc ListStarships(ListStarshipsRequest) returns (ListStarshipsReply) {}\n}\n\n// GetStarshipRequest.\nmessage GetStarshipRequest {\n  // starship id.\n  int64 id = 1;\n}\n\n// GetStarshipReply.\nmessage GetStarshipReply {\n  Starship starship = 1;\n}\n\n// ListStarshipsRequest.\nmessage ListStarshipsRequest {\n  repeated int64 ids = 1;\n}\n\n// ListStarshipsReply.\nmessage ListStarshipsReply {\n  repeated Starship starships = 1;\n}\n\n// Starship is a single transport craft that has hyperdrive capability.\nmessage Starship {\n  // starship id.\n  int64 id = 1;\n  // The name of this starship. The common name, such as \"Death Star\".\n  string name = 2;\n  // The model or official name of this starship.\n  // Such as \"T-65 X-wing\" or \"DS-1 Orbital Battle Station\".\n  string model = 3;\n  // The class of this starship, such as \"Starfighter\" or \"Deep Space Mobile Battlestation\".\n  string starship_class = 4;\n  // The manufacturer of this starship. Comma separated if more than one.\n  string manufacturer = 5;\n  // The cost of this starship new, in galactic credits.\n  string cost_in_credits = 6;\n  // The length of this starship in meters.\n  string length = 7;\n  // The number of personnel needed to run or pilot this starship.\n  string crew = 8;\n  // The number of non-essential people this starship can transport.\n  string passengers = 9;\n  // The maximum speed of this starship in the atmosphere.\n  // \"N/A\" if this starship is incapable of atmospheric flight.\n  string max_atmosphering_speed = 10;\n  // The class of this starships hyperdrive.\n  string hyperdrive_rating = 11;\n  // The Maximum number of Megalights this starship can travel in a standard hour.\n  // A \"Megalight\" is a standard unit of distance and has never been defined before within the Star Wars universe.\n  // This figure is only really useful for measuring the difference in speed of starships.\n  // We can assume it is similar to AU, the distance between our Sun (Sol) and Earth.\n  string mglt = 12;\n  // The maximum number of kilograms that this starship can transport.\n  string cargo_capacity = 13;\n  // The maximum length of time that this starship can provide consumables for its entire crew without having to resupply.\n  string consumables = 14;\n  // the hypermedia URL of this resource.\n  string url = 15;\n  // the ISO 8601 date format of the time that this resource was created.\n  string created = 16;\n  // the ISO 8601 date format of the time that this resource was edited.\n  string edited = 17;\n  // film ids.\n  repeated int64 film_ids = 18;\n  // pilot ids.\n  repeated int64 pilot_ids =19;\n}\n"
  },
  {
    "path": "demo/proto/swapi.proto",
    "content": "syntax = \"proto3\";\n\nimport \"google/type/date.proto\";\nimport \"grpc/federation/federation.proto\";\n\nimport \"planet/planet.proto\";\nimport \"film/film.proto\";\nimport \"vehicle/vehicle.proto\";\nimport \"species/species.proto\";\nimport \"starship/starship.proto\";\nimport \"person/person.proto\";\n\npackage swapi;\n\noption go_package = \"github.com/mercari/grpc-federation/demo/swapi/swapi;swapipb\";\n\nservice SWAPI { \n  option (grpc.federation.service) = {};\n\n  rpc GetPerson(GetPersonRequest) returns (GetPersonReply) {}\n  rpc ListPeople(ListPeopleRequest) returns (ListPeopleReply) {}\n  rpc GetFilm(GetFilmRequest) returns (GetFilmReply) {}\n  rpc ListFilms(ListFilmsRequest) returns (ListFilmsReply) {}\n  rpc GetStarship(GetStarshipRequest) returns (GetStarshipReply) {}\n  rpc ListStarships(ListStarshipsRequest) returns (ListStarshipsReply) {}\n  rpc GetSpecies(GetSpeciesRequest) returns (GetSpeciesReply) {}\n  rpc ListSpecies(ListSpeciesRequest) returns (ListSpeciesReply) {}\n  rpc GetVehicle(GetVehicleRequest) returns (GetVehicleReply) {}\n  rpc ListVehicles(ListVehiclesRequest) returns (ListVehiclesReply) {}\n  rpc GetPlanet(GetPlanetRequest) returns (GetPlanetReply) {}\n  rpc ListPlanets(ListPlanetsRequest) returns (ListPlanetsReply) {}\n}\n\n// GetPersonRequest.\nmessage GetPersonRequest {\n  // The persion id.\n  int64 id = 1;\n}\n\n// GetPersonReply.\nmessage GetPersonReply {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"swapi.person.PersonService/GetPerson\"\n        request { field: \"id\" by: \"$.id\" }\n      }\n    }\n    def { name: \"p\" by: \"res.person\" }\n    def {\n      name: \"f\"\n      message {\n        name: \"Films\"\n        args { name: \"ids\" by: \"p.film_ids\" }\n      }\n    }\n    def {\n      name: \"species\"\n      message {\n        name: \"SpeciesList\"\n        args { name: \"ids\" by: \"p.species_ids\" }\n      }\n    }\n    def {\n      name: \"starships\"\n      message {\n        name: \"Starships\"\n        args { name: \"ids\" by: \"p.starship_ids\" }\n      }\n    }\n    def {\n      name: \"v\"\n      message {\n        name: \"Vehicles\"\n        args { name: \"ids\" by: \"p.vehicle_ids\" }\n      }\n    }\n  };\n\n  Person person = 1 [(grpc.federation.field).by = \"p\"];\n  // films.\n  repeated Film films = 2 [(grpc.federation.field).by = \"f.films\"];\n  // species.\n  repeated Species species = 3 [(grpc.federation.field).by = \"species.species\"];\n  // starships.\n  repeated Starship starships = 4 [(grpc.federation.field).by = \"starships.starships\"];\n  // vehicles.\n  repeated Vehicle vehicles = 5 [(grpc.federation.field).by = \"v.vehicles\"];\n}\n\n// ListPeopleRequest.\nmessage ListPeopleRequest {\n  repeated int64 ids = 1;\n}\n\n// ListPeopleReply.\nmessage ListPeopleReply {\n  option (grpc.federation.message) = {\n    def {\n      name: \"p\"\n      message {\n        name: \"People\"\n        args { name: \"ids\" by: \"$.ids\" }\n      }\n    }\n  };\n\n  repeated Person people = 1 [(grpc.federation.field).by = \"p.people\"];\n}\n\n// GetFilmRequest.\nmessage GetFilmRequest {\n  // The film id.\n  int64 id = 1;\n}\n\n// GetFilmReply.\nmessage GetFilmReply {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"swapi.film.FilmService/GetFilm\"\n        request { field: \"id\" by: \"$.id\" }\n      }\n    }\n    def { name: \"f\" by: \"res.film\" }\n    def {\n      name: \"species\"\n      message {\n        name: \"SpeciesList\"\n        args { name: \"ids\" by: \"f.species_ids\" }\n      }\n    }\n    def {\n      name: \"starships\"\n      message {\n        name: \"Starships\"\n        args { name: \"ids\" by: \"f.starship_ids\" }\n      }\n    }\n    def {\n      name: \"v\"\n      message {\n        name: \"Vehicles\"\n        args { name: \"ids\" by: \"f.vehicle_ids\" }\n      }\n    }\n    def {\n      name: \"characters\"\n      message {\n        name: \"People\"\n        args { name: \"ids\" by: \"f.character_ids\" }\n      }\n    }\n    def {\n      name: \"planets\"\n      message {\n        name: \"Planets\"\n        args { name: \"ids\" by: \"f.planet_ids\" }\n      }\n    }\n  };\n\n  Film film = 1 [(grpc.federation.field).by = \"f\"];\n  // species.\n  repeated Species species = 2 [(grpc.federation.field).by = \"species.species\"];\n  // starships.\n  repeated Starship starships = 3  [(grpc.federation.field).by = \"starships.starships\"];\n  // vehicles.\n  repeated Vehicle vehicles = 4 [(grpc.federation.field).by = \"v.vehicles\"];\n  // characters.\n  repeated Person characters = 5 [(grpc.federation.field).by = \"characters.people\"];\n  // planets.\n  repeated Planet planets = 6 [(grpc.federation.field).by = \"planets.planets\"];\n}\n\n// ListFilmsRequest.\nmessage ListFilmsRequest {\n  repeated int64 ids = 1;\n}\n\n// ListFilmsReply.\nmessage ListFilmsReply {\n  option (grpc.federation.message) = {\n    def {\n      name: \"f\"\n      message {\n        name: \"Films\"\n        args { name: \"ids\" by: \"$.ids\" }\n      }\n    }\n  };\n\n  repeated Film films = 1 [(grpc.federation.field).by = \"f.films\"];\n}\n\n// GetVehicleRequest.\nmessage GetVehicleRequest {\n  // vehicle id.\n  int64 id = 1;\n}\n\n// GetVehicleReply.\nmessage GetVehicleReply {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"swapi.vehicle.VehicleService/GetVehicle\"\n        request { field: \"id\" by: \"$.id\" }\n      }\n    }\n    def { name: \"v\" by: \"res.vehicle\" }\n    def {\n      name: \"f\"\n      message {\n        name: \"Films\"\n        args { name: \"ids\" by: \"v.film_ids\" }\n      }\n    }\n    def {\n      name: \"p\"\n      message {\n        name: \"People\"\n        args { name: \"ids\" by: \"v.pilot_ids\" }\n      }\n    }\n  };\n\n  Vehicle vehicle = 1 [(grpc.federation.field).by = \"v\"];\n  // films.\n  repeated Film films = 2 [(grpc.federation.field).by = \"f.films\"];\n  // pilots.\n  repeated Person pilots = 3 [(grpc.federation.field).by = \"p.people\"];\n}\n\n// ListVehiclesRequest.\nmessage ListVehiclesRequest {\n  repeated int64 ids = 1;\n}\n\n// ListVehiclesReply.\nmessage ListVehiclesReply {\n  option (grpc.federation.message) = {\n    def {\n      name: \"v\"\n      message {\n        name: \"Vehicles\"\n        args { name: \"ids\" by: \"$.ids\" }\n      }\n    }\n  };\n\n  repeated Vehicle vehicles = 1 [(grpc.federation.field).by = \"v.vehicles\"];\n}\n\n// GetSpeciesRequest.\nmessage GetSpeciesRequest {\n  // species id.\n  int64 id = 1;\n}\n\n// GetSpeciesReply.\nmessage GetSpeciesReply {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"swapi.species.SpeciesService/GetSpecies\"\n        request { field: \"id\" by: \"$.id\" }\n      }\n    }\n    def { name: \"s\" by: \"res.species\" }\n    def {\n      name: \"f\"\n      message {\n        name: \"Films\"\n        args { name: \"ids\" by: \"s.film_ids\" }\n      }\n    }\n    def {\n      name: \"p\"\n      message {\n        name: \"People\"\n        args { name: \"ids\" by: \"s.person_ids\" }\n      }\n    }\n  };\n\n  Species species = 1 [(grpc.federation.field).by = \"s\"];\n  // people.\n  repeated Person people = 2 [(grpc.federation.field).by = \"p.people\"];\n  // films.\n  repeated Film films = 3 [(grpc.federation.field).by = \"f.films\"];\n}\n\n// ListSpeciesRequest.\nmessage ListSpeciesRequest {\n  repeated int64 ids = 1;\n}\n\n// ListSpeciesReply.\nmessage ListSpeciesReply {\n  option (grpc.federation.message) = {\n    def {\n      name: \"s\"\n      message {\n        name: \"SpeciesList\"\n        args { name: \"ids\" by: \"$.ids\" }\n      }\n    }\n  };\n\n  repeated Species species = 1 [(grpc.federation.field).by = \"s.species\"];\n}\n\n// GetStarshipRequest.\nmessage GetStarshipRequest {\n  // starship id.\n  int64 id = 1;\n}\n\n// GetStarshipReply.\nmessage GetStarshipReply {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"swapi.starship.StarshipService/GetStarship\"\n        request { field: \"id\" by: \"$.id\" }\n      }\n    }\n    def { name: \"s\" by: \"res.starship\" }\n    def {\n      name: \"f\"\n      message {\n        name: \"Films\"\n        args { name: \"ids\" by: \"s.film_ids\" }\n      }\n    }\n    def {\n      name: \"p\"\n      message {\n        name: \"People\"\n        args { name: \"ids\" by: \"s.pilot_ids\" }\n      }\n    }\n  };\n\n  Starship starship = 1 [(grpc.federation.field).by = \"s\"];\n  // films.\n  repeated Film films = 2 [(grpc.federation.field).by = \"f.films\"];\n  // pilots.\n  repeated Person pilots = 3 [(grpc.federation.field).by = \"p.people\"];\n}\n\n// ListStarshipsRequest.\nmessage ListStarshipsRequest {\n  repeated int64 ids = 1;\n}\n\n// ListStarshipsReply.\nmessage ListStarshipsReply {\n  option (grpc.federation.message) = {\n    def {\n      name: \"s\"\n      message {\n        name: \"Starships\"\n        args { name: \"ids\" by: \"$.ids\" }\n      }\n    }\n  };\n\n  repeated Starship starships = 1 [(grpc.federation.field).by = \"s.starships\"];\n}\n\n// GetPlanetRequest.\nmessage GetPlanetRequest {\n  // planet id.\n  int64 id = 1;\n}\n\n// GetPlanetReply.\nmessage GetPlanetReply {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"swapi.planet.PlanetService/GetPlanet\"\n        request { field: \"id\" by: \"$.id\" }\n      }\n    }\n    def { name: \"p\" by: \"res.planet\" }\n    def {\n      name: \"residents\"\n      message {\n        name: \"People\"\n        args { name: \"ids\" by: \"p.resident_ids\" }\n      }\n    }\n    def {\n      name: \"f\"\n      message {\n        name: \"Films\"\n        args { name: \"ids\" by: \"p.film_ids\" }\n      }\n    }\n  };\n\n  Planet planet = 1 [(grpc.federation.field).by = \"p\"];\n  // the people that live on this planet.\n  repeated Person residents = 2 [(grpc.federation.field).by = \"residents.people\"];\n  // films.\n  repeated Film films = 3 [(grpc.federation.field).by = \"f.films\"];\n}\n\n// ListPlanetsRequest.\nmessage ListPlanetsRequest {\n  repeated int64 ids = 1;\n}\n\n// ListPlanetsReply.\nmessage ListPlanetsReply {\n  option (grpc.federation.message) = {\n    def {\n      name: \"p\"\n      message {\n        name: \"Planets\"\n        args { name: \"ids\" by: \"$.ids\" }\n      }\n    }\n  };\n\n  repeated Planet planets = 1 [(grpc.federation.field).by = \"p.planets\"];\n}\n\n// Person is an individual person or character within the Star Wars universe.\nmessage Person {\n  option (grpc.federation.message).alias = \"swapi.person.Person\";\n\n  // person id.\n  int64 id = 1;\n  // The name of this person.\n  string name = 2;\n  // The birth year of the person,\n  // using the in-universe standard of BBY or ABY\n  // - Before the Battle of Yavin or After the Battle of Yavin.\n  // The Battle of Yavin is a battle that occurs at the end of Star Wars episode IV: A New Hope.\n  string birth_year = 3;\n  // The eye color of this person.\n  // Will be \"unknown\" if not known or \"n/a\" if the person does not have an eye.\n  string eye_color = 4;\n  // The gender of this person.\n  // Either \"Male\", \"Female\" or \"unknown\", \"n/a\" if the person does not have a gender.\n  string gender = 5;\n  // The hair color of this person.\n  // Will be \"unknown\" if not known or \"n/a\" if the person does not have hair.\n  string hair_color = 6;\n  // The height of the person in centimeters.\n  string height = 7;\n  // The mass of the person in kilograms.\n  string mass = 8;\n  // The skin color of this person.\n  string skin_color = 9;\n  // The URL of a planet resource, a planet that this person was born on or inhabits.\n  string homeworld = 10;\n  // the hypermedia URL of this resource.\n  string url = 11;\n  // the ISO 8601 date format of the time that this resource was created.\n  string created = 12;\n  // the ISO 8601 date format of the time that this resource was edited.\n  string edited = 13;\n  // film ids.\n  repeated int64 film_ids = 14;\n  // species ids.\n  repeated int64 species_ids = 15;\n  // starship ids.\n  repeated int64 starship_ids = 16;\n  // vehicle ids.\n  repeated int64 vehicle_ids = 17;\n}\n\nmessage People {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"swapi.person.PersonService/ListPeople\"\n        request { field: \"ids\" by: \"$.ids\" }\n      }\n    }\n  };\n  repeated Person people = 1 [(grpc.federation.field).by = \"res.people\"];  \n}\n\n// Film is a single film.\nmessage Film {\n  option (grpc.federation.message).alias = \"swapi.film.Film\";\n\n  // film id.\n  int64 id = 1;\n  // The title of this film.\n  string title = 2;\n  // The episode number of this film.\n  int32 episode_id = 3;\n  // The opening paragraphs at the beginning of this film.\n  string opening_crawl = 4;\n  // The name of the director of this film.\n  string director = 5;\n  // The name(s) of the producer(s) of this film. Comma separated.\n  string producer = 6;\n  // The ISO 8601 date format of film release at original creator country.\n  google.type.Date release_date = 7;\n  // the hypermedia URL of this resource.\n  string url = 8;\n  // the ISO 8601 date format of the time that this resource was created.\n  string created = 9;\n  // the ISO 8601 date format of the time that this resource was edited.\n  string edited = 10;\n  // species ids.\n  repeated int64 species_ids = 11;\n  // starship ids.\n  repeated int64 starship_ids = 12;\n  // vehicle ids.\n  repeated int64 vehicle_ids = 13;\n  // character ids.\n  repeated int64 character_ids = 14;\n  // planet ids.\n  repeated int64 planet_ids = 15;\n}\n\nmessage Films {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"swapi.film.FilmService/ListFilms\"\n        request { field: \"ids\" by: \"$.ids\" }\n      }\n    }\n  };\n  repeated Film films = 1 [(grpc.federation.field).by = \"res.films\"];  \n}\n\n// Starship is a single transport craft that has hyperdrive capability.\nmessage Starship {\n  option (grpc.federation.message).alias =  \"swapi.starship.Starship\";\n\n  // starship id.\n  int64 id = 1;\n  // The name of this starship. The common name, such as \"Death Star\".\n  string name = 2;\n  // The model or official name of this starship.\n  // Such as \"T-65 X-wing\" or \"DS-1 Orbital Battle Station\".\n  string model = 3;\n  // The class of this starship, such as \"Starfighter\" or \"Deep Space Mobile Battlestation\".\n  string starship_class = 4;\n  // The manufacturer of this starship. Comma separated if more than one.\n  string manufacturer = 5;\n  // The cost of this starship new, in galactic credits.\n  string cost_in_credits = 6;\n  // The length of this starship in meters.\n  string length = 7;\n  // The number of personnel needed to run or pilot this starship.\n  string crew = 8;\n  // The number of non-essential people this starship can transport.\n  string passengers = 9;\n  // The maximum speed of this starship in the atmosphere.\n  // \"N/A\" if this starship is incapable of atmospheric flight.\n  string max_atmosphering_speed = 10;\n  // The class of this starships hyperdrive.\n  string hyperdrive_rating = 11;\n  // The Maximum number of Megalights this starship can travel in a standard hour.\n  // A \"Megalight\" is a standard unit of distance and has never been defined before within the Star Wars universe.\n  // This figure is only really useful for measuring the difference in speed of starships.\n  // We can assume it is similar to AU, the distance between our Sun (Sol) and Earth.\n  string mglt = 12;\n  // The maximum number of kilograms that this starship can transport.\n  string cargo_capacity = 13;\n  // The maximum length of time that this starship can provide consumables for its entire crew without having to resupply.\n  string consumables = 14;\n  // the hypermedia URL of this resource.\n  string url = 15;\n  // the ISO 8601 date format of the time that this resource was created.\n  string created = 16;\n  // the ISO 8601 date format of the time that this resource was edited.\n  string edited = 17;\n  // film ids.\n  repeated int64 film_ids = 18;\n  // pilot ids.\n  repeated int64 pilot_ids =19;\n}\n\nmessage Starships {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"swapi.starship.StarshipService/ListStarships\"\n        request { field: \"ids\" by: \"$.ids\" }\n      }\n    }\n  };\n  repeated Starship starships = 1 [(grpc.federation.field).by = \"res.starships\"];\n}\n\n// Vehicle is a single transport craft that does not have hyperdrive capability..\nmessage Vehicle {\n  option (grpc.federation.message).alias = \"swapi.vehicle.Vehicle\";\n\n  // vehicle id.\n  int64 id = 1;\n  // The name of this vehicle. The common name, such as \"Sand Crawler\" or \"Speeder bike\".\n  string name = 2;\n  // The model or official name of this vehicle. Such as \"All-Terrain Attack Transport\".\n  string model = 3;\n  // The class of this vehicle, such as \"Wheeled\" or \"Repulsorcraft\".\n  string vehicle_class = 4;\n  // The manufacturer of this vehicle. Comma separated if more than one.\n  string manufacturer = 5;\n  // The length of this vehicle in meters.\n  string length = 6;\n  // The cost of this vehicle new, in Galactic Credits.\n  string cost_in_credits = 7;\n  // The number of personnel needed to run or pilot this vehicle.\n  string crew = 8;\n  // The number of non-essential people this vehicle can transport.\n  string passengers = 9;\n  // The maximum speed of this vehicle in the atmosphere.\n  string max_atmosphering_speed = 10;\n  // The maximum number of kilograms that this vehicle can transport.\n  string cargo_capacity = 11;\n  // The maximum length of time that this vehicle can provide consumables for its entire crew without having to resupply.\n  string consumables = 12;\n  // the hypermedia URL of this resource.\n  string url = 13;\n  // the ISO 8601 date format of the time that this resource was created.\n  string created = 14;\n  // the ISO 8601 date format of the time that this resource was edited.\n  string edited = 15;\n  // film ids.\n  repeated int64 film_ids = 16;\n  // pilot ids.\n  repeated int64 pilot_ids = 17;\n}\n\nmessage Vehicles {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"swapi.vehicle.VehicleService/ListVehicles\"\n        request { field: \"ids\" by: \"$.ids\" }\n      }\n    }\n  };\n  repeated Vehicle vehicles = 1 [(grpc.federation.field).by = \"res.vehicles\"];\n}\n\n// Species is a type of person or character within the Star Wars Universe.\nmessage Species {\n option (grpc.federation.message).alias = \"swapi.species.Species\";\n\n  // species id.\n  int64 id = 1;\n  // The name of this species.\n  string name = 2;\n  // The classification of this species, such as \"mammal\" or \"reptile\".\n  string classification = 3;\n  // The designation of this species, such as \"sentient\".\n  string designation = 4;\n  // The average height of this species in centimeters.\n  string average_height = 5;\n  // The average lifespan of this species in years.\n  string average_lifespan = 6;\n  // A comma-separated string of common eye colors for this species,\n  // \"none\" if this species does not typically have eyes.\n  string eye_colors = 7;\n  // A comma-separated string of common hair colors for this species,\n  // \"none\" if this species does not typically have hair.\n  string hair_colors = 8;\n  // A comma-separated string of common skin colors for this species,\n  // \"none\" if this species does not typically have skin.\n  string skin_colors = 9;\n  // The language commonly spoken by this species.\n  string language = 10;\n  // The URL of a planet resource, a planet that this species originates from.\n  string homeworld = 11;\n  // the hypermedia URL of this resource.\n  string url = 12;\n  // the ISO 8601 date format of the time that this resource was created.\n  string created = 13;\n  // the ISO 8601 date format of the time that this resource was edited.\n  string edited = 14;\n  // person ids.\n  repeated int64 person_ids = 15;\n  // film ids.\n  repeated int64 film_ids = 16;\n}\n\nmessage SpeciesList {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"swapi.species.SpeciesService/ListSpecies\"\n        request { field: \"ids\" by: \"$.ids\" }\n      }\n    }\n  };\n  repeated Species species = 1 [(grpc.federation.field).by = \"res.species\"];\n}\n\n// Planet is a large mass, planet or planetoid in the Star Wars Universe, at the time of 0 ABY.\nmessage Planet {\n  option (grpc.federation.message).alias =  \"swapi.planet.Planet\";\n\n  // planet id.\n  int64 id = 1;\n  // The name of this planet.\n  string name = 2;\n  // The diameter of this planet in kilometers.\n  string diameter = 3;\n  // The number of standard hours it takes for this planet to complete a single rotation on its axis.\n  string rotation_period = 4;\n  // The number of standard days it takes for this planet to complete a single orbit of its local star.\n  string orbital_period = 5;\n  // A number denoting the gravity of this planet, where \"1\" is normal or 1 standard G.\n  // \"2\" is twice or 2 standard Gs. \"0.5\" is half or 0.5 standard Gs.\n  string gravity = 6;\n  // The average population of sentient beings inhabiting this planet.\n  string population = 7;\n  // The climate of this planet. Comma separated if diverse.\n  string climate = 8;\n  // The terrain of this planet. Comma separated if diverse.\n  string terrain = 9;\n  // The percentage of the planet surface that is naturally occurring water or bodies of water.\n  string surface_water = 10;\n  // the hypermedia URL of this resource.\n  string url = 11;\n  // the ISO 8601 date format of the time that this resource was created.\n  string created = 12;\n  // the ISO 8601 date format of the time that this resource was edited.\n  string edited = 13;\n  // the person that live on this planet ids.\n  repeated int64 resident_ids = 14;\n  // film ids.\n  repeated int64 film_ids = 15;\n}\n\nmessage Planets {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"swapi.planet.PlanetService/ListPlanets\"\n        request { field: \"ids\" by: \"$.ids\" }\n      }\n    }\n  };\n  repeated Planet planets = 1 [(grpc.federation.field).by = \"res.planets\"];\n}"
  },
  {
    "path": "demo/proto/vehicle/vehicle.proto",
    "content": "syntax = \"proto3\";\n\npackage swapi.vehicle;\n\noption go_package = \"github.com/mercari/grpc-federation/demo/swapi/vehicle;vehiclepb\";\n\nservice VehicleService { \n  rpc GetVehicle(GetVehicleRequest) returns (GetVehicleReply) {}\n  rpc ListVehicles(ListVehiclesRequest) returns (ListVehiclesReply) {}\n}\n\n// GetVehicleRequest.\nmessage GetVehicleRequest {\n  // vehicle id.\n  int64 id = 1;\n}\n\n// GetVehicleReply.\nmessage GetVehicleReply {\n  Vehicle vehicle = 1;\n}\n\n// ListVehiclesRequest.\nmessage ListVehiclesRequest {\n  repeated int64 ids = 1;\n}\n\n// ListVehiclesReply.\nmessage ListVehiclesReply {\n  repeated Vehicle vehicles = 1;\n}\n\n// Vehicle is a single transport craft that does not have hyperdrive capability..\nmessage Vehicle {\n  // vehicle id.\n  int64 id = 1;\n  // The name of this vehicle. The common name, such as \"Sand Crawler\" or \"Speeder bike\".\n  string name = 2;\n  // The model or official name of this vehicle. Such as \"All-Terrain Attack Transport\".\n  string model = 3;\n  // The class of this vehicle, such as \"Wheeled\" or \"Repulsorcraft\".\n  string vehicle_class = 4;\n  // The manufacturer of this vehicle. Comma separated if more than one.\n  string manufacturer = 5;\n  // The length of this vehicle in meters.\n  string length = 6;\n  // The cost of this vehicle new, in Galactic Credits.\n  string cost_in_credits = 7;\n  // The number of personnel needed to run or pilot this vehicle.\n  string crew = 8;\n  // The number of non-essential people this vehicle can transport.\n  string passengers = 9;\n  // The maximum speed of this vehicle in the atmosphere.\n  string max_atmosphering_speed = 10;\n  // The maximum number of kilograms that this vehicle can transport.\n  string cargo_capacity = 11;\n  // The maximum length of time that this vehicle can provide consumables for its entire crew without having to resupply.\n  string consumables = 12;\n  // the hypermedia URL of this resource.\n  string url = 13;\n  // the ISO 8601 date format of the time that this resource was created.\n  string created = 14;\n  // the ISO 8601 date format of the time that this resource was edited.\n  string edited = 15;\n  // film ids.\n  repeated int64 film_ids = 16;\n  // pilot ids.\n  repeated int64 pilot_ids = 17;\n}\n"
  },
  {
    "path": "demo/services/film/film.go",
    "content": "package film\n\nimport (\n\t\"context\"\n\n\t\"github.com/peterhellberg/swapi\"\n\n\tfilmpb \"github.com/mercari/grpc-federation/demo/swapi/film\"\n\t\"github.com/mercari/grpc-federation/demo/util\"\n)\n\ntype FilmService struct {\n\t*filmpb.UnimplementedFilmServiceServer\n\tcli   *swapi.Client\n\tcache map[int64]*filmpb.Film\n}\n\nfunc NewFilmService() *FilmService {\n\treturn &FilmService{\n\t\tcli:   swapi.NewClient(),\n\t\tcache: make(map[int64]*filmpb.Film),\n\t}\n}\n\nfunc (s *FilmService) GetFilm(ctx context.Context, req *filmpb.GetFilmRequest) (*filmpb.GetFilmReply, error) {\n\tfilm, err := s.getFilm(ctx, req.GetId())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &filmpb.GetFilmReply{\n\t\tFilm: film,\n\t}, nil\n}\n\nfunc (s *FilmService) ListFilms(ctx context.Context, req *filmpb.ListFilmsRequest) (*filmpb.ListFilmsReply, error) {\n\tfilms := make([]*filmpb.Film, 0, len(req.GetIds()))\n\tfor _, id := range req.GetIds() {\n\t\tfilm, err := s.getFilm(ctx, id)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tfilms = append(films, film)\n\t}\n\treturn &filmpb.ListFilmsReply{\n\t\tFilms: films,\n\t}, nil\n}\n\nfunc (s *FilmService) getFilm(ctx context.Context, id int64) (*filmpb.Film, error) {\n\tif film, exists := s.cache[id]; exists {\n\t\treturn film, nil\n\t}\n\tres, err := s.cli.Film(ctx, int(id))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tfilm, err := s.toFilm(id, &res)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\ts.cache[id] = film\n\treturn film, nil\n}\n\nfunc (s *FilmService) toFilm(id int64, f *swapi.Film) (*filmpb.Film, error) {\n\tvar (\n\t\tspeciesIDs   []int64\n\t\tstarshipIDs  []int64\n\t\tvehicleIDs   []int64\n\t\tcharacterIDs []int64\n\t\tplanetIDs    []int64\n\t)\n\tfor _, url := range f.SpeciesURLs {\n\t\tid, err := util.SpeciesURLToID(url)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tspeciesIDs = append(speciesIDs, id)\n\t}\n\tfor _, url := range f.StarshipURLs {\n\t\tid, err := util.StarshipURLToID(url)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tstarshipIDs = append(starshipIDs, id)\n\t}\n\tfor _, url := range f.VehicleURLs {\n\t\tid, err := util.VehicleURLToID(url)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tvehicleIDs = append(vehicleIDs, id)\n\t}\n\tfor _, url := range f.CharacterURLs {\n\t\tid, err := util.PersonURLToID(url)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tcharacterIDs = append(characterIDs, id)\n\t}\n\tfor _, url := range f.PlanetURLs {\n\t\tid, err := util.PlanetURLToID(url)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tplanetIDs = append(planetIDs, id)\n\t}\n\treturn &filmpb.Film{\n\t\tId:           id,\n\t\tTitle:        f.Title,\n\t\tEpisodeId:    int32(f.EpisodeID),\n\t\tOpeningCrawl: f.OpeningCrawl,\n\t\tDirector:     f.Director,\n\t\tProducer:     f.Producer,\n\t\tUrl:          f.URL,\n\t\tCreated:      f.Created,\n\t\tEdited:       f.Edited,\n\t\tSpeciesIds:   speciesIDs,\n\t\tStarshipIds:  starshipIDs,\n\t\tVehicleIds:   vehicleIDs,\n\t\tCharacterIds: characterIDs,\n\t\tPlanetIds:    planetIDs,\n\t}, nil\n}\n"
  },
  {
    "path": "demo/services/film/film_test.go",
    "content": "package film_test\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\t\"github.com/mercari/grpc-federation/demo/services/film\"\n\tfilmpb \"github.com/mercari/grpc-federation/demo/swapi/film\"\n)\n\nfunc TestFilmService(t *testing.T) {\n\tsvc := film.NewFilmService()\n\tt.Run(\"GetFilm\", func(t *testing.T) {\n\t\tres, err := svc.GetFilm(context.Background(), &filmpb.GetFilmRequest{\n\t\t\tId: 1,\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tif res.GetFilm() == nil {\n\t\t\tt.Fatalf(\"failed to get film: %+v\", res)\n\t\t}\n\t\tif res.GetFilm().GetId() != 1 {\n\t\t\tt.Fatalf(\"failed to get id: %+v\", res)\n\t\t}\n\t})\n\tt.Run(\"ListFilms\", func(t *testing.T) {\n\t\tres, err := svc.ListFilms(context.Background(), &filmpb.ListFilmsRequest{\n\t\t\tIds: []int64{1, 2},\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tif len(res.GetFilms()) != 2 {\n\t\t\tt.Fatalf(\"failed to get films: %+v\", res)\n\t\t}\n\t})\n}\n"
  },
  {
    "path": "demo/services/person/person.go",
    "content": "package person\n\nimport (\n\t\"context\"\n\n\t\"github.com/peterhellberg/swapi\"\n\n\tpersonpb \"github.com/mercari/grpc-federation/demo/swapi/person\"\n\t\"github.com/mercari/grpc-federation/demo/util\"\n)\n\ntype PersonService struct {\n\t*personpb.UnimplementedPersonServiceServer\n\tcli   *swapi.Client\n\tcache map[int64]*personpb.Person\n}\n\nfunc NewPersonService() *PersonService {\n\treturn &PersonService{\n\t\tcli:   swapi.NewClient(),\n\t\tcache: make(map[int64]*personpb.Person),\n\t}\n}\n\nfunc (s *PersonService) GetPerson(ctx context.Context, req *personpb.GetPersonRequest) (*personpb.GetPersonReply, error) {\n\tperson, err := s.getPerson(ctx, req.GetId())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &personpb.GetPersonReply{\n\t\tPerson: person,\n\t}, nil\n}\n\nfunc (s *PersonService) ListPeople(ctx context.Context, req *personpb.ListPeopleRequest) (*personpb.ListPeopleReply, error) {\n\tpeople := make([]*personpb.Person, 0, len(req.GetIds()))\n\tfor _, id := range req.GetIds() {\n\t\tperson, err := s.getPerson(ctx, id)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tpeople = append(people, person)\n\t}\n\treturn &personpb.ListPeopleReply{\n\t\tPeople: people,\n\t}, nil\n}\n\nfunc (s *PersonService) getPerson(ctx context.Context, id int64) (*personpb.Person, error) {\n\tif person, exists := s.cache[id]; exists {\n\t\treturn person, nil\n\t}\n\tres, err := s.cli.Person(ctx, int(id))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tperson, err := s.toPerson(id, &res)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\ts.cache[id] = person\n\treturn person, nil\n}\n\nfunc (s *PersonService) toPerson(id int64, p *swapi.Person) (*personpb.Person, error) {\n\tvar (\n\t\tfilmIDs     []int64\n\t\tspeciesIDs  []int64\n\t\tstarshipIDs []int64\n\t\tvehicleIDs  []int64\n\t)\n\tfor _, url := range p.FilmURLs {\n\t\tid, err := util.FilmURLToID(url)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tfilmIDs = append(filmIDs, id)\n\t}\n\tfor _, url := range p.SpeciesURLs {\n\t\tid, err := util.SpeciesURLToID(url)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tspeciesIDs = append(speciesIDs, id)\n\t}\n\tfor _, url := range p.StarshipURLs {\n\t\tid, err := util.StarshipURLToID(url)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tstarshipIDs = append(starshipIDs, id)\n\t}\n\tfor _, url := range p.VehicleURLs {\n\t\tid, err := util.VehicleURLToID(url)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tvehicleIDs = append(vehicleIDs, id)\n\t}\n\treturn &personpb.Person{\n\t\tId:          id,\n\t\tName:        p.Name,\n\t\tBirthYear:   p.BirthYear,\n\t\tEyeColor:    p.EyeColor,\n\t\tGender:      p.Gender,\n\t\tHairColor:   p.HairColor,\n\t\tHeight:      p.Height,\n\t\tMass:        p.Mass,\n\t\tSkinColor:   p.SkinColor,\n\t\tHomeworld:   p.Homeworld,\n\t\tUrl:         p.URL,\n\t\tCreated:     p.Created,\n\t\tEdited:      p.Edited,\n\t\tFilmIds:     filmIDs,\n\t\tSpeciesIds:  speciesIDs,\n\t\tStarshipIds: starshipIDs,\n\t\tVehicleIds:  vehicleIDs,\n\t}, nil\n}\n"
  },
  {
    "path": "demo/services/person/person_test.go",
    "content": "package person_test\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\t\"github.com/mercari/grpc-federation/demo/services/person\"\n\tpersonpb \"github.com/mercari/grpc-federation/demo/swapi/person\"\n)\n\nfunc TestPersonService(t *testing.T) {\n\tsvc := person.NewPersonService()\n\tt.Run(\"GetPerson\", func(t *testing.T) {\n\t\tres, err := svc.GetPerson(context.Background(), &personpb.GetPersonRequest{\n\t\t\tId: 1,\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tif res.GetPerson() == nil {\n\t\t\tt.Fatalf(\"failed to get person: %+v\", res)\n\t\t}\n\t\tif res.GetPerson().GetId() != 1 {\n\t\t\tt.Fatalf(\"failed to get id: %+v\", res)\n\t\t}\n\t})\n\tt.Run(\"ListPersons\", func(t *testing.T) {\n\t\tres, err := svc.ListPeople(context.Background(), &personpb.ListPeopleRequest{\n\t\t\tIds: []int64{1, 2},\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tif len(res.GetPeople()) != 2 {\n\t\t\tt.Fatalf(\"failed to get persons: %+v\", res)\n\t\t}\n\t})\n}\n"
  },
  {
    "path": "demo/services/planet/planet.go",
    "content": "package planet\n\nimport (\n\t\"context\"\n\n\t\"github.com/peterhellberg/swapi\"\n\n\tplanetpb \"github.com/mercari/grpc-federation/demo/swapi/planet\"\n\t\"github.com/mercari/grpc-federation/demo/util\"\n)\n\ntype PlanetService struct {\n\t*planetpb.UnimplementedPlanetServiceServer\n\tcli   *swapi.Client\n\tcache map[int64]*planetpb.Planet\n}\n\nfunc NewPlanetService() *PlanetService {\n\treturn &PlanetService{\n\t\tcli:   swapi.NewClient(),\n\t\tcache: make(map[int64]*planetpb.Planet),\n\t}\n}\n\nfunc (s *PlanetService) GetPlanet(ctx context.Context, req *planetpb.GetPlanetRequest) (*planetpb.GetPlanetReply, error) {\n\tplanet, err := s.getPlanet(ctx, req.GetId())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &planetpb.GetPlanetReply{\n\t\tPlanet: planet,\n\t}, nil\n}\n\nfunc (s *PlanetService) ListPlanets(ctx context.Context, req *planetpb.ListPlanetsRequest) (*planetpb.ListPlanetsReply, error) {\n\tplanets := make([]*planetpb.Planet, 0, len(req.GetIds()))\n\tfor _, id := range req.GetIds() {\n\t\tplanet, err := s.getPlanet(ctx, id)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tplanets = append(planets, planet)\n\t}\n\treturn &planetpb.ListPlanetsReply{\n\t\tPlanets: planets,\n\t}, nil\n}\n\nfunc (s *PlanetService) getPlanet(ctx context.Context, id int64) (*planetpb.Planet, error) {\n\tif planet, exists := s.cache[id]; exists {\n\t\treturn planet, nil\n\t}\n\tres, err := s.cli.Planet(ctx, int(id))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tplanet, err := s.toPlanet(id, &res)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\ts.cache[id] = planet\n\treturn planet, nil\n}\n\nfunc (s *PlanetService) toPlanet(id int64, p *swapi.Planet) (*planetpb.Planet, error) {\n\tvar (\n\t\tresidentIDs []int64\n\t\tfilmIDs     []int64\n\t)\n\tfor _, url := range p.ResidentURLs {\n\t\tid, err := util.PersonURLToID(url)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tresidentIDs = append(residentIDs, id)\n\t}\n\tfor _, url := range p.FilmURLs {\n\t\tid, err := util.FilmURLToID(url)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tfilmIDs = append(filmIDs, id)\n\t}\n\treturn &planetpb.Planet{\n\t\tId:             id,\n\t\tName:           p.Name,\n\t\tDiameter:       p.Diameter,\n\t\tRotationPeriod: p.RotationPeriod,\n\t\tOrbitalPeriod:  p.OrbitalPeriod,\n\t\tClimate:        p.Climate,\n\t\tGravity:        p.Gravity,\n\t\tTerrain:        p.Terrain,\n\t\tSurfaceWater:   p.SurfaceWater,\n\t\tPopulation:     p.Population,\n\t\tCreated:        p.Created,\n\t\tEdited:         p.Edited,\n\t\tUrl:            p.URL,\n\t\tResidentIds:    residentIDs,\n\t\tFilmIds:        filmIDs,\n\t}, nil\n}\n"
  },
  {
    "path": "demo/services/planet/planet_test.go",
    "content": "package planet_test\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\t\"github.com/mercari/grpc-federation/demo/services/planet\"\n\tplanetpb \"github.com/mercari/grpc-federation/demo/swapi/planet\"\n)\n\nfunc TestPlanetService(t *testing.T) {\n\tsvc := planet.NewPlanetService()\n\tt.Run(\"GetPlanet\", func(t *testing.T) {\n\t\tres, err := svc.GetPlanet(context.Background(), &planetpb.GetPlanetRequest{\n\t\t\tId: 1,\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tif res.GetPlanet() == nil {\n\t\t\tt.Fatalf(\"failed to get planet: %+v\", res)\n\t\t}\n\t\tif res.GetPlanet().GetId() != 1 {\n\t\t\tt.Fatalf(\"failed to get id: %+v\", res)\n\t\t}\n\t\tif len(res.GetPlanet().GetResidentIds()) == 0 {\n\t\t\tt.Fatalf(\"failed to get resident ids: %+v\", res)\n\t\t}\n\t\tif len(res.GetPlanet().GetFilmIds()) == 0 {\n\t\t\tt.Fatalf(\"failed to get film ids: %+v\", res)\n\t\t}\n\t})\n\tt.Run(\"ListPlanets\", func(t *testing.T) {\n\t\tres, err := svc.ListPlanets(context.Background(), &planetpb.ListPlanetsRequest{\n\t\t\tIds: []int64{1, 2},\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tif len(res.GetPlanets()) != 2 {\n\t\t\tt.Fatalf(\"failed to get planets: %+v\", res)\n\t\t}\n\t})\n}\n"
  },
  {
    "path": "demo/services/species/species.go",
    "content": "package species\n\nimport (\n\t\"context\"\n\n\t\"github.com/peterhellberg/swapi\"\n\n\tspeciespb \"github.com/mercari/grpc-federation/demo/swapi/species\"\n\t\"github.com/mercari/grpc-federation/demo/util\"\n)\n\ntype SpeciesService struct {\n\t*speciespb.UnimplementedSpeciesServiceServer\n\tcli   *swapi.Client\n\tcache map[int64]*speciespb.Species\n}\n\nfunc NewSpeciesService() *SpeciesService {\n\treturn &SpeciesService{\n\t\tcli:   swapi.NewClient(),\n\t\tcache: make(map[int64]*speciespb.Species),\n\t}\n}\n\nfunc (s *SpeciesService) GetSpecies(ctx context.Context, req *speciespb.GetSpeciesRequest) (*speciespb.GetSpeciesReply, error) {\n\tspecies, err := s.getSpecies(ctx, req.GetId())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &speciespb.GetSpeciesReply{\n\t\tSpecies: species,\n\t}, nil\n}\n\nfunc (s *SpeciesService) ListSpecies(ctx context.Context, req *speciespb.ListSpeciesRequest) (*speciespb.ListSpeciesReply, error) {\n\tspecies := make([]*speciespb.Species, 0, len(req.GetIds()))\n\tfor _, id := range req.GetIds() {\n\t\tsp, err := s.getSpecies(ctx, id)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tspecies = append(species, sp)\n\t}\n\treturn &speciespb.ListSpeciesReply{\n\t\tSpecies: species,\n\t}, nil\n}\n\nfunc (s *SpeciesService) getSpecies(ctx context.Context, id int64) (*speciespb.Species, error) {\n\tif species, exists := s.cache[id]; exists {\n\t\treturn species, nil\n\t}\n\tres, err := s.cli.Species(ctx, int(id))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tspecies, err := s.toSpecies(id, &res)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\ts.cache[id] = species\n\treturn species, nil\n}\n\nfunc (s *SpeciesService) toSpecies(id int64, sp *swapi.Species) (*speciespb.Species, error) {\n\tvar (\n\t\tpersonIDs []int64\n\t\tfilmIDs   []int64\n\t)\n\tfor _, url := range sp.PeopleURLs {\n\t\tid, err := util.PersonURLToID(url)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tpersonIDs = append(personIDs, id)\n\t}\n\tfor _, url := range sp.FilmURLs {\n\t\tid, err := util.FilmURLToID(url)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tfilmIDs = append(filmIDs, id)\n\t}\n\treturn &speciespb.Species{\n\t\tId:              id,\n\t\tName:            sp.Name,\n\t\tClassification:  sp.Classification,\n\t\tDesignation:     sp.Designation,\n\t\tAverageHeight:   sp.AverageHeight,\n\t\tAverageLifespan: sp.AverageLifespan,\n\t\tEyeColors:       sp.EyeColors,\n\t\tHairColors:      sp.HairColors,\n\t\tSkinColors:      sp.SkinColors,\n\t\tLanguage:        sp.Language,\n\t\tHomeworld:       sp.Homeworld,\n\t\tUrl:             sp.URL,\n\t\tCreated:         sp.Created,\n\t\tEdited:          sp.Edited,\n\t\tPersonIds:       personIDs,\n\t\tFilmIds:         filmIDs,\n\t}, nil\n}\n"
  },
  {
    "path": "demo/services/species/species_test.go",
    "content": "package species_test\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\t\"github.com/mercari/grpc-federation/demo/services/species\"\n\tspeciespb \"github.com/mercari/grpc-federation/demo/swapi/species\"\n)\n\nfunc TestSpeciesService(t *testing.T) {\n\tsvc := species.NewSpeciesService()\n\tt.Run(\"GetSpecies\", func(t *testing.T) {\n\t\tres, err := svc.GetSpecies(context.Background(), &speciespb.GetSpeciesRequest{\n\t\t\tId: 1,\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tif res.GetSpecies() == nil {\n\t\t\tt.Fatalf(\"failed to get species: %+v\", res)\n\t\t}\n\t\tif res.GetSpecies().GetId() != 1 {\n\t\t\tt.Fatalf(\"failed to get id: %+v\", res)\n\t\t}\n\t})\n\tt.Run(\"ListSpeciess\", func(t *testing.T) {\n\t\tres, err := svc.ListSpecies(context.Background(), &speciespb.ListSpeciesRequest{\n\t\t\tIds: []int64{1, 2},\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tif len(res.GetSpecies()) != 2 {\n\t\t\tt.Fatalf(\"failed to get species: %+v\", res)\n\t\t}\n\t})\n}\n"
  },
  {
    "path": "demo/services/starship/starship.go",
    "content": "package starship\n\nimport (\n\t\"context\"\n\n\t\"github.com/peterhellberg/swapi\"\n\n\tstarshippb \"github.com/mercari/grpc-federation/demo/swapi/starship\"\n\t\"github.com/mercari/grpc-federation/demo/util\"\n)\n\ntype StarshipService struct {\n\t*starshippb.UnimplementedStarshipServiceServer\n\tcli   *swapi.Client\n\tcache map[int64]*starshippb.Starship\n}\n\nfunc NewStarshipService() *StarshipService {\n\treturn &StarshipService{\n\t\tcli:   swapi.NewClient(),\n\t\tcache: make(map[int64]*starshippb.Starship),\n\t}\n}\n\nfunc (s *StarshipService) GetStarship(ctx context.Context, req *starshippb.GetStarshipRequest) (*starshippb.GetStarshipReply, error) {\n\tstarship, err := s.getStarship(ctx, req.GetId())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &starshippb.GetStarshipReply{\n\t\tStarship: starship,\n\t}, nil\n}\n\nfunc (s *StarshipService) ListStarships(ctx context.Context, req *starshippb.ListStarshipsRequest) (*starshippb.ListStarshipsReply, error) {\n\tstarships := make([]*starshippb.Starship, 0, len(req.GetIds()))\n\tfor _, id := range req.GetIds() {\n\t\tstarship, err := s.getStarship(ctx, id)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tstarships = append(starships, starship)\n\t}\n\treturn &starshippb.ListStarshipsReply{\n\t\tStarships: starships,\n\t}, nil\n}\n\nfunc (s *StarshipService) getStarship(ctx context.Context, id int64) (*starshippb.Starship, error) {\n\tif starship, exists := s.cache[id]; exists {\n\t\treturn starship, nil\n\t}\n\tres, err := s.cli.Starship(ctx, int(id))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tstarship, err := s.toStarship(id, &res)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\ts.cache[id] = starship\n\treturn starship, nil\n}\n\nfunc (s *StarshipService) toStarship(id int64, st *swapi.Starship) (*starshippb.Starship, error) {\n\tvar (\n\t\tfilmIDs  []int64\n\t\tpilotIDs []int64\n\t)\n\tfor _, url := range st.FilmURLs {\n\t\tid, err := util.FilmURLToID(url)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tfilmIDs = append(filmIDs, id)\n\t}\n\tfor _, url := range st.PilotURLs {\n\t\tid, err := util.PersonURLToID(url)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tpilotIDs = append(pilotIDs, id)\n\t}\n\treturn &starshippb.Starship{\n\t\tId:                   id,\n\t\tName:                 st.Name,\n\t\tModel:                st.Model,\n\t\tStarshipClass:        st.StarshipClass,\n\t\tManufacturer:         st.Manufacturer,\n\t\tCostInCredits:        st.CostInCredits,\n\t\tLength:               st.Length,\n\t\tCrew:                 st.Crew,\n\t\tPassengers:           st.Passengers,\n\t\tMaxAtmospheringSpeed: st.MaxAtmospheringSpeed,\n\t\tHyperdriveRating:     st.HyperdriveRating,\n\t\tMglt:                 st.MGLT,\n\t\tCargoCapacity:        st.CargoCapacity,\n\t\tConsumables:          st.Consumables,\n\t\tUrl:                  st.URL,\n\t\tCreated:              st.Created,\n\t\tEdited:               st.Edited,\n\t\tPilotIds:             pilotIDs,\n\t\tFilmIds:              filmIDs,\n\t}, nil\n}\n"
  },
  {
    "path": "demo/services/starship/starship_test.go",
    "content": "package starship_test\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\t\"github.com/mercari/grpc-federation/demo/services/starship\"\n\tstarshippb \"github.com/mercari/grpc-federation/demo/swapi/starship\"\n)\n\nfunc TestStarshipService(t *testing.T) {\n\tsvc := starship.NewStarshipService()\n\tt.Run(\"GetStarship\", func(t *testing.T) {\n\t\tres, err := svc.GetStarship(context.Background(), &starshippb.GetStarshipRequest{\n\t\t\tId: 1,\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tif res.GetStarship() == nil {\n\t\t\tt.Fatalf(\"failed to get starship: %+v\", res)\n\t\t}\n\t\tif res.GetStarship().GetId() != 1 {\n\t\t\tt.Fatalf(\"failed to get id: %+v\", res)\n\t\t}\n\t})\n\tt.Run(\"ListStarships\", func(t *testing.T) {\n\t\tres, err := svc.ListStarships(context.Background(), &starshippb.ListStarshipsRequest{\n\t\t\tIds: []int64{1, 2},\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tif len(res.GetStarships()) != 2 {\n\t\t\tt.Fatalf(\"failed to get starships: %+v\", res)\n\t\t}\n\t})\n}\n"
  },
  {
    "path": "demo/services/vehicle/vehicle.go",
    "content": "package vehicle\n\nimport (\n\t\"context\"\n\n\t\"github.com/peterhellberg/swapi\"\n\n\tvehiclepb \"github.com/mercari/grpc-federation/demo/swapi/vehicle\"\n\t\"github.com/mercari/grpc-federation/demo/util\"\n)\n\ntype VehicleService struct {\n\t*vehiclepb.UnimplementedVehicleServiceServer\n\tcli   *swapi.Client\n\tcache map[int64]*vehiclepb.Vehicle\n}\n\nfunc NewVehicleService() *VehicleService {\n\treturn &VehicleService{\n\t\tcli:   swapi.NewClient(),\n\t\tcache: make(map[int64]*vehiclepb.Vehicle),\n\t}\n}\n\nfunc (s *VehicleService) GetVehicle(ctx context.Context, req *vehiclepb.GetVehicleRequest) (*vehiclepb.GetVehicleReply, error) {\n\tvehicle, err := s.getVehicle(ctx, req.GetId())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &vehiclepb.GetVehicleReply{\n\t\tVehicle: vehicle,\n\t}, nil\n}\n\nfunc (s *VehicleService) ListVehicles(ctx context.Context, req *vehiclepb.ListVehiclesRequest) (*vehiclepb.ListVehiclesReply, error) {\n\tvehicles := make([]*vehiclepb.Vehicle, 0, len(req.GetIds()))\n\tfor _, id := range req.GetIds() {\n\t\tvehicle, err := s.getVehicle(ctx, id)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tvehicles = append(vehicles, vehicle)\n\t}\n\treturn &vehiclepb.ListVehiclesReply{\n\t\tVehicles: vehicles,\n\t}, nil\n}\n\nfunc (s *VehicleService) getVehicle(ctx context.Context, id int64) (*vehiclepb.Vehicle, error) {\n\tif vehicle, exists := s.cache[id]; exists {\n\t\treturn vehicle, nil\n\t}\n\tres, err := s.cli.Vehicle(ctx, int(id))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvehicle, err := s.toVehicle(id, &res)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\ts.cache[id] = vehicle\n\treturn vehicle, nil\n}\n\nfunc (s *VehicleService) toVehicle(id int64, v *swapi.Vehicle) (*vehiclepb.Vehicle, error) {\n\tvar (\n\t\tfilmIDs  []int64\n\t\tpilotIDs []int64\n\t)\n\tfor _, url := range v.FilmURLs {\n\t\tid, err := util.FilmURLToID(url)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tfilmIDs = append(filmIDs, id)\n\t}\n\tfor _, url := range v.PilotURLs {\n\t\tid, err := util.PersonURLToID(url)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tpilotIDs = append(pilotIDs, id)\n\t}\n\treturn &vehiclepb.Vehicle{\n\t\tId:                   id,\n\t\tName:                 v.Name,\n\t\tModel:                v.Model,\n\t\tVehicleClass:         v.VehicleClass,\n\t\tManufacturer:         v.Manufacturer,\n\t\tLength:               v.Length,\n\t\tCostInCredits:        v.CostInCredits,\n\t\tCrew:                 v.Crew,\n\t\tPassengers:           v.Passengers,\n\t\tMaxAtmospheringSpeed: v.MaxAtmospheringSpeed,\n\t\tCargoCapacity:        v.CargoCapacity,\n\t\tConsumables:          v.Consumables,\n\t\tUrl:                  v.URL,\n\t\tCreated:              v.Created,\n\t\tEdited:               v.Edited,\n\t\tFilmIds:              filmIDs,\n\t\tPilotIds:             pilotIDs,\n\t}, nil\n}\n"
  },
  {
    "path": "demo/services/vehicle/vehicle_test.go",
    "content": "package vehicle_test\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\t\"github.com/mercari/grpc-federation/demo/services/vehicle\"\n\tvehiclepb \"github.com/mercari/grpc-federation/demo/swapi/vehicle\"\n)\n\nfunc TestVehicleService(t *testing.T) {\n\tsvc := vehicle.NewVehicleService()\n\tt.Run(\"GetVehicle\", func(t *testing.T) {\n\t\tres, err := svc.GetVehicle(context.Background(), &vehiclepb.GetVehicleRequest{\n\t\t\tId: 1,\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tif res.GetVehicle() == nil {\n\t\t\tt.Fatalf(\"failed to get vehicle: %+v\", res)\n\t\t}\n\t\tif res.GetVehicle().GetId() != 1 {\n\t\t\tt.Fatalf(\"failed to get id: %+v\", res)\n\t\t}\n\t})\n\tt.Run(\"ListVehicles\", func(t *testing.T) {\n\t\tres, err := svc.ListVehicles(context.Background(), &vehiclepb.ListVehiclesRequest{\n\t\t\tIds: []int64{1, 2},\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tif len(res.GetVehicles()) != 2 {\n\t\t\tt.Fatalf(\"failed to get vehicles: %+v\", res)\n\t\t}\n\t})\n}\n"
  },
  {
    "path": "demo/swapi/film/film.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.34.1\n// \tprotoc        (unknown)\n// source: film/film.proto\n\npackage filmpb\n\nimport (\n\tdate \"google.golang.org/genproto/googleapis/type/date\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// GetFilmRequest.\ntype GetFilmRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The film id.\n\tId int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetFilmRequest) Reset() {\n\t*x = GetFilmRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_film_film_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetFilmRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetFilmRequest) ProtoMessage() {}\n\nfunc (x *GetFilmRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_film_film_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetFilmRequest.ProtoReflect.Descriptor instead.\nfunc (*GetFilmRequest) Descriptor() ([]byte, []int) {\n\treturn file_film_film_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetFilmRequest) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\n// GetFilmReply.\ntype GetFilmReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tFilm *Film `protobuf:\"bytes,1,opt,name=film,proto3\" json:\"film,omitempty\"`\n}\n\nfunc (x *GetFilmReply) Reset() {\n\t*x = GetFilmReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_film_film_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetFilmReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetFilmReply) ProtoMessage() {}\n\nfunc (x *GetFilmReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_film_film_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetFilmReply.ProtoReflect.Descriptor instead.\nfunc (*GetFilmReply) Descriptor() ([]byte, []int) {\n\treturn file_film_film_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetFilmReply) GetFilm() *Film {\n\tif x != nil {\n\t\treturn x.Film\n\t}\n\treturn nil\n}\n\n// ListFilmsRequest.\ntype ListFilmsRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tIds []int64 `protobuf:\"varint,1,rep,packed,name=ids,proto3\" json:\"ids,omitempty\"`\n}\n\nfunc (x *ListFilmsRequest) Reset() {\n\t*x = ListFilmsRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_film_film_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListFilmsRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListFilmsRequest) ProtoMessage() {}\n\nfunc (x *ListFilmsRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_film_film_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListFilmsRequest.ProtoReflect.Descriptor instead.\nfunc (*ListFilmsRequest) Descriptor() ([]byte, []int) {\n\treturn file_film_film_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *ListFilmsRequest) GetIds() []int64 {\n\tif x != nil {\n\t\treturn x.Ids\n\t}\n\treturn nil\n}\n\n// ListFilmsReply.\ntype ListFilmsReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tFilms []*Film `protobuf:\"bytes,1,rep,name=films,proto3\" json:\"films,omitempty\"`\n}\n\nfunc (x *ListFilmsReply) Reset() {\n\t*x = ListFilmsReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_film_film_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListFilmsReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListFilmsReply) ProtoMessage() {}\n\nfunc (x *ListFilmsReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_film_film_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListFilmsReply.ProtoReflect.Descriptor instead.\nfunc (*ListFilmsReply) Descriptor() ([]byte, []int) {\n\treturn file_film_film_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *ListFilmsReply) GetFilms() []*Film {\n\tif x != nil {\n\t\treturn x.Films\n\t}\n\treturn nil\n}\n\n// Film is a single film.\ntype Film struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// film id.\n\tId int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\t// The title of this film.\n\tTitle string `protobuf:\"bytes,2,opt,name=title,proto3\" json:\"title,omitempty\"`\n\t// The episode number of this film.\n\tEpisodeId int32 `protobuf:\"varint,3,opt,name=episode_id,json=episodeId,proto3\" json:\"episode_id,omitempty\"`\n\t// The opening paragraphs at the beginning of this film.\n\tOpeningCrawl string `protobuf:\"bytes,4,opt,name=opening_crawl,json=openingCrawl,proto3\" json:\"opening_crawl,omitempty\"`\n\t// The name of the director of this film.\n\tDirector string `protobuf:\"bytes,5,opt,name=director,proto3\" json:\"director,omitempty\"`\n\t// The name(s) of the producer(s) of this film. Comma separated.\n\tProducer string `protobuf:\"bytes,6,opt,name=producer,proto3\" json:\"producer,omitempty\"`\n\t// The ISO 8601 date format of film release at original creator country.\n\tReleaseDate *date.Date `protobuf:\"bytes,7,opt,name=release_date,json=releaseDate,proto3\" json:\"release_date,omitempty\"`\n\t// the hypermedia URL of this resource.\n\tUrl string `protobuf:\"bytes,8,opt,name=url,proto3\" json:\"url,omitempty\"`\n\t// the ISO 8601 date format of the time that this resource was created.\n\tCreated string `protobuf:\"bytes,9,opt,name=created,proto3\" json:\"created,omitempty\"`\n\t// the ISO 8601 date format of the time that this resource was edited.\n\tEdited string `protobuf:\"bytes,10,opt,name=edited,proto3\" json:\"edited,omitempty\"`\n\t// species ids.\n\tSpeciesIds []int64 `protobuf:\"varint,11,rep,packed,name=species_ids,json=speciesIds,proto3\" json:\"species_ids,omitempty\"`\n\t// starship ids.\n\tStarshipIds []int64 `protobuf:\"varint,12,rep,packed,name=starship_ids,json=starshipIds,proto3\" json:\"starship_ids,omitempty\"`\n\t// vehicle ids.\n\tVehicleIds []int64 `protobuf:\"varint,13,rep,packed,name=vehicle_ids,json=vehicleIds,proto3\" json:\"vehicle_ids,omitempty\"`\n\t// character ids.\n\tCharacterIds []int64 `protobuf:\"varint,14,rep,packed,name=character_ids,json=characterIds,proto3\" json:\"character_ids,omitempty\"`\n\t// planet ids.\n\tPlanetIds []int64 `protobuf:\"varint,15,rep,packed,name=planet_ids,json=planetIds,proto3\" json:\"planet_ids,omitempty\"`\n}\n\nfunc (x *Film) Reset() {\n\t*x = Film{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_film_film_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Film) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Film) ProtoMessage() {}\n\nfunc (x *Film) ProtoReflect() protoreflect.Message {\n\tmi := &file_film_film_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Film.ProtoReflect.Descriptor instead.\nfunc (*Film) Descriptor() ([]byte, []int) {\n\treturn file_film_film_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *Film) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *Film) GetTitle() string {\n\tif x != nil {\n\t\treturn x.Title\n\t}\n\treturn \"\"\n}\n\nfunc (x *Film) GetEpisodeId() int32 {\n\tif x != nil {\n\t\treturn x.EpisodeId\n\t}\n\treturn 0\n}\n\nfunc (x *Film) GetOpeningCrawl() string {\n\tif x != nil {\n\t\treturn x.OpeningCrawl\n\t}\n\treturn \"\"\n}\n\nfunc (x *Film) GetDirector() string {\n\tif x != nil {\n\t\treturn x.Director\n\t}\n\treturn \"\"\n}\n\nfunc (x *Film) GetProducer() string {\n\tif x != nil {\n\t\treturn x.Producer\n\t}\n\treturn \"\"\n}\n\nfunc (x *Film) GetReleaseDate() *date.Date {\n\tif x != nil {\n\t\treturn x.ReleaseDate\n\t}\n\treturn nil\n}\n\nfunc (x *Film) GetUrl() string {\n\tif x != nil {\n\t\treturn x.Url\n\t}\n\treturn \"\"\n}\n\nfunc (x *Film) GetCreated() string {\n\tif x != nil {\n\t\treturn x.Created\n\t}\n\treturn \"\"\n}\n\nfunc (x *Film) GetEdited() string {\n\tif x != nil {\n\t\treturn x.Edited\n\t}\n\treturn \"\"\n}\n\nfunc (x *Film) GetSpeciesIds() []int64 {\n\tif x != nil {\n\t\treturn x.SpeciesIds\n\t}\n\treturn nil\n}\n\nfunc (x *Film) GetStarshipIds() []int64 {\n\tif x != nil {\n\t\treturn x.StarshipIds\n\t}\n\treturn nil\n}\n\nfunc (x *Film) GetVehicleIds() []int64 {\n\tif x != nil {\n\t\treturn x.VehicleIds\n\t}\n\treturn nil\n}\n\nfunc (x *Film) GetCharacterIds() []int64 {\n\tif x != nil {\n\t\treturn x.CharacterIds\n\t}\n\treturn nil\n}\n\nfunc (x *Film) GetPlanetIds() []int64 {\n\tif x != nil {\n\t\treturn x.PlanetIds\n\t}\n\treturn nil\n}\n\nvar File_film_film_proto protoreflect.FileDescriptor\n\nvar file_film_film_proto_rawDesc = []byte{\n\t0x0a, 0x0f, 0x66, 0x69, 0x6c, 0x6d, 0x2f, 0x66, 0x69, 0x6c, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x0a, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x66, 0x69, 0x6c, 0x6d, 0x1a, 0x16, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x64, 0x61, 0x74, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x20, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x6d,\n\t0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x22, 0x34, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x46, 0x69,\n\t0x6c, 0x6d, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x24, 0x0a, 0x04, 0x66, 0x69, 0x6c, 0x6d, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x66, 0x69,\n\t0x6c, 0x6d, 0x2e, 0x46, 0x69, 0x6c, 0x6d, 0x52, 0x04, 0x66, 0x69, 0x6c, 0x6d, 0x22, 0x24, 0x0a,\n\t0x10, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,\n\t0x74, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x03, 0x52, 0x03,\n\t0x69, 0x64, 0x73, 0x22, 0x38, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x6d, 0x73,\n\t0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x05, 0x66, 0x69, 0x6c, 0x6d, 0x73, 0x18, 0x01,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x66, 0x69, 0x6c,\n\t0x6d, 0x2e, 0x46, 0x69, 0x6c, 0x6d, 0x52, 0x05, 0x66, 0x69, 0x6c, 0x6d, 0x73, 0x22, 0xcb, 0x03,\n\t0x0a, 0x04, 0x46, 0x69, 0x6c, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x0a,\n\t0x65, 0x70, 0x69, 0x73, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05,\n\t0x52, 0x09, 0x65, 0x70, 0x69, 0x73, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x6f,\n\t0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x72, 0x61, 0x77, 0x6c, 0x18, 0x04, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x0c, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x43, 0x72, 0x61, 0x77, 0x6c,\n\t0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x1a, 0x0a, 0x08,\n\t0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,\n\t0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x0c, 0x72, 0x65, 0x6c, 0x65,\n\t0x61, 0x73, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x61, 0x74,\n\t0x65, 0x52, 0x0b, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x10,\n\t0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c,\n\t0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x64,\n\t0x69, 0x74, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x64, 0x69, 0x74,\n\t0x65, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x5f, 0x69, 0x64,\n\t0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x03, 0x52, 0x0a, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73,\n\t0x49, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x5f,\n\t0x69, 0x64, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x03, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x73,\n\t0x68, 0x69, 0x70, 0x49, 0x64, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c,\n\t0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x03, 0x52, 0x0a, 0x76, 0x65, 0x68,\n\t0x69, 0x63, 0x6c, 0x65, 0x49, 0x64, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x68, 0x61, 0x72, 0x61,\n\t0x63, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x03, 0x52, 0x0c,\n\t0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a,\n\t0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x03,\n\t0x52, 0x09, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x49, 0x64, 0x73, 0x32, 0x99, 0x01, 0x0a, 0x0b,\n\t0x46, 0x69, 0x6c, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x07, 0x47,\n\t0x65, 0x74, 0x46, 0x69, 0x6c, 0x6d, 0x12, 0x1a, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x66,\n\t0x69, 0x6c, 0x6d, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65,\n\t0x73, 0x74, 0x1a, 0x18, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x66, 0x69, 0x6c, 0x6d, 0x2e,\n\t0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x6d, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x47,\n\t0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x6d, 0x73, 0x12, 0x1c, 0x2e, 0x73, 0x77,\n\t0x61, 0x70, 0x69, 0x2e, 0x66, 0x69, 0x6c, 0x6d, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c,\n\t0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x73, 0x77, 0x61, 0x70,\n\t0x69, 0x2e, 0x66, 0x69, 0x6c, 0x6d, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x6d, 0x73,\n\t0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x9f, 0x01, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e,\n\t0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x66, 0x69, 0x6c, 0x6d, 0x42, 0x09, 0x46, 0x69, 0x6c, 0x6d,\n\t0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x39, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e,\n\t0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x65, 0x72, 0x63, 0x61, 0x72, 0x69, 0x2f, 0x67, 0x72, 0x70, 0x63,\n\t0x2d, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x64, 0x65, 0x6d, 0x6f,\n\t0x2f, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x6c, 0x6d, 0x3b, 0x66, 0x69, 0x6c, 0x6d,\n\t0x70, 0x62, 0xa2, 0x02, 0x03, 0x53, 0x46, 0x58, 0xaa, 0x02, 0x0a, 0x53, 0x77, 0x61, 0x70, 0x69,\n\t0x2e, 0x46, 0x69, 0x6c, 0x6d, 0xca, 0x02, 0x0a, 0x53, 0x77, 0x61, 0x70, 0x69, 0x5c, 0x46, 0x69,\n\t0x6c, 0x6d, 0xe2, 0x02, 0x16, 0x53, 0x77, 0x61, 0x70, 0x69, 0x5c, 0x46, 0x69, 0x6c, 0x6d, 0x5c,\n\t0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0b, 0x53, 0x77,\n\t0x61, 0x70, 0x69, 0x3a, 0x3a, 0x46, 0x69, 0x6c, 0x6d, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x33,\n}\n\nvar (\n\tfile_film_film_proto_rawDescOnce sync.Once\n\tfile_film_film_proto_rawDescData = file_film_film_proto_rawDesc\n)\n\nfunc file_film_film_proto_rawDescGZIP() []byte {\n\tfile_film_film_proto_rawDescOnce.Do(func() {\n\t\tfile_film_film_proto_rawDescData = protoimpl.X.CompressGZIP(file_film_film_proto_rawDescData)\n\t})\n\treturn file_film_film_proto_rawDescData\n}\n\nvar file_film_film_proto_msgTypes = make([]protoimpl.MessageInfo, 5)\nvar file_film_film_proto_goTypes = []interface{}{\n\t(*GetFilmRequest)(nil),   // 0: swapi.film.GetFilmRequest\n\t(*GetFilmReply)(nil),     // 1: swapi.film.GetFilmReply\n\t(*ListFilmsRequest)(nil), // 2: swapi.film.ListFilmsRequest\n\t(*ListFilmsReply)(nil),   // 3: swapi.film.ListFilmsReply\n\t(*Film)(nil),             // 4: swapi.film.Film\n\t(*date.Date)(nil),        // 5: google.type.Date\n}\nvar file_film_film_proto_depIdxs = []int32{\n\t4, // 0: swapi.film.GetFilmReply.film:type_name -> swapi.film.Film\n\t4, // 1: swapi.film.ListFilmsReply.films:type_name -> swapi.film.Film\n\t5, // 2: swapi.film.Film.release_date:type_name -> google.type.Date\n\t0, // 3: swapi.film.FilmService.GetFilm:input_type -> swapi.film.GetFilmRequest\n\t2, // 4: swapi.film.FilmService.ListFilms:input_type -> swapi.film.ListFilmsRequest\n\t1, // 5: swapi.film.FilmService.GetFilm:output_type -> swapi.film.GetFilmReply\n\t3, // 6: swapi.film.FilmService.ListFilms:output_type -> swapi.film.ListFilmsReply\n\t5, // [5:7] is the sub-list for method output_type\n\t3, // [3:5] is the sub-list for method input_type\n\t3, // [3:3] is the sub-list for extension type_name\n\t3, // [3:3] is the sub-list for extension extendee\n\t0, // [0:3] is the sub-list for field type_name\n}\n\nfunc init() { file_film_film_proto_init() }\nfunc file_film_film_proto_init() {\n\tif File_film_film_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_film_film_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetFilmRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_film_film_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetFilmReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_film_film_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListFilmsRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_film_film_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListFilmsReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_film_film_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Film); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_film_film_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   5,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_film_film_proto_goTypes,\n\t\tDependencyIndexes: file_film_film_proto_depIdxs,\n\t\tMessageInfos:      file_film_film_proto_msgTypes,\n\t}.Build()\n\tFile_film_film_proto = out.File\n\tfile_film_film_proto_rawDesc = nil\n\tfile_film_film_proto_goTypes = nil\n\tfile_film_film_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "demo/swapi/film/film_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.4.0\n// - protoc             (unknown)\n// source: film/film.proto\n\npackage filmpb\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.62.0 or later.\nconst _ = grpc.SupportPackageIsVersion8\n\nconst (\n\tFilmService_GetFilm_FullMethodName   = \"/swapi.film.FilmService/GetFilm\"\n\tFilmService_ListFilms_FullMethodName = \"/swapi.film.FilmService/ListFilms\"\n)\n\n// FilmServiceClient is the client API for FilmService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype FilmServiceClient interface {\n\tGetFilm(ctx context.Context, in *GetFilmRequest, opts ...grpc.CallOption) (*GetFilmReply, error)\n\tListFilms(ctx context.Context, in *ListFilmsRequest, opts ...grpc.CallOption) (*ListFilmsReply, error)\n}\n\ntype filmServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewFilmServiceClient(cc grpc.ClientConnInterface) FilmServiceClient {\n\treturn &filmServiceClient{cc}\n}\n\nfunc (c *filmServiceClient) GetFilm(ctx context.Context, in *GetFilmRequest, opts ...grpc.CallOption) (*GetFilmReply, error) {\n\tcOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)\n\tout := new(GetFilmReply)\n\terr := c.cc.Invoke(ctx, FilmService_GetFilm_FullMethodName, in, out, cOpts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *filmServiceClient) ListFilms(ctx context.Context, in *ListFilmsRequest, opts ...grpc.CallOption) (*ListFilmsReply, error) {\n\tcOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)\n\tout := new(ListFilmsReply)\n\terr := c.cc.Invoke(ctx, FilmService_ListFilms_FullMethodName, in, out, cOpts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// FilmServiceServer is the server API for FilmService service.\n// All implementations must embed UnimplementedFilmServiceServer\n// for forward compatibility\ntype FilmServiceServer interface {\n\tGetFilm(context.Context, *GetFilmRequest) (*GetFilmReply, error)\n\tListFilms(context.Context, *ListFilmsRequest) (*ListFilmsReply, error)\n\tmustEmbedUnimplementedFilmServiceServer()\n}\n\n// UnimplementedFilmServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedFilmServiceServer struct {\n}\n\nfunc (UnimplementedFilmServiceServer) GetFilm(context.Context, *GetFilmRequest) (*GetFilmReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetFilm not implemented\")\n}\nfunc (UnimplementedFilmServiceServer) ListFilms(context.Context, *ListFilmsRequest) (*ListFilmsReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method ListFilms not implemented\")\n}\nfunc (UnimplementedFilmServiceServer) mustEmbedUnimplementedFilmServiceServer() {}\n\n// UnsafeFilmServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to FilmServiceServer will\n// result in compilation errors.\ntype UnsafeFilmServiceServer interface {\n\tmustEmbedUnimplementedFilmServiceServer()\n}\n\nfunc RegisterFilmServiceServer(s grpc.ServiceRegistrar, srv FilmServiceServer) {\n\ts.RegisterService(&FilmService_ServiceDesc, srv)\n}\n\nfunc _FilmService_GetFilm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetFilmRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(FilmServiceServer).GetFilm(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: FilmService_GetFilm_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(FilmServiceServer).GetFilm(ctx, req.(*GetFilmRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _FilmService_ListFilms_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(ListFilmsRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(FilmServiceServer).ListFilms(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: FilmService_ListFilms_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(FilmServiceServer).ListFilms(ctx, req.(*ListFilmsRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// FilmService_ServiceDesc is the grpc.ServiceDesc for FilmService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar FilmService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"swapi.film.FilmService\",\n\tHandlerType: (*FilmServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetFilm\",\n\t\t\tHandler:    _FilmService_GetFilm_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"ListFilms\",\n\t\t\tHandler:    _FilmService_ListFilms_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"film/film.proto\",\n}\n"
  },
  {
    "path": "demo/swapi/person/person.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.34.1\n// \tprotoc        (unknown)\n// source: person/person.proto\n\npackage personpb\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// GetPersonRequest.\ntype GetPersonRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The persion id.\n\tId int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetPersonRequest) Reset() {\n\t*x = GetPersonRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_person_person_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPersonRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPersonRequest) ProtoMessage() {}\n\nfunc (x *GetPersonRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_person_person_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPersonRequest.ProtoReflect.Descriptor instead.\nfunc (*GetPersonRequest) Descriptor() ([]byte, []int) {\n\treturn file_person_person_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetPersonRequest) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\n// GetPersonReply.\ntype GetPersonReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPerson *Person `protobuf:\"bytes,1,opt,name=person,proto3\" json:\"person,omitempty\"`\n}\n\nfunc (x *GetPersonReply) Reset() {\n\t*x = GetPersonReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_person_person_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPersonReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPersonReply) ProtoMessage() {}\n\nfunc (x *GetPersonReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_person_person_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPersonReply.ProtoReflect.Descriptor instead.\nfunc (*GetPersonReply) Descriptor() ([]byte, []int) {\n\treturn file_person_person_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetPersonReply) GetPerson() *Person {\n\tif x != nil {\n\t\treturn x.Person\n\t}\n\treturn nil\n}\n\n// ListPeopleRequest.\ntype ListPeopleRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tIds []int64 `protobuf:\"varint,1,rep,packed,name=ids,proto3\" json:\"ids,omitempty\"`\n}\n\nfunc (x *ListPeopleRequest) Reset() {\n\t*x = ListPeopleRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_person_person_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListPeopleRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListPeopleRequest) ProtoMessage() {}\n\nfunc (x *ListPeopleRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_person_person_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListPeopleRequest.ProtoReflect.Descriptor instead.\nfunc (*ListPeopleRequest) Descriptor() ([]byte, []int) {\n\treturn file_person_person_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *ListPeopleRequest) GetIds() []int64 {\n\tif x != nil {\n\t\treturn x.Ids\n\t}\n\treturn nil\n}\n\n// ListPeopleReply.\ntype ListPeopleReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPeople []*Person `protobuf:\"bytes,1,rep,name=people,proto3\" json:\"people,omitempty\"`\n}\n\nfunc (x *ListPeopleReply) Reset() {\n\t*x = ListPeopleReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_person_person_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListPeopleReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListPeopleReply) ProtoMessage() {}\n\nfunc (x *ListPeopleReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_person_person_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListPeopleReply.ProtoReflect.Descriptor instead.\nfunc (*ListPeopleReply) Descriptor() ([]byte, []int) {\n\treturn file_person_person_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *ListPeopleReply) GetPeople() []*Person {\n\tif x != nil {\n\t\treturn x.People\n\t}\n\treturn nil\n}\n\n// Person is an individual person or character within the Star Wars universe.\ntype Person struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// person id.\n\tId int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\t// The name of this person.\n\tName string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// The birth year of the person,\n\t// using the in-universe standard of BBY or ABY\n\t// - Before the Battle of Yavin or After the Battle of Yavin.\n\t// The Battle of Yavin is a battle that occurs at the end of Star Wars episode IV: A New Hope.\n\tBirthYear string `protobuf:\"bytes,3,opt,name=birth_year,json=birthYear,proto3\" json:\"birth_year,omitempty\"`\n\t// The eye color of this person.\n\t// Will be \"unknown\" if not known or \"n/a\" if the person does not have an eye.\n\tEyeColor string `protobuf:\"bytes,4,opt,name=eye_color,json=eyeColor,proto3\" json:\"eye_color,omitempty\"`\n\t// The gender of this person.\n\t// Either \"Male\", \"Female\" or \"unknown\", \"n/a\" if the person does not have a gender.\n\tGender string `protobuf:\"bytes,5,opt,name=gender,proto3\" json:\"gender,omitempty\"`\n\t// The hair color of this person.\n\t// Will be \"unknown\" if not known or \"n/a\" if the person does not have hair.\n\tHairColor string `protobuf:\"bytes,6,opt,name=hair_color,json=hairColor,proto3\" json:\"hair_color,omitempty\"`\n\t// The height of the person in centimeters.\n\tHeight string `protobuf:\"bytes,7,opt,name=height,proto3\" json:\"height,omitempty\"`\n\t// The mass of the person in kilograms.\n\tMass string `protobuf:\"bytes,8,opt,name=mass,proto3\" json:\"mass,omitempty\"`\n\t// The skin color of this person.\n\tSkinColor string `protobuf:\"bytes,9,opt,name=skin_color,json=skinColor,proto3\" json:\"skin_color,omitempty\"`\n\t// The URL of a planet resource, a planet that this person was born on or inhabits.\n\tHomeworld string `protobuf:\"bytes,10,opt,name=homeworld,proto3\" json:\"homeworld,omitempty\"`\n\t// the hypermedia URL of this resource.\n\tUrl string `protobuf:\"bytes,11,opt,name=url,proto3\" json:\"url,omitempty\"`\n\t// the ISO 8601 date format of the time that this resource was created.\n\tCreated string `protobuf:\"bytes,12,opt,name=created,proto3\" json:\"created,omitempty\"`\n\t// the ISO 8601 date format of the time that this resource was edited.\n\tEdited string `protobuf:\"bytes,13,opt,name=edited,proto3\" json:\"edited,omitempty\"`\n\t// film ids.\n\tFilmIds []int64 `protobuf:\"varint,14,rep,packed,name=film_ids,json=filmIds,proto3\" json:\"film_ids,omitempty\"`\n\t// species ids.\n\tSpeciesIds []int64 `protobuf:\"varint,15,rep,packed,name=species_ids,json=speciesIds,proto3\" json:\"species_ids,omitempty\"`\n\t// starship ids.\n\tStarshipIds []int64 `protobuf:\"varint,16,rep,packed,name=starship_ids,json=starshipIds,proto3\" json:\"starship_ids,omitempty\"`\n\t// vehicle ids.\n\tVehicleIds []int64 `protobuf:\"varint,17,rep,packed,name=vehicle_ids,json=vehicleIds,proto3\" json:\"vehicle_ids,omitempty\"`\n}\n\nfunc (x *Person) Reset() {\n\t*x = Person{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_person_person_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Person) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Person) ProtoMessage() {}\n\nfunc (x *Person) ProtoReflect() protoreflect.Message {\n\tmi := &file_person_person_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Person.ProtoReflect.Descriptor instead.\nfunc (*Person) Descriptor() ([]byte, []int) {\n\treturn file_person_person_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *Person) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *Person) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Person) GetBirthYear() string {\n\tif x != nil {\n\t\treturn x.BirthYear\n\t}\n\treturn \"\"\n}\n\nfunc (x *Person) GetEyeColor() string {\n\tif x != nil {\n\t\treturn x.EyeColor\n\t}\n\treturn \"\"\n}\n\nfunc (x *Person) GetGender() string {\n\tif x != nil {\n\t\treturn x.Gender\n\t}\n\treturn \"\"\n}\n\nfunc (x *Person) GetHairColor() string {\n\tif x != nil {\n\t\treturn x.HairColor\n\t}\n\treturn \"\"\n}\n\nfunc (x *Person) GetHeight() string {\n\tif x != nil {\n\t\treturn x.Height\n\t}\n\treturn \"\"\n}\n\nfunc (x *Person) GetMass() string {\n\tif x != nil {\n\t\treturn x.Mass\n\t}\n\treturn \"\"\n}\n\nfunc (x *Person) GetSkinColor() string {\n\tif x != nil {\n\t\treturn x.SkinColor\n\t}\n\treturn \"\"\n}\n\nfunc (x *Person) GetHomeworld() string {\n\tif x != nil {\n\t\treturn x.Homeworld\n\t}\n\treturn \"\"\n}\n\nfunc (x *Person) GetUrl() string {\n\tif x != nil {\n\t\treturn x.Url\n\t}\n\treturn \"\"\n}\n\nfunc (x *Person) GetCreated() string {\n\tif x != nil {\n\t\treturn x.Created\n\t}\n\treturn \"\"\n}\n\nfunc (x *Person) GetEdited() string {\n\tif x != nil {\n\t\treturn x.Edited\n\t}\n\treturn \"\"\n}\n\nfunc (x *Person) GetFilmIds() []int64 {\n\tif x != nil {\n\t\treturn x.FilmIds\n\t}\n\treturn nil\n}\n\nfunc (x *Person) GetSpeciesIds() []int64 {\n\tif x != nil {\n\t\treturn x.SpeciesIds\n\t}\n\treturn nil\n}\n\nfunc (x *Person) GetStarshipIds() []int64 {\n\tif x != nil {\n\t\treturn x.StarshipIds\n\t}\n\treturn nil\n}\n\nfunc (x *Person) GetVehicleIds() []int64 {\n\tif x != nil {\n\t\treturn x.VehicleIds\n\t}\n\treturn nil\n}\n\nvar File_person_person_proto protoreflect.FileDescriptor\n\nvar file_person_person_proto_rawDesc = []byte{\n\t0x0a, 0x13, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x2f, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x65, 0x72,\n\t0x73, 0x6f, 0x6e, 0x22, 0x22, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e,\n\t0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x22, 0x3e, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x65,\n\t0x72, 0x73, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2c, 0x0a, 0x06, 0x70, 0x65, 0x72,\n\t0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x73, 0x77, 0x61, 0x70,\n\t0x69, 0x2e, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x2e, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x52,\n\t0x06, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x22, 0x25, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x50,\n\t0x65, 0x6f, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03,\n\t0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x03, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, 0x3f,\n\t0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c,\n\t0x79, 0x12, 0x2c, 0x0a, 0x06, 0x70, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28,\n\t0x0b, 0x32, 0x14, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e,\n\t0x2e, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x52, 0x06, 0x70, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x22,\n\t0xcc, 0x03, 0x0a, 0x06, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d,\n\t0x0a, 0x0a, 0x62, 0x69, 0x72, 0x74, 0x68, 0x5f, 0x79, 0x65, 0x61, 0x72, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x09, 0x62, 0x69, 0x72, 0x74, 0x68, 0x59, 0x65, 0x61, 0x72, 0x12, 0x1b, 0x0a,\n\t0x09, 0x65, 0x79, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x08, 0x65, 0x79, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x67, 0x65,\n\t0x6e, 0x64, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x67, 0x65, 0x6e, 0x64,\n\t0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x68, 0x61, 0x69, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72,\n\t0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x68, 0x61, 0x69, 0x72, 0x43, 0x6f, 0x6c, 0x6f,\n\t0x72, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x61, 0x73,\n\t0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x61, 0x73, 0x73, 0x12, 0x1d, 0x0a,\n\t0x0a, 0x73, 0x6b, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x09, 0x73, 0x6b, 0x69, 0x6e, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x12, 0x1c, 0x0a, 0x09,\n\t0x68, 0x6f, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x09, 0x68, 0x6f, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72,\n\t0x6c, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x18, 0x0a, 0x07,\n\t0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63,\n\t0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64,\n\t0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x12, 0x19,\n\t0x0a, 0x08, 0x66, 0x69, 0x6c, 0x6d, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x03,\n\t0x52, 0x07, 0x66, 0x69, 0x6c, 0x6d, 0x49, 0x64, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x70, 0x65,\n\t0x63, 0x69, 0x65, 0x73, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x03, 0x52, 0x0a,\n\t0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x49, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74,\n\t0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x03,\n\t0x52, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x49, 0x64, 0x73, 0x12, 0x1f, 0x0a,\n\t0x0b, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x11, 0x20, 0x03,\n\t0x28, 0x03, 0x52, 0x0a, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x49, 0x64, 0x73, 0x32, 0xac,\n\t0x01, 0x0a, 0x0d, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n\t0x12, 0x4b, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x12, 0x1e, 0x2e,\n\t0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74,\n\t0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e,\n\t0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74,\n\t0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a,\n\t0x0a, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x12, 0x1f, 0x2e, 0x73, 0x77,\n\t0x61, 0x70, 0x69, 0x2e, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50,\n\t0x65, 0x6f, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x73,\n\t0x77, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x2e, 0x4c, 0x69, 0x73, 0x74,\n\t0x50, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0xaf, 0x01,\n\t0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x65, 0x72, 0x73,\n\t0x6f, 0x6e, 0x42, 0x0b, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50,\n\t0x01, 0x5a, 0x3d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x65,\n\t0x72, 0x63, 0x61, 0x72, 0x69, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x73, 0x77, 0x61, 0x70, 0x69,\n\t0x2f, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x3b, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x70, 0x62,\n\t0xa2, 0x02, 0x03, 0x53, 0x50, 0x58, 0xaa, 0x02, 0x0c, 0x53, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x50,\n\t0x65, 0x72, 0x73, 0x6f, 0x6e, 0xca, 0x02, 0x0c, 0x53, 0x77, 0x61, 0x70, 0x69, 0x5c, 0x50, 0x65,\n\t0x72, 0x73, 0x6f, 0x6e, 0xe2, 0x02, 0x18, 0x53, 0x77, 0x61, 0x70, 0x69, 0x5c, 0x50, 0x65, 0x72,\n\t0x73, 0x6f, 0x6e, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea,\n\t0x02, 0x0d, 0x53, 0x77, 0x61, 0x70, 0x69, 0x3a, 0x3a, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x62,\n\t0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_person_person_proto_rawDescOnce sync.Once\n\tfile_person_person_proto_rawDescData = file_person_person_proto_rawDesc\n)\n\nfunc file_person_person_proto_rawDescGZIP() []byte {\n\tfile_person_person_proto_rawDescOnce.Do(func() {\n\t\tfile_person_person_proto_rawDescData = protoimpl.X.CompressGZIP(file_person_person_proto_rawDescData)\n\t})\n\treturn file_person_person_proto_rawDescData\n}\n\nvar file_person_person_proto_msgTypes = make([]protoimpl.MessageInfo, 5)\nvar file_person_person_proto_goTypes = []interface{}{\n\t(*GetPersonRequest)(nil),  // 0: swapi.person.GetPersonRequest\n\t(*GetPersonReply)(nil),    // 1: swapi.person.GetPersonReply\n\t(*ListPeopleRequest)(nil), // 2: swapi.person.ListPeopleRequest\n\t(*ListPeopleReply)(nil),   // 3: swapi.person.ListPeopleReply\n\t(*Person)(nil),            // 4: swapi.person.Person\n}\nvar file_person_person_proto_depIdxs = []int32{\n\t4, // 0: swapi.person.GetPersonReply.person:type_name -> swapi.person.Person\n\t4, // 1: swapi.person.ListPeopleReply.people:type_name -> swapi.person.Person\n\t0, // 2: swapi.person.PersonService.GetPerson:input_type -> swapi.person.GetPersonRequest\n\t2, // 3: swapi.person.PersonService.ListPeople:input_type -> swapi.person.ListPeopleRequest\n\t1, // 4: swapi.person.PersonService.GetPerson:output_type -> swapi.person.GetPersonReply\n\t3, // 5: swapi.person.PersonService.ListPeople:output_type -> swapi.person.ListPeopleReply\n\t4, // [4:6] is the sub-list for method output_type\n\t2, // [2:4] is the sub-list for method input_type\n\t2, // [2:2] is the sub-list for extension type_name\n\t2, // [2:2] is the sub-list for extension extendee\n\t0, // [0:2] is the sub-list for field type_name\n}\n\nfunc init() { file_person_person_proto_init() }\nfunc file_person_person_proto_init() {\n\tif File_person_person_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_person_person_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPersonRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_person_person_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPersonReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_person_person_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListPeopleRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_person_person_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListPeopleReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_person_person_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Person); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_person_person_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   5,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_person_person_proto_goTypes,\n\t\tDependencyIndexes: file_person_person_proto_depIdxs,\n\t\tMessageInfos:      file_person_person_proto_msgTypes,\n\t}.Build()\n\tFile_person_person_proto = out.File\n\tfile_person_person_proto_rawDesc = nil\n\tfile_person_person_proto_goTypes = nil\n\tfile_person_person_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "demo/swapi/person/person_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.4.0\n// - protoc             (unknown)\n// source: person/person.proto\n\npackage personpb\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.62.0 or later.\nconst _ = grpc.SupportPackageIsVersion8\n\nconst (\n\tPersonService_GetPerson_FullMethodName  = \"/swapi.person.PersonService/GetPerson\"\n\tPersonService_ListPeople_FullMethodName = \"/swapi.person.PersonService/ListPeople\"\n)\n\n// PersonServiceClient is the client API for PersonService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype PersonServiceClient interface {\n\tGetPerson(ctx context.Context, in *GetPersonRequest, opts ...grpc.CallOption) (*GetPersonReply, error)\n\tListPeople(ctx context.Context, in *ListPeopleRequest, opts ...grpc.CallOption) (*ListPeopleReply, error)\n}\n\ntype personServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewPersonServiceClient(cc grpc.ClientConnInterface) PersonServiceClient {\n\treturn &personServiceClient{cc}\n}\n\nfunc (c *personServiceClient) GetPerson(ctx context.Context, in *GetPersonRequest, opts ...grpc.CallOption) (*GetPersonReply, error) {\n\tcOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)\n\tout := new(GetPersonReply)\n\terr := c.cc.Invoke(ctx, PersonService_GetPerson_FullMethodName, in, out, cOpts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *personServiceClient) ListPeople(ctx context.Context, in *ListPeopleRequest, opts ...grpc.CallOption) (*ListPeopleReply, error) {\n\tcOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)\n\tout := new(ListPeopleReply)\n\terr := c.cc.Invoke(ctx, PersonService_ListPeople_FullMethodName, in, out, cOpts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// PersonServiceServer is the server API for PersonService service.\n// All implementations must embed UnimplementedPersonServiceServer\n// for forward compatibility\ntype PersonServiceServer interface {\n\tGetPerson(context.Context, *GetPersonRequest) (*GetPersonReply, error)\n\tListPeople(context.Context, *ListPeopleRequest) (*ListPeopleReply, error)\n\tmustEmbedUnimplementedPersonServiceServer()\n}\n\n// UnimplementedPersonServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedPersonServiceServer struct {\n}\n\nfunc (UnimplementedPersonServiceServer) GetPerson(context.Context, *GetPersonRequest) (*GetPersonReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetPerson not implemented\")\n}\nfunc (UnimplementedPersonServiceServer) ListPeople(context.Context, *ListPeopleRequest) (*ListPeopleReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method ListPeople not implemented\")\n}\nfunc (UnimplementedPersonServiceServer) mustEmbedUnimplementedPersonServiceServer() {}\n\n// UnsafePersonServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to PersonServiceServer will\n// result in compilation errors.\ntype UnsafePersonServiceServer interface {\n\tmustEmbedUnimplementedPersonServiceServer()\n}\n\nfunc RegisterPersonServiceServer(s grpc.ServiceRegistrar, srv PersonServiceServer) {\n\ts.RegisterService(&PersonService_ServiceDesc, srv)\n}\n\nfunc _PersonService_GetPerson_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetPersonRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(PersonServiceServer).GetPerson(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: PersonService_GetPerson_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(PersonServiceServer).GetPerson(ctx, req.(*GetPersonRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _PersonService_ListPeople_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(ListPeopleRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(PersonServiceServer).ListPeople(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: PersonService_ListPeople_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(PersonServiceServer).ListPeople(ctx, req.(*ListPeopleRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// PersonService_ServiceDesc is the grpc.ServiceDesc for PersonService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar PersonService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"swapi.person.PersonService\",\n\tHandlerType: (*PersonServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetPerson\",\n\t\t\tHandler:    _PersonService_GetPerson_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"ListPeople\",\n\t\t\tHandler:    _PersonService_ListPeople_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"person/person.proto\",\n}\n"
  },
  {
    "path": "demo/swapi/planet/planet.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.34.1\n// \tprotoc        (unknown)\n// source: planet/planet.proto\n\npackage planetpb\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// GetPlanetRequest.\ntype GetPlanetRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// planet id.\n\tId int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetPlanetRequest) Reset() {\n\t*x = GetPlanetRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_planet_planet_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPlanetRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPlanetRequest) ProtoMessage() {}\n\nfunc (x *GetPlanetRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_planet_planet_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPlanetRequest.ProtoReflect.Descriptor instead.\nfunc (*GetPlanetRequest) Descriptor() ([]byte, []int) {\n\treturn file_planet_planet_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetPlanetRequest) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\n// GetPlanetReply.\ntype GetPlanetReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPlanet *Planet `protobuf:\"bytes,1,opt,name=planet,proto3\" json:\"planet,omitempty\"`\n}\n\nfunc (x *GetPlanetReply) Reset() {\n\t*x = GetPlanetReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_planet_planet_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPlanetReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPlanetReply) ProtoMessage() {}\n\nfunc (x *GetPlanetReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_planet_planet_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPlanetReply.ProtoReflect.Descriptor instead.\nfunc (*GetPlanetReply) Descriptor() ([]byte, []int) {\n\treturn file_planet_planet_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetPlanetReply) GetPlanet() *Planet {\n\tif x != nil {\n\t\treturn x.Planet\n\t}\n\treturn nil\n}\n\n// ListPlanetsRequest.\ntype ListPlanetsRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tIds []int64 `protobuf:\"varint,1,rep,packed,name=ids,proto3\" json:\"ids,omitempty\"`\n}\n\nfunc (x *ListPlanetsRequest) Reset() {\n\t*x = ListPlanetsRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_planet_planet_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListPlanetsRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListPlanetsRequest) ProtoMessage() {}\n\nfunc (x *ListPlanetsRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_planet_planet_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListPlanetsRequest.ProtoReflect.Descriptor instead.\nfunc (*ListPlanetsRequest) Descriptor() ([]byte, []int) {\n\treturn file_planet_planet_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *ListPlanetsRequest) GetIds() []int64 {\n\tif x != nil {\n\t\treturn x.Ids\n\t}\n\treturn nil\n}\n\n// ListPlanetsReply.\ntype ListPlanetsReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPlanets []*Planet `protobuf:\"bytes,1,rep,name=planets,proto3\" json:\"planets,omitempty\"`\n}\n\nfunc (x *ListPlanetsReply) Reset() {\n\t*x = ListPlanetsReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_planet_planet_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListPlanetsReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListPlanetsReply) ProtoMessage() {}\n\nfunc (x *ListPlanetsReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_planet_planet_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListPlanetsReply.ProtoReflect.Descriptor instead.\nfunc (*ListPlanetsReply) Descriptor() ([]byte, []int) {\n\treturn file_planet_planet_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *ListPlanetsReply) GetPlanets() []*Planet {\n\tif x != nil {\n\t\treturn x.Planets\n\t}\n\treturn nil\n}\n\n// Planet is a large mass, planet or planetoid in the Star Wars Universe, at the time of 0 ABY.\ntype Planet struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// planet id.\n\tId int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\t// The name of this planet.\n\tName string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// The diameter of this planet in kilometers.\n\tDiameter string `protobuf:\"bytes,3,opt,name=diameter,proto3\" json:\"diameter,omitempty\"`\n\t// The number of standard hours it takes for this planet to complete a single rotation on its axis.\n\tRotationPeriod string `protobuf:\"bytes,4,opt,name=rotation_period,json=rotationPeriod,proto3\" json:\"rotation_period,omitempty\"`\n\t// The number of standard days it takes for this planet to complete a single orbit of its local star.\n\tOrbitalPeriod string `protobuf:\"bytes,5,opt,name=orbital_period,json=orbitalPeriod,proto3\" json:\"orbital_period,omitempty\"`\n\t// A number denoting the gravity of this planet, where \"1\" is normal or 1 standard G.\n\t// \"2\" is twice or 2 standard Gs. \"0.5\" is half or 0.5 standard Gs.\n\tGravity string `protobuf:\"bytes,6,opt,name=gravity,proto3\" json:\"gravity,omitempty\"`\n\t// The average population of sentient beings inhabiting this planet.\n\tPopulation string `protobuf:\"bytes,7,opt,name=population,proto3\" json:\"population,omitempty\"`\n\t// The climate of this planet. Comma separated if diverse.\n\tClimate string `protobuf:\"bytes,8,opt,name=climate,proto3\" json:\"climate,omitempty\"`\n\t// The terrain of this planet. Comma separated if diverse.\n\tTerrain string `protobuf:\"bytes,9,opt,name=terrain,proto3\" json:\"terrain,omitempty\"`\n\t// The percentage of the planet surface that is naturally occurring water or bodies of water.\n\tSurfaceWater string `protobuf:\"bytes,10,opt,name=surface_water,json=surfaceWater,proto3\" json:\"surface_water,omitempty\"`\n\t// the hypermedia URL of this resource.\n\tUrl string `protobuf:\"bytes,11,opt,name=url,proto3\" json:\"url,omitempty\"`\n\t// the ISO 8601 date format of the time that this resource was created.\n\tCreated string `protobuf:\"bytes,12,opt,name=created,proto3\" json:\"created,omitempty\"`\n\t// the ISO 8601 date format of the time that this resource was edited.\n\tEdited string `protobuf:\"bytes,13,opt,name=edited,proto3\" json:\"edited,omitempty\"`\n\t// the person that live on this planet ids.\n\tResidentIds []int64 `protobuf:\"varint,14,rep,packed,name=resident_ids,json=residentIds,proto3\" json:\"resident_ids,omitempty\"`\n\t// film ids.\n\tFilmIds []int64 `protobuf:\"varint,15,rep,packed,name=film_ids,json=filmIds,proto3\" json:\"film_ids,omitempty\"`\n}\n\nfunc (x *Planet) Reset() {\n\t*x = Planet{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_planet_planet_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Planet) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Planet) ProtoMessage() {}\n\nfunc (x *Planet) ProtoReflect() protoreflect.Message {\n\tmi := &file_planet_planet_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Planet.ProtoReflect.Descriptor instead.\nfunc (*Planet) Descriptor() ([]byte, []int) {\n\treturn file_planet_planet_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *Planet) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *Planet) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Planet) GetDiameter() string {\n\tif x != nil {\n\t\treturn x.Diameter\n\t}\n\treturn \"\"\n}\n\nfunc (x *Planet) GetRotationPeriod() string {\n\tif x != nil {\n\t\treturn x.RotationPeriod\n\t}\n\treturn \"\"\n}\n\nfunc (x *Planet) GetOrbitalPeriod() string {\n\tif x != nil {\n\t\treturn x.OrbitalPeriod\n\t}\n\treturn \"\"\n}\n\nfunc (x *Planet) GetGravity() string {\n\tif x != nil {\n\t\treturn x.Gravity\n\t}\n\treturn \"\"\n}\n\nfunc (x *Planet) GetPopulation() string {\n\tif x != nil {\n\t\treturn x.Population\n\t}\n\treturn \"\"\n}\n\nfunc (x *Planet) GetClimate() string {\n\tif x != nil {\n\t\treturn x.Climate\n\t}\n\treturn \"\"\n}\n\nfunc (x *Planet) GetTerrain() string {\n\tif x != nil {\n\t\treturn x.Terrain\n\t}\n\treturn \"\"\n}\n\nfunc (x *Planet) GetSurfaceWater() string {\n\tif x != nil {\n\t\treturn x.SurfaceWater\n\t}\n\treturn \"\"\n}\n\nfunc (x *Planet) GetUrl() string {\n\tif x != nil {\n\t\treturn x.Url\n\t}\n\treturn \"\"\n}\n\nfunc (x *Planet) GetCreated() string {\n\tif x != nil {\n\t\treturn x.Created\n\t}\n\treturn \"\"\n}\n\nfunc (x *Planet) GetEdited() string {\n\tif x != nil {\n\t\treturn x.Edited\n\t}\n\treturn \"\"\n}\n\nfunc (x *Planet) GetResidentIds() []int64 {\n\tif x != nil {\n\t\treturn x.ResidentIds\n\t}\n\treturn nil\n}\n\nfunc (x *Planet) GetFilmIds() []int64 {\n\tif x != nil {\n\t\treturn x.FilmIds\n\t}\n\treturn nil\n}\n\nvar File_planet_planet_proto protoreflect.FileDescriptor\n\nvar file_planet_planet_proto_rawDesc = []byte{\n\t0x0a, 0x13, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x6c, 0x61,\n\t0x6e, 0x65, 0x74, 0x22, 0x22, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x74,\n\t0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x22, 0x3e, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x6c,\n\t0x61, 0x6e, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2c, 0x0a, 0x06, 0x70, 0x6c, 0x61,\n\t0x6e, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x73, 0x77, 0x61, 0x70,\n\t0x69, 0x2e, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x52,\n\t0x06, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x22, 0x26, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x50,\n\t0x6c, 0x61, 0x6e, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a,\n\t0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x03, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22,\n\t0x42, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x73, 0x52, 0x65,\n\t0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x07, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x73, 0x18, 0x01,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x6c, 0x61,\n\t0x6e, 0x65, 0x74, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x52, 0x07, 0x70, 0x6c, 0x61, 0x6e,\n\t0x65, 0x74, 0x73, 0x22, 0xad, 0x03, 0x0a, 0x06, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x12, 0x0e,\n\t0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12,\n\t0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x18, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x27,\n\t0x0a, 0x0f, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f,\n\t0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x6f, 0x72, 0x62, 0x69, 0x74,\n\t0x61, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x0d, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x18,\n\t0x0a, 0x07, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x07, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x6f, 0x70, 0x75,\n\t0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6f,\n\t0x70, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6c, 0x69, 0x6d,\n\t0x61, 0x74, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6c, 0x69, 0x6d, 0x61,\n\t0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x65, 0x72, 0x72, 0x61, 0x69, 0x6e, 0x18, 0x09, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x65, 0x72, 0x72, 0x61, 0x69, 0x6e, 0x12, 0x23, 0x0a, 0x0d,\n\t0x73, 0x75, 0x72, 0x66, 0x61, 0x63, 0x65, 0x5f, 0x77, 0x61, 0x74, 0x65, 0x72, 0x18, 0x0a, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x75, 0x72, 0x66, 0x61, 0x63, 0x65, 0x57, 0x61, 0x74, 0x65,\n\t0x72, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03,\n\t0x75, 0x72, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0c,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x16, 0x0a,\n\t0x06, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65,\n\t0x64, 0x69, 0x74, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x69, 0x64, 0x65, 0x6e,\n\t0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x03, 0x52, 0x0b, 0x72, 0x65, 0x73,\n\t0x69, 0x64, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x6d,\n\t0x5f, 0x69, 0x64, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x03, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x6d,\n\t0x49, 0x64, 0x73, 0x32, 0xaf, 0x01, 0x0a, 0x0d, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x53, 0x65,\n\t0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4b, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x61, 0x6e,\n\t0x65, 0x74, 0x12, 0x1e, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x6c, 0x61, 0x6e, 0x65,\n\t0x74, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,\n\t0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x6c, 0x61, 0x6e, 0x65,\n\t0x74, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79,\n\t0x22, 0x00, 0x12, 0x51, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x74,\n\t0x73, 0x12, 0x20, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74,\n\t0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75,\n\t0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x6c, 0x61, 0x6e,\n\t0x65, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x73, 0x52, 0x65,\n\t0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0xaf, 0x01, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x2e, 0x73, 0x77,\n\t0x61, 0x70, 0x69, 0x2e, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x42, 0x0b, 0x50, 0x6c, 0x61, 0x6e,\n\t0x65, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3d, 0x67, 0x69, 0x74, 0x68, 0x75,\n\t0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x65, 0x72, 0x63, 0x61, 0x72, 0x69, 0x2f, 0x67, 0x72,\n\t0x70, 0x63, 0x2d, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x64, 0x65,\n\t0x6d, 0x6f, 0x2f, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x3b,\n\t0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x70, 0x62, 0xa2, 0x02, 0x03, 0x53, 0x50, 0x58, 0xaa, 0x02,\n\t0x0c, 0x53, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0xca, 0x02, 0x0c,\n\t0x53, 0x77, 0x61, 0x70, 0x69, 0x5c, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0xe2, 0x02, 0x18, 0x53,\n\t0x77, 0x61, 0x70, 0x69, 0x5c, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d,\n\t0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0d, 0x53, 0x77, 0x61, 0x70, 0x69, 0x3a,\n\t0x3a, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_planet_planet_proto_rawDescOnce sync.Once\n\tfile_planet_planet_proto_rawDescData = file_planet_planet_proto_rawDesc\n)\n\nfunc file_planet_planet_proto_rawDescGZIP() []byte {\n\tfile_planet_planet_proto_rawDescOnce.Do(func() {\n\t\tfile_planet_planet_proto_rawDescData = protoimpl.X.CompressGZIP(file_planet_planet_proto_rawDescData)\n\t})\n\treturn file_planet_planet_proto_rawDescData\n}\n\nvar file_planet_planet_proto_msgTypes = make([]protoimpl.MessageInfo, 5)\nvar file_planet_planet_proto_goTypes = []interface{}{\n\t(*GetPlanetRequest)(nil),   // 0: swapi.planet.GetPlanetRequest\n\t(*GetPlanetReply)(nil),     // 1: swapi.planet.GetPlanetReply\n\t(*ListPlanetsRequest)(nil), // 2: swapi.planet.ListPlanetsRequest\n\t(*ListPlanetsReply)(nil),   // 3: swapi.planet.ListPlanetsReply\n\t(*Planet)(nil),             // 4: swapi.planet.Planet\n}\nvar file_planet_planet_proto_depIdxs = []int32{\n\t4, // 0: swapi.planet.GetPlanetReply.planet:type_name -> swapi.planet.Planet\n\t4, // 1: swapi.planet.ListPlanetsReply.planets:type_name -> swapi.planet.Planet\n\t0, // 2: swapi.planet.PlanetService.GetPlanet:input_type -> swapi.planet.GetPlanetRequest\n\t2, // 3: swapi.planet.PlanetService.ListPlanets:input_type -> swapi.planet.ListPlanetsRequest\n\t1, // 4: swapi.planet.PlanetService.GetPlanet:output_type -> swapi.planet.GetPlanetReply\n\t3, // 5: swapi.planet.PlanetService.ListPlanets:output_type -> swapi.planet.ListPlanetsReply\n\t4, // [4:6] is the sub-list for method output_type\n\t2, // [2:4] is the sub-list for method input_type\n\t2, // [2:2] is the sub-list for extension type_name\n\t2, // [2:2] is the sub-list for extension extendee\n\t0, // [0:2] is the sub-list for field type_name\n}\n\nfunc init() { file_planet_planet_proto_init() }\nfunc file_planet_planet_proto_init() {\n\tif File_planet_planet_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_planet_planet_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPlanetRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_planet_planet_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPlanetReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_planet_planet_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListPlanetsRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_planet_planet_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListPlanetsReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_planet_planet_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Planet); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_planet_planet_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   5,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_planet_planet_proto_goTypes,\n\t\tDependencyIndexes: file_planet_planet_proto_depIdxs,\n\t\tMessageInfos:      file_planet_planet_proto_msgTypes,\n\t}.Build()\n\tFile_planet_planet_proto = out.File\n\tfile_planet_planet_proto_rawDesc = nil\n\tfile_planet_planet_proto_goTypes = nil\n\tfile_planet_planet_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "demo/swapi/planet/planet_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.4.0\n// - protoc             (unknown)\n// source: planet/planet.proto\n\npackage planetpb\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.62.0 or later.\nconst _ = grpc.SupportPackageIsVersion8\n\nconst (\n\tPlanetService_GetPlanet_FullMethodName   = \"/swapi.planet.PlanetService/GetPlanet\"\n\tPlanetService_ListPlanets_FullMethodName = \"/swapi.planet.PlanetService/ListPlanets\"\n)\n\n// PlanetServiceClient is the client API for PlanetService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype PlanetServiceClient interface {\n\tGetPlanet(ctx context.Context, in *GetPlanetRequest, opts ...grpc.CallOption) (*GetPlanetReply, error)\n\tListPlanets(ctx context.Context, in *ListPlanetsRequest, opts ...grpc.CallOption) (*ListPlanetsReply, error)\n}\n\ntype planetServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewPlanetServiceClient(cc grpc.ClientConnInterface) PlanetServiceClient {\n\treturn &planetServiceClient{cc}\n}\n\nfunc (c *planetServiceClient) GetPlanet(ctx context.Context, in *GetPlanetRequest, opts ...grpc.CallOption) (*GetPlanetReply, error) {\n\tcOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)\n\tout := new(GetPlanetReply)\n\terr := c.cc.Invoke(ctx, PlanetService_GetPlanet_FullMethodName, in, out, cOpts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *planetServiceClient) ListPlanets(ctx context.Context, in *ListPlanetsRequest, opts ...grpc.CallOption) (*ListPlanetsReply, error) {\n\tcOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)\n\tout := new(ListPlanetsReply)\n\terr := c.cc.Invoke(ctx, PlanetService_ListPlanets_FullMethodName, in, out, cOpts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// PlanetServiceServer is the server API for PlanetService service.\n// All implementations must embed UnimplementedPlanetServiceServer\n// for forward compatibility\ntype PlanetServiceServer interface {\n\tGetPlanet(context.Context, *GetPlanetRequest) (*GetPlanetReply, error)\n\tListPlanets(context.Context, *ListPlanetsRequest) (*ListPlanetsReply, error)\n\tmustEmbedUnimplementedPlanetServiceServer()\n}\n\n// UnimplementedPlanetServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedPlanetServiceServer struct {\n}\n\nfunc (UnimplementedPlanetServiceServer) GetPlanet(context.Context, *GetPlanetRequest) (*GetPlanetReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetPlanet not implemented\")\n}\nfunc (UnimplementedPlanetServiceServer) ListPlanets(context.Context, *ListPlanetsRequest) (*ListPlanetsReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method ListPlanets not implemented\")\n}\nfunc (UnimplementedPlanetServiceServer) mustEmbedUnimplementedPlanetServiceServer() {}\n\n// UnsafePlanetServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to PlanetServiceServer will\n// result in compilation errors.\ntype UnsafePlanetServiceServer interface {\n\tmustEmbedUnimplementedPlanetServiceServer()\n}\n\nfunc RegisterPlanetServiceServer(s grpc.ServiceRegistrar, srv PlanetServiceServer) {\n\ts.RegisterService(&PlanetService_ServiceDesc, srv)\n}\n\nfunc _PlanetService_GetPlanet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetPlanetRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(PlanetServiceServer).GetPlanet(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: PlanetService_GetPlanet_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(PlanetServiceServer).GetPlanet(ctx, req.(*GetPlanetRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _PlanetService_ListPlanets_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(ListPlanetsRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(PlanetServiceServer).ListPlanets(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: PlanetService_ListPlanets_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(PlanetServiceServer).ListPlanets(ctx, req.(*ListPlanetsRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// PlanetService_ServiceDesc is the grpc.ServiceDesc for PlanetService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar PlanetService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"swapi.planet.PlanetService\",\n\tHandlerType: (*PlanetServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetPlanet\",\n\t\t\tHandler:    _PlanetService_GetPlanet_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"ListPlanets\",\n\t\t\tHandler:    _PlanetService_ListPlanets_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"planet/planet.proto\",\n}\n"
  },
  {
    "path": "demo/swapi/species/species.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.34.1\n// \tprotoc        (unknown)\n// source: species/species.proto\n\npackage speciespb\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// GetSpeciesRequest.\ntype GetSpeciesRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// species id.\n\tId int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetSpeciesRequest) Reset() {\n\t*x = GetSpeciesRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_species_species_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetSpeciesRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetSpeciesRequest) ProtoMessage() {}\n\nfunc (x *GetSpeciesRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_species_species_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetSpeciesRequest.ProtoReflect.Descriptor instead.\nfunc (*GetSpeciesRequest) Descriptor() ([]byte, []int) {\n\treturn file_species_species_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetSpeciesRequest) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\n// GetSpeciesReply.\ntype GetSpeciesReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tSpecies *Species `protobuf:\"bytes,1,opt,name=species,proto3\" json:\"species,omitempty\"`\n}\n\nfunc (x *GetSpeciesReply) Reset() {\n\t*x = GetSpeciesReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_species_species_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetSpeciesReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetSpeciesReply) ProtoMessage() {}\n\nfunc (x *GetSpeciesReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_species_species_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetSpeciesReply.ProtoReflect.Descriptor instead.\nfunc (*GetSpeciesReply) Descriptor() ([]byte, []int) {\n\treturn file_species_species_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetSpeciesReply) GetSpecies() *Species {\n\tif x != nil {\n\t\treturn x.Species\n\t}\n\treturn nil\n}\n\n// ListSpeciesRequest.\ntype ListSpeciesRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tIds []int64 `protobuf:\"varint,1,rep,packed,name=ids,proto3\" json:\"ids,omitempty\"`\n}\n\nfunc (x *ListSpeciesRequest) Reset() {\n\t*x = ListSpeciesRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_species_species_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListSpeciesRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListSpeciesRequest) ProtoMessage() {}\n\nfunc (x *ListSpeciesRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_species_species_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListSpeciesRequest.ProtoReflect.Descriptor instead.\nfunc (*ListSpeciesRequest) Descriptor() ([]byte, []int) {\n\treturn file_species_species_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *ListSpeciesRequest) GetIds() []int64 {\n\tif x != nil {\n\t\treturn x.Ids\n\t}\n\treturn nil\n}\n\n// ListSpeciesReply.\ntype ListSpeciesReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tSpecies []*Species `protobuf:\"bytes,1,rep,name=species,proto3\" json:\"species,omitempty\"`\n}\n\nfunc (x *ListSpeciesReply) Reset() {\n\t*x = ListSpeciesReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_species_species_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListSpeciesReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListSpeciesReply) ProtoMessage() {}\n\nfunc (x *ListSpeciesReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_species_species_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListSpeciesReply.ProtoReflect.Descriptor instead.\nfunc (*ListSpeciesReply) Descriptor() ([]byte, []int) {\n\treturn file_species_species_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *ListSpeciesReply) GetSpecies() []*Species {\n\tif x != nil {\n\t\treturn x.Species\n\t}\n\treturn nil\n}\n\n// Species is a type of person or character within the Star Wars Universe.\ntype Species struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// species id.\n\tId int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\t// The name of this species.\n\tName string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// The classification of this species, such as \"mammal\" or \"reptile\".\n\tClassification string `protobuf:\"bytes,3,opt,name=classification,proto3\" json:\"classification,omitempty\"`\n\t// The designation of this species, such as \"sentient\".\n\tDesignation string `protobuf:\"bytes,4,opt,name=designation,proto3\" json:\"designation,omitempty\"`\n\t// The average height of this species in centimeters.\n\tAverageHeight string `protobuf:\"bytes,5,opt,name=average_height,json=averageHeight,proto3\" json:\"average_height,omitempty\"`\n\t// The average lifespan of this species in years.\n\tAverageLifespan string `protobuf:\"bytes,6,opt,name=average_lifespan,json=averageLifespan,proto3\" json:\"average_lifespan,omitempty\"`\n\t// A comma-separated string of common eye colors for this species,\n\t// \"none\" if this species does not typically have eyes.\n\tEyeColors string `protobuf:\"bytes,7,opt,name=eye_colors,json=eyeColors,proto3\" json:\"eye_colors,omitempty\"`\n\t// A comma-separated string of common hair colors for this species,\n\t// \"none\" if this species does not typically have hair.\n\tHairColors string `protobuf:\"bytes,8,opt,name=hair_colors,json=hairColors,proto3\" json:\"hair_colors,omitempty\"`\n\t// A comma-separated string of common skin colors for this species,\n\t// \"none\" if this species does not typically have skin.\n\tSkinColors string `protobuf:\"bytes,9,opt,name=skin_colors,json=skinColors,proto3\" json:\"skin_colors,omitempty\"`\n\t// The language commonly spoken by this species.\n\tLanguage string `protobuf:\"bytes,10,opt,name=language,proto3\" json:\"language,omitempty\"`\n\t// The URL of a planet resource, a planet that this species originates from.\n\tHomeworld string `protobuf:\"bytes,11,opt,name=homeworld,proto3\" json:\"homeworld,omitempty\"`\n\t// the hypermedia URL of this resource.\n\tUrl string `protobuf:\"bytes,12,opt,name=url,proto3\" json:\"url,omitempty\"`\n\t// the ISO 8601 date format of the time that this resource was created.\n\tCreated string `protobuf:\"bytes,13,opt,name=created,proto3\" json:\"created,omitempty\"`\n\t// the ISO 8601 date format of the time that this resource was edited.\n\tEdited string `protobuf:\"bytes,14,opt,name=edited,proto3\" json:\"edited,omitempty\"`\n\t// person ids.\n\tPersonIds []int64 `protobuf:\"varint,15,rep,packed,name=person_ids,json=personIds,proto3\" json:\"person_ids,omitempty\"`\n\t// film ids.\n\tFilmIds []int64 `protobuf:\"varint,16,rep,packed,name=film_ids,json=filmIds,proto3\" json:\"film_ids,omitempty\"`\n}\n\nfunc (x *Species) Reset() {\n\t*x = Species{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_species_species_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Species) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Species) ProtoMessage() {}\n\nfunc (x *Species) ProtoReflect() protoreflect.Message {\n\tmi := &file_species_species_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Species.ProtoReflect.Descriptor instead.\nfunc (*Species) Descriptor() ([]byte, []int) {\n\treturn file_species_species_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *Species) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *Species) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Species) GetClassification() string {\n\tif x != nil {\n\t\treturn x.Classification\n\t}\n\treturn \"\"\n}\n\nfunc (x *Species) GetDesignation() string {\n\tif x != nil {\n\t\treturn x.Designation\n\t}\n\treturn \"\"\n}\n\nfunc (x *Species) GetAverageHeight() string {\n\tif x != nil {\n\t\treturn x.AverageHeight\n\t}\n\treturn \"\"\n}\n\nfunc (x *Species) GetAverageLifespan() string {\n\tif x != nil {\n\t\treturn x.AverageLifespan\n\t}\n\treturn \"\"\n}\n\nfunc (x *Species) GetEyeColors() string {\n\tif x != nil {\n\t\treturn x.EyeColors\n\t}\n\treturn \"\"\n}\n\nfunc (x *Species) GetHairColors() string {\n\tif x != nil {\n\t\treturn x.HairColors\n\t}\n\treturn \"\"\n}\n\nfunc (x *Species) GetSkinColors() string {\n\tif x != nil {\n\t\treturn x.SkinColors\n\t}\n\treturn \"\"\n}\n\nfunc (x *Species) GetLanguage() string {\n\tif x != nil {\n\t\treturn x.Language\n\t}\n\treturn \"\"\n}\n\nfunc (x *Species) GetHomeworld() string {\n\tif x != nil {\n\t\treturn x.Homeworld\n\t}\n\treturn \"\"\n}\n\nfunc (x *Species) GetUrl() string {\n\tif x != nil {\n\t\treturn x.Url\n\t}\n\treturn \"\"\n}\n\nfunc (x *Species) GetCreated() string {\n\tif x != nil {\n\t\treturn x.Created\n\t}\n\treturn \"\"\n}\n\nfunc (x *Species) GetEdited() string {\n\tif x != nil {\n\t\treturn x.Edited\n\t}\n\treturn \"\"\n}\n\nfunc (x *Species) GetPersonIds() []int64 {\n\tif x != nil {\n\t\treturn x.PersonIds\n\t}\n\treturn nil\n}\n\nfunc (x *Species) GetFilmIds() []int64 {\n\tif x != nil {\n\t\treturn x.FilmIds\n\t}\n\treturn nil\n}\n\nvar File_species_species_proto protoreflect.FileDescriptor\n\nvar file_species_species_proto_rawDesc = []byte{\n\t0x0a, 0x15, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65,\n\t0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x73,\n\t0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x22, 0x23, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, 0x70, 0x65,\n\t0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69,\n\t0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x22, 0x43, 0x0a, 0x0f, 0x47,\n\t0x65, 0x74, 0x53, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x30,\n\t0x0a, 0x07, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x16, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x2e,\n\t0x53, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x52, 0x07, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73,\n\t0x22, 0x26, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x52,\n\t0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20,\n\t0x03, 0x28, 0x03, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, 0x44, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74,\n\t0x53, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x30, 0x0a, 0x07,\n\t0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e,\n\t0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x2e, 0x53, 0x70,\n\t0x65, 0x63, 0x69, 0x65, 0x73, 0x52, 0x07, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x22, 0xe2,\n\t0x03, 0x0a, 0x07, 0x53, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x26,\n\t0x0a, 0x0e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69,\n\t0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73,\n\t0x69, 0x67, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x76, 0x65, 0x72,\n\t0x61, 0x67, 0x65, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x0d, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12,\n\t0x29, 0x0a, 0x10, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x6c, 0x69, 0x66, 0x65, 0x73,\n\t0x70, 0x61, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x61, 0x76, 0x65, 0x72, 0x61,\n\t0x67, 0x65, 0x4c, 0x69, 0x66, 0x65, 0x73, 0x70, 0x61, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x79,\n\t0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,\n\t0x65, 0x79, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x68, 0x61, 0x69,\n\t0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a,\n\t0x68, 0x61, 0x69, 0x72, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6b,\n\t0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x0a, 0x73, 0x6b, 0x69, 0x6e, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6c,\n\t0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c,\n\t0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x68, 0x6f, 0x6d, 0x65, 0x77,\n\t0x6f, 0x72, 0x6c, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x68, 0x6f, 0x6d, 0x65,\n\t0x77, 0x6f, 0x72, 0x6c, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x0c, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74,\n\t0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65,\n\t0x64, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x06, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x65, 0x72,\n\t0x73, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x03, 0x52, 0x09, 0x70,\n\t0x65, 0x72, 0x73, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x6d,\n\t0x5f, 0x69, 0x64, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x03, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x6d,\n\t0x49, 0x64, 0x73, 0x32, 0xb7, 0x01, 0x0a, 0x0e, 0x53, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x53, 0x70, 0x65,\n\t0x63, 0x69, 0x65, 0x73, 0x12, 0x20, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x73, 0x70, 0x65,\n\t0x63, 0x69, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x52,\n\t0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x73,\n\t0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x70, 0x65, 0x63, 0x69, 0x65,\n\t0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74,\n\t0x53, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e,\n\t0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x70, 0x65, 0x63,\n\t0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x73, 0x77, 0x61,\n\t0x70, 0x69, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53,\n\t0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0xb7, 0x01,\n\t0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x73, 0x70, 0x65, 0x63,\n\t0x69, 0x65, 0x73, 0x42, 0x0c, 0x53, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x74,\n\t0x6f, 0x50, 0x01, 0x5a, 0x3f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x6d, 0x65, 0x72, 0x63, 0x61, 0x72, 0x69, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x73, 0x77, 0x61,\n\t0x70, 0x69, 0x2f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x3b, 0x73, 0x70, 0x65, 0x63, 0x69,\n\t0x65, 0x73, 0x70, 0x62, 0xa2, 0x02, 0x03, 0x53, 0x53, 0x58, 0xaa, 0x02, 0x0d, 0x53, 0x77, 0x61,\n\t0x70, 0x69, 0x2e, 0x53, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0xca, 0x02, 0x0d, 0x53, 0x77, 0x61,\n\t0x70, 0x69, 0x5c, 0x53, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0xe2, 0x02, 0x19, 0x53, 0x77, 0x61,\n\t0x70, 0x69, 0x5c, 0x53, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65,\n\t0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, 0x53, 0x77, 0x61, 0x70, 0x69, 0x3a, 0x3a,\n\t0x53, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_species_species_proto_rawDescOnce sync.Once\n\tfile_species_species_proto_rawDescData = file_species_species_proto_rawDesc\n)\n\nfunc file_species_species_proto_rawDescGZIP() []byte {\n\tfile_species_species_proto_rawDescOnce.Do(func() {\n\t\tfile_species_species_proto_rawDescData = protoimpl.X.CompressGZIP(file_species_species_proto_rawDescData)\n\t})\n\treturn file_species_species_proto_rawDescData\n}\n\nvar file_species_species_proto_msgTypes = make([]protoimpl.MessageInfo, 5)\nvar file_species_species_proto_goTypes = []interface{}{\n\t(*GetSpeciesRequest)(nil),  // 0: swapi.species.GetSpeciesRequest\n\t(*GetSpeciesReply)(nil),    // 1: swapi.species.GetSpeciesReply\n\t(*ListSpeciesRequest)(nil), // 2: swapi.species.ListSpeciesRequest\n\t(*ListSpeciesReply)(nil),   // 3: swapi.species.ListSpeciesReply\n\t(*Species)(nil),            // 4: swapi.species.Species\n}\nvar file_species_species_proto_depIdxs = []int32{\n\t4, // 0: swapi.species.GetSpeciesReply.species:type_name -> swapi.species.Species\n\t4, // 1: swapi.species.ListSpeciesReply.species:type_name -> swapi.species.Species\n\t0, // 2: swapi.species.SpeciesService.GetSpecies:input_type -> swapi.species.GetSpeciesRequest\n\t2, // 3: swapi.species.SpeciesService.ListSpecies:input_type -> swapi.species.ListSpeciesRequest\n\t1, // 4: swapi.species.SpeciesService.GetSpecies:output_type -> swapi.species.GetSpeciesReply\n\t3, // 5: swapi.species.SpeciesService.ListSpecies:output_type -> swapi.species.ListSpeciesReply\n\t4, // [4:6] is the sub-list for method output_type\n\t2, // [2:4] is the sub-list for method input_type\n\t2, // [2:2] is the sub-list for extension type_name\n\t2, // [2:2] is the sub-list for extension extendee\n\t0, // [0:2] is the sub-list for field type_name\n}\n\nfunc init() { file_species_species_proto_init() }\nfunc file_species_species_proto_init() {\n\tif File_species_species_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_species_species_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetSpeciesRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_species_species_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetSpeciesReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_species_species_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListSpeciesRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_species_species_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListSpeciesReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_species_species_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Species); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_species_species_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   5,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_species_species_proto_goTypes,\n\t\tDependencyIndexes: file_species_species_proto_depIdxs,\n\t\tMessageInfos:      file_species_species_proto_msgTypes,\n\t}.Build()\n\tFile_species_species_proto = out.File\n\tfile_species_species_proto_rawDesc = nil\n\tfile_species_species_proto_goTypes = nil\n\tfile_species_species_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "demo/swapi/species/species_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.4.0\n// - protoc             (unknown)\n// source: species/species.proto\n\npackage speciespb\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.62.0 or later.\nconst _ = grpc.SupportPackageIsVersion8\n\nconst (\n\tSpeciesService_GetSpecies_FullMethodName  = \"/swapi.species.SpeciesService/GetSpecies\"\n\tSpeciesService_ListSpecies_FullMethodName = \"/swapi.species.SpeciesService/ListSpecies\"\n)\n\n// SpeciesServiceClient is the client API for SpeciesService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype SpeciesServiceClient interface {\n\tGetSpecies(ctx context.Context, in *GetSpeciesRequest, opts ...grpc.CallOption) (*GetSpeciesReply, error)\n\tListSpecies(ctx context.Context, in *ListSpeciesRequest, opts ...grpc.CallOption) (*ListSpeciesReply, error)\n}\n\ntype speciesServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewSpeciesServiceClient(cc grpc.ClientConnInterface) SpeciesServiceClient {\n\treturn &speciesServiceClient{cc}\n}\n\nfunc (c *speciesServiceClient) GetSpecies(ctx context.Context, in *GetSpeciesRequest, opts ...grpc.CallOption) (*GetSpeciesReply, error) {\n\tcOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)\n\tout := new(GetSpeciesReply)\n\terr := c.cc.Invoke(ctx, SpeciesService_GetSpecies_FullMethodName, in, out, cOpts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *speciesServiceClient) ListSpecies(ctx context.Context, in *ListSpeciesRequest, opts ...grpc.CallOption) (*ListSpeciesReply, error) {\n\tcOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)\n\tout := new(ListSpeciesReply)\n\terr := c.cc.Invoke(ctx, SpeciesService_ListSpecies_FullMethodName, in, out, cOpts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// SpeciesServiceServer is the server API for SpeciesService service.\n// All implementations must embed UnimplementedSpeciesServiceServer\n// for forward compatibility\ntype SpeciesServiceServer interface {\n\tGetSpecies(context.Context, *GetSpeciesRequest) (*GetSpeciesReply, error)\n\tListSpecies(context.Context, *ListSpeciesRequest) (*ListSpeciesReply, error)\n\tmustEmbedUnimplementedSpeciesServiceServer()\n}\n\n// UnimplementedSpeciesServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedSpeciesServiceServer struct {\n}\n\nfunc (UnimplementedSpeciesServiceServer) GetSpecies(context.Context, *GetSpeciesRequest) (*GetSpeciesReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetSpecies not implemented\")\n}\nfunc (UnimplementedSpeciesServiceServer) ListSpecies(context.Context, *ListSpeciesRequest) (*ListSpeciesReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method ListSpecies not implemented\")\n}\nfunc (UnimplementedSpeciesServiceServer) mustEmbedUnimplementedSpeciesServiceServer() {}\n\n// UnsafeSpeciesServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to SpeciesServiceServer will\n// result in compilation errors.\ntype UnsafeSpeciesServiceServer interface {\n\tmustEmbedUnimplementedSpeciesServiceServer()\n}\n\nfunc RegisterSpeciesServiceServer(s grpc.ServiceRegistrar, srv SpeciesServiceServer) {\n\ts.RegisterService(&SpeciesService_ServiceDesc, srv)\n}\n\nfunc _SpeciesService_GetSpecies_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetSpeciesRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(SpeciesServiceServer).GetSpecies(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: SpeciesService_GetSpecies_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(SpeciesServiceServer).GetSpecies(ctx, req.(*GetSpeciesRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _SpeciesService_ListSpecies_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(ListSpeciesRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(SpeciesServiceServer).ListSpecies(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: SpeciesService_ListSpecies_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(SpeciesServiceServer).ListSpecies(ctx, req.(*ListSpeciesRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// SpeciesService_ServiceDesc is the grpc.ServiceDesc for SpeciesService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar SpeciesService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"swapi.species.SpeciesService\",\n\tHandlerType: (*SpeciesServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetSpecies\",\n\t\t\tHandler:    _SpeciesService_GetSpecies_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"ListSpecies\",\n\t\t\tHandler:    _SpeciesService_ListSpecies_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"species/species.proto\",\n}\n"
  },
  {
    "path": "demo/swapi/starship/starship.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.34.1\n// \tprotoc        (unknown)\n// source: starship/starship.proto\n\npackage starshippb\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// GetStarshipRequest.\ntype GetStarshipRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// starship id.\n\tId int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetStarshipRequest) Reset() {\n\t*x = GetStarshipRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_starship_starship_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetStarshipRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetStarshipRequest) ProtoMessage() {}\n\nfunc (x *GetStarshipRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_starship_starship_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetStarshipRequest.ProtoReflect.Descriptor instead.\nfunc (*GetStarshipRequest) Descriptor() ([]byte, []int) {\n\treturn file_starship_starship_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetStarshipRequest) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\n// GetStarshipReply.\ntype GetStarshipReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tStarship *Starship `protobuf:\"bytes,1,opt,name=starship,proto3\" json:\"starship,omitempty\"`\n}\n\nfunc (x *GetStarshipReply) Reset() {\n\t*x = GetStarshipReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_starship_starship_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetStarshipReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetStarshipReply) ProtoMessage() {}\n\nfunc (x *GetStarshipReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_starship_starship_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetStarshipReply.ProtoReflect.Descriptor instead.\nfunc (*GetStarshipReply) Descriptor() ([]byte, []int) {\n\treturn file_starship_starship_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetStarshipReply) GetStarship() *Starship {\n\tif x != nil {\n\t\treturn x.Starship\n\t}\n\treturn nil\n}\n\n// ListStarshipsRequest.\ntype ListStarshipsRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tIds []int64 `protobuf:\"varint,1,rep,packed,name=ids,proto3\" json:\"ids,omitempty\"`\n}\n\nfunc (x *ListStarshipsRequest) Reset() {\n\t*x = ListStarshipsRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_starship_starship_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListStarshipsRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListStarshipsRequest) ProtoMessage() {}\n\nfunc (x *ListStarshipsRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_starship_starship_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListStarshipsRequest.ProtoReflect.Descriptor instead.\nfunc (*ListStarshipsRequest) Descriptor() ([]byte, []int) {\n\treturn file_starship_starship_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *ListStarshipsRequest) GetIds() []int64 {\n\tif x != nil {\n\t\treturn x.Ids\n\t}\n\treturn nil\n}\n\n// ListStarshipsReply.\ntype ListStarshipsReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tStarships []*Starship `protobuf:\"bytes,1,rep,name=starships,proto3\" json:\"starships,omitempty\"`\n}\n\nfunc (x *ListStarshipsReply) Reset() {\n\t*x = ListStarshipsReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_starship_starship_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListStarshipsReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListStarshipsReply) ProtoMessage() {}\n\nfunc (x *ListStarshipsReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_starship_starship_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListStarshipsReply.ProtoReflect.Descriptor instead.\nfunc (*ListStarshipsReply) Descriptor() ([]byte, []int) {\n\treturn file_starship_starship_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *ListStarshipsReply) GetStarships() []*Starship {\n\tif x != nil {\n\t\treturn x.Starships\n\t}\n\treturn nil\n}\n\n// Starship is a single transport craft that has hyperdrive capability.\ntype Starship struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// starship id.\n\tId int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\t// The name of this starship. The common name, such as \"Death Star\".\n\tName string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// The model or official name of this starship.\n\t// Such as \"T-65 X-wing\" or \"DS-1 Orbital Battle Station\".\n\tModel string `protobuf:\"bytes,3,opt,name=model,proto3\" json:\"model,omitempty\"`\n\t// The class of this starship, such as \"Starfighter\" or \"Deep Space Mobile Battlestation\".\n\tStarshipClass string `protobuf:\"bytes,4,opt,name=starship_class,json=starshipClass,proto3\" json:\"starship_class,omitempty\"`\n\t// The manufacturer of this starship. Comma separated if more than one.\n\tManufacturer string `protobuf:\"bytes,5,opt,name=manufacturer,proto3\" json:\"manufacturer,omitempty\"`\n\t// The cost of this starship new, in galactic credits.\n\tCostInCredits string `protobuf:\"bytes,6,opt,name=cost_in_credits,json=costInCredits,proto3\" json:\"cost_in_credits,omitempty\"`\n\t// The length of this starship in meters.\n\tLength string `protobuf:\"bytes,7,opt,name=length,proto3\" json:\"length,omitempty\"`\n\t// The number of personnel needed to run or pilot this starship.\n\tCrew string `protobuf:\"bytes,8,opt,name=crew,proto3\" json:\"crew,omitempty\"`\n\t// The number of non-essential people this starship can transport.\n\tPassengers string `protobuf:\"bytes,9,opt,name=passengers,proto3\" json:\"passengers,omitempty\"`\n\t// The maximum speed of this starship in the atmosphere.\n\t// \"N/A\" if this starship is incapable of atmospheric flight.\n\tMaxAtmospheringSpeed string `protobuf:\"bytes,10,opt,name=max_atmosphering_speed,json=maxAtmospheringSpeed,proto3\" json:\"max_atmosphering_speed,omitempty\"`\n\t// The class of this starships hyperdrive.\n\tHyperdriveRating string `protobuf:\"bytes,11,opt,name=hyperdrive_rating,json=hyperdriveRating,proto3\" json:\"hyperdrive_rating,omitempty\"`\n\t// The Maximum number of Megalights this starship can travel in a standard hour.\n\t// A \"Megalight\" is a standard unit of distance and has never been defined before within the Star Wars universe.\n\t// This figure is only really useful for measuring the difference in speed of starships.\n\t// We can assume it is similar to AU, the distance between our Sun (Sol) and Earth.\n\tMglt string `protobuf:\"bytes,12,opt,name=mglt,proto3\" json:\"mglt,omitempty\"`\n\t// The maximum number of kilograms that this starship can transport.\n\tCargoCapacity string `protobuf:\"bytes,13,opt,name=cargo_capacity,json=cargoCapacity,proto3\" json:\"cargo_capacity,omitempty\"`\n\t// The maximum length of time that this starship can provide consumables for its entire crew without having to resupply.\n\tConsumables string `protobuf:\"bytes,14,opt,name=consumables,proto3\" json:\"consumables,omitempty\"`\n\t// the hypermedia URL of this resource.\n\tUrl string `protobuf:\"bytes,15,opt,name=url,proto3\" json:\"url,omitempty\"`\n\t// the ISO 8601 date format of the time that this resource was created.\n\tCreated string `protobuf:\"bytes,16,opt,name=created,proto3\" json:\"created,omitempty\"`\n\t// the ISO 8601 date format of the time that this resource was edited.\n\tEdited string `protobuf:\"bytes,17,opt,name=edited,proto3\" json:\"edited,omitempty\"`\n\t// film ids.\n\tFilmIds []int64 `protobuf:\"varint,18,rep,packed,name=film_ids,json=filmIds,proto3\" json:\"film_ids,omitempty\"`\n\t// pilot ids.\n\tPilotIds []int64 `protobuf:\"varint,19,rep,packed,name=pilot_ids,json=pilotIds,proto3\" json:\"pilot_ids,omitempty\"`\n}\n\nfunc (x *Starship) Reset() {\n\t*x = Starship{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_starship_starship_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Starship) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Starship) ProtoMessage() {}\n\nfunc (x *Starship) ProtoReflect() protoreflect.Message {\n\tmi := &file_starship_starship_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Starship.ProtoReflect.Descriptor instead.\nfunc (*Starship) Descriptor() ([]byte, []int) {\n\treturn file_starship_starship_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *Starship) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *Starship) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Starship) GetModel() string {\n\tif x != nil {\n\t\treturn x.Model\n\t}\n\treturn \"\"\n}\n\nfunc (x *Starship) GetStarshipClass() string {\n\tif x != nil {\n\t\treturn x.StarshipClass\n\t}\n\treturn \"\"\n}\n\nfunc (x *Starship) GetManufacturer() string {\n\tif x != nil {\n\t\treturn x.Manufacturer\n\t}\n\treturn \"\"\n}\n\nfunc (x *Starship) GetCostInCredits() string {\n\tif x != nil {\n\t\treturn x.CostInCredits\n\t}\n\treturn \"\"\n}\n\nfunc (x *Starship) GetLength() string {\n\tif x != nil {\n\t\treturn x.Length\n\t}\n\treturn \"\"\n}\n\nfunc (x *Starship) GetCrew() string {\n\tif x != nil {\n\t\treturn x.Crew\n\t}\n\treturn \"\"\n}\n\nfunc (x *Starship) GetPassengers() string {\n\tif x != nil {\n\t\treturn x.Passengers\n\t}\n\treturn \"\"\n}\n\nfunc (x *Starship) GetMaxAtmospheringSpeed() string {\n\tif x != nil {\n\t\treturn x.MaxAtmospheringSpeed\n\t}\n\treturn \"\"\n}\n\nfunc (x *Starship) GetHyperdriveRating() string {\n\tif x != nil {\n\t\treturn x.HyperdriveRating\n\t}\n\treturn \"\"\n}\n\nfunc (x *Starship) GetMglt() string {\n\tif x != nil {\n\t\treturn x.Mglt\n\t}\n\treturn \"\"\n}\n\nfunc (x *Starship) GetCargoCapacity() string {\n\tif x != nil {\n\t\treturn x.CargoCapacity\n\t}\n\treturn \"\"\n}\n\nfunc (x *Starship) GetConsumables() string {\n\tif x != nil {\n\t\treturn x.Consumables\n\t}\n\treturn \"\"\n}\n\nfunc (x *Starship) GetUrl() string {\n\tif x != nil {\n\t\treturn x.Url\n\t}\n\treturn \"\"\n}\n\nfunc (x *Starship) GetCreated() string {\n\tif x != nil {\n\t\treturn x.Created\n\t}\n\treturn \"\"\n}\n\nfunc (x *Starship) GetEdited() string {\n\tif x != nil {\n\t\treturn x.Edited\n\t}\n\treturn \"\"\n}\n\nfunc (x *Starship) GetFilmIds() []int64 {\n\tif x != nil {\n\t\treturn x.FilmIds\n\t}\n\treturn nil\n}\n\nfunc (x *Starship) GetPilotIds() []int64 {\n\tif x != nil {\n\t\treturn x.PilotIds\n\t}\n\treturn nil\n}\n\nvar File_starship_starship_proto protoreflect.FileDescriptor\n\nvar file_starship_starship_proto_rawDesc = []byte{\n\t0x0a, 0x17, 0x73, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x2f, 0x73, 0x74, 0x61, 0x72, 0x73,\n\t0x68, 0x69, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x73, 0x77, 0x61, 0x70, 0x69,\n\t0x2e, 0x73, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x22, 0x24, 0x0a, 0x12, 0x47, 0x65, 0x74,\n\t0x53, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,\n\t0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x22,\n\t0x48, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65,\n\t0x70, 0x6c, 0x79, 0x12, 0x34, 0x0a, 0x08, 0x73, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x73, 0x74,\n\t0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52,\n\t0x08, 0x73, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x22, 0x28, 0x0a, 0x14, 0x4c, 0x69, 0x73,\n\t0x74, 0x53, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,\n\t0x74, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x03, 0x52, 0x03,\n\t0x69, 0x64, 0x73, 0x22, 0x4c, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x61, 0x72, 0x73,\n\t0x68, 0x69, 0x70, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x74, 0x61,\n\t0x72, 0x73, 0x68, 0x69, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x73,\n\t0x77, 0x61, 0x70, 0x69, 0x2e, 0x73, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x2e, 0x53, 0x74,\n\t0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70,\n\t0x73, 0x22, 0xbf, 0x04, 0x0a, 0x08, 0x53, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x12, 0x0e,\n\t0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12,\n\t0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x72,\n\t0x73, 0x68, 0x69, 0x70, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12,\n\t0x22, 0x0a, 0x0c, 0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, 0x72, 0x65, 0x72, 0x18,\n\t0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, 0x75,\n\t0x72, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x5f, 0x63,\n\t0x72, 0x65, 0x64, 0x69, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f,\n\t0x73, 0x74, 0x49, 0x6e, 0x43, 0x72, 0x65, 0x64, 0x69, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6c,\n\t0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x65, 0x6e,\n\t0x67, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x72, 0x65, 0x77, 0x18, 0x08, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x04, 0x63, 0x72, 0x65, 0x77, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x61, 0x73, 0x73, 0x65,\n\t0x6e, 0x67, 0x65, 0x72, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x61, 0x73,\n\t0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x61,\n\t0x74, 0x6d, 0x6f, 0x73, 0x70, 0x68, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x70, 0x65, 0x65,\n\t0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x6d, 0x61, 0x78, 0x41, 0x74, 0x6d, 0x6f,\n\t0x73, 0x70, 0x68, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x2b, 0x0a,\n\t0x11, 0x68, 0x79, 0x70, 0x65, 0x72, 0x64, 0x72, 0x69, 0x76, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x69,\n\t0x6e, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x68, 0x79, 0x70, 0x65, 0x72, 0x64,\n\t0x72, 0x69, 0x76, 0x65, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x67,\n\t0x6c, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x67, 0x6c, 0x74, 0x12, 0x25,\n\t0x0a, 0x0e, 0x63, 0x61, 0x72, 0x67, 0x6f, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79,\n\t0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x61, 0x72, 0x67, 0x6f, 0x43, 0x61, 0x70,\n\t0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x61,\n\t0x62, 0x6c, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x73,\n\t0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x0f,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65,\n\t0x61, 0x74, 0x65, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61,\n\t0x74, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x18, 0x11, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x66,\n\t0x69, 0x6c, 0x6d, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x12, 0x20, 0x03, 0x28, 0x03, 0x52, 0x07, 0x66,\n\t0x69, 0x6c, 0x6d, 0x49, 0x64, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x69, 0x6c, 0x6f, 0x74, 0x5f,\n\t0x69, 0x64, 0x73, 0x18, 0x13, 0x20, 0x03, 0x28, 0x03, 0x52, 0x08, 0x70, 0x69, 0x6c, 0x6f, 0x74,\n\t0x49, 0x64, 0x73, 0x32, 0xc5, 0x01, 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70,\n\t0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x55, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, 0x74,\n\t0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x12, 0x22, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x73,\n\t0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x73,\n\t0x68, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x73, 0x77, 0x61,\n\t0x70, 0x69, 0x2e, 0x73, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x2e, 0x47, 0x65, 0x74, 0x53,\n\t0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5b,\n\t0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x73, 0x12,\n\t0x24, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x73, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70,\n\t0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x73, 0x52, 0x65,\n\t0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x73, 0x74,\n\t0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x61, 0x72, 0x73,\n\t0x68, 0x69, 0x70, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0xbf, 0x01, 0x0a, 0x12,\n\t0x63, 0x6f, 0x6d, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x73, 0x74, 0x61, 0x72, 0x73, 0x68,\n\t0x69, 0x70, 0x42, 0x0d, 0x53, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x50, 0x72, 0x6f, 0x74,\n\t0x6f, 0x50, 0x01, 0x5a, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x6d, 0x65, 0x72, 0x63, 0x61, 0x72, 0x69, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x73, 0x77, 0x61,\n\t0x70, 0x69, 0x2f, 0x73, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x3b, 0x73, 0x74, 0x61, 0x72,\n\t0x73, 0x68, 0x69, 0x70, 0x70, 0x62, 0xa2, 0x02, 0x03, 0x53, 0x53, 0x58, 0xaa, 0x02, 0x0e, 0x53,\n\t0x77, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0xca, 0x02, 0x0e,\n\t0x53, 0x77, 0x61, 0x70, 0x69, 0x5c, 0x53, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0xe2, 0x02,\n\t0x1a, 0x53, 0x77, 0x61, 0x70, 0x69, 0x5c, 0x53, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x5c,\n\t0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0f, 0x53, 0x77,\n\t0x61, 0x70, 0x69, 0x3a, 0x3a, 0x53, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x62, 0x06, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_starship_starship_proto_rawDescOnce sync.Once\n\tfile_starship_starship_proto_rawDescData = file_starship_starship_proto_rawDesc\n)\n\nfunc file_starship_starship_proto_rawDescGZIP() []byte {\n\tfile_starship_starship_proto_rawDescOnce.Do(func() {\n\t\tfile_starship_starship_proto_rawDescData = protoimpl.X.CompressGZIP(file_starship_starship_proto_rawDescData)\n\t})\n\treturn file_starship_starship_proto_rawDescData\n}\n\nvar file_starship_starship_proto_msgTypes = make([]protoimpl.MessageInfo, 5)\nvar file_starship_starship_proto_goTypes = []interface{}{\n\t(*GetStarshipRequest)(nil),   // 0: swapi.starship.GetStarshipRequest\n\t(*GetStarshipReply)(nil),     // 1: swapi.starship.GetStarshipReply\n\t(*ListStarshipsRequest)(nil), // 2: swapi.starship.ListStarshipsRequest\n\t(*ListStarshipsReply)(nil),   // 3: swapi.starship.ListStarshipsReply\n\t(*Starship)(nil),             // 4: swapi.starship.Starship\n}\nvar file_starship_starship_proto_depIdxs = []int32{\n\t4, // 0: swapi.starship.GetStarshipReply.starship:type_name -> swapi.starship.Starship\n\t4, // 1: swapi.starship.ListStarshipsReply.starships:type_name -> swapi.starship.Starship\n\t0, // 2: swapi.starship.StarshipService.GetStarship:input_type -> swapi.starship.GetStarshipRequest\n\t2, // 3: swapi.starship.StarshipService.ListStarships:input_type -> swapi.starship.ListStarshipsRequest\n\t1, // 4: swapi.starship.StarshipService.GetStarship:output_type -> swapi.starship.GetStarshipReply\n\t3, // 5: swapi.starship.StarshipService.ListStarships:output_type -> swapi.starship.ListStarshipsReply\n\t4, // [4:6] is the sub-list for method output_type\n\t2, // [2:4] is the sub-list for method input_type\n\t2, // [2:2] is the sub-list for extension type_name\n\t2, // [2:2] is the sub-list for extension extendee\n\t0, // [0:2] is the sub-list for field type_name\n}\n\nfunc init() { file_starship_starship_proto_init() }\nfunc file_starship_starship_proto_init() {\n\tif File_starship_starship_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_starship_starship_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetStarshipRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_starship_starship_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetStarshipReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_starship_starship_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListStarshipsRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_starship_starship_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListStarshipsReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_starship_starship_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Starship); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_starship_starship_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   5,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_starship_starship_proto_goTypes,\n\t\tDependencyIndexes: file_starship_starship_proto_depIdxs,\n\t\tMessageInfos:      file_starship_starship_proto_msgTypes,\n\t}.Build()\n\tFile_starship_starship_proto = out.File\n\tfile_starship_starship_proto_rawDesc = nil\n\tfile_starship_starship_proto_goTypes = nil\n\tfile_starship_starship_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "demo/swapi/starship/starship_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.4.0\n// - protoc             (unknown)\n// source: starship/starship.proto\n\npackage starshippb\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.62.0 or later.\nconst _ = grpc.SupportPackageIsVersion8\n\nconst (\n\tStarshipService_GetStarship_FullMethodName   = \"/swapi.starship.StarshipService/GetStarship\"\n\tStarshipService_ListStarships_FullMethodName = \"/swapi.starship.StarshipService/ListStarships\"\n)\n\n// StarshipServiceClient is the client API for StarshipService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype StarshipServiceClient interface {\n\tGetStarship(ctx context.Context, in *GetStarshipRequest, opts ...grpc.CallOption) (*GetStarshipReply, error)\n\tListStarships(ctx context.Context, in *ListStarshipsRequest, opts ...grpc.CallOption) (*ListStarshipsReply, error)\n}\n\ntype starshipServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewStarshipServiceClient(cc grpc.ClientConnInterface) StarshipServiceClient {\n\treturn &starshipServiceClient{cc}\n}\n\nfunc (c *starshipServiceClient) GetStarship(ctx context.Context, in *GetStarshipRequest, opts ...grpc.CallOption) (*GetStarshipReply, error) {\n\tcOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)\n\tout := new(GetStarshipReply)\n\terr := c.cc.Invoke(ctx, StarshipService_GetStarship_FullMethodName, in, out, cOpts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *starshipServiceClient) ListStarships(ctx context.Context, in *ListStarshipsRequest, opts ...grpc.CallOption) (*ListStarshipsReply, error) {\n\tcOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)\n\tout := new(ListStarshipsReply)\n\terr := c.cc.Invoke(ctx, StarshipService_ListStarships_FullMethodName, in, out, cOpts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// StarshipServiceServer is the server API for StarshipService service.\n// All implementations must embed UnimplementedStarshipServiceServer\n// for forward compatibility\ntype StarshipServiceServer interface {\n\tGetStarship(context.Context, *GetStarshipRequest) (*GetStarshipReply, error)\n\tListStarships(context.Context, *ListStarshipsRequest) (*ListStarshipsReply, error)\n\tmustEmbedUnimplementedStarshipServiceServer()\n}\n\n// UnimplementedStarshipServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedStarshipServiceServer struct {\n}\n\nfunc (UnimplementedStarshipServiceServer) GetStarship(context.Context, *GetStarshipRequest) (*GetStarshipReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetStarship not implemented\")\n}\nfunc (UnimplementedStarshipServiceServer) ListStarships(context.Context, *ListStarshipsRequest) (*ListStarshipsReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method ListStarships not implemented\")\n}\nfunc (UnimplementedStarshipServiceServer) mustEmbedUnimplementedStarshipServiceServer() {}\n\n// UnsafeStarshipServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to StarshipServiceServer will\n// result in compilation errors.\ntype UnsafeStarshipServiceServer interface {\n\tmustEmbedUnimplementedStarshipServiceServer()\n}\n\nfunc RegisterStarshipServiceServer(s grpc.ServiceRegistrar, srv StarshipServiceServer) {\n\ts.RegisterService(&StarshipService_ServiceDesc, srv)\n}\n\nfunc _StarshipService_GetStarship_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetStarshipRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(StarshipServiceServer).GetStarship(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: StarshipService_GetStarship_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(StarshipServiceServer).GetStarship(ctx, req.(*GetStarshipRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _StarshipService_ListStarships_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(ListStarshipsRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(StarshipServiceServer).ListStarships(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: StarshipService_ListStarships_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(StarshipServiceServer).ListStarships(ctx, req.(*ListStarshipsRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// StarshipService_ServiceDesc is the grpc.ServiceDesc for StarshipService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar StarshipService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"swapi.starship.StarshipService\",\n\tHandlerType: (*StarshipServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetStarship\",\n\t\t\tHandler:    _StarshipService_GetStarship_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"ListStarships\",\n\t\t\tHandler:    _StarshipService_ListStarships_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"starship/starship.proto\",\n}\n"
  },
  {
    "path": "demo/swapi/swapi/swapi.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.34.1\n// \tprotoc        (unknown)\n// source: swapi.proto\n\npackage swapipb\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/demo/swapi/film\"\n\t_ \"github.com/mercari/grpc-federation/demo/swapi/person\"\n\t_ \"github.com/mercari/grpc-federation/demo/swapi/planet\"\n\t_ \"github.com/mercari/grpc-federation/demo/swapi/species\"\n\t_ \"github.com/mercari/grpc-federation/demo/swapi/starship\"\n\t_ \"github.com/mercari/grpc-federation/demo/swapi/vehicle\"\n\t_ \"github.com/mercari/grpc-federation/grpc/federation\"\n\tdate \"google.golang.org/genproto/googleapis/type/date\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// GetPersonRequest.\ntype GetPersonRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The persion id.\n\tId int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetPersonRequest) Reset() {\n\t*x = GetPersonRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_swapi_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPersonRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPersonRequest) ProtoMessage() {}\n\nfunc (x *GetPersonRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_swapi_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPersonRequest.ProtoReflect.Descriptor instead.\nfunc (*GetPersonRequest) Descriptor() ([]byte, []int) {\n\treturn file_swapi_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetPersonRequest) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\n// GetPersonReply.\ntype GetPersonReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPerson *Person `protobuf:\"bytes,1,opt,name=person,proto3\" json:\"person,omitempty\"`\n\t// films.\n\tFilms []*Film `protobuf:\"bytes,2,rep,name=films,proto3\" json:\"films,omitempty\"`\n\t// species.\n\tSpecies []*Species `protobuf:\"bytes,3,rep,name=species,proto3\" json:\"species,omitempty\"`\n\t// starships.\n\tStarships []*Starship `protobuf:\"bytes,4,rep,name=starships,proto3\" json:\"starships,omitempty\"`\n\t// vehicles.\n\tVehicles []*Vehicle `protobuf:\"bytes,5,rep,name=vehicles,proto3\" json:\"vehicles,omitempty\"`\n}\n\nfunc (x *GetPersonReply) Reset() {\n\t*x = GetPersonReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_swapi_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPersonReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPersonReply) ProtoMessage() {}\n\nfunc (x *GetPersonReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_swapi_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPersonReply.ProtoReflect.Descriptor instead.\nfunc (*GetPersonReply) Descriptor() ([]byte, []int) {\n\treturn file_swapi_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetPersonReply) GetPerson() *Person {\n\tif x != nil {\n\t\treturn x.Person\n\t}\n\treturn nil\n}\n\nfunc (x *GetPersonReply) GetFilms() []*Film {\n\tif x != nil {\n\t\treturn x.Films\n\t}\n\treturn nil\n}\n\nfunc (x *GetPersonReply) GetSpecies() []*Species {\n\tif x != nil {\n\t\treturn x.Species\n\t}\n\treturn nil\n}\n\nfunc (x *GetPersonReply) GetStarships() []*Starship {\n\tif x != nil {\n\t\treturn x.Starships\n\t}\n\treturn nil\n}\n\nfunc (x *GetPersonReply) GetVehicles() []*Vehicle {\n\tif x != nil {\n\t\treturn x.Vehicles\n\t}\n\treturn nil\n}\n\n// ListPeopleRequest.\ntype ListPeopleRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tIds []int64 `protobuf:\"varint,1,rep,packed,name=ids,proto3\" json:\"ids,omitempty\"`\n}\n\nfunc (x *ListPeopleRequest) Reset() {\n\t*x = ListPeopleRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_swapi_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListPeopleRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListPeopleRequest) ProtoMessage() {}\n\nfunc (x *ListPeopleRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_swapi_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListPeopleRequest.ProtoReflect.Descriptor instead.\nfunc (*ListPeopleRequest) Descriptor() ([]byte, []int) {\n\treturn file_swapi_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *ListPeopleRequest) GetIds() []int64 {\n\tif x != nil {\n\t\treturn x.Ids\n\t}\n\treturn nil\n}\n\n// ListPeopleReply.\ntype ListPeopleReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPeople []*Person `protobuf:\"bytes,1,rep,name=people,proto3\" json:\"people,omitempty\"`\n}\n\nfunc (x *ListPeopleReply) Reset() {\n\t*x = ListPeopleReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_swapi_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListPeopleReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListPeopleReply) ProtoMessage() {}\n\nfunc (x *ListPeopleReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_swapi_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListPeopleReply.ProtoReflect.Descriptor instead.\nfunc (*ListPeopleReply) Descriptor() ([]byte, []int) {\n\treturn file_swapi_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *ListPeopleReply) GetPeople() []*Person {\n\tif x != nil {\n\t\treturn x.People\n\t}\n\treturn nil\n}\n\n// GetFilmRequest.\ntype GetFilmRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The film id.\n\tId int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetFilmRequest) Reset() {\n\t*x = GetFilmRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_swapi_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetFilmRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetFilmRequest) ProtoMessage() {}\n\nfunc (x *GetFilmRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_swapi_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetFilmRequest.ProtoReflect.Descriptor instead.\nfunc (*GetFilmRequest) Descriptor() ([]byte, []int) {\n\treturn file_swapi_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *GetFilmRequest) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\n// GetFilmReply.\ntype GetFilmReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tFilm *Film `protobuf:\"bytes,1,opt,name=film,proto3\" json:\"film,omitempty\"`\n\t// species.\n\tSpecies []*Species `protobuf:\"bytes,2,rep,name=species,proto3\" json:\"species,omitempty\"`\n\t// starships.\n\tStarships []*Starship `protobuf:\"bytes,3,rep,name=starships,proto3\" json:\"starships,omitempty\"`\n\t// vehicles.\n\tVehicles []*Vehicle `protobuf:\"bytes,4,rep,name=vehicles,proto3\" json:\"vehicles,omitempty\"`\n\t// characters.\n\tCharacters []*Person `protobuf:\"bytes,5,rep,name=characters,proto3\" json:\"characters,omitempty\"`\n\t// planets.\n\tPlanets []*Planet `protobuf:\"bytes,6,rep,name=planets,proto3\" json:\"planets,omitempty\"`\n}\n\nfunc (x *GetFilmReply) Reset() {\n\t*x = GetFilmReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_swapi_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetFilmReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetFilmReply) ProtoMessage() {}\n\nfunc (x *GetFilmReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_swapi_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetFilmReply.ProtoReflect.Descriptor instead.\nfunc (*GetFilmReply) Descriptor() ([]byte, []int) {\n\treturn file_swapi_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *GetFilmReply) GetFilm() *Film {\n\tif x != nil {\n\t\treturn x.Film\n\t}\n\treturn nil\n}\n\nfunc (x *GetFilmReply) GetSpecies() []*Species {\n\tif x != nil {\n\t\treturn x.Species\n\t}\n\treturn nil\n}\n\nfunc (x *GetFilmReply) GetStarships() []*Starship {\n\tif x != nil {\n\t\treturn x.Starships\n\t}\n\treturn nil\n}\n\nfunc (x *GetFilmReply) GetVehicles() []*Vehicle {\n\tif x != nil {\n\t\treturn x.Vehicles\n\t}\n\treturn nil\n}\n\nfunc (x *GetFilmReply) GetCharacters() []*Person {\n\tif x != nil {\n\t\treturn x.Characters\n\t}\n\treturn nil\n}\n\nfunc (x *GetFilmReply) GetPlanets() []*Planet {\n\tif x != nil {\n\t\treturn x.Planets\n\t}\n\treturn nil\n}\n\n// ListFilmsRequest.\ntype ListFilmsRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tIds []int64 `protobuf:\"varint,1,rep,packed,name=ids,proto3\" json:\"ids,omitempty\"`\n}\n\nfunc (x *ListFilmsRequest) Reset() {\n\t*x = ListFilmsRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_swapi_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListFilmsRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListFilmsRequest) ProtoMessage() {}\n\nfunc (x *ListFilmsRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_swapi_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListFilmsRequest.ProtoReflect.Descriptor instead.\nfunc (*ListFilmsRequest) Descriptor() ([]byte, []int) {\n\treturn file_swapi_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *ListFilmsRequest) GetIds() []int64 {\n\tif x != nil {\n\t\treturn x.Ids\n\t}\n\treturn nil\n}\n\n// ListFilmsReply.\ntype ListFilmsReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tFilms []*Film `protobuf:\"bytes,1,rep,name=films,proto3\" json:\"films,omitempty\"`\n}\n\nfunc (x *ListFilmsReply) Reset() {\n\t*x = ListFilmsReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_swapi_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListFilmsReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListFilmsReply) ProtoMessage() {}\n\nfunc (x *ListFilmsReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_swapi_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListFilmsReply.ProtoReflect.Descriptor instead.\nfunc (*ListFilmsReply) Descriptor() ([]byte, []int) {\n\treturn file_swapi_proto_rawDescGZIP(), []int{7}\n}\n\nfunc (x *ListFilmsReply) GetFilms() []*Film {\n\tif x != nil {\n\t\treturn x.Films\n\t}\n\treturn nil\n}\n\n// GetVehicleRequest.\ntype GetVehicleRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// vehicle id.\n\tId int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetVehicleRequest) Reset() {\n\t*x = GetVehicleRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_swapi_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetVehicleRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetVehicleRequest) ProtoMessage() {}\n\nfunc (x *GetVehicleRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_swapi_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetVehicleRequest.ProtoReflect.Descriptor instead.\nfunc (*GetVehicleRequest) Descriptor() ([]byte, []int) {\n\treturn file_swapi_proto_rawDescGZIP(), []int{8}\n}\n\nfunc (x *GetVehicleRequest) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\n// GetVehicleReply.\ntype GetVehicleReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tVehicle *Vehicle `protobuf:\"bytes,1,opt,name=vehicle,proto3\" json:\"vehicle,omitempty\"`\n\t// films.\n\tFilms []*Film `protobuf:\"bytes,2,rep,name=films,proto3\" json:\"films,omitempty\"`\n\t// pilots.\n\tPilots []*Person `protobuf:\"bytes,3,rep,name=pilots,proto3\" json:\"pilots,omitempty\"`\n}\n\nfunc (x *GetVehicleReply) Reset() {\n\t*x = GetVehicleReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_swapi_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetVehicleReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetVehicleReply) ProtoMessage() {}\n\nfunc (x *GetVehicleReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_swapi_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetVehicleReply.ProtoReflect.Descriptor instead.\nfunc (*GetVehicleReply) Descriptor() ([]byte, []int) {\n\treturn file_swapi_proto_rawDescGZIP(), []int{9}\n}\n\nfunc (x *GetVehicleReply) GetVehicle() *Vehicle {\n\tif x != nil {\n\t\treturn x.Vehicle\n\t}\n\treturn nil\n}\n\nfunc (x *GetVehicleReply) GetFilms() []*Film {\n\tif x != nil {\n\t\treturn x.Films\n\t}\n\treturn nil\n}\n\nfunc (x *GetVehicleReply) GetPilots() []*Person {\n\tif x != nil {\n\t\treturn x.Pilots\n\t}\n\treturn nil\n}\n\n// ListVehiclesRequest.\ntype ListVehiclesRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tIds []int64 `protobuf:\"varint,1,rep,packed,name=ids,proto3\" json:\"ids,omitempty\"`\n}\n\nfunc (x *ListVehiclesRequest) Reset() {\n\t*x = ListVehiclesRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_swapi_proto_msgTypes[10]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListVehiclesRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListVehiclesRequest) ProtoMessage() {}\n\nfunc (x *ListVehiclesRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_swapi_proto_msgTypes[10]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListVehiclesRequest.ProtoReflect.Descriptor instead.\nfunc (*ListVehiclesRequest) Descriptor() ([]byte, []int) {\n\treturn file_swapi_proto_rawDescGZIP(), []int{10}\n}\n\nfunc (x *ListVehiclesRequest) GetIds() []int64 {\n\tif x != nil {\n\t\treturn x.Ids\n\t}\n\treturn nil\n}\n\n// ListVehiclesReply.\ntype ListVehiclesReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tVehicles []*Vehicle `protobuf:\"bytes,1,rep,name=vehicles,proto3\" json:\"vehicles,omitempty\"`\n}\n\nfunc (x *ListVehiclesReply) Reset() {\n\t*x = ListVehiclesReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_swapi_proto_msgTypes[11]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListVehiclesReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListVehiclesReply) ProtoMessage() {}\n\nfunc (x *ListVehiclesReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_swapi_proto_msgTypes[11]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListVehiclesReply.ProtoReflect.Descriptor instead.\nfunc (*ListVehiclesReply) Descriptor() ([]byte, []int) {\n\treturn file_swapi_proto_rawDescGZIP(), []int{11}\n}\n\nfunc (x *ListVehiclesReply) GetVehicles() []*Vehicle {\n\tif x != nil {\n\t\treturn x.Vehicles\n\t}\n\treturn nil\n}\n\n// GetSpeciesRequest.\ntype GetSpeciesRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// species id.\n\tId int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetSpeciesRequest) Reset() {\n\t*x = GetSpeciesRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_swapi_proto_msgTypes[12]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetSpeciesRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetSpeciesRequest) ProtoMessage() {}\n\nfunc (x *GetSpeciesRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_swapi_proto_msgTypes[12]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetSpeciesRequest.ProtoReflect.Descriptor instead.\nfunc (*GetSpeciesRequest) Descriptor() ([]byte, []int) {\n\treturn file_swapi_proto_rawDescGZIP(), []int{12}\n}\n\nfunc (x *GetSpeciesRequest) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\n// GetSpeciesReply.\ntype GetSpeciesReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tSpecies *Species `protobuf:\"bytes,1,opt,name=species,proto3\" json:\"species,omitempty\"`\n\t// people.\n\tPeople []*Person `protobuf:\"bytes,2,rep,name=people,proto3\" json:\"people,omitempty\"`\n\t// films.\n\tFilms []*Film `protobuf:\"bytes,3,rep,name=films,proto3\" json:\"films,omitempty\"`\n}\n\nfunc (x *GetSpeciesReply) Reset() {\n\t*x = GetSpeciesReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_swapi_proto_msgTypes[13]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetSpeciesReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetSpeciesReply) ProtoMessage() {}\n\nfunc (x *GetSpeciesReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_swapi_proto_msgTypes[13]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetSpeciesReply.ProtoReflect.Descriptor instead.\nfunc (*GetSpeciesReply) Descriptor() ([]byte, []int) {\n\treturn file_swapi_proto_rawDescGZIP(), []int{13}\n}\n\nfunc (x *GetSpeciesReply) GetSpecies() *Species {\n\tif x != nil {\n\t\treturn x.Species\n\t}\n\treturn nil\n}\n\nfunc (x *GetSpeciesReply) GetPeople() []*Person {\n\tif x != nil {\n\t\treturn x.People\n\t}\n\treturn nil\n}\n\nfunc (x *GetSpeciesReply) GetFilms() []*Film {\n\tif x != nil {\n\t\treturn x.Films\n\t}\n\treturn nil\n}\n\n// ListSpeciesRequest.\ntype ListSpeciesRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tIds []int64 `protobuf:\"varint,1,rep,packed,name=ids,proto3\" json:\"ids,omitempty\"`\n}\n\nfunc (x *ListSpeciesRequest) Reset() {\n\t*x = ListSpeciesRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_swapi_proto_msgTypes[14]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListSpeciesRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListSpeciesRequest) ProtoMessage() {}\n\nfunc (x *ListSpeciesRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_swapi_proto_msgTypes[14]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListSpeciesRequest.ProtoReflect.Descriptor instead.\nfunc (*ListSpeciesRequest) Descriptor() ([]byte, []int) {\n\treturn file_swapi_proto_rawDescGZIP(), []int{14}\n}\n\nfunc (x *ListSpeciesRequest) GetIds() []int64 {\n\tif x != nil {\n\t\treturn x.Ids\n\t}\n\treturn nil\n}\n\n// ListSpeciesReply.\ntype ListSpeciesReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tSpecies []*Species `protobuf:\"bytes,1,rep,name=species,proto3\" json:\"species,omitempty\"`\n}\n\nfunc (x *ListSpeciesReply) Reset() {\n\t*x = ListSpeciesReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_swapi_proto_msgTypes[15]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListSpeciesReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListSpeciesReply) ProtoMessage() {}\n\nfunc (x *ListSpeciesReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_swapi_proto_msgTypes[15]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListSpeciesReply.ProtoReflect.Descriptor instead.\nfunc (*ListSpeciesReply) Descriptor() ([]byte, []int) {\n\treturn file_swapi_proto_rawDescGZIP(), []int{15}\n}\n\nfunc (x *ListSpeciesReply) GetSpecies() []*Species {\n\tif x != nil {\n\t\treturn x.Species\n\t}\n\treturn nil\n}\n\n// GetStarshipRequest.\ntype GetStarshipRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// starship id.\n\tId int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetStarshipRequest) Reset() {\n\t*x = GetStarshipRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_swapi_proto_msgTypes[16]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetStarshipRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetStarshipRequest) ProtoMessage() {}\n\nfunc (x *GetStarshipRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_swapi_proto_msgTypes[16]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetStarshipRequest.ProtoReflect.Descriptor instead.\nfunc (*GetStarshipRequest) Descriptor() ([]byte, []int) {\n\treturn file_swapi_proto_rawDescGZIP(), []int{16}\n}\n\nfunc (x *GetStarshipRequest) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\n// GetStarshipReply.\ntype GetStarshipReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tStarship *Starship `protobuf:\"bytes,1,opt,name=starship,proto3\" json:\"starship,omitempty\"`\n\t// films.\n\tFilms []*Film `protobuf:\"bytes,2,rep,name=films,proto3\" json:\"films,omitempty\"`\n\t// pilots.\n\tPilots []*Person `protobuf:\"bytes,3,rep,name=pilots,proto3\" json:\"pilots,omitempty\"`\n}\n\nfunc (x *GetStarshipReply) Reset() {\n\t*x = GetStarshipReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_swapi_proto_msgTypes[17]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetStarshipReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetStarshipReply) ProtoMessage() {}\n\nfunc (x *GetStarshipReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_swapi_proto_msgTypes[17]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetStarshipReply.ProtoReflect.Descriptor instead.\nfunc (*GetStarshipReply) Descriptor() ([]byte, []int) {\n\treturn file_swapi_proto_rawDescGZIP(), []int{17}\n}\n\nfunc (x *GetStarshipReply) GetStarship() *Starship {\n\tif x != nil {\n\t\treturn x.Starship\n\t}\n\treturn nil\n}\n\nfunc (x *GetStarshipReply) GetFilms() []*Film {\n\tif x != nil {\n\t\treturn x.Films\n\t}\n\treturn nil\n}\n\nfunc (x *GetStarshipReply) GetPilots() []*Person {\n\tif x != nil {\n\t\treturn x.Pilots\n\t}\n\treturn nil\n}\n\n// ListStarshipsRequest.\ntype ListStarshipsRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tIds []int64 `protobuf:\"varint,1,rep,packed,name=ids,proto3\" json:\"ids,omitempty\"`\n}\n\nfunc (x *ListStarshipsRequest) Reset() {\n\t*x = ListStarshipsRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_swapi_proto_msgTypes[18]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListStarshipsRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListStarshipsRequest) ProtoMessage() {}\n\nfunc (x *ListStarshipsRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_swapi_proto_msgTypes[18]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListStarshipsRequest.ProtoReflect.Descriptor instead.\nfunc (*ListStarshipsRequest) Descriptor() ([]byte, []int) {\n\treturn file_swapi_proto_rawDescGZIP(), []int{18}\n}\n\nfunc (x *ListStarshipsRequest) GetIds() []int64 {\n\tif x != nil {\n\t\treturn x.Ids\n\t}\n\treturn nil\n}\n\n// ListStarshipsReply.\ntype ListStarshipsReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tStarships []*Starship `protobuf:\"bytes,1,rep,name=starships,proto3\" json:\"starships,omitempty\"`\n}\n\nfunc (x *ListStarshipsReply) Reset() {\n\t*x = ListStarshipsReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_swapi_proto_msgTypes[19]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListStarshipsReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListStarshipsReply) ProtoMessage() {}\n\nfunc (x *ListStarshipsReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_swapi_proto_msgTypes[19]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListStarshipsReply.ProtoReflect.Descriptor instead.\nfunc (*ListStarshipsReply) Descriptor() ([]byte, []int) {\n\treturn file_swapi_proto_rawDescGZIP(), []int{19}\n}\n\nfunc (x *ListStarshipsReply) GetStarships() []*Starship {\n\tif x != nil {\n\t\treturn x.Starships\n\t}\n\treturn nil\n}\n\n// GetPlanetRequest.\ntype GetPlanetRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// planet id.\n\tId int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetPlanetRequest) Reset() {\n\t*x = GetPlanetRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_swapi_proto_msgTypes[20]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPlanetRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPlanetRequest) ProtoMessage() {}\n\nfunc (x *GetPlanetRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_swapi_proto_msgTypes[20]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPlanetRequest.ProtoReflect.Descriptor instead.\nfunc (*GetPlanetRequest) Descriptor() ([]byte, []int) {\n\treturn file_swapi_proto_rawDescGZIP(), []int{20}\n}\n\nfunc (x *GetPlanetRequest) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\n// GetPlanetReply.\ntype GetPlanetReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPlanet *Planet `protobuf:\"bytes,1,opt,name=planet,proto3\" json:\"planet,omitempty\"`\n\t// the people that live on this planet.\n\tResidents []*Person `protobuf:\"bytes,2,rep,name=residents,proto3\" json:\"residents,omitempty\"`\n\t// films.\n\tFilms []*Film `protobuf:\"bytes,3,rep,name=films,proto3\" json:\"films,omitempty\"`\n}\n\nfunc (x *GetPlanetReply) Reset() {\n\t*x = GetPlanetReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_swapi_proto_msgTypes[21]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetPlanetReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPlanetReply) ProtoMessage() {}\n\nfunc (x *GetPlanetReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_swapi_proto_msgTypes[21]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPlanetReply.ProtoReflect.Descriptor instead.\nfunc (*GetPlanetReply) Descriptor() ([]byte, []int) {\n\treturn file_swapi_proto_rawDescGZIP(), []int{21}\n}\n\nfunc (x *GetPlanetReply) GetPlanet() *Planet {\n\tif x != nil {\n\t\treturn x.Planet\n\t}\n\treturn nil\n}\n\nfunc (x *GetPlanetReply) GetResidents() []*Person {\n\tif x != nil {\n\t\treturn x.Residents\n\t}\n\treturn nil\n}\n\nfunc (x *GetPlanetReply) GetFilms() []*Film {\n\tif x != nil {\n\t\treturn x.Films\n\t}\n\treturn nil\n}\n\n// ListPlanetsRequest.\ntype ListPlanetsRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tIds []int64 `protobuf:\"varint,1,rep,packed,name=ids,proto3\" json:\"ids,omitempty\"`\n}\n\nfunc (x *ListPlanetsRequest) Reset() {\n\t*x = ListPlanetsRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_swapi_proto_msgTypes[22]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListPlanetsRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListPlanetsRequest) ProtoMessage() {}\n\nfunc (x *ListPlanetsRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_swapi_proto_msgTypes[22]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListPlanetsRequest.ProtoReflect.Descriptor instead.\nfunc (*ListPlanetsRequest) Descriptor() ([]byte, []int) {\n\treturn file_swapi_proto_rawDescGZIP(), []int{22}\n}\n\nfunc (x *ListPlanetsRequest) GetIds() []int64 {\n\tif x != nil {\n\t\treturn x.Ids\n\t}\n\treturn nil\n}\n\n// ListPlanetsReply.\ntype ListPlanetsReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPlanets []*Planet `protobuf:\"bytes,1,rep,name=planets,proto3\" json:\"planets,omitempty\"`\n}\n\nfunc (x *ListPlanetsReply) Reset() {\n\t*x = ListPlanetsReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_swapi_proto_msgTypes[23]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListPlanetsReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListPlanetsReply) ProtoMessage() {}\n\nfunc (x *ListPlanetsReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_swapi_proto_msgTypes[23]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListPlanetsReply.ProtoReflect.Descriptor instead.\nfunc (*ListPlanetsReply) Descriptor() ([]byte, []int) {\n\treturn file_swapi_proto_rawDescGZIP(), []int{23}\n}\n\nfunc (x *ListPlanetsReply) GetPlanets() []*Planet {\n\tif x != nil {\n\t\treturn x.Planets\n\t}\n\treturn nil\n}\n\n// Person is an individual person or character within the Star Wars universe.\ntype Person struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// person id.\n\tId int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\t// The name of this person.\n\tName string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// The birth year of the person,\n\t// using the in-universe standard of BBY or ABY\n\t// - Before the Battle of Yavin or After the Battle of Yavin.\n\t// The Battle of Yavin is a battle that occurs at the end of Star Wars episode IV: A New Hope.\n\tBirthYear string `protobuf:\"bytes,3,opt,name=birth_year,json=birthYear,proto3\" json:\"birth_year,omitempty\"`\n\t// The eye color of this person.\n\t// Will be \"unknown\" if not known or \"n/a\" if the person does not have an eye.\n\tEyeColor string `protobuf:\"bytes,4,opt,name=eye_color,json=eyeColor,proto3\" json:\"eye_color,omitempty\"`\n\t// The gender of this person.\n\t// Either \"Male\", \"Female\" or \"unknown\", \"n/a\" if the person does not have a gender.\n\tGender string `protobuf:\"bytes,5,opt,name=gender,proto3\" json:\"gender,omitempty\"`\n\t// The hair color of this person.\n\t// Will be \"unknown\" if not known or \"n/a\" if the person does not have hair.\n\tHairColor string `protobuf:\"bytes,6,opt,name=hair_color,json=hairColor,proto3\" json:\"hair_color,omitempty\"`\n\t// The height of the person in centimeters.\n\tHeight string `protobuf:\"bytes,7,opt,name=height,proto3\" json:\"height,omitempty\"`\n\t// The mass of the person in kilograms.\n\tMass string `protobuf:\"bytes,8,opt,name=mass,proto3\" json:\"mass,omitempty\"`\n\t// The skin color of this person.\n\tSkinColor string `protobuf:\"bytes,9,opt,name=skin_color,json=skinColor,proto3\" json:\"skin_color,omitempty\"`\n\t// The URL of a planet resource, a planet that this person was born on or inhabits.\n\tHomeworld string `protobuf:\"bytes,10,opt,name=homeworld,proto3\" json:\"homeworld,omitempty\"`\n\t// the hypermedia URL of this resource.\n\tUrl string `protobuf:\"bytes,11,opt,name=url,proto3\" json:\"url,omitempty\"`\n\t// the ISO 8601 date format of the time that this resource was created.\n\tCreated string `protobuf:\"bytes,12,opt,name=created,proto3\" json:\"created,omitempty\"`\n\t// the ISO 8601 date format of the time that this resource was edited.\n\tEdited string `protobuf:\"bytes,13,opt,name=edited,proto3\" json:\"edited,omitempty\"`\n\t// film ids.\n\tFilmIds []int64 `protobuf:\"varint,14,rep,packed,name=film_ids,json=filmIds,proto3\" json:\"film_ids,omitempty\"`\n\t// species ids.\n\tSpeciesIds []int64 `protobuf:\"varint,15,rep,packed,name=species_ids,json=speciesIds,proto3\" json:\"species_ids,omitempty\"`\n\t// starship ids.\n\tStarshipIds []int64 `protobuf:\"varint,16,rep,packed,name=starship_ids,json=starshipIds,proto3\" json:\"starship_ids,omitempty\"`\n\t// vehicle ids.\n\tVehicleIds []int64 `protobuf:\"varint,17,rep,packed,name=vehicle_ids,json=vehicleIds,proto3\" json:\"vehicle_ids,omitempty\"`\n}\n\nfunc (x *Person) Reset() {\n\t*x = Person{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_swapi_proto_msgTypes[24]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Person) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Person) ProtoMessage() {}\n\nfunc (x *Person) ProtoReflect() protoreflect.Message {\n\tmi := &file_swapi_proto_msgTypes[24]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Person.ProtoReflect.Descriptor instead.\nfunc (*Person) Descriptor() ([]byte, []int) {\n\treturn file_swapi_proto_rawDescGZIP(), []int{24}\n}\n\nfunc (x *Person) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *Person) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Person) GetBirthYear() string {\n\tif x != nil {\n\t\treturn x.BirthYear\n\t}\n\treturn \"\"\n}\n\nfunc (x *Person) GetEyeColor() string {\n\tif x != nil {\n\t\treturn x.EyeColor\n\t}\n\treturn \"\"\n}\n\nfunc (x *Person) GetGender() string {\n\tif x != nil {\n\t\treturn x.Gender\n\t}\n\treturn \"\"\n}\n\nfunc (x *Person) GetHairColor() string {\n\tif x != nil {\n\t\treturn x.HairColor\n\t}\n\treturn \"\"\n}\n\nfunc (x *Person) GetHeight() string {\n\tif x != nil {\n\t\treturn x.Height\n\t}\n\treturn \"\"\n}\n\nfunc (x *Person) GetMass() string {\n\tif x != nil {\n\t\treturn x.Mass\n\t}\n\treturn \"\"\n}\n\nfunc (x *Person) GetSkinColor() string {\n\tif x != nil {\n\t\treturn x.SkinColor\n\t}\n\treturn \"\"\n}\n\nfunc (x *Person) GetHomeworld() string {\n\tif x != nil {\n\t\treturn x.Homeworld\n\t}\n\treturn \"\"\n}\n\nfunc (x *Person) GetUrl() string {\n\tif x != nil {\n\t\treturn x.Url\n\t}\n\treturn \"\"\n}\n\nfunc (x *Person) GetCreated() string {\n\tif x != nil {\n\t\treturn x.Created\n\t}\n\treturn \"\"\n}\n\nfunc (x *Person) GetEdited() string {\n\tif x != nil {\n\t\treturn x.Edited\n\t}\n\treturn \"\"\n}\n\nfunc (x *Person) GetFilmIds() []int64 {\n\tif x != nil {\n\t\treturn x.FilmIds\n\t}\n\treturn nil\n}\n\nfunc (x *Person) GetSpeciesIds() []int64 {\n\tif x != nil {\n\t\treturn x.SpeciesIds\n\t}\n\treturn nil\n}\n\nfunc (x *Person) GetStarshipIds() []int64 {\n\tif x != nil {\n\t\treturn x.StarshipIds\n\t}\n\treturn nil\n}\n\nfunc (x *Person) GetVehicleIds() []int64 {\n\tif x != nil {\n\t\treturn x.VehicleIds\n\t}\n\treturn nil\n}\n\ntype People struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPeople []*Person `protobuf:\"bytes,1,rep,name=people,proto3\" json:\"people,omitempty\"`\n}\n\nfunc (x *People) Reset() {\n\t*x = People{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_swapi_proto_msgTypes[25]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *People) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*People) ProtoMessage() {}\n\nfunc (x *People) ProtoReflect() protoreflect.Message {\n\tmi := &file_swapi_proto_msgTypes[25]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use People.ProtoReflect.Descriptor instead.\nfunc (*People) Descriptor() ([]byte, []int) {\n\treturn file_swapi_proto_rawDescGZIP(), []int{25}\n}\n\nfunc (x *People) GetPeople() []*Person {\n\tif x != nil {\n\t\treturn x.People\n\t}\n\treturn nil\n}\n\n// Film is a single film.\ntype Film struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// film id.\n\tId int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\t// The title of this film.\n\tTitle string `protobuf:\"bytes,2,opt,name=title,proto3\" json:\"title,omitempty\"`\n\t// The episode number of this film.\n\tEpisodeId int32 `protobuf:\"varint,3,opt,name=episode_id,json=episodeId,proto3\" json:\"episode_id,omitempty\"`\n\t// The opening paragraphs at the beginning of this film.\n\tOpeningCrawl string `protobuf:\"bytes,4,opt,name=opening_crawl,json=openingCrawl,proto3\" json:\"opening_crawl,omitempty\"`\n\t// The name of the director of this film.\n\tDirector string `protobuf:\"bytes,5,opt,name=director,proto3\" json:\"director,omitempty\"`\n\t// The name(s) of the producer(s) of this film. Comma separated.\n\tProducer string `protobuf:\"bytes,6,opt,name=producer,proto3\" json:\"producer,omitempty\"`\n\t// The ISO 8601 date format of film release at original creator country.\n\tReleaseDate *date.Date `protobuf:\"bytes,7,opt,name=release_date,json=releaseDate,proto3\" json:\"release_date,omitempty\"`\n\t// the hypermedia URL of this resource.\n\tUrl string `protobuf:\"bytes,8,opt,name=url,proto3\" json:\"url,omitempty\"`\n\t// the ISO 8601 date format of the time that this resource was created.\n\tCreated string `protobuf:\"bytes,9,opt,name=created,proto3\" json:\"created,omitempty\"`\n\t// the ISO 8601 date format of the time that this resource was edited.\n\tEdited string `protobuf:\"bytes,10,opt,name=edited,proto3\" json:\"edited,omitempty\"`\n\t// species ids.\n\tSpeciesIds []int64 `protobuf:\"varint,11,rep,packed,name=species_ids,json=speciesIds,proto3\" json:\"species_ids,omitempty\"`\n\t// starship ids.\n\tStarshipIds []int64 `protobuf:\"varint,12,rep,packed,name=starship_ids,json=starshipIds,proto3\" json:\"starship_ids,omitempty\"`\n\t// vehicle ids.\n\tVehicleIds []int64 `protobuf:\"varint,13,rep,packed,name=vehicle_ids,json=vehicleIds,proto3\" json:\"vehicle_ids,omitempty\"`\n\t// character ids.\n\tCharacterIds []int64 `protobuf:\"varint,14,rep,packed,name=character_ids,json=characterIds,proto3\" json:\"character_ids,omitempty\"`\n\t// planet ids.\n\tPlanetIds []int64 `protobuf:\"varint,15,rep,packed,name=planet_ids,json=planetIds,proto3\" json:\"planet_ids,omitempty\"`\n}\n\nfunc (x *Film) Reset() {\n\t*x = Film{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_swapi_proto_msgTypes[26]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Film) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Film) ProtoMessage() {}\n\nfunc (x *Film) ProtoReflect() protoreflect.Message {\n\tmi := &file_swapi_proto_msgTypes[26]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Film.ProtoReflect.Descriptor instead.\nfunc (*Film) Descriptor() ([]byte, []int) {\n\treturn file_swapi_proto_rawDescGZIP(), []int{26}\n}\n\nfunc (x *Film) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *Film) GetTitle() string {\n\tif x != nil {\n\t\treturn x.Title\n\t}\n\treturn \"\"\n}\n\nfunc (x *Film) GetEpisodeId() int32 {\n\tif x != nil {\n\t\treturn x.EpisodeId\n\t}\n\treturn 0\n}\n\nfunc (x *Film) GetOpeningCrawl() string {\n\tif x != nil {\n\t\treturn x.OpeningCrawl\n\t}\n\treturn \"\"\n}\n\nfunc (x *Film) GetDirector() string {\n\tif x != nil {\n\t\treturn x.Director\n\t}\n\treturn \"\"\n}\n\nfunc (x *Film) GetProducer() string {\n\tif x != nil {\n\t\treturn x.Producer\n\t}\n\treturn \"\"\n}\n\nfunc (x *Film) GetReleaseDate() *date.Date {\n\tif x != nil {\n\t\treturn x.ReleaseDate\n\t}\n\treturn nil\n}\n\nfunc (x *Film) GetUrl() string {\n\tif x != nil {\n\t\treturn x.Url\n\t}\n\treturn \"\"\n}\n\nfunc (x *Film) GetCreated() string {\n\tif x != nil {\n\t\treturn x.Created\n\t}\n\treturn \"\"\n}\n\nfunc (x *Film) GetEdited() string {\n\tif x != nil {\n\t\treturn x.Edited\n\t}\n\treturn \"\"\n}\n\nfunc (x *Film) GetSpeciesIds() []int64 {\n\tif x != nil {\n\t\treturn x.SpeciesIds\n\t}\n\treturn nil\n}\n\nfunc (x *Film) GetStarshipIds() []int64 {\n\tif x != nil {\n\t\treturn x.StarshipIds\n\t}\n\treturn nil\n}\n\nfunc (x *Film) GetVehicleIds() []int64 {\n\tif x != nil {\n\t\treturn x.VehicleIds\n\t}\n\treturn nil\n}\n\nfunc (x *Film) GetCharacterIds() []int64 {\n\tif x != nil {\n\t\treturn x.CharacterIds\n\t}\n\treturn nil\n}\n\nfunc (x *Film) GetPlanetIds() []int64 {\n\tif x != nil {\n\t\treturn x.PlanetIds\n\t}\n\treturn nil\n}\n\ntype Films struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tFilms []*Film `protobuf:\"bytes,1,rep,name=films,proto3\" json:\"films,omitempty\"`\n}\n\nfunc (x *Films) Reset() {\n\t*x = Films{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_swapi_proto_msgTypes[27]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Films) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Films) ProtoMessage() {}\n\nfunc (x *Films) ProtoReflect() protoreflect.Message {\n\tmi := &file_swapi_proto_msgTypes[27]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Films.ProtoReflect.Descriptor instead.\nfunc (*Films) Descriptor() ([]byte, []int) {\n\treturn file_swapi_proto_rawDescGZIP(), []int{27}\n}\n\nfunc (x *Films) GetFilms() []*Film {\n\tif x != nil {\n\t\treturn x.Films\n\t}\n\treturn nil\n}\n\n// Starship is a single transport craft that has hyperdrive capability.\ntype Starship struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// starship id.\n\tId int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\t// The name of this starship. The common name, such as \"Death Star\".\n\tName string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// The model or official name of this starship.\n\t// Such as \"T-65 X-wing\" or \"DS-1 Orbital Battle Station\".\n\tModel string `protobuf:\"bytes,3,opt,name=model,proto3\" json:\"model,omitempty\"`\n\t// The class of this starship, such as \"Starfighter\" or \"Deep Space Mobile Battlestation\".\n\tStarshipClass string `protobuf:\"bytes,4,opt,name=starship_class,json=starshipClass,proto3\" json:\"starship_class,omitempty\"`\n\t// The manufacturer of this starship. Comma separated if more than one.\n\tManufacturer string `protobuf:\"bytes,5,opt,name=manufacturer,proto3\" json:\"manufacturer,omitempty\"`\n\t// The cost of this starship new, in galactic credits.\n\tCostInCredits string `protobuf:\"bytes,6,opt,name=cost_in_credits,json=costInCredits,proto3\" json:\"cost_in_credits,omitempty\"`\n\t// The length of this starship in meters.\n\tLength string `protobuf:\"bytes,7,opt,name=length,proto3\" json:\"length,omitempty\"`\n\t// The number of personnel needed to run or pilot this starship.\n\tCrew string `protobuf:\"bytes,8,opt,name=crew,proto3\" json:\"crew,omitempty\"`\n\t// The number of non-essential people this starship can transport.\n\tPassengers string `protobuf:\"bytes,9,opt,name=passengers,proto3\" json:\"passengers,omitempty\"`\n\t// The maximum speed of this starship in the atmosphere.\n\t// \"N/A\" if this starship is incapable of atmospheric flight.\n\tMaxAtmospheringSpeed string `protobuf:\"bytes,10,opt,name=max_atmosphering_speed,json=maxAtmospheringSpeed,proto3\" json:\"max_atmosphering_speed,omitempty\"`\n\t// The class of this starships hyperdrive.\n\tHyperdriveRating string `protobuf:\"bytes,11,opt,name=hyperdrive_rating,json=hyperdriveRating,proto3\" json:\"hyperdrive_rating,omitempty\"`\n\t// The Maximum number of Megalights this starship can travel in a standard hour.\n\t// A \"Megalight\" is a standard unit of distance and has never been defined before within the Star Wars universe.\n\t// This figure is only really useful for measuring the difference in speed of starships.\n\t// We can assume it is similar to AU, the distance between our Sun (Sol) and Earth.\n\tMglt string `protobuf:\"bytes,12,opt,name=mglt,proto3\" json:\"mglt,omitempty\"`\n\t// The maximum number of kilograms that this starship can transport.\n\tCargoCapacity string `protobuf:\"bytes,13,opt,name=cargo_capacity,json=cargoCapacity,proto3\" json:\"cargo_capacity,omitempty\"`\n\t// The maximum length of time that this starship can provide consumables for its entire crew without having to resupply.\n\tConsumables string `protobuf:\"bytes,14,opt,name=consumables,proto3\" json:\"consumables,omitempty\"`\n\t// the hypermedia URL of this resource.\n\tUrl string `protobuf:\"bytes,15,opt,name=url,proto3\" json:\"url,omitempty\"`\n\t// the ISO 8601 date format of the time that this resource was created.\n\tCreated string `protobuf:\"bytes,16,opt,name=created,proto3\" json:\"created,omitempty\"`\n\t// the ISO 8601 date format of the time that this resource was edited.\n\tEdited string `protobuf:\"bytes,17,opt,name=edited,proto3\" json:\"edited,omitempty\"`\n\t// film ids.\n\tFilmIds []int64 `protobuf:\"varint,18,rep,packed,name=film_ids,json=filmIds,proto3\" json:\"film_ids,omitempty\"`\n\t// pilot ids.\n\tPilotIds []int64 `protobuf:\"varint,19,rep,packed,name=pilot_ids,json=pilotIds,proto3\" json:\"pilot_ids,omitempty\"`\n}\n\nfunc (x *Starship) Reset() {\n\t*x = Starship{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_swapi_proto_msgTypes[28]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Starship) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Starship) ProtoMessage() {}\n\nfunc (x *Starship) ProtoReflect() protoreflect.Message {\n\tmi := &file_swapi_proto_msgTypes[28]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Starship.ProtoReflect.Descriptor instead.\nfunc (*Starship) Descriptor() ([]byte, []int) {\n\treturn file_swapi_proto_rawDescGZIP(), []int{28}\n}\n\nfunc (x *Starship) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *Starship) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Starship) GetModel() string {\n\tif x != nil {\n\t\treturn x.Model\n\t}\n\treturn \"\"\n}\n\nfunc (x *Starship) GetStarshipClass() string {\n\tif x != nil {\n\t\treturn x.StarshipClass\n\t}\n\treturn \"\"\n}\n\nfunc (x *Starship) GetManufacturer() string {\n\tif x != nil {\n\t\treturn x.Manufacturer\n\t}\n\treturn \"\"\n}\n\nfunc (x *Starship) GetCostInCredits() string {\n\tif x != nil {\n\t\treturn x.CostInCredits\n\t}\n\treturn \"\"\n}\n\nfunc (x *Starship) GetLength() string {\n\tif x != nil {\n\t\treturn x.Length\n\t}\n\treturn \"\"\n}\n\nfunc (x *Starship) GetCrew() string {\n\tif x != nil {\n\t\treturn x.Crew\n\t}\n\treturn \"\"\n}\n\nfunc (x *Starship) GetPassengers() string {\n\tif x != nil {\n\t\treturn x.Passengers\n\t}\n\treturn \"\"\n}\n\nfunc (x *Starship) GetMaxAtmospheringSpeed() string {\n\tif x != nil {\n\t\treturn x.MaxAtmospheringSpeed\n\t}\n\treturn \"\"\n}\n\nfunc (x *Starship) GetHyperdriveRating() string {\n\tif x != nil {\n\t\treturn x.HyperdriveRating\n\t}\n\treturn \"\"\n}\n\nfunc (x *Starship) GetMglt() string {\n\tif x != nil {\n\t\treturn x.Mglt\n\t}\n\treturn \"\"\n}\n\nfunc (x *Starship) GetCargoCapacity() string {\n\tif x != nil {\n\t\treturn x.CargoCapacity\n\t}\n\treturn \"\"\n}\n\nfunc (x *Starship) GetConsumables() string {\n\tif x != nil {\n\t\treturn x.Consumables\n\t}\n\treturn \"\"\n}\n\nfunc (x *Starship) GetUrl() string {\n\tif x != nil {\n\t\treturn x.Url\n\t}\n\treturn \"\"\n}\n\nfunc (x *Starship) GetCreated() string {\n\tif x != nil {\n\t\treturn x.Created\n\t}\n\treturn \"\"\n}\n\nfunc (x *Starship) GetEdited() string {\n\tif x != nil {\n\t\treturn x.Edited\n\t}\n\treturn \"\"\n}\n\nfunc (x *Starship) GetFilmIds() []int64 {\n\tif x != nil {\n\t\treturn x.FilmIds\n\t}\n\treturn nil\n}\n\nfunc (x *Starship) GetPilotIds() []int64 {\n\tif x != nil {\n\t\treturn x.PilotIds\n\t}\n\treturn nil\n}\n\ntype Starships struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tStarships []*Starship `protobuf:\"bytes,1,rep,name=starships,proto3\" json:\"starships,omitempty\"`\n}\n\nfunc (x *Starships) Reset() {\n\t*x = Starships{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_swapi_proto_msgTypes[29]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Starships) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Starships) ProtoMessage() {}\n\nfunc (x *Starships) ProtoReflect() protoreflect.Message {\n\tmi := &file_swapi_proto_msgTypes[29]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Starships.ProtoReflect.Descriptor instead.\nfunc (*Starships) Descriptor() ([]byte, []int) {\n\treturn file_swapi_proto_rawDescGZIP(), []int{29}\n}\n\nfunc (x *Starships) GetStarships() []*Starship {\n\tif x != nil {\n\t\treturn x.Starships\n\t}\n\treturn nil\n}\n\n// Vehicle is a single transport craft that does not have hyperdrive capability..\ntype Vehicle struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// vehicle id.\n\tId int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\t// The name of this vehicle. The common name, such as \"Sand Crawler\" or \"Speeder bike\".\n\tName string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// The model or official name of this vehicle. Such as \"All-Terrain Attack Transport\".\n\tModel string `protobuf:\"bytes,3,opt,name=model,proto3\" json:\"model,omitempty\"`\n\t// The class of this vehicle, such as \"Wheeled\" or \"Repulsorcraft\".\n\tVehicleClass string `protobuf:\"bytes,4,opt,name=vehicle_class,json=vehicleClass,proto3\" json:\"vehicle_class,omitempty\"`\n\t// The manufacturer of this vehicle. Comma separated if more than one.\n\tManufacturer string `protobuf:\"bytes,5,opt,name=manufacturer,proto3\" json:\"manufacturer,omitempty\"`\n\t// The length of this vehicle in meters.\n\tLength string `protobuf:\"bytes,6,opt,name=length,proto3\" json:\"length,omitempty\"`\n\t// The cost of this vehicle new, in Galactic Credits.\n\tCostInCredits string `protobuf:\"bytes,7,opt,name=cost_in_credits,json=costInCredits,proto3\" json:\"cost_in_credits,omitempty\"`\n\t// The number of personnel needed to run or pilot this vehicle.\n\tCrew string `protobuf:\"bytes,8,opt,name=crew,proto3\" json:\"crew,omitempty\"`\n\t// The number of non-essential people this vehicle can transport.\n\tPassengers string `protobuf:\"bytes,9,opt,name=passengers,proto3\" json:\"passengers,omitempty\"`\n\t// The maximum speed of this vehicle in the atmosphere.\n\tMaxAtmospheringSpeed string `protobuf:\"bytes,10,opt,name=max_atmosphering_speed,json=maxAtmospheringSpeed,proto3\" json:\"max_atmosphering_speed,omitempty\"`\n\t// The maximum number of kilograms that this vehicle can transport.\n\tCargoCapacity string `protobuf:\"bytes,11,opt,name=cargo_capacity,json=cargoCapacity,proto3\" json:\"cargo_capacity,omitempty\"`\n\t// The maximum length of time that this vehicle can provide consumables for its entire crew without having to resupply.\n\tConsumables string `protobuf:\"bytes,12,opt,name=consumables,proto3\" json:\"consumables,omitempty\"`\n\t// the hypermedia URL of this resource.\n\tUrl string `protobuf:\"bytes,13,opt,name=url,proto3\" json:\"url,omitempty\"`\n\t// the ISO 8601 date format of the time that this resource was created.\n\tCreated string `protobuf:\"bytes,14,opt,name=created,proto3\" json:\"created,omitempty\"`\n\t// the ISO 8601 date format of the time that this resource was edited.\n\tEdited string `protobuf:\"bytes,15,opt,name=edited,proto3\" json:\"edited,omitempty\"`\n\t// film ids.\n\tFilmIds []int64 `protobuf:\"varint,16,rep,packed,name=film_ids,json=filmIds,proto3\" json:\"film_ids,omitempty\"`\n\t// pilot ids.\n\tPilotIds []int64 `protobuf:\"varint,17,rep,packed,name=pilot_ids,json=pilotIds,proto3\" json:\"pilot_ids,omitempty\"`\n}\n\nfunc (x *Vehicle) Reset() {\n\t*x = Vehicle{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_swapi_proto_msgTypes[30]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Vehicle) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Vehicle) ProtoMessage() {}\n\nfunc (x *Vehicle) ProtoReflect() protoreflect.Message {\n\tmi := &file_swapi_proto_msgTypes[30]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Vehicle.ProtoReflect.Descriptor instead.\nfunc (*Vehicle) Descriptor() ([]byte, []int) {\n\treturn file_swapi_proto_rawDescGZIP(), []int{30}\n}\n\nfunc (x *Vehicle) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *Vehicle) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Vehicle) GetModel() string {\n\tif x != nil {\n\t\treturn x.Model\n\t}\n\treturn \"\"\n}\n\nfunc (x *Vehicle) GetVehicleClass() string {\n\tif x != nil {\n\t\treturn x.VehicleClass\n\t}\n\treturn \"\"\n}\n\nfunc (x *Vehicle) GetManufacturer() string {\n\tif x != nil {\n\t\treturn x.Manufacturer\n\t}\n\treturn \"\"\n}\n\nfunc (x *Vehicle) GetLength() string {\n\tif x != nil {\n\t\treturn x.Length\n\t}\n\treturn \"\"\n}\n\nfunc (x *Vehicle) GetCostInCredits() string {\n\tif x != nil {\n\t\treturn x.CostInCredits\n\t}\n\treturn \"\"\n}\n\nfunc (x *Vehicle) GetCrew() string {\n\tif x != nil {\n\t\treturn x.Crew\n\t}\n\treturn \"\"\n}\n\nfunc (x *Vehicle) GetPassengers() string {\n\tif x != nil {\n\t\treturn x.Passengers\n\t}\n\treturn \"\"\n}\n\nfunc (x *Vehicle) GetMaxAtmospheringSpeed() string {\n\tif x != nil {\n\t\treturn x.MaxAtmospheringSpeed\n\t}\n\treturn \"\"\n}\n\nfunc (x *Vehicle) GetCargoCapacity() string {\n\tif x != nil {\n\t\treturn x.CargoCapacity\n\t}\n\treturn \"\"\n}\n\nfunc (x *Vehicle) GetConsumables() string {\n\tif x != nil {\n\t\treturn x.Consumables\n\t}\n\treturn \"\"\n}\n\nfunc (x *Vehicle) GetUrl() string {\n\tif x != nil {\n\t\treturn x.Url\n\t}\n\treturn \"\"\n}\n\nfunc (x *Vehicle) GetCreated() string {\n\tif x != nil {\n\t\treturn x.Created\n\t}\n\treturn \"\"\n}\n\nfunc (x *Vehicle) GetEdited() string {\n\tif x != nil {\n\t\treturn x.Edited\n\t}\n\treturn \"\"\n}\n\nfunc (x *Vehicle) GetFilmIds() []int64 {\n\tif x != nil {\n\t\treturn x.FilmIds\n\t}\n\treturn nil\n}\n\nfunc (x *Vehicle) GetPilotIds() []int64 {\n\tif x != nil {\n\t\treturn x.PilotIds\n\t}\n\treturn nil\n}\n\ntype Vehicles struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tVehicles []*Vehicle `protobuf:\"bytes,1,rep,name=vehicles,proto3\" json:\"vehicles,omitempty\"`\n}\n\nfunc (x *Vehicles) Reset() {\n\t*x = Vehicles{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_swapi_proto_msgTypes[31]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Vehicles) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Vehicles) ProtoMessage() {}\n\nfunc (x *Vehicles) ProtoReflect() protoreflect.Message {\n\tmi := &file_swapi_proto_msgTypes[31]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Vehicles.ProtoReflect.Descriptor instead.\nfunc (*Vehicles) Descriptor() ([]byte, []int) {\n\treturn file_swapi_proto_rawDescGZIP(), []int{31}\n}\n\nfunc (x *Vehicles) GetVehicles() []*Vehicle {\n\tif x != nil {\n\t\treturn x.Vehicles\n\t}\n\treturn nil\n}\n\n// Species is a type of person or character within the Star Wars Universe.\ntype Species struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// species id.\n\tId int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\t// The name of this species.\n\tName string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// The classification of this species, such as \"mammal\" or \"reptile\".\n\tClassification string `protobuf:\"bytes,3,opt,name=classification,proto3\" json:\"classification,omitempty\"`\n\t// The designation of this species, such as \"sentient\".\n\tDesignation string `protobuf:\"bytes,4,opt,name=designation,proto3\" json:\"designation,omitempty\"`\n\t// The average height of this species in centimeters.\n\tAverageHeight string `protobuf:\"bytes,5,opt,name=average_height,json=averageHeight,proto3\" json:\"average_height,omitempty\"`\n\t// The average lifespan of this species in years.\n\tAverageLifespan string `protobuf:\"bytes,6,opt,name=average_lifespan,json=averageLifespan,proto3\" json:\"average_lifespan,omitempty\"`\n\t// A comma-separated string of common eye colors for this species,\n\t// \"none\" if this species does not typically have eyes.\n\tEyeColors string `protobuf:\"bytes,7,opt,name=eye_colors,json=eyeColors,proto3\" json:\"eye_colors,omitempty\"`\n\t// A comma-separated string of common hair colors for this species,\n\t// \"none\" if this species does not typically have hair.\n\tHairColors string `protobuf:\"bytes,8,opt,name=hair_colors,json=hairColors,proto3\" json:\"hair_colors,omitempty\"`\n\t// A comma-separated string of common skin colors for this species,\n\t// \"none\" if this species does not typically have skin.\n\tSkinColors string `protobuf:\"bytes,9,opt,name=skin_colors,json=skinColors,proto3\" json:\"skin_colors,omitempty\"`\n\t// The language commonly spoken by this species.\n\tLanguage string `protobuf:\"bytes,10,opt,name=language,proto3\" json:\"language,omitempty\"`\n\t// The URL of a planet resource, a planet that this species originates from.\n\tHomeworld string `protobuf:\"bytes,11,opt,name=homeworld,proto3\" json:\"homeworld,omitempty\"`\n\t// the hypermedia URL of this resource.\n\tUrl string `protobuf:\"bytes,12,opt,name=url,proto3\" json:\"url,omitempty\"`\n\t// the ISO 8601 date format of the time that this resource was created.\n\tCreated string `protobuf:\"bytes,13,opt,name=created,proto3\" json:\"created,omitempty\"`\n\t// the ISO 8601 date format of the time that this resource was edited.\n\tEdited string `protobuf:\"bytes,14,opt,name=edited,proto3\" json:\"edited,omitempty\"`\n\t// person ids.\n\tPersonIds []int64 `protobuf:\"varint,15,rep,packed,name=person_ids,json=personIds,proto3\" json:\"person_ids,omitempty\"`\n\t// film ids.\n\tFilmIds []int64 `protobuf:\"varint,16,rep,packed,name=film_ids,json=filmIds,proto3\" json:\"film_ids,omitempty\"`\n}\n\nfunc (x *Species) Reset() {\n\t*x = Species{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_swapi_proto_msgTypes[32]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Species) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Species) ProtoMessage() {}\n\nfunc (x *Species) ProtoReflect() protoreflect.Message {\n\tmi := &file_swapi_proto_msgTypes[32]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Species.ProtoReflect.Descriptor instead.\nfunc (*Species) Descriptor() ([]byte, []int) {\n\treturn file_swapi_proto_rawDescGZIP(), []int{32}\n}\n\nfunc (x *Species) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *Species) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Species) GetClassification() string {\n\tif x != nil {\n\t\treturn x.Classification\n\t}\n\treturn \"\"\n}\n\nfunc (x *Species) GetDesignation() string {\n\tif x != nil {\n\t\treturn x.Designation\n\t}\n\treturn \"\"\n}\n\nfunc (x *Species) GetAverageHeight() string {\n\tif x != nil {\n\t\treturn x.AverageHeight\n\t}\n\treturn \"\"\n}\n\nfunc (x *Species) GetAverageLifespan() string {\n\tif x != nil {\n\t\treturn x.AverageLifespan\n\t}\n\treturn \"\"\n}\n\nfunc (x *Species) GetEyeColors() string {\n\tif x != nil {\n\t\treturn x.EyeColors\n\t}\n\treturn \"\"\n}\n\nfunc (x *Species) GetHairColors() string {\n\tif x != nil {\n\t\treturn x.HairColors\n\t}\n\treturn \"\"\n}\n\nfunc (x *Species) GetSkinColors() string {\n\tif x != nil {\n\t\treturn x.SkinColors\n\t}\n\treturn \"\"\n}\n\nfunc (x *Species) GetLanguage() string {\n\tif x != nil {\n\t\treturn x.Language\n\t}\n\treturn \"\"\n}\n\nfunc (x *Species) GetHomeworld() string {\n\tif x != nil {\n\t\treturn x.Homeworld\n\t}\n\treturn \"\"\n}\n\nfunc (x *Species) GetUrl() string {\n\tif x != nil {\n\t\treturn x.Url\n\t}\n\treturn \"\"\n}\n\nfunc (x *Species) GetCreated() string {\n\tif x != nil {\n\t\treturn x.Created\n\t}\n\treturn \"\"\n}\n\nfunc (x *Species) GetEdited() string {\n\tif x != nil {\n\t\treturn x.Edited\n\t}\n\treturn \"\"\n}\n\nfunc (x *Species) GetPersonIds() []int64 {\n\tif x != nil {\n\t\treturn x.PersonIds\n\t}\n\treturn nil\n}\n\nfunc (x *Species) GetFilmIds() []int64 {\n\tif x != nil {\n\t\treturn x.FilmIds\n\t}\n\treturn nil\n}\n\ntype SpeciesList struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tSpecies []*Species `protobuf:\"bytes,1,rep,name=species,proto3\" json:\"species,omitempty\"`\n}\n\nfunc (x *SpeciesList) Reset() {\n\t*x = SpeciesList{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_swapi_proto_msgTypes[33]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SpeciesList) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SpeciesList) ProtoMessage() {}\n\nfunc (x *SpeciesList) ProtoReflect() protoreflect.Message {\n\tmi := &file_swapi_proto_msgTypes[33]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SpeciesList.ProtoReflect.Descriptor instead.\nfunc (*SpeciesList) Descriptor() ([]byte, []int) {\n\treturn file_swapi_proto_rawDescGZIP(), []int{33}\n}\n\nfunc (x *SpeciesList) GetSpecies() []*Species {\n\tif x != nil {\n\t\treturn x.Species\n\t}\n\treturn nil\n}\n\n// Planet is a large mass, planet or planetoid in the Star Wars Universe, at the time of 0 ABY.\ntype Planet struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// planet id.\n\tId int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\t// The name of this planet.\n\tName string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// The diameter of this planet in kilometers.\n\tDiameter string `protobuf:\"bytes,3,opt,name=diameter,proto3\" json:\"diameter,omitempty\"`\n\t// The number of standard hours it takes for this planet to complete a single rotation on its axis.\n\tRotationPeriod string `protobuf:\"bytes,4,opt,name=rotation_period,json=rotationPeriod,proto3\" json:\"rotation_period,omitempty\"`\n\t// The number of standard days it takes for this planet to complete a single orbit of its local star.\n\tOrbitalPeriod string `protobuf:\"bytes,5,opt,name=orbital_period,json=orbitalPeriod,proto3\" json:\"orbital_period,omitempty\"`\n\t// A number denoting the gravity of this planet, where \"1\" is normal or 1 standard G.\n\t// \"2\" is twice or 2 standard Gs. \"0.5\" is half or 0.5 standard Gs.\n\tGravity string `protobuf:\"bytes,6,opt,name=gravity,proto3\" json:\"gravity,omitempty\"`\n\t// The average population of sentient beings inhabiting this planet.\n\tPopulation string `protobuf:\"bytes,7,opt,name=population,proto3\" json:\"population,omitempty\"`\n\t// The climate of this planet. Comma separated if diverse.\n\tClimate string `protobuf:\"bytes,8,opt,name=climate,proto3\" json:\"climate,omitempty\"`\n\t// The terrain of this planet. Comma separated if diverse.\n\tTerrain string `protobuf:\"bytes,9,opt,name=terrain,proto3\" json:\"terrain,omitempty\"`\n\t// The percentage of the planet surface that is naturally occurring water or bodies of water.\n\tSurfaceWater string `protobuf:\"bytes,10,opt,name=surface_water,json=surfaceWater,proto3\" json:\"surface_water,omitempty\"`\n\t// the hypermedia URL of this resource.\n\tUrl string `protobuf:\"bytes,11,opt,name=url,proto3\" json:\"url,omitempty\"`\n\t// the ISO 8601 date format of the time that this resource was created.\n\tCreated string `protobuf:\"bytes,12,opt,name=created,proto3\" json:\"created,omitempty\"`\n\t// the ISO 8601 date format of the time that this resource was edited.\n\tEdited string `protobuf:\"bytes,13,opt,name=edited,proto3\" json:\"edited,omitempty\"`\n\t// the person that live on this planet ids.\n\tResidentIds []int64 `protobuf:\"varint,14,rep,packed,name=resident_ids,json=residentIds,proto3\" json:\"resident_ids,omitempty\"`\n\t// film ids.\n\tFilmIds []int64 `protobuf:\"varint,15,rep,packed,name=film_ids,json=filmIds,proto3\" json:\"film_ids,omitempty\"`\n}\n\nfunc (x *Planet) Reset() {\n\t*x = Planet{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_swapi_proto_msgTypes[34]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Planet) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Planet) ProtoMessage() {}\n\nfunc (x *Planet) ProtoReflect() protoreflect.Message {\n\tmi := &file_swapi_proto_msgTypes[34]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Planet.ProtoReflect.Descriptor instead.\nfunc (*Planet) Descriptor() ([]byte, []int) {\n\treturn file_swapi_proto_rawDescGZIP(), []int{34}\n}\n\nfunc (x *Planet) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *Planet) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Planet) GetDiameter() string {\n\tif x != nil {\n\t\treturn x.Diameter\n\t}\n\treturn \"\"\n}\n\nfunc (x *Planet) GetRotationPeriod() string {\n\tif x != nil {\n\t\treturn x.RotationPeriod\n\t}\n\treturn \"\"\n}\n\nfunc (x *Planet) GetOrbitalPeriod() string {\n\tif x != nil {\n\t\treturn x.OrbitalPeriod\n\t}\n\treturn \"\"\n}\n\nfunc (x *Planet) GetGravity() string {\n\tif x != nil {\n\t\treturn x.Gravity\n\t}\n\treturn \"\"\n}\n\nfunc (x *Planet) GetPopulation() string {\n\tif x != nil {\n\t\treturn x.Population\n\t}\n\treturn \"\"\n}\n\nfunc (x *Planet) GetClimate() string {\n\tif x != nil {\n\t\treturn x.Climate\n\t}\n\treturn \"\"\n}\n\nfunc (x *Planet) GetTerrain() string {\n\tif x != nil {\n\t\treturn x.Terrain\n\t}\n\treturn \"\"\n}\n\nfunc (x *Planet) GetSurfaceWater() string {\n\tif x != nil {\n\t\treturn x.SurfaceWater\n\t}\n\treturn \"\"\n}\n\nfunc (x *Planet) GetUrl() string {\n\tif x != nil {\n\t\treturn x.Url\n\t}\n\treturn \"\"\n}\n\nfunc (x *Planet) GetCreated() string {\n\tif x != nil {\n\t\treturn x.Created\n\t}\n\treturn \"\"\n}\n\nfunc (x *Planet) GetEdited() string {\n\tif x != nil {\n\t\treturn x.Edited\n\t}\n\treturn \"\"\n}\n\nfunc (x *Planet) GetResidentIds() []int64 {\n\tif x != nil {\n\t\treturn x.ResidentIds\n\t}\n\treturn nil\n}\n\nfunc (x *Planet) GetFilmIds() []int64 {\n\tif x != nil {\n\t\treturn x.FilmIds\n\t}\n\treturn nil\n}\n\ntype Planets struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPlanets []*Planet `protobuf:\"bytes,1,rep,name=planets,proto3\" json:\"planets,omitempty\"`\n}\n\nfunc (x *Planets) Reset() {\n\t*x = Planets{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_swapi_proto_msgTypes[35]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Planets) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Planets) ProtoMessage() {}\n\nfunc (x *Planets) ProtoReflect() protoreflect.Message {\n\tmi := &file_swapi_proto_msgTypes[35]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Planets.ProtoReflect.Descriptor instead.\nfunc (*Planets) Descriptor() ([]byte, []int) {\n\treturn file_swapi_proto_rawDescGZIP(), []int{35}\n}\n\nfunc (x *Planets) GetPlanets() []*Planet {\n\tif x != nil {\n\t\treturn x.Planets\n\t}\n\treturn nil\n}\n\nvar File_swapi_proto protoreflect.FileDescriptor\n\nvar file_swapi_proto_rawDesc = []byte{\n\t0x0a, 0x0b, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x73,\n\t0x77, 0x61, 0x70, 0x69, 0x1a, 0x16, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x74, 0x79, 0x70,\n\t0x65, 0x2f, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x72,\n\t0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x13,\n\t0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x1a, 0x0f, 0x66, 0x69, 0x6c, 0x6d, 0x2f, 0x66, 0x69, 0x6c, 0x6d, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x2f, 0x76, 0x65,\n\t0x68, 0x69, 0x63, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x73, 0x70, 0x65,\n\t0x63, 0x69, 0x65, 0x73, 0x2f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x1a, 0x17, 0x73, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x2f, 0x73, 0x74, 0x61,\n\t0x72, 0x73, 0x68, 0x69, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x13, 0x70, 0x65, 0x72,\n\t0x73, 0x6f, 0x6e, 0x2f, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x22, 0x22, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03,\n\t0x52, 0x02, 0x69, 0x64, 0x22, 0xb2, 0x04, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x73,\n\t0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2d, 0x0a, 0x06, 0x70, 0x65, 0x72, 0x73, 0x6f,\n\t0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e,\n\t0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x42, 0x06, 0x9a, 0x4a, 0x03, 0x12, 0x01, 0x70, 0x52, 0x06,\n\t0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x05, 0x66, 0x69, 0x6c, 0x6d, 0x73, 0x18,\n\t0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69,\n\t0x6c, 0x6d, 0x42, 0x0c, 0x9a, 0x4a, 0x09, 0x12, 0x07, 0x66, 0x2e, 0x66, 0x69, 0x6c, 0x6d, 0x73,\n\t0x52, 0x05, 0x66, 0x69, 0x6c, 0x6d, 0x73, 0x12, 0x3e, 0x0a, 0x07, 0x73, 0x70, 0x65, 0x63, 0x69,\n\t0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69,\n\t0x2e, 0x53, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x42, 0x14, 0x9a, 0x4a, 0x11, 0x12, 0x0f, 0x73,\n\t0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x52, 0x07,\n\t0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x73,\n\t0x68, 0x69, 0x70, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x73, 0x77, 0x61,\n\t0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x42, 0x18, 0x9a, 0x4a, 0x15,\n\t0x12, 0x13, 0x73, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x72,\n\t0x73, 0x68, 0x69, 0x70, 0x73, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x73,\n\t0x12, 0x3b, 0x0a, 0x08, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03,\n\t0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x65, 0x68, 0x69, 0x63,\n\t0x6c, 0x65, 0x42, 0x0f, 0x9a, 0x4a, 0x0c, 0x12, 0x0a, 0x76, 0x2e, 0x76, 0x65, 0x68, 0x69, 0x63,\n\t0x6c, 0x65, 0x73, 0x52, 0x08, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x3a, 0xf9, 0x01,\n\t0x9a, 0x4a, 0xf5, 0x01, 0x0a, 0x39, 0x0a, 0x03, 0x72, 0x65, 0x73, 0x72, 0x32, 0x0a, 0x24, 0x73,\n\t0x77, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x2e, 0x50, 0x65, 0x72, 0x73,\n\t0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72,\n\t0x73, 0x6f, 0x6e, 0x12, 0x0a, 0x0a, 0x02, 0x69, 0x64, 0x12, 0x04, 0x24, 0x2e, 0x69, 0x64, 0x0a,\n\t0x0f, 0x0a, 0x01, 0x70, 0x5a, 0x0a, 0x72, 0x65, 0x73, 0x2e, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e,\n\t0x0a, 0x1f, 0x0a, 0x01, 0x66, 0x6a, 0x1a, 0x0a, 0x05, 0x46, 0x69, 0x6c, 0x6d, 0x73, 0x12, 0x11,\n\t0x0a, 0x03, 0x69, 0x64, 0x73, 0x12, 0x0a, 0x70, 0x2e, 0x66, 0x69, 0x6c, 0x6d, 0x5f, 0x69, 0x64,\n\t0x73, 0x0a, 0x2e, 0x0a, 0x07, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x6a, 0x23, 0x0a, 0x0b,\n\t0x53, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x03, 0x69,\n\t0x64, 0x73, 0x12, 0x0d, 0x70, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x5f, 0x69, 0x64,\n\t0x73, 0x0a, 0x2f, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x73, 0x6a, 0x22,\n\t0x0a, 0x09, 0x53, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x73, 0x12, 0x15, 0x0a, 0x03, 0x69,\n\t0x64, 0x73, 0x12, 0x0e, 0x70, 0x2e, 0x73, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x5f, 0x69,\n\t0x64, 0x73, 0x0a, 0x25, 0x0a, 0x01, 0x76, 0x6a, 0x20, 0x0a, 0x08, 0x56, 0x65, 0x68, 0x69, 0x63,\n\t0x6c, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x12, 0x0d, 0x70, 0x2e, 0x76, 0x65,\n\t0x68, 0x69, 0x63, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x22, 0x25, 0x0a, 0x11, 0x4c, 0x69, 0x73,\n\t0x74, 0x50, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10,\n\t0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x03, 0x52, 0x03, 0x69, 0x64, 0x73,\n\t0x22, 0x69, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x52, 0x65,\n\t0x70, 0x6c, 0x79, 0x12, 0x34, 0x0a, 0x06, 0x70, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x18, 0x01, 0x20,\n\t0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x65, 0x72, 0x73,\n\t0x6f, 0x6e, 0x42, 0x0d, 0x9a, 0x4a, 0x0a, 0x12, 0x08, 0x70, 0x2e, 0x70, 0x65, 0x6f, 0x70, 0x6c,\n\t0x65, 0x52, 0x06, 0x70, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x3a, 0x20, 0x9a, 0x4a, 0x1d, 0x0a, 0x1b,\n\t0x0a, 0x01, 0x70, 0x6a, 0x16, 0x0a, 0x06, 0x50, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x12, 0x0c, 0x0a,\n\t0x03, 0x69, 0x64, 0x73, 0x12, 0x05, 0x24, 0x2e, 0x69, 0x64, 0x73, 0x22, 0x20, 0x0a, 0x0e, 0x47,\n\t0x65, 0x74, 0x46, 0x69, 0x6c, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a,\n\t0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x22, 0xb1, 0x05,\n\t0x0a, 0x0c, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x6d, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27,\n\t0x0a, 0x04, 0x66, 0x69, 0x6c, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x73,\n\t0x77, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, 0x6c, 0x6d, 0x42, 0x06, 0x9a, 0x4a, 0x03, 0x12, 0x01,\n\t0x66, 0x52, 0x04, 0x66, 0x69, 0x6c, 0x6d, 0x12, 0x3e, 0x0a, 0x07, 0x73, 0x70, 0x65, 0x63, 0x69,\n\t0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69,\n\t0x2e, 0x53, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x42, 0x14, 0x9a, 0x4a, 0x11, 0x12, 0x0f, 0x73,\n\t0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x52, 0x07,\n\t0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x73,\n\t0x68, 0x69, 0x70, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x73, 0x77, 0x61,\n\t0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x42, 0x18, 0x9a, 0x4a, 0x15,\n\t0x12, 0x13, 0x73, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x72,\n\t0x73, 0x68, 0x69, 0x70, 0x73, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x73,\n\t0x12, 0x3b, 0x0a, 0x08, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03,\n\t0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x65, 0x68, 0x69, 0x63,\n\t0x6c, 0x65, 0x42, 0x0f, 0x9a, 0x4a, 0x0c, 0x12, 0x0a, 0x76, 0x2e, 0x76, 0x65, 0x68, 0x69, 0x63,\n\t0x6c, 0x65, 0x73, 0x52, 0x08, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x12, 0x45, 0x0a,\n\t0x0a, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28,\n\t0x0b, 0x32, 0x0d, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e,\n\t0x42, 0x16, 0x9a, 0x4a, 0x13, 0x12, 0x11, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72,\n\t0x73, 0x2e, 0x70, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63,\n\t0x74, 0x65, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x07, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x73, 0x18,\n\t0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x6c,\n\t0x61, 0x6e, 0x65, 0x74, 0x42, 0x14, 0x9a, 0x4a, 0x11, 0x12, 0x0f, 0x70, 0x6c, 0x61, 0x6e, 0x65,\n\t0x74, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x73, 0x52, 0x07, 0x70, 0x6c, 0x61, 0x6e,\n\t0x65, 0x74, 0x73, 0x3a, 0xab, 0x02, 0x9a, 0x4a, 0xa7, 0x02, 0x0a, 0x33, 0x0a, 0x03, 0x72, 0x65,\n\t0x73, 0x72, 0x2c, 0x0a, 0x1e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x66, 0x69, 0x6c, 0x6d, 0x2e,\n\t0x46, 0x69, 0x6c, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x47, 0x65, 0x74, 0x46,\n\t0x69, 0x6c, 0x6d, 0x12, 0x0a, 0x0a, 0x02, 0x69, 0x64, 0x12, 0x04, 0x24, 0x2e, 0x69, 0x64, 0x0a,\n\t0x0d, 0x0a, 0x01, 0x66, 0x5a, 0x08, 0x72, 0x65, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x6d, 0x0a, 0x2e,\n\t0x0a, 0x07, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x6a, 0x23, 0x0a, 0x0b, 0x53, 0x70, 0x65,\n\t0x63, 0x69, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x12,\n\t0x0d, 0x66, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x5f, 0x69, 0x64, 0x73, 0x0a, 0x2f,\n\t0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x73, 0x6a, 0x22, 0x0a, 0x09, 0x53,\n\t0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x73, 0x12, 0x15, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x12,\n\t0x0e, 0x66, 0x2e, 0x73, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x5f, 0x69, 0x64, 0x73, 0x0a,\n\t0x25, 0x0a, 0x01, 0x76, 0x6a, 0x20, 0x0a, 0x08, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x73,\n\t0x12, 0x14, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x12, 0x0d, 0x66, 0x2e, 0x76, 0x65, 0x68, 0x69, 0x63,\n\t0x6c, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x0a, 0x2e, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63,\n\t0x74, 0x65, 0x72, 0x73, 0x6a, 0x20, 0x0a, 0x06, 0x50, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x12, 0x16,\n\t0x0a, 0x03, 0x69, 0x64, 0x73, 0x12, 0x0f, 0x66, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74,\n\t0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x0a, 0x29, 0x0a, 0x07, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74,\n\t0x73, 0x6a, 0x1e, 0x0a, 0x07, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x73, 0x12, 0x13, 0x0a, 0x03,\n\t0x69, 0x64, 0x73, 0x12, 0x0c, 0x66, 0x2e, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x5f, 0x69, 0x64,\n\t0x73, 0x22, 0x24, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x6d, 0x73, 0x52, 0x65,\n\t0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03,\n\t0x28, 0x03, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, 0x62, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x46,\n\t0x69, 0x6c, 0x6d, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x66, 0x69, 0x6c,\n\t0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69,\n\t0x2e, 0x46, 0x69, 0x6c, 0x6d, 0x42, 0x0c, 0x9a, 0x4a, 0x09, 0x12, 0x07, 0x66, 0x2e, 0x66, 0x69,\n\t0x6c, 0x6d, 0x73, 0x52, 0x05, 0x66, 0x69, 0x6c, 0x6d, 0x73, 0x3a, 0x1f, 0x9a, 0x4a, 0x1c, 0x0a,\n\t0x1a, 0x0a, 0x01, 0x66, 0x6a, 0x15, 0x0a, 0x05, 0x46, 0x69, 0x6c, 0x6d, 0x73, 0x12, 0x0c, 0x0a,\n\t0x03, 0x69, 0x64, 0x73, 0x12, 0x05, 0x24, 0x2e, 0x69, 0x64, 0x73, 0x22, 0x23, 0x0a, 0x11, 0x47,\n\t0x65, 0x74, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64,\n\t0x22, 0xc5, 0x02, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x52,\n\t0x65, 0x70, 0x6c, 0x79, 0x12, 0x30, 0x0a, 0x07, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x65,\n\t0x68, 0x69, 0x63, 0x6c, 0x65, 0x42, 0x06, 0x9a, 0x4a, 0x03, 0x12, 0x01, 0x76, 0x52, 0x07, 0x76,\n\t0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x12, 0x2f, 0x0a, 0x05, 0x66, 0x69, 0x6c, 0x6d, 0x73, 0x18,\n\t0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69,\n\t0x6c, 0x6d, 0x42, 0x0c, 0x9a, 0x4a, 0x09, 0x12, 0x07, 0x66, 0x2e, 0x66, 0x69, 0x6c, 0x6d, 0x73,\n\t0x52, 0x05, 0x66, 0x69, 0x6c, 0x6d, 0x73, 0x12, 0x34, 0x0a, 0x06, 0x70, 0x69, 0x6c, 0x6f, 0x74,\n\t0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e,\n\t0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x42, 0x0d, 0x9a, 0x4a, 0x0a, 0x12, 0x08, 0x70, 0x2e, 0x70,\n\t0x65, 0x6f, 0x70, 0x6c, 0x65, 0x52, 0x06, 0x70, 0x69, 0x6c, 0x6f, 0x74, 0x73, 0x3a, 0x98, 0x01,\n\t0x9a, 0x4a, 0x94, 0x01, 0x0a, 0x3c, 0x0a, 0x03, 0x72, 0x65, 0x73, 0x72, 0x35, 0x0a, 0x27, 0x73,\n\t0x77, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x2e, 0x56, 0x65, 0x68,\n\t0x69, 0x63, 0x6c, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x47, 0x65, 0x74, 0x56,\n\t0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x12, 0x0a, 0x0a, 0x02, 0x69, 0x64, 0x12, 0x04, 0x24, 0x2e,\n\t0x69, 0x64, 0x0a, 0x10, 0x0a, 0x01, 0x76, 0x5a, 0x0b, 0x72, 0x65, 0x73, 0x2e, 0x76, 0x65, 0x68,\n\t0x69, 0x63, 0x6c, 0x65, 0x0a, 0x1f, 0x0a, 0x01, 0x66, 0x6a, 0x1a, 0x0a, 0x05, 0x46, 0x69, 0x6c,\n\t0x6d, 0x73, 0x12, 0x11, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x12, 0x0a, 0x76, 0x2e, 0x66, 0x69, 0x6c,\n\t0x6d, 0x5f, 0x69, 0x64, 0x73, 0x0a, 0x21, 0x0a, 0x01, 0x70, 0x6a, 0x1c, 0x0a, 0x06, 0x50, 0x65,\n\t0x6f, 0x70, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x12, 0x0b, 0x76, 0x2e, 0x70,\n\t0x69, 0x6c, 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x22, 0x27, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74,\n\t0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,\n\t0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x03, 0x52, 0x03, 0x69, 0x64,\n\t0x73, 0x22, 0x74, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65,\n\t0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3b, 0x0a, 0x08, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c,\n\t0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69,\n\t0x2e, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x42, 0x0f, 0x9a, 0x4a, 0x0c, 0x12, 0x0a, 0x76,\n\t0x2e, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x76, 0x65, 0x68, 0x69, 0x63,\n\t0x6c, 0x65, 0x73, 0x3a, 0x22, 0x9a, 0x4a, 0x1f, 0x0a, 0x1d, 0x0a, 0x01, 0x76, 0x6a, 0x18, 0x0a,\n\t0x08, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x12, 0x0c, 0x0a, 0x03, 0x69, 0x64, 0x73,\n\t0x12, 0x05, 0x24, 0x2e, 0x69, 0x64, 0x73, 0x22, 0x23, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, 0x70,\n\t0x65, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02,\n\t0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x22, 0xc6, 0x02, 0x0a,\n\t0x0f, 0x47, 0x65, 0x74, 0x53, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79,\n\t0x12, 0x30, 0x0a, 0x07, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x0e, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x70, 0x65, 0x63, 0x69, 0x65,\n\t0x73, 0x42, 0x06, 0x9a, 0x4a, 0x03, 0x12, 0x01, 0x73, 0x52, 0x07, 0x73, 0x70, 0x65, 0x63, 0x69,\n\t0x65, 0x73, 0x12, 0x34, 0x0a, 0x06, 0x70, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x03,\n\t0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x65, 0x72, 0x73, 0x6f,\n\t0x6e, 0x42, 0x0d, 0x9a, 0x4a, 0x0a, 0x12, 0x08, 0x70, 0x2e, 0x70, 0x65, 0x6f, 0x70, 0x6c, 0x65,\n\t0x52, 0x06, 0x70, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x12, 0x2f, 0x0a, 0x05, 0x66, 0x69, 0x6c, 0x6d,\n\t0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e,\n\t0x46, 0x69, 0x6c, 0x6d, 0x42, 0x0c, 0x9a, 0x4a, 0x09, 0x12, 0x07, 0x66, 0x2e, 0x66, 0x69, 0x6c,\n\t0x6d, 0x73, 0x52, 0x05, 0x66, 0x69, 0x6c, 0x6d, 0x73, 0x3a, 0x99, 0x01, 0x9a, 0x4a, 0x95, 0x01,\n\t0x0a, 0x3c, 0x0a, 0x03, 0x72, 0x65, 0x73, 0x72, 0x35, 0x0a, 0x27, 0x73, 0x77, 0x61, 0x70, 0x69,\n\t0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x2e, 0x53, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73,\n\t0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x47, 0x65, 0x74, 0x53, 0x70, 0x65, 0x63, 0x69,\n\t0x65, 0x73, 0x12, 0x0a, 0x0a, 0x02, 0x69, 0x64, 0x12, 0x04, 0x24, 0x2e, 0x69, 0x64, 0x0a, 0x10,\n\t0x0a, 0x01, 0x73, 0x5a, 0x0b, 0x72, 0x65, 0x73, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73,\n\t0x0a, 0x1f, 0x0a, 0x01, 0x66, 0x6a, 0x1a, 0x0a, 0x05, 0x46, 0x69, 0x6c, 0x6d, 0x73, 0x12, 0x11,\n\t0x0a, 0x03, 0x69, 0x64, 0x73, 0x12, 0x0a, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x6d, 0x5f, 0x69, 0x64,\n\t0x73, 0x0a, 0x22, 0x0a, 0x01, 0x70, 0x6a, 0x1d, 0x0a, 0x06, 0x50, 0x65, 0x6f, 0x70, 0x6c, 0x65,\n\t0x12, 0x13, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x12, 0x0c, 0x73, 0x2e, 0x70, 0x65, 0x72, 0x73, 0x6f,\n\t0x6e, 0x5f, 0x69, 0x64, 0x73, 0x22, 0x26, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x70, 0x65,\n\t0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x69,\n\t0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x03, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, 0x73, 0x0a,\n\t0x10, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c,\n\t0x79, 0x12, 0x38, 0x0a, 0x07, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03,\n\t0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x70, 0x65, 0x63, 0x69,\n\t0x65, 0x73, 0x42, 0x0e, 0x9a, 0x4a, 0x0b, 0x12, 0x09, 0x73, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69,\n\t0x65, 0x73, 0x52, 0x07, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x3a, 0x25, 0x9a, 0x4a, 0x22,\n\t0x0a, 0x20, 0x0a, 0x01, 0x73, 0x6a, 0x1b, 0x0a, 0x0b, 0x53, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73,\n\t0x4c, 0x69, 0x73, 0x74, 0x12, 0x0c, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x12, 0x05, 0x24, 0x2e, 0x69,\n\t0x64, 0x73, 0x22, 0x24, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69,\n\t0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x22, 0xcd, 0x02, 0x0a, 0x10, 0x47, 0x65, 0x74,\n\t0x53, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x33, 0x0a,\n\t0x08, 0x73, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x0f, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70,\n\t0x42, 0x06, 0x9a, 0x4a, 0x03, 0x12, 0x01, 0x73, 0x52, 0x08, 0x73, 0x74, 0x61, 0x72, 0x73, 0x68,\n\t0x69, 0x70, 0x12, 0x2f, 0x0a, 0x05, 0x66, 0x69, 0x6c, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,\n\t0x0b, 0x32, 0x0b, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, 0x6c, 0x6d, 0x42, 0x0c,\n\t0x9a, 0x4a, 0x09, 0x12, 0x07, 0x66, 0x2e, 0x66, 0x69, 0x6c, 0x6d, 0x73, 0x52, 0x05, 0x66, 0x69,\n\t0x6c, 0x6d, 0x73, 0x12, 0x34, 0x0a, 0x06, 0x70, 0x69, 0x6c, 0x6f, 0x74, 0x73, 0x18, 0x03, 0x20,\n\t0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x65, 0x72, 0x73,\n\t0x6f, 0x6e, 0x42, 0x0d, 0x9a, 0x4a, 0x0a, 0x12, 0x08, 0x70, 0x2e, 0x70, 0x65, 0x6f, 0x70, 0x6c,\n\t0x65, 0x52, 0x06, 0x70, 0x69, 0x6c, 0x6f, 0x74, 0x73, 0x3a, 0x9c, 0x01, 0x9a, 0x4a, 0x98, 0x01,\n\t0x0a, 0x3f, 0x0a, 0x03, 0x72, 0x65, 0x73, 0x72, 0x38, 0x0a, 0x2a, 0x73, 0x77, 0x61, 0x70, 0x69,\n\t0x2e, 0x73, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x73, 0x68,\n\t0x69, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61,\n\t0x72, 0x73, 0x68, 0x69, 0x70, 0x12, 0x0a, 0x0a, 0x02, 0x69, 0x64, 0x12, 0x04, 0x24, 0x2e, 0x69,\n\t0x64, 0x0a, 0x11, 0x0a, 0x01, 0x73, 0x5a, 0x0c, 0x72, 0x65, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x72,\n\t0x73, 0x68, 0x69, 0x70, 0x0a, 0x1f, 0x0a, 0x01, 0x66, 0x6a, 0x1a, 0x0a, 0x05, 0x46, 0x69, 0x6c,\n\t0x6d, 0x73, 0x12, 0x11, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x12, 0x0a, 0x73, 0x2e, 0x66, 0x69, 0x6c,\n\t0x6d, 0x5f, 0x69, 0x64, 0x73, 0x0a, 0x21, 0x0a, 0x01, 0x70, 0x6a, 0x1c, 0x0a, 0x06, 0x50, 0x65,\n\t0x6f, 0x70, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x12, 0x0b, 0x73, 0x2e, 0x70,\n\t0x69, 0x6c, 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x22, 0x28, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74,\n\t0x53, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x03, 0x52, 0x03, 0x69,\n\t0x64, 0x73, 0x22, 0x7a, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x61, 0x72, 0x73, 0x68,\n\t0x69, 0x70, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3f, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72,\n\t0x73, 0x68, 0x69, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x73, 0x77,\n\t0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x42, 0x10, 0x9a, 0x4a,\n\t0x0d, 0x12, 0x0b, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x73, 0x52, 0x09,\n\t0x73, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x73, 0x3a, 0x23, 0x9a, 0x4a, 0x20, 0x0a, 0x1e,\n\t0x0a, 0x01, 0x73, 0x6a, 0x19, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x73,\n\t0x12, 0x0c, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x12, 0x05, 0x24, 0x2e, 0x69, 0x64, 0x73, 0x22, 0x22,\n\t0x0a, 0x10, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,\n\t0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02,\n\t0x69, 0x64, 0x22, 0xd6, 0x02, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x74,\n\t0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2d, 0x0a, 0x06, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x6c,\n\t0x61, 0x6e, 0x65, 0x74, 0x42, 0x06, 0x9a, 0x4a, 0x03, 0x12, 0x01, 0x70, 0x52, 0x06, 0x70, 0x6c,\n\t0x61, 0x6e, 0x65, 0x74, 0x12, 0x42, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x69, 0x64, 0x65, 0x6e, 0x74,\n\t0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e,\n\t0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x42, 0x15, 0x9a, 0x4a, 0x12, 0x12, 0x10, 0x72, 0x65, 0x73,\n\t0x69, 0x64, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x70, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x52, 0x09, 0x72,\n\t0x65, 0x73, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2f, 0x0a, 0x05, 0x66, 0x69, 0x6c, 0x6d,\n\t0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e,\n\t0x46, 0x69, 0x6c, 0x6d, 0x42, 0x0c, 0x9a, 0x4a, 0x09, 0x12, 0x07, 0x66, 0x2e, 0x66, 0x69, 0x6c,\n\t0x6d, 0x73, 0x52, 0x05, 0x66, 0x69, 0x6c, 0x6d, 0x73, 0x3a, 0x9f, 0x01, 0x9a, 0x4a, 0x9b, 0x01,\n\t0x0a, 0x39, 0x0a, 0x03, 0x72, 0x65, 0x73, 0x72, 0x32, 0x0a, 0x24, 0x73, 0x77, 0x61, 0x70, 0x69,\n\t0x2e, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x53, 0x65,\n\t0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x12,\n\t0x0a, 0x0a, 0x02, 0x69, 0x64, 0x12, 0x04, 0x24, 0x2e, 0x69, 0x64, 0x0a, 0x0f, 0x0a, 0x01, 0x70,\n\t0x5a, 0x0a, 0x72, 0x65, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x0a, 0x2c, 0x0a, 0x09,\n\t0x72, 0x65, 0x73, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x73, 0x6a, 0x1f, 0x0a, 0x06, 0x50, 0x65, 0x6f,\n\t0x70, 0x6c, 0x65, 0x12, 0x15, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x12, 0x0e, 0x70, 0x2e, 0x72, 0x65,\n\t0x73, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x0a, 0x1f, 0x0a, 0x01, 0x66, 0x6a,\n\t0x1a, 0x0a, 0x05, 0x46, 0x69, 0x6c, 0x6d, 0x73, 0x12, 0x11, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x12,\n\t0x0a, 0x70, 0x2e, 0x66, 0x69, 0x6c, 0x6d, 0x5f, 0x69, 0x64, 0x73, 0x22, 0x26, 0x0a, 0x12, 0x4c,\n\t0x69, 0x73, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,\n\t0x74, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x03, 0x52, 0x03,\n\t0x69, 0x64, 0x73, 0x22, 0x6e, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x65,\n\t0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x37, 0x0a, 0x07, 0x70, 0x6c, 0x61, 0x6e, 0x65,\n\t0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69,\n\t0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x42, 0x0e, 0x9a, 0x4a, 0x0b, 0x12, 0x09, 0x70, 0x2e,\n\t0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x73, 0x52, 0x07, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x73,\n\t0x3a, 0x21, 0x9a, 0x4a, 0x1e, 0x0a, 0x1c, 0x0a, 0x01, 0x70, 0x6a, 0x17, 0x0a, 0x07, 0x50, 0x6c,\n\t0x61, 0x6e, 0x65, 0x74, 0x73, 0x12, 0x0c, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x12, 0x05, 0x24, 0x2e,\n\t0x69, 0x64, 0x73, 0x22, 0xe6, 0x03, 0x0a, 0x06, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x12, 0x0e,\n\t0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12,\n\t0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x69, 0x72, 0x74, 0x68, 0x5f, 0x79, 0x65, 0x61, 0x72,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x69, 0x72, 0x74, 0x68, 0x59, 0x65, 0x61,\n\t0x72, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x79, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x18, 0x04,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x79, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x12, 0x16,\n\t0x0a, 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,\n\t0x67, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x68, 0x61, 0x69, 0x72, 0x5f, 0x63,\n\t0x6f, 0x6c, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x68, 0x61, 0x69, 0x72,\n\t0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18,\n\t0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x12, 0x0a,\n\t0x04, 0x6d, 0x61, 0x73, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x61, 0x73,\n\t0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x6b, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x18,\n\t0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x6b, 0x69, 0x6e, 0x43, 0x6f, 0x6c, 0x6f, 0x72,\n\t0x12, 0x1c, 0x0a, 0x09, 0x68, 0x6f, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x18, 0x0a, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x09, 0x68, 0x6f, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x12, 0x10,\n\t0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c,\n\t0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x64,\n\t0x69, 0x74, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x64, 0x69, 0x74,\n\t0x65, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x6d, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0e,\n\t0x20, 0x03, 0x28, 0x03, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x6d, 0x49, 0x64, 0x73, 0x12, 0x1f, 0x0a,\n\t0x0b, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0f, 0x20, 0x03,\n\t0x28, 0x03, 0x52, 0x0a, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x49, 0x64, 0x73, 0x12, 0x21,\n\t0x0a, 0x0c, 0x73, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x10,\n\t0x20, 0x03, 0x28, 0x03, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x49, 0x64,\n\t0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x73,\n\t0x18, 0x11, 0x20, 0x03, 0x28, 0x03, 0x52, 0x0a, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x49,\n\t0x64, 0x73, 0x3a, 0x18, 0x9a, 0x4a, 0x15, 0x1a, 0x13, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x70,\n\t0x65, 0x72, 0x73, 0x6f, 0x6e, 0x2e, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x22, 0x83, 0x01, 0x0a,\n\t0x06, 0x50, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x12, 0x36, 0x0a, 0x06, 0x70, 0x65, 0x6f, 0x70, 0x6c,\n\t0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e,\n\t0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x42, 0x0f, 0x9a, 0x4a, 0x0c, 0x12, 0x0a, 0x72, 0x65, 0x73,\n\t0x2e, 0x70, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x52, 0x06, 0x70, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x3a,\n\t0x41, 0x9a, 0x4a, 0x3e, 0x0a, 0x3c, 0x0a, 0x03, 0x72, 0x65, 0x73, 0x72, 0x35, 0x0a, 0x25, 0x73,\n\t0x77, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x2e, 0x50, 0x65, 0x72, 0x73,\n\t0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x65,\n\t0x6f, 0x70, 0x6c, 0x65, 0x12, 0x0c, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x12, 0x05, 0x24, 0x2e, 0x69,\n\t0x64, 0x73, 0x22, 0xe1, 0x03, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x69,\n\t0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74,\n\t0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c,\n\t0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x70, 0x69, 0x73, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18,\n\t0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x65, 0x70, 0x69, 0x73, 0x6f, 0x64, 0x65, 0x49, 0x64,\n\t0x12, 0x23, 0x0a, 0x0d, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x72, 0x61, 0x77,\n\t0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67,\n\t0x43, 0x72, 0x61, 0x77, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f,\n\t0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f,\n\t0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x72, 0x18, 0x06, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x72, 0x12, 0x34, 0x0a,\n\t0x0c, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70,\n\t0x65, 0x2e, 0x44, 0x61, 0x74, 0x65, 0x52, 0x0b, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x44,\n\t0x61, 0x74, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,\n\t0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12,\n\t0x16, 0x0a, 0x06, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x06, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x70, 0x65, 0x63, 0x69,\n\t0x65, 0x73, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x03, 0x52, 0x0a, 0x73, 0x70,\n\t0x65, 0x63, 0x69, 0x65, 0x73, 0x49, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x72,\n\t0x73, 0x68, 0x69, 0x70, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x03, 0x52, 0x0b,\n\t0x73, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x49, 0x64, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x76,\n\t0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x03,\n\t0x52, 0x0a, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x49, 0x64, 0x73, 0x12, 0x23, 0x0a, 0x0d,\n\t0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0e, 0x20,\n\t0x03, 0x28, 0x03, 0x52, 0x0c, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x49, 0x64,\n\t0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18,\n\t0x0f, 0x20, 0x03, 0x28, 0x03, 0x52, 0x09, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x49, 0x64, 0x73,\n\t0x3a, 0x14, 0x9a, 0x4a, 0x11, 0x1a, 0x0f, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x66, 0x69, 0x6c,\n\t0x6d, 0x2e, 0x46, 0x69, 0x6c, 0x6d, 0x22, 0x78, 0x0a, 0x05, 0x46, 0x69, 0x6c, 0x6d, 0x73, 0x12,\n\t0x31, 0x0a, 0x05, 0x66, 0x69, 0x6c, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b,\n\t0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, 0x6c, 0x6d, 0x42, 0x0e, 0x9a, 0x4a, 0x0b,\n\t0x12, 0x09, 0x72, 0x65, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x6d, 0x73, 0x52, 0x05, 0x66, 0x69, 0x6c,\n\t0x6d, 0x73, 0x3a, 0x3c, 0x9a, 0x4a, 0x39, 0x0a, 0x37, 0x0a, 0x03, 0x72, 0x65, 0x73, 0x72, 0x30,\n\t0x0a, 0x20, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x66, 0x69, 0x6c, 0x6d, 0x2e, 0x46, 0x69, 0x6c,\n\t0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c,\n\t0x6d, 0x73, 0x12, 0x0c, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x12, 0x05, 0x24, 0x2e, 0x69, 0x64, 0x73,\n\t0x22, 0xdd, 0x04, 0x0a, 0x08, 0x53, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x12, 0x0e, 0x0a,\n\t0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x73,\n\t0x68, 0x69, 0x70, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x0d, 0x73, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x22,\n\t0x0a, 0x0c, 0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, 0x72, 0x65, 0x72, 0x18, 0x05,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, 0x72,\n\t0x65, 0x72, 0x12, 0x26, 0x0a, 0x0f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x5f, 0x63, 0x72,\n\t0x65, 0x64, 0x69, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x73,\n\t0x74, 0x49, 0x6e, 0x43, 0x72, 0x65, 0x64, 0x69, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x65,\n\t0x6e, 0x67, 0x74, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x65, 0x6e, 0x67,\n\t0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x72, 0x65, 0x77, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x04, 0x63, 0x72, 0x65, 0x77, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x61, 0x73, 0x73, 0x65, 0x6e,\n\t0x67, 0x65, 0x72, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x61, 0x73, 0x73,\n\t0x65, 0x6e, 0x67, 0x65, 0x72, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x61, 0x74,\n\t0x6d, 0x6f, 0x73, 0x70, 0x68, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x70, 0x65, 0x65, 0x64,\n\t0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x6d, 0x61, 0x78, 0x41, 0x74, 0x6d, 0x6f, 0x73,\n\t0x70, 0x68, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x11,\n\t0x68, 0x79, 0x70, 0x65, 0x72, 0x64, 0x72, 0x69, 0x76, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6e,\n\t0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x68, 0x79, 0x70, 0x65, 0x72, 0x64, 0x72,\n\t0x69, 0x76, 0x65, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x67, 0x6c,\n\t0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x67, 0x6c, 0x74, 0x12, 0x25, 0x0a,\n\t0x0e, 0x63, 0x61, 0x72, 0x67, 0x6f, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18,\n\t0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x61, 0x72, 0x67, 0x6f, 0x43, 0x61, 0x70, 0x61,\n\t0x63, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x61, 0x62,\n\t0x6c, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x73, 0x75,\n\t0x6d, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x0f, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61,\n\t0x74, 0x65, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74,\n\t0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x18, 0x11, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x06, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x69,\n\t0x6c, 0x6d, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x12, 0x20, 0x03, 0x28, 0x03, 0x52, 0x07, 0x66, 0x69,\n\t0x6c, 0x6d, 0x49, 0x64, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x69, 0x6c, 0x6f, 0x74, 0x5f, 0x69,\n\t0x64, 0x73, 0x18, 0x13, 0x20, 0x03, 0x28, 0x03, 0x52, 0x08, 0x70, 0x69, 0x6c, 0x6f, 0x74, 0x49,\n\t0x64, 0x73, 0x3a, 0x1c, 0x9a, 0x4a, 0x19, 0x1a, 0x17, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x73,\n\t0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70,\n\t0x22, 0x98, 0x01, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x73, 0x12, 0x41,\n\t0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,\n\t0x0b, 0x32, 0x0f, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x73, 0x68,\n\t0x69, 0x70, 0x42, 0x12, 0x9a, 0x4a, 0x0f, 0x12, 0x0d, 0x72, 0x65, 0x73, 0x2e, 0x73, 0x74, 0x61,\n\t0x72, 0x73, 0x68, 0x69, 0x70, 0x73, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70,\n\t0x73, 0x3a, 0x48, 0x9a, 0x4a, 0x45, 0x0a, 0x43, 0x0a, 0x03, 0x72, 0x65, 0x73, 0x72, 0x3c, 0x0a,\n\t0x2c, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x73, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x2e,\n\t0x53, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f,\n\t0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x73, 0x12, 0x0c, 0x0a,\n\t0x03, 0x69, 0x64, 0x73, 0x12, 0x05, 0x24, 0x2e, 0x69, 0x64, 0x73, 0x22, 0x97, 0x04, 0x0a, 0x07,\n\t0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6d,\n\t0x6f, 0x64, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65,\n\t0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x5f, 0x63, 0x6c, 0x61,\n\t0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c,\n\t0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61,\n\t0x63, 0x74, 0x75, 0x72, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x61,\n\t0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, 0x72, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x65,\n\t0x6e, 0x67, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x65, 0x6e, 0x67,\n\t0x74, 0x68, 0x12, 0x26, 0x0a, 0x0f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x5f, 0x63, 0x72,\n\t0x65, 0x64, 0x69, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x73,\n\t0x74, 0x49, 0x6e, 0x43, 0x72, 0x65, 0x64, 0x69, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x72,\n\t0x65, 0x77, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x72, 0x65, 0x77, 0x12, 0x1e,\n\t0x0a, 0x0a, 0x70, 0x61, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x73, 0x18, 0x09, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x0a, 0x70, 0x61, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x73, 0x12, 0x34,\n\t0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x61, 0x74, 0x6d, 0x6f, 0x73, 0x70, 0x68, 0x65, 0x72, 0x69,\n\t0x6e, 0x67, 0x5f, 0x73, 0x70, 0x65, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14,\n\t0x6d, 0x61, 0x78, 0x41, 0x74, 0x6d, 0x6f, 0x73, 0x70, 0x68, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53,\n\t0x70, 0x65, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x61, 0x72, 0x67, 0x6f, 0x5f, 0x63, 0x61,\n\t0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x61,\n\t0x72, 0x67, 0x6f, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63,\n\t0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x10, 0x0a,\n\t0x03, 0x75, 0x72, 0x6c, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12,\n\t0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x64, 0x69,\n\t0x74, 0x65, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x64, 0x69, 0x74, 0x65,\n\t0x64, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x6d, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x10, 0x20,\n\t0x03, 0x28, 0x03, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x6d, 0x49, 0x64, 0x73, 0x12, 0x1b, 0x0a, 0x09,\n\t0x70, 0x69, 0x6c, 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x03, 0x52,\n\t0x08, 0x70, 0x69, 0x6c, 0x6f, 0x74, 0x49, 0x64, 0x73, 0x3a, 0x1a, 0x9a, 0x4a, 0x17, 0x1a, 0x15,\n\t0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x2e, 0x56, 0x65,\n\t0x68, 0x69, 0x63, 0x6c, 0x65, 0x22, 0x90, 0x01, 0x0a, 0x08, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c,\n\t0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x18, 0x01,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x65, 0x68,\n\t0x69, 0x63, 0x6c, 0x65, 0x42, 0x11, 0x9a, 0x4a, 0x0e, 0x12, 0x0c, 0x72, 0x65, 0x73, 0x2e, 0x76,\n\t0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65,\n\t0x73, 0x3a, 0x45, 0x9a, 0x4a, 0x42, 0x0a, 0x40, 0x0a, 0x03, 0x72, 0x65, 0x73, 0x72, 0x39, 0x0a,\n\t0x29, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x2e, 0x56,\n\t0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x4c, 0x69,\n\t0x73, 0x74, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x12, 0x0c, 0x0a, 0x03, 0x69, 0x64,\n\t0x73, 0x12, 0x05, 0x24, 0x2e, 0x69, 0x64, 0x73, 0x22, 0xfe, 0x03, 0x0a, 0x07, 0x53, 0x70, 0x65,\n\t0x63, 0x69, 0x65, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03,\n\t0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6c, 0x61, 0x73,\n\t0x73, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x0e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18,\n\t0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x68, 0x65,\n\t0x69, 0x67, 0x68, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x76, 0x65, 0x72,\n\t0x61, 0x67, 0x65, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x61, 0x76, 0x65,\n\t0x72, 0x61, 0x67, 0x65, 0x5f, 0x6c, 0x69, 0x66, 0x65, 0x73, 0x70, 0x61, 0x6e, 0x18, 0x06, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x0f, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x4c, 0x69, 0x66, 0x65,\n\t0x73, 0x70, 0x61, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x79, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6f,\n\t0x72, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x79, 0x65, 0x43, 0x6f, 0x6c,\n\t0x6f, 0x72, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x68, 0x61, 0x69, 0x72, 0x5f, 0x63, 0x6f, 0x6c, 0x6f,\n\t0x72, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x68, 0x61, 0x69, 0x72, 0x43, 0x6f,\n\t0x6c, 0x6f, 0x72, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6b, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6c,\n\t0x6f, 0x72, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6b, 0x69, 0x6e, 0x43,\n\t0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67,\n\t0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67,\n\t0x65, 0x12, 0x1c, 0x0a, 0x09, 0x68, 0x6f, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x18, 0x0b,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x68, 0x6f, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x12,\n\t0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72,\n\t0x6c, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x65,\n\t0x64, 0x69, 0x74, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x64, 0x69,\n\t0x74, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x5f, 0x69, 0x64,\n\t0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x03, 0x52, 0x09, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x49,\n\t0x64, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x6d, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x10,\n\t0x20, 0x03, 0x28, 0x03, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x6d, 0x49, 0x64, 0x73, 0x3a, 0x1a, 0x9a,\n\t0x4a, 0x17, 0x1a, 0x15, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65,\n\t0x73, 0x2e, 0x53, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x22, 0x8f, 0x01, 0x0a, 0x0b, 0x53, 0x70,\n\t0x65, 0x63, 0x69, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x07, 0x73, 0x70, 0x65,\n\t0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x73, 0x77, 0x61,\n\t0x70, 0x69, 0x2e, 0x53, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x42, 0x10, 0x9a, 0x4a, 0x0d, 0x12,\n\t0x0b, 0x72, 0x65, 0x73, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x52, 0x07, 0x73, 0x70,\n\t0x65, 0x63, 0x69, 0x65, 0x73, 0x3a, 0x44, 0x9a, 0x4a, 0x41, 0x0a, 0x3f, 0x0a, 0x03, 0x72, 0x65,\n\t0x73, 0x72, 0x38, 0x0a, 0x28, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69,\n\t0x65, 0x73, 0x2e, 0x53, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,\n\t0x65, 0x2f, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x12, 0x0c, 0x0a,\n\t0x03, 0x69, 0x64, 0x73, 0x12, 0x05, 0x24, 0x2e, 0x69, 0x64, 0x73, 0x22, 0xc7, 0x03, 0x0a, 0x06,\n\t0x50, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69,\n\t0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69,\n\t0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x0e, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12,\n\t0x25, 0x0a, 0x0e, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x61, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f,\n\t0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x61, 0x6c,\n\t0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74,\n\t0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x79,\n\t0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x12, 0x18, 0x0a, 0x07, 0x63, 0x6c, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x07, 0x63, 0x6c, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x65,\n\t0x72, 0x72, 0x61, 0x69, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x65, 0x72,\n\t0x72, 0x61, 0x69, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x75, 0x72, 0x66, 0x61, 0x63, 0x65, 0x5f,\n\t0x77, 0x61, 0x74, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x75, 0x72,\n\t0x66, 0x61, 0x63, 0x65, 0x57, 0x61, 0x74, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c,\n\t0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x63,\n\t0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x72,\n\t0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x18,\n\t0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x12, 0x21, 0x0a,\n\t0x0c, 0x72, 0x65, 0x73, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0e, 0x20,\n\t0x03, 0x28, 0x03, 0x52, 0x0b, 0x72, 0x65, 0x73, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73,\n\t0x12, 0x19, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x6d, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0f, 0x20, 0x03,\n\t0x28, 0x03, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x6d, 0x49, 0x64, 0x73, 0x3a, 0x18, 0x9a, 0x4a, 0x15,\n\t0x1a, 0x13, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x2e, 0x50,\n\t0x6c, 0x61, 0x6e, 0x65, 0x74, 0x22, 0x88, 0x01, 0x0a, 0x07, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x74,\n\t0x73, 0x12, 0x39, 0x0a, 0x07, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03,\n\t0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x65,\n\t0x74, 0x42, 0x10, 0x9a, 0x4a, 0x0d, 0x12, 0x0b, 0x72, 0x65, 0x73, 0x2e, 0x70, 0x6c, 0x61, 0x6e,\n\t0x65, 0x74, 0x73, 0x52, 0x07, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x73, 0x3a, 0x42, 0x9a, 0x4a,\n\t0x3f, 0x0a, 0x3d, 0x0a, 0x03, 0x72, 0x65, 0x73, 0x72, 0x36, 0x0a, 0x26, 0x73, 0x77, 0x61, 0x70,\n\t0x69, 0x2e, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x65,\n\t0x74, 0x73, 0x12, 0x0c, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x12, 0x05, 0x24, 0x2e, 0x69, 0x64, 0x73,\n\t0x32, 0xaa, 0x06, 0x0a, 0x05, 0x53, 0x57, 0x41, 0x50, 0x49, 0x12, 0x3d, 0x0a, 0x09, 0x47, 0x65,\n\t0x74, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x12, 0x17, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e,\n\t0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x1a, 0x15, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x73,\n\t0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0a, 0x4c, 0x69, 0x73,\n\t0x74, 0x50, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e,\n\t0x4c, 0x69, 0x73, 0x74, 0x50, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,\n\t0x74, 0x1a, 0x16, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x65,\n\t0x6f, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x37, 0x0a, 0x07, 0x47,\n\t0x65, 0x74, 0x46, 0x69, 0x6c, 0x6d, 0x12, 0x15, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x47,\n\t0x65, 0x74, 0x46, 0x69, 0x6c, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e,\n\t0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x6d, 0x52, 0x65, 0x70,\n\t0x6c, 0x79, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x6d,\n\t0x73, 0x12, 0x17, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69,\n\t0x6c, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x73, 0x77, 0x61,\n\t0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x6d, 0x73, 0x52, 0x65, 0x70, 0x6c,\n\t0x79, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x73, 0x68,\n\t0x69, 0x70, 0x12, 0x19, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74,\n\t0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e,\n\t0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69,\n\t0x70, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74,\n\t0x53, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x77, 0x61, 0x70,\n\t0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x73, 0x52,\n\t0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x4c,\n\t0x69, 0x73, 0x74, 0x53, 0x74, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x73, 0x52, 0x65, 0x70, 0x6c,\n\t0x79, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x53, 0x70, 0x65, 0x63, 0x69, 0x65,\n\t0x73, 0x12, 0x18, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x70, 0x65,\n\t0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x73, 0x77,\n\t0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65,\n\t0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x70, 0x65,\n\t0x63, 0x69, 0x65, 0x73, 0x12, 0x19, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73,\n\t0x74, 0x53, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,\n\t0x17, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x70, 0x65, 0x63,\n\t0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0a, 0x47, 0x65,\n\t0x74, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69,\n\t0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,\n\t0x73, 0x74, 0x1a, 0x16, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65,\n\t0x68, 0x69, 0x63, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0c,\n\t0x4c, 0x69, 0x73, 0x74, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x73,\n\t0x77, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65,\n\t0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69,\n\t0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70,\n\t0x6c, 0x79, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x65,\n\t0x74, 0x12, 0x17, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x61,\n\t0x6e, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x73, 0x77, 0x61,\n\t0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c,\n\t0x79, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x65,\n\t0x74, 0x73, 0x12, 0x19, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50,\n\t0x6c, 0x61, 0x6e, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e,\n\t0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x74,\n\t0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x1a, 0x03, 0x9a, 0x4a, 0x00, 0x42, 0x88, 0x01,\n\t0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x42, 0x0a, 0x53, 0x77, 0x61,\n\t0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3b, 0x67, 0x69, 0x74, 0x68, 0x75,\n\t0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x65, 0x72, 0x63, 0x61, 0x72, 0x69, 0x2f, 0x67, 0x72,\n\t0x70, 0x63, 0x2d, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x64, 0x65,\n\t0x6d, 0x6f, 0x2f, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x77, 0x61, 0x70, 0x69, 0x3b, 0x73,\n\t0x77, 0x61, 0x70, 0x69, 0x70, 0x62, 0xa2, 0x02, 0x03, 0x53, 0x58, 0x58, 0xaa, 0x02, 0x05, 0x53,\n\t0x77, 0x61, 0x70, 0x69, 0xca, 0x02, 0x05, 0x53, 0x77, 0x61, 0x70, 0x69, 0xe2, 0x02, 0x11, 0x53,\n\t0x77, 0x61, 0x70, 0x69, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,\n\t0xea, 0x02, 0x05, 0x53, 0x77, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_swapi_proto_rawDescOnce sync.Once\n\tfile_swapi_proto_rawDescData = file_swapi_proto_rawDesc\n)\n\nfunc file_swapi_proto_rawDescGZIP() []byte {\n\tfile_swapi_proto_rawDescOnce.Do(func() {\n\t\tfile_swapi_proto_rawDescData = protoimpl.X.CompressGZIP(file_swapi_proto_rawDescData)\n\t})\n\treturn file_swapi_proto_rawDescData\n}\n\nvar file_swapi_proto_msgTypes = make([]protoimpl.MessageInfo, 36)\nvar file_swapi_proto_goTypes = []interface{}{\n\t(*GetPersonRequest)(nil),     // 0: swapi.GetPersonRequest\n\t(*GetPersonReply)(nil),       // 1: swapi.GetPersonReply\n\t(*ListPeopleRequest)(nil),    // 2: swapi.ListPeopleRequest\n\t(*ListPeopleReply)(nil),      // 3: swapi.ListPeopleReply\n\t(*GetFilmRequest)(nil),       // 4: swapi.GetFilmRequest\n\t(*GetFilmReply)(nil),         // 5: swapi.GetFilmReply\n\t(*ListFilmsRequest)(nil),     // 6: swapi.ListFilmsRequest\n\t(*ListFilmsReply)(nil),       // 7: swapi.ListFilmsReply\n\t(*GetVehicleRequest)(nil),    // 8: swapi.GetVehicleRequest\n\t(*GetVehicleReply)(nil),      // 9: swapi.GetVehicleReply\n\t(*ListVehiclesRequest)(nil),  // 10: swapi.ListVehiclesRequest\n\t(*ListVehiclesReply)(nil),    // 11: swapi.ListVehiclesReply\n\t(*GetSpeciesRequest)(nil),    // 12: swapi.GetSpeciesRequest\n\t(*GetSpeciesReply)(nil),      // 13: swapi.GetSpeciesReply\n\t(*ListSpeciesRequest)(nil),   // 14: swapi.ListSpeciesRequest\n\t(*ListSpeciesReply)(nil),     // 15: swapi.ListSpeciesReply\n\t(*GetStarshipRequest)(nil),   // 16: swapi.GetStarshipRequest\n\t(*GetStarshipReply)(nil),     // 17: swapi.GetStarshipReply\n\t(*ListStarshipsRequest)(nil), // 18: swapi.ListStarshipsRequest\n\t(*ListStarshipsReply)(nil),   // 19: swapi.ListStarshipsReply\n\t(*GetPlanetRequest)(nil),     // 20: swapi.GetPlanetRequest\n\t(*GetPlanetReply)(nil),       // 21: swapi.GetPlanetReply\n\t(*ListPlanetsRequest)(nil),   // 22: swapi.ListPlanetsRequest\n\t(*ListPlanetsReply)(nil),     // 23: swapi.ListPlanetsReply\n\t(*Person)(nil),               // 24: swapi.Person\n\t(*People)(nil),               // 25: swapi.People\n\t(*Film)(nil),                 // 26: swapi.Film\n\t(*Films)(nil),                // 27: swapi.Films\n\t(*Starship)(nil),             // 28: swapi.Starship\n\t(*Starships)(nil),            // 29: swapi.Starships\n\t(*Vehicle)(nil),              // 30: swapi.Vehicle\n\t(*Vehicles)(nil),             // 31: swapi.Vehicles\n\t(*Species)(nil),              // 32: swapi.Species\n\t(*SpeciesList)(nil),          // 33: swapi.SpeciesList\n\t(*Planet)(nil),               // 34: swapi.Planet\n\t(*Planets)(nil),              // 35: swapi.Planets\n\t(*date.Date)(nil),            // 36: google.type.Date\n}\nvar file_swapi_proto_depIdxs = []int32{\n\t24, // 0: swapi.GetPersonReply.person:type_name -> swapi.Person\n\t26, // 1: swapi.GetPersonReply.films:type_name -> swapi.Film\n\t32, // 2: swapi.GetPersonReply.species:type_name -> swapi.Species\n\t28, // 3: swapi.GetPersonReply.starships:type_name -> swapi.Starship\n\t30, // 4: swapi.GetPersonReply.vehicles:type_name -> swapi.Vehicle\n\t24, // 5: swapi.ListPeopleReply.people:type_name -> swapi.Person\n\t26, // 6: swapi.GetFilmReply.film:type_name -> swapi.Film\n\t32, // 7: swapi.GetFilmReply.species:type_name -> swapi.Species\n\t28, // 8: swapi.GetFilmReply.starships:type_name -> swapi.Starship\n\t30, // 9: swapi.GetFilmReply.vehicles:type_name -> swapi.Vehicle\n\t24, // 10: swapi.GetFilmReply.characters:type_name -> swapi.Person\n\t34, // 11: swapi.GetFilmReply.planets:type_name -> swapi.Planet\n\t26, // 12: swapi.ListFilmsReply.films:type_name -> swapi.Film\n\t30, // 13: swapi.GetVehicleReply.vehicle:type_name -> swapi.Vehicle\n\t26, // 14: swapi.GetVehicleReply.films:type_name -> swapi.Film\n\t24, // 15: swapi.GetVehicleReply.pilots:type_name -> swapi.Person\n\t30, // 16: swapi.ListVehiclesReply.vehicles:type_name -> swapi.Vehicle\n\t32, // 17: swapi.GetSpeciesReply.species:type_name -> swapi.Species\n\t24, // 18: swapi.GetSpeciesReply.people:type_name -> swapi.Person\n\t26, // 19: swapi.GetSpeciesReply.films:type_name -> swapi.Film\n\t32, // 20: swapi.ListSpeciesReply.species:type_name -> swapi.Species\n\t28, // 21: swapi.GetStarshipReply.starship:type_name -> swapi.Starship\n\t26, // 22: swapi.GetStarshipReply.films:type_name -> swapi.Film\n\t24, // 23: swapi.GetStarshipReply.pilots:type_name -> swapi.Person\n\t28, // 24: swapi.ListStarshipsReply.starships:type_name -> swapi.Starship\n\t34, // 25: swapi.GetPlanetReply.planet:type_name -> swapi.Planet\n\t24, // 26: swapi.GetPlanetReply.residents:type_name -> swapi.Person\n\t26, // 27: swapi.GetPlanetReply.films:type_name -> swapi.Film\n\t34, // 28: swapi.ListPlanetsReply.planets:type_name -> swapi.Planet\n\t24, // 29: swapi.People.people:type_name -> swapi.Person\n\t36, // 30: swapi.Film.release_date:type_name -> google.type.Date\n\t26, // 31: swapi.Films.films:type_name -> swapi.Film\n\t28, // 32: swapi.Starships.starships:type_name -> swapi.Starship\n\t30, // 33: swapi.Vehicles.vehicles:type_name -> swapi.Vehicle\n\t32, // 34: swapi.SpeciesList.species:type_name -> swapi.Species\n\t34, // 35: swapi.Planets.planets:type_name -> swapi.Planet\n\t0,  // 36: swapi.SWAPI.GetPerson:input_type -> swapi.GetPersonRequest\n\t2,  // 37: swapi.SWAPI.ListPeople:input_type -> swapi.ListPeopleRequest\n\t4,  // 38: swapi.SWAPI.GetFilm:input_type -> swapi.GetFilmRequest\n\t6,  // 39: swapi.SWAPI.ListFilms:input_type -> swapi.ListFilmsRequest\n\t16, // 40: swapi.SWAPI.GetStarship:input_type -> swapi.GetStarshipRequest\n\t18, // 41: swapi.SWAPI.ListStarships:input_type -> swapi.ListStarshipsRequest\n\t12, // 42: swapi.SWAPI.GetSpecies:input_type -> swapi.GetSpeciesRequest\n\t14, // 43: swapi.SWAPI.ListSpecies:input_type -> swapi.ListSpeciesRequest\n\t8,  // 44: swapi.SWAPI.GetVehicle:input_type -> swapi.GetVehicleRequest\n\t10, // 45: swapi.SWAPI.ListVehicles:input_type -> swapi.ListVehiclesRequest\n\t20, // 46: swapi.SWAPI.GetPlanet:input_type -> swapi.GetPlanetRequest\n\t22, // 47: swapi.SWAPI.ListPlanets:input_type -> swapi.ListPlanetsRequest\n\t1,  // 48: swapi.SWAPI.GetPerson:output_type -> swapi.GetPersonReply\n\t3,  // 49: swapi.SWAPI.ListPeople:output_type -> swapi.ListPeopleReply\n\t5,  // 50: swapi.SWAPI.GetFilm:output_type -> swapi.GetFilmReply\n\t7,  // 51: swapi.SWAPI.ListFilms:output_type -> swapi.ListFilmsReply\n\t17, // 52: swapi.SWAPI.GetStarship:output_type -> swapi.GetStarshipReply\n\t19, // 53: swapi.SWAPI.ListStarships:output_type -> swapi.ListStarshipsReply\n\t13, // 54: swapi.SWAPI.GetSpecies:output_type -> swapi.GetSpeciesReply\n\t15, // 55: swapi.SWAPI.ListSpecies:output_type -> swapi.ListSpeciesReply\n\t9,  // 56: swapi.SWAPI.GetVehicle:output_type -> swapi.GetVehicleReply\n\t11, // 57: swapi.SWAPI.ListVehicles:output_type -> swapi.ListVehiclesReply\n\t21, // 58: swapi.SWAPI.GetPlanet:output_type -> swapi.GetPlanetReply\n\t23, // 59: swapi.SWAPI.ListPlanets:output_type -> swapi.ListPlanetsReply\n\t48, // [48:60] is the sub-list for method output_type\n\t36, // [36:48] is the sub-list for method input_type\n\t36, // [36:36] is the sub-list for extension type_name\n\t36, // [36:36] is the sub-list for extension extendee\n\t0,  // [0:36] is the sub-list for field type_name\n}\n\nfunc init() { file_swapi_proto_init() }\nfunc file_swapi_proto_init() {\n\tif File_swapi_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_swapi_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPersonRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_swapi_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPersonReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_swapi_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListPeopleRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_swapi_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListPeopleReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_swapi_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetFilmRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_swapi_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetFilmReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_swapi_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListFilmsRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_swapi_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListFilmsReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_swapi_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetVehicleRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_swapi_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetVehicleReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_swapi_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListVehiclesRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_swapi_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListVehiclesReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_swapi_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetSpeciesRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_swapi_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetSpeciesReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_swapi_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListSpeciesRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_swapi_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListSpeciesReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_swapi_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetStarshipRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_swapi_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetStarshipReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_swapi_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListStarshipsRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_swapi_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListStarshipsReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_swapi_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPlanetRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_swapi_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetPlanetReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_swapi_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListPlanetsRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_swapi_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListPlanetsReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_swapi_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Person); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_swapi_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*People); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_swapi_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Film); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_swapi_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Films); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_swapi_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Starship); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_swapi_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Starships); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_swapi_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Vehicle); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_swapi_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Vehicles); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_swapi_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Species); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_swapi_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SpeciesList); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_swapi_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Planet); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_swapi_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Planets); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_swapi_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   36,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_swapi_proto_goTypes,\n\t\tDependencyIndexes: file_swapi_proto_depIdxs,\n\t\tMessageInfos:      file_swapi_proto_msgTypes,\n\t}.Build()\n\tFile_swapi_proto = out.File\n\tfile_swapi_proto_rawDesc = nil\n\tfile_swapi_proto_goTypes = nil\n\tfile_swapi_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "demo/swapi/swapi/swapi_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.4.0\n// - protoc             (unknown)\n// source: swapi.proto\n\npackage swapipb\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.62.0 or later.\nconst _ = grpc.SupportPackageIsVersion8\n\nconst (\n\tSWAPI_GetPerson_FullMethodName     = \"/swapi.SWAPI/GetPerson\"\n\tSWAPI_ListPeople_FullMethodName    = \"/swapi.SWAPI/ListPeople\"\n\tSWAPI_GetFilm_FullMethodName       = \"/swapi.SWAPI/GetFilm\"\n\tSWAPI_ListFilms_FullMethodName     = \"/swapi.SWAPI/ListFilms\"\n\tSWAPI_GetStarship_FullMethodName   = \"/swapi.SWAPI/GetStarship\"\n\tSWAPI_ListStarships_FullMethodName = \"/swapi.SWAPI/ListStarships\"\n\tSWAPI_GetSpecies_FullMethodName    = \"/swapi.SWAPI/GetSpecies\"\n\tSWAPI_ListSpecies_FullMethodName   = \"/swapi.SWAPI/ListSpecies\"\n\tSWAPI_GetVehicle_FullMethodName    = \"/swapi.SWAPI/GetVehicle\"\n\tSWAPI_ListVehicles_FullMethodName  = \"/swapi.SWAPI/ListVehicles\"\n\tSWAPI_GetPlanet_FullMethodName     = \"/swapi.SWAPI/GetPlanet\"\n\tSWAPI_ListPlanets_FullMethodName   = \"/swapi.SWAPI/ListPlanets\"\n)\n\n// SWAPIClient is the client API for SWAPI service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype SWAPIClient interface {\n\tGetPerson(ctx context.Context, in *GetPersonRequest, opts ...grpc.CallOption) (*GetPersonReply, error)\n\tListPeople(ctx context.Context, in *ListPeopleRequest, opts ...grpc.CallOption) (*ListPeopleReply, error)\n\tGetFilm(ctx context.Context, in *GetFilmRequest, opts ...grpc.CallOption) (*GetFilmReply, error)\n\tListFilms(ctx context.Context, in *ListFilmsRequest, opts ...grpc.CallOption) (*ListFilmsReply, error)\n\tGetStarship(ctx context.Context, in *GetStarshipRequest, opts ...grpc.CallOption) (*GetStarshipReply, error)\n\tListStarships(ctx context.Context, in *ListStarshipsRequest, opts ...grpc.CallOption) (*ListStarshipsReply, error)\n\tGetSpecies(ctx context.Context, in *GetSpeciesRequest, opts ...grpc.CallOption) (*GetSpeciesReply, error)\n\tListSpecies(ctx context.Context, in *ListSpeciesRequest, opts ...grpc.CallOption) (*ListSpeciesReply, error)\n\tGetVehicle(ctx context.Context, in *GetVehicleRequest, opts ...grpc.CallOption) (*GetVehicleReply, error)\n\tListVehicles(ctx context.Context, in *ListVehiclesRequest, opts ...grpc.CallOption) (*ListVehiclesReply, error)\n\tGetPlanet(ctx context.Context, in *GetPlanetRequest, opts ...grpc.CallOption) (*GetPlanetReply, error)\n\tListPlanets(ctx context.Context, in *ListPlanetsRequest, opts ...grpc.CallOption) (*ListPlanetsReply, error)\n}\n\ntype sWAPIClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewSWAPIClient(cc grpc.ClientConnInterface) SWAPIClient {\n\treturn &sWAPIClient{cc}\n}\n\nfunc (c *sWAPIClient) GetPerson(ctx context.Context, in *GetPersonRequest, opts ...grpc.CallOption) (*GetPersonReply, error) {\n\tcOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)\n\tout := new(GetPersonReply)\n\terr := c.cc.Invoke(ctx, SWAPI_GetPerson_FullMethodName, in, out, cOpts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *sWAPIClient) ListPeople(ctx context.Context, in *ListPeopleRequest, opts ...grpc.CallOption) (*ListPeopleReply, error) {\n\tcOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)\n\tout := new(ListPeopleReply)\n\terr := c.cc.Invoke(ctx, SWAPI_ListPeople_FullMethodName, in, out, cOpts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *sWAPIClient) GetFilm(ctx context.Context, in *GetFilmRequest, opts ...grpc.CallOption) (*GetFilmReply, error) {\n\tcOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)\n\tout := new(GetFilmReply)\n\terr := c.cc.Invoke(ctx, SWAPI_GetFilm_FullMethodName, in, out, cOpts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *sWAPIClient) ListFilms(ctx context.Context, in *ListFilmsRequest, opts ...grpc.CallOption) (*ListFilmsReply, error) {\n\tcOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)\n\tout := new(ListFilmsReply)\n\terr := c.cc.Invoke(ctx, SWAPI_ListFilms_FullMethodName, in, out, cOpts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *sWAPIClient) GetStarship(ctx context.Context, in *GetStarshipRequest, opts ...grpc.CallOption) (*GetStarshipReply, error) {\n\tcOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)\n\tout := new(GetStarshipReply)\n\terr := c.cc.Invoke(ctx, SWAPI_GetStarship_FullMethodName, in, out, cOpts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *sWAPIClient) ListStarships(ctx context.Context, in *ListStarshipsRequest, opts ...grpc.CallOption) (*ListStarshipsReply, error) {\n\tcOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)\n\tout := new(ListStarshipsReply)\n\terr := c.cc.Invoke(ctx, SWAPI_ListStarships_FullMethodName, in, out, cOpts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *sWAPIClient) GetSpecies(ctx context.Context, in *GetSpeciesRequest, opts ...grpc.CallOption) (*GetSpeciesReply, error) {\n\tcOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)\n\tout := new(GetSpeciesReply)\n\terr := c.cc.Invoke(ctx, SWAPI_GetSpecies_FullMethodName, in, out, cOpts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *sWAPIClient) ListSpecies(ctx context.Context, in *ListSpeciesRequest, opts ...grpc.CallOption) (*ListSpeciesReply, error) {\n\tcOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)\n\tout := new(ListSpeciesReply)\n\terr := c.cc.Invoke(ctx, SWAPI_ListSpecies_FullMethodName, in, out, cOpts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *sWAPIClient) GetVehicle(ctx context.Context, in *GetVehicleRequest, opts ...grpc.CallOption) (*GetVehicleReply, error) {\n\tcOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)\n\tout := new(GetVehicleReply)\n\terr := c.cc.Invoke(ctx, SWAPI_GetVehicle_FullMethodName, in, out, cOpts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *sWAPIClient) ListVehicles(ctx context.Context, in *ListVehiclesRequest, opts ...grpc.CallOption) (*ListVehiclesReply, error) {\n\tcOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)\n\tout := new(ListVehiclesReply)\n\terr := c.cc.Invoke(ctx, SWAPI_ListVehicles_FullMethodName, in, out, cOpts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *sWAPIClient) GetPlanet(ctx context.Context, in *GetPlanetRequest, opts ...grpc.CallOption) (*GetPlanetReply, error) {\n\tcOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)\n\tout := new(GetPlanetReply)\n\terr := c.cc.Invoke(ctx, SWAPI_GetPlanet_FullMethodName, in, out, cOpts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *sWAPIClient) ListPlanets(ctx context.Context, in *ListPlanetsRequest, opts ...grpc.CallOption) (*ListPlanetsReply, error) {\n\tcOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)\n\tout := new(ListPlanetsReply)\n\terr := c.cc.Invoke(ctx, SWAPI_ListPlanets_FullMethodName, in, out, cOpts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// SWAPIServer is the server API for SWAPI service.\n// All implementations must embed UnimplementedSWAPIServer\n// for forward compatibility\ntype SWAPIServer interface {\n\tGetPerson(context.Context, *GetPersonRequest) (*GetPersonReply, error)\n\tListPeople(context.Context, *ListPeopleRequest) (*ListPeopleReply, error)\n\tGetFilm(context.Context, *GetFilmRequest) (*GetFilmReply, error)\n\tListFilms(context.Context, *ListFilmsRequest) (*ListFilmsReply, error)\n\tGetStarship(context.Context, *GetStarshipRequest) (*GetStarshipReply, error)\n\tListStarships(context.Context, *ListStarshipsRequest) (*ListStarshipsReply, error)\n\tGetSpecies(context.Context, *GetSpeciesRequest) (*GetSpeciesReply, error)\n\tListSpecies(context.Context, *ListSpeciesRequest) (*ListSpeciesReply, error)\n\tGetVehicle(context.Context, *GetVehicleRequest) (*GetVehicleReply, error)\n\tListVehicles(context.Context, *ListVehiclesRequest) (*ListVehiclesReply, error)\n\tGetPlanet(context.Context, *GetPlanetRequest) (*GetPlanetReply, error)\n\tListPlanets(context.Context, *ListPlanetsRequest) (*ListPlanetsReply, error)\n\tmustEmbedUnimplementedSWAPIServer()\n}\n\n// UnimplementedSWAPIServer must be embedded to have forward compatible implementations.\ntype UnimplementedSWAPIServer struct {\n}\n\nfunc (UnimplementedSWAPIServer) GetPerson(context.Context, *GetPersonRequest) (*GetPersonReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetPerson not implemented\")\n}\nfunc (UnimplementedSWAPIServer) ListPeople(context.Context, *ListPeopleRequest) (*ListPeopleReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method ListPeople not implemented\")\n}\nfunc (UnimplementedSWAPIServer) GetFilm(context.Context, *GetFilmRequest) (*GetFilmReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetFilm not implemented\")\n}\nfunc (UnimplementedSWAPIServer) ListFilms(context.Context, *ListFilmsRequest) (*ListFilmsReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method ListFilms not implemented\")\n}\nfunc (UnimplementedSWAPIServer) GetStarship(context.Context, *GetStarshipRequest) (*GetStarshipReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetStarship not implemented\")\n}\nfunc (UnimplementedSWAPIServer) ListStarships(context.Context, *ListStarshipsRequest) (*ListStarshipsReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method ListStarships not implemented\")\n}\nfunc (UnimplementedSWAPIServer) GetSpecies(context.Context, *GetSpeciesRequest) (*GetSpeciesReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetSpecies not implemented\")\n}\nfunc (UnimplementedSWAPIServer) ListSpecies(context.Context, *ListSpeciesRequest) (*ListSpeciesReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method ListSpecies not implemented\")\n}\nfunc (UnimplementedSWAPIServer) GetVehicle(context.Context, *GetVehicleRequest) (*GetVehicleReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetVehicle not implemented\")\n}\nfunc (UnimplementedSWAPIServer) ListVehicles(context.Context, *ListVehiclesRequest) (*ListVehiclesReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method ListVehicles not implemented\")\n}\nfunc (UnimplementedSWAPIServer) GetPlanet(context.Context, *GetPlanetRequest) (*GetPlanetReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetPlanet not implemented\")\n}\nfunc (UnimplementedSWAPIServer) ListPlanets(context.Context, *ListPlanetsRequest) (*ListPlanetsReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method ListPlanets not implemented\")\n}\nfunc (UnimplementedSWAPIServer) mustEmbedUnimplementedSWAPIServer() {}\n\n// UnsafeSWAPIServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to SWAPIServer will\n// result in compilation errors.\ntype UnsafeSWAPIServer interface {\n\tmustEmbedUnimplementedSWAPIServer()\n}\n\nfunc RegisterSWAPIServer(s grpc.ServiceRegistrar, srv SWAPIServer) {\n\ts.RegisterService(&SWAPI_ServiceDesc, srv)\n}\n\nfunc _SWAPI_GetPerson_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetPersonRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(SWAPIServer).GetPerson(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: SWAPI_GetPerson_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(SWAPIServer).GetPerson(ctx, req.(*GetPersonRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _SWAPI_ListPeople_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(ListPeopleRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(SWAPIServer).ListPeople(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: SWAPI_ListPeople_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(SWAPIServer).ListPeople(ctx, req.(*ListPeopleRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _SWAPI_GetFilm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetFilmRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(SWAPIServer).GetFilm(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: SWAPI_GetFilm_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(SWAPIServer).GetFilm(ctx, req.(*GetFilmRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _SWAPI_ListFilms_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(ListFilmsRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(SWAPIServer).ListFilms(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: SWAPI_ListFilms_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(SWAPIServer).ListFilms(ctx, req.(*ListFilmsRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _SWAPI_GetStarship_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetStarshipRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(SWAPIServer).GetStarship(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: SWAPI_GetStarship_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(SWAPIServer).GetStarship(ctx, req.(*GetStarshipRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _SWAPI_ListStarships_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(ListStarshipsRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(SWAPIServer).ListStarships(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: SWAPI_ListStarships_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(SWAPIServer).ListStarships(ctx, req.(*ListStarshipsRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _SWAPI_GetSpecies_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetSpeciesRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(SWAPIServer).GetSpecies(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: SWAPI_GetSpecies_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(SWAPIServer).GetSpecies(ctx, req.(*GetSpeciesRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _SWAPI_ListSpecies_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(ListSpeciesRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(SWAPIServer).ListSpecies(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: SWAPI_ListSpecies_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(SWAPIServer).ListSpecies(ctx, req.(*ListSpeciesRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _SWAPI_GetVehicle_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetVehicleRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(SWAPIServer).GetVehicle(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: SWAPI_GetVehicle_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(SWAPIServer).GetVehicle(ctx, req.(*GetVehicleRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _SWAPI_ListVehicles_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(ListVehiclesRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(SWAPIServer).ListVehicles(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: SWAPI_ListVehicles_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(SWAPIServer).ListVehicles(ctx, req.(*ListVehiclesRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _SWAPI_GetPlanet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetPlanetRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(SWAPIServer).GetPlanet(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: SWAPI_GetPlanet_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(SWAPIServer).GetPlanet(ctx, req.(*GetPlanetRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _SWAPI_ListPlanets_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(ListPlanetsRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(SWAPIServer).ListPlanets(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: SWAPI_ListPlanets_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(SWAPIServer).ListPlanets(ctx, req.(*ListPlanetsRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// SWAPI_ServiceDesc is the grpc.ServiceDesc for SWAPI service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar SWAPI_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"swapi.SWAPI\",\n\tHandlerType: (*SWAPIServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetPerson\",\n\t\t\tHandler:    _SWAPI_GetPerson_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"ListPeople\",\n\t\t\tHandler:    _SWAPI_ListPeople_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetFilm\",\n\t\t\tHandler:    _SWAPI_GetFilm_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"ListFilms\",\n\t\t\tHandler:    _SWAPI_ListFilms_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetStarship\",\n\t\t\tHandler:    _SWAPI_GetStarship_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"ListStarships\",\n\t\t\tHandler:    _SWAPI_ListStarships_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetSpecies\",\n\t\t\tHandler:    _SWAPI_GetSpecies_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"ListSpecies\",\n\t\t\tHandler:    _SWAPI_ListSpecies_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetVehicle\",\n\t\t\tHandler:    _SWAPI_GetVehicle_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"ListVehicles\",\n\t\t\tHandler:    _SWAPI_ListVehicles_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetPlanet\",\n\t\t\tHandler:    _SWAPI_GetPlanet_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"ListPlanets\",\n\t\t\tHandler:    _SWAPI_ListPlanets_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"swapi.proto\",\n}\n"
  },
  {
    "path": "demo/swapi/swapi/swapi_grpc_federation.pb.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: v1.9.8\n//\n// source: swapi.proto\npackage swapipb\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n\n\tfilmpb \"github.com/mercari/grpc-federation/demo/swapi/film\"\n\tpersonpb \"github.com/mercari/grpc-federation/demo/swapi/person\"\n\tplanetpb \"github.com/mercari/grpc-federation/demo/swapi/planet\"\n\tspeciespb \"github.com/mercari/grpc-federation/demo/swapi/species\"\n\tstarshippb \"github.com/mercari/grpc-federation/demo/swapi/starship\"\n\tvehiclepb \"github.com/mercari/grpc-federation/demo/swapi/vehicle\"\n\tdate \"google.golang.org/genproto/googleapis/type/date\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Swapi_FilmsArgument is argument for \"swapi.Films\" message.\ntype SWAPI_Swapi_FilmsArgument struct {\n\tIds []int64\n\tRes *filmpb.ListFilmsReply\n}\n\n// Swapi_GetFilmReplyArgument is argument for \"swapi.GetFilmReply\" message.\ntype SWAPI_Swapi_GetFilmReplyArgument struct {\n\tCharacters *People\n\tF          *filmpb.Film\n\tId         int64\n\tPlanets    *Planets\n\tRes        *filmpb.GetFilmReply\n\tSpecies    *SpeciesList\n\tStarships  *Starships\n\tV          *Vehicles\n}\n\n// Swapi_GetPersonReplyArgument is argument for \"swapi.GetPersonReply\" message.\ntype SWAPI_Swapi_GetPersonReplyArgument struct {\n\tF         *Films\n\tId        int64\n\tP         *personpb.Person\n\tRes       *personpb.GetPersonReply\n\tSpecies   *SpeciesList\n\tStarships *Starships\n\tV         *Vehicles\n}\n\n// Swapi_GetPlanetReplyArgument is argument for \"swapi.GetPlanetReply\" message.\ntype SWAPI_Swapi_GetPlanetReplyArgument struct {\n\tF         *Films\n\tId        int64\n\tP         *planetpb.Planet\n\tRes       *planetpb.GetPlanetReply\n\tResidents *People\n}\n\n// Swapi_GetSpeciesReplyArgument is argument for \"swapi.GetSpeciesReply\" message.\ntype SWAPI_Swapi_GetSpeciesReplyArgument struct {\n\tF   *Films\n\tId  int64\n\tP   *People\n\tRes *speciespb.GetSpeciesReply\n\tS   *speciespb.Species\n}\n\n// Swapi_GetStarshipReplyArgument is argument for \"swapi.GetStarshipReply\" message.\ntype SWAPI_Swapi_GetStarshipReplyArgument struct {\n\tF   *Films\n\tId  int64\n\tP   *People\n\tRes *starshippb.GetStarshipReply\n\tS   *starshippb.Starship\n}\n\n// Swapi_GetVehicleReplyArgument is argument for \"swapi.GetVehicleReply\" message.\ntype SWAPI_Swapi_GetVehicleReplyArgument struct {\n\tF   *Films\n\tId  int64\n\tP   *People\n\tRes *vehiclepb.GetVehicleReply\n\tV   *vehiclepb.Vehicle\n}\n\n// Swapi_ListFilmsReplyArgument is argument for \"swapi.ListFilmsReply\" message.\ntype SWAPI_Swapi_ListFilmsReplyArgument struct {\n\tF   *Films\n\tIds []int64\n}\n\n// Swapi_ListPeopleReplyArgument is argument for \"swapi.ListPeopleReply\" message.\ntype SWAPI_Swapi_ListPeopleReplyArgument struct {\n\tIds []int64\n\tP   *People\n}\n\n// Swapi_ListPlanetsReplyArgument is argument for \"swapi.ListPlanetsReply\" message.\ntype SWAPI_Swapi_ListPlanetsReplyArgument struct {\n\tIds []int64\n\tP   *Planets\n}\n\n// Swapi_ListSpeciesReplyArgument is argument for \"swapi.ListSpeciesReply\" message.\ntype SWAPI_Swapi_ListSpeciesReplyArgument struct {\n\tIds []int64\n\tS   *SpeciesList\n}\n\n// Swapi_ListStarshipsReplyArgument is argument for \"swapi.ListStarshipsReply\" message.\ntype SWAPI_Swapi_ListStarshipsReplyArgument struct {\n\tIds []int64\n\tS   *Starships\n}\n\n// Swapi_ListVehiclesReplyArgument is argument for \"swapi.ListVehiclesReply\" message.\ntype SWAPI_Swapi_ListVehiclesReplyArgument struct {\n\tIds []int64\n\tV   *Vehicles\n}\n\n// Swapi_PeopleArgument is argument for \"swapi.People\" message.\ntype SWAPI_Swapi_PeopleArgument struct {\n\tIds []int64\n\tRes *personpb.ListPeopleReply\n}\n\n// Swapi_PlanetsArgument is argument for \"swapi.Planets\" message.\ntype SWAPI_Swapi_PlanetsArgument struct {\n\tIds []int64\n\tRes *planetpb.ListPlanetsReply\n}\n\n// Swapi_SpeciesListArgument is argument for \"swapi.SpeciesList\" message.\ntype SWAPI_Swapi_SpeciesListArgument struct {\n\tIds []int64\n\tRes *speciespb.ListSpeciesReply\n}\n\n// Swapi_StarshipsArgument is argument for \"swapi.Starships\" message.\ntype SWAPI_Swapi_StarshipsArgument struct {\n\tIds []int64\n\tRes *starshippb.ListStarshipsReply\n}\n\n// Swapi_VehiclesArgument is argument for \"swapi.Vehicles\" message.\ntype SWAPI_Swapi_VehiclesArgument struct {\n\tIds []int64\n\tRes *vehiclepb.ListVehiclesReply\n}\n\n// SWAPIConfig configuration required to initialize the service that use GRPC Federation.\ntype SWAPIConfig struct {\n\t// Client provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\n\t// If this interface is not provided, an error is returned during initialization.\n\tClient SWAPIClientFactory // required\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// SWAPIClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype SWAPIClientFactory interface {\n\t// Swapi_Film_FilmServiceClient create a gRPC Client to be used to call methods in swapi.film.FilmService.\n\tSwapi_Film_FilmServiceClient(SWAPIClientConfig) (filmpb.FilmServiceClient, error)\n\t// Swapi_Person_PersonServiceClient create a gRPC Client to be used to call methods in swapi.person.PersonService.\n\tSwapi_Person_PersonServiceClient(SWAPIClientConfig) (personpb.PersonServiceClient, error)\n\t// Swapi_Planet_PlanetServiceClient create a gRPC Client to be used to call methods in swapi.planet.PlanetService.\n\tSwapi_Planet_PlanetServiceClient(SWAPIClientConfig) (planetpb.PlanetServiceClient, error)\n\t// Swapi_Species_SpeciesServiceClient create a gRPC Client to be used to call methods in swapi.species.SpeciesService.\n\tSwapi_Species_SpeciesServiceClient(SWAPIClientConfig) (speciespb.SpeciesServiceClient, error)\n\t// Swapi_Starship_StarshipServiceClient create a gRPC Client to be used to call methods in swapi.starship.StarshipService.\n\tSwapi_Starship_StarshipServiceClient(SWAPIClientConfig) (starshippb.StarshipServiceClient, error)\n\t// Swapi_Vehicle_VehicleServiceClient create a gRPC Client to be used to call methods in swapi.vehicle.VehicleService.\n\tSwapi_Vehicle_VehicleServiceClient(SWAPIClientConfig) (vehiclepb.VehicleServiceClient, error)\n}\n\n// SWAPIClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype SWAPIClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// SWAPIDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype SWAPIDependentClientSet struct {\n\tSwapi_Film_FilmServiceClient         filmpb.FilmServiceClient\n\tSwapi_Person_PersonServiceClient     personpb.PersonServiceClient\n\tSwapi_Planet_PlanetServiceClient     planetpb.PlanetServiceClient\n\tSwapi_Species_SpeciesServiceClient   speciespb.SpeciesServiceClient\n\tSwapi_Starship_StarshipServiceClient starshippb.StarshipServiceClient\n\tSwapi_Vehicle_VehicleServiceClient   vehiclepb.VehicleServiceClient\n}\n\n// SWAPIResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype SWAPIResolver interface {\n}\n\n// SWAPICELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype SWAPICELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// SWAPICELPluginConfig hints for loading a WebAssembly based plugin.\ntype SWAPICELPluginConfig struct {\n}\n\n// SWAPIUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype SWAPIUnimplementedResolver struct{}\n\nconst (\n\tSWAPI_DependentMethod_Swapi_Film_FilmService_GetFilm               = \"/swapi.film.FilmService/GetFilm\"\n\tSWAPI_DependentMethod_Swapi_Film_FilmService_ListFilms             = \"/swapi.film.FilmService/ListFilms\"\n\tSWAPI_DependentMethod_Swapi_Person_PersonService_GetPerson         = \"/swapi.person.PersonService/GetPerson\"\n\tSWAPI_DependentMethod_Swapi_Person_PersonService_ListPeople        = \"/swapi.person.PersonService/ListPeople\"\n\tSWAPI_DependentMethod_Swapi_Planet_PlanetService_GetPlanet         = \"/swapi.planet.PlanetService/GetPlanet\"\n\tSWAPI_DependentMethod_Swapi_Planet_PlanetService_ListPlanets       = \"/swapi.planet.PlanetService/ListPlanets\"\n\tSWAPI_DependentMethod_Swapi_Species_SpeciesService_GetSpecies      = \"/swapi.species.SpeciesService/GetSpecies\"\n\tSWAPI_DependentMethod_Swapi_Species_SpeciesService_ListSpecies     = \"/swapi.species.SpeciesService/ListSpecies\"\n\tSWAPI_DependentMethod_Swapi_Starship_StarshipService_GetStarship   = \"/swapi.starship.StarshipService/GetStarship\"\n\tSWAPI_DependentMethod_Swapi_Starship_StarshipService_ListStarships = \"/swapi.starship.StarshipService/ListStarships\"\n\tSWAPI_DependentMethod_Swapi_Vehicle_VehicleService_GetVehicle      = \"/swapi.vehicle.VehicleService/GetVehicle\"\n\tSWAPI_DependentMethod_Swapi_Vehicle_VehicleService_ListVehicles    = \"/swapi.vehicle.VehicleService/ListVehicles\"\n)\n\n// SWAPI represents Federation Service.\ntype SWAPI struct {\n\tUnimplementedSWAPIServer\n\tcfg                SWAPIConfig\n\tlogger             *slog.Logger\n\terrorHandler       grpcfed.ErrorHandler\n\tcelCacheMap        *grpcfed.CELCacheMap\n\ttracer             trace.Tracer\n\tcelTypeHelper      *grpcfed.CELTypeHelper\n\tcelEnvOpts         []grpcfed.CELEnvOption\n\tcelPluginInstances []*grpcfedcel.CELPluginInstance\n\tclient             *SWAPIDependentClientSet\n}\n\n// NewSWAPI creates SWAPI instance by SWAPIConfig.\nfunc NewSWAPI(cfg SWAPIConfig) (*SWAPI, error) {\n\tif cfg.Client == nil {\n\t\treturn nil, grpcfed.ErrClientConfig\n\t}\n\tSwapi_Film_FilmServiceClient, err := cfg.Client.Swapi_Film_FilmServiceClient(SWAPIClientConfig{\n\t\tService: \"swapi.film.FilmService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tSwapi_Person_PersonServiceClient, err := cfg.Client.Swapi_Person_PersonServiceClient(SWAPIClientConfig{\n\t\tService: \"swapi.person.PersonService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tSwapi_Planet_PlanetServiceClient, err := cfg.Client.Swapi_Planet_PlanetServiceClient(SWAPIClientConfig{\n\t\tService: \"swapi.planet.PlanetService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tSwapi_Species_SpeciesServiceClient, err := cfg.Client.Swapi_Species_SpeciesServiceClient(SWAPIClientConfig{\n\t\tService: \"swapi.species.SpeciesService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tSwapi_Starship_StarshipServiceClient, err := cfg.Client.Swapi_Starship_StarshipServiceClient(SWAPIClientConfig{\n\t\tService: \"swapi.starship.StarshipService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tSwapi_Vehicle_VehicleServiceClient, err := cfg.Client.Swapi_Vehicle_VehicleServiceClient(SWAPIClientConfig{\n\t\tService: \"swapi.vehicle.VehicleService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.swapi.FilmsArgument\": {\n\t\t\t\"ids\": grpcfed.NewCELFieldType(grpcfed.NewCELListType(grpcfed.CELIntType), \"Ids\"),\n\t\t},\n\t\t\"grpc.federation.private.swapi.GetFilmReplyArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELIntType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.swapi.GetPersonReplyArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELIntType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.swapi.GetPlanetReplyArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELIntType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.swapi.GetSpeciesReplyArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELIntType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.swapi.GetStarshipReplyArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELIntType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.swapi.GetVehicleReplyArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELIntType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.swapi.ListFilmsReplyArgument\": {\n\t\t\t\"ids\": grpcfed.NewCELFieldType(grpcfed.NewCELListType(grpcfed.CELIntType), \"Ids\"),\n\t\t},\n\t\t\"grpc.federation.private.swapi.ListPeopleReplyArgument\": {\n\t\t\t\"ids\": grpcfed.NewCELFieldType(grpcfed.NewCELListType(grpcfed.CELIntType), \"Ids\"),\n\t\t},\n\t\t\"grpc.federation.private.swapi.ListPlanetsReplyArgument\": {\n\t\t\t\"ids\": grpcfed.NewCELFieldType(grpcfed.NewCELListType(grpcfed.CELIntType), \"Ids\"),\n\t\t},\n\t\t\"grpc.federation.private.swapi.ListSpeciesReplyArgument\": {\n\t\t\t\"ids\": grpcfed.NewCELFieldType(grpcfed.NewCELListType(grpcfed.CELIntType), \"Ids\"),\n\t\t},\n\t\t\"grpc.federation.private.swapi.ListStarshipsReplyArgument\": {\n\t\t\t\"ids\": grpcfed.NewCELFieldType(grpcfed.NewCELListType(grpcfed.CELIntType), \"Ids\"),\n\t\t},\n\t\t\"grpc.federation.private.swapi.ListVehiclesReplyArgument\": {\n\t\t\t\"ids\": grpcfed.NewCELFieldType(grpcfed.NewCELListType(grpcfed.CELIntType), \"Ids\"),\n\t\t},\n\t\t\"grpc.federation.private.swapi.PeopleArgument\": {\n\t\t\t\"ids\": grpcfed.NewCELFieldType(grpcfed.NewCELListType(grpcfed.CELIntType), \"Ids\"),\n\t\t},\n\t\t\"grpc.federation.private.swapi.PlanetsArgument\": {\n\t\t\t\"ids\": grpcfed.NewCELFieldType(grpcfed.NewCELListType(grpcfed.CELIntType), \"Ids\"),\n\t\t},\n\t\t\"grpc.federation.private.swapi.SpeciesListArgument\": {\n\t\t\t\"ids\": grpcfed.NewCELFieldType(grpcfed.NewCELListType(grpcfed.CELIntType), \"Ids\"),\n\t\t},\n\t\t\"grpc.federation.private.swapi.StarshipsArgument\": {\n\t\t\t\"ids\": grpcfed.NewCELFieldType(grpcfed.NewCELListType(grpcfed.CELIntType), \"Ids\"),\n\t\t},\n\t\t\"grpc.federation.private.swapi.VehiclesArgument\": {\n\t\t\t\"ids\": grpcfed.NewCELFieldType(grpcfed.NewCELListType(grpcfed.CELIntType), \"Ids\"),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"swapi\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tsvc := &SWAPI{\n\t\tcfg:           cfg,\n\t\tlogger:        logger,\n\t\terrorHandler:  errorHandler,\n\t\tcelEnvOpts:    celEnvOpts,\n\t\tcelTypeHelper: celTypeHelper,\n\t\tcelCacheMap:   grpcfed.NewCELCacheMap(),\n\t\ttracer:        otel.Tracer(\"swapi.SWAPI\"),\n\t\tclient: &SWAPIDependentClientSet{\n\t\t\tSwapi_Film_FilmServiceClient:         Swapi_Film_FilmServiceClient,\n\t\t\tSwapi_Person_PersonServiceClient:     Swapi_Person_PersonServiceClient,\n\t\t\tSwapi_Planet_PlanetServiceClient:     Swapi_Planet_PlanetServiceClient,\n\t\t\tSwapi_Species_SpeciesServiceClient:   Swapi_Species_SpeciesServiceClient,\n\t\t\tSwapi_Starship_StarshipServiceClient: Swapi_Starship_StarshipServiceClient,\n\t\t\tSwapi_Vehicle_VehicleServiceClient:   Swapi_Vehicle_VehicleServiceClient,\n\t\t},\n\t}\n\treturn svc, nil\n}\n\n// CleanupSWAPI cleanup all resources to prevent goroutine leaks.\nfunc CleanupSWAPI(ctx context.Context, svc *SWAPI) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *SWAPI) cleanup(ctx context.Context) {\n\tfor _, instance := range s.celPluginInstances {\n\t\tinstance.Close(ctx)\n\t}\n}\n\n// GetPerson implements \"swapi.SWAPI/GetPerson\" method.\nfunc (s *SWAPI) GetPerson(ctx context.Context, req *GetPersonRequest) (res *GetPersonReply, e error) {\n\tctx, span := s.tracer.Start(ctx, \"swapi.SWAPI/GetPerson\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\n\tdefer func() {\n\t\t// cleanup plugin instance memory.\n\t\tfor _, instance := range s.celPluginInstances {\n\t\t\tinstance.GC()\n\t\t}\n\t}()\n\tres, err := s.resolve_Swapi_GetPersonReply(ctx, &SWAPI_Swapi_GetPersonReplyArgument{\n\t\tId: req.GetId(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// ListPeople implements \"swapi.SWAPI/ListPeople\" method.\nfunc (s *SWAPI) ListPeople(ctx context.Context, req *ListPeopleRequest) (res *ListPeopleReply, e error) {\n\tctx, span := s.tracer.Start(ctx, \"swapi.SWAPI/ListPeople\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\n\tdefer func() {\n\t\t// cleanup plugin instance memory.\n\t\tfor _, instance := range s.celPluginInstances {\n\t\t\tinstance.GC()\n\t\t}\n\t}()\n\tres, err := s.resolve_Swapi_ListPeopleReply(ctx, &SWAPI_Swapi_ListPeopleReplyArgument{\n\t\tIds: req.GetIds(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// GetFilm implements \"swapi.SWAPI/GetFilm\" method.\nfunc (s *SWAPI) GetFilm(ctx context.Context, req *GetFilmRequest) (res *GetFilmReply, e error) {\n\tctx, span := s.tracer.Start(ctx, \"swapi.SWAPI/GetFilm\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\n\tdefer func() {\n\t\t// cleanup plugin instance memory.\n\t\tfor _, instance := range s.celPluginInstances {\n\t\t\tinstance.GC()\n\t\t}\n\t}()\n\tres, err := s.resolve_Swapi_GetFilmReply(ctx, &SWAPI_Swapi_GetFilmReplyArgument{\n\t\tId: req.GetId(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// ListFilms implements \"swapi.SWAPI/ListFilms\" method.\nfunc (s *SWAPI) ListFilms(ctx context.Context, req *ListFilmsRequest) (res *ListFilmsReply, e error) {\n\tctx, span := s.tracer.Start(ctx, \"swapi.SWAPI/ListFilms\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\n\tdefer func() {\n\t\t// cleanup plugin instance memory.\n\t\tfor _, instance := range s.celPluginInstances {\n\t\t\tinstance.GC()\n\t\t}\n\t}()\n\tres, err := s.resolve_Swapi_ListFilmsReply(ctx, &SWAPI_Swapi_ListFilmsReplyArgument{\n\t\tIds: req.GetIds(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// GetStarship implements \"swapi.SWAPI/GetStarship\" method.\nfunc (s *SWAPI) GetStarship(ctx context.Context, req *GetStarshipRequest) (res *GetStarshipReply, e error) {\n\tctx, span := s.tracer.Start(ctx, \"swapi.SWAPI/GetStarship\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\n\tdefer func() {\n\t\t// cleanup plugin instance memory.\n\t\tfor _, instance := range s.celPluginInstances {\n\t\t\tinstance.GC()\n\t\t}\n\t}()\n\tres, err := s.resolve_Swapi_GetStarshipReply(ctx, &SWAPI_Swapi_GetStarshipReplyArgument{\n\t\tId: req.GetId(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// ListStarships implements \"swapi.SWAPI/ListStarships\" method.\nfunc (s *SWAPI) ListStarships(ctx context.Context, req *ListStarshipsRequest) (res *ListStarshipsReply, e error) {\n\tctx, span := s.tracer.Start(ctx, \"swapi.SWAPI/ListStarships\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\n\tdefer func() {\n\t\t// cleanup plugin instance memory.\n\t\tfor _, instance := range s.celPluginInstances {\n\t\t\tinstance.GC()\n\t\t}\n\t}()\n\tres, err := s.resolve_Swapi_ListStarshipsReply(ctx, &SWAPI_Swapi_ListStarshipsReplyArgument{\n\t\tIds: req.GetIds(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// GetSpecies implements \"swapi.SWAPI/GetSpecies\" method.\nfunc (s *SWAPI) GetSpecies(ctx context.Context, req *GetSpeciesRequest) (res *GetSpeciesReply, e error) {\n\tctx, span := s.tracer.Start(ctx, \"swapi.SWAPI/GetSpecies\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\n\tdefer func() {\n\t\t// cleanup plugin instance memory.\n\t\tfor _, instance := range s.celPluginInstances {\n\t\t\tinstance.GC()\n\t\t}\n\t}()\n\tres, err := s.resolve_Swapi_GetSpeciesReply(ctx, &SWAPI_Swapi_GetSpeciesReplyArgument{\n\t\tId: req.GetId(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// ListSpecies implements \"swapi.SWAPI/ListSpecies\" method.\nfunc (s *SWAPI) ListSpecies(ctx context.Context, req *ListSpeciesRequest) (res *ListSpeciesReply, e error) {\n\tctx, span := s.tracer.Start(ctx, \"swapi.SWAPI/ListSpecies\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\n\tdefer func() {\n\t\t// cleanup plugin instance memory.\n\t\tfor _, instance := range s.celPluginInstances {\n\t\t\tinstance.GC()\n\t\t}\n\t}()\n\tres, err := s.resolve_Swapi_ListSpeciesReply(ctx, &SWAPI_Swapi_ListSpeciesReplyArgument{\n\t\tIds: req.GetIds(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// GetVehicle implements \"swapi.SWAPI/GetVehicle\" method.\nfunc (s *SWAPI) GetVehicle(ctx context.Context, req *GetVehicleRequest) (res *GetVehicleReply, e error) {\n\tctx, span := s.tracer.Start(ctx, \"swapi.SWAPI/GetVehicle\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\n\tdefer func() {\n\t\t// cleanup plugin instance memory.\n\t\tfor _, instance := range s.celPluginInstances {\n\t\t\tinstance.GC()\n\t\t}\n\t}()\n\tres, err := s.resolve_Swapi_GetVehicleReply(ctx, &SWAPI_Swapi_GetVehicleReplyArgument{\n\t\tId: req.GetId(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// ListVehicles implements \"swapi.SWAPI/ListVehicles\" method.\nfunc (s *SWAPI) ListVehicles(ctx context.Context, req *ListVehiclesRequest) (res *ListVehiclesReply, e error) {\n\tctx, span := s.tracer.Start(ctx, \"swapi.SWAPI/ListVehicles\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\n\tdefer func() {\n\t\t// cleanup plugin instance memory.\n\t\tfor _, instance := range s.celPluginInstances {\n\t\t\tinstance.GC()\n\t\t}\n\t}()\n\tres, err := s.resolve_Swapi_ListVehiclesReply(ctx, &SWAPI_Swapi_ListVehiclesReplyArgument{\n\t\tIds: req.GetIds(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// GetPlanet implements \"swapi.SWAPI/GetPlanet\" method.\nfunc (s *SWAPI) GetPlanet(ctx context.Context, req *GetPlanetRequest) (res *GetPlanetReply, e error) {\n\tctx, span := s.tracer.Start(ctx, \"swapi.SWAPI/GetPlanet\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\n\tdefer func() {\n\t\t// cleanup plugin instance memory.\n\t\tfor _, instance := range s.celPluginInstances {\n\t\t\tinstance.GC()\n\t\t}\n\t}()\n\tres, err := s.resolve_Swapi_GetPlanetReply(ctx, &SWAPI_Swapi_GetPlanetReplyArgument{\n\t\tId: req.GetId(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// ListPlanets implements \"swapi.SWAPI/ListPlanets\" method.\nfunc (s *SWAPI) ListPlanets(ctx context.Context, req *ListPlanetsRequest) (res *ListPlanetsReply, e error) {\n\tctx, span := s.tracer.Start(ctx, \"swapi.SWAPI/ListPlanets\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\n\tdefer func() {\n\t\t// cleanup plugin instance memory.\n\t\tfor _, instance := range s.celPluginInstances {\n\t\t\tinstance.GC()\n\t\t}\n\t}()\n\tres, err := s.resolve_Swapi_ListPlanetsReply(ctx, &SWAPI_Swapi_ListPlanetsReplyArgument{\n\t\tIds: req.GetIds(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Swapi_Films resolve \"swapi.Films\" message.\nfunc (s *SWAPI) resolve_Swapi_Films(ctx context.Context, req *SWAPI_Swapi_FilmsArgument) (*Films, error) {\n\tctx, span := s.tracer.Start(ctx, \"swapi.Films\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve swapi.Films\", slog.Any(\"message_args\", s.logvalue_Swapi_FilmsArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tRes *filmpb.ListFilmsReply\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.swapi.FilmsArgument\", req)}\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"swapi.film.FilmService/ListFilms\"\n\t\t    request { field: \"ids\", by: \"$.ids\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*filmpb.ListFilmsReply, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.film.ListFilmsReply\"),\n\t\t\tSetter: func(value *localValueType, v *filmpb.ListFilmsReply) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &filmpb.ListFilmsRequest{}\n\t\t\t\t// { field: \"ids\", by: \"$.ids\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.ids`,\n\t\t\t\t\tCacheIndex: 1,\n\t\t\t\t\tSetter: func(v []int64) error {\n\t\t\t\t\t\targs.Ids = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call swapi.film.FilmService/ListFilms\", slog.Any(\"swapi.film.ListFilmsRequest\", s.logvalue_Swapi_Film_ListFilmsRequest(args)))\n\t\t\t\tret, err := s.client.Swapi_Film_FilmServiceClient.ListFilms(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, SWAPI_DependentMethod_Swapi_Film_FilmService_ListFilms, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_res(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.Res = value.vars.Res\n\n\t// create a message value to be returned.\n\tret := &Films{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"res.films\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]*filmpb.Film]{\n\t\tValue:      value,\n\t\tExpr:       `res.films`,\n\t\tCacheIndex: 2,\n\t\tSetter: func(v []*filmpb.Film) error {\n\t\t\tfilmsValue, err := s.cast_repeated_Swapi_Film_Film__to__repeated_Swapi_Film(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.Films = filmsValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved swapi.Films\", slog.Any(\"swapi.Films\", s.logvalue_Swapi_Films(ret)))\n\treturn ret, nil\n}\n\n// resolve_Swapi_GetFilmReply resolve \"swapi.GetFilmReply\" message.\nfunc (s *SWAPI) resolve_Swapi_GetFilmReply(ctx context.Context, req *SWAPI_Swapi_GetFilmReplyArgument) (*GetFilmReply, error) {\n\tctx, span := s.tracer.Start(ctx, \"swapi.GetFilmReply\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve swapi.GetFilmReply\", slog.Any(\"message_args\", s.logvalue_Swapi_GetFilmReplyArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tCharacters *People\n\t\t\tF          *filmpb.Film\n\t\t\tPlanets    *Planets\n\t\t\tRes        *filmpb.GetFilmReply\n\t\t\tSpecies    *SpeciesList\n\t\t\tStarships  *Starships\n\t\t\tV          *Vehicles\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.swapi.GetFilmReplyArgument\", req)}\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"swapi.film.FilmService/GetFilm\"\n\t\t    request { field: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*filmpb.GetFilmReply, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.film.GetFilmReply\"),\n\t\t\tSetter: func(value *localValueType, v *filmpb.GetFilmReply) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &filmpb.GetFilmRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 3,\n\t\t\t\t\tSetter: func(v int64) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call swapi.film.FilmService/GetFilm\", slog.Any(\"swapi.film.GetFilmRequest\", s.logvalue_Swapi_Film_GetFilmRequest(args)))\n\t\t\t\tret, err := s.client.Swapi_Film_FilmServiceClient.GetFilm(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, SWAPI_DependentMethod_Swapi_Film_FilmService_GetFilm, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"f\"\n\t\t  by: \"res.film\"\n\t\t}\n\t*/\n\tdef_f := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*filmpb.Film, *localValueType]{\n\t\t\tName: `f`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.film.Film\"),\n\t\t\tSetter: func(value *localValueType, v *filmpb.Film) error {\n\t\t\t\tvalue.vars.F = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `res.film`,\n\t\t\tByCacheIndex: 4,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"species\"\n\t\t  message {\n\t\t    name: \"SpeciesList\"\n\t\t    args { name: \"ids\", by: \"f.species_ids\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_species := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*SpeciesList, *localValueType]{\n\t\t\tName: `species`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.SpeciesList\"),\n\t\t\tSetter: func(value *localValueType, v *SpeciesList) error {\n\t\t\t\tvalue.vars.Species = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &SWAPI_Swapi_SpeciesListArgument{}\n\t\t\t\t// { name: \"ids\", by: \"f.species_ids\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `f.species_ids`,\n\t\t\t\t\tCacheIndex: 5,\n\t\t\t\t\tSetter: func(v []int64) error {\n\t\t\t\t\t\targs.Ids = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Swapi_SpeciesList(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"starships\"\n\t\t  message {\n\t\t    name: \"Starships\"\n\t\t    args { name: \"ids\", by: \"f.starship_ids\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_starships := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Starships, *localValueType]{\n\t\t\tName: `starships`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.Starships\"),\n\t\t\tSetter: func(value *localValueType, v *Starships) error {\n\t\t\t\tvalue.vars.Starships = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &SWAPI_Swapi_StarshipsArgument{}\n\t\t\t\t// { name: \"ids\", by: \"f.starship_ids\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `f.starship_ids`,\n\t\t\t\t\tCacheIndex: 6,\n\t\t\t\t\tSetter: func(v []int64) error {\n\t\t\t\t\t\targs.Ids = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Swapi_Starships(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"v\"\n\t\t  message {\n\t\t    name: \"Vehicles\"\n\t\t    args { name: \"ids\", by: \"f.vehicle_ids\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_v := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Vehicles, *localValueType]{\n\t\t\tName: `v`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.Vehicles\"),\n\t\t\tSetter: func(value *localValueType, v *Vehicles) error {\n\t\t\t\tvalue.vars.V = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &SWAPI_Swapi_VehiclesArgument{}\n\t\t\t\t// { name: \"ids\", by: \"f.vehicle_ids\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `f.vehicle_ids`,\n\t\t\t\t\tCacheIndex: 7,\n\t\t\t\t\tSetter: func(v []int64) error {\n\t\t\t\t\t\targs.Ids = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Swapi_Vehicles(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"characters\"\n\t\t  message {\n\t\t    name: \"People\"\n\t\t    args { name: \"ids\", by: \"f.character_ids\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_characters := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*People, *localValueType]{\n\t\t\tName: `characters`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.People\"),\n\t\t\tSetter: func(value *localValueType, v *People) error {\n\t\t\t\tvalue.vars.Characters = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &SWAPI_Swapi_PeopleArgument{}\n\t\t\t\t// { name: \"ids\", by: \"f.character_ids\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `f.character_ids`,\n\t\t\t\t\tCacheIndex: 8,\n\t\t\t\t\tSetter: func(v []int64) error {\n\t\t\t\t\t\targs.Ids = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Swapi_People(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"planets\"\n\t\t  message {\n\t\t    name: \"Planets\"\n\t\t    args { name: \"ids\", by: \"f.planet_ids\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_planets := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Planets, *localValueType]{\n\t\t\tName: `planets`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.Planets\"),\n\t\t\tSetter: func(value *localValueType, v *Planets) error {\n\t\t\t\tvalue.vars.Planets = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &SWAPI_Swapi_PlanetsArgument{}\n\t\t\t\t// { name: \"ids\", by: \"f.planet_ids\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `f.planet_ids`,\n\t\t\t\t\tCacheIndex: 9,\n\t\t\t\t\tSetter: func(v []int64) error {\n\t\t\t\t\t\targs.Ids = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Swapi_Planets(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t   res ─┐\n\t        f ─┐\n\t           characters ─┐\n\t   res ─┐              │\n\t        f ─┐           │\n\t              planets ─┤\n\t   res ─┐              │\n\t        f ─┐           │\n\t              species ─┤\n\t   res ─┐              │\n\t        f ─┐           │\n\t            starships ─┤\n\t   res ─┐              │\n\t        f ─┐           │\n\t                    v ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_f(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_characters(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_f(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_planets(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_f(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_species(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_f(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_starships(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_f(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_v(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.Characters = value.vars.Characters\n\treq.F = value.vars.F\n\treq.Planets = value.vars.Planets\n\treq.Res = value.vars.Res\n\treq.Species = value.vars.Species\n\treq.Starships = value.vars.Starships\n\treq.V = value.vars.V\n\n\t// create a message value to be returned.\n\tret := &GetFilmReply{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"f\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*filmpb.Film]{\n\t\tValue:      value,\n\t\tExpr:       `f`,\n\t\tCacheIndex: 10,\n\t\tSetter: func(v *filmpb.Film) error {\n\t\t\tfilmValue, err := s.cast_Swapi_Film_Film__to__Swapi_Film(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.Film = filmValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"species.species\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]*Species]{\n\t\tValue:      value,\n\t\tExpr:       `species.species`,\n\t\tCacheIndex: 11,\n\t\tSetter: func(v []*Species) error {\n\t\t\tret.Species = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"starships.starships\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]*Starship]{\n\t\tValue:      value,\n\t\tExpr:       `starships.starships`,\n\t\tCacheIndex: 12,\n\t\tSetter: func(v []*Starship) error {\n\t\t\tret.Starships = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"v.vehicles\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]*Vehicle]{\n\t\tValue:      value,\n\t\tExpr:       `v.vehicles`,\n\t\tCacheIndex: 13,\n\t\tSetter: func(v []*Vehicle) error {\n\t\t\tret.Vehicles = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"characters.people\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]*Person]{\n\t\tValue:      value,\n\t\tExpr:       `characters.people`,\n\t\tCacheIndex: 14,\n\t\tSetter: func(v []*Person) error {\n\t\t\tret.Characters = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"planets.planets\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]*Planet]{\n\t\tValue:      value,\n\t\tExpr:       `planets.planets`,\n\t\tCacheIndex: 15,\n\t\tSetter: func(v []*Planet) error {\n\t\t\tret.Planets = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved swapi.GetFilmReply\", slog.Any(\"swapi.GetFilmReply\", s.logvalue_Swapi_GetFilmReply(ret)))\n\treturn ret, nil\n}\n\n// resolve_Swapi_GetPersonReply resolve \"swapi.GetPersonReply\" message.\nfunc (s *SWAPI) resolve_Swapi_GetPersonReply(ctx context.Context, req *SWAPI_Swapi_GetPersonReplyArgument) (*GetPersonReply, error) {\n\tctx, span := s.tracer.Start(ctx, \"swapi.GetPersonReply\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve swapi.GetPersonReply\", slog.Any(\"message_args\", s.logvalue_Swapi_GetPersonReplyArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tF         *Films\n\t\t\tP         *personpb.Person\n\t\t\tRes       *personpb.GetPersonReply\n\t\t\tSpecies   *SpeciesList\n\t\t\tStarships *Starships\n\t\t\tV         *Vehicles\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.swapi.GetPersonReplyArgument\", req)}\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"swapi.person.PersonService/GetPerson\"\n\t\t    request { field: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*personpb.GetPersonReply, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.person.GetPersonReply\"),\n\t\t\tSetter: func(value *localValueType, v *personpb.GetPersonReply) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &personpb.GetPersonRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 16,\n\t\t\t\t\tSetter: func(v int64) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call swapi.person.PersonService/GetPerson\", slog.Any(\"swapi.person.GetPersonRequest\", s.logvalue_Swapi_Person_GetPersonRequest(args)))\n\t\t\t\tret, err := s.client.Swapi_Person_PersonServiceClient.GetPerson(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, SWAPI_DependentMethod_Swapi_Person_PersonService_GetPerson, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"p\"\n\t\t  by: \"res.person\"\n\t\t}\n\t*/\n\tdef_p := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*personpb.Person, *localValueType]{\n\t\t\tName: `p`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.person.Person\"),\n\t\t\tSetter: func(value *localValueType, v *personpb.Person) error {\n\t\t\t\tvalue.vars.P = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `res.person`,\n\t\t\tByCacheIndex: 17,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"f\"\n\t\t  message {\n\t\t    name: \"Films\"\n\t\t    args { name: \"ids\", by: \"p.film_ids\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_f := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Films, *localValueType]{\n\t\t\tName: `f`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.Films\"),\n\t\t\tSetter: func(value *localValueType, v *Films) error {\n\t\t\t\tvalue.vars.F = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &SWAPI_Swapi_FilmsArgument{}\n\t\t\t\t// { name: \"ids\", by: \"p.film_ids\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `p.film_ids`,\n\t\t\t\t\tCacheIndex: 18,\n\t\t\t\t\tSetter: func(v []int64) error {\n\t\t\t\t\t\targs.Ids = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Swapi_Films(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"species\"\n\t\t  message {\n\t\t    name: \"SpeciesList\"\n\t\t    args { name: \"ids\", by: \"p.species_ids\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_species := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*SpeciesList, *localValueType]{\n\t\t\tName: `species`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.SpeciesList\"),\n\t\t\tSetter: func(value *localValueType, v *SpeciesList) error {\n\t\t\t\tvalue.vars.Species = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &SWAPI_Swapi_SpeciesListArgument{}\n\t\t\t\t// { name: \"ids\", by: \"p.species_ids\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `p.species_ids`,\n\t\t\t\t\tCacheIndex: 19,\n\t\t\t\t\tSetter: func(v []int64) error {\n\t\t\t\t\t\targs.Ids = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Swapi_SpeciesList(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"starships\"\n\t\t  message {\n\t\t    name: \"Starships\"\n\t\t    args { name: \"ids\", by: \"p.starship_ids\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_starships := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Starships, *localValueType]{\n\t\t\tName: `starships`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.Starships\"),\n\t\t\tSetter: func(value *localValueType, v *Starships) error {\n\t\t\t\tvalue.vars.Starships = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &SWAPI_Swapi_StarshipsArgument{}\n\t\t\t\t// { name: \"ids\", by: \"p.starship_ids\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `p.starship_ids`,\n\t\t\t\t\tCacheIndex: 20,\n\t\t\t\t\tSetter: func(v []int64) error {\n\t\t\t\t\t\targs.Ids = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Swapi_Starships(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"v\"\n\t\t  message {\n\t\t    name: \"Vehicles\"\n\t\t    args { name: \"ids\", by: \"p.vehicle_ids\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_v := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Vehicles, *localValueType]{\n\t\t\tName: `v`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.Vehicles\"),\n\t\t\tSetter: func(value *localValueType, v *Vehicles) error {\n\t\t\t\tvalue.vars.V = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &SWAPI_Swapi_VehiclesArgument{}\n\t\t\t\t// { name: \"ids\", by: \"p.vehicle_ids\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `p.vehicle_ids`,\n\t\t\t\t\tCacheIndex: 21,\n\t\t\t\t\tSetter: func(v []int64) error {\n\t\t\t\t\t\targs.Ids = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Swapi_Vehicles(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t   res ─┐\n\t        p ─┐\n\t                   f ─┐\n\t   res ─┐             │\n\t        p ─┐          │\n\t             species ─┤\n\t   res ─┐             │\n\t        p ─┐          │\n\t           starships ─┤\n\t   res ─┐             │\n\t        p ─┐          │\n\t                   v ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_p(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_f(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_p(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_species(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_p(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_starships(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_p(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_v(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.F = value.vars.F\n\treq.P = value.vars.P\n\treq.Res = value.vars.Res\n\treq.Species = value.vars.Species\n\treq.Starships = value.vars.Starships\n\treq.V = value.vars.V\n\n\t// create a message value to be returned.\n\tret := &GetPersonReply{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"p\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*personpb.Person]{\n\t\tValue:      value,\n\t\tExpr:       `p`,\n\t\tCacheIndex: 22,\n\t\tSetter: func(v *personpb.Person) error {\n\t\t\tpersonValue, err := s.cast_Swapi_Person_Person__to__Swapi_Person(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.Person = personValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"f.films\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]*Film]{\n\t\tValue:      value,\n\t\tExpr:       `f.films`,\n\t\tCacheIndex: 23,\n\t\tSetter: func(v []*Film) error {\n\t\t\tret.Films = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"species.species\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]*Species]{\n\t\tValue:      value,\n\t\tExpr:       `species.species`,\n\t\tCacheIndex: 24,\n\t\tSetter: func(v []*Species) error {\n\t\t\tret.Species = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"starships.starships\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]*Starship]{\n\t\tValue:      value,\n\t\tExpr:       `starships.starships`,\n\t\tCacheIndex: 25,\n\t\tSetter: func(v []*Starship) error {\n\t\t\tret.Starships = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"v.vehicles\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]*Vehicle]{\n\t\tValue:      value,\n\t\tExpr:       `v.vehicles`,\n\t\tCacheIndex: 26,\n\t\tSetter: func(v []*Vehicle) error {\n\t\t\tret.Vehicles = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved swapi.GetPersonReply\", slog.Any(\"swapi.GetPersonReply\", s.logvalue_Swapi_GetPersonReply(ret)))\n\treturn ret, nil\n}\n\n// resolve_Swapi_GetPlanetReply resolve \"swapi.GetPlanetReply\" message.\nfunc (s *SWAPI) resolve_Swapi_GetPlanetReply(ctx context.Context, req *SWAPI_Swapi_GetPlanetReplyArgument) (*GetPlanetReply, error) {\n\tctx, span := s.tracer.Start(ctx, \"swapi.GetPlanetReply\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve swapi.GetPlanetReply\", slog.Any(\"message_args\", s.logvalue_Swapi_GetPlanetReplyArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tF         *Films\n\t\t\tP         *planetpb.Planet\n\t\t\tRes       *planetpb.GetPlanetReply\n\t\t\tResidents *People\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.swapi.GetPlanetReplyArgument\", req)}\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"swapi.planet.PlanetService/GetPlanet\"\n\t\t    request { field: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*planetpb.GetPlanetReply, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.planet.GetPlanetReply\"),\n\t\t\tSetter: func(value *localValueType, v *planetpb.GetPlanetReply) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &planetpb.GetPlanetRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 27,\n\t\t\t\t\tSetter: func(v int64) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call swapi.planet.PlanetService/GetPlanet\", slog.Any(\"swapi.planet.GetPlanetRequest\", s.logvalue_Swapi_Planet_GetPlanetRequest(args)))\n\t\t\t\tret, err := s.client.Swapi_Planet_PlanetServiceClient.GetPlanet(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, SWAPI_DependentMethod_Swapi_Planet_PlanetService_GetPlanet, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"p\"\n\t\t  by: \"res.planet\"\n\t\t}\n\t*/\n\tdef_p := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*planetpb.Planet, *localValueType]{\n\t\t\tName: `p`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.planet.Planet\"),\n\t\t\tSetter: func(value *localValueType, v *planetpb.Planet) error {\n\t\t\t\tvalue.vars.P = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `res.planet`,\n\t\t\tByCacheIndex: 28,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"residents\"\n\t\t  message {\n\t\t    name: \"People\"\n\t\t    args { name: \"ids\", by: \"p.resident_ids\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_residents := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*People, *localValueType]{\n\t\t\tName: `residents`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.People\"),\n\t\t\tSetter: func(value *localValueType, v *People) error {\n\t\t\t\tvalue.vars.Residents = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &SWAPI_Swapi_PeopleArgument{}\n\t\t\t\t// { name: \"ids\", by: \"p.resident_ids\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `p.resident_ids`,\n\t\t\t\t\tCacheIndex: 29,\n\t\t\t\t\tSetter: func(v []int64) error {\n\t\t\t\t\t\targs.Ids = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Swapi_People(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"f\"\n\t\t  message {\n\t\t    name: \"Films\"\n\t\t    args { name: \"ids\", by: \"p.film_ids\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_f := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Films, *localValueType]{\n\t\t\tName: `f`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.Films\"),\n\t\t\tSetter: func(value *localValueType, v *Films) error {\n\t\t\t\tvalue.vars.F = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &SWAPI_Swapi_FilmsArgument{}\n\t\t\t\t// { name: \"ids\", by: \"p.film_ids\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `p.film_ids`,\n\t\t\t\t\tCacheIndex: 30,\n\t\t\t\t\tSetter: func(v []int64) error {\n\t\t\t\t\t\targs.Ids = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Swapi_Films(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t   res ─┐\n\t        p ─┐\n\t                   f ─┐\n\t   res ─┐             │\n\t        p ─┐          │\n\t           residents ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_p(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_f(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_p(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_residents(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.F = value.vars.F\n\treq.P = value.vars.P\n\treq.Res = value.vars.Res\n\treq.Residents = value.vars.Residents\n\n\t// create a message value to be returned.\n\tret := &GetPlanetReply{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"p\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*planetpb.Planet]{\n\t\tValue:      value,\n\t\tExpr:       `p`,\n\t\tCacheIndex: 31,\n\t\tSetter: func(v *planetpb.Planet) error {\n\t\t\tplanetValue, err := s.cast_Swapi_Planet_Planet__to__Swapi_Planet(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.Planet = planetValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"residents.people\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]*Person]{\n\t\tValue:      value,\n\t\tExpr:       `residents.people`,\n\t\tCacheIndex: 32,\n\t\tSetter: func(v []*Person) error {\n\t\t\tret.Residents = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"f.films\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]*Film]{\n\t\tValue:      value,\n\t\tExpr:       `f.films`,\n\t\tCacheIndex: 33,\n\t\tSetter: func(v []*Film) error {\n\t\t\tret.Films = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved swapi.GetPlanetReply\", slog.Any(\"swapi.GetPlanetReply\", s.logvalue_Swapi_GetPlanetReply(ret)))\n\treturn ret, nil\n}\n\n// resolve_Swapi_GetSpeciesReply resolve \"swapi.GetSpeciesReply\" message.\nfunc (s *SWAPI) resolve_Swapi_GetSpeciesReply(ctx context.Context, req *SWAPI_Swapi_GetSpeciesReplyArgument) (*GetSpeciesReply, error) {\n\tctx, span := s.tracer.Start(ctx, \"swapi.GetSpeciesReply\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve swapi.GetSpeciesReply\", slog.Any(\"message_args\", s.logvalue_Swapi_GetSpeciesReplyArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tF   *Films\n\t\t\tP   *People\n\t\t\tRes *speciespb.GetSpeciesReply\n\t\t\tS   *speciespb.Species\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.swapi.GetSpeciesReplyArgument\", req)}\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"swapi.species.SpeciesService/GetSpecies\"\n\t\t    request { field: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*speciespb.GetSpeciesReply, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.species.GetSpeciesReply\"),\n\t\t\tSetter: func(value *localValueType, v *speciespb.GetSpeciesReply) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &speciespb.GetSpeciesRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 34,\n\t\t\t\t\tSetter: func(v int64) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call swapi.species.SpeciesService/GetSpecies\", slog.Any(\"swapi.species.GetSpeciesRequest\", s.logvalue_Swapi_Species_GetSpeciesRequest(args)))\n\t\t\t\tret, err := s.client.Swapi_Species_SpeciesServiceClient.GetSpecies(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, SWAPI_DependentMethod_Swapi_Species_SpeciesService_GetSpecies, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"s\"\n\t\t  by: \"res.species\"\n\t\t}\n\t*/\n\tdef_s := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*speciespb.Species, *localValueType]{\n\t\t\tName: `s`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.species.Species\"),\n\t\t\tSetter: func(value *localValueType, v *speciespb.Species) error {\n\t\t\t\tvalue.vars.S = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `res.species`,\n\t\t\tByCacheIndex: 35,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"f\"\n\t\t  message {\n\t\t    name: \"Films\"\n\t\t    args { name: \"ids\", by: \"s.film_ids\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_f := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Films, *localValueType]{\n\t\t\tName: `f`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.Films\"),\n\t\t\tSetter: func(value *localValueType, v *Films) error {\n\t\t\t\tvalue.vars.F = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &SWAPI_Swapi_FilmsArgument{}\n\t\t\t\t// { name: \"ids\", by: \"s.film_ids\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `s.film_ids`,\n\t\t\t\t\tCacheIndex: 36,\n\t\t\t\t\tSetter: func(v []int64) error {\n\t\t\t\t\t\targs.Ids = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Swapi_Films(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"p\"\n\t\t  message {\n\t\t    name: \"People\"\n\t\t    args { name: \"ids\", by: \"s.person_ids\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_p := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*People, *localValueType]{\n\t\t\tName: `p`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.People\"),\n\t\t\tSetter: func(value *localValueType, v *People) error {\n\t\t\t\tvalue.vars.P = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &SWAPI_Swapi_PeopleArgument{}\n\t\t\t\t// { name: \"ids\", by: \"s.person_ids\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `s.person_ids`,\n\t\t\t\t\tCacheIndex: 37,\n\t\t\t\t\tSetter: func(v []int64) error {\n\t\t\t\t\t\targs.Ids = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Swapi_People(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t   res ─┐\n\t        s ─┐\n\t           f ─┐\n\t   res ─┐     │\n\t        s ─┐  │\n\t           p ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_s(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_f(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_s(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_p(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.F = value.vars.F\n\treq.P = value.vars.P\n\treq.Res = value.vars.Res\n\treq.S = value.vars.S\n\n\t// create a message value to be returned.\n\tret := &GetSpeciesReply{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"s\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*speciespb.Species]{\n\t\tValue:      value,\n\t\tExpr:       `s`,\n\t\tCacheIndex: 38,\n\t\tSetter: func(v *speciespb.Species) error {\n\t\t\tspeciesValue, err := s.cast_Swapi_Species_Species__to__Swapi_Species(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.Species = speciesValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"p.people\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]*Person]{\n\t\tValue:      value,\n\t\tExpr:       `p.people`,\n\t\tCacheIndex: 39,\n\t\tSetter: func(v []*Person) error {\n\t\t\tret.People = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"f.films\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]*Film]{\n\t\tValue:      value,\n\t\tExpr:       `f.films`,\n\t\tCacheIndex: 40,\n\t\tSetter: func(v []*Film) error {\n\t\t\tret.Films = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved swapi.GetSpeciesReply\", slog.Any(\"swapi.GetSpeciesReply\", s.logvalue_Swapi_GetSpeciesReply(ret)))\n\treturn ret, nil\n}\n\n// resolve_Swapi_GetStarshipReply resolve \"swapi.GetStarshipReply\" message.\nfunc (s *SWAPI) resolve_Swapi_GetStarshipReply(ctx context.Context, req *SWAPI_Swapi_GetStarshipReplyArgument) (*GetStarshipReply, error) {\n\tctx, span := s.tracer.Start(ctx, \"swapi.GetStarshipReply\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve swapi.GetStarshipReply\", slog.Any(\"message_args\", s.logvalue_Swapi_GetStarshipReplyArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tF   *Films\n\t\t\tP   *People\n\t\t\tRes *starshippb.GetStarshipReply\n\t\t\tS   *starshippb.Starship\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.swapi.GetStarshipReplyArgument\", req)}\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"swapi.starship.StarshipService/GetStarship\"\n\t\t    request { field: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*starshippb.GetStarshipReply, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.starship.GetStarshipReply\"),\n\t\t\tSetter: func(value *localValueType, v *starshippb.GetStarshipReply) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &starshippb.GetStarshipRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 41,\n\t\t\t\t\tSetter: func(v int64) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call swapi.starship.StarshipService/GetStarship\", slog.Any(\"swapi.starship.GetStarshipRequest\", s.logvalue_Swapi_Starship_GetStarshipRequest(args)))\n\t\t\t\tret, err := s.client.Swapi_Starship_StarshipServiceClient.GetStarship(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, SWAPI_DependentMethod_Swapi_Starship_StarshipService_GetStarship, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"s\"\n\t\t  by: \"res.starship\"\n\t\t}\n\t*/\n\tdef_s := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*starshippb.Starship, *localValueType]{\n\t\t\tName: `s`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.starship.Starship\"),\n\t\t\tSetter: func(value *localValueType, v *starshippb.Starship) error {\n\t\t\t\tvalue.vars.S = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `res.starship`,\n\t\t\tByCacheIndex: 42,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"f\"\n\t\t  message {\n\t\t    name: \"Films\"\n\t\t    args { name: \"ids\", by: \"s.film_ids\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_f := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Films, *localValueType]{\n\t\t\tName: `f`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.Films\"),\n\t\t\tSetter: func(value *localValueType, v *Films) error {\n\t\t\t\tvalue.vars.F = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &SWAPI_Swapi_FilmsArgument{}\n\t\t\t\t// { name: \"ids\", by: \"s.film_ids\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `s.film_ids`,\n\t\t\t\t\tCacheIndex: 43,\n\t\t\t\t\tSetter: func(v []int64) error {\n\t\t\t\t\t\targs.Ids = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Swapi_Films(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"p\"\n\t\t  message {\n\t\t    name: \"People\"\n\t\t    args { name: \"ids\", by: \"s.pilot_ids\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_p := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*People, *localValueType]{\n\t\t\tName: `p`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.People\"),\n\t\t\tSetter: func(value *localValueType, v *People) error {\n\t\t\t\tvalue.vars.P = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &SWAPI_Swapi_PeopleArgument{}\n\t\t\t\t// { name: \"ids\", by: \"s.pilot_ids\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `s.pilot_ids`,\n\t\t\t\t\tCacheIndex: 44,\n\t\t\t\t\tSetter: func(v []int64) error {\n\t\t\t\t\t\targs.Ids = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Swapi_People(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t   res ─┐\n\t        s ─┐\n\t           f ─┐\n\t   res ─┐     │\n\t        s ─┐  │\n\t           p ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_s(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_f(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_s(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_p(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.F = value.vars.F\n\treq.P = value.vars.P\n\treq.Res = value.vars.Res\n\treq.S = value.vars.S\n\n\t// create a message value to be returned.\n\tret := &GetStarshipReply{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"s\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*starshippb.Starship]{\n\t\tValue:      value,\n\t\tExpr:       `s`,\n\t\tCacheIndex: 45,\n\t\tSetter: func(v *starshippb.Starship) error {\n\t\t\tstarshipValue, err := s.cast_Swapi_Starship_Starship__to__Swapi_Starship(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.Starship = starshipValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"f.films\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]*Film]{\n\t\tValue:      value,\n\t\tExpr:       `f.films`,\n\t\tCacheIndex: 46,\n\t\tSetter: func(v []*Film) error {\n\t\t\tret.Films = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"p.people\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]*Person]{\n\t\tValue:      value,\n\t\tExpr:       `p.people`,\n\t\tCacheIndex: 47,\n\t\tSetter: func(v []*Person) error {\n\t\t\tret.Pilots = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved swapi.GetStarshipReply\", slog.Any(\"swapi.GetStarshipReply\", s.logvalue_Swapi_GetStarshipReply(ret)))\n\treturn ret, nil\n}\n\n// resolve_Swapi_GetVehicleReply resolve \"swapi.GetVehicleReply\" message.\nfunc (s *SWAPI) resolve_Swapi_GetVehicleReply(ctx context.Context, req *SWAPI_Swapi_GetVehicleReplyArgument) (*GetVehicleReply, error) {\n\tctx, span := s.tracer.Start(ctx, \"swapi.GetVehicleReply\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve swapi.GetVehicleReply\", slog.Any(\"message_args\", s.logvalue_Swapi_GetVehicleReplyArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tF   *Films\n\t\t\tP   *People\n\t\t\tRes *vehiclepb.GetVehicleReply\n\t\t\tV   *vehiclepb.Vehicle\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.swapi.GetVehicleReplyArgument\", req)}\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"swapi.vehicle.VehicleService/GetVehicle\"\n\t\t    request { field: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*vehiclepb.GetVehicleReply, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.vehicle.GetVehicleReply\"),\n\t\t\tSetter: func(value *localValueType, v *vehiclepb.GetVehicleReply) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &vehiclepb.GetVehicleRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 48,\n\t\t\t\t\tSetter: func(v int64) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call swapi.vehicle.VehicleService/GetVehicle\", slog.Any(\"swapi.vehicle.GetVehicleRequest\", s.logvalue_Swapi_Vehicle_GetVehicleRequest(args)))\n\t\t\t\tret, err := s.client.Swapi_Vehicle_VehicleServiceClient.GetVehicle(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, SWAPI_DependentMethod_Swapi_Vehicle_VehicleService_GetVehicle, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"v\"\n\t\t  by: \"res.vehicle\"\n\t\t}\n\t*/\n\tdef_v := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*vehiclepb.Vehicle, *localValueType]{\n\t\t\tName: `v`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.vehicle.Vehicle\"),\n\t\t\tSetter: func(value *localValueType, v *vehiclepb.Vehicle) error {\n\t\t\t\tvalue.vars.V = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `res.vehicle`,\n\t\t\tByCacheIndex: 49,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"f\"\n\t\t  message {\n\t\t    name: \"Films\"\n\t\t    args { name: \"ids\", by: \"v.film_ids\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_f := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Films, *localValueType]{\n\t\t\tName: `f`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.Films\"),\n\t\t\tSetter: func(value *localValueType, v *Films) error {\n\t\t\t\tvalue.vars.F = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &SWAPI_Swapi_FilmsArgument{}\n\t\t\t\t// { name: \"ids\", by: \"v.film_ids\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `v.film_ids`,\n\t\t\t\t\tCacheIndex: 50,\n\t\t\t\t\tSetter: func(v []int64) error {\n\t\t\t\t\t\targs.Ids = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Swapi_Films(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"p\"\n\t\t  message {\n\t\t    name: \"People\"\n\t\t    args { name: \"ids\", by: \"v.pilot_ids\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_p := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*People, *localValueType]{\n\t\t\tName: `p`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.People\"),\n\t\t\tSetter: func(value *localValueType, v *People) error {\n\t\t\t\tvalue.vars.P = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &SWAPI_Swapi_PeopleArgument{}\n\t\t\t\t// { name: \"ids\", by: \"v.pilot_ids\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `v.pilot_ids`,\n\t\t\t\t\tCacheIndex: 51,\n\t\t\t\t\tSetter: func(v []int64) error {\n\t\t\t\t\t\targs.Ids = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Swapi_People(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t   res ─┐\n\t        v ─┐\n\t           f ─┐\n\t   res ─┐     │\n\t        v ─┐  │\n\t           p ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_v(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_f(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_v(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_p(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.F = value.vars.F\n\treq.P = value.vars.P\n\treq.Res = value.vars.Res\n\treq.V = value.vars.V\n\n\t// create a message value to be returned.\n\tret := &GetVehicleReply{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"v\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*vehiclepb.Vehicle]{\n\t\tValue:      value,\n\t\tExpr:       `v`,\n\t\tCacheIndex: 52,\n\t\tSetter: func(v *vehiclepb.Vehicle) error {\n\t\t\tvehicleValue, err := s.cast_Swapi_Vehicle_Vehicle__to__Swapi_Vehicle(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.Vehicle = vehicleValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"f.films\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]*Film]{\n\t\tValue:      value,\n\t\tExpr:       `f.films`,\n\t\tCacheIndex: 53,\n\t\tSetter: func(v []*Film) error {\n\t\t\tret.Films = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"p.people\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]*Person]{\n\t\tValue:      value,\n\t\tExpr:       `p.people`,\n\t\tCacheIndex: 54,\n\t\tSetter: func(v []*Person) error {\n\t\t\tret.Pilots = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved swapi.GetVehicleReply\", slog.Any(\"swapi.GetVehicleReply\", s.logvalue_Swapi_GetVehicleReply(ret)))\n\treturn ret, nil\n}\n\n// resolve_Swapi_ListFilmsReply resolve \"swapi.ListFilmsReply\" message.\nfunc (s *SWAPI) resolve_Swapi_ListFilmsReply(ctx context.Context, req *SWAPI_Swapi_ListFilmsReplyArgument) (*ListFilmsReply, error) {\n\tctx, span := s.tracer.Start(ctx, \"swapi.ListFilmsReply\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve swapi.ListFilmsReply\", slog.Any(\"message_args\", s.logvalue_Swapi_ListFilmsReplyArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tF *Films\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.swapi.ListFilmsReplyArgument\", req)}\n\t/*\n\t\tdef {\n\t\t  name: \"f\"\n\t\t  message {\n\t\t    name: \"Films\"\n\t\t    args { name: \"ids\", by: \"$.ids\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_f := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Films, *localValueType]{\n\t\t\tName: `f`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.Films\"),\n\t\t\tSetter: func(value *localValueType, v *Films) error {\n\t\t\t\tvalue.vars.F = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &SWAPI_Swapi_FilmsArgument{}\n\t\t\t\t// { name: \"ids\", by: \"$.ids\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.ids`,\n\t\t\t\t\tCacheIndex: 55,\n\t\t\t\t\tSetter: func(v []int64) error {\n\t\t\t\t\t\targs.Ids = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Swapi_Films(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_f(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.F = value.vars.F\n\n\t// create a message value to be returned.\n\tret := &ListFilmsReply{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"f.films\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]*Film]{\n\t\tValue:      value,\n\t\tExpr:       `f.films`,\n\t\tCacheIndex: 56,\n\t\tSetter: func(v []*Film) error {\n\t\t\tret.Films = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved swapi.ListFilmsReply\", slog.Any(\"swapi.ListFilmsReply\", s.logvalue_Swapi_ListFilmsReply(ret)))\n\treturn ret, nil\n}\n\n// resolve_Swapi_ListPeopleReply resolve \"swapi.ListPeopleReply\" message.\nfunc (s *SWAPI) resolve_Swapi_ListPeopleReply(ctx context.Context, req *SWAPI_Swapi_ListPeopleReplyArgument) (*ListPeopleReply, error) {\n\tctx, span := s.tracer.Start(ctx, \"swapi.ListPeopleReply\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve swapi.ListPeopleReply\", slog.Any(\"message_args\", s.logvalue_Swapi_ListPeopleReplyArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tP *People\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.swapi.ListPeopleReplyArgument\", req)}\n\t/*\n\t\tdef {\n\t\t  name: \"p\"\n\t\t  message {\n\t\t    name: \"People\"\n\t\t    args { name: \"ids\", by: \"$.ids\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_p := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*People, *localValueType]{\n\t\t\tName: `p`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.People\"),\n\t\t\tSetter: func(value *localValueType, v *People) error {\n\t\t\t\tvalue.vars.P = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &SWAPI_Swapi_PeopleArgument{}\n\t\t\t\t// { name: \"ids\", by: \"$.ids\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.ids`,\n\t\t\t\t\tCacheIndex: 57,\n\t\t\t\t\tSetter: func(v []int64) error {\n\t\t\t\t\t\targs.Ids = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Swapi_People(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_p(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.P = value.vars.P\n\n\t// create a message value to be returned.\n\tret := &ListPeopleReply{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"p.people\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]*Person]{\n\t\tValue:      value,\n\t\tExpr:       `p.people`,\n\t\tCacheIndex: 58,\n\t\tSetter: func(v []*Person) error {\n\t\t\tret.People = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved swapi.ListPeopleReply\", slog.Any(\"swapi.ListPeopleReply\", s.logvalue_Swapi_ListPeopleReply(ret)))\n\treturn ret, nil\n}\n\n// resolve_Swapi_ListPlanetsReply resolve \"swapi.ListPlanetsReply\" message.\nfunc (s *SWAPI) resolve_Swapi_ListPlanetsReply(ctx context.Context, req *SWAPI_Swapi_ListPlanetsReplyArgument) (*ListPlanetsReply, error) {\n\tctx, span := s.tracer.Start(ctx, \"swapi.ListPlanetsReply\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve swapi.ListPlanetsReply\", slog.Any(\"message_args\", s.logvalue_Swapi_ListPlanetsReplyArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tP *Planets\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.swapi.ListPlanetsReplyArgument\", req)}\n\t/*\n\t\tdef {\n\t\t  name: \"p\"\n\t\t  message {\n\t\t    name: \"Planets\"\n\t\t    args { name: \"ids\", by: \"$.ids\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_p := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Planets, *localValueType]{\n\t\t\tName: `p`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.Planets\"),\n\t\t\tSetter: func(value *localValueType, v *Planets) error {\n\t\t\t\tvalue.vars.P = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &SWAPI_Swapi_PlanetsArgument{}\n\t\t\t\t// { name: \"ids\", by: \"$.ids\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.ids`,\n\t\t\t\t\tCacheIndex: 59,\n\t\t\t\t\tSetter: func(v []int64) error {\n\t\t\t\t\t\targs.Ids = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Swapi_Planets(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_p(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.P = value.vars.P\n\n\t// create a message value to be returned.\n\tret := &ListPlanetsReply{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"p.planets\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]*Planet]{\n\t\tValue:      value,\n\t\tExpr:       `p.planets`,\n\t\tCacheIndex: 60,\n\t\tSetter: func(v []*Planet) error {\n\t\t\tret.Planets = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved swapi.ListPlanetsReply\", slog.Any(\"swapi.ListPlanetsReply\", s.logvalue_Swapi_ListPlanetsReply(ret)))\n\treturn ret, nil\n}\n\n// resolve_Swapi_ListSpeciesReply resolve \"swapi.ListSpeciesReply\" message.\nfunc (s *SWAPI) resolve_Swapi_ListSpeciesReply(ctx context.Context, req *SWAPI_Swapi_ListSpeciesReplyArgument) (*ListSpeciesReply, error) {\n\tctx, span := s.tracer.Start(ctx, \"swapi.ListSpeciesReply\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve swapi.ListSpeciesReply\", slog.Any(\"message_args\", s.logvalue_Swapi_ListSpeciesReplyArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tS *SpeciesList\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.swapi.ListSpeciesReplyArgument\", req)}\n\t/*\n\t\tdef {\n\t\t  name: \"s\"\n\t\t  message {\n\t\t    name: \"SpeciesList\"\n\t\t    args { name: \"ids\", by: \"$.ids\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_s := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*SpeciesList, *localValueType]{\n\t\t\tName: `s`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.SpeciesList\"),\n\t\t\tSetter: func(value *localValueType, v *SpeciesList) error {\n\t\t\t\tvalue.vars.S = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &SWAPI_Swapi_SpeciesListArgument{}\n\t\t\t\t// { name: \"ids\", by: \"$.ids\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.ids`,\n\t\t\t\t\tCacheIndex: 61,\n\t\t\t\t\tSetter: func(v []int64) error {\n\t\t\t\t\t\targs.Ids = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Swapi_SpeciesList(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_s(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.S = value.vars.S\n\n\t// create a message value to be returned.\n\tret := &ListSpeciesReply{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"s.species\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]*Species]{\n\t\tValue:      value,\n\t\tExpr:       `s.species`,\n\t\tCacheIndex: 62,\n\t\tSetter: func(v []*Species) error {\n\t\t\tret.Species = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved swapi.ListSpeciesReply\", slog.Any(\"swapi.ListSpeciesReply\", s.logvalue_Swapi_ListSpeciesReply(ret)))\n\treturn ret, nil\n}\n\n// resolve_Swapi_ListStarshipsReply resolve \"swapi.ListStarshipsReply\" message.\nfunc (s *SWAPI) resolve_Swapi_ListStarshipsReply(ctx context.Context, req *SWAPI_Swapi_ListStarshipsReplyArgument) (*ListStarshipsReply, error) {\n\tctx, span := s.tracer.Start(ctx, \"swapi.ListStarshipsReply\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve swapi.ListStarshipsReply\", slog.Any(\"message_args\", s.logvalue_Swapi_ListStarshipsReplyArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tS *Starships\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.swapi.ListStarshipsReplyArgument\", req)}\n\t/*\n\t\tdef {\n\t\t  name: \"s\"\n\t\t  message {\n\t\t    name: \"Starships\"\n\t\t    args { name: \"ids\", by: \"$.ids\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_s := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Starships, *localValueType]{\n\t\t\tName: `s`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.Starships\"),\n\t\t\tSetter: func(value *localValueType, v *Starships) error {\n\t\t\t\tvalue.vars.S = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &SWAPI_Swapi_StarshipsArgument{}\n\t\t\t\t// { name: \"ids\", by: \"$.ids\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.ids`,\n\t\t\t\t\tCacheIndex: 63,\n\t\t\t\t\tSetter: func(v []int64) error {\n\t\t\t\t\t\targs.Ids = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Swapi_Starships(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_s(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.S = value.vars.S\n\n\t// create a message value to be returned.\n\tret := &ListStarshipsReply{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"s.starships\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]*Starship]{\n\t\tValue:      value,\n\t\tExpr:       `s.starships`,\n\t\tCacheIndex: 64,\n\t\tSetter: func(v []*Starship) error {\n\t\t\tret.Starships = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved swapi.ListStarshipsReply\", slog.Any(\"swapi.ListStarshipsReply\", s.logvalue_Swapi_ListStarshipsReply(ret)))\n\treturn ret, nil\n}\n\n// resolve_Swapi_ListVehiclesReply resolve \"swapi.ListVehiclesReply\" message.\nfunc (s *SWAPI) resolve_Swapi_ListVehiclesReply(ctx context.Context, req *SWAPI_Swapi_ListVehiclesReplyArgument) (*ListVehiclesReply, error) {\n\tctx, span := s.tracer.Start(ctx, \"swapi.ListVehiclesReply\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve swapi.ListVehiclesReply\", slog.Any(\"message_args\", s.logvalue_Swapi_ListVehiclesReplyArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tV *Vehicles\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.swapi.ListVehiclesReplyArgument\", req)}\n\t/*\n\t\tdef {\n\t\t  name: \"v\"\n\t\t  message {\n\t\t    name: \"Vehicles\"\n\t\t    args { name: \"ids\", by: \"$.ids\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_v := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Vehicles, *localValueType]{\n\t\t\tName: `v`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.Vehicles\"),\n\t\t\tSetter: func(value *localValueType, v *Vehicles) error {\n\t\t\t\tvalue.vars.V = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &SWAPI_Swapi_VehiclesArgument{}\n\t\t\t\t// { name: \"ids\", by: \"$.ids\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.ids`,\n\t\t\t\t\tCacheIndex: 65,\n\t\t\t\t\tSetter: func(v []int64) error {\n\t\t\t\t\t\targs.Ids = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Swapi_Vehicles(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_v(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.V = value.vars.V\n\n\t// create a message value to be returned.\n\tret := &ListVehiclesReply{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"v.vehicles\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]*Vehicle]{\n\t\tValue:      value,\n\t\tExpr:       `v.vehicles`,\n\t\tCacheIndex: 66,\n\t\tSetter: func(v []*Vehicle) error {\n\t\t\tret.Vehicles = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved swapi.ListVehiclesReply\", slog.Any(\"swapi.ListVehiclesReply\", s.logvalue_Swapi_ListVehiclesReply(ret)))\n\treturn ret, nil\n}\n\n// resolve_Swapi_People resolve \"swapi.People\" message.\nfunc (s *SWAPI) resolve_Swapi_People(ctx context.Context, req *SWAPI_Swapi_PeopleArgument) (*People, error) {\n\tctx, span := s.tracer.Start(ctx, \"swapi.People\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve swapi.People\", slog.Any(\"message_args\", s.logvalue_Swapi_PeopleArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tRes *personpb.ListPeopleReply\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.swapi.PeopleArgument\", req)}\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"swapi.person.PersonService/ListPeople\"\n\t\t    request { field: \"ids\", by: \"$.ids\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*personpb.ListPeopleReply, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.person.ListPeopleReply\"),\n\t\t\tSetter: func(value *localValueType, v *personpb.ListPeopleReply) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &personpb.ListPeopleRequest{}\n\t\t\t\t// { field: \"ids\", by: \"$.ids\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.ids`,\n\t\t\t\t\tCacheIndex: 67,\n\t\t\t\t\tSetter: func(v []int64) error {\n\t\t\t\t\t\targs.Ids = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call swapi.person.PersonService/ListPeople\", slog.Any(\"swapi.person.ListPeopleRequest\", s.logvalue_Swapi_Person_ListPeopleRequest(args)))\n\t\t\t\tret, err := s.client.Swapi_Person_PersonServiceClient.ListPeople(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, SWAPI_DependentMethod_Swapi_Person_PersonService_ListPeople, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_res(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.Res = value.vars.Res\n\n\t// create a message value to be returned.\n\tret := &People{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"res.people\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]*personpb.Person]{\n\t\tValue:      value,\n\t\tExpr:       `res.people`,\n\t\tCacheIndex: 68,\n\t\tSetter: func(v []*personpb.Person) error {\n\t\t\tpeopleValue, err := s.cast_repeated_Swapi_Person_Person__to__repeated_Swapi_Person(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.People = peopleValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved swapi.People\", slog.Any(\"swapi.People\", s.logvalue_Swapi_People(ret)))\n\treturn ret, nil\n}\n\n// resolve_Swapi_Planets resolve \"swapi.Planets\" message.\nfunc (s *SWAPI) resolve_Swapi_Planets(ctx context.Context, req *SWAPI_Swapi_PlanetsArgument) (*Planets, error) {\n\tctx, span := s.tracer.Start(ctx, \"swapi.Planets\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve swapi.Planets\", slog.Any(\"message_args\", s.logvalue_Swapi_PlanetsArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tRes *planetpb.ListPlanetsReply\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.swapi.PlanetsArgument\", req)}\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"swapi.planet.PlanetService/ListPlanets\"\n\t\t    request { field: \"ids\", by: \"$.ids\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*planetpb.ListPlanetsReply, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.planet.ListPlanetsReply\"),\n\t\t\tSetter: func(value *localValueType, v *planetpb.ListPlanetsReply) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &planetpb.ListPlanetsRequest{}\n\t\t\t\t// { field: \"ids\", by: \"$.ids\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.ids`,\n\t\t\t\t\tCacheIndex: 69,\n\t\t\t\t\tSetter: func(v []int64) error {\n\t\t\t\t\t\targs.Ids = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call swapi.planet.PlanetService/ListPlanets\", slog.Any(\"swapi.planet.ListPlanetsRequest\", s.logvalue_Swapi_Planet_ListPlanetsRequest(args)))\n\t\t\t\tret, err := s.client.Swapi_Planet_PlanetServiceClient.ListPlanets(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, SWAPI_DependentMethod_Swapi_Planet_PlanetService_ListPlanets, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_res(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.Res = value.vars.Res\n\n\t// create a message value to be returned.\n\tret := &Planets{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"res.planets\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]*planetpb.Planet]{\n\t\tValue:      value,\n\t\tExpr:       `res.planets`,\n\t\tCacheIndex: 70,\n\t\tSetter: func(v []*planetpb.Planet) error {\n\t\t\tplanetsValue, err := s.cast_repeated_Swapi_Planet_Planet__to__repeated_Swapi_Planet(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.Planets = planetsValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved swapi.Planets\", slog.Any(\"swapi.Planets\", s.logvalue_Swapi_Planets(ret)))\n\treturn ret, nil\n}\n\n// resolve_Swapi_SpeciesList resolve \"swapi.SpeciesList\" message.\nfunc (s *SWAPI) resolve_Swapi_SpeciesList(ctx context.Context, req *SWAPI_Swapi_SpeciesListArgument) (*SpeciesList, error) {\n\tctx, span := s.tracer.Start(ctx, \"swapi.SpeciesList\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve swapi.SpeciesList\", slog.Any(\"message_args\", s.logvalue_Swapi_SpeciesListArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tRes *speciespb.ListSpeciesReply\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.swapi.SpeciesListArgument\", req)}\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"swapi.species.SpeciesService/ListSpecies\"\n\t\t    request { field: \"ids\", by: \"$.ids\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*speciespb.ListSpeciesReply, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.species.ListSpeciesReply\"),\n\t\t\tSetter: func(value *localValueType, v *speciespb.ListSpeciesReply) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &speciespb.ListSpeciesRequest{}\n\t\t\t\t// { field: \"ids\", by: \"$.ids\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.ids`,\n\t\t\t\t\tCacheIndex: 71,\n\t\t\t\t\tSetter: func(v []int64) error {\n\t\t\t\t\t\targs.Ids = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call swapi.species.SpeciesService/ListSpecies\", slog.Any(\"swapi.species.ListSpeciesRequest\", s.logvalue_Swapi_Species_ListSpeciesRequest(args)))\n\t\t\t\tret, err := s.client.Swapi_Species_SpeciesServiceClient.ListSpecies(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, SWAPI_DependentMethod_Swapi_Species_SpeciesService_ListSpecies, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_res(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.Res = value.vars.Res\n\n\t// create a message value to be returned.\n\tret := &SpeciesList{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"res.species\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]*speciespb.Species]{\n\t\tValue:      value,\n\t\tExpr:       `res.species`,\n\t\tCacheIndex: 72,\n\t\tSetter: func(v []*speciespb.Species) error {\n\t\t\tspeciesValue, err := s.cast_repeated_Swapi_Species_Species__to__repeated_Swapi_Species(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.Species = speciesValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved swapi.SpeciesList\", slog.Any(\"swapi.SpeciesList\", s.logvalue_Swapi_SpeciesList(ret)))\n\treturn ret, nil\n}\n\n// resolve_Swapi_Starships resolve \"swapi.Starships\" message.\nfunc (s *SWAPI) resolve_Swapi_Starships(ctx context.Context, req *SWAPI_Swapi_StarshipsArgument) (*Starships, error) {\n\tctx, span := s.tracer.Start(ctx, \"swapi.Starships\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve swapi.Starships\", slog.Any(\"message_args\", s.logvalue_Swapi_StarshipsArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tRes *starshippb.ListStarshipsReply\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.swapi.StarshipsArgument\", req)}\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"swapi.starship.StarshipService/ListStarships\"\n\t\t    request { field: \"ids\", by: \"$.ids\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*starshippb.ListStarshipsReply, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.starship.ListStarshipsReply\"),\n\t\t\tSetter: func(value *localValueType, v *starshippb.ListStarshipsReply) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &starshippb.ListStarshipsRequest{}\n\t\t\t\t// { field: \"ids\", by: \"$.ids\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.ids`,\n\t\t\t\t\tCacheIndex: 73,\n\t\t\t\t\tSetter: func(v []int64) error {\n\t\t\t\t\t\targs.Ids = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call swapi.starship.StarshipService/ListStarships\", slog.Any(\"swapi.starship.ListStarshipsRequest\", s.logvalue_Swapi_Starship_ListStarshipsRequest(args)))\n\t\t\t\tret, err := s.client.Swapi_Starship_StarshipServiceClient.ListStarships(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, SWAPI_DependentMethod_Swapi_Starship_StarshipService_ListStarships, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_res(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.Res = value.vars.Res\n\n\t// create a message value to be returned.\n\tret := &Starships{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"res.starships\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]*starshippb.Starship]{\n\t\tValue:      value,\n\t\tExpr:       `res.starships`,\n\t\tCacheIndex: 74,\n\t\tSetter: func(v []*starshippb.Starship) error {\n\t\t\tstarshipsValue, err := s.cast_repeated_Swapi_Starship_Starship__to__repeated_Swapi_Starship(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.Starships = starshipsValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved swapi.Starships\", slog.Any(\"swapi.Starships\", s.logvalue_Swapi_Starships(ret)))\n\treturn ret, nil\n}\n\n// resolve_Swapi_Vehicles resolve \"swapi.Vehicles\" message.\nfunc (s *SWAPI) resolve_Swapi_Vehicles(ctx context.Context, req *SWAPI_Swapi_VehiclesArgument) (*Vehicles, error) {\n\tctx, span := s.tracer.Start(ctx, \"swapi.Vehicles\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve swapi.Vehicles\", slog.Any(\"message_args\", s.logvalue_Swapi_VehiclesArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tRes *vehiclepb.ListVehiclesReply\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.swapi.VehiclesArgument\", req)}\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"swapi.vehicle.VehicleService/ListVehicles\"\n\t\t    request { field: \"ids\", by: \"$.ids\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*vehiclepb.ListVehiclesReply, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"swapi.vehicle.ListVehiclesReply\"),\n\t\t\tSetter: func(value *localValueType, v *vehiclepb.ListVehiclesReply) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &vehiclepb.ListVehiclesRequest{}\n\t\t\t\t// { field: \"ids\", by: \"$.ids\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]int64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.ids`,\n\t\t\t\t\tCacheIndex: 75,\n\t\t\t\t\tSetter: func(v []int64) error {\n\t\t\t\t\t\targs.Ids = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call swapi.vehicle.VehicleService/ListVehicles\", slog.Any(\"swapi.vehicle.ListVehiclesRequest\", s.logvalue_Swapi_Vehicle_ListVehiclesRequest(args)))\n\t\t\t\tret, err := s.client.Swapi_Vehicle_VehicleServiceClient.ListVehicles(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, SWAPI_DependentMethod_Swapi_Vehicle_VehicleService_ListVehicles, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_res(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.Res = value.vars.Res\n\n\t// create a message value to be returned.\n\tret := &Vehicles{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"res.vehicles\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]*vehiclepb.Vehicle]{\n\t\tValue:      value,\n\t\tExpr:       `res.vehicles`,\n\t\tCacheIndex: 76,\n\t\tSetter: func(v []*vehiclepb.Vehicle) error {\n\t\t\tvehiclesValue, err := s.cast_repeated_Swapi_Vehicle_Vehicle__to__repeated_Swapi_Vehicle(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.Vehicles = vehiclesValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved swapi.Vehicles\", slog.Any(\"swapi.Vehicles\", s.logvalue_Swapi_Vehicles(ret)))\n\treturn ret, nil\n}\n\n// cast_Swapi_Film_Film__to__Swapi_Film cast from \"swapi.film.Film\" to \"swapi.Film\".\nfunc (s *SWAPI) cast_Swapi_Film_Film__to__Swapi_Film(from *filmpb.Film) (*Film, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\n\tidValue := from.GetId()\n\ttitleValue := from.GetTitle()\n\tepisodeIdValue := from.GetEpisodeId()\n\topeningCrawlValue := from.GetOpeningCrawl()\n\tdirectorValue := from.GetDirector()\n\tproducerValue := from.GetProducer()\n\treleaseDateValue := from.GetReleaseDate()\n\turlValue := from.GetUrl()\n\tcreatedValue := from.GetCreated()\n\teditedValue := from.GetEdited()\n\tspeciesIdsValue := from.GetSpeciesIds()\n\tstarshipIdsValue := from.GetStarshipIds()\n\tvehicleIdsValue := from.GetVehicleIds()\n\tcharacterIdsValue := from.GetCharacterIds()\n\tplanetIdsValue := from.GetPlanetIds()\n\n\tret := &Film{\n\t\tId:           idValue,\n\t\tTitle:        titleValue,\n\t\tEpisodeId:    episodeIdValue,\n\t\tOpeningCrawl: openingCrawlValue,\n\t\tDirector:     directorValue,\n\t\tProducer:     producerValue,\n\t\tReleaseDate:  releaseDateValue,\n\t\tUrl:          urlValue,\n\t\tCreated:      createdValue,\n\t\tEdited:       editedValue,\n\t\tSpeciesIds:   speciesIdsValue,\n\t\tStarshipIds:  starshipIdsValue,\n\t\tVehicleIds:   vehicleIdsValue,\n\t\tCharacterIds: characterIdsValue,\n\t\tPlanetIds:    planetIdsValue,\n\t}\n\treturn ret, nil\n}\n\n// cast_Swapi_Person_Person__to__Swapi_Person cast from \"swapi.person.Person\" to \"swapi.Person\".\nfunc (s *SWAPI) cast_Swapi_Person_Person__to__Swapi_Person(from *personpb.Person) (*Person, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\n\tidValue := from.GetId()\n\tnameValue := from.GetName()\n\tbirthYearValue := from.GetBirthYear()\n\teyeColorValue := from.GetEyeColor()\n\tgenderValue := from.GetGender()\n\thairColorValue := from.GetHairColor()\n\theightValue := from.GetHeight()\n\tmassValue := from.GetMass()\n\tskinColorValue := from.GetSkinColor()\n\thomeworldValue := from.GetHomeworld()\n\turlValue := from.GetUrl()\n\tcreatedValue := from.GetCreated()\n\teditedValue := from.GetEdited()\n\tfilmIdsValue := from.GetFilmIds()\n\tspeciesIdsValue := from.GetSpeciesIds()\n\tstarshipIdsValue := from.GetStarshipIds()\n\tvehicleIdsValue := from.GetVehicleIds()\n\n\tret := &Person{\n\t\tId:          idValue,\n\t\tName:        nameValue,\n\t\tBirthYear:   birthYearValue,\n\t\tEyeColor:    eyeColorValue,\n\t\tGender:      genderValue,\n\t\tHairColor:   hairColorValue,\n\t\tHeight:      heightValue,\n\t\tMass:        massValue,\n\t\tSkinColor:   skinColorValue,\n\t\tHomeworld:   homeworldValue,\n\t\tUrl:         urlValue,\n\t\tCreated:     createdValue,\n\t\tEdited:      editedValue,\n\t\tFilmIds:     filmIdsValue,\n\t\tSpeciesIds:  speciesIdsValue,\n\t\tStarshipIds: starshipIdsValue,\n\t\tVehicleIds:  vehicleIdsValue,\n\t}\n\treturn ret, nil\n}\n\n// cast_Swapi_Planet_Planet__to__Swapi_Planet cast from \"swapi.planet.Planet\" to \"swapi.Planet\".\nfunc (s *SWAPI) cast_Swapi_Planet_Planet__to__Swapi_Planet(from *planetpb.Planet) (*Planet, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\n\tidValue := from.GetId()\n\tnameValue := from.GetName()\n\tdiameterValue := from.GetDiameter()\n\trotationPeriodValue := from.GetRotationPeriod()\n\torbitalPeriodValue := from.GetOrbitalPeriod()\n\tgravityValue := from.GetGravity()\n\tpopulationValue := from.GetPopulation()\n\tclimateValue := from.GetClimate()\n\tterrainValue := from.GetTerrain()\n\tsurfaceWaterValue := from.GetSurfaceWater()\n\turlValue := from.GetUrl()\n\tcreatedValue := from.GetCreated()\n\teditedValue := from.GetEdited()\n\tresidentIdsValue := from.GetResidentIds()\n\tfilmIdsValue := from.GetFilmIds()\n\n\tret := &Planet{\n\t\tId:             idValue,\n\t\tName:           nameValue,\n\t\tDiameter:       diameterValue,\n\t\tRotationPeriod: rotationPeriodValue,\n\t\tOrbitalPeriod:  orbitalPeriodValue,\n\t\tGravity:        gravityValue,\n\t\tPopulation:     populationValue,\n\t\tClimate:        climateValue,\n\t\tTerrain:        terrainValue,\n\t\tSurfaceWater:   surfaceWaterValue,\n\t\tUrl:            urlValue,\n\t\tCreated:        createdValue,\n\t\tEdited:         editedValue,\n\t\tResidentIds:    residentIdsValue,\n\t\tFilmIds:        filmIdsValue,\n\t}\n\treturn ret, nil\n}\n\n// cast_Swapi_Species_Species__to__Swapi_Species cast from \"swapi.species.Species\" to \"swapi.Species\".\nfunc (s *SWAPI) cast_Swapi_Species_Species__to__Swapi_Species(from *speciespb.Species) (*Species, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\n\tidValue := from.GetId()\n\tnameValue := from.GetName()\n\tclassificationValue := from.GetClassification()\n\tdesignationValue := from.GetDesignation()\n\taverageHeightValue := from.GetAverageHeight()\n\taverageLifespanValue := from.GetAverageLifespan()\n\teyeColorsValue := from.GetEyeColors()\n\thairColorsValue := from.GetHairColors()\n\tskinColorsValue := from.GetSkinColors()\n\tlanguageValue := from.GetLanguage()\n\thomeworldValue := from.GetHomeworld()\n\turlValue := from.GetUrl()\n\tcreatedValue := from.GetCreated()\n\teditedValue := from.GetEdited()\n\tpersonIdsValue := from.GetPersonIds()\n\tfilmIdsValue := from.GetFilmIds()\n\n\tret := &Species{\n\t\tId:              idValue,\n\t\tName:            nameValue,\n\t\tClassification:  classificationValue,\n\t\tDesignation:     designationValue,\n\t\tAverageHeight:   averageHeightValue,\n\t\tAverageLifespan: averageLifespanValue,\n\t\tEyeColors:       eyeColorsValue,\n\t\tHairColors:      hairColorsValue,\n\t\tSkinColors:      skinColorsValue,\n\t\tLanguage:        languageValue,\n\t\tHomeworld:       homeworldValue,\n\t\tUrl:             urlValue,\n\t\tCreated:         createdValue,\n\t\tEdited:          editedValue,\n\t\tPersonIds:       personIdsValue,\n\t\tFilmIds:         filmIdsValue,\n\t}\n\treturn ret, nil\n}\n\n// cast_Swapi_Starship_Starship__to__Swapi_Starship cast from \"swapi.starship.Starship\" to \"swapi.Starship\".\nfunc (s *SWAPI) cast_Swapi_Starship_Starship__to__Swapi_Starship(from *starshippb.Starship) (*Starship, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\n\tidValue := from.GetId()\n\tnameValue := from.GetName()\n\tmodelValue := from.GetModel()\n\tstarshipClassValue := from.GetStarshipClass()\n\tmanufacturerValue := from.GetManufacturer()\n\tcostInCreditsValue := from.GetCostInCredits()\n\tlengthValue := from.GetLength()\n\tcrewValue := from.GetCrew()\n\tpassengersValue := from.GetPassengers()\n\tmaxAtmospheringSpeedValue := from.GetMaxAtmospheringSpeed()\n\thyperdriveRatingValue := from.GetHyperdriveRating()\n\tmgltValue := from.GetMglt()\n\tcargoCapacityValue := from.GetCargoCapacity()\n\tconsumablesValue := from.GetConsumables()\n\turlValue := from.GetUrl()\n\tcreatedValue := from.GetCreated()\n\teditedValue := from.GetEdited()\n\tfilmIdsValue := from.GetFilmIds()\n\tpilotIdsValue := from.GetPilotIds()\n\n\tret := &Starship{\n\t\tId:                   idValue,\n\t\tName:                 nameValue,\n\t\tModel:                modelValue,\n\t\tStarshipClass:        starshipClassValue,\n\t\tManufacturer:         manufacturerValue,\n\t\tCostInCredits:        costInCreditsValue,\n\t\tLength:               lengthValue,\n\t\tCrew:                 crewValue,\n\t\tPassengers:           passengersValue,\n\t\tMaxAtmospheringSpeed: maxAtmospheringSpeedValue,\n\t\tHyperdriveRating:     hyperdriveRatingValue,\n\t\tMglt:                 mgltValue,\n\t\tCargoCapacity:        cargoCapacityValue,\n\t\tConsumables:          consumablesValue,\n\t\tUrl:                  urlValue,\n\t\tCreated:              createdValue,\n\t\tEdited:               editedValue,\n\t\tFilmIds:              filmIdsValue,\n\t\tPilotIds:             pilotIdsValue,\n\t}\n\treturn ret, nil\n}\n\n// cast_Swapi_Vehicle_Vehicle__to__Swapi_Vehicle cast from \"swapi.vehicle.Vehicle\" to \"swapi.Vehicle\".\nfunc (s *SWAPI) cast_Swapi_Vehicle_Vehicle__to__Swapi_Vehicle(from *vehiclepb.Vehicle) (*Vehicle, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\n\tidValue := from.GetId()\n\tnameValue := from.GetName()\n\tmodelValue := from.GetModel()\n\tvehicleClassValue := from.GetVehicleClass()\n\tmanufacturerValue := from.GetManufacturer()\n\tlengthValue := from.GetLength()\n\tcostInCreditsValue := from.GetCostInCredits()\n\tcrewValue := from.GetCrew()\n\tpassengersValue := from.GetPassengers()\n\tmaxAtmospheringSpeedValue := from.GetMaxAtmospheringSpeed()\n\tcargoCapacityValue := from.GetCargoCapacity()\n\tconsumablesValue := from.GetConsumables()\n\turlValue := from.GetUrl()\n\tcreatedValue := from.GetCreated()\n\teditedValue := from.GetEdited()\n\tfilmIdsValue := from.GetFilmIds()\n\tpilotIdsValue := from.GetPilotIds()\n\n\tret := &Vehicle{\n\t\tId:                   idValue,\n\t\tName:                 nameValue,\n\t\tModel:                modelValue,\n\t\tVehicleClass:         vehicleClassValue,\n\t\tManufacturer:         manufacturerValue,\n\t\tLength:               lengthValue,\n\t\tCostInCredits:        costInCreditsValue,\n\t\tCrew:                 crewValue,\n\t\tPassengers:           passengersValue,\n\t\tMaxAtmospheringSpeed: maxAtmospheringSpeedValue,\n\t\tCargoCapacity:        cargoCapacityValue,\n\t\tConsumables:          consumablesValue,\n\t\tUrl:                  urlValue,\n\t\tCreated:              createdValue,\n\t\tEdited:               editedValue,\n\t\tFilmIds:              filmIdsValue,\n\t\tPilotIds:             pilotIdsValue,\n\t}\n\treturn ret, nil\n}\n\n// cast_repeated_Swapi_Film_Film__to__repeated_Swapi_Film cast from \"repeated swapi.film.Film\" to \"repeated swapi.Film\".\nfunc (s *SWAPI) cast_repeated_Swapi_Film_Film__to__repeated_Swapi_Film(from []*filmpb.Film) ([]*Film, error) {\n\tret := make([]*Film, 0, len(from))\n\tfor _, v := range from {\n\t\tcasted, err := s.cast_Swapi_Film_Film__to__Swapi_Film(v)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret = append(ret, casted)\n\t}\n\treturn ret, nil\n}\n\n// cast_repeated_Swapi_Person_Person__to__repeated_Swapi_Person cast from \"repeated swapi.person.Person\" to \"repeated swapi.Person\".\nfunc (s *SWAPI) cast_repeated_Swapi_Person_Person__to__repeated_Swapi_Person(from []*personpb.Person) ([]*Person, error) {\n\tret := make([]*Person, 0, len(from))\n\tfor _, v := range from {\n\t\tcasted, err := s.cast_Swapi_Person_Person__to__Swapi_Person(v)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret = append(ret, casted)\n\t}\n\treturn ret, nil\n}\n\n// cast_repeated_Swapi_Planet_Planet__to__repeated_Swapi_Planet cast from \"repeated swapi.planet.Planet\" to \"repeated swapi.Planet\".\nfunc (s *SWAPI) cast_repeated_Swapi_Planet_Planet__to__repeated_Swapi_Planet(from []*planetpb.Planet) ([]*Planet, error) {\n\tret := make([]*Planet, 0, len(from))\n\tfor _, v := range from {\n\t\tcasted, err := s.cast_Swapi_Planet_Planet__to__Swapi_Planet(v)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret = append(ret, casted)\n\t}\n\treturn ret, nil\n}\n\n// cast_repeated_Swapi_Species_Species__to__repeated_Swapi_Species cast from \"repeated swapi.species.Species\" to \"repeated swapi.Species\".\nfunc (s *SWAPI) cast_repeated_Swapi_Species_Species__to__repeated_Swapi_Species(from []*speciespb.Species) ([]*Species, error) {\n\tret := make([]*Species, 0, len(from))\n\tfor _, v := range from {\n\t\tcasted, err := s.cast_Swapi_Species_Species__to__Swapi_Species(v)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret = append(ret, casted)\n\t}\n\treturn ret, nil\n}\n\n// cast_repeated_Swapi_Starship_Starship__to__repeated_Swapi_Starship cast from \"repeated swapi.starship.Starship\" to \"repeated swapi.Starship\".\nfunc (s *SWAPI) cast_repeated_Swapi_Starship_Starship__to__repeated_Swapi_Starship(from []*starshippb.Starship) ([]*Starship, error) {\n\tret := make([]*Starship, 0, len(from))\n\tfor _, v := range from {\n\t\tcasted, err := s.cast_Swapi_Starship_Starship__to__Swapi_Starship(v)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret = append(ret, casted)\n\t}\n\treturn ret, nil\n}\n\n// cast_repeated_Swapi_Vehicle_Vehicle__to__repeated_Swapi_Vehicle cast from \"repeated swapi.vehicle.Vehicle\" to \"repeated swapi.Vehicle\".\nfunc (s *SWAPI) cast_repeated_Swapi_Vehicle_Vehicle__to__repeated_Swapi_Vehicle(from []*vehiclepb.Vehicle) ([]*Vehicle, error) {\n\tret := make([]*Vehicle, 0, len(from))\n\tfor _, v := range from {\n\t\tcasted, err := s.cast_Swapi_Vehicle_Vehicle__to__Swapi_Vehicle(v)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret = append(ret, casted)\n\t}\n\treturn ret, nil\n}\n\nfunc (s *SWAPI) logvalue_Google_Type_Date(v *date.Date) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Int64(\"year\", int64(v.GetYear())),\n\t\tslog.Int64(\"month\", int64(v.GetMonth())),\n\t\tslog.Int64(\"day\", int64(v.GetDay())),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_Film(v *Film) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Int64(\"id\", v.GetId()),\n\t\tslog.String(\"title\", v.GetTitle()),\n\t\tslog.Int64(\"episode_id\", int64(v.GetEpisodeId())),\n\t\tslog.String(\"opening_crawl\", v.GetOpeningCrawl()),\n\t\tslog.String(\"director\", v.GetDirector()),\n\t\tslog.String(\"producer\", v.GetProducer()),\n\t\tslog.Any(\"release_date\", s.logvalue_Google_Type_Date(v.GetReleaseDate())),\n\t\tslog.String(\"url\", v.GetUrl()),\n\t\tslog.String(\"created\", v.GetCreated()),\n\t\tslog.String(\"edited\", v.GetEdited()),\n\t\tslog.Any(\"species_ids\", v.GetSpeciesIds()),\n\t\tslog.Any(\"starship_ids\", v.GetStarshipIds()),\n\t\tslog.Any(\"vehicle_ids\", v.GetVehicleIds()),\n\t\tslog.Any(\"character_ids\", v.GetCharacterIds()),\n\t\tslog.Any(\"planet_ids\", v.GetPlanetIds()),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_Film_GetFilmRequest(v *filmpb.GetFilmRequest) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Int64(\"id\", v.GetId()),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_Film_ListFilmsRequest(v *filmpb.ListFilmsRequest) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.GetIds()),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_Films(v *Films) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"films\", s.logvalue_repeated_Swapi_Film(v.GetFilms())),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_FilmsArgument(v *SWAPI_Swapi_FilmsArgument) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.Ids),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_GetFilmReply(v *GetFilmReply) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"film\", s.logvalue_Swapi_Film(v.GetFilm())),\n\t\tslog.Any(\"species\", s.logvalue_repeated_Swapi_Species(v.GetSpecies())),\n\t\tslog.Any(\"starships\", s.logvalue_repeated_Swapi_Starship(v.GetStarships())),\n\t\tslog.Any(\"vehicles\", s.logvalue_repeated_Swapi_Vehicle(v.GetVehicles())),\n\t\tslog.Any(\"characters\", s.logvalue_repeated_Swapi_Person(v.GetCharacters())),\n\t\tslog.Any(\"planets\", s.logvalue_repeated_Swapi_Planet(v.GetPlanets())),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_GetFilmReplyArgument(v *SWAPI_Swapi_GetFilmReplyArgument) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Int64(\"id\", v.Id),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_GetPersonReply(v *GetPersonReply) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"person\", s.logvalue_Swapi_Person(v.GetPerson())),\n\t\tslog.Any(\"films\", s.logvalue_repeated_Swapi_Film(v.GetFilms())),\n\t\tslog.Any(\"species\", s.logvalue_repeated_Swapi_Species(v.GetSpecies())),\n\t\tslog.Any(\"starships\", s.logvalue_repeated_Swapi_Starship(v.GetStarships())),\n\t\tslog.Any(\"vehicles\", s.logvalue_repeated_Swapi_Vehicle(v.GetVehicles())),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_GetPersonReplyArgument(v *SWAPI_Swapi_GetPersonReplyArgument) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Int64(\"id\", v.Id),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_GetPlanetReply(v *GetPlanetReply) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"planet\", s.logvalue_Swapi_Planet(v.GetPlanet())),\n\t\tslog.Any(\"residents\", s.logvalue_repeated_Swapi_Person(v.GetResidents())),\n\t\tslog.Any(\"films\", s.logvalue_repeated_Swapi_Film(v.GetFilms())),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_GetPlanetReplyArgument(v *SWAPI_Swapi_GetPlanetReplyArgument) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Int64(\"id\", v.Id),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_GetSpeciesReply(v *GetSpeciesReply) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"species\", s.logvalue_Swapi_Species(v.GetSpecies())),\n\t\tslog.Any(\"people\", s.logvalue_repeated_Swapi_Person(v.GetPeople())),\n\t\tslog.Any(\"films\", s.logvalue_repeated_Swapi_Film(v.GetFilms())),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_GetSpeciesReplyArgument(v *SWAPI_Swapi_GetSpeciesReplyArgument) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Int64(\"id\", v.Id),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_GetStarshipReply(v *GetStarshipReply) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"starship\", s.logvalue_Swapi_Starship(v.GetStarship())),\n\t\tslog.Any(\"films\", s.logvalue_repeated_Swapi_Film(v.GetFilms())),\n\t\tslog.Any(\"pilots\", s.logvalue_repeated_Swapi_Person(v.GetPilots())),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_GetStarshipReplyArgument(v *SWAPI_Swapi_GetStarshipReplyArgument) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Int64(\"id\", v.Id),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_GetVehicleReply(v *GetVehicleReply) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"vehicle\", s.logvalue_Swapi_Vehicle(v.GetVehicle())),\n\t\tslog.Any(\"films\", s.logvalue_repeated_Swapi_Film(v.GetFilms())),\n\t\tslog.Any(\"pilots\", s.logvalue_repeated_Swapi_Person(v.GetPilots())),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_GetVehicleReplyArgument(v *SWAPI_Swapi_GetVehicleReplyArgument) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Int64(\"id\", v.Id),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_ListFilmsReply(v *ListFilmsReply) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"films\", s.logvalue_repeated_Swapi_Film(v.GetFilms())),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_ListFilmsReplyArgument(v *SWAPI_Swapi_ListFilmsReplyArgument) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.Ids),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_ListPeopleReply(v *ListPeopleReply) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"people\", s.logvalue_repeated_Swapi_Person(v.GetPeople())),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_ListPeopleReplyArgument(v *SWAPI_Swapi_ListPeopleReplyArgument) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.Ids),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_ListPlanetsReply(v *ListPlanetsReply) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"planets\", s.logvalue_repeated_Swapi_Planet(v.GetPlanets())),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_ListPlanetsReplyArgument(v *SWAPI_Swapi_ListPlanetsReplyArgument) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.Ids),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_ListSpeciesReply(v *ListSpeciesReply) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"species\", s.logvalue_repeated_Swapi_Species(v.GetSpecies())),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_ListSpeciesReplyArgument(v *SWAPI_Swapi_ListSpeciesReplyArgument) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.Ids),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_ListStarshipsReply(v *ListStarshipsReply) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"starships\", s.logvalue_repeated_Swapi_Starship(v.GetStarships())),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_ListStarshipsReplyArgument(v *SWAPI_Swapi_ListStarshipsReplyArgument) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.Ids),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_ListVehiclesReply(v *ListVehiclesReply) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"vehicles\", s.logvalue_repeated_Swapi_Vehicle(v.GetVehicles())),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_ListVehiclesReplyArgument(v *SWAPI_Swapi_ListVehiclesReplyArgument) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.Ids),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_People(v *People) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"people\", s.logvalue_repeated_Swapi_Person(v.GetPeople())),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_PeopleArgument(v *SWAPI_Swapi_PeopleArgument) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.Ids),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_Person(v *Person) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Int64(\"id\", v.GetId()),\n\t\tslog.String(\"name\", v.GetName()),\n\t\tslog.String(\"birth_year\", v.GetBirthYear()),\n\t\tslog.String(\"eye_color\", v.GetEyeColor()),\n\t\tslog.String(\"gender\", v.GetGender()),\n\t\tslog.String(\"hair_color\", v.GetHairColor()),\n\t\tslog.String(\"height\", v.GetHeight()),\n\t\tslog.String(\"mass\", v.GetMass()),\n\t\tslog.String(\"skin_color\", v.GetSkinColor()),\n\t\tslog.String(\"homeworld\", v.GetHomeworld()),\n\t\tslog.String(\"url\", v.GetUrl()),\n\t\tslog.String(\"created\", v.GetCreated()),\n\t\tslog.String(\"edited\", v.GetEdited()),\n\t\tslog.Any(\"film_ids\", v.GetFilmIds()),\n\t\tslog.Any(\"species_ids\", v.GetSpeciesIds()),\n\t\tslog.Any(\"starship_ids\", v.GetStarshipIds()),\n\t\tslog.Any(\"vehicle_ids\", v.GetVehicleIds()),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_Person_GetPersonRequest(v *personpb.GetPersonRequest) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Int64(\"id\", v.GetId()),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_Person_ListPeopleRequest(v *personpb.ListPeopleRequest) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.GetIds()),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_Planet(v *Planet) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Int64(\"id\", v.GetId()),\n\t\tslog.String(\"name\", v.GetName()),\n\t\tslog.String(\"diameter\", v.GetDiameter()),\n\t\tslog.String(\"rotation_period\", v.GetRotationPeriod()),\n\t\tslog.String(\"orbital_period\", v.GetOrbitalPeriod()),\n\t\tslog.String(\"gravity\", v.GetGravity()),\n\t\tslog.String(\"population\", v.GetPopulation()),\n\t\tslog.String(\"climate\", v.GetClimate()),\n\t\tslog.String(\"terrain\", v.GetTerrain()),\n\t\tslog.String(\"surface_water\", v.GetSurfaceWater()),\n\t\tslog.String(\"url\", v.GetUrl()),\n\t\tslog.String(\"created\", v.GetCreated()),\n\t\tslog.String(\"edited\", v.GetEdited()),\n\t\tslog.Any(\"resident_ids\", v.GetResidentIds()),\n\t\tslog.Any(\"film_ids\", v.GetFilmIds()),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_Planet_GetPlanetRequest(v *planetpb.GetPlanetRequest) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Int64(\"id\", v.GetId()),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_Planet_ListPlanetsRequest(v *planetpb.ListPlanetsRequest) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.GetIds()),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_Planets(v *Planets) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"planets\", s.logvalue_repeated_Swapi_Planet(v.GetPlanets())),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_PlanetsArgument(v *SWAPI_Swapi_PlanetsArgument) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.Ids),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_Species(v *Species) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Int64(\"id\", v.GetId()),\n\t\tslog.String(\"name\", v.GetName()),\n\t\tslog.String(\"classification\", v.GetClassification()),\n\t\tslog.String(\"designation\", v.GetDesignation()),\n\t\tslog.String(\"average_height\", v.GetAverageHeight()),\n\t\tslog.String(\"average_lifespan\", v.GetAverageLifespan()),\n\t\tslog.String(\"eye_colors\", v.GetEyeColors()),\n\t\tslog.String(\"hair_colors\", v.GetHairColors()),\n\t\tslog.String(\"skin_colors\", v.GetSkinColors()),\n\t\tslog.String(\"language\", v.GetLanguage()),\n\t\tslog.String(\"homeworld\", v.GetHomeworld()),\n\t\tslog.String(\"url\", v.GetUrl()),\n\t\tslog.String(\"created\", v.GetCreated()),\n\t\tslog.String(\"edited\", v.GetEdited()),\n\t\tslog.Any(\"person_ids\", v.GetPersonIds()),\n\t\tslog.Any(\"film_ids\", v.GetFilmIds()),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_SpeciesList(v *SpeciesList) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"species\", s.logvalue_repeated_Swapi_Species(v.GetSpecies())),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_SpeciesListArgument(v *SWAPI_Swapi_SpeciesListArgument) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.Ids),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_Species_GetSpeciesRequest(v *speciespb.GetSpeciesRequest) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Int64(\"id\", v.GetId()),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_Species_ListSpeciesRequest(v *speciespb.ListSpeciesRequest) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.GetIds()),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_Starship(v *Starship) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Int64(\"id\", v.GetId()),\n\t\tslog.String(\"name\", v.GetName()),\n\t\tslog.String(\"model\", v.GetModel()),\n\t\tslog.String(\"starship_class\", v.GetStarshipClass()),\n\t\tslog.String(\"manufacturer\", v.GetManufacturer()),\n\t\tslog.String(\"cost_in_credits\", v.GetCostInCredits()),\n\t\tslog.String(\"length\", v.GetLength()),\n\t\tslog.String(\"crew\", v.GetCrew()),\n\t\tslog.String(\"passengers\", v.GetPassengers()),\n\t\tslog.String(\"max_atmosphering_speed\", v.GetMaxAtmospheringSpeed()),\n\t\tslog.String(\"hyperdrive_rating\", v.GetHyperdriveRating()),\n\t\tslog.String(\"mglt\", v.GetMglt()),\n\t\tslog.String(\"cargo_capacity\", v.GetCargoCapacity()),\n\t\tslog.String(\"consumables\", v.GetConsumables()),\n\t\tslog.String(\"url\", v.GetUrl()),\n\t\tslog.String(\"created\", v.GetCreated()),\n\t\tslog.String(\"edited\", v.GetEdited()),\n\t\tslog.Any(\"film_ids\", v.GetFilmIds()),\n\t\tslog.Any(\"pilot_ids\", v.GetPilotIds()),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_Starship_GetStarshipRequest(v *starshippb.GetStarshipRequest) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Int64(\"id\", v.GetId()),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_Starship_ListStarshipsRequest(v *starshippb.ListStarshipsRequest) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.GetIds()),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_Starships(v *Starships) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"starships\", s.logvalue_repeated_Swapi_Starship(v.GetStarships())),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_StarshipsArgument(v *SWAPI_Swapi_StarshipsArgument) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.Ids),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_Vehicle(v *Vehicle) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Int64(\"id\", v.GetId()),\n\t\tslog.String(\"name\", v.GetName()),\n\t\tslog.String(\"model\", v.GetModel()),\n\t\tslog.String(\"vehicle_class\", v.GetVehicleClass()),\n\t\tslog.String(\"manufacturer\", v.GetManufacturer()),\n\t\tslog.String(\"length\", v.GetLength()),\n\t\tslog.String(\"cost_in_credits\", v.GetCostInCredits()),\n\t\tslog.String(\"crew\", v.GetCrew()),\n\t\tslog.String(\"passengers\", v.GetPassengers()),\n\t\tslog.String(\"max_atmosphering_speed\", v.GetMaxAtmospheringSpeed()),\n\t\tslog.String(\"cargo_capacity\", v.GetCargoCapacity()),\n\t\tslog.String(\"consumables\", v.GetConsumables()),\n\t\tslog.String(\"url\", v.GetUrl()),\n\t\tslog.String(\"created\", v.GetCreated()),\n\t\tslog.String(\"edited\", v.GetEdited()),\n\t\tslog.Any(\"film_ids\", v.GetFilmIds()),\n\t\tslog.Any(\"pilot_ids\", v.GetPilotIds()),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_Vehicle_GetVehicleRequest(v *vehiclepb.GetVehicleRequest) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Int64(\"id\", v.GetId()),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_Vehicle_ListVehiclesRequest(v *vehiclepb.ListVehiclesRequest) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.GetIds()),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_Vehicles(v *Vehicles) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"vehicles\", s.logvalue_repeated_Swapi_Vehicle(v.GetVehicles())),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_Swapi_VehiclesArgument(v *SWAPI_Swapi_VehiclesArgument) slog.Value {\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.Ids),\n\t)\n}\n\nfunc (s *SWAPI) logvalue_repeated_Swapi_Film(v []*Film) slog.Value {\n\tattrs := make([]slog.Attr, 0, len(v))\n\tfor idx, vv := range v {\n\t\tattrs = append(attrs, slog.Attr{\n\t\t\tKey:   grpcfed.ToLogAttrKey(idx),\n\t\t\tValue: s.logvalue_Swapi_Film(vv),\n\t\t})\n\t}\n\treturn slog.GroupValue(attrs...)\n}\n\nfunc (s *SWAPI) logvalue_repeated_Swapi_Person(v []*Person) slog.Value {\n\tattrs := make([]slog.Attr, 0, len(v))\n\tfor idx, vv := range v {\n\t\tattrs = append(attrs, slog.Attr{\n\t\t\tKey:   grpcfed.ToLogAttrKey(idx),\n\t\t\tValue: s.logvalue_Swapi_Person(vv),\n\t\t})\n\t}\n\treturn slog.GroupValue(attrs...)\n}\n\nfunc (s *SWAPI) logvalue_repeated_Swapi_Planet(v []*Planet) slog.Value {\n\tattrs := make([]slog.Attr, 0, len(v))\n\tfor idx, vv := range v {\n\t\tattrs = append(attrs, slog.Attr{\n\t\t\tKey:   grpcfed.ToLogAttrKey(idx),\n\t\t\tValue: s.logvalue_Swapi_Planet(vv),\n\t\t})\n\t}\n\treturn slog.GroupValue(attrs...)\n}\n\nfunc (s *SWAPI) logvalue_repeated_Swapi_Species(v []*Species) slog.Value {\n\tattrs := make([]slog.Attr, 0, len(v))\n\tfor idx, vv := range v {\n\t\tattrs = append(attrs, slog.Attr{\n\t\t\tKey:   grpcfed.ToLogAttrKey(idx),\n\t\t\tValue: s.logvalue_Swapi_Species(vv),\n\t\t})\n\t}\n\treturn slog.GroupValue(attrs...)\n}\n\nfunc (s *SWAPI) logvalue_repeated_Swapi_Starship(v []*Starship) slog.Value {\n\tattrs := make([]slog.Attr, 0, len(v))\n\tfor idx, vv := range v {\n\t\tattrs = append(attrs, slog.Attr{\n\t\t\tKey:   grpcfed.ToLogAttrKey(idx),\n\t\t\tValue: s.logvalue_Swapi_Starship(vv),\n\t\t})\n\t}\n\treturn slog.GroupValue(attrs...)\n}\n\nfunc (s *SWAPI) logvalue_repeated_Swapi_Vehicle(v []*Vehicle) slog.Value {\n\tattrs := make([]slog.Attr, 0, len(v))\n\tfor idx, vv := range v {\n\t\tattrs = append(attrs, slog.Attr{\n\t\t\tKey:   grpcfed.ToLogAttrKey(idx),\n\t\t\tValue: s.logvalue_Swapi_Vehicle(vv),\n\t\t})\n\t}\n\treturn slog.GroupValue(attrs...)\n}\n"
  },
  {
    "path": "demo/swapi/vehicle/vehicle.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.34.1\n// \tprotoc        (unknown)\n// source: vehicle/vehicle.proto\n\npackage vehiclepb\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// GetVehicleRequest.\ntype GetVehicleRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// vehicle id.\n\tId int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *GetVehicleRequest) Reset() {\n\t*x = GetVehicleRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_vehicle_vehicle_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetVehicleRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetVehicleRequest) ProtoMessage() {}\n\nfunc (x *GetVehicleRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_vehicle_vehicle_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetVehicleRequest.ProtoReflect.Descriptor instead.\nfunc (*GetVehicleRequest) Descriptor() ([]byte, []int) {\n\treturn file_vehicle_vehicle_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetVehicleRequest) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\n// GetVehicleReply.\ntype GetVehicleReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tVehicle *Vehicle `protobuf:\"bytes,1,opt,name=vehicle,proto3\" json:\"vehicle,omitempty\"`\n}\n\nfunc (x *GetVehicleReply) Reset() {\n\t*x = GetVehicleReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_vehicle_vehicle_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GetVehicleReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetVehicleReply) ProtoMessage() {}\n\nfunc (x *GetVehicleReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_vehicle_vehicle_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetVehicleReply.ProtoReflect.Descriptor instead.\nfunc (*GetVehicleReply) Descriptor() ([]byte, []int) {\n\treturn file_vehicle_vehicle_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetVehicleReply) GetVehicle() *Vehicle {\n\tif x != nil {\n\t\treturn x.Vehicle\n\t}\n\treturn nil\n}\n\n// ListVehiclesRequest.\ntype ListVehiclesRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tIds []int64 `protobuf:\"varint,1,rep,packed,name=ids,proto3\" json:\"ids,omitempty\"`\n}\n\nfunc (x *ListVehiclesRequest) Reset() {\n\t*x = ListVehiclesRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_vehicle_vehicle_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListVehiclesRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListVehiclesRequest) ProtoMessage() {}\n\nfunc (x *ListVehiclesRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_vehicle_vehicle_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListVehiclesRequest.ProtoReflect.Descriptor instead.\nfunc (*ListVehiclesRequest) Descriptor() ([]byte, []int) {\n\treturn file_vehicle_vehicle_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *ListVehiclesRequest) GetIds() []int64 {\n\tif x != nil {\n\t\treturn x.Ids\n\t}\n\treturn nil\n}\n\n// ListVehiclesReply.\ntype ListVehiclesReply struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tVehicles []*Vehicle `protobuf:\"bytes,1,rep,name=vehicles,proto3\" json:\"vehicles,omitempty\"`\n}\n\nfunc (x *ListVehiclesReply) Reset() {\n\t*x = ListVehiclesReply{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_vehicle_vehicle_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListVehiclesReply) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListVehiclesReply) ProtoMessage() {}\n\nfunc (x *ListVehiclesReply) ProtoReflect() protoreflect.Message {\n\tmi := &file_vehicle_vehicle_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListVehiclesReply.ProtoReflect.Descriptor instead.\nfunc (*ListVehiclesReply) Descriptor() ([]byte, []int) {\n\treturn file_vehicle_vehicle_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *ListVehiclesReply) GetVehicles() []*Vehicle {\n\tif x != nil {\n\t\treturn x.Vehicles\n\t}\n\treturn nil\n}\n\n// Vehicle is a single transport craft that does not have hyperdrive capability..\ntype Vehicle struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// vehicle id.\n\tId int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\t// The name of this vehicle. The common name, such as \"Sand Crawler\" or \"Speeder bike\".\n\tName string `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// The model or official name of this vehicle. Such as \"All-Terrain Attack Transport\".\n\tModel string `protobuf:\"bytes,3,opt,name=model,proto3\" json:\"model,omitempty\"`\n\t// The class of this vehicle, such as \"Wheeled\" or \"Repulsorcraft\".\n\tVehicleClass string `protobuf:\"bytes,4,opt,name=vehicle_class,json=vehicleClass,proto3\" json:\"vehicle_class,omitempty\"`\n\t// The manufacturer of this vehicle. Comma separated if more than one.\n\tManufacturer string `protobuf:\"bytes,5,opt,name=manufacturer,proto3\" json:\"manufacturer,omitempty\"`\n\t// The length of this vehicle in meters.\n\tLength string `protobuf:\"bytes,6,opt,name=length,proto3\" json:\"length,omitempty\"`\n\t// The cost of this vehicle new, in Galactic Credits.\n\tCostInCredits string `protobuf:\"bytes,7,opt,name=cost_in_credits,json=costInCredits,proto3\" json:\"cost_in_credits,omitempty\"`\n\t// The number of personnel needed to run or pilot this vehicle.\n\tCrew string `protobuf:\"bytes,8,opt,name=crew,proto3\" json:\"crew,omitempty\"`\n\t// The number of non-essential people this vehicle can transport.\n\tPassengers string `protobuf:\"bytes,9,opt,name=passengers,proto3\" json:\"passengers,omitempty\"`\n\t// The maximum speed of this vehicle in the atmosphere.\n\tMaxAtmospheringSpeed string `protobuf:\"bytes,10,opt,name=max_atmosphering_speed,json=maxAtmospheringSpeed,proto3\" json:\"max_atmosphering_speed,omitempty\"`\n\t// The maximum number of kilograms that this vehicle can transport.\n\tCargoCapacity string `protobuf:\"bytes,11,opt,name=cargo_capacity,json=cargoCapacity,proto3\" json:\"cargo_capacity,omitempty\"`\n\t// The maximum length of time that this vehicle can provide consumables for its entire crew without having to resupply.\n\tConsumables string `protobuf:\"bytes,12,opt,name=consumables,proto3\" json:\"consumables,omitempty\"`\n\t// the hypermedia URL of this resource.\n\tUrl string `protobuf:\"bytes,13,opt,name=url,proto3\" json:\"url,omitempty\"`\n\t// the ISO 8601 date format of the time that this resource was created.\n\tCreated string `protobuf:\"bytes,14,opt,name=created,proto3\" json:\"created,omitempty\"`\n\t// the ISO 8601 date format of the time that this resource was edited.\n\tEdited string `protobuf:\"bytes,15,opt,name=edited,proto3\" json:\"edited,omitempty\"`\n\t// film ids.\n\tFilmIds []int64 `protobuf:\"varint,16,rep,packed,name=film_ids,json=filmIds,proto3\" json:\"film_ids,omitempty\"`\n\t// pilot ids.\n\tPilotIds []int64 `protobuf:\"varint,17,rep,packed,name=pilot_ids,json=pilotIds,proto3\" json:\"pilot_ids,omitempty\"`\n}\n\nfunc (x *Vehicle) Reset() {\n\t*x = Vehicle{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_vehicle_vehicle_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Vehicle) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Vehicle) ProtoMessage() {}\n\nfunc (x *Vehicle) ProtoReflect() protoreflect.Message {\n\tmi := &file_vehicle_vehicle_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Vehicle.ProtoReflect.Descriptor instead.\nfunc (*Vehicle) Descriptor() ([]byte, []int) {\n\treturn file_vehicle_vehicle_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *Vehicle) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *Vehicle) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Vehicle) GetModel() string {\n\tif x != nil {\n\t\treturn x.Model\n\t}\n\treturn \"\"\n}\n\nfunc (x *Vehicle) GetVehicleClass() string {\n\tif x != nil {\n\t\treturn x.VehicleClass\n\t}\n\treturn \"\"\n}\n\nfunc (x *Vehicle) GetManufacturer() string {\n\tif x != nil {\n\t\treturn x.Manufacturer\n\t}\n\treturn \"\"\n}\n\nfunc (x *Vehicle) GetLength() string {\n\tif x != nil {\n\t\treturn x.Length\n\t}\n\treturn \"\"\n}\n\nfunc (x *Vehicle) GetCostInCredits() string {\n\tif x != nil {\n\t\treturn x.CostInCredits\n\t}\n\treturn \"\"\n}\n\nfunc (x *Vehicle) GetCrew() string {\n\tif x != nil {\n\t\treturn x.Crew\n\t}\n\treturn \"\"\n}\n\nfunc (x *Vehicle) GetPassengers() string {\n\tif x != nil {\n\t\treturn x.Passengers\n\t}\n\treturn \"\"\n}\n\nfunc (x *Vehicle) GetMaxAtmospheringSpeed() string {\n\tif x != nil {\n\t\treturn x.MaxAtmospheringSpeed\n\t}\n\treturn \"\"\n}\n\nfunc (x *Vehicle) GetCargoCapacity() string {\n\tif x != nil {\n\t\treturn x.CargoCapacity\n\t}\n\treturn \"\"\n}\n\nfunc (x *Vehicle) GetConsumables() string {\n\tif x != nil {\n\t\treturn x.Consumables\n\t}\n\treturn \"\"\n}\n\nfunc (x *Vehicle) GetUrl() string {\n\tif x != nil {\n\t\treturn x.Url\n\t}\n\treturn \"\"\n}\n\nfunc (x *Vehicle) GetCreated() string {\n\tif x != nil {\n\t\treturn x.Created\n\t}\n\treturn \"\"\n}\n\nfunc (x *Vehicle) GetEdited() string {\n\tif x != nil {\n\t\treturn x.Edited\n\t}\n\treturn \"\"\n}\n\nfunc (x *Vehicle) GetFilmIds() []int64 {\n\tif x != nil {\n\t\treturn x.FilmIds\n\t}\n\treturn nil\n}\n\nfunc (x *Vehicle) GetPilotIds() []int64 {\n\tif x != nil {\n\t\treturn x.PilotIds\n\t}\n\treturn nil\n}\n\nvar File_vehicle_vehicle_proto protoreflect.FileDescriptor\n\nvar file_vehicle_vehicle_proto_rawDesc = []byte{\n\t0x0a, 0x15, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x2f, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x76,\n\t0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x22, 0x23, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x56, 0x65, 0x68,\n\t0x69, 0x63, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69,\n\t0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x22, 0x43, 0x0a, 0x0f, 0x47,\n\t0x65, 0x74, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x30,\n\t0x0a, 0x07, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x16, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x2e,\n\t0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x52, 0x07, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65,\n\t0x22, 0x27, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x73,\n\t0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01,\n\t0x20, 0x03, 0x28, 0x03, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, 0x47, 0x0a, 0x11, 0x4c, 0x69, 0x73,\n\t0x74, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x32,\n\t0x0a, 0x08, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x16, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65,\n\t0x2e, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x52, 0x08, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c,\n\t0x65, 0x73, 0x22, 0xfb, 0x03, 0x0a, 0x07, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x12, 0x0e,\n\t0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12,\n\t0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x76, 0x65, 0x68, 0x69,\n\t0x63, 0x6c, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x0c, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x22, 0x0a,\n\t0x0c, 0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, 0x72, 0x65, 0x72, 0x18, 0x05, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, 0x72, 0x65,\n\t0x72, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x06, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x26, 0x0a, 0x0f, 0x63, 0x6f, 0x73,\n\t0x74, 0x5f, 0x69, 0x6e, 0x5f, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x43, 0x72, 0x65, 0x64, 0x69, 0x74,\n\t0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x72, 0x65, 0x77, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x04, 0x63, 0x72, 0x65, 0x77, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x61, 0x73, 0x73, 0x65, 0x6e, 0x67,\n\t0x65, 0x72, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x61, 0x73, 0x73, 0x65,\n\t0x6e, 0x67, 0x65, 0x72, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x61, 0x74, 0x6d,\n\t0x6f, 0x73, 0x70, 0x68, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x70, 0x65, 0x65, 0x64, 0x18,\n\t0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x6d, 0x61, 0x78, 0x41, 0x74, 0x6d, 0x6f, 0x73, 0x70,\n\t0x68, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x63,\n\t0x61, 0x72, 0x67, 0x6f, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x0b, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x61, 0x72, 0x67, 0x6f, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69,\n\t0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65,\n\t0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x61,\n\t0x62, 0x6c, 0x65, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x0d, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65,\n\t0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,\n\t0x12, 0x16, 0x0a, 0x06, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x06, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x6d,\n\t0x5f, 0x69, 0x64, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x03, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x6d,\n\t0x49, 0x64, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x69, 0x6c, 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x73,\n\t0x18, 0x11, 0x20, 0x03, 0x28, 0x03, 0x52, 0x08, 0x70, 0x69, 0x6c, 0x6f, 0x74, 0x49, 0x64, 0x73,\n\t0x32, 0xba, 0x01, 0x0a, 0x0e, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c,\n\t0x65, 0x12, 0x20, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c,\n\t0x65, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75,\n\t0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x65, 0x68, 0x69,\n\t0x63, 0x6c, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x52, 0x65,\n\t0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x56, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x65, 0x68,\n\t0x69, 0x63, 0x6c, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x65,\n\t0x68, 0x69, 0x63, 0x6c, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c,\n\t0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x73, 0x77, 0x61, 0x70,\n\t0x69, 0x2e, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x65,\n\t0x68, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0xb7, 0x01,\n\t0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x65, 0x68, 0x69,\n\t0x63, 0x6c, 0x65, 0x42, 0x0c, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x74,\n\t0x6f, 0x50, 0x01, 0x5a, 0x3f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x6d, 0x65, 0x72, 0x63, 0x61, 0x72, 0x69, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x73, 0x77, 0x61,\n\t0x70, 0x69, 0x2f, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x3b, 0x76, 0x65, 0x68, 0x69, 0x63,\n\t0x6c, 0x65, 0x70, 0x62, 0xa2, 0x02, 0x03, 0x53, 0x56, 0x58, 0xaa, 0x02, 0x0d, 0x53, 0x77, 0x61,\n\t0x70, 0x69, 0x2e, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0xca, 0x02, 0x0d, 0x53, 0x77, 0x61,\n\t0x70, 0x69, 0x5c, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0xe2, 0x02, 0x19, 0x53, 0x77, 0x61,\n\t0x70, 0x69, 0x5c, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65,\n\t0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, 0x53, 0x77, 0x61, 0x70, 0x69, 0x3a, 0x3a,\n\t0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_vehicle_vehicle_proto_rawDescOnce sync.Once\n\tfile_vehicle_vehicle_proto_rawDescData = file_vehicle_vehicle_proto_rawDesc\n)\n\nfunc file_vehicle_vehicle_proto_rawDescGZIP() []byte {\n\tfile_vehicle_vehicle_proto_rawDescOnce.Do(func() {\n\t\tfile_vehicle_vehicle_proto_rawDescData = protoimpl.X.CompressGZIP(file_vehicle_vehicle_proto_rawDescData)\n\t})\n\treturn file_vehicle_vehicle_proto_rawDescData\n}\n\nvar file_vehicle_vehicle_proto_msgTypes = make([]protoimpl.MessageInfo, 5)\nvar file_vehicle_vehicle_proto_goTypes = []interface{}{\n\t(*GetVehicleRequest)(nil),   // 0: swapi.vehicle.GetVehicleRequest\n\t(*GetVehicleReply)(nil),     // 1: swapi.vehicle.GetVehicleReply\n\t(*ListVehiclesRequest)(nil), // 2: swapi.vehicle.ListVehiclesRequest\n\t(*ListVehiclesReply)(nil),   // 3: swapi.vehicle.ListVehiclesReply\n\t(*Vehicle)(nil),             // 4: swapi.vehicle.Vehicle\n}\nvar file_vehicle_vehicle_proto_depIdxs = []int32{\n\t4, // 0: swapi.vehicle.GetVehicleReply.vehicle:type_name -> swapi.vehicle.Vehicle\n\t4, // 1: swapi.vehicle.ListVehiclesReply.vehicles:type_name -> swapi.vehicle.Vehicle\n\t0, // 2: swapi.vehicle.VehicleService.GetVehicle:input_type -> swapi.vehicle.GetVehicleRequest\n\t2, // 3: swapi.vehicle.VehicleService.ListVehicles:input_type -> swapi.vehicle.ListVehiclesRequest\n\t1, // 4: swapi.vehicle.VehicleService.GetVehicle:output_type -> swapi.vehicle.GetVehicleReply\n\t3, // 5: swapi.vehicle.VehicleService.ListVehicles:output_type -> swapi.vehicle.ListVehiclesReply\n\t4, // [4:6] is the sub-list for method output_type\n\t2, // [2:4] is the sub-list for method input_type\n\t2, // [2:2] is the sub-list for extension type_name\n\t2, // [2:2] is the sub-list for extension extendee\n\t0, // [0:2] is the sub-list for field type_name\n}\n\nfunc init() { file_vehicle_vehicle_proto_init() }\nfunc file_vehicle_vehicle_proto_init() {\n\tif File_vehicle_vehicle_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_vehicle_vehicle_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetVehicleRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_vehicle_vehicle_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GetVehicleReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_vehicle_vehicle_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListVehiclesRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_vehicle_vehicle_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListVehiclesReply); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_vehicle_vehicle_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Vehicle); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_vehicle_vehicle_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   5,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_vehicle_vehicle_proto_goTypes,\n\t\tDependencyIndexes: file_vehicle_vehicle_proto_depIdxs,\n\t\tMessageInfos:      file_vehicle_vehicle_proto_msgTypes,\n\t}.Build()\n\tFile_vehicle_vehicle_proto = out.File\n\tfile_vehicle_vehicle_proto_rawDesc = nil\n\tfile_vehicle_vehicle_proto_goTypes = nil\n\tfile_vehicle_vehicle_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "demo/swapi/vehicle/vehicle_grpc.pb.go",
    "content": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.4.0\n// - protoc             (unknown)\n// source: vehicle/vehicle.proto\n\npackage vehiclepb\n\nimport (\n\tcontext \"context\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n)\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\n// Requires gRPC-Go v1.62.0 or later.\nconst _ = grpc.SupportPackageIsVersion8\n\nconst (\n\tVehicleService_GetVehicle_FullMethodName   = \"/swapi.vehicle.VehicleService/GetVehicle\"\n\tVehicleService_ListVehicles_FullMethodName = \"/swapi.vehicle.VehicleService/ListVehicles\"\n)\n\n// VehicleServiceClient is the client API for VehicleService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\ntype VehicleServiceClient interface {\n\tGetVehicle(ctx context.Context, in *GetVehicleRequest, opts ...grpc.CallOption) (*GetVehicleReply, error)\n\tListVehicles(ctx context.Context, in *ListVehiclesRequest, opts ...grpc.CallOption) (*ListVehiclesReply, error)\n}\n\ntype vehicleServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewVehicleServiceClient(cc grpc.ClientConnInterface) VehicleServiceClient {\n\treturn &vehicleServiceClient{cc}\n}\n\nfunc (c *vehicleServiceClient) GetVehicle(ctx context.Context, in *GetVehicleRequest, opts ...grpc.CallOption) (*GetVehicleReply, error) {\n\tcOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)\n\tout := new(GetVehicleReply)\n\terr := c.cc.Invoke(ctx, VehicleService_GetVehicle_FullMethodName, in, out, cOpts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *vehicleServiceClient) ListVehicles(ctx context.Context, in *ListVehiclesRequest, opts ...grpc.CallOption) (*ListVehiclesReply, error) {\n\tcOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)\n\tout := new(ListVehiclesReply)\n\terr := c.cc.Invoke(ctx, VehicleService_ListVehicles_FullMethodName, in, out, cOpts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// VehicleServiceServer is the server API for VehicleService service.\n// All implementations must embed UnimplementedVehicleServiceServer\n// for forward compatibility\ntype VehicleServiceServer interface {\n\tGetVehicle(context.Context, *GetVehicleRequest) (*GetVehicleReply, error)\n\tListVehicles(context.Context, *ListVehiclesRequest) (*ListVehiclesReply, error)\n\tmustEmbedUnimplementedVehicleServiceServer()\n}\n\n// UnimplementedVehicleServiceServer must be embedded to have forward compatible implementations.\ntype UnimplementedVehicleServiceServer struct {\n}\n\nfunc (UnimplementedVehicleServiceServer) GetVehicle(context.Context, *GetVehicleRequest) (*GetVehicleReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetVehicle not implemented\")\n}\nfunc (UnimplementedVehicleServiceServer) ListVehicles(context.Context, *ListVehiclesRequest) (*ListVehiclesReply, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method ListVehicles not implemented\")\n}\nfunc (UnimplementedVehicleServiceServer) mustEmbedUnimplementedVehicleServiceServer() {}\n\n// UnsafeVehicleServiceServer may be embedded to opt out of forward compatibility for this service.\n// Use of this interface is not recommended, as added methods to VehicleServiceServer will\n// result in compilation errors.\ntype UnsafeVehicleServiceServer interface {\n\tmustEmbedUnimplementedVehicleServiceServer()\n}\n\nfunc RegisterVehicleServiceServer(s grpc.ServiceRegistrar, srv VehicleServiceServer) {\n\ts.RegisterService(&VehicleService_ServiceDesc, srv)\n}\n\nfunc _VehicleService_GetVehicle_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetVehicleRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(VehicleServiceServer).GetVehicle(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: VehicleService_GetVehicle_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(VehicleServiceServer).GetVehicle(ctx, req.(*GetVehicleRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _VehicleService_ListVehicles_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(ListVehiclesRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(VehicleServiceServer).ListVehicles(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: VehicleService_ListVehicles_FullMethodName,\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(VehicleServiceServer).ListVehicles(ctx, req.(*ListVehiclesRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\n// VehicleService_ServiceDesc is the grpc.ServiceDesc for VehicleService service.\n// It's only intended for direct use with grpc.RegisterService,\n// and not to be introspected or modified (even as a copy)\nvar VehicleService_ServiceDesc = grpc.ServiceDesc{\n\tServiceName: \"swapi.vehicle.VehicleService\",\n\tHandlerType: (*VehicleServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"GetVehicle\",\n\t\t\tHandler:    _VehicleService_GetVehicle_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"ListVehicles\",\n\t\t\tHandler:    _VehicleService_ListVehicles_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"vehicle/vehicle.proto\",\n}\n"
  },
  {
    "path": "demo/util/util.go",
    "content": "package util\n\nimport (\n\t\"fmt\"\n\t\"regexp\"\n\t\"strconv\"\n)\n\nvar (\n\tpersonURLToIDRe   = regexp.MustCompile(`swapi.dev/api/people/(\\d+)/`)\n\tplanetURLToIDRe   = regexp.MustCompile(`swapi.dev/api/planets/(\\d+)/`)\n\tspeciesURLToIDRe  = regexp.MustCompile(`swapi.dev/api/species/(\\d+)/`)\n\tstarshipURLToIDRe = regexp.MustCompile(`swapi.dev/api/starships/(\\d+)/`)\n\tvehicleURLToIDRe  = regexp.MustCompile(`swapi.dev/api/vehicles/(\\d+)/`)\n\tfilmURLToIDRe     = regexp.MustCompile(`swapi.dev/api/films/(\\d+)/`)\n)\n\nfunc PersonURLToID(url string) (int64, error) {\n\treturn urlToID(url, personURLToIDRe)\n}\n\nfunc PlanetURLToID(url string) (int64, error) {\n\treturn urlToID(url, planetURLToIDRe)\n}\n\nfunc VehicleURLToID(url string) (int64, error) {\n\treturn urlToID(url, vehicleURLToIDRe)\n}\n\nfunc StarshipURLToID(url string) (int64, error) {\n\treturn urlToID(url, starshipURLToIDRe)\n}\n\nfunc SpeciesURLToID(url string) (int64, error) {\n\treturn urlToID(url, speciesURLToIDRe)\n}\n\nfunc FilmURLToID(url string) (int64, error) {\n\treturn urlToID(url, filmURLToIDRe)\n}\n\nfunc urlToID(url string, re *regexp.Regexp) (int64, error) {\n\tmatches := re.FindAllStringSubmatch(url, 1)\n\tif len(matches) != 1 {\n\t\treturn 0, fmt.Errorf(\"unexpected url format: %s\", url)\n\t}\n\tif len(matches[0]) != 2 {\n\t\treturn 0, fmt.Errorf(\"unexpected url format: %s\", url)\n\t}\n\tid, err := strconv.ParseInt(matches[0][1], 10, 64)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn id, nil\n}\n"
  },
  {
    "path": "docs/cel/any.md",
    "content": "# grpc.federation.any APIs\n\n# Index\n\n- [`new`](#new)\n\n# Functions\n\n## new\n\n`new` explicitly create an instance of the `google.protobuf.Any` type. The argument must be a Protocol Buffers message type.\n\n### Parameters\n\n`new(message) google.protobuf.Any`\n\n### Examples\n\n```cel\ngrpc.federation.any.new(google.protobuf.Empty{})\n```\n"
  },
  {
    "path": "docs/cel/enum.md",
    "content": "# grpc.federation.enum APIs\n\n# Index\n\n- [`select`](#select)\n- [`name`](#enum-fqdnname)\n- [`value`](#enum-fqdnvalue)\n- [`from`](#enum-fqdnfrom)\n- [`attr`](#enum-fqdnattr)\n\n# Functions\n\n## select\n\n`select` selects the first enum value if the specified condition is `true`, and the second enum value if the condition is `false`. It is used when performing field binding for enums that map multiple enums with an alias.\n\nIf you try to return an enum value without using this function, an error will occur due to type mismatch.\n\ne.g.) `true ? pkg.EnumType.Enum_VALUE_A : pkgv2.EnumType.ENUM_VALUE_B`\n\n```\ngrpc-federation: ERROR: <input>:1:6: found no matching overload for '_?_:_' applied to '(bool, pkg.EnumType(int), pkgv2.EnumType(int))'\n | true ? pkg.EnumType.value('ENUM_VALUE_A') : pkgv2.EnumType.value('ENUM_VALUE_B')\n | .....^\n```\n\n### Parameters\n\n`select(cond bool, <first-enum-value>, <second-enum-value>) grpc.federation.private.EnumSelector`\n\n- `cond`: condition to select enum value\n- `first-enum-value`: first enum value. this is selected if the condition is true.\n- `second-enum-value`: second enum value. this is selected if the condition is false.\n\n### Examples\n\n```cel\ngrpc.federation.enum.select(true, pkg.EnumType.ENUM_VALUE_A, pkgv2.EnumType.ENUM_VALUE_B)\n```\n\n## `<enum-fqdn>.name`\n\nFor all enum types, you can use the `name` method to obtain the name of the enum value as a string.\n\n### Parameters\n\n`pkg.EnumType.name(<enum-value>) string`\n\n- `<enum-value>`: int or enum typed value\n\n### Examples\n\nIn the following case, `\"ENUM_VALUE_1\"` ( string typed value) is returned.\n\n```cel\nfoo.EnumType.name(foo.EnumType.ENUM_VALUE_1)\n```\n\n```proto\npackage foo;\n\nenum EnumType {\n  ENUM_VALUE_UNKNOWN = 0;\n  ENUM_VALUE_1 = 1;\n}\n```\n\n## `<enum-fqdn>.value`\n\nFor all enum types, you can use the `value` method to obtain the enum typed value from name.\n\n### Parameters\n\n`pkg.EnumType.value(enumValueName string) EnumValue`\n\n- `enumValueName`: name of the enum value\n- `EnumValue`: enum typed value. This value can be used as an argument for the `select` function\n\n### Examples\n\nIn the following case, `foo.EnumType.ENUM_VALUE_1` ( enum typed value) is returned.\n\n```cel\nfoo.EnumType.value('ENUM_VALUE_1')\n```\n\n```proto\npackage foo;\n\nenum EnumType {\n  ENUM_VALUE_UNKNOWN = 0;\n  ENUM_VALUE_1 = 1;\n}\n```\n\n## `<enum-fqdn>.from`\n\nFor all enum types, you can use the `from` method to obtain the enum typed value from int value.\n\n### Parameters\n\n`pkg.EnumType.from(enumValue int) EnumValue`\n\n- `enumValue`: int typed value of the enum value\n- `EnumValue`: enum typed value. This value can be used as an argument for the `select` function\n\n### Examples\n\nIn the following case, `foo.EnumType.ENUM_VALUE_1` ( enum typed value) is returned.\n\n> [!NOTE]\n> Here, you might be confused by the difference between `foo.EnumType.ENUM_VALUE_1` appearing in the expression and the returned `foo.EnumType.ENUM_VALUE_1` value.\n> As a basic principle, CEL treats enum values as int types when specified directly.\n> The `from` method is used to convert this to a typed enum value.\n> Although the result looks the same, it is actually typed and can be used as an argument for the `select` function.\n\n\n```cel\nfoo.EnumType.from(foo.EnumType.ENUM_VALUE_1)\n```\n\n```proto\npackage foo;\n\nenum EnumType {\n  ENUM_VALUE_UNKNOWN = 0;\n  ENUM_VALUE_1 = 1;\n}\n```\n\n## `<enum-fqdn>.attr`\n\nIf you use `attr` to hold multiple name-value pairs corresponding to an enum value, you can get value from `name`.\n\n### Parameters\n\n`pkg.EnumType.attr(enumValue EnumValue, name string) string`\n\n- `enumValue`: the enum value\n- `name`: string value to search attribute.\n\n### Examples\n\nIn the following case, `Foo.text` value is `foo`.\n\n```proto\npackage mypkg;\n\nmessage Foo {\n  option (grpc.federation.message) = {\n    def { name: \"v\" by: \"Type.value('VALUE_1')\" }\n  };\n  string text = 1 [(grpc.federation.field).by = \"Type.attr(v, 'attr_x')\"];\n}\n\nenum Type {\n  VALUE_1 = 1 [(grpc.federation.enum_value).attr = {\n    name: \"attr_x\"\n    value: \"foo\"\n  }];\n  VALUE_2 = 2 [(grpc.federation.enum_value).attr = {\n    name: \"attr_x\"\n    value: \"bar\"\n  }];\n}\n```"
  },
  {
    "path": "docs/cel/list.md",
    "content": "# grpc.federation.list APIs\n\n# Index\n\n- [`reduce`](#reduce)\n- [`first`](#first)\n- [`sortAsc`](#sortAsc)\n- [`sortDesc`](#sortDesc)\n- [`sortStableAsc`](#sortStableAsc)\n- [`sortStableDesc`](#sortStableDesc)\n\n# Macros\n\n## reduce\n\n`reduce` executes a user-supplied \"reducer\" expression on each element of the repeated type, in order, passing in the return value from the calculation on the preceding element. The final result of running the reducer across all elements of the repeated type is a single value.\n\n### Parameters\n\n`range.reduce(accumulator, current, <expr>, <init>)`\n\n- `range`: repeated type value\n- `accumulator` : The value resulting from the previous  `<expr>` expression. On the first call, its value is the result of `<init>` expression.\n- `current`: current iteration value\n- `<expr>`: expression for reduce operation\n- `<init>`: expression for initial value\n\n### Examples\n\n```cel\n[2, 3, 4].reduce(accum, cur, accum + cur, 1) //=> 10\n```\n\n## first\n\nReturns the element that evaluates to `<expr>` when the result is true. If all elements are not matched, `optional.none` is returned. Thus, the return value of `first` will always be of optional type. The optional value can be used as is for field binding.\n\n`first` is equivalent to the following expression.\n\n```cel\nrange.filter(var, <expr>)[?0]\n```\n\n### Parameters\n\n`range.first(var, <expr>)`\n\n- `range`: repeated type value\n- `var`: current iteration value\n- `<expr>`: Write a conditional expression to return the first match. Must return a boolean value.\n\n### Examples\n\n```cel\n[1, 2, 3, 4].first(v, v % 2 == 0) //=> optional.of(2)\n```\n\n## sortAsc\n\nReturns elements sorted in ascending order. Compares values evaluated by the expression.\n\n### Parameters\n\n`range.sortAsc(var, <expr>)`\n\n- `range`: repeated type value\n- `var`: current iteration value\n- `<expr>`: expression for value to be compared\n\n### Examples\n\n```cel\n[4, 2, 3, 1].sortAsc(v, v) //=> [1, 2, 3, 4]\n```\n\n## sortDesc\n\nReturns elements sorted in descending order. Compares values evaluated by the expression.\n\n### Parameters\n\n`range.sortDesc(var, <expr>)`\n\n- `range`: repeated type value\n- `var`: current iteration value\n- `<expr>`: expression for value to be compared\n\n### Examples\n\n```cel\n[4, 2, 3, 1].sortDesc(v, v) //=> [4, 3, 2, 1]\n```\n\n## sortStableAsc\n\nReturns elements sorted in ascending order. Compares values evaluated by the expression. The sorting algorithm is guaranteed to be stable.\n\n### Parameters\n\n`range.sortStableAsc(var, <expr>)`\n\n- `range`: repeated type value\n- `var`: current iteration value\n- `<expr>`: expression for value to be compared\n\n### Examples\n\n```cel\n[4, 2, 3, 1].sortStableAsc(v, v) //=> [1, 2, 3, 4]\n```\n\n## sortStableDesc\n\nReturns elements sorted in descending order. Compares values evaluated by the expression. The sorting algorithm is guaranteed to be stable.\n\n### Parameters\n\n`range.sortStableDesc(var, <expr>)`\n\n- `range`: repeated type value\n- `var`: current iteration value\n- `<expr>`: expression for value to be compared\n\n### Examples\n\n```cel\n[4, 2, 3, 1].sortStableDesc(v, v) //=> [4, 3, 2, 1]\n```\n\n# Functions"
  },
  {
    "path": "docs/cel/log.md",
    "content": "# grpc.federation.log APIs\n\nThis is a CEL library for manipulating slog.Logger on the proto side.\n\n# Index\n\n- [`debug`](#debug)\n- [`info`](#info)\n- [`warn`](#warn)\n- [`error`](#error)\n- [`add`](#add)\n\n# Functions\n\n## debug\n\n`debug` logs message at DEBUG level.\n\n### Parameters\n\n`debug(msg, <expr>)`\n\n- `msg`: string value\n- `<expr>` : map value expression to add attributes to logs. this parameter is optional\n\n### Examples\n\n```cel\ngrpc.federation.log.debug('message') //=> {\"time\":\"2006-01-02T15:04:05.999999999Z07:00\",\"level\":\"DEBUG\",\"msg\":\"message\"}\ngrpc.federation.log.debug('message', {'foo': 'bar'}) //=> {\"time\":\"2006-01-02T15:04:05.999999999Z07:00\",\"level\":\"DEBUG\",\"msg\":\"message\",\"foo\":\"bar\"}\n```\n\n## info\n\n`info` logs message at INFO level.\n\n### Parameters\n\n`info(msg, <expr>)`\n\n- `msg`: string value\n- `<expr>` : map value expression to add attributes to logs. this parameter is optional\n\n### Examples\n\n```cel\ngrpc.federation.log.info('message') //=> {\"time\":\"2006-01-02T15:04:05.999999999Z07:00\",\"level\":\"INFO\",\"msg\":\"message\"}\ngrpc.federation.log.info('message', {'foo': 'bar'}) //=> {\"time\":\"2006-01-02T15:04:05.999999999Z07:00\",\"level\":\"INFO\",\"msg\":\"message\",\"foo\":\"bar\"}\n```\n\n## warn\n\n`warn` logs message at WARN level.\n\n### Parameters\n\n`warn(msg, <expr>)`\n\n- `msg`: string value\n- `<expr>` : map value expression to add attributes to logs. this parameter is optional\n\n### Examples\n\n```cel\ngrpc.federation.log.warn('message') //=> {\"time\":\"2006-01-02T15:04:05.999999999Z07:00\",\"level\":\"WARN\",\"msg\":\"message\"}\ngrpc.federation.log.warn('message', {'foo': 'bar'}) //=> {\"time\":\"2006-01-02T15:04:05.999999999Z07:00\",\"level\":\"WARN\",\"msg\":\"message\",\"foo\":\"bar\"}\n```\n\n## error\n\n`error` logs message at ERROR level.\n\n### Parameters\n\n`error(msg, <expr>)`\n\n- `msg`: string value\n- `<expr>` : map value expression to add attributes to logs. this parameter is optional\n\n### Examples\n\n```cel\ngrpc.federation.log.error('message') //=> {\"time\":\"2006-01-02T15:04:05.999999999Z07:00\",\"level\":\"ERROR\",\"msg\":\"message\"}\ngrpc.federation.log.error('message', {'foo': 'bar'}) //=> {\"time\":\"2006-01-02T15:04:05.999999999Z07:00\",\"level\":\"ERROR\",\"msg\":\"message\",\"foo\":\"bar\"}\n```\n\n## add\n\n`add` adds attributes to logs.\n\n### Parameters\n\n`add(<expr>)`\n\n- `<expr>` : map value expression to add attributes to logs\n\n### Examples\n\n```cel\ngrpc.federation.log.add({'foo': 'bar'})\ngrpc.federation.log.info('message') //=> {\"time\":\"2006-01-02T15:04:05.999999999Z07:00\",\"level\":\"INFO\",\"msg\":\"message\",\"foo\":\"bar\"}\n```\n"
  },
  {
    "path": "docs/cel/math.md",
    "content": "# grpc.federation.math APIs\n\nThe API for this package was created based on Go's [`math`](https://pkg.go.dev/math) package.\n\n# Index\n\n- [`sqrt`](#sqrt)\n- [`pow`](#pow)\n- [`floor`](#floor)\n- [`round`](#round)\n\n# Functions\n\n## sqrt\n\n`sqrt` returns the square root of x.\n\nFYI: https://pkg.go.dev/math#Sqrt\n\n### Parameters\n\n`sqrt(x double) double`\n`sqrt(x int) double`\n\n- `x`: a number\n\n### Examples\n\n```cel\ngrpc.federation.math.sqrt(25.0)  // returns 5.0\ngrpc.federation.math.sqrt(25)    // returns 5.0\ngrpc.federation.math.sqrt(3.0*3.0 + 4.0*4.0)  // returns 5.0 (Pythagorean theorem)\n```\n\n## pow\n\n`pow` returns x**y, the base-x exponential of y.\n\nFYI: https://pkg.go.dev/math#Pow\n\n### Parameters\n\n`pow(x double, y double) double`\n\n- `x`: the base\n- `y`: the exponent\n\n### Examples\n\n```cel\ngrpc.federation.math.pow(2.0, 3.0)   // returns 8.0 (2^3)\ngrpc.federation.math.pow(10.0, 2.0)  // returns 100.0 (10^2)\n```\n\n## floor\n\n`floor` returns the greatest integer value less than or equal to x.\n\nFYI: https://pkg.go.dev/math#Floor\n\n### Parameters\n\n`floor(x double) double`\n\n- `x`: a number\n\n### Examples\n\n```cel\ngrpc.federation.math.floor(1.51)   // returns 1.0\ngrpc.federation.math.floor(-1.51)  // returns -2.0\ngrpc.federation.math.floor(3.0)    // returns 3.0\n```\n\n## round\n\n`round` returns the nearest integer, rounding half away from zero.\n\nFYI: https://pkg.go.dev/math#Round\n\n### Parameters\n\n`round(x double) double`\n\n- `x`: a number\n\n### Examples\n\n```cel\ngrpc.federation.math.round(1.51)   // returns 2.0\ngrpc.federation.math.round(1.49)   // returns 1.0\ngrpc.federation.math.round(-1.51)  // returns -2.0\ngrpc.federation.math.round(1.5)    // returns 2.0\n``` \n"
  },
  {
    "path": "docs/cel/metadata.md",
    "content": "# grpc.federation.metadata APIs\n\nThe API for this package was created based on Go's [`google.golang.org/grpc/metadata`](https://pkg.go.dev/google.golang.org/grpc/metadata) package.\n\n# Index\n\n- [`new`](#new)\n- [`incoming`](#incoming)\n\n# Functions\n\n## new\n\n`new` creates a new metadata instance.\nThe created type is `map(string, list(string))`.\n\n### Parameters\n\n`new() map(string, list(string))`\n\n### Examples\n\n```cel\ngrpc.federation.metadata.new()\n```\n\n## incoming\n\n`incoming` returns the incoming metadata if it exists.\n\nFYI: https://pkg.go.dev/google.golang.org/grpc/metadata#FromIncomingContext\n\n### Parameters\n\n`incoming() map(string, list(string))`\n\n### Examples\n\n```cel\ngrpc.federation.metadata.incoming()\n```\n"
  },
  {
    "path": "docs/cel/rand.md",
    "content": "# grpc.federation.rand APIs\n\nThe API for this package was created based on Go's [`math/rand`](https://pkg.go.dev/math/rand) package.\n\n# Index\n\n## Source\n\n- [`newSource`](#newsource)\n- [`Source.int63`](#sourceint63)\n- [`Source.seed`](#sourceseed)\n\n## Rand\n\n- [`new`](#new)\n- [`Rand.expFloat64`](#randexpfloat64)\n- [`Rand.float32`](#randfloat32)\n- [`Rand.float64`](#randfloat64)\n- [`Rand.int`](#randint)\n- [`Rand.int31`](#randint31)\n- [`Rand.int31n`](#randint31n)\n- [`Rand.int63`](#randint63)\n- [`Rand.int63n`](#randint63n)\n- [`Rand.intn`](#randintn)\n- [`Rand.normFloat64`](#randnormfloat64)\n- [`Rand.seed`](#randseed)\n- [`Rand.uint32`](#randuint32)\n\n# Types\n\n## Source\n\nA `Source` represents a source of uniformly-distributed pseudo-random int64 values in the range [0, 1<<63).  \n\nFYI: https://pkg.go.dev/math/rand#Source\n\n## Rand\n\nA `Rand` is a source of random numbers.  \n\nFYI: https://pkg.go.dev/math/rand#Rand\n\n# Functions\n\n## newSource\n\n`newSource` returns a new pseudo-random `Source` seeded with the given value.  \n\nFYI: https://pkg.go.dev/math/rand#NewSource\n\n### Parameters\n\n`newSource(seed int) Source`\n\n- `seed`: seed value\n\n### Examples\n\n```cel\ngrpc.federation.rand.newSource(10)\n```\n\n## Source.int63\n\n`int63` returns a non-negative pseudo-random 63-bit integer as an int64.\n\n### Parameters\n\n`Source.int63() int`\n\n### Examples\n\n```cel\ngrpc.federation.rand.newSource(10).int63()\n```\n\n## Source.seed\n\n`seed` uses the provided seed value to initialize the generator to a deterministic state.\n\n### Parameters\n\n`Source.seed(seed int) bool`\n\n- `seed`: the seed value\n\nReturn value is always `true`.\n\n### Examples\n\n```cel\ngrpc.federation.rand.newSource(10).seed(20)\n```\n\n## new\n\n`new` returns a new `Rand` that uses random values from `src` to generate other random values.\n\nFYI: https://pkg.go.dev/math/rand#New\n\n### Parameters\n\n`new(src Source) Rand`\n\n- `src`: source value for generates random values\n\n### Examples\n\n```cel\ngrpc.federation.rand.new()\n```\n\n## Rand.expFloat64\n\n`expFloat64` returns an exponentially distributed double type value in the range (0, `max float64 value`) with an exponential distribution whose rate parameter (lambda) is 1 and whose mean is 1/lambda (1). To produce a distribution with a different rate parameter, callers can adjust the output using:\n\n```cel\nsample = grpc.federation.rand.new().expFloat64() / desiredRateParameter\n```\n\nFYI: https://pkg.go.dev/math/rand#Rand.ExpFloat64\n\n### Parameters\n\n`Rand.expFloat64() double`\n\n### Examples\n\n```cel\ngrpc.federation.rand.new().expFloat64()\n```\n\n## Rand.float32\n\n`float32` returns a value as float type, a pseudo-random number in the half-open interval (0.0,1.0).\n\nFYI: https://pkg.go.dev/math/rand#Rand.Float32\n\n### Parameters\n\n`Rand.float32() float`\n\n### Examples\n\n```cel\ngrpc.federation.rand.new().float32()\n```\n\n## Rand.float64\n\n`float64` returns a value as double type, a pseudo-random number in the half-open interval (0.0,1.0).\n\nFYI: https://pkg.go.dev/math/rand#Rand.Float64\n\n### Parameters\n\n`Rand.float64() double`\n\n### Examples\n\n```cel\ngrpc.federation.rand.new().float64()\n```\n\n## Rand.int\n\n`int` returns a non-negative pseudo-random int.\n\nFYI: https://pkg.go.dev/math/rand#Rand.Int\n\n### Parameters\n\n`Rand.int() int`\n\n### Examples\n\n```cel\ngrpc.federation.rand.new().int()\n```\n\n## Rand.int31\n\n`int31` returns a non-negative pseudo-random 31-bit integer as an int value.\n\nFYI: https://pkg.go.dev/math/rand#Rand.Int31\n\n### Parameters\n\n`Rand.int31() int`\n\n### Examples\n\n```cel\ngrpc.federation.rand.new().int31()\n```\n\n## Rand.int31n\n\n`int31n` returns as an int type, a non-negative pseudo-random number in the half-open interval (0,n). It returns error if n <= 0.\n\nFYI: https://pkg.go.dev/math/rand#Rand.Int31n\n\n### Parameters\n\n`Rand.int31n(n int) int`\n\n- `n`: non-negative value\n\n### Examples\n\n```cel\ngrpc.federation.rand.new().int31n(10)\n```\n\n## Rand.int63\n\n`int63` returns a non-negative pseudo-random 63-bit integer as an int64.\n\nFYI: https://pkg.go.dev/math/rand#Rand.Int63\n\n### Parameters\n\n`Rand.int63() int`\n\n### Examples\n\n```cel\ngrpc.federation.rand.new().int63()\n```\n\n## Rand.int63n\n\n`int63n` returns as an int64 bit value, a non-negative pseudo-random number in the half-open interval [0,n). It panics if n <= 0.\n\nFYI: https://pkg.go.dev/math/rand#Rand.Int63n\n\n### Parameters\n\n`Rand.int63n(n int) int`\n\n### Examples\n\n```cel\ngrpc.federation.rand.new().int63n(10)\n```\n\n## Rand.intn\n\n`intn` returns, as an int, a non-negative pseudo-random number in the half-open interval [0,n). It panics if n <= 0.\n\nFYI: https://pkg.go.dev/math/rand#Rand.Intn\n\n### Parameters\n\n`Rand.intn(n int) int`\n\n### Examples\n\n```cel\ngrpc.federation.rand.new().intn(10)\n```\n\n## Rand.normFloat64\n\n`normFloat64` returns a normally distributed double value in the range `-<max double value>` through `<max double value>` inclusive, with standard normal distribution (mean = 0, stddev = 1). To produce a different normal distribution, callers can adjust the output using:\n\n```cel\nsample = grpc.federation.rand.new().normFloat64() * desiredStdDev + desiredMean\n```\n\nFYI: https://pkg.go.dev/math/rand#Rand.NormFloat64\n\n### Parameters\n\n`Rand.normFloat64() double`\n\n### Examples\n\n```cel\ngrpc.federation.rand.new().normFloat64()\n```\n\n## Rand.seed\n\n`seed` uses the provided seed value to initialize the generator to a deterministic state.\n\nFYI: https://pkg.go.dev/math/rand#Rand.Seed\n\n### Parameters\n\n`Rand.seed(seed int) bool`\n\n- `seed`: the seed value\n\n### Examples\n\n```cel\ngrpc.federation.rand.new().seed(10)\n```\n\n## Rand.uint32\n\n`uint32` returns a pseudo-random 32-bit value as a uint32.\n\nFYI: https://pkg.go.dev/math/rand#Rand.Uint32\n\n### Parameters\n\n`Rand.uint32() uint`\n\n### Examples\n\n```cel\ngrpc.federation.rand.new().uint32()\n```"
  },
  {
    "path": "docs/cel/regexp.md",
    "content": "# grpc.federation.regexp APIs\n\nThe API for this package was created based on Go's [`regexp`](https://pkg.go.dev/regexp) package.\n\n# Index\n\n## Regexp\n\n- [`compile`](#compile)\n- [`mustCompile`](#mustCompile)\n- [`quoteMeta`](#quoteMeta)\n- [`Regexp.findStringSubmatch`](#regexpfindStringSubmatch)\n- [`Regexp.matchString`](#regexpmatchString)\n- [`Regexp.replaceAllString`](#regexpreplaceAllString)\n- [`Regexp.string`](#regexpstring)\n\n# Types\n\n## Regexp\n\nA `Regexp` is a compiled regular expression.\n\nFYI: https://pkg.go.dev/regexp#Regexp\n\n# Functions\n\n## compile\n\n`compile` parses a regular expression and returns, if successful, a Regexp object that can be used to match against text.\n\nFYI: https://pkg.go.dev/regexp#Compile\n\n### Parameters\n\n`compile(expr string) Regexp`\n\n- `expr`: the regular expression pattern to compile.\n\n### Examples\n\n```cel\ngrpc.federation.regexp.compile(\"^[a-z]+$\")\n```\n\n## mustCompile\n\n`mustCompile` is like `compile` but panics if the expression cannot be parsed. It simplifies safe initialization of global variables holding compiled regular expressions.\n\nFYI: https://pkg.go.dev/regexp#MustCompile\n\n### Parameters\n\n`mustCompile(expr string) Regexp`\n\n- `expr`: the regular expression pattern to compile.\n\n### Examples\n\n```cel\ngrpc.federation.regexp.mustCompile(\"^[a-z]+$\")\n```\n\n## quoteMeta\n\n`quoteMeta` returns a string that escapes all regular expression metacharacters inside the argument text.\n\nFYI: https://pkg.go.dev/regexp#QuoteMeta\n\n### Parameters\n\n`quoteMeta(s string) string`\n\n- `s`: the string to escape.\n\n### Examples\n\n```cel\ngrpc.federation.regexp.quoteMeta(\"foo.bar\") //=> \"foo\\\\.bar\"\n```\n\n# Regexp Methods\n\n## Regexp.findStringSubmatch\n\n`findStringSubmatch` returns a slice of strings holding the text of the leftmost match of the regular expression in s and the matches, if any, of its subexpressions.\n\nFYI: https://pkg.go.dev/regexp#Regexp.FindStringSubmatch\n\n### Parameters\n\n`Regexp.findStringSubmatch(s string) []string`\n\n- `s`: the string to search.\n\n### Examples\n\n```cel\nre := grpc.federation.regexp.mustCompile(\"a(x*)b\")\nre.findStringSubmatch(\"-ab-\") //=> [\"ab\", \"\"]\nre.findStringSubmatch(\"-axxb-\") //=> [\"axxb\", \"xx\"]\nre.findStringSubmatch(\"-ab-\") //=> null\n```\n\n## Regexp.matchString\n\n`matchString` reports whether the string s contains any match of the regular expression.\n\nFYI: https://pkg.go.dev/regexp#Regexp.MatchString\n\n### Parameters\n\n`Regexp.matchString(s string) bool`\n\n- `s`: the string to check.\n\n### Examples\n\n```cel\nre := grpc.federation.regexp.mustCompile(\"^[a-z]+$\")\nre.matchString(\"hello\") //=> true\nre.matchString(\"Hello\") //=> false\n```\n\n## Regexp.replaceAllString\n\n`replaceAllString` replaces matches of the regexp with a replacement string.\n\nFYI: https://pkg.go.dev/regexp#Regexp.ReplaceAllString\n\n### Parameters\n\n`Regexp.replaceAllString(src string, repl string) string`\n\n- `src`: the source string to search and replace.\n- `repl`: the replacement string.\n\n### Examples\n\n```cel\nre := grpc.federation.regexp.mustCompile(\"a(x*)b\")\nre.replaceAllString(\"-ab-axxb-\", \"T\") //=> \"-T-T-\"\nre.replaceAllString(\"-ab-axxb-\", \"$1\") //=> \"--xx-\"\nre.replaceAllString(\"-ab-axxb-\", \"$1W\") //=> \"--WxxW-\"\n```\n\n## Regexp.string\n\n`string` returns the source text used to compile the regular expression.\n\nFYI: https://pkg.go.dev/regexp#Regexp.String\n\n### Parameters\n\n`Regexp.string() string`\n\n### Examples\n\n```cel\nre := grpc.federation.regexp.mustCompile(\"^[a-z]+$\")\nre.string() //=> \"^[a-z]+$\"\n```\n"
  },
  {
    "path": "docs/cel/strings.md",
    "content": "# grpc.federation.strings APIs\n\nThe API for this package was created based on Go's [`strings`](https://pkg.go.dev/strings) and [`strconv`](https://pkg.go.dev/strconv) packages.\nIt also supports the following string APIs supported by [google/cel-go/ext](https://pkg.go.dev/github.com/google/cel-go/ext#Strings).\n\n- [charAt](https://pkg.go.dev/github.com/google/cel-go/ext#hdr-CharAt-Strings)\n- [format](https://pkg.go.dev/github.com/google/cel-go/ext#hdr-Format-Strings)\n- [indexOf](https://pkg.go.dev/github.com/google/cel-go/ext#hdr-IndexOf-Strings)\n- [join](https://pkg.go.dev/github.com/google/cel-go/ext#hdr-Join-Strings)\n- [lastIndexOf](https://pkg.go.dev/github.com/google/cel-go/ext#hdr-LastIndexOf-Strings)\n- [lowerAscii](https://pkg.go.dev/github.com/google/cel-go/ext#hdr-LowerAscii-Strings)\n- [quote](https://pkg.go.dev/github.com/google/cel-go/ext#hdr-Strings_Quote-Strings)\n- [replace](https://pkg.go.dev/github.com/google/cel-go/ext#hdr-Replace-Strings)\n- [split](https://pkg.go.dev/github.com/google/cel-go/ext#hdr-Split-Strings)\n- [substring](https://pkg.go.dev/github.com/google/cel-go/ext#hdr-Substring-Strings)\n- [trim](https://pkg.go.dev/github.com/google/cel-go/ext#hdr-Trim-Strings)\n- [upperAscii](https://pkg.go.dev/github.com/google/cel-go/ext#hdr-UpperAscii-Strings)\n- [reverse](https://pkg.go.dev/github.com/google/cel-go/ext#hdr-Reverse-Strings)\n\n# Index\n\n## Strings Functions\n\n- [`clone`](#clone)\n- [`compare`](#compare)\n- [`contains`](#contains)\n- [`containsAny`](#containsAny)\n- [`containsRune`](#containsRune)\n- [`count`](#count)\n- [`cut`](#cut)\n- [`cutPrefix`](#cutPrefix)\n- [`cutSuffix`](#cutSuffix)\n- [`equalFold`](#equalFold)\n- [`fields`](#fields)\n- [`hasPrefix`](#hasPrefix)\n- [`hasSuffix`](#hasSuffix)\n- [`index`](#index)\n- [`indexAny`](#indexAny)\n- [`indexByte`](#indexByte)\n- [`indexRune`](#indexRune)\n- [`join`](#join)\n- [`lastIndex`](#lastIndex)\n- [`lastIndexAny`](#lastIndexAny)\n- [`lastIndexByte`](#lastIndexByte)\n- [`repeat`](#repeat)\n- [`replace`](#replace)\n- [`replaceAll`](#replaceAll)\n- [`split`](#split)\n- [`splitAfter`](#splitAfter)\n- [`splitAfterN`](#splitAfterN)\n- [`splitN`](#splitN)\n- [`title`](#title)\n- [`toLower`](#toLower)\n- [`toTitle`](#toTitle)\n- [`toUpper`](#toUpper)\n- [`toValidUTF8`](#toValidUTF8)\n- [`trim`](#trim)\n- [`trimLeft`](#trimLeft)\n- [`trimPrefix`](#trimPrefix)\n- [`trimRight`](#trimRight)\n- [`trimSpace`](#trimSpace)\n- [`trimSuffix`](#trimSuffix)\n\n## Strconv Functions\n\n- [`appendBool`](#appendBool)\n- [`appendFloat`](#appendFloat)\n- [`appendInt`](#appendInt)\n- [`appendQuote`](#appendQuote)\n- [`appendQuoteRune`](#appendQuoteRune)\n- [`appendQuoteRuneToASCII`](#appendQuoteRuneToASCII)\n- [`appendQuoteRuneToGraphic`](#appendQuoteRuneToGraphic)\n- [`appendQuoteToASCII`](#appendQuoteToASCII)\n- [`appendUint`](#appendUint)\n- [`atoi`](#atoi)\n- [`canBackquote`](#canBackquote)\n- [`formatBool`](#formatBool)\n- [`formatComplex`](#formatComplex)\n- [`formatFloat`](#formatFloat)\n- [`formatInt`](#formatInt)\n- [`formatUint`](#formatUint)\n- [`isGraphic`](#isGraphic)\n- [`isPrint`](#isPrint)\n- [`itoa`](#itoa)\n- [`parseBool`](#parseBool)\n- [`parseComplex`](#parseComplex)\n- [`parseFloat`](#parseFloat)\n- [`parseInt`](#parseInt)\n- [`parseUint`](#parseUint)\n- [`quote`](#quote)\n- [`quoteRune`](#quoteRune)\n- [`quoteRuneToGraphic`](#quoteRuneToGraphic)\n- [`quoteToASCII`](#quoteToASCII)\n- [`quoteToGraphic`](#quoteToGraphic)\n- [`quotedPrefix`](#quotedPrefix)\n- [`unquote`](#unquote)\n- [`unquoteChar`](#unquoteChar)\n\n# Strings Functions\n\n## clone\n\n`clone` returns a copy of the input string.\n\n### Parameters\n\n`clone(s string) string`\n\n- `s`: the input string to be cloned.\n\n### Examples\n\n```cel\ngrpc.federation.strings.clone(\"hello\") //=> \"hello\"\n```\n\n## compare\n\n`compare` compares two strings lexicographically. It returns an integer comparing `a` and `b` lexicographically.\n\n### Parameters\n\n`compare(a string, b string) int`\n\n- `a`: first string.\n- `b`: second string.\n\n### Examples\n\n```cel\ngrpc.federation.strings.compare(\"a\", \"b\") //=> -1\ngrpc.federation.strings.compare(\"a\", \"a\") //=> 0\ngrpc.federation.strings.compare(\"b\", \"a\") //=> 1\n```\n\n## contains\n\n`contains` reports whether `substr` is within `s`.\n\n### Parameters\n\n`contains(s string, substr string) bool`\n\n- `s`: the string to search within.\n- `substr`: the substring to search for.\n\n### Examples\n\n```cel\ngrpc.federation.strings.contains(\"hello\", \"ll\") //=> true\ngrpc.federation.strings.contains(\"hello\", \"world\") //=> false\n```\n\n## containsAny\n\n`containsAny` reports whether any of the Unicode code points in `chars` are within `s`.\n\n### Parameters\n\n`containsAny(s string, chars string) bool`\n\n- `s`: the string to search within.\n- `chars`: the set of characters to search for.\n\n### Examples\n\n```cel\ngrpc.federation.strings.containsAny(\"hello\", \"xyz\") //=> false\ngrpc.federation.strings.containsAny(\"hello\", \"e\") //=> true\n```\n\n## containsRune\n\n`containsRune` reports whether the Unicode code point `r` is within `s`.\n\n### Parameters\n\n`containsRune(s string, r int) bool`\n\n- `s`: the string to search within.\n- `r`: the rune (Unicode code point) to search for.\n\n### Examples\n\n```cel\ngrpc.federation.strings.containsRune(\"hello\", 101) //=> true ('e')\ngrpc.federation.strings.containsRune(\"hello\", 120) //=> false ('x')\n```\n\n## count\n\n`count` returns the number of non-overlapping instances of `substr` in `s`.\n\n### Parameters\n\n`count(s string, substr string) int`\n\n- `s`: the string to search within.\n- `substr`: the substring to search for.\n\n### Examples\n\n```cel\ngrpc.federation.strings.count(\"cheese\", \"e\") //=> 3\ngrpc.federation.strings.count(\"five\", \"ve\") //=> 1\n```\n\n## cut\n\n`cut` slices the input string `s` into two substrings, `before` and `after`, separated by the first occurrence of the separator `sep`. If `sep` is not found, `before` will be set to `s` and `after` will be empty.\n\n### Parameters\n\n`cut(s string, sep string) []string`\n\n- `s`: the string to cut.\n- `sep`: the separator string.\n\n### Returns\n\nA list of two strings:\n- The part of `s` before the first occurrence of `sep`.\n- The part of `s` after the first occurrence of `sep`.\n\n### Examples\n\n```cel\ngrpc.federation.strings.cut(\"gophers\", \"ph\") //=> [\"go\", \"ers\"]\ngrpc.federation.strings.cut(\"gophers\", \"x\") //=> [\"gophers\", \"\"]\n```\n\n## cutPrefix\n\n`cutPrefix` returns the string `s` after removing the provided `prefix`. If the string doesn't start with `prefix`, `s` is returned unchanged.\n\n### Parameters\n\n`cutPrefix(s string, prefix string) string`\n\n- `s`: the string to cut the prefix from.\n- `prefix`: the prefix to cut.\n\n### Examples\n\n```cel\ngrpc.federation.strings.cutPrefix(\"hello\", \"he\") //=> \"llo\"\ngrpc.federation.strings.cutPrefix(\"hello\", \"wo\") //=> \"hello\"\n```\n\n## cutSuffix\n\n`cutSuffix` returns the string `s` after removing the provided `suffix`. If the string doesn't end with `suffix`, `s` is returned unchanged.\n\n### Parameters\n\n`cutSuffix(s string, suffix string) string`\n\n- `s`: the string to cut the suffix from.\n- `suffix`: the suffix to cut.\n\n### Examples\n\n```cel\ngrpc.federation.strings.cutSuffix(\"hello\", \"lo\") //=> \"hel\"\ngrpc.federation.strings.cutSuffix(\"hello\", \"wo\") //=> \"hello\"\n```\n\n## equalFold\n\n`equalFold` reports whether `s` and `t` are equal under Unicode case-folding.\n\n### Parameters\n\n`equalFold(s string, t string) bool`\n\n- `s`: first string.\n- `t`: second string.\n\n### Examples\n\n```cel\ngrpc.federation.strings.equalFold(\"Go\", \"go\") //=> true\ngrpc.federation.strings.equalFold(\"Go\", \"Java\") //=> false\n```\n\n## fields\n\n`fields` splits the string `s` around each instance of one or more consecutive white space characters, returning a slice of substrings.\n\n### Parameters\n\n`fields(s string) []string`\n\n- `s`: the string to split into fields.\n\n### Examples\n\n```cel\ngrpc.federation.strings.fields(\"hello world\") //=> [\"hello\", \"world\"]\ngrpc.federation.strings.fields(\"  leading spaces\") //=> [\"leading\", \"spaces\"]\n```\n\n## hasPrefix\n\n`hasPrefix` tests whether the string `s` begins with `prefix`.\n\n### Parameters\n\n`hasPrefix(s string, prefix string) bool`\n\n- `s`: the string to check.\n- `prefix`: the prefix to check for.\n\n### Examples\n\n```cel\ngrpc.federation.strings.hasPrefix(\"hello\", \"he\") //=> true\ngrpc.federation.strings.hasPrefix(\"hello\", \"wo\") //=> false\n```\n\n## hasSuffix\n\n`hasSuffix` tests whether the string `s` ends with `suffix`.\n\n### Parameters\n\n`hasSuffix(s string, suffix string) bool`\n\n- `s`: the string to check.\n- `suffix`: the suffix to check for.\n\n### Examples\n\n```cel\ngrpc.federation.strings.hasSuffix(\"hello\", \"lo\") //=> true\ngrpc.federation.strings.hasSuffix(\"hello\", \"he\") //=> false\n```\n\n## index\n\n`index` returns the index of the first instance of `substr` in `s`, or `-1` if `substr` is not present in `s`.\n\n### Parameters\n\n`index(s string, substr string) int`\n\n- `s`: the string to search within.\n- `substr`: the substring to search for.\n\n### Examples\n\n```cel\ngrpc.federation.strings.index(\"hello\", \"ll\") //=> 2\ngrpc.federation.strings.index(\"hello\", \"xx\") //=> -1\n```\n\n## indexAny\n\n`indexAny` returns the index of the first instance of any Unicode code point from `chars` in `s`, or `-1` if no Unicode code point from `chars` is present in `s`.\n\n### Parameters\n\n`indexAny(s string, chars string) int`\n\n- `s`: the string to search within.\n- `chars`: the string containing characters to search for.\n\n### Examples\n\n```cel\ngrpc.federation.strings.indexAny(\"hello\", \"aeiou\") //=> 1\ngrpc.federation.strings.indexAny(\"hello\", \"xyz\") //=> -1\n```\n\n## indexByte\n\n`indexByte` returns the index of the first instance of `byte` in `s`, or `-1` if `byte` is not present.\n\n### Parameters\n\n`indexByte(s string, b byte) int`\n\n- `s`: the string to search within.\n- `b`: the byte to search for.\n\n### Examples\n\n```cel\ngrpc.federation.strings.indexByte(\"hello\", 'e') //=> 1\ngrpc.federation.strings.indexByte(\"hello\", 'x') //=> -1\n```\n\n## indexRune\n\n`indexRune` returns the index of the first instance of the rune `r` in `s`, or `-1` if `r` is not present.\n\n### Parameters\n\n`indexRune(s string, r int) int`\n\n- `s`: the string to search within.\n- `r`: the rune (Unicode code point) to search for.\n\n### Examples\n\n```cel\ngrpc.federation.strings.indexRune(\"hello\", 101) //=> 1 ('e')\ngrpc.federation.strings.indexRune(\"hello\", 120) //=> -1 ('x')\n```\n\n## join\n\n`join` concatenates the elements of the list `elems` to create a single string. The separator string `sep` is placed between elements in the resulting string.\n\n### Parameters\n\n`join(elems []string, sep string) string`\n\n- `elems`: the list of strings to join.\n- `sep`: the separator string.\n\n### Examples\n\n```cel\ngrpc.federation.strings.join([\"foo\", \"bar\", \"baz\"], \", \") //=> \"foo, bar, baz\"\n```\n\n## lastIndex\n\n`lastIndex` returns the index of the last instance of `substr` in `s`, or `-1` if `substr` is not present.\n\n### Parameters\n\n`lastIndex(s string, substr string) int`\n\n- `s`: the string to search within.\n- `substr`: the substring to search for.\n\n### Examples\n\n```cel\ngrpc.federation.strings.lastIndex(\"go gophers\", \"go\") //=> 3\ngrpc.federation.strings.lastIndex(\"hello\", \"world\") //=> -1\n```\n\n## lastIndexAny\n\n`lastIndexAny` returns the index of the last instance of any Unicode code point from `chars` in `s`, or `-1` if no Unicode code point from `chars` is present in `s`.\n\n### Parameters\n\n`lastIndexAny(s string, chars string) int`\n\n- `s`: the string to search within.\n- `chars`: the string containing characters to search for.\n\n### Examples\n\n```cel\ngrpc.federation.strings.lastIndexAny(\"hello\", \"aeiou\") //=> 4\ngrpc.federation.strings.lastIndexAny(\"hello\", \"xyz\") //=> -1\n```\n\n## lastIndexByte\n\n`lastIndexByte` returns the index of the last instance of `byte` in `s`, or `-1` if `byte` is not present.\n\n### Parameters\n\n`lastIndexByte(s string, b byte) int`\n\n- `s`: the string to search within.\n- `b`: the byte to search for.\n\n### Examples\n\n```cel\ngrpc.federation.strings.lastIndexByte(\"hello\", 'e') //=> 1\ngrpc.federation.strings.lastIndexByte(\"hello\", 'x') //=> -1\n```\n\n## repeat\n\n`repeat` returns a new string consisting of `count` copies of the string `s`.\n\n### Parameters\n\n`repeat(s string, count int) string`\n\n- `s`: the string to repeat.\n- `count`: the number of times to repeat the string.\n\n### Examples\n\n```cel\ngrpc.federation.strings.repeat(\"ha\", 3) //=> \"hahaha\"\ngrpc.federation.strings.repeat(\"ha\", 0) //=> \"\"\n```\n\n## replace\n\n`replace` returns a copy of the string `s` with the first `n` non-overlapping instances of `old` replaced by `new`. If `n` is negative, all instances are replaced.\n\n### Parameters\n\n`replace(s string, old string, new string, n int) string`\n\n- `s`: the string to modify.\n- `old`: the substring to replace.\n- `new`: the replacement substring.\n- `n`: the number of instances to replace (or -1 for all).\n\n### Examples\n\n```cel\ngrpc.federation.strings.replace(\"foo bar foo\", \"foo\", \"baz\", 1) //=> \"baz bar foo\"\ngrpc.federation.strings.replace(\"foo bar foo\", \"foo\", \"baz\", -1) //=> \"baz bar baz\"\n```\n\n## replaceAll\n\n`replaceAll` returns a copy of the string `s` with all non-overlapping instances of `old` replaced by `new`.\n\n### Parameters\n\n`replaceAll(s string, old string, new string) string`\n\n- `s`: the string to modify.\n- `old`: the substring to replace.\n- `new`: the replacement substring.\n\n### Examples\n\n```cel\ngrpc.federation.strings.replaceAll(\"foo bar foo\", \"foo\", \"baz\") //=> \"baz bar baz\"\n```\n\n## split\n\n`split` slices `s` into all substrings separated by `sep` and returns a slice of the substrings.\n\n### Parameters\n\n`split(s string, sep string) []string`\n\n- `s`: the string to split.\n- `sep`: the separator string.\n\n### Examples\n\n```cel\ngrpc.federation.strings.split(\"a,b,c\", \",\") //=> [\"a\", \"b\", \"c\"]\ngrpc.federation.strings.split(\"a b c\", \" \") //=> [\"a\", \"b\", \"c\"]\n```\n\n## splitAfter\n\n`splitAfter` slices `s` into all substrings after each instance of `sep` and returns a slice of the substrings.\n\n### Parameters\n\n`splitAfter(s string, sep string) []string`\n\n- `s`: the string to split.\n- `sep`: the separator string.\n\n### Examples\n\n```cel\ngrpc.federation.strings.splitAfter(\"a,b,c\", \",\") //=> [\"a,\", \"b,\", \"c\"]\n```\n\n## splitAfterN\n\n`splitAfterN` slices `s` into `n` substrings after each instance of `sep` and returns a slice of the substrings.\n\n### Parameters\n\n`splitAfterN(s string, sep string, n int) []string`\n\n- `s`: the string to split.\n- `sep`: the separator string.\n- `n`: the maximum number of substrings to return.\n\n### Examples\n\n```cel\ngrpc.federation.strings.splitAfterN(\"a,b,c\", \",\", 2) //=> [\"a,\", \"b,c\"]\n```\n\n## splitN\n\n`splitN` slices `s` into `n` substrings separated by `sep` and returns a slice of the substrings.\n\n### Parameters\n\n`splitN(s string, sep string, n int) []string`\n\n- `s`: the string to split.\n- `sep`: the separator string.\n- `n`: the maximum number of substrings to return.\n\n### Examples\n\n```cel\ngrpc.federation.strings.splitN(\"a,b,c\", \",\", 2) //=> [\"a\", \"b,c\"]\n```\n\n## title\n\n`title` returns a copy of the string `s` with all Unicode letters that begin words mapped to their title case.\n\n### Parameters\n\n`title(s string) string`\n\n- `s`: the string to convert to title case.\n\n### Examples\n\n```cel\ngrpc.federation.strings.title(\"hello world\") //=> \"Hello World\"\n```\n\n## toLower\n\n`toLower` returns a copy of the string `s` with all Unicode letters mapped to their lower case.\n\n### Parameters\n\n`toLower(s string) string`\n\n- `s`: the string to convert to lower case.\n\n### Examples\n\n```cel\ngrpc.federation.strings.toLower(\"HELLO\") //=> \"hello\"\n```\n\n## toTitle\n\n`toTitle` returns a copy of the string `s` with all Unicode letters mapped to their title case.\n\n### Parameters\n\n`toTitle(s string) string`\n\n- `s`: the string to convert to title case.\n\n### Examples\n\n```cel\ngrpc.federation.strings.toTitle(\"hello\") //=> \"Hello\"\n```\n\n## toUpper\n\n`toUpper` returns a copy of the string `s` with all Unicode letters mapped to their upper case.\n\n### Parameters\n\n`toUpper(s string) string`\n\n- `s`: the string to convert to upper case.\n\n### Examples\n\n```cel\ngrpc.federation.strings.toUpper(\"hello\") //=> \"HELLO\"\n```\n\n## toValidUTF8\n\n`toValidUTF8` returns a copy of the string `s` with each run of invalid UTF-8 byte sequences replaced by the replacement string, which may be empty.\n\n### Parameters\n\n`toValidUTF8(s string, replacement string) string`\n\n- `s`: the string to check.\n- `replacement`: the string to replace invalid sequences with.\n\n### Examples\n\n```cel\ngrpc.federation.strings.toValidUTF8(\"hello\\x80world\", \"?\") //=> \"hello?world\"\n```\n\n## trim\n\n`trim` returns a slice of the string `s` with all leading and trailing Unicode code points contained in `cutset` removed.\n\n### Parameters\n\n`trim(s string, cutset string) string`\n\n- `s`: the string to trim.\n- `cutset`: the characters to remove from the string.\n\n### Examples\n\n```cel\ngrpc.federation.strings.trim(\"!!!hello!!!\", \"!\") //=> \"hello\"\n```\n\n## trimLeft\n\n`trimLeft` returns a slice of the string `s` with all leading Unicode code points contained in `cutset` removed.\n\n### Parameters\n\n`trimLeft(s string, cutset string) string`\n\n- `s`: the string to trim.\n- `cutset`: the characters to remove from the start of the string.\n\n### Examples\n\n```cel\ngrpc.federation.strings.trimLeft(\"!!!hello!!!\", \"!\") //=> \"hello!!!\"\n```\n\n## trimPrefix\n\n`trimPrefix` returns a slice of the string `s` without the provided leading `prefix`. If `s` doesn't start with `prefix`, it returns `s` unchanged.\n\n### Parameters\n\n`trimPrefix(s string, prefix string) string`\n\n- `s`: the string to trim.\n- `prefix`: the prefix to remove.\n\n### Examples\n\n```cel\ngrpc.federation.strings.trimPrefix(\"hello world\", \"hello\") //=> \" world\"\ngrpc.federation.strings.trimPrefix(\"hello world\", \"world\") //=> \"hello world\"\n```\n\n## trimRight\n\n`trimRight` returns a slice of the string `s` with all trailing Unicode code points contained in `cutset` removed.\n\n### Parameters\n\n`trimRight(s string, cutset string) string`\n\n- `s`: the string to trim.\n- `cutset`: the characters to remove from the end of the string.\n\n### Examples\n\n```cel\ngrpc.federation.strings.trimRight(\"!!!hello!!!\", \"!\") //=> \"!!!hello\"\n```\n\n## trimSpace\n\n`trimSpace` returns a slice of the string `s` with all leading and trailing white space removed, as defined by Unicode.\n\n### Parameters\n\n`trimSpace(s string) string`\n\n- `s`: the string to trim.\n\n### Examples\n\n```cel\ngrpc.federation.strings.trimSpace(\"  hello  \") //=> \"hello\"\n```\n\n## trimSuffix\n\n`trimSuffix` returns a slice of the string `s` without the provided trailing `suffix`. If `s` doesn't end with `suffix`, it returns `s` unchanged.\n\n### Parameters\n\n`trimSuffix(s string, suffix string) string`\n\n- `s`: the string to trim.\n- `suffix`: the suffix to remove.\n\n### Examples\n\n```cel\ngrpc.federation.strings.trimSuffix(\"hello world\", \"world\") //=> \"hello \"\ngrpc.federation.strings.trimSuffix(\"hello world\", \"hello\") //=> \"hello world\"\n```\n\n# `strconv` Functions\n\nSure! Here's the requested unified format for the functions you listed:\n\n## appendBool\nAppends the string form of a boolean value to a byte slice.\n\n### Parameters\n`appendBool(b []byte, v bool) []byte`  \n`appendBool(s string, v bool) string`\n\n- `b`: byte slice to append the boolean string to.\n- `s`: string to append the boolean string to.\n- `v`: the boolean value to convert to a string and append.\n\n### Examples\n```cel\ngrpc.federation.strings.appendBool(b\"hello \", true) //=> \"hello true\"\ngrpc.federation.strings.appendBool(\"hello \", true)  //=> \"hello true\"\n```\n\n## appendFloat\nAppends the string form of a floating-point value to a byte slice.\n\n### Parameters\n`appendFloat(b []byte, f float64, fmt byte, prec int, bitSize int) []byte`  \n`appendFloat(s string, f float64, fmt byte, prec int, bitSize int) string`\n\n- `b`: byte slice to append the float string to.\n- `s`: string to append the float string to.\n- `f`: the floating-point value to convert to a string and append.\n- `fmt`: the format for the floating-point number (`'f'`, `'e'`, `'g'`, etc.).\n- `prec`: the precision of the floating-point number.\n- `bitSize`: the size of the float (32 for `float32`, 64 for `float64`).\n\n### Examples\n```cel\ngrpc.federation.strings.appendFloat(b\"price: \", 1.23, 'f', 2, 64) //=> \"price: 1.23\"\ngrpc.federation.strings.appendFloat(\"price: \", 1.23, 'f', 2, 64)  //=> \"price: 1.23\"\n```\n\n## appendInt\nAppends the string form of an integer value to a byte slice.\n\n### Parameters\n`appendInt(b []byte, i int64, base int) []byte`  \n`appendInt(s string, i int64, base int) string`\n\n- `b`: byte slice to append the integer string to.\n- `s`: string to append the integer string to.\n- `i`: the integer value to convert to a string and append.\n- `base`: the numeric base (e.g., 10 for decimal, 16 for hexadecimal).\n\n### Examples\n```cel\ngrpc.federation.strings.appendInt(b\"number: \", 42, 10) //=> \"number: 42\"\ngrpc.federation.strings.appendInt(\"number: \", 42, 10)  //=> \"number: 42\"\n```\n\n## appendQuote\nAppends the quoted string form of `s` to a byte slice.\n\n### Parameters\n`appendQuote(b []byte, s string) []byte`  \n`appendQuote(s string, s string) string`\n\n- `b`: byte slice to append the quoted string to.\n- `s`: string to append the quoted string to.\n- `s`: the string to be quoted and appended.\n\n### Examples\n```cel\ngrpc.federation.strings.appendQuote(b\"quoted: \", \"hello\") //=> \"quoted: \\\"hello\\\"\"\ngrpc.federation.strings.appendQuote(\"quoted: \", \"hello\")  //=> \"quoted: \\\"hello\\\"\"\n```\n\n## appendQuoteRune\nAppends the quoted rune form of `r` to a byte slice.\n\n### Parameters\n`appendQuoteRune(b []byte, r rune) []byte`  \n`appendQuoteRune(s string, r rune) string`\n\n- `b`: byte slice to append the quoted rune to.\n- `s`: string to append the quoted rune to.\n- `r`: the rune to be quoted and appended.\n\n### Examples\n```cel\ngrpc.federation.strings.appendQuoteRune(b\"quoted: \", 'a') //=> \"quoted: 'a'\"\ngrpc.federation.strings.appendQuoteRune(\"quoted: \", 'a')  //=> \"quoted: 'a'\"\n```\n\n## appendQuoteRuneToASCII\nAppends the ASCII-quoted string form of `r` to a byte slice.\n\n### Parameters\n`appendQuoteRuneToASCII(b []byte, r rune) []byte`  \n`appendQuoteRuneToASCII(s string, r rune) string`\n\n- `b`: byte slice to append the quoted ASCII rune to.\n- `s`: string to append the quoted ASCII rune to.\n- `r`: the rune to be quoted in ASCII form and appended.\n\n### Examples\n```cel\ngrpc.federation.strings.appendQuoteRuneToASCII(b\"ascii: \", 'a') //=> \"ascii: 'a'\"\ngrpc.federation.strings.appendQuoteRuneToASCII(\"ascii: \", 'a')  //=> \"ascii: 'a'\"\n```\n\n## appendQuoteRuneToGraphic\nAppends the graphic-quoted string form of `r` to a byte slice.\n\n### Parameters\n`appendQuoteRuneToGraphic(b []byte, r rune) []byte`  \n`appendQuoteRuneToGraphic(s string, r rune) string`\n\n- `b`: byte slice to append the quoted graphic rune to.\n- `s`: string to append the quoted graphic rune to.\n- `r`: the rune to be quoted in graphic form and appended.\n\n### Examples\n```cel\ngrpc.federation.strings.appendQuoteRuneToGraphic(b\"graphic: \", 'a') //=> \"graphic: 'a'\"\ngrpc.federation.strings.appendQuoteRuneToGraphic(\"graphic: \", 'a')  //=> \"graphic: 'a'\"\n```\n\n## appendQuoteToASCII\nAppends the ASCII-quoted string form of `s` to a byte slice.\n\n### Parameters\n`appendQuoteToASCII(b []byte, s string) []byte`  \n`appendQuoteToASCII(s string, s string) string`\n\n- `b`: byte slice to append the quoted ASCII string to.\n- `s`: string to append the quoted ASCII string to.\n- `s`: the string to be quoted in ASCII form and appended.\n\n### Examples\n```cel\ngrpc.federation.strings.appendQuoteToASCII(b\"ascii: \", \"abc\") //=> \"ascii: \\\"abc\\\"\"\ngrpc.federation.strings.appendQuoteToASCII(\"ascii: \", \"abc\")  //=> \"ascii: \\\"abc\\\"\"\n```\n\n## appendUint\nAppends the string form of an unsigned integer value to a byte slice.\n\n### Parameters\n`appendUint(b []byte, u uint64, base int) []byte`  \n`appendUint(s string, u uint64, base int) string`\n\n- `b`: byte slice to append the unsigned integer string to.\n- `s`: string to append the unsigned integer string to.\n- `u`: the unsigned integer value to convert to a string and append.\n- `base`: the numeric base (e.g., 10 for decimal, 16 for hexadecimal).\n\n### Examples\n```cel\ngrpc.federation.strings.appendUint(b\"number: \", 123, 10) //=> \"number: 123\"\ngrpc.federation.strings.appendUint(\"number: \", 123, 10)  //=> \"number: 123\"\n```\n\n## atoi\nParses a string and returns the integer it represents.\n\n### Parameters\n`atoi(s string) int`\n\n- `s`: the string to parse as an integer.\n\n### Examples\n```cel\ngrpc.federation.strings.atoi(\"123\") //=> 123\n```\n\n## canBackquote\nReports whether the string `s` can be represented unchanged as a single-line backquoted string.\n\n### Parameters\n`canBackquote(s string) bool`\n\n- `s`: the string to check if it can be backquoted.\n\n### Examples\n```cel\ngrpc.federation.strings.canBackquote(\"hello\") //=> true\ngrpc.federation.strings.canBackquote(\"hello\\nworld\") //=> false\n```\n\n## formatBool\nReturns the string representation of a boolean value.\n\n### Parameters\n`formatBool(v bool) string`\n\n- `v`: the boolean value to format as a string.\n\n### Examples\n```cel\ngrpc.federation.strings.formatBool(true)  //=> \"true\"\ngrpc.federation.strings.formatBool(false) //=> \"false\"\n```\n\n## formatComplex\nReturns the string representation of a complex number.\n\n### Parameters\n`formatComplex(c complex128, fmt byte, prec int, bitSize int) string`\n\n- `c`: the complex number to format as a string.\n- `fmt`: the format for the complex number.\n- `prec`: the precision of the complex number.\n- `bitSize`: the bit size of the complex number.\n\n### Examples\n```cel\ngrpc.federation.strings.formatComplex(1.23+4.56i, 'f', 2, 64) //=> \"(1.23+4.56i)\"\n```\n\n## formatFloat\nReturns the string representation of a floating-point number.\n\n### Parameters\n`formatFloat(f float64, fmt byte, prec int, bitSize int) string`\n\n- `f`: the floating-point number to format as a string.\n- `fmt`: the format for the floating-point number (`'f'`, `'e'`, `'g'`, etc.).\n- `prec`: the precision of the floating-point number.\n- `bitSize`: the size of the float (32 for `float32`, 64 for `float64`).\n\n### Examples\n```cel\ngrpc.federation.strings.formatFloat(1.23, 'f', 2, 64) //=> \"1\n\n.23\"\n```\n\n## formatInt\nReturns the string representation of an integer.\n\n### Parameters\n`formatInt(i int64, base int) string`\n\n- `i`: the integer value to format as a string.\n- `base`: the numeric base (e.g., 10 for decimal, 16 for hexadecimal).\n\n### Examples\n```cel\ngrpc.federation.strings.formatInt(42, 10) //=> \"42\"\n```\n\n## formatUint\nReturns the string representation of an unsigned integer.\n\n### Parameters\n`formatUint(u uint64, base int) string`\n\n- `u`: the unsigned integer value to format as a string.\n- `base`: the numeric base (e.g., 10 for decimal, 16 for hexadecimal).\n\n### Examples\n```cel\ngrpc.federation.strings.formatUint(123, 10) //=> \"123\"\n```\n\n## isGraphic\nReturns `true` if the provided rune is a graphic, i.e., a printable character other than space.\n\n### Parameters\n`isGraphic(r rune) bool`\n\n- `r`: the rune to check if it's a graphic character.\n\n### Examples\n```cel\ngrpc.federation.strings.isGraphic('a') //=> true\ngrpc.federation.strings.isGraphic(' ') //=> false\n```\n\n## isPrint\nReturns `true` if the provided rune is printable, meaning it is either a letter, number, punctuation, space, or symbol.\n\n### Parameters\n`isPrint(r rune) bool`\n\n- `r`: the rune to check if it's printable.\n\n### Examples\n```cel\ngrpc.federation.strings.isPrint('a') //=> true\ngrpc.federation.strings.isPrint('\\n') //=> false\n```\n\n## itoa\nConverts an integer to its string representation.\n\n### Parameters\n`itoa(i int) string`\n\n- `i`: the integer to convert to a string.\n\n### Examples\n```cel\ngrpc.federation.strings.itoa(123) //=> \"123\"\n```\n\n## parseBool\nParses a boolean value from its string representation.\n\n### Parameters\n`parseBool(s string) bool`\n\n- `s`: the string to parse as a boolean.\n\n### Examples\n```cel\ngrpc.federation.strings.parseBool(\"true\")  //=> true\ngrpc.federation.strings.parseBool(\"false\") //=> false\n```\n\n## parseComplex\nParses a complex number from a string representation.\n\n### Parameters\n`parseComplex(s string, bitSize int) complex128`\n\n- `s`: the string to parse as a complex number.\n- `bitSize`: the bit size for the complex number (64 or 128).\n\n### Examples\n```cel\ngrpc.federation.strings.parseComplex(\"(1.23+4.56i)\", 128) //=> (1.23 + 4.56i)\n```\n\n## parseFloat\nParses a floating-point number from a string representation.\n\n### Parameters\n`parseFloat(s string, bitSize int) float64`\n\n- `s`: the string to parse as a floating-point number.\n- `bitSize`: the size of the float (32 for `float32`, 64 for `float64`).\n\n### Examples\n```cel\ngrpc.federation.strings.parseFloat(\"1.23\", 64) //=> 1.23\n```\n\n## parseInt\nParses an integer from a string representation, supporting base conversions.\n\n### Parameters\n`parseInt(s string, base int, bitSize int) int64`\n\n- `s`: the string to parse as an integer.\n- `base`: the numeric base (e.g., 10 for decimal, 16 for hexadecimal).\n- `bitSize`: the size of the integer.\n\n### Examples\n```cel\ngrpc.federation.strings.parseInt(\"42\", 10, 64)   //=> 42\ngrpc.federation.strings.parseInt(\"101010\", 2, 8) //=> 42\n```\n\n## parseUint\nParses an unsigned integer from a string representation, supporting base conversions.\n\n### Parameters\n`parseUint(s string, base int, bitSize int) uint64`\n\n- `s`: the string to parse as an unsigned integer.\n- `base`: the numeric base (e.g., 10 for decimal, 16 for hexadecimal).\n- `bitSize`: the size of the unsigned integer.\n\n### Examples\n```cel\ngrpc.federation.strings.parseUint(\"42\", 10, 64)   //=> 42\ngrpc.federation.strings.parseUint(\"101010\", 2, 8) //=> 42\n```\n\n## quote\nReturns a double-quoted string with any special characters escaped.\n\n### Parameters\n`quote(s string) string`\n\n- `s`: the string to quote.\n\n### Examples\n```cel\ngrpc.federation.strings.quote(\"hello\") //=> \"\\\"hello\\\"\"\ngrpc.federation.strings.quote(\"tab\\t\") //=> \"\\\"tab\\\\t\\\"\"\n```\n\n## quoteRune\nReturns a single-quoted string literal with the provided rune, escaping any special characters.\n\n### Parameters\n`quoteRune(r rune) string`\n\n- `r`: the rune to quote.\n\n### Examples\n```cel\ngrpc.federation.strings.quoteRune('a') //=> \"'a'\"\ngrpc.federation.strings.quoteRune('\\n') //=> \"'\\\\n'\"\n```\n\n## quoteRuneToGraphic\nReturns a graphic-quoted string literal for the provided rune.\n\n### Parameters\n`quoteRuneToGraphic(r rune) string`\n\n- `r`: the rune to quote in a graphic string literal.\n\n### Examples\n```cel\ngrpc.federation.strings.quoteRuneToGraphic('a') //=> \"'a'\"\ngrpc.federation.strings.quoteRuneToGraphic('\\n') //=> \"'\\\\n'\"\n```\n\n## quoteToASCII\nReturns a double-quoted string with any non-ASCII characters escaped.\n\n### Parameters\n`quoteToASCII(s string) string`\n\n- `s`: the string to quote with ASCII escapes.\n\n### Examples\n```cel\ngrpc.federation.strings.quoteToASCII(\"abc\")     //=> \"\\\"abc\\\"\"\ngrpc.federation.strings.quoteToASCII(\"こんにちは\") //=> \"\\\"\\\\u3053\\\\u3093\\\\u306b\\\\u3061\\\\u306f\\\"\"\n```\n\n## quoteToGraphic\nReturns a double-quoted string with non-printable characters quoted in their graphic representations.\n\n### Parameters\n`quoteToGraphic(s string) string`\n\n- `s`: the string to quote with graphic character escapes.\n\n### Examples\n```cel\ngrpc.federation.strings.quoteToGraphic(\"abc\")     //=> \"\\\"abc\\\"\"\ngrpc.federation.strings.quoteToGraphic(\"\\u2028\") //=> \"\\\"\\\\u2028\\\"\"\n```\n\n## quotedPrefix\nParses a quoted prefix from the input string.\n\n### Parameters\n`quotedPrefix(s string) string`\n\n- `s`: the string containing the quoted prefix.\n\n### Examples\n```cel\ngrpc.federation.strings.quotedPrefix(\"\\\"hello\\\" world\") //=> \"hello\"\n```\n\n## unquote\nRemoves the surrounding quotes from a quoted string and unescapes any special characters.\n\n### Parameters\n`unquote(s string) string`\n\n- `s`: the string to unquote.\n\n### Examples\n```cel\ngrpc.federation.strings.unquote(\"\\\"hello\\\"\") //=> \"hello\"\n```\n\n## unquoteChar\nDecodes the next character or byte in the quoted string literal.\n\n### Parameters\n`unquoteChar(s string, quote byte) rune`\n\n- `s`: the string containing the quoted character.\n- `quote`: the quote character used (`'` or `\"`).\n\n### Examples\n```cel\ngrpc.federation.strings.unquoteChar(\"\\\\n\", '\"') //=> '\\n'\n```\n"
  },
  {
    "path": "docs/cel/time.md",
    "content": "# grpc.federation.time APIs\n\nThe API for this package was created based on Go's [`time`](https://pkg.go.dev/time) package.\n\n# Index\n\n## Constants\n\n- [`LAYOUT`](#layout)\n- [`ANSIC`](#ansic)\n- [`UNIX_DATE`](#unix_date)\n- [`RUBY_DATE`](#ruby_date)\n- [`RFC822`](#rfc822)\n- [`RFC822Z`](#rfc822z)\n- [`RFC850`](#rfc850)\n- [`RFC1123`](#rfc1123)\n- [`RFC1123Z`](#rfc1123z)\n- [`RFC3339`](#rfc3339)\n- [`RFC3339NANO`](#rfc3339nano)\n- [`KITCHEN`](#kitchen)\n- [`STAMP`](#stamp)\n- [`STAMP_MILLI`](#stamp_milli)\n- [`STAMP_MICRO`](#stamp_micro)\n- [`STAMP_NANO`](#stamp_nano)\n- [`DATETIME`](#datetime)\n- [`DATE_ONLY`](#date_only)\n- [`TIME_ONLY`](#time_only)\n- [`NANOSECOND`](#nanosecond)\n- [`MICROSECOND`](#microsecond)\n- [`MILLISECOND`](#millisecond)\n- [`SECOND`](#second)\n- [`MINUTE`](#minute)\n- [`HOUR`](#hour)\n\n## Duration\n\n- [`toDuration`](#toduration)\n- [`parseDuration`](#parseduration)\n- [`since`](#since)\n- [`until`](#until)\n- [`Duration.abs`](#durationabs)\n- [`Duration.hours`](#durationhours)\n- [`Duration.microseconds`](#durationmicroseconds)\n- [`Duration.milliseconds`](#durationmilliseconds)\n- [`Duration.minutes`](#durationminutes)\n- [`Duration.nanoseconds`](#durationnanoseconds)\n- [`Duration.round`](#durationround)\n- [`Duration.seconds`](#durationseconds)\n- [`Duration.string`](#durationstring)\n- [`Duration.truncate`](#durationtruncate)\n\n## Location\n\n- [`LOCAL`](#local)\n- [`UTC`](#utc)\n- [`fixedZone`](#fixedzone)\n- [`loadLocation`](#loadlocation)\n- [`loadLocationFromTZData`](#loadlocationfromtzdata)\n- [`Location.string`](#locationstring)\n\n## google.protobuf.Timestamp\n\n- [`asTime`](#asTime)\n  \n## Time\n\n- [`date`](#date)\n- [`now`](#now)\n- [`parse`](#parse)\n- [`unix`](#unix)\n- [`unixMicro`](#unixmicro)\n- [`unixMilli`](#unixmilli)\n- [`Time.add`](#timeadd)\n- [`Time.addDate`](#timeadddate)\n- [`Time.after`](#timeafter)\n- [`Time.appendFormat`](#timeappendformat)\n- [`Time.before`](#timebefore)\n- [`Time.compare`](#timecompare)\n- [`Time.day`](#timeday)\n- [`Time.equal`](#timeequal)\n- [`Time.format`](#timeformat)\n- [`Time.hour`](#timehour)\n- [`Time.withLocation`](#timewithlocation)\n- [`Time.isDST`](#timeisdst)\n- [`Time.isZero`](#timeiszero)\n- [`Time.local`](#timelocal)\n- [`Time.location`](#timelocation)\n- [`Time.minute`](#timeminute)\n- [`Time.month`](#timemonth)\n- [`Time.nanosecond`](#timenanosecond)\n- [`Time.round`](#timeround)\n- [`Time.second`](#timesecond)\n- [`Time.string`](#timestring)\n- [`Time.sub`](#timesub)\n- [`Time.truncate`](#timetruncate)\n- [`Time.utc`](#timeutc)\n- [`Time.unix`](#timeunix)\n- [`Time.unixMicro`](#timeunixmicro)\n- [`Time.unixMilli`](#timeunixmilli)\n- [`Time.unixNano`](#timeunixnano)\n- [`Time.weekday`](#timeweekday)\n- [`Time.year`](#timeyear)\n- [`Time.yearDay`](#timeyearday)\n\n# Types\n\n## Duration\n\nA `Duration` represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years.\n`Duration` type is compatible with [`google.protobuf.Duration`](https://github.com/protocolbuffers/protobuf/blob/main/src/google/protobuf/duration.proto) type.\n\nFYI: https://pkg.go.dev/time#Duration\n\n## Location\n\nA `Location` maps time instants to the zone in use at that time. Typically, the Location represents the collection of time offsets in use in a geographical area. For many Locations the time offset varies depending on whether daylight savings time is in use at the time instant.\n\nFYI: https://pkg.go.dev/time#Location\n\n## google.protobuf.Timestamp\n\n## asTime\n\n`asTime` converts google.protobuf.Timestamp value to grpc.federation.time.Time value.\n\n### Parameters\n\n`asTime() Time`\n\n### Examples\n\n```cel\ngoogle.protobuf.Timestamp{}.asTime() //=> grpc.federation.time.Time{timestamp: google.protobuf.Timestamp{}}\n```\n\n## Time\n\nA `Time` represents `google.protobuf.Timestamp` with time zone.\n\n# Constants\n\nFYI: https://pkg.go.dev/time#pkg-constants\n\n## LAYOUT\n\n### type\n\n`string`\n\n### value\n\n`01/02 03:04:05PM '06 -0700`\n\n## ANSIC\n\n### type\n\n`string`\n\n### value\n\n`Mon Jan _2 15:04:05 2006`\n\n## UNIX_DATE\n\n### type\n\n`string`\n\n### value\n\n`Mon Jan _2 15:04:05 MST 2006`\n\n## RUBY_DATE\n\n### type\n\n`string`\n\n### value\n\n`Mon Jan 02 15:04:05 -0700 2006`\n\n## RFC822\n\n### type\n\n`string`\n\n### value\n\n`02 Jan 06 15:04 MST`\n\n## RFC822Z\n\n### type\n\n`string`\n\n### value\n\n`02 Jan 06 15:04 -0700`\n\n## RFC850\n\n### type\n\n`string`\n\n### value\n\n`Monday, 02-Jan-06 15:04:05 MST`\n\n## RFC1123\n\n### type\n\n`string`\n\n### value\n\n`Mon, 02 Jan 2006 15:04:05 MST`\n\n## RFC1123Z\n\n### type\n\n`string`\n\n### value\n\n`Mon, 02 Jan 2006 15:04:05 -0700`\n\n## RFC3339\n\n### type\n\n`string`\n\n### value\n\n`2006-01-02T15:04:05Z07:00`\n\n## RFC3339NANO\n\n### type\n\n`string`\n\n### value\n\n`2006-01-02T15:04:05.999999999Z07:00`\n\n## KITCHEN\n\n### type\n\n`string`\n\n### value\n\n`3:04PM`\n\n## STAMP\n\n### type\n\n`string`\n\n### value\n\n`Jan _2 15:04:05`\n\n## STAMP_MILLI\n\n### type\n\n`string`\n\n### value\n\n`Jan _2 15:04:05.000`\n\n## STAMP_MICRO\n\n### type\n\n`string`\n\n### value\n\n`Jan _2 15:04:05.000000`\n\n## STAMP_NANO\n\n### type\n\n`string`\n\n### value\n\n`Jan _2 15:04:05.000000000`\n\n## DATETIME\n\n### type\n\n`string`\n\n### value\n\n`2006-01-02 15:04:05`\n\n## DATE_ONLY\n\n### type\n\n`string`\n\n### value\n\n`2006-01-02`\n\n## TIME_ONLY\n\n### type\n\n`string`\n\n### value\n\n`15:04:05`\n\n## NANOSECOND\n\n### type\n\n`int`\n\n### value\n\n`1`\n\n## MICROSECOND\n\n### type\n\n`int`\n\n### value\n\n`1000 * grpc.federation.time.NANOSECOND`\n\n## MILLISECOND\n\n### type\n\n`int`\n\n### value\n\n`1000 * grpc.federation.time.MICROSECOND`\n\n## SECOND\n\n### type\n\n`int`\n\n### value\n\n`1000 * grpc.federation.time.MILLISECOND`\n\n## MINUTE\n\n### type\n\n`int`\n\n### value\n\n`60 * grpc.federation.time.SECOND`\n\n## HOUR\n\n### type\n\n`int`\n\n### value\n\n`60 * grpc.federation.time.MINUTE`\n\n# Functions\n\n## toDuration\n\n`toDuration` converts int type to `Duration` type.\n\n### Parameters\n\n`toDuration(var int) Duration`\n\n- `var`: source value\n\n### Examples\n\n```cel\ngrpc.federation.time.toDuration(10 * grpc.federation.time.SECOND) // 10s\n```\n\n## parseDuration\n\n`parseDuration` parses a duration string. A duration string is a possibly signed sequence of decimal numbers, each with optional fraction and a unit suffix, such as \"300ms\", \"-1.5h\" or \"2h45m\". Valid time units are \"ns\", \"us\" (or \"µs\"), \"ms\", \"s\", \"m\", \"h\".\n\nFYI: https://pkg.go.dev/time#ParseDuration\n\n### Parameters\n\n`parseDuration(s string) Duration`\n\n- `s`: duration string\n\n### Examples\n\n```cel\ngrpc.federation.time.parseDuration(\"1h10m10s\")\n```\n\n## since\n\n`since` returns the time elapsed since `t`. It is shorthand for `now().sub(t)`.\n\nFYI: https://pkg.go.dev/time#Since\n\n### Parameters\n\n`since(t Time) Duration`\n\n- `t`: time value\n\n### Examples\n\n```cel\ngrpc.federation.time.since(grpc.federation.time.now())\n```\n\n## until\n\n`until` returns the duration until `t`. It is shorthand for `t.sub(now())`.\n\n### Parameters\n\n`until(t Time) Duration`\n\n- `t`: time value\n\n### Examples\n\n```cel\ngrpc.federation.time.until(grpc.federation.time.now())\n```\n\n## Duration.abs\n\n`abs` returns the absolute value of `Duration`. As a special case, `<min-int-value>` is converted to `<max-int-value>`.\n\nFYI: https://pkg.go.dev/time#Duration.Abs\n\n### Parameters\n\n`Duration.abs() Duration`\n\n## Duration.hours\n\n`hours` returns the duration as a double type number of hours.\n\nFYI: https://pkg.go.dev/time#Duration.Hours\n\n### Parameters\n\n`Duration.hours() double`\n\n### Examples\n\n```cel\ngrpc.federation.time.parseDuration(\"4h30m\").hours() //=> 4.5\n```\n\n## Duration.microseconds\n\n`microseconds` returns the duration as an integer microsecond count.\n\nFYI: https://pkg.go.dev/time#Duration.Microseconds\n\n### Parameters\n\n`Duration.microseconds() int`\n\n### Examples\n\n```cel\ngrpc.federation.time.parseDuration(\"1s\").microseconds() //=> 1000000\n```\n\n## Duration.milliseconds\n\n`milliseconds` returns the duration as an integer millisecond count.\n\nFYI: https://pkg.go.dev/time#Duration.Milliseconds\n\n### Parameters\n\n`Duration.milliseconds() int`\n\n### Examples\n\n```cel\ngrpc.federation.time.parseDuration(\"1s\").milliseconds() //=> 1000\n```\n\n## Duration.minutes\n\n`minutes` returns the duration as a double type number of minutes.\n\nFYI: https://pkg.go.dev/time#Duration.Minutes\n\n### Parameters\n\n`Duration.minutes() double`\n\n### Examples\n\n```cel\ngrpc.federation.time.parseDuration(\"1h30m\").minutes() //=> 90\n```\n\n## Duration.nanoseconds\n\n`nanoseconds` returns the duration as an integer nanosecond count.\n\nFYI: https://pkg.go.dev/time#Duration.Nanoseconds\n\n### Parameters\n\n`Duration.nanoseconds() int`\n\n### Examples\n\n```cel\ngrpc.federation.time.parseDuration(\"1µs\").nanoseconds() //=> 1000\n```\n\n## Duration.round\n\n`round` returns the result of rounding `Duration` to the nearest multiple of `m`. The rounding behavior for halfway values is to round away from zero. If the result exceeds the maximum (or minimum) value that can be stored in a Duration, `round` returns the maximum (or minimum) duration. If `m` <= 0, `round` returns `Duration` unchanged.\n\n### Parameters\n\n`Duration.round(m Duration) Duration`\n\n- `m`: the value for round operation\n\n### Examples\n\n```cel\ngrpc.federation.time.parseDuration(\"1h15m30.918273645s\").round(grpc.federation.time.MILLISECOND) //=> 1h15m30.918s\n```\n\n## Duration.seconds\n\n`seconds` returns the duration as a double type number of seconds.\n\nFYI: https://pkg.go.dev/time#Duration.Seconds\n\n### Parameters\n\n`Duration.seconds() double`\n\n### Examples\n\n```cel\ngrpc.federation.time.parseDuration(\"1m30s\").seconds() //=> 90\n```\n\n## Duration.string\n\n`string` returns a string representing the duration in the form \"72h3m0.5s\". Leading zero units are omitted. As a special case, durations less than one second format use a smaller unit (milli-, micro-, or nanoseconds) to ensure that the leading digit is non-zero. The zero duration formats as 0s.\n\nFYI: https://pkg.go.dev/time#Duration.String\n\n### Parameters\n\n`Duration.string() string`\n\n### Examples\n\n```cel\ngrpc.federation.time.toDuration(grpc.federation.time.HOUR + 2*grpc.federatino.time.MINUTE).string() //=> 1h2m\n```\n\n## Duration.truncate\n\n`truncate` returns the result of rounding d toward zero to a multiple of `m`. If `m` <= 0, `truncate` returns `Duration` unchanged.\n\nFYI: https://pkg.go.dev/time#Duration.Truncate\n\n### Parameters\n\n`Duration.truncate(m Duration) Duration`\n\n- `m`: the value for truncate operation\n\n### Examples\n\n```cel\ngrpc.federation.time.parseDuration(\"1h15m30.918273645s\").truncate(grpc.federation.time.MILLISECOND) //=> 1h15m30.918s\n```\n\n## LOCAL\n\n`LOCAL` represents the system's local time zone. On Unix systems, `LOCAL` consults the TZ environment variable to find the time zone to use. No TZ means use the system default /etc/localtime. TZ=\"\" means use UTC. TZ=\"foo\" means use file foo in the system timezone directory.\n\n### Parameters\n\n`LOCAL() Location`\n\n## UTC\n\n`UTC` represents Universal Coordinated Time (UTC).\n\n### Parameters\n\n`UTC() Location`\n\n## fixedZone\n\n`fixedZone` returns a `Location` that always uses the given zone name and offset (seconds east of `UTC`).\n\nFYI: https://pkg.go.dev/time#FixedZone\n\n### Parameters\n\n`fixedZone(name string, offset int) Location`\n\n- `name`: the zone name\n- `offset`: the seconds east of `UTC`\n\n### Examples\n\n```cel\ngrpc.federation.time.fixedZone(\"UTC-8\", -8*60*60)\n```\n\n## loadLocation\n\n`loadLocation` returns the `Location` with the given name.\n\nIf the name is `\"\"` or `\"UTC\"`, `loadLocation` returns `UTC`. If the name is `\"Local\"`, `loadLocation` returns `LOCAL`.\n\nOtherwise, the name is taken to be a location name corresponding to a file in the IANA Time Zone database, such as `\"America/New_York\"`.\n\nFYI: https://pkg.go.dev/time#LoadLocation\n\n### Parameters\n\n`loadLocation(name string) Location`\n\n### Examples\n\n```cel\ngrpc.federation.time.loadLocation(\"America/Los_Angeles\")\n```\n\n## loadLocationFromTZData\n\n`loadLocationFromTZData` returns a `Location` with the given name initialized from the IANA Time Zone database-formatted data. The data should be in the format of a standard IANA time zone file (for example, the content of /etc/localtime on Unix systems).\n\nFYI: https://pkg.go.dev/time#LoadLocationFromTZData\n\n### Parameters\n\n`loadLocationFromTZData(name string data bytes) Location`\n\n- `name`: the zone name\n- `data`: the IANA Time Zone database-formatted data\n\n## Location.string\n\n`string` returns a descriptive name for the time zone information, corresponding to the name argument to `loadLocation` or `fixedZone`.\n\nFYI: https://pkg.go.dev/time#Location.String\n\n### Parameters\n\n`Location.string() string`\n\n## date\n\n`date` returns the `Time` corresponding to\n\n```\nyyyy-mm-dd hh:mm:ss + nsec nanoseconds\n```\n\nin the appropriate zone for that time in the given location.\n\nFYI: https://pkg.go.dev/time#Date\n\n### Parameters\n\n`date(year int, month int, day int, hour int, min int, sec int, nsec int, loc Location) Time`\n\n- `year`: the year number\n- `month`: the month number\n- `day`: the day number\n- `hour`: the hour number\n- `min`: the minute number\n- `sec`: the second number\n- `nsec`: the nanosecond number\n- `loc`: the Location value\n\n### Examples\n\n```cel\ngrpc.federation.time.date(2009, time.November, 10, 23, 0, 0, 0, grpc.federation.time.UTC()) //=> 2009-11-10 23:00:00 +0000 UTC\n```\n\n## now\n\n`now` returns the current local time.\n\nFYI: https://pkg.go.dev/time#Now\n\n### Parameters\n\n`now() Time`\n\n### Examples\n\n```cel\ngrpc.federation.time.now()\n```\n\n## parse\n\n`parse` parses a formatted string and returns the time value it represents. See the documentation for the constant called `LAYOUT` to see how to represent the format. The second argument must be parseable using the format string (layout) provided as the first argument.\n\nFYI: https://pkg.go.dev/time#Parse\n\n### Parameters\n\n`parse(layout string, value string) Time`\n\n### Examples\n\n```cel\ngrpc.federation.time.parse(\"2006-Jan-02\", \"2013-Feb-03\")\n```\n\n## parseInLocation\n\n`parseInLocation` is like `parse` but differs in two important ways. First, in the absence of time zone information, `parse` interprets a time as `UTC`; `parseInLocation` interprets the time as in the given location. Second, when given a zone offset or abbreviation, `parse` tries to match it against the `LOCAL` location; `parseInLocation` uses the given location.\n\nFYI: https://pkg.go.dev/time#ParseInLocation\n\n### Parameters\n\n`parseInLocation(layout string, value string, loc Location) Time`\n\n### Examples\n\n```cel\ngrpc.federation.time.parseInLocation(\"Jan 2, 2006 at 3:04pm (MST)\", \"Jul 9, 2012 at 5:02am (CEST)\", grpc.federation.time.loadLocation(\"Europe/Berlin\"))\n```\n\n## unix\n\n`unix` returns the local Time corresponding to the given Unix time, sec seconds and nsec nanoseconds since January 1, 1970 UTC. It is valid to pass nsec outside the range [0, 999999999]. Not all sec values have a corresponding time value. One such value is 1<<63-1 (the largest int64 value).\n\nFYI: https://pkg.go.dev/time#Unix\n\n### Parameters\n\n`unix(sec int, nsec int) Time`\n\n- `sec`: the second value\n- `nsec`: the nanosecond value\n\n## unixMicro\n\n`unixMicro` returns the local Time corresponding to the given Unix time, usec microseconds since January 1, 1970 UTC.\n\nFYI: https://pkg.go.dev/time#UnixMicro\n\n### Parameters\n\n`unixMicro(usec int) Time`\n\n- `usec`: microseconds since January 1, 1970 UTC.\n\n## unixMilli\n\n`unixMilli` returns the local Time corresponding to the given Unix time, msec milliseconds since January 1, 1970 UTC.\n\nFYI: https://pkg.go.dev/time#UnixMilli\n\n### Parameters\n\n`unixMilli(msec int) Time`\n\n- `msec`: milliseconds since January 1, 1970 UTC.\n\n## Time.add\n\n`add` returns the time `Time`+`d`.\n\nFYI: https://pkg.go.dev/time#Time.Add\n\n### Parameters\n\n`Time.add(d Duration) Time`\n\n- `d`: Duration value\n\n## Time.addDate\n\n`addDate` returns the time corresponding to adding the given number of years, months, and days to `Time`. For example, `addDate(-1, 2, 3)` applied to January 1, 2011 returns March 4, 2010.  \n\n`addDate` normalizes its result in the same way that Date does, so, for example, adding one month to October 31 yields December 1, the normalized form for November 31.\n\nFYI: https://pkg.go.dev/time#Time.AddDate\n\n### Parameters\n\n`Time.addDate(years int, months int, days int) Time`\n\n- `years`: year number\n- `months`: month number\n- `days`: day number\n\n## Time.after\n\n`after` reports whether the time instant `Time` is after `u`.\n\nFYI: https://pkg.go.dev/time#Time.After\n\n### Parameters\n\n`Time.after(u Time) bool`\n\n- `u`: the time value to compare\n\n### Examples\n\n```cel\ngrpc.federation.time.date(3000, 1, 1, 0, 0, 0, 0, grpc.federation.time.UTC()).after(grpc.federation.time.date(2000, 1, 1, 0, 0, 0, 0, grpc.federation.time.UTC())) //=> true\n```\n\n## Time.appendFormat\n\n`appendFormat` is like Format but appends the textual representation to `b` and returns the extended buffer.\n\nFYI: https://pkg.go.dev/time#Time.AppendFormat\n\n### Parameters\n\n- `Time.appendFormat(b bytes, layout string) string`\n- `Time.appendFormat(s string, layout string) string`\n\n### Examples\n\n```cel\ngrpc.federation.time.date(2017, 11, 4, 11, 0, 0, 0, grpc.federation.time.UTC()).appendFormat(\"Time: \", grpc.federation.time.KITCHEN) //=> Time: 11:00AM\n```\n\n## Time.before\n\n`before` reports whether the time instant `Time` is before `u`.\n\nFYI: https://pkg.go.dev/time#Time.Before\n\n### Parameters\n\n`Time.before(u Time) bool`\n\n- `u`: the time value to compare\n\n### Examples\n\n```cel\ngrpc.federation.time.date(2000, 1, 1, 0, 0, 0, 0, grpc.federation.time.UTC()).before(grpc.federation.time.date(3000, 1, 1, 0, 0, 0, 0, grpc.federation.time.UTC())) //=> true\n```\n\n## Time.compare\n\n`compare` compares the time instant `Time` with `u`. If `Time` is before `u`, it returns `-1`; if `Time` is after `u`, it returns `+1`; if they're the same, it returns `0`.\n\nFYI: https://pkg.go.dev/time#Time.Compare\n\n### Parameters\n\n`Time.compare(u Time) int`\n\n- `u`: the time value to compare\n\n## Time.day\n\n`day` returns the day of the month specified by `Time`.\n\nFYI: https://pkg.go.dev/time#Time.Day\n\n### Parameters\n\n`Time.day() int`\n\n### Examples\n\n```cel\ngrpc.federation.time.date(2000, 2, 1, 12, 30, 0, 0, grpc.federation.time.UTC()).day() //=> 1\n```\n\n## Time.equal\n\n`equal` reports whether `Time` and `u` represent the same time instant. Two times can be equal even if they are in different locations. For example, 6:00 +0200 and 4:00 UTC are Equal. See the documentation on the Time type for the pitfalls of using == with Time values; most code should use `equal` instead.\n\nFYI: https://pkg.go.dev/time#Time.Equal\n\n### Parameters\n\n`Time.equal(u Time) bool`\n\n### Examples\n\n```cel\ngrpc.federation.time.date(2000, 2, 1, 12, 30, 0, 0, grpc.federation.time.UTC()).equal(grpc.federation.time.date(2000, 2, 1, 20, 30, 0, 0, grpc.federation.time.fixedZone('Beijing Time', grpc.federation.time.toDuration(8 * grpc.federation.time.HOUR).seconds()))) //=> true\n```\n\n## Time.format\n\n`format` returns a textual representation of the time value formatted according to the layout defined by the argument. See the documentation for the constant called Layout to see how to represent the layout format.\n\nFYI: https://pkg.go.dev/time#Time.Format\n\n### Parameters\n\n`Time.format(layout string) string`\n\n- `layout`: the layout value to format\n\n## Time.hour\n\n`hour` returns the hour within the day specified by `Time`, in the range [0, 23].\n\nFYI: https://pkg.go.dev/time#Time.Hour\n\n### Parameters\n\n`Time.hour() int`\n\n## Time.withLocation\n\n`withLocation` returns a copy of `Time` representing the same time instant, but with the copy's location information set to loc for display purposes.\n\nFYI: https://pkg.go.dev/time#Time.In\n\n### Parameters\n\n`Time.withLocation(loc Location) Time`\n\n## Time.isDST\n\n`isDST` reports whether the time in the configured location is in Daylight Savings Time.\n\nFYI: https://pkg.go.dev/time#Time.IsDST\n\n### Parameters\n\n`Time.isDST() bool`\n\n## Time.isZero\n\n`isZero` reports whether `Time` represents the zero time instant, January 1, year 1, 00:00:00 UTC.\n\nFYI: https://pkg.go.dev/time#Time.IsZero\n\n### Parameters\n\n`Time.isZero() bool`\n\n## Time.local\n\n`local` returns `Time` with the location set to local time.\n\nFYI: https://pkg.go.dev/time#Time.Local\n\n### Parameters\n\n`Time.local() Time`\n\n## Time.location\n\n`location` returns the time zone information associated with `Time`.\n\nFYI: https://pkg.go.dev/time#Time.Location\n\n### Parameters\n\n`Time.location() Location`\n\n## Time.minute\n\n`minute` returns the minute offset within the hour specified by `Time`, in the range [0, 59].\n\nFYI: https://pkg.go.dev/time#Time.Minute\n\n### Parameters\n\n`Time.minute() int`\n\n## Time.month\n\n`month` returns the month of the year specified by `Time`.\n\nFYI: https://pkg.go.dev/time#Time.Month\n\n### Parameters\n\n`Time.month() int`\n\n## Time.nanosecond\n\n`nanosecond` returns the nanosecond offset within the second specified by `Time`, in the range [0, 999999999].\n\nFYI: https://pkg.go.dev/time#Time.Nanosecond\n\n### Parameters\n\n`Time.nanosecond() int`\n\n## Time.round\n\n`round` returns the result of rounding `Time` to the nearest multiple of `d` (since the zero time). The rounding behavior for halfway values is to round up. If d <= 0, `round` returns `Time` stripped of any monotonic clock reading but otherwise unchanged.\n\n`round` operates on the time as an absolute duration since the zero time; it does not operate on the presentation form of the time. Thus, `round(grpc.federation.time.HOUR)` may return a time with a non-zero minute, depending on the time's Location.\n\nFYI: https://pkg.go.dev/time#Time.Round\n\n### Parameters\n\n`Time.round(d Duration) Time`\n\n- `d`: the duration value\n\n### Examples\n\n```cel\ngrpc.federation.time.date(0, 0, 0, 12, 15, 30, 918273645, grpc.federation.time.UTC()).round(grpc.federation.time.MILLISECOND).format(\"15:04:05.999999999\") //=> 12:15:30.918\n```\n\n## Time.second\n\n`second` returns the second offset within the minute specified by `Time`, in the range [0, 59].\n\nFYI: https://pkg.go.dev/time#Time.Second\n\n### Parameters\n\n`Time.second() int`\n\n## Time.string\n\n`string` returns the time formatted using the format string.\n\n```\n\"2006-01-02 15:04:05.999999999 -0700 MST\"\n```\n\nIf the time has a monotonic clock reading, the returned string includes a final field \"m=±<value>\", where value is the monotonic clock reading formatted as a decimal number of seconds.\n\nFYI: https://pkg.go.dev/time#Time.String\n\n### Parameters\n\n`Time.string() string`\n\n## Time.sub\n\n`sub` returns the duration `Time`-`u`. If the result exceeds the maximum (or minimum) value that can be stored in a Duration, the maximum (or minimum) duration will be returned. To compute `Time`-`d` for a duration `d`, use `Time.add(-d)`.\n\nFYI: https://pkg.go.dev/time#Time.Sub\n\n### Parameters\n\n`Time.sub(u Time) Duration`\n\n- `u`: the time value\n\n### Examples\n\n```cel\ngrpc.federation.time.date(2000, 1, 1, 12, 0, 0, 0, grpc.federation.time.UTC()).sub(grpc.federation.time.date(2000, 1, 1, 0, 0, 0, 0, grpc.federation.time.UTC())) //=> 12h0m0s\n```\n\n## Time.truncate\n\n`truncate` returns the result of rounding `Time` down to a multiple of `d` (since the zero time). If `d` <= 0, `truncate` returns `Time` stripped of any monotonic clock reading but otherwise unchanged.\n\n`truncate` operates on the time as an absolute duration since the zero time; it does not operate on the presentation form of the time. Thus, `truncate(grpc.federation.time.HOUR)` may return a time with a non-zero minute, depending on the time's Location.\n\nFYI: https://pkg.go.dev/time#Time.Truncate\n\n### Parameters\n\n`Time.truncate(d Duration) Time`\n\n- `d`: since the zero time\n\n### Examples\n\n```cel\ngrpc.federation.time.parse(\"2006 Jan 02 15:04:05\", \"2012 Dec 07 12:15:30.918273645\").truncate(grpc.federation.time.MILLISECOND).format(\"15:04:05.999999999\") //=> 12:15:30.918\n```\n\n## Time.utc\n\n`utc` returns `Time` with the location set to UTC.\n\nFYI: https://pkg.go.dev/time#Time.UTC\n\n### Parameters\n\n`Time.utc() Time`\n\n## Time.unix\n\n`unix` returns t as a Unix time, the number of seconds elapsed since January 1, 1970 UTC. The result does not depend on the location associated with `Time`. Unix-like operating systems often record time as a 32-bit count of seconds, but since the method here returns a 64-bit value it is valid for billions of years into the past or future.\n\nFYI: https://pkg.go.dev/time#Time.Unix\n\n### Parameters\n\n`Time.unix() int`\n\n## Time.unixMicro\n\n`unixMicro` returns `Time` as a Unix time, the number of microseconds elapsed since January 1, 1970 UTC. The result is undefined if the Unix time in microseconds cannot be represented by an int64 (a date before year -290307 or after year 294246). The result does not depend on the location associated with `Time`.\n\nFYI: https://pkg.go.dev/time#Time.UnixMicro\n\n### Parameters\n\n`Time.unixMicro() int`\n\n## Time.unixMilli\n\n`unixMilli` returns `Time` as a Unix time, the number of milliseconds elapsed since January 1, 1970 UTC. The result is undefined if the Unix time in milliseconds cannot be represented by an int64 (a date more than 292 million years before or after 1970). The result does not depend on the location associated with `Time`.\n\nFYI: https://pkg.go.dev/time#Time.UnixMilli\n\n### Parameters\n\n`Time.unixMilli() int`\n\n## Time.unixNano\n\n`unixNano` returns `Time` as a Unix time, the number of nanoseconds elapsed since January 1, 1970 UTC. The result is undefined if the Unix time in nanoseconds cannot be represented by an int64 (a date before the year 1678 or after 2262). Note that this means the result of calling UnixNano on the zero Time is undefined. The result does not depend on the location associated with `Time`.\n\nFYI: https://pkg.go.dev/time#Time.UnixNano\n\n### Parameters\n\n`Time.unixNano() int`\n\n## Time.weekday\n\n`weekday` returns the day of the week specified by `Time`.\n\nFYI: https://pkg.go.dev/time#Time.Weekday\n\n### Parameters\n\n`Time.weekday() int`\n\n## Time.year\n\n`year` returns the year in which `Time` occurs.\n\nFYI: https://pkg.go.dev/time#Time.Year\n\n### Parameters\n\n`Time.year() int`\n\n## Time.yearDay\n\n`yearDay` returns the day of the year specified by `Time`, in the range [1,365] for non-leap years, and [1,366] in leap years.\n\nFYI: https://pkg.go.dev/time#Time.YearDay\n\n### Parameters\n\n`Time.yearDay() int`\n"
  },
  {
    "path": "docs/cel/url.md",
    "content": "# grpc.federation.url APIs\n\nThe API for this package was created based on Go's [`net/url`](https://pkg.go.dev/net/url) package.\n\n# Index\n\n## Functions\n\n- [`joinPath`](#joinPath)\n- [`pathEscape`](#pathEscape)\n- [`pathUnescape`](#pathUnescape)\n- [`queryEscape`](#queryEscape)\n- [`queryUnescape`](#queryUnescape)\n\n## URL\n\n- [`parse`](#parse)\n- [`parseRequestURI`](#parseRequestURI)\n- [`URL.scheme`](#urlscheme)\n- [`URL.opaque`](#urlopaque)\n- [`URL.userinfo`](#urluserinfo)\n- [`URL.host`](#urlhost)\n- [`URL.path`](#urlpath)\n- [`URL.rawPath`](#urlrawpath)\n- [`URL.forceQuery`](#urlforceQuery)\n- [`URL.rawQuery`](#urlrawQuery)\n- [`URL.fragment`](#urlfragment)\n- [`URL.rawFragment`](#urlrawFragment)\n- [`URL.escapedFragment`](#urlescapedFragment)\n- [`URL.escapedPath`](#urlescapedPath)\n- [`URL.hostname`](#urlhostname)\n- [`URL.isAbs`](#urlisAbs)\n- [`URL.joinPath`](#urljoinPath)\n- [`URL.marshalBinary`](#urlmarshalBinary)\n- [`URL.parse`](#urlparse)\n- [`URL.port`](#urlport)\n- [`URL.query`](#urlquery)\n- [`URL.redacted`](#urlredacted)\n- [`URL.requestURI`](#urlrequestURI)\n- [`URL.resolveReference`](#urlresolveReference)\n- [`URL.string`](#urlstring)\n- [`URL.unmarshalBinary`](#urlunmarshalBinary)\n\n## Userinfo\n\n- [`user`](#user)\n- [`userPassword`](#userPassword)\n- [`Userinfo.username`](#userinfousername)\n- [`Userinfo.password`](#userinfopassword)\n- [`Userinfo.passwordSet`](#userinfopasswordSet)\n- [`Userinfo.string`](#userinfostring)\n\n# Functions\n\n## joinPath\n\n`joinPath` concatenates a base URL with additional path elements to form a complete URL.\n\n### Parameters\n\n`joinPath(baseURL string, elements []string) string`\n\n- `baseURL`: the base URL to start with.\n- `elements`: an array of path segments to join with the base URL.\n\n### Example\n\n```cel\ngrpc.federation.url.joinPath(\"https://example.com\", [\"path\", \"to\", \"resource\"]) //=> \"https://example.com/path/to/resource\"\n```\n\n## pathEscape\n\n`pathEscape` escapes the string so it can be safely placed inside a URL path segment.\n\n### Parameters\n\n`pathEscape(path string) string`\n\n- `path`: the path segment to escape.\n\n### Examples\n\n```cel\ngrpc.federation.url.pathEscape(\"/path with spaces/\")\n```\n\n## pathUnescape\n\n`pathUnescape` unescapes a path segment.\n\n### Parameters\n\n`pathUnescape(path string) string`\n\n- `path`: the path segment to unescape.\n\n### Examples\n\n```cel\ngrpc.federation.url.pathUnescape(\"/path%20with%20spaces/\")\n```\n\n## queryEscape\n\n`queryEscape` escapes the string so it can be safely placed inside a URL query.\n\n### Parameters\n\n`queryEscape(query string) string`\n\n- `query`: the query string to escape.\n\n### Examples\n\n```cel\ngrpc.federation.url.queryEscape(\"query with spaces\")\n```\n\n## queryUnescape\n\n`queryUnescape` unescapes a query string.\n\n### Parameters\n\n`queryUnescape(query string) string`\n\n- `query`: the query string to unescape.\n\n### Examples\n\n```cel\ngrpc.federation.url.queryUnescape(\"query%20with%20spaces\")\n```\n\n# URL Methods\n\n## parse\n\n`parse` parses a URL and returns a URL struct.\n\n### Parameters\n\n`parse(url string) URL`\n\n- `url`: the URL string to parse.\n\n### Examples\n\n```cel\ngrpc.federation.url.parse(\"https://www.example.com/path?query=value#fragment\")\n```\n\n## parseRequestURI\n\n`parseRequestURI` parses a URL in request context and returns a URL struct.\n\n### Parameters\n\n`parseRequestURI(requestURI string) URL`\n\n- `requestURI`: the URI for a request.\n\n### Examples\n\n```cel\ngrpc.federation.url.parseRequestURI(\"/path?query=value#fragment\")\n```\n\n## URL.scheme\n\n`scheme` returns the scheme of the URL.\n\n### Parameters\n\n`URL.scheme() string`\n\n### Examples\n\n```cel\ngrpc.federation.url.parse(\"https://example.com\").scheme() //=> \"https\"\n```\n\n## URL.opaque\n\n`opaque` returns the opaque part of the URL.\n\n### Parameters\n\n`URL.opaque() string`\n\n### Examples\n\n```cel\ngrpc.federation.url.parse(\"mailto:John.Doe@example.com\").opaque() //=> \"John.Doe@example.com\"\n```\n\n## URL.userinfo\n\n`userinfo` returns the user information in the URL.\n\n### Parameters\n\n`URL.userinfo() Userinfo`\n\n### Examples\n\n```cel\ngrpc.federation.url.parse(\"https://user:pass@example.com\").userinfo() //=> grpc.federation.url.Userinfo{username: \"user\", password: \"pass\"}\n```\n\n## URL.host\n\n`host` returns the host of the URL.\n\n### Parameters\n\n`URL.host() string`\n\n### Examples\n\n```cel\ngrpc.federation.url.parse(\"https://example.com\").host() //=> \"example.com\"\n```\n\n## URL.path\n\n`path` returns the path of the URL.\n\n### Parameters\n\n`URL.path() string`\n\n### Examples\n\n```cel\ngrpc.federation.url.parse(\"https://example.com/path\").path() //=> \"/path\"\n```\n\n## URL.rawPath\n\n`rawPath` returns the raw path of the URL.\n\n### Parameters\n\n`URL.rawPath() string`\n\n### Examples\n\n```cel\ngrpc.federation.url.parse(\"https://example.com/%2Fpath%2F\").rawPath() //=> \"/%2Fpath%2F\"\n```\n\n## URL.forceQuery\n\n`forceQuery` returns the URL string with the ForceQuery field set to true.\n\n### Parameters\n\n`URL.forceQuery() string`\n\n### Examples\n\n```cel\ngrpc.federation.url.parse(\"https://example.com\").forceQuery()\n```\n## URL.rawQuery\n\n`rawQuery` returns the raw query string of the URL.\n\n### Parameters\n\n`URL.rawQuery() string`\n\n### Examples\n\n```cel\ngrpc.federation.url.parse(\"https://example.com?query=value\").rawQuery() //=> \"query=value\"\n```\n\n## URL.fragment\n\n`fragment` returns the fragment of the URL.\n\n### Parameters\n\n`URL.fragment() string`\n\n### Examples\n\n```cel\ngrpc.federation.url.parse(\"https://example.com#fragment\").fragment() //=> \"fragment\"\n```\n\n## URL.rawFragment\n\n`rawFragment` returns the raw fragment of the URL.\n\n### Parameters\n\n`URL.rawFragment() string`\n\n### Examples\n\n```cel\ngrpc.federation.url.parse(\"https://example.com#fragment\").rawFragment() //=> \"fragment\"\n```\n\n## URL.escapedFragment\n\n`escapedFragment` returns the escaped fragment of the URL.\n\n### Parameters\n\n`URL.escapedFragment() string`\n\n### Examples\n\n```cel\ngrpc.federation.url.parse(\"https://example.com#frag ment\").escapedFragment() //=> \"frag%20ment\"\n```\n\n## URL.escapedPath\n\n`escapedPath` returns the escaped path of the URL.\n\n### Parameters\n\n`URL.escapedPath() string`\n\n### Examples\n\n```cel\ngrpc.federation.url.parse(\"https://example.com/path with spaces\").escapedPath() //=> \"/path%20with%20spaces\"\n```\n\n## URL.hostname\n\n`hostname` returns the host name of the URL.\n\n### Parameters\n\n`URL.hostname() string`\n\n### Examples\n\n```cel\ngrpc.federation.url.parse(\"https://example.com:8080\").hostname() //=> \"example.com\"\n```\n\n## URL.isAbs\n\n`isAbs` reports whether the URL is absolute.\n\n### Parameters\n\n`URL.isAbs() bool`\n\n### Examples\n\n```cel\ngrpc.federation.url.parse(\"https://example.com\").isAbs() //=> true\ngrpc.federation.url.parse(\"/path\").isAbs() //=> false\n```\n\n## URL.joinPath\n\n`joinPath` joins the path elements with the URL path.\n\n### Parameters\n\n`URL.joinPath(elements []string) URL`\n\n- `elements`: list of path elements to join with the URL path.\n\n### Examples\n\n```cel\ngrpc.federation.url.parse(\"https://example.com/path\").joinPath([\"to\", \"resource\"]) //=> \"https://example.com/path/to/resource\"\n```\n\n## URL.marshalBinary\n\n`marshalBinary` returns the URL in a binary format.\n\n### Parameters\n\n`URL.marshalBinary() bytes`\n\n### Examples\n\n```cel\ngrpc.federation.url.parse(\"https://example.com\").marshalBinary()\n```\n\n## URL.parse\n\n`parse` parses a URL string in the context of the current URL.\n\n### Parameters\n\n`URL.parse(ref string) URL`\n\n- `ref`: the URL reference string to parse.\n\n### Examples\n\n```cel\ngrpc.federation.url.parse(\"https://example.com/base\").parse(\"/resource\") //=> \"https://example.com/resource\"\n```\n\n## URL.port\n\n`port` returns the port of the URL.\n\n### Parameters\n\n`URL.port() string`\n\n### Examples\n\n```cel\ngrpc.federation.url.parse(\"https://example.com:8080\").port() //=> \"8080\"\n```\n\n## URL.query\n\n`query` returns the parsed query parameters of the URL.\n\n### Parameters\n\n`URL.query() map<string, [string]>`\n\n### Examples\n\n```cel\ngrpc.federation.url.parse(\"https://example.com?key=value&key=another\").query() //=> {\"key\": [\"value\", \"another\"]}\n```\n\n## URL.redacted\n\n`redacted` returns the URL with password part redacted.\n\n### Parameters\n\n`URL.redacted() string`\n\n### Examples\n\n```cel\ngrpc.federation.url.parse(\"https://user:password@example.com\").redacted() //=> \"https://user:xxxxx@example.com\"\n```\n\n## URL.requestURI\n\n`requestURI` returns the request URI of the URL.\n\n### Parameters\n\n`URL.requestURI() string`\n\n### Examples\n\n```cel\ngrpc.federation.url.parse(\"https://example.com/path?query=value\").requestURI() //=> \"/path?query=value\"\n```\n\n## URL.resolveReference\n\n`resolveReference` resolves a reference URL against the base URL.\n\n### Parameters\n\n`URL.resolveReference(ref URL) URL`\n\n- `ref`: the reference URL to resolve.\n\n### Examples\n\n```cel\nbase := grpc.federation.url.parse(\"https://example.com/base\")\nref := grpc.federation.url.parse(\"/resource\")\nbase.resolveReference(ref) //=> \"https://example.com/resource\"\n```\n\n## URL.string\n\n`string` returns the URL as a string.\n\n### Parameters\n\n`URL.string() string`\n\n### Examples\n\n```cel\ngrpc.federation.url.parse(\"https://example.com\").string()\n```\n\n## URL.unmarshalBinary\n\n`unmarshalBinary` unmarshals a binary format URL into a URL struct.\n\n### Parameters\n\n`URL.unmarshalBinary(data bytes) URL`\n\n- `data`: binary format URL data.\n\n### Examples\n\n```cel\nurl := grpc.federation.url.parse(\"https://example.com\")\nbinaryData := url.marshalBinary()\ngrpc.federation.url.parse(\"https://example.com\").unmarshalBinary(binaryData)\n```\n\n# Userinfo Methods\n\n## user\n\n`user` returns a Userinfo object with the provided username.\n\n### Parameters\n\n`user(username string) Userinfo`\n\n- `username`: the username for the userinfo.\n\n### Examples\n\n```cel\ngrpc.federation.url.user(\"user\")\n```\n\n## userPassword\n\n`userPassword` returns a Userinfo object with the provided username and password.\n\n### Parameters\n\n`userPassword(username string, password string) Userinfo`\n\n- `username`: the username for the userinfo.\n- `password`: the password for the userinfo.\n\n### Examples\n\n```cel\ngrpc.federation.url.userPassword(\"user\", \"password\")\n```\n\n## Userinfo.username\n\n`username` returns the username of the Userinfo.\n\n### Parameters\n\n`Userinfo.username() string`\n\n### Examples\n\n```cel\ngrpc.federation.url.user(\"user\").username() //=> \"user\"\n```\n\n## Userinfo.password\n\n`password` returns the password of the Userinfo, if set.\n\n### Parameters\n\n`Userinfo.password() string`\n\n### Examples\n\n```cel\ngrpc.federation.url.userPassword(\"user\", \"password\").password() //=> \"password\"\n```\n\n## Userinfo.passwordSet\n\n`passwordSet` returns true if the password is set for the Userinfo.\n\n### Parameters\n\n`Userinfo.passwordSet() bool`\n\n### Examples\n\n```cel\ngrpc.federation.url.userPassword(\"user\", \"password\").passwordSet() //=> true\ngrpc.federation.url.user(\"user\").passwordSet() //=> false\n```\n\n## Userinfo.string\n\n`string` returns the Userinfo as a string.\n\n### Parameters\n\n`Userinfo.string() string`\n\n### Examples\n\n```cel\ngrpc.federation.url.userPassword(\"user\", \"password\").string() //=> \"user:password\"\ngrpc.federation.url.user(\"user\").string() //=> \"user\"\n```\n"
  },
  {
    "path": "docs/cel/uuid.md",
    "content": "# grpc.federation.uuid APIs\n\nThe API for this package was created based on Go's [`google/uuid`](https://pkg.go.dev/github.com/google/uuid) package.\n\n# Index\n\n## UUID\n\n- [`new`](#new)\n- [`newRandom`](#newrandom)\n- [`newRandomFromRand`](#newrandomfromrand)\n- [`parse`](#parse)\n- [`validate`](#validate)\n- [`UUID.domain`](#uuiddomain)\n- [`UUID.id`](#uuidid)\n- [`UUID.time`](#uuidtime)\n- [`UUID.urn`](#uuidurn)\n- [`UUID.string`](#uuidstring)\n- [`UUID.version`](#uuidversion)\n\n# Types\n\n## UUID\n\nA `UUID` is a 128 bit (16 byte) Universal Unique IDentifier as defined in [RFC 4122](https://www.rfc-editor.org/rfc/rfc4122.html).\n\nFYI: https://pkg.go.dev/github.com/google/uuid#UUID\n\n# Functions\n\n## new\n\n`new` creates a new random `UUID`. `new` is equivalent to the expression.\n\nFYI: https://pkg.go.dev/github.com/google/uuid#New\n\n### Parameters\n\n`new() UUID`\n\n### Examples\n\n```cel\ngrpc.federation.uuid.new()\n```\n\n## newRandom\n\n`newRandom` returns a Random (Version 4) UUID.\n\nFYI: https://pkg.go.dev/github.com/google/uuid#NewRandom\n\n### Parameters\n\n`newRandom() UUID`\n\n### Examples\n\n```cel\ngrpc.federation.uuid.newRandom()\n```\n\n## newRandomFromRand\n\n`newRandomFromRand` returns a `UUID` based on [`grpc.federation.rand.Rand`](./rand.md#rand) instance.\n\nFYI: https://pkg.go.dev/github.com/google/uuid#NewRandomFromReader\n\n### Parameters\n\n`newRandomFromRand(rand grpc.federation.rand.Rand) UUID`\n\n- `rand`: [`grpc.federation.rand.Rand`](./rand.md#rand) instance\n\n### Examples\n\nCreate UUID from fixed seed value.\n\n```cel\ngrpc.federation.uuid.newRandomFromRand(grpc.federation.rand.new(grpc.federation.rand.newSource(10)))\n```\n\n## parse\n\n`parse` returns a `UUID` parsed from x.\n\nFYI: https://pkg.go.dev/github.com/google/uuid#Parse\n\n### Parameters\n\n`parse(x string) UUID`\n\n- `x`: a string\n\n### Examples\n\n```cel\ngrpc.federation.uuid.parse('daa4728d-159f-4fc2-82cf-cae915d54e08')\ngprc.federation.uuid.parse(gprc.federation.uuid.new().string())\n```\n\n## validate\n\n`validate` returns a bool indicating whether the string is a valid UUID.\n\nFYI: https://pkg.go.dev/github.com/google/uuid#Validate\n\n### Parameters\n\n`validate(x string) bool`\n\n- `x`: a string\n\n### Examples\n\n```cel\ngrpc.federation.uuid.validate('daa4728d-159f-4fc2-82cf-cae915d54e08')\ngrpc.federation.uuid.validate('invalid-uuid')\n```\n\n## UUID.domain\n\n`domain` returns the domain for a Version 2 UUID. Domains are only defined for Version 2 UUIDs.\n\nFYI: https://pkg.go.dev/github.com/google/uuid#UUID.Domain\n\n### Parameters\n\n`UUID.domain() uint`\n\n### Examples\n\n```cel\ngrpc.federation.uuid.new().domain()\n```\n\n## UUID.id\n\n`id` returns the id for a Version 2 UUID. IDs are only defined for Version 2 UUIDs.\n\nFYI: https://pkg.go.dev/github.com/google/uuid#UUID.ID\n\n### Parameters\n\n`UUID.id() uint`\n\n### Examples\n\n```cel\ngrpc.federation.uuid.new().id()\n```\n\n## UUID.time\n\n`time` returns the time in 100s of nanoseconds since 15 Oct 1582 encoded in uuid. The time is only defined for version 1 and 2 UUIDs.\n\nFYI: https://pkg.go.dev/github.com/google/uuid#UUID.Time\n\n### Parameters\n\n`UUID.time() int`\n\n### Examples\n\n```cel\ngrpc.federation.uuid.new().time()\n```\n\n## UUID.urn\n\nURN returns the [RFC 2141](https://www.rfc-editor.org/rfc/rfc2141.html) URN form of uuid, urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, or \"\" if uuid is invalid.\n\nFYI: https://pkg.go.dev/github.com/google/uuid#UUID.URN\n\n### Parameters\n\n`UUID.urn() string`\n\n### Examples\n\n```cel\ngrpc.federation.uuid.new().urn()\n```\n\n## UUID.string\n\n`string` returns the string form of uuid, xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx , or \"\" if uuid is invalid.\n\nFYI: https://pkg.go.dev/github.com/google/uuid#UUID.String\n\n### Parameters\n\n`UUID.string() string`\n\n### Examples\n\n```cel\ngrpc.federation.uuid.new().string()\n```\n\n## UUID.version\n\n`version` returns the version of uuid.\n\nFYI: https://pkg.go.dev/github.com/google/uuid#UUID.Version\n\n### Parameters\n\n`UUID.version() uint`\n\n### Examples\n\n```cel\ngrpc.federation.uuid.new().version()\n```\n"
  },
  {
    "path": "docs/cel.md",
    "content": "# gRPC Federation CEL API References\n\nIn the gRPC Federation, you can use `by` to write [CEL(Common Expression Language)](https://github.com/google/cel-spec) expressions.  \n\nFor more information on CEL, [please see here](https://github.com/google/cel-spec/blob/master/doc/langdef.md).\n\n[Here is a list of macros that CEL supports by default](https://github.com/google/cel-spec/blob/master/doc/langdef.md#macros).\n\nIn addition to the standard CEL operations, the gRPC Federation supports a number of its own APIs. This page introduces those APIs.\n\n- [grpc.federation.any APIs](./cel/any.md)\n- [grpc.federation.enum APIs](./cel/enum.md)\n- [grpc.federation.list APIs](./cel/list.md)\n- [grpc.federation.log APIs](./cel/log.md)\n- [grpc.federation.math APIs](./cel/math.md)\n- [grpc.federation.metadata APIs](./cel/metadata.md)\n- [grpc.federation.rand APIs](./cel/rand.md)\n- [grpc.federation.regexp APIs](./cel/regexp.md)\n- [grpc.federation.time APIs](./cel/time.md)\n- [grpc.federation.uuid APIs](./cel/uuid.md)\n\n## Refer to the defined variable\n\nIf you have defined variables using [`def`](#grpcfederationmessagedef) feature, you can use them in CEL.  \nAlso, the message argument should be `$.` can be used to refer to them.\n\n## error\n\n`error` is a reserved word. The `error` variable is used to represent errors in gRPC method calls.\n[The type of the `error` variable is defined here](../proto/grpc/federation/private.proto).\n\n### Example\n\n```proto\nif: \"error.precondition_failures[0].violations[0].subject == 'subject value'\"\n```\n\n### Type Definition\n\n| field | type |\n| ----- | ---- |\n| `code` | int32 |\n| `message` | string |\n| `details` | repeated google.protobuf.Any |\n| `custom_messages` | repeated google.protobuf.Any |\n| `error_info` | repeated google.rpc.ErrorInfo |\n| `retry_info` | repeated google.rpc.RetryInfo |\n| `debug_info` | repeated google.rpc.DebugInfo |\n| `quota_failures` | repeated google.rpc.QuotaFailure |\n| `precondition_failures` | repeated google.rpc.PreconditionFailure |\n| `bad_requests` | repeated google.rpc.BadRequest |\n| `request_info` | repeated google.rpc.RequestInfo |\n| `resource_info` | repeated google.rpc.ResourceInfo |\n| `helps` | repeated google.rpc.Help |\n| `localized_messages` | repeated google.rpc.LocalizedMessage |"
  },
  {
    "path": "docs/cel_plugin.md",
    "content": "# How to extend the CEL API\n\nThis document explains how you can add your own logic as a CEL API and make it available to the gRPC Federation.\n\nWe call this mechanism the CEL Plugin.\n\nThis document is based on [_examples/15_cel_plugin](./../_examples/15_cel_plugin/). If you would like to see a working sample, please refer to that document.\n\n## 1. Write API definitions in ProtocolBuffers\n\nFirst, define in ProtocolBuffers the types, functions you want to provide.\n\n```proto\nsyntax = \"proto3\";\n\npackage example.regexp;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/plugin;pluginpb\";\n\nmessage Regexp {\n  uint64 ptr = 1; // store raw pointer value.\n}\n\noption (grpc.federation.file).plugin.export = {\n  name: \"regexp\"\n  types: [\n    {\n      name: \"Regexp\"\n      methods: [\n        {\n          name: \"matchString\"\n          args { type { kind: STRING } }\n          return { kind: BOOL }\n        }\n      ]\n    }\n  ]\n  functions: [\n    {\n      name: \"compile\"\n      args { type { kind: STRING } }\n      return { message: \"Regexp\" }\n    }\n  ]\n};\n```\n\n`(grpc.federation.file).plugin.export` option is used to define the API. In this example, the plugin is named `regexp`.\n\nThe `regexp` plugin belongs to the `example.regexp` package. Also, this provides the `Regexp` message type and makes `matchString` available as a method on the `Regexp` message, and `compile` function is also added.\n\nIn summary, it contains the following definitions.\n\n- `example.regexp.Regexp` message\n- `example.regexp.Regexp.matchString(string) bool` method\n- `example.regexp.compile(string) example.regexp.Regexp` function\n\nPut this definition in `plugin/plugin.proto` .\n\n## 2. Use the defined CEL API in your BFF\n\nNext, write the code to use the defined API.  \nThe following definition is a sample of adding a gRPC method that compiles the `expr` specified by the `example.regexp.compile` function and returns whether the contents of `target` matches the result.\n\n```proto\nsyntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\nimport \"plugin/plugin.proto\"; // your CEL API definition\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc IsMatch(IsMatchRequest) returns (IsMatchResponse) {};\n}\n\nmessage IsMatchRequest {\n  string expr = 1;\n  string target = 2;\n}\n    \nmessage IsMatchResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"matched\"\n\n      // Use the defined CEL API.\n      by: \"example.regexp.compile($.expr).matchString($.target)\"\n    }\n  };\n  bool result = 1 [(grpc.federation.field).by = \"matched\"];\n}\n```\n\n## 3. Run code generator\n\nRun the gRPC Federation code generator to generate Go language code. At this time, CEL API's schema is verified by the gRPC Federation Compiler, and an error is output if it is used incorrectly.\n\n## 4. Write CEL Plugin code\n\nBy the code generation, the library code is generated to write the plugin. In this example, the output is in `plugin/plugin_grpc_federation.pb.go`.\n\nUsing that library, write a plugin as follows.\n\n```go\npackage main\n\nimport (\n\tpluginpb \"example/plugin\"\n\t\"regexp\"\n\t\"unsafe\"\n)\n\nvar _ pluginpb.RegexpPlugin = new(plugin)\n\ntype plugin struct{}\n\n// For example.regexp.compile function.\nfunc (_ *plugin) Example_Regexp_Compile(ctx context.Context, expr string) (*pluginpb.Regexp, error) {\n\tre, err := regexp.Compile(expr)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &pluginpb.Regexp{\n\t\tPtr: uint32(uintptr(unsafe.Pointer(re))),\n\t}, nil\n}\n\n// For example.regexp.Regexp.matchString method.\nfunc (_ *plugin) Example_Regexp_Regexp_MatchString(ctx context.Context, re *pluginpb.Regexp, s string) (bool, error) {\n\treturn (*regexp.Regexp)(unsafe.Pointer(uintptr(re.Ptr))).MatchString(s), nil\n}\n\nfunc main() {\n\tpluginpb.RegisterRegexpPlugin(new(plugin))\n}\n```\n\n`pluginpb.RegisterRegexpPlugin` function for registering developed plugins. Also, `pluginpb.RegexpPlugin` is interface type for plugin.\n\n## 5. Compile plugin to WebAssembly\n\n```console\n$ GOOS=wasip1 GOARCH=wasm go build -o regexp.wasm ./cmd/plugin\n```\n\n## 6. Calculates sha256 value for the WebAssembly file\n\n```console\n$ sha256sum regexp.wasm\n820f86011519c42da0fe9876bc2ca7fbee5df746acf104d9e2b9bba802ddd2b9  regexp.wasm\n```\n\n## 7. Load plugin ( WebAssembly ) file\n\nInitialize the gRPC server with the path to the wasm file and the sha256 value of the file.\n\n```go\nfederationServer, err := federation.NewFederationService(federation.FederationServiceConfig{\n\tCELPlugin: &federation.FederationServiceCELPluginConfig{\n\t\tRegexp: federation.FederationServiceCELPluginWasmConfig{\n\t\t\tPath:   \"regexp.wasm\",\n\t\t\tSha256: \"820f86011519c42da0fe9876bc2ca7fbee5df746acf104d9e2b9bba802ddd2b9\",\n\t\t},\n\t},\n})\n```\n\n## Resource Capability\n\nBy default, plugins do not have access to Environment variables, File System, or Network. This helps to run plugins securely, but there may be cases where you want to allow access to these resources.\nIn such cases, you can enable access to each resource by configuring as follows:\n\n```proto\noption (grpc.federation.file).plugin.export = {\n  name: \"regexp\"\n  capability {\n    network: {} // enable network access via HTTP/HTTPS\n    env { names: [\"foo\"] } // enable access to `FOO` environment variable\n    file_system { mount_path: \"/\" } // enable access to file system from mount point `/`\n  }\n}\n```\n\nFor more details, please refer to the sample that uses this configuration in [_examples/21_wasm_net](../_examples/21_wasm_net/).\n\n### Env\n\nIf the prefix is `GRPC_FEDERATION_PLUGIN_` , the environment variable will be set for the plugin with that prefix removed. If an environment variable with the same name is already set, it will be overwritten.\nSince setting `GOMAXPROCS` to 2 or higher causes a panic, it is always set to 1.\n\nFor example, if you want to turn off GC for the plugin only, set it like this: `GRPC_FEDERATION_PLUGIN_GOGC=off`\nAt the same time, you need to allow all environment variables via capability, or allow them using a whitelist format.\n\n```proto\noption (grpc.federation.file).plugin.export = {\n  name: \"example\"\n  capability {\n    env { names: [\"gogc\"] } // enable access to `GOGC` environment variable\n  }\n}\n```\n\nor\n\n```proto\noption (grpc.federation.file).plugin.export = {\n  name: \"example\"\n  capability {\n    env { all: true } // enable all environment variable\n  }\n}\n```\n\n\n# How it works\n\nHost and wasm plugin using stdio to exchange data.\nThe exchanged data types are `CELPluginRequest` and `CELPluginResponse` defined on [plugin.proto](https://github.com/mercari/grpc-federation/blob/main/proto/grpc/federation/plugin.proto). Actually, the data is converted to json and then exchanged.\n"
  },
  {
    "path": "docs/code_generation_plugin.md",
    "content": "# How to run your own code generation process\n\ngRPC Federation supports code generation plugin system for running your own code generation process.\n\nThis document is based on [_examples/16_code_gen_plugin](./../_examples/16_code_gen_plugin/). If you would like to see a working sample, please refer it.\n\n## 1. Write code generation process\n\n```go\npackage main\n\nimport (\n\t_ \"embed\"\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\n\t\"github.com/mercari/grpc-federation/grpc/federation/generator\"\n)\n\n//go:embed resolver.go.tmpl\nvar tmpl []byte\n\nfunc main() {\n\treq, err := generator.ToCodeGeneratorRequest(os.Stdin)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tfor _, file := range req.GRPCFederationFiles {\n\t\tfor _, svc := range file.Services {\n\t\t\tfmt.Println(\"service name\", svc.Name)\n\t\t\tfor _, method := range svc.Methods {\n\t\t\t\tfmt.Println(\"method name\", method.Name)\n\t\t\t\tif method.Rule != nil {\n\t\t\t\t\tfmt.Println(\"method timeout\", method.Rule.Timeout)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor _, msg := range file.Messages {\n\t\t\tfmt.Println(\"msg name\", msg.Name)\n\t\t}\n\t}\n\tif err := os.WriteFile(\"resolver_test.go\", tmpl, 0o600); err != nil {\n\t\tlog.Fatal(err)\n\t}\n}\n```\n\nYou can use `embed` library as you would normally write a Go program. Also, since `os.Stdin` is the value of encode [generator.proto](../proto/grpc/federation/generator.proto), you can use `generator.ToCodeGeneratorRequest` API to decode it.\n\n`generator.CodeGeneratorRequest` contains information from the gRPC Federation's analyzing results of the proto file. Therefore, it can be used to implement code generation process you want.\n\n> [!NOTE]\n> The relative path is the directory where the code generation was performed.\n\n## 2. Compile plugin to WebAssembly\n\n```console\n$ GOOS=wasip1 GOARCH=wasm go build -o plugin.wasm ./cmd/plugin\n```\n\n## 3. Calculates sha256 value for the WebAssembly file\n\n```console\n$ sha256sum plugin.wasm\nd010eb2cb5ad1c95d428bfea50dcce918619f4760230588e8c3df95635c992fe  plugin.wasm\n```\n\n## 4. Add `plugins` option\n\nIf you are using `Buf`, add an option in the format `plugins=<url>:<sha256>` to the `grpc-federation` plugin option.\n\n- `<url>`: `http://`, `https://`, `file://` schemes are supported.\n  - `http://` and `https://`: Download and use the specified wasm file.\n  - `file://`: Refer to a file on the local file system. If you start with `/`, the path expected an absolute path.\n\n- `<sha256>`: The content hash of the wasm file. It is used for validation of the wasm file.\n\n- buf.gen.yaml\n\n```yaml\nversion: v1\nmanaged:\n  enabled: true\nplugins:\n  - plugin: go\n    out: .\n    opt: paths=source_relative\n  - plugin: go-grpc\n    out: .\n    opt: paths=source_relative\n  - plugin: grpc-federation\n    out: .\n    opt:\n      - paths=source_relative\n      - plugins=file://plugin.wasm:d010eb2cb5ad1c95d428bfea50dcce918619f4760230588e8c3df95635c992fe\n```\n\nIf you use `grpc-federation.yaml` for code generation, please describe it in the same way.\n\n- grpc-federation.yaml\n\n```yaml\nimports:\n  - proto\nsrc:\n  - proto\nout: .\nplugins:\n  - plugin: go\n    opt: paths=source_relative\n  - plugin: go-grpc\n    opt: paths=source_relative\n  - plugin: grpc-federation\n    opt:\n      - paths=source_relative\n      - plugins=file://plugin.wasm:d010eb2cb5ad1c95d428bfea50dcce918619f4760230588e8c3df95635c992fe\n```\n\n## 5. Run code generator\n\nRun the gRPC Federation code generator.\n\n```console\nbuf generate\n```\n\nor \n\n```console\ngrpc-federation-generator ./proto/federation/federation.proto\n```\n\n## 6. Run your code generator\n\nThe plugin is executed and the `resover_test.go` file is created in the current working directory."
  },
  {
    "path": "docs/getting_started.md",
    "content": "# Getting Started\n\nConsider the example of creating a BFF ( `FederationService` ) that combines and returns the results obtained using the `PostService` and `UserService`.\n\nThis example’s architecture is following.\n\n![arch](https://github.com/mercari/grpc-federation/assets/209884/dbd4a32d-5f63-49eb-b32b-36600c09968e)\n\n1. End-User sends a gRPC request to `FederationService` with `post id`\n2. `FederationService` sends a gRPC request to `PostService`  microservice with `post id` to get `Post` message\n3. `FederationService` sends a gRPC request to `UserService` microservice with the `user_id` present in the `Post` message and retrieves the `User` message\n4. `FederationService` aggregates `Post` and `User` messages and returns it to the End-User as a single message\n\nThe Protocol Buffers file definitions of `PostService` and `UserService` and `FederationService` are as follows.\n\n## PostService\n\n`PostService` has `GetPost` gRPC method. It returns `Post` message.\n\n- post.proto\n\n```proto\npackage post;\n\nservice PostService {\n  rpc GetPost (GetPostRequest) returns (GetPostReply) {}\n}\n\nmessage GetPostRequest {\n  string post_id = 1;\n}\n\nmessage GetPostReply {\n  Post post = 1;\n}\n\nmessage Post {\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  string user_id = 4;\n}\n```\n\n## UserService\n\n`UserService` has `GetUser` gRPC method. It returns `User` message.\n\n- user.proto\n\n```proto\npackage user;\n\nservice UserService {\n  rpc GetUser (GetUserRequest) returns (GetUserReply) {}\n}\n\nmessage GetUserRequest {\n  string user_id = 1;\n}\n\nmessage GetUserReply {\n  User user = 1;\n}\n\nmessage User {\n  string id = 1;\n  string name = 2;\n  int64 age = 3;\n}\n```\n\n## FederationService\n\n`FederationService` has a `GetPost` method that aggregates the `Post` and `User` messages retrieved from `PostService` and `UserService` and returns it as a single message.\n\n- federation.proto\n\n```proto\npackage federation;\n\nservice FederationService {\n  rpc GetPost (GetPostRequest) returns (GetPostReply) {}\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostReply {\n  Post post = 1;\n}\n\nmessage Post {\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  User user = 4;\n}\n\nmessage User {\n  string id = 1;\n  string name = 2;\n  int64 age = 3;  \n}\n```\n\n## 1. Add `grpc.federation.service` option\n\n`grpc.federation.service` option is used to specify a service to generated target using gRPC Federation.  \nTherefore, your first step is to import the gRPC Federation proto file and add the service option.\n\n```diff\n+import \"grpc/federation/federation.proto\";\n\n service FederationService {\n+  option (grpc.federation.service) = {};\n   rpc GetPost (GetPostRequest) returns (GetPostReply) {}\n }\n```\n\n## 2. Add `grpc.federation.message` option to the response message\n\ngRPC Federation focuses on the response message of the gRPC method.\nTherefore, add an option to the `GetPostReply` message, which is the response message of the `GetPost` method, to describe how to construct the response message.\n\n- federation.proto\n\n```diff\n message GetPostReply {\n+  option (grpc.federation.message) = {};\n   Post post = 1;\n }\n```\n\n## 3. Use `def` feature of `grpc.federation.message` option\n\nIn the gRPC Federation, `grpc.federation.message` option creates a variable and `grpc.federation.field` option refers to that variable and assigns a value to the field.\n\nSo first, we use [`def`](https://github.com/mercari/grpc-federation/blob/main/docs/references.md#grpcfederationmessagedef) to define variables.\n\n- federation.proto\n\n```diff\n message GetPostReply {\n   option (grpc.federation.message) = {\n+    def {\n+      name: \"p\"\n+      message {\n+        name: \"Post\"\n+        args { name: \"pid\", by: \"$.id\" }\n+      }\n+    }\n   };\n   Post post = 1;\n }\n```\n\nThe above definition is equivalent to the following pseudo Go code.\n\n```go\n// getGetPostReply returns GetPostReply message by GetPostRequest message.\nfunc getGetPostReply(req *pb.GetPostRequest) *pb.GetPostReply {\n    p := getPost(&PostArgument{Pid: req.GetId()})\n    ...\n}\n\n// getPost returns Post message by PostArgument.\nfunc getPost(arg *PostArgument) *pb.Post {\n    postID := arg.Pid\n    ...\n}\n```\n\n- `name: \"p\"`: It means to create a variable named `p`\n- `message {}`: It means to get message instance\n- `name: \"Post\"`: It means to get `Post` message in `federation` package.\n- `args: {name: \"pid\", by: \"$.id\"}`: It means to retrieve the Post message, to pass as an argument a value whose name is `pid` and whose value is `$.id`.\n\n`$.id` indicates a reference to a message argument. The message argument for a `GetPostReply` message is a `GetPostRequest` message. Therefore, the `\"$.\"` can be used to refer to each field of `GetPostRequest` message.\n\nFor more information on each feature, please refer to the [API Reference](./references.md)\n\n## 4. Add `grpc.federation.field` option to the response message\n\nAssigns the value using `grpc.federation.field` option to a field ( field binding ).\n`p` variable type is a `Post` message type and `Post post = 1` field also `Post` message type. Therefore, it can be assigned as is without type conversion.\n\n```diff\n message GetPostReply {\n   option (grpc.federation.message) = {\n     def {\n       name: \"p\"\n       message {\n         name: \"Post\"\n         args { name: \"pid\", by: \"$.id\" }\n       }\n     }\n   };\n+  Post post = 1 [(grpc.federation.field).by = \"p\"];\n }\n```\n\n## 5. Add `grpc.federation.message` option to the Post message\n\nTo create `GetPostReply` message, `Post` message is required. Therefore, it is necessary to define how to create `Post` message, by adding an gRPC Federation's option to `Post` message as in `GetPostReply` message.\n\n\n```proto\nmessage GetPostReply {\n  option (grpc.federation.message) = {\n    def {\n      name: \"p\"\n      message {\n        name: \"Post\"\n        args { name: \"pid\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"p\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    // call post.PostService/GetPost method with post_id and binds the response message to `res` variable\n    def {\n      name: \"res\"\n      call {\n        method: \"post.PostService/GetPost\"\n        request { field: \"post_id\", by: \"$.pid\" }\n      }\n    }\n\n    // refer to `res` variable and access post field.\n    // Use autobind feature with the retrieved value.\n    def {\n      by: \"res.post\"\n      autobind: true\n    }\n  };\n\n  string id = 1; // binds the value of `res.post.id` by autobind feature\n  string title = 2; // binds the value of `res.post.title` by autobind feature\n  string content = 3; // binds the value of `res.post.content` by autobind feature\n\n  User user = 4; // TODO\n}\n```\n\nIn `def`, besides getting the message, you can call the gRPC method and assign the result to a variable, or get another value from the value of a variable and assign it to a new variable.  \n\nThe first `def` in the `Post` message calls `post.PostService`'s `GetPost` method and assigns the result to the `res` variable.  \n\nThe second `def` in the `Post` message access `post` field of `res` variable and use `autobind` feature for easy field binding.\n\n> [!TIP]\n> [`autobind`](https://github.com/mercari/grpc-federation/blob/main/docs/references.md#grpcfederationmessagedefautobind)\n>\n> If the defined value is a message type and the field of that message type exists in the message with the same name and type, the field binding is automatically performed. If multiple autobinds are used at the same message, you must explicitly use the grpc.federation.field option to do the binding yourself, since duplicate field names cannot be correctly determined as one.\n\n## 6. Add gRPC Federation option to the User message\n\nFinally, since `Post` message depends on `User` message, add an option to `User` message.\n\n```proto\nmessage Post {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"post.PostService/GetPost\"\n        request { field: \"post_id\", by: \"$.pid\" }\n      }\n    }\n    def {\n      // the value of `res.post` assigns to `post` variable.\n      name: \"post\"\n      by: \"res.post\"\n      autobind: true\n    }\n\n    // get User message and assign it to `u` variable.\n    // The `post` variable is referenced to retrieve the `user_id`, and the value is named `uid` as an argument for User message.\n    def {\n      name: \"u\"\n      message {\n        name: \"User\"\n        args { name: \"uid\", by: \"post.user_id\" }\n      }\n    }\n  };\n\n  string id = 1;\n  string title = 2;\n  string content = 3;\n\n  // binds `u` variable to user field.\n  User user = 4 [(grpc.federation.field).by = \"u\"];\n}\n\nmessage User {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"res\"\n        call {\n          method: \"user.UserService/GetUser\"\n          // refer to message arguments with `$.uid`\n          request { field: \"user_id\", by: \"$.uid\" }\n        }\n      },\n      {\n        by: \"res.user\"\n        autobind: true\n      }\n    ]\n  };\n\n  string id = 1;\n  string name = 3;\n  int age = 3;  \n}\n```\n\n## 7. Run code generator\n\nThe final completed proto definition will look like this.\n\n- federation.proto\n\n```proto\npackage federation;\n\nimport \"grpc/federation/federation.proto\";\nimport \"post.proto\";\nimport \"user.proto\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost (GetPostRequest) returns (GetPostReply) {}\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostReply {\n  option (grpc.federation.message) = {\n    def {\n      name: \"p\"\n      message {\n        name: \"Post\"\n        args { name: \"pid\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"p\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"post.PostService/GetPost\"\n        request { field: \"post_id\", by: \"$.pid\" }\n      }\n    }\n    def {\n      name: \"post\"\n      by: \"res.post\"\n      autobind: true\n    }\n    def {\n      name: \"u\"\n      message {\n        name: \"User\"\n        args { name: \"uid\", by: \"post.user_id\" }\n      }\n    }\n  };\n\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  User user = 4 [(grpc.federation.field).by = \"u\"];\n}\n\nmessage User {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"res\"\n        call {\n          method: \"user.UserService/GetUser\"\n          request { field: \"user_id\", by: \"$.uid\" }\n        }\n      },\n      {\n        by: \"res.user\"\n        autobind: true\n      }\n    ]\n  };\n\n  string id = 1;\n  string name = 3;\n  int age = 3;  \n}\n```\n\nNext, generates gRPC server codes using by this `federation.proto`.\n\nFirst, install `grpc-federation-generator`\n\n```console\ngo install github.com/mercari/grpc-federation/cmd/grpc-federation-generator@latest\n```\n\nPuts `federation.proto`, `post.proto`, `user.proto` files to under the `proto` directory.\nAlso, write `grpc-federation.yaml` file to run generator.\n\n- grpc-federation.yaml\n\n```yaml\nimports:\n  - proto\nsrc:\n  - proto\nout: .\n```\n\nRun code generator by the following command.\n\n```console\ngrpc-federation-generator ./proto/federation.proto\n```\n\n## 8. Use generated server\n\nRunning code generation using the `federation.proto` will create a `federation_grpc_federation.pb.go` file under the output path.\n\nIn `federation_grpc_federation.pb.go`, an initialization function ( `NewFederationService` ) for the `FederationService` is created. The server instance initialized using that function can be registered as a gRPC server using the `RegisterFederationService` function defined in `federation_grpc.pb.go` as is.\n\nWhen initializing, you need to create a dedicated `Config` structure and pass.\n\n```go\ntype ClientConfig struct{}\n\nfunc (c *ClientConfig) Post_PostServiceClient(cfg federation.FederationServiceClientConfig) (post.PostServiceClient, error) {\n  // create by post.NewPostServiceClient()\n  ...\n}\n\nfunc (c *ClientConfig) User_UserServiceClient(cfg federation.FederationServiceClientConfig) (user.UserServiceClient, error) {\n  // create by user.NewUserServiceClient()\n  ...\n}\n\nfederationServer, err := federation.NewFederationService(federation.FederationServiceConfig{\n  // Client provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\n  // If this interface is not provided, an error is returned during initialization.\n  Client: new(ClientConfig),\n})\nif err != nil { ... }\ngrpcServer := grpc.NewServer()\nfederation.RegisterFederationServiceServer(grpcServer, federationServer)\n```\n\n`Config` (e.g. `federation.FederationServiceConfig` ) must always be passed a configuration to initialize the gRPC Client, which is needed to invoke the methods on which the federation service depends.\n\nAlso, there are settings for customizing error handling on method calls or logger, etc.\n\n## 9. Other Examples\n\n[A sample that actually works can be found here](../_examples/)\n\n\n\n\n\n"
  },
  {
    "path": "docs/installation.md",
    "content": "# Installation\n\nThere are currently three ways to use gRPC Federation.\n\n1. Use `buf generate`\n2. Use `protoc-gen-grpc-federation`\n3. Use `grpc-federation-generator`\n\n## 1. Use `buf generate`\n\nIf your project can use [Buf](https://buf.build/), this is the easiest way.  \ngRPC Federation is already registered with the Buf Registry.\n\n- Schema: https://buf.build/mercari/grpc-federation\n- Plugin: https://buf.build/community/mercari-grpc-federation\n\nTherefore, if you installed `buf` CLI, you can simply run the `buf generate` command to use gRPC Federation.\n\n[Documentation for Buf's code generation is here](https://buf.build/docs/generate/overview)\n\nHere is a sample of `buf.work.yaml` and `buf.gen.yaml`.\n\n- buf.work.yaml\n\n```yaml\nversion: v1\ndirectories:\n  - proto\n```\n\n- buf.gen.yaml\n\n```yaml\nversion: v1\nmanaged:\n  enabled: true\nplugins:\n  - plugin: go\n    out: gen\n    opt:\n      - paths=source_relative\n  - plugin: go-grpc\n    out: gen\n    opt:\n      - paths=source_relative\n  - plugin: buf.build/community/mercari-grpc-federation:v1.0.0\n    out: gen\n    opt:\n      - paths=source_relative\n```\n\nAlso, place `buf.yaml` under the `proto` directory.\n\n- proto/buf.yaml\n\n```yaml\nversion: v1\ndeps:\n  - buf.build/mercari/grpc-federation\nlint:\n  use:\n    - DEFAULT\nbreaking:\n  use:\n    - FILE\n```\n\nBy writing `buf.build/mercari/grpc-federation` in `deps` section, it will find the gRPC Federation proto file.\n\nFinally, save the following proto as `proto/example.proto` and run `buf generate` to generate the results under `gen` directory.\n\n- proto/example.proto\n\n```proto\nsyntax = \"proto3\";\n\npackage example.bff;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/bff;bff\";\n\nservice BFF {\n  option (grpc.federation.service) = {};\n  rpc Get(GetRequest) returns (GetResponse) {};\n}\n\nmessage GetRequest {}\nmessage GetResponse {\n  option (grpc.federation.message).custom_resolver = true;\n}\n```\n\n## 2. Use protoc-gen-grpc-federation\n\n### 2.1. Install `protoc-gen-grpc-federation`\n\n`protoc-gen-grpc-federation` is a `protoc` plugin made by Go. It can be installed with the following command.\n\n```console\ngo install github.com/mercari/grpc-federation/cmd/protoc-gen-grpc-federation@latest\n```\n\n### 2.2. Put gRPC Federation proto file to the import path\n\nCopy the gRPC Federation proto file to the import path.\ngRPC Federation's proto file is [here](./proto/grpc/federation/federation.proto).\n\nAlso, gRPC Federation depends on the following proto file. These are located in the `proto_deps` directory and should be added to the import path if necessary.\n\n- [`google/rpc/code.proto`](./proto_deps/google/rpc/code.proto)\n- [`google/rpc/error_details.proto`](./proto_deps/google/rpc/error_details.proto)\n\n```console\ngit clone https://github.com/mercari/grpc-federation.git\ncd grpc-federation\ncp -r proto /path/to/proto\ncp -r proto_deps /path/to/proto_deps\n```\n\n### 2.3. Use gRPC Federation proto file in your proto file.\n\n- my_federation.proto\n\n```proto\nsyntax = \"proto3\";\n\npackage mypackage;\n\nimport \"grpc/federation/federation.proto\";\n```\n\n### 2.4. Run `protoc` command with gRPC Federation plugin\n\n```console\nprotoc -I/path/to/proto -I/path/to/proto_deps --grpc-federation_out=. ./path/to/my_federation.proto\n```\n\n## 3. Use `grpc-federation-generator`\n\n`grpc-federation-generator` is an standalone generator that allows you to use the gRPC Federation code generation functionality without `protoc` plugin.\nAlso, the code generated by gRPC Federation depends on the code generated by `protoc-gen-go` and `protoc-gen-go-grpc`, so it generates `file.pb.go` and `file_grpc.pb.go` files at the same time without that plugins. ( This behavior can be optionally disabled )\n\n\n`grpc-federation-generator` also has the ability to monitor changes in proto files and automatically generate them, allowing you to perform automatic generation interactively. Combined with the existing hot-reloader tools, it allows for rapid Go application development.\nThe version of the gRPC Federation proto is the version when `grpc-federation-generator` is built.\n\n### 3.1. Install `grpc-federation-generator`\n\n`grpc-federation-generator` made by Go. It can be installed with the following command.\n\n```console\ngo install github.com/mercari/grpc-federation/cmd/grpc-federation-generator@latest\n```\n\n### 3.2. Write configuration file for `grpc-federation-generator`\n\nParameters to be specified when running `protoc` are described in `grpc-federation.yaml`\n\n- grpc-federation.yaml\n\n```yaml\n# specify import paths.\nimports:\n  - proto\n\n# specify the directory where your proto files are located.\n# In watch mode, files under these directories are recompiled and regenerated immediately when changes are detected.\nsrc:\n  - proto\n\n# specify the destination of gRPC Federation's code-generated output.\nout: .\n\n# specify plugin options to be used during code generation of gRPC Federation.\n# The format of this plugins section is same as [buf.gen.yaml](https://buf.build/docs/configuration/v1/buf-gen-yaml#plugins).\n# Of course, other plugins can be specified, such as `buf.gen.yaml`.\nplugins:\n  - plugin: go\n    opt: paths=source_relative\n  - plugin: go-grpc\n    opt: paths=source_relative\n  - plugin: grpc-federation\n    opt: paths=source_relative\n```\n\n### 3.3. Run `grpc-federation-generator`\n\nIf a proto file is specified, code generation is performed on that file.\n\n```console\ngrpc-federation-generator ./path/to/my_federation.proto\n```\n\nWhen invoked with the `-w` option, it monitors changes to the proto files within the directories specified in `grpc-federation.yaml` and automatically compiles and generates code.\n\n```console\ngrpc-federation-generator -w\n```\n\n> [!NOTE]\n> In the future, we plan to implement a mechanism for code generation by other plugins in combination with `buf.work.yaml` and `buf.gen.yaml` definitions.\n"
  },
  {
    "path": "docs/references.md",
    "content": "# gRPC Federation Feature References\n\n# grpc.federation.service\n\nThe `grpc.federation.service` option is **always required** to enable gRPC Federation. Please specify as follows.\n\n```proto\nservice MyService {\n  option (grpc.federation.service) = {};\n}\n```\n\n| field | type | required or optional |\n| ----- | ---- | ------------------- |\n| [`env`](#grpcfederationserviceenv) | Env | optional |\n| [`var`](#grpcfederationservicevar) | repeated ServiceVariable | optional |\n\n## (grpc.federation.service).env\n\nThe definition of environment variables used by the service.\nThe environment variables defined here can be accessed through the `Get<service-name>Env()` function in the custom resolver. They can also be used by accessing the `grpc.federation.env` variable in CEL expressions.\nWhen using `grpc.federation.env` to access environment variables, the message using the option must exist in the same package as the service that defines the `env` option.\n\nKeep in mind that multiple services within the same package can use the `env` option. However, if a message is employed by multiple services with differing `env` options, that message can only access the set of environment variables that are common to those services.\nFor instance, suppose ServiceA has two environment variables, `ENV_VAR1` and `ENV_VAR2`, while ServiceB has just one, `ENV_VAR1`. If both services reference `Message1`, users can only access `ENV_VAR1` from `Message1`, as ServiceB does not define `ENV_VAR2` in its environment options.\n\n`message` and `var` cannot be used simultaneously.\n\n| field | type | required or optional |\n| ----- | ---- | ------------------- |\n| [`message`](#grpcfederationserviceenvmessage) | string | optional |\n| [`var`](#grpcfederationserviceenvvar) | repeated EnvVar | optional |\n\n## (grpc.federation.service).env.message\n\nIf there is a message that represents a collection of environment variables, you can specify that message.\n\n### Example\n\nIf the following environment variables exist, they can be interpreted and handled as an `Env` message.\n\n- `FOO=hello`\n- `BAR=1`\n\n```proto\nservice MyService {\n  option (grpc.federation.service) = {\n    env { message: \"Env\" }\n  };\n}\n\nmessage Env {\n  string foo = 1;\n  int64 bar = 2;\n}\n```\n\n## (grpc.federation.service).env.var\n\nThe definition of the environment variable.\n\n| field | type | required or optional |\n| ----- | ---- | ------------------- |\n| [`name`](#grpcfederationserviceenvvarname) | string | required |\n| [`type`](#grpcfederationserviceenvvartype) | EnvType | required |\n| [`option`](#grpcfederationserviceenvvaroption) | EnvVarOption | optional |\n\n## (grpc.federation.service).env.var.name\n\nThe name of the environment variable. It is case insensitive.\n\n## (grpc.federation.service).env.var.type\n\nThis represents the types of environment variables.\nAvailable types include primitive types, their repeated types, and map types.\n\n| field | type | required or optional |\n| ----- | ---- | ------------------- |\n| [`kind`](#grpcfederationserviceenvvartypekind) | EnvKind | optional |\n| [`repeated`](#grpcfederationserviceenvvartyperepeated) | EnvType | optional |\n| [`map`](#grpcfederationserviceenvvartypemap) | EnvMapType | optional |\n\n## (grpc.federation.service).env.var.type.kind\n\nIt is used to represent the following primitive types.\n\n- `string`: `STRING`\n- `bool`: `BOOL`\n- `int64`: `INT64`\n- `uint64`: `UINT64`\n- `double`: `DOUBLE`\n- `google.protobuf.Duration`: `DURATION`\n\n### Example\n\nThe following example represents the equivalent of the `int64` type.\n\n```proto\nservice MyService {\n  option (grpc.federation.service) = {\n    env {\n      var {\n        name: \"i64\"\n        type { kind: INT64 }\n      }\n    }\n  };\n}\n```\n\n## (grpc.federation.service).env.var.type.repeated\n\nIt is used to represent the `repeated` type.\n\n### Example\n\nThe following example represents the equivalent of the `repeated string` type.\n\n```proto\nservice MyService {\n  option (grpc.federation.service) = {\n    env {\n      var {\n        name: \"repeated_value\"\n        type {\n          repeated {\n            kind: STRING\n          }\n        }\n      }\n    }\n  };\n}\n```\n\n## (grpc.federation.service).env.var.type.map\n\nIt is used to represent a map type, specifying `EnvType` values for both key and value.\n\n| field | type | required or optional |\n| ----- | ---- | ------------------- |\n| [`key`](#grpcfederationserviceenvvartype) | EnvType | required |\n| [`value`](#grpcfederationserviceenvvartype) | EnvType | required |\n\n### Example\n\nThe following example represents the equivalent of the `map<string, int64>` type.\n\n```proto\nservice MyService {\n  option (grpc.federation.service) = {\n    env {\n      var {\n        name: \"map\"\n        type {\n          map {\n            key { kind: STRING }\n            value { kind: INT64 }\n          }\n        }\n      }\n    }\n  };\n}\n```\n\n## (grpc.federation.service).env.var.option\n\nThese are options for modifying the behavior when reading environment variables.\n\n| field | type | required or optional |\n| ----- | ---- | ------------------- |\n| [`alternate`](#grpcfederationserviceenvvaroptionalternate) | string | optional |\n| [`default`](#grpcfederationserviceenvvaroptiondefault) | string | optional |\n| [`required`](#grpcfederationserviceenvvaroptionrequired) | bool | optional |\n| [`ignored`](#grpcfederationserviceenvvaroptionignored) | bool | optional |\n\n## (grpc.federation.service).env.var.option.alternate\n\nIf you want to refer to an environment variable by a different name than specified by `var.name`, use this option.\n\n## (grpc.federation.service).env.var.option.default\n\nIf you have a value you want to specify in case the environment variable does not exist, use this option.\n\n## (grpc.federation.service).env.var.option.required\n\nMake the existence of the environment variable mandatory.\n\n## (grpc.federation.service).env.var.option.ignored\n\nNo action is taken even if the environment variable exists.\n\n## (grpc.federation.service).var\n\nThis option defines variables at the service level.\nThis definition is executed at server startup, after the initialization of environment variables.\nThe defined variables can be used across all messages that the service depends on.\n\n| field | type | required or optional |\n| ----- | ---- | ------------------- |\n| [`name`](#grpcfederationservicevarname) | string | optional |\n| [`if`](#grpcfederationservicevarif) | [CEL](./cel.md) | optional |\n| [`by`](#grpcfederationservicevarby) | [CEL](./cel.md) | optional |\n| [`map`](#grpcfederationservicevarmap) | MapExpr | optional |\n| [`message`](#grpcfederationservicevarmessage) | MessageExpr | optional |\n| [`enum`](#grpcfederationservicevarenum) | EnumExpr | optional |\n| [`switch`](#grpcfederationservicevarswitch) | SwitchExpr | optional |\n| [`validation`](#grpcfederationservicevarvalidation) | ServiceVariableValidationExpr | optional |\n\n### Example\n\n```proto\nservice MyService {\n  option (grpc.federation.service) = {\n    env {\n      var {\n        // version is '1.0.0'.\n        name: \"version\"\n        type { kind: STRING }\n      }\n    }\n    var {\n      // modified_version is 'v1.0.0'.\n      name: \"modified_version\"\n      by: \"'v' + grpc.federation.env.version\"\n    }\n  };\n  rpc Get(GetRequest) returns (GetResponse) {};\n}\n\nmessage GetResponse {\n  option (grpc.federation.message) = {\n    def {\n      // refer modified_version variable with `grpc.federation.var.` prefix.\n      if: \"grpc.federation.var.modified_version == 'v1.0.0'\"\n    }\n  };\n}\n```\n\n## (grpc.federation.service).var.name\n\nThe `name` is a variable name.\nThis name can be referenced in all CELs related to the service by using `grpc.federation.var.` prefix.\n\n## (grpc.federation.service).var.if\n\nIf `if` is defined, then it is evaluated only if the condition is matched.\nIf does not evaluated, a default value of the type obtained when evaluating is assigned.\n\n## (grpc.federation.service).var.by\n\nBinds the result of evaluating the [CEL](./cel.md) defined in `by` to the variable defined in name.\n\n## (grpc.federation.service).var.map\n\nPlease see [(grpc.federation.message).def.map](#grpcfederationmessagedefmap).\n\n## (grpc.federation.service).var.message\n\nPlease see [(grpc.federation.message).def.message](#grpcfederationmessagedefmessage).\n\n## (grpc.federation.service).var.enum\n\nPlease see [(grpc.federation.message).def.enum](#grpcfederationmessagedefenum).\n\n## (grpc.federation.service).var.switch\n\nPlease see [(grpc.federation.message).def.switch](#grpcfederationmessagedefswitch).\n\n## (grpc.federation.service).var.validation\n\nA validation rule against variables defined within the current scope.\n\n| field | type | required or optional |\n| ----- | ---- | ------------------- |\n| [`if`](#grpcfederationservicevarvalidationif) | [CEL](./cel.md) | required |\n| [`message`](#grpcfederationservicevarvalidationmessage) | [CEL](./cel.md) | required |\n\n## (grpc.federation.service).var.validation.if\n\nA validation rule in [CEL](./cel.md). If the condition is true, the validation returns the error.\nThe return value must always be of type boolean.\n\n## (grpc.federation.service).var.validation.message\n\nA gRPC status message in case of validation error.\n\n# grpc.federation.method\n\n| field | type | required or optional |\n| ----- | ---- | ------------------- |\n| [`timeout`](#grpcfederationmethodtimeout) | string | optional |\n| [`response`](#grpcfederationmethodresponse) | string | optional |\n\n## (grpc.federation.method).timeout\n\nthe time to timeout. If the specified time period elapses, DEADLINE_EXCEEDED status is returned.  \nIf you want to handle this error, you need to implement a custom error handler in Go.  \nThe format is the same as Go's time.Duration format. See https://pkg.go.dev/time#ParseDuration.\n\n### Example\n\n```proto\nservice MyService {\n  option (grpc.federation.service) = {};\n  rpc Get(GetRequest) returns (GetResponse) {\n    option (grpc.federation.method).timeout = \"1m\";\n  };\n}\n```\n\n## (grpc.federation.method).response\n\n`response` specify the name of the message you want to use to create the response value.\nIf you specify a reserved type like `google.protobuf.Empty` as the response, you cannot define gRPC Federation options.\nIn such cases, you can specify a separate message to create the response value.\nThe specified response message must contain fields with the same names and types as all the fields in the original response.\n\n### Example\n\n```proto\nservice MyService {\n  option (grpc.federation.service) = {};\n  rpc Update(UpdateRequest) returns (google.protobuf.Empty) {\n    option (grpc.federation.method).response = \"UpdateResponse\";\n  };\n}\n\nmessage UpdateRequest {\n  string id = 1;\n}\n\nmessage UpdateResponse {\n  option (grpc.federation.message) = {\n    def {\n      call {\n        method: \"pkg.PostService/UpdatePost\"\n        request { field: \"id\" by: \"$.id\" }\n      }\n    }\n  };\n}\n```\n\n# grpc.federation.enum\n\n| field | type | required or optional |\n| ----- | ---- | ------------------- |\n| [`alias`](#grpcfederationenumalias) | string | optional |\n\n## (grpc.federation.enum).alias\n\n`alias` mapping between enums defined in other packages and enums defined on the federation service side.\nThe `alias` is the FQDN ( `<package-name>.<enum-name>` ) to the enum.\nIf this definition exists, type conversion is automatically performed before the enum value assignment operation.\nIf a enum with this option has a value that is not present in the enum specified by alias, and the alias option is not specified for that value, an error is occurred.\n\n### Example\n\n```proto\npackage mypkg;\n\nenum FooEnum {\n  option (grpc.federation.enum).alias = \"foopkg.FooEnum\";\n\n  ENUM_VALUE_1 = 0;\n  ENUM_VALUE_2 = 1;\n}\n```\n\n# grpc.federation.enum_value\n\n| field | type | required or optional |\n| ----- | ---- | ------------------- |\n| [`default`](#grpcfederationenum_valuedefault) | bool | optional |\n| [`alias`](#grpcfederationenum_valuealias) | repeated string | optional |\n| [`noalias`](#grpcfederationenum_valuenoalias) | bool | optional |\n| [`attr`](#grpcfederationenum_valueattr) | repeated EnumValueAttribute | optional |\n\n## (grpc.federation.enum_value).default\n\nSpecifies the default value of the enum.\nAll values other than those specified in alias will be default values.\n\n### Example\n\n- myservice.proto\n\n```proto\npackage mypkg;\n\nimport \"foo.proto\";\n\nenum FooEnum {\n  option (grpc.federation.enum).alias = \"foopkg.FooEnum\";\n\n  ENUM_VALUE_UNKNOWN = 0 [(grpc.federation.enum_value).default = true];\n  ENUM_VALUE_1 = 1 [(grpc.federation.enum_value).alias = \"FOO_VALUE_1\"];\n  ENUM_VALUE_2 = 2 [(grpc.federation.enum_value).alias = \"FOO_VALUE_2\"];\n}\n```\n\n- foo.proto\n\n```proto\npackage foopkg;\n\nenum FooEnum {\n  FOO_VALUE_1 = 0;\n  FOO_VALUE_2 = 1;\n  FOO_VALUE_3 = 2;\n}\n```\n\n## (grpc.federation.enum_value).alias\n\n`alias` can be used when alias is specified in `grpc.federation.enum` option,\nand specifies the value name to be referenced among the enums specified in alias of enum option.\nmultiple value names can be specified for `alias`.\n\n### Example\n\n- myservice.proto\n\n```proto\npackage mypkg;\n\nimport \"foo.proto\";\n\nenum FooEnum {\n  option (grpc.federation.enum).alias = \"foopkg.FooEnum\";\n\n  ENUM_VALUE_1 = 0 [(grpc.federation.enum_value).alias = \"FOO_VALUE_1\"];\n  ENUM_VALUE_2 = 1 [(grpc.federation.enum_value).alias = \"FOO_VALUE_2\"];\n}\n```\n\n- foo.proto\n\n```proto\npackage foopkg;\n\nenum FooEnum {\n  FOO_VALUE_1 = 0;\n  FOO_VALUE_2 = 1;\n}\n```\n\n## (grpc.federation.enum_value).noalias\n\n`noalias` exclude from the target of `alias`.\nThis option cannot be specified simultaneously with `default` or `alias`.\n\n### Example\n\n- myservice.proto\n\n```proto\npackage mypkg;\n\nimport \"foo.proto\";\n\nenum FooEnum {\n  option (grpc.federation.enum).alias = \"foopkg.FooEnum\";\n\n  ENUM_VALUE_1 = 0 [(grpc.federation.enum_value).alias = \"FOO_VALUE_1\"];\n  ENUM_VALUE_2 = 1 [(grpc.federation.enum_value).noalias = true];\n}\n```\n\n## (grpc.federation.enum_value).attr\n\n`attr` is used to hold multiple name-value pairs corresponding to an enum value.\nThe values specified by the name must be consistently specified for all enum values.\nThe values stored using this feature can be retrieved using the [`attr()`](./cel/enum.md#enum-fqdnattr) method of the enum API.\n\n### Example\n\n```proto\npackage mypkg;\n\nmessage Foo {\n  option (grpc.federation.message) = {\n    def { name: \"v\" by: \"Type.value('VALUE_1')\" }\n  };\n  string text = 1 [(grpc.federation.field).by = \"Type.attr(v, 'attr_x')\"];\n}\n\nenum Type {\n  VALUE_1 = 1 [(grpc.federation.enum_value).attr = {\n    name: \"attr_x\"\n    value: \"foo\"\n  }];\n  VALUE_2 = 2 [(grpc.federation.enum_value).attr = {\n    name: \"attr_x\"\n    value: \"bar\"\n  }];\n}\n```\n\n# grpc.federation.message\n\n| field | type | required or optional |\n| ----- | ---- | -------------------- |\n| [`def`](#grpcfederationmessagedef) | repeated VariableDefinition | optional |\n| [`custom_resolver`](#grpcfederationmessagecustom_resolver) | bool | optional |\n| [`alias`](#grpcfederationmessagealias) | string | optional |\n\n## (grpc.federation.message).def\n\n`def` can define variables.  \nThe defined variables can be referenced in subsequent [CEL](./cel.md) field.\nThe `name` is a variable name and `autobind` can be used when the variable is `message` type.\nIt can be used for automatic field binding.\n\nIf `if` is defined, then it is evaluated only if the condition is matched.\nIf does not evaluated, a default value of the type obtained when evaluating is assigned.\n\n| field | type | required or optional |\n| ----- | ---- | -------------------- |\n| [`name`](#grpcfederationmessagedefname) | string | optional |\n| [`autobind`](#grpcfederationmessagedefautobind) | bool | optional |\n| [`if`](#grpcfederationmessagedefif) | [CEL](./cel.md) | optional |\n\nThe value to be assigned to a variable can be created with the following features.\n\n| field | type | required or optional |\n| ----- | ---- | -------------------- |\n| [`by`](#grpcfederationmessagedefby) | [CEL](./cel.md) | optional |\n| [`call`](#grpcfederationmessagedefcall) | CallExpr | optional |\n| [`message`](#grpcfederationmessagedefmessage) | MessageExpr | optional |\n| [`enum`](#grpcfederationmessagedefenum) | EnumExpr | optional |\n| [`map`](#grpcfederationmessagedefmap) | MapExpr | optional |\n| [`switch`](#grpcfederationmessagedefswitch) | SwitchExpr | optional |\n| [`validation`](#grpcfederationmessagedefvalidation) | ValidationExpr | optional |\n\n\n## (grpc.federation.message).def.autobind\n\nIf the defined value is a message type and the field of that message type exists in the message with the same name and type,\nthe field binding is automatically performed.\nIf multiple autobinds are used at the same message,\nyou must explicitly use the `grpc.federation.field` option to do the binding yourself, since duplicate field names cannot be correctly determined as one.\n\n### Example\n\n- myservice.proto\n\n```proto\npackage mypkg;\n\nimport \"foo.proto\";\n\nmessage MyMessage {\n  option (grpc.federation.message) = {\n    def {\n      call { method: \"foopkg.FooService/GetFoo\" }\n\n      // The value returned by `call` is `foopkg.GetFooReply` message.\n      // In this case, if a field with the same name and type as the field in the `GetFooReply` message exists in `MyMessage`,\n      // field binding is automatically performed.\n      autobind: true\n    }\n  };\n\n  string field1 = 1; // autobound from `foopkg.GetFooReply.field1`\n  bool field2 = 2; // autobound from `foopkg.GetFooReply.field2`\n}\n```\n\n- foo.proto\n\n```proto\npackage foopkg;\n\nservice FooService {\n  rpc GetFoo(GetFooRequest) returns (GetFooReply) {};\n}\n\nmessage GetFooReply {\n  string field1 = 1;\n  bool field2 = 2;\n}\n```\n\n## (grpc.federation.message).def.if\n\n### Example\n\n```proto\nmessage MyMessage {\n  option (grpc.federation.message) = {\n    // `x` is assigned `10`\n    def {\n      name: \"x\"\n      if: \"true\"\n      by: \"10\"\n    }\n\n    // `y` is assigned `0`\n    def {\n      name: \"y\"\n      if: \"false\"\n      by: \"10\"\n    }\n  };\n}\n```\n\n## (grpc.federation.message).def.by\n\nBinds the result of evaluating the [CEL](./cel.md) defined in `by` to the variable defined in name.\n\n### Example\n\n```proto\nmessage MyMessage {\n  option (grpc.federation.message) = {\n    def {\n      // variable `v` is assigned the value `6`.\n      name: \"v\"\n      by: \"1 + 2 + 3\"\n    }\n   };\n }\n```\n\n## (grpc.federation.message).def.call\n\n`call` is used to call the gRPC method and assign the result to a variable.\n\n### Example\n\n```proto\nmessage MyMessage {\n  option (grpc.federation.message) = {\n    def {\n      // The type of \"res\" variable is `foopkg.FooService/GetFoo` method's response type.\n      name: \"res\"\n      call {\n        method: \"foopkg.FooService/GetFoo\"\n        request { field: \"field1\", by: \"'abcd'\" }\n      }\n    }\n    // The type of \"foo\" variable is foo's field type of GetFoo's response type.\n    // If the variable type is a message type, `autobind` feature can be used.\n    def { name: \"foo\" by: \"res.foo\" autobind: true }\n   };\n }\n```\n\n### reference\n\n| field | type | required or optional |\n| ----- | ---- | -------------------- |\n| [`method`](#grpcfederationmessagedefcallmethod) | string | required |\n| [`request`](#grpcfederationmessagedefcallrequest) | repeated MethodRequest | optional |\n| [`timeout`](#grpcfederationmessagedefcalltimeout) | string | optional |\n| [`retry`](#grpcfederationmessagedefcallretry) | RetryPolicy | optional |\n| [`error`](#grpcfederationmessagedefcallerror) | repeated GRPCError | optional |\n\n## (grpc.federation.message).def.call.method\n\nSpecify the FQDN for the gRPC method. format is `<package-name>.<service-name>/<method-name>`.\n\n### Example\n\n- myservice.proto\n\n```proto\npackage mypkg;\n\nimport \"foo.proto\";\n\nmessage MyMessage {\n  option (grpc.federation.message) = {\n    def {\n      call {\n        method: \"foopkg.FooService/GetFoo\"\n      }\n    }\n  };\n}\n```\n\n- foo.proto\n\n```proto\npackage foopkg;\n\nservice FooService {\n  rpc GetFoo(GetFooRequest) returns (GetFooReply) {};\n}\n```\n\n## (grpc.federation.message).def.call.request\n\nSpecify the request parameters for the gRPC method.\nThe `field` corresponds to the field name in the request message, and the `by` specifies which value is associated with the field.\n\n### Example\n\n- myservice.proto\n\n```proto\npackage mypkg;\n\nimport \"foo.proto\";\n\nmessage MyMessage {\n  option (grpc.federation.message) = {\n    def {\n      call {\n        method: \"foopkg.FooService/GetFoo\"\n        request: [\n          { field: \"field1\", by: \"'hello'\" }\n        ]\n      }\n    }\n  };\n}\n```\n\n- foo.proto\n\n```proto\npackage foopkg;\n\nservice FooService {\n  rpc GetFoo(GetFooRequest) returns (GetFooReply) {};\n}\n\nmessage GetFooRequest {\n  string field1 = 1;\n}\n```\n\n### reference\n\n| field | type | required or optional |\n| ----- | ---- | -------------------- |\n| [`field`](#grpcfederationmessagedefcallrequestfield) | string | required |\n| [`by`](#grpcfederationmessagedefcallrequestby) | [CEL](./cel.md) | optional |\n\n## (grpc.federation.message).def.call.request.field\n\nThe field name of the request message.\n\n## (grpc.federation.message).def.call.request.by\n\n`by` used to refer to a variable or message argument defined in a `grpc.federation.message` option by [CEL](./cel.md).\nYou need to use `$.` to refer to the message argument.\n\n## (grpc.federation.message).def.call.timeout\n\nThe time to timeout. If the specified time period elapses, DEADLINE_EXCEEDED status is returned.  \nIf you want to handle this error, you need to implement a custom error handler in Go.  \nThe format is the same as Go's time.Duration format. See https://pkg.go.dev/time#ParseDuration.   \n\n### Example\n\n```proto\nmessage MyMessage {\n  option (grpc.federation.message) = {\n    def {\n      call {\n        method: \"foopkg.FooService/GetFoo\"\n        timeout: \"1m\"\n      }\n    }\n  };\n}\n```\n\n## (grpc.federation.message).def.call.retry\n\nSpecify the retry policy if the method call fails.\n\n| field | type | required or optional |\n| ----- | ---- | -------------------- |\n| [`if`](#grpcfederationmessagedefcallretryif) | [CEL](./cel.md) | optional |\n| [`constant`](#grpcfederationmessagedefcallretryconstant) | RetryPolicyConstant | optional |\n| [`exponential`](#grpcfederationmessagedefcallretryexponential) | RetryPolicyExponential | optional |\n\n## (grpc.federation.message).def.call.retry.if\n\n`if` specifies condition in CEL. If the condition is `true`, run the retry process according to the policy.\nIf this field is omitted, it is always treated as `true` and run the retry process.\nThe return value must always be of type `boolean`.\n\n> [!NOTE]\n> Within the `if`, the `error` variable can be used as a gRPC error variable when evaluating CEL.\n> [A detailed description of this variable is here](./cel.md#error)\n\n### Example\n\n```proto\nmessage MyMessage {\n  option (grpc.federation.message) = {\n    def {\n      call {\n        method: \"foopkg.FooService/GetFoo\"\n        retry {\n          if: \"error.code != google.rpc.Code.UNIMPLEMENTED\"\n          constant {\n            interval: \"10s\"\n          }\n        }\n      }\n    }\n  };\n}\n```\n\n## (grpc.federation.message).def.call.retry.constant\n\nRetry according to the \"constant\" policy.\n\n| field | type | required or optional |\n| ----- | ---- | -------------------- |\n| [`inerval`](#grpcfederationmessagedefcallretryconstantinterval) | string | optional |\n| [`max_retries`](#grpcfederationmessagedefcallretryconstantmax_retries) | uint64 | optional |\n\n## (grpc.federation.message).def.call.retry.constant.interval\n\nInterval value. Default value is `1s`.\n\n### Example\n\n```proto\nmessage MyMessage {\n  option (grpc.federation.message) = {\n    def {\n      call {\n        method: \"foopkg.FooService/GetFoo\"\n        retry {\n          constant {\n            interval: \"10s\"\n          }\n        }\n      }\n    }\n  };\n}\n```\n\n## (grpc.federation.message).def.call.retry.constant.max_retries\n\nMax retry count. Default value is `5`. If `0` is specified, it never stops.\n\n### Example\n\n```proto\nmessage MyMessage {\n  option (grpc.federation.message) = {\n    def {\n      call {\n        method: \"foopkg.FooService/GetFoo\"\n        retry {\n          constant {\n            max_retries: 3\n          }\n        }\n      }\n    }\n  };\n}\n```\n\n## (grpc.federation.message).def.call.retry.exponential\n\n| field | type | required or optional |\n| ----- | ---- | -------------------- |\n| [`initial_interval`](#grpcfederationmessagedefcallretryexponentialinitial_interval) | string | optional |\n| [`randomization_factor`](#grpcfederationmessagedefcallretryexponentialrandomization_factor) | double | optional |\n| [`multiplier`](#grpcfederationmessagedefcallretryexponentialmultiplier) | double | optional |\n| [`max_interval`](#grpcfederationmessagedefcallretryexponentialmax_interval) | string | optional |\n| [`max_retries`](#grpcfederationmessagedefcallretryexponentialmax_retries) | uint64 | optional |\n\n## (grpc.federation.message).def.call.retry.exponential.initial_interval\n\nInitial interval value. Default value is `500ms`.\n\n### Example\n\n```proto\nmessage MyMessage {\n  option (grpc.federation.message) = {\n    def {\n      call {\n        method: \"foopkg.FooService/GetFoo\"\n        retry {\n          exponential {\n            initial_interval: \"1s\"\n          }\n        }\n      }\n    }\n  };\n}\n```\n\n## (grpc.federation.message).def.call.retry.exponential.randomization_factor\n\nRandomization factor value. Default value is `0.5`.\n\n### Example\n\n```proto\nmessage MyMessage {\n  option (grpc.federation.message) = {\n    def {\n      call {\n        method: \"foopkg.FooService/GetFoo\"\n        retry {\n          exponential {\n            randomization_factor: 1.0\n          }\n        }\n      }\n    }\n  };\n}\n```\n\n## (grpc.federation.message).def.call.retry.exponential.multiplier\n\nMultiplier. Default value is `1.5`.\n\n### Example\n\n```proto\nmessage MyMessage {\n  option (grpc.federation.message) = {\n    def {\n      call {\n        method: \"foopkg.FooService/GetFoo\"\n        retry {\n          exponential {\n            multiplier: 1.0\n          }\n        }\n      }\n    }\n  };\n}\n```\n\n## (grpc.federation.message).def.call.retry.exponential.max_interval\n\nMax interval value. Default value is `60s`.\n\n### Example\n\n```proto\nmessage MyMessage {\n  option (grpc.federation.message) = {\n    def {\n      call {\n        method: \"foopkg.FooService/GetFoo\"\n        retry {\n          exponential {\n            max_interval: \"30s\"\n          }\n        }\n      }\n    }\n  };\n}\n```\n\n## (grpc.federation.message).def.call.retry.exponential.max_retries\n\nMax retry count. Default value is `5`. If `0` is specified, it never stops.\n\n### Example\n\n```proto\nmessage MyMessage {\n  option (grpc.federation.message) = {\n    def {\n      call {\n        method: \"foopkg.FooService/GetFoo\"\n        retry {\n          exponential {\n            max_retries: 3\n          }\n        }\n      }\n    }\n  };\n}\n```\n\n## (grpc.federation.message).def.call.error\n\n### Example\n\n```proto\nmessage MyMessage {\n  option (grpc.federation.message) = {\n    def {\n      call {\n        method: \"foopkg.FooService/GetFoo\"\n\n        // If an error is returned when the gRPC method is called, the error block is evaluated.\n        // If there are multiple error blocks, they are processed in order from the top.\n        // The first error matching the condition is returned.\n        // If none of the conditions match, the original error is returned.\n        error {\n          // The variables can be defined for use in error blocks\n          def { name: \"a\" by: \"1\" }\n\n          if: \"a == 1\" // if true, returns the error.\n          code: FAILED_PRECONDITION // gRPC error code. this field is required.\n          message: \"'this is error message'\" // gRPC error message. this field is required.\n\n          // If you want to add the more information to the gRPC error, you can specify it in the details block.\n          details {\n            // The variables can be defined for use in details block.\n            def { name: \"b\" by: \"2\" }\n\n            if: \"b == 2\" // if true, add to the error details.\n\n            // You can specify the value defined in `google/rpc/error_details.proto`.\n            // FYI: https://github.com/googleapis/googleapis/blob/master/google/rpc/error_details.proto\n            precondition_failure {\n              violations {\n                type: \"'type value'\"\n                subject: \"'subject value'\"\n                description: \"'desc value'\"\n              }\n            }\n\n            // If you want to add your own message, you can add it using the message name and arguments as follows.\n            message {\n              name: \"CustomMessage\"\n              args { name: \"msg\" by: \"id\" }\n            }\n          }\n        }\n\n        // This error block is evaluated if the above condition is false.\n        error {\n          // If `ignore: true` is specified, the error is ignored.\n          ignore: true\n        }\n      }\n    }\n  };\n}\n```\n\n| field | type | required or optional |\n| ----- | ---- | -------------------- |\n| [`def`](#grpcfederationmessagedef) | repeated VariableDefinition | optional |\n| [`if`](#grpcfederationmessagedefcallerrorif) | [CEL](./cel.md) | optional |\n| [`code`](#grpcfederationmessagedefcallerrorcode) | [google.rpc.Code](../proto_deps/google/rpc/code.proto) | required |\n| [`message`](#grpcfederationmessagedefcallerrormessage) | [CEL](./cel.md) | required |\n| `details` | repeated GRPCErrorDetail | optional |\n| [`ignore`](#grpcfederationmessagedefcallerrorignore) | bool | optional |\n| [`ignore_and_response`](#grpcfederationmessagedefcallerrorignore_and_response) | [CEL](./cel.md) | optional |\n\n> [!NOTE]\n> Within the error block, the `error` variable can be used as a special variable when evaluating CEL.\n> [A detailed description of this variable is here](./cel.md#error)\n\n## (grpc.federation.message).def.call.error.def\n`def` defines a variable scoped to the entire error block.\n\n It is important to note that definitions scoped at the top level of the error block will be evaluated before `error.if`.\n\n## (grpc.federation.message).def.call.error.if\n\n`if` specifies condition in CEL. If the condition is `true`, it returns defined error information.\nIf this field is omitted, it is always treated as `true` and returns defined error information.\nThe return value must always be of type `boolean`.\n\n## (grpc.federation.message).def.call.error.code\n\n`code` is a gRPC status code.\n\n## (grpc.federation.message).def.call.error.message\n\n`message` is a gRPC status message.\nIf omitted, the message will be auto-generated from the configurations.\n\n## (grpc.federation.message).def.call.error.ignore\n\n`ignore` ignore the error if the condition in the `if` field is `true` and `ignore` field is set to `true`.\nWhen an error is ignored, the returned response is always empty value.\nIf you want to return a response that is not empty, please use `ignore_and_response` feature.\nTherefore, `ignore` and `ignore_and_response` cannot be specified same.\n\n### Example\n\n```proto\nmessage MyMessage {\n  option (grpc.federation.message) = {\n    def {\n      call {\n        method: \"foopkg.FooService/GetFoo\"\n\n        error {\n          // dscribe the condition for ignoring error.\n          if: \"error.code == google.rpc.Code.UNAVAILABLE\"\n          ignore: true\n        }\n      }\n    }\n  };\n}\n```\n\nIf you want to define custom processing using the original error value when an error is ignored,\nyou can retrieve the contents of the error by calling the `ignoredError()` method on the return value.\nAdditionally, you can check whether `ignoredError()` can be used by calling `hasIgnoredError()`.\n\n### Example\n\n```proto\nmessage MyMessage {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"foopkg.FooService/GetFoo\"\n\n        error {\n          // dscribe the condition for ignoring error.\n          if: \"error.code == google.rpc.Code.UNAVAILABLE\"\n          ignore: true\n        }\n      }\n    }\n    def {\n      // It returns true if the error was being ignored.\n      if: \"res.hasIgnoredError()\"\n\n      // Binds error code to code variable ( google.rpc.Code.UNAVAILABLE )\n      name: \"code\"\n\n      // Get original error variable by ignoredError method.\n      by: \"res.ignoredError().code\"\n    }\n  };\n}\n```\n\n## (grpc.federation.message).def.call.error.ignore_and_response\n\n`ignore_and_response` ignore the error if the condition in the `if` field is `true` and it returns response specified in CEL.\nThe evaluation value of CEL must always be the same as the response message type.\n`ignore` and `ignore_and_response` cannot be specified same.\n\n### Example\n\n```proto\nmessage MyMessage {\n  option (grpc.federation.message) = {\n    def {\n      call {\n        method: \"foopkg.FooService/GetFoo\"\n\n        error {\n          // dscribe the condition for ignoring error.\n          if: \"error.code == google.rpc.Code.UNAVAILABLE\"\n\n          // specify the response to return when errors are ignored.\n          // The return value must always be a response message.\n          ignore_and_response: \"foopkg.Foo{x: 1}\"\n        }\n      }\n    }\n  };\n}\n```\n\n\n## (grpc.federation.message).def.message\n\n`message` used to refer to other message.  \nThe parameters necessary to obtain a message must be passed as message arguments by `args`.\n\n| field | type | required or optional |\n| ----- | ---- | -------------------- |\n| [`name`](#grpcfederationmessagedefmessagename) | string | required |\n| [`args`](#grpcfederationmessagedefmessageargs) | repeated Argument | optional |\n\n## (grpc.federation.message).def.message.name\n\nSpecify the message name with FQDN. format is `<package-name>.<message-name>`.  \n`<package-name>` can be omitted when referring to messages in the same package.\n\n### Example\n\n```proto\npackage mypkg;\n\nmessage MyMessage {\n  option (grpc.federation.message) = {\n    // get the `Foo` message and assign it to the `foo` variable.\n    def {\n      name: \"foo\"\n      message { name: \"Foo\" }\n    }\n  };\n}\n\nmessage Foo {\n  option (grpc.federation.message).custom_resolver = true;\n\n  string x = 1;\n}\n```\n\n## (grpc.federation.message).def.message.args\n\nSpecify the parameters needed to retrieve the message. This is called the message argument.\n\n### Example\n\n```proto\npackage mypkg;\n\nmessage MyMessage {\n  option (grpc.federation.message) = {\n    def {\n      name: \"foo\"\n      message {\n        name: \"Foo\"\n        // pass arguments to retrieve Foo message.\n        args [\n          { name: \"x\" by: \"'xxxx'\" },\n          { name: \"y\" by: \"true\" }\n        ]\n      }\n    }\n  };\n}\n\nmessage Foo {\n  // $.x is `xxxx` value\n  string x = 1 [(grpc.federation.field).by = \"$.x\"];\n\n  // $.y is `true` value\n  bool y = 2 [(grpc.federation.field).by = \"$.y\"];\n}\n```\n\n### reference\n\n| field | type | required or optional |\n| ----- | ---- | -------------------- |\n| [`name`](#grpcfederationmessagedefmessageargsname) | string | required |\n| [`by`](#grpcfederationmessagedefmessageargsby) | [CEL](./cel.md) | optional |\n| [`inline`](#grpcfederationmessagedefmessageargsinline) | [CEL](./cel.md) | optional |\n\n## (grpc.federation.message).def.message.args.name\n\nName of the message argument.\nUse this name to refer to the message argument.\nFor example, if `foo` is specified as the name, it is referenced by `$.foo` in dependent message.\n\n## (grpc.federation.message).def.message.args.by\n\n`by` used to refer to a variable or message argument defined in a `grpc.federation.message` option by [CEL](./cel.md).\nYou need to use `$.` to refer to the message argument.\n\n## (grpc.federation.message).def.message.args.inline\n\n`inline` like `by`, it refers to the specified value and expands all fields beyond it.\nFor this reason, the referenced value must always be of message type.\n\n## (grpc.federation.message).def.enum\n\n`enum` is a feature designed to create enum values defined in the federation package. If you want to create enum values in the federation package based on enum values defined in a dependency package, this feature will be useful.\n\n### Example\n\nIn this example, the value of `dep.Type.TYPE_1` is converted to the type `mypkg.MyType`. If the conversion fails, it is logged.\n\n```proto\npackage mypkg;\n\nmessage MyMessage {\n  option (grpc.federation.message) = {\n    def {\n      name: \"v\"\n      enum {\n        name: \"MyType\"\n        by: \"dep.Type.TYPE_1\"\n      }\n    }\n    def {\n      if: \"v == MyType.TYPE_UNSPECIFIED\"\n      by: \"grpc.federation.log.warn('got unexpected type')\"\n    }\n  };\n}\n\nenum MyType {\n  option (grpc.federation.enum).alias = \"dep.Type\";\n\n  TYPE_UNSPECIFIED = 1 [(grpc.federation.enum_value).default = true];\n  TYPE_1 = 2;\n  TYPE_2 = 3;\n}\n```\n\n```proto\npackage dep;\n\nenum Type {\n  TYPE_1 = 1;\n  TYPE_2 = 2;\n}\n```\n\n## (grpc.federation.message).def.map\n\n| field | type | required or optional |\n| ----- | ---- | -------------------- |\n| [`iterator`](#grpcfederationmessagedefmapiterator) | Iterator | required |\n| [`by`](#grpcfederationmessagedefmapby) | [CEL](./cel.md) | optional |\n| [`message`](#grpcfederationmessagedefmapmessage) | MessageExpr | optional |\n| [`enum`](#grpcfederationmessagedefmapenum) | EnumExpr | optional |\n\n## (grpc.federation.message).def.map.iterator\n\nCreate the iterator variable.\n\n- `src` must be a repeated type\n- `name` defines the name of the iterator variable\n\n### Example\n\n```proto\nmessage MyMessage {\n  option (grpc.federation.message) = {\n    def {\n      name: \"foo_list\"\n      message { name: \"FooList\" }\n    }\n    def {\n      // `list_x` value is a list of Foo.x. The type is repeated string.\n      name: \"list_x\"\n      map {\n        iterator {\n          // iterator variable name is `iter`.\n          name: \"iter\"\n\n          // refer to FooList message's `foos` field.\n          src: \"foo_list.foos\"\n        }\n\n        // refer to `iter` variable and returns x field value.\n        by: \"iter.x\"\n      }\n    }\n  };\n}\n\nmessage FooList {\n  option (grpc.federation.message).custom_resolver = true;\n\n  repeated Foo foos = 1;\n}\n\nmessage Foo {\n  string x = 1;\n}\n```\n\n### reference\n\n| field | type | required or optional |\n| ----- | ---- | -------------------- |\n| [`name`](#grpcfederationmessagedefmapiteratorname) | string | required |\n| [`src`](#grpcfederationmessagedefmapiteratorsrc) | [CEL](./cel.md) | required |\n\n## (grpc.federation.message).def.map.iterator.name\n\nThe name of the iterator variable.\n\n## (grpc.federation.message).def.map.iterator.src\n\nThe variable of repeated type that form the basis of iterator.\n\n## (grpc.federation.message).def.map.by\n\nCreate map elements using [`CEL`](./cel.md) by referencing variables created with `iterator` section.\n\n## (grpc.federation.message).def.map.message\n\nCreate map elements using `message` value by referencing variables created with `iterator` section.\n\n## (grpc.federation.message).def.map.enum\n\nCreate map elements using `enum` value by referencing variables created with `iterator` section.\n\n## (grpc.federation.message).def.switch\n\n`switch` evaluates cases in order and returns the value from the first matching case, or the default case, if no case matches.\n\n| field                                               | type                    | required or optional |\n| --------------------------------------------------- | ----------------------- | -------------------- |\n| [`case`](#grpcfederationmessagedefswitchcase)       | repeated SwitchCaseExpr | optional             |\n| [`default`](#grpcfederationmessagedefswitchdefault) | SwitchDefaultExpr       | required             |\n\n### Example\n\n```proto\nmessage MyMessage {\n  option (.grpc.federation.message) = {\n    def {\n      name: \"status\"\n      switch {\n        case { \n          if: \"$.activation_status == 'active'\" \n          by: \"'enabled'\" \n        }\n        case { \n          if: \"$.activation_status == 'inactive'\" \n          by: \"'disabled'\" \n        }\n        default { by: \"'unknown'\" }\n      }\n    }\n  };\n  string status = 1 [(grpc.federation.field).by = \"status\"];\n}\n```\n\n## (grpc.federation.message).def.switch.case\n\nA single case in a `switch` expression. Cases are evaluated in order, and the first case whose `if` condition evaluates to `true` will have its `by` expression evaluated and the resulting value returned as the value of the `switch`.\n\n| field                                         | type                        | required or optional |\n| --------------------------------------------- | --------------------------- | -------------------- |\n| [`def`](#grpcfederationmessagedef)            | repeated VariableDefinition | optional             |\n| [`if`](#grpcfederationmessagedefswitchcaseif) | [CEL](./cel.md)             | required             |\n| [`by`](#grpcfederationmessagedefswitchcaseby) | [CEL](./cel.md)             | required             |\n\n## (gprc.federation.message).def.switch.case.def\n\n`def` defines a variable scoped to the case block.\n\n It is important to note that definitions scoped at the top level of the case block will be evaluated after `case.if` and before `case.by`.\n\n## (grpc.federation.message).def.switch.case.if\n\nA condition in [CEL](./cel.md) that determines whether this case matches. The return value must always be of type boolean. If the condition evaluates to `true`, the case matches and its `by` expression is evaluated.\n\n## (grpc.federation.message).def.switch.case.by\n\nA [CEL](./cel.md) expression that is evaluated when this case matches. The result of this expression is returned as the value of the `switch` expression.\n\n## (grpc.federation.message).def.switch.default\n\nThe default case that is evaluated when none of the switch cases match. Variables local to the scope of the default case can be defined in `def`.\n\n| field                                            | type                        | required or optional |\n| ------------------------------------------------ | --------------------------- | -------------------- |\n| [`def`](#grpcfederationmessagedef)               | repeated VariableDefinition | optional             |\n| [`by`](#grpcfederationmessagedefswitchdefaultby) | [CEL](./cel.md)             | required             |\n\n## (gprc.federation.message).def.switch.default.def\n\n`def` defines a variable scoped to the default block.\n\n It is important to note that definitions scoped at the top level of the default block will be evaluated before `case.by`.\n\n## (grpc.federation.message).def.switch.default.by\n\nA [CEL](./cel.md) expression that is evaluated when no switch case matches. The result of this expression is returned as the value of the `switch` expression.\n\n## (grpc.federation.message).def.validation\n\nA validation rule against variables defined within the current scope.\n\n| field                                               | type            | required or optional |\n|-----------------------------------------------------|-----------------|----------------------|\n| [`name`](#grpcfederationmessagedefvalidationname)   | string          | optional             |\n| [`error`](#grpcfederationmessagedefvalidationerror) | ValidationError | required             |\n\n## (grpc.federation.message).def.validation.name\nA unique name for the validation.\nIf set, the validation error type will be <message-name><name>Error.\nIf omitted, the validation error type will be ValidationError.\n\n## (grpc.federation.message).def.validation.error\n\nA validation rule and validation error to be returned. Variables local to the scope of the validation error can be defined with `def`.\n\n| field                                                        | type                           | required or optional |\n|--------------------------------------------------------------|--------------------------------|----------------------|\n| [`def`](#grpcfederationmessagedef)                           | repeated VariableDefinition    | optional             | \n| [`code`](#grpcfederationmessagedefvalidationerrorcode)       | [google.rpc.Code](../proto_deps/google/rpc/code.proto) | required |\n| [`message`](#grpcfederationmessagedefvalidationerrormessage) | string                         | optional             |\n| [`if`](#grpcfederationmessagedefvalidationerrorif)           | [CEL](./cel.md)                | optional             |\n| [`details`](#grpcfederationmessagedefvalidationerrordetails) | repeated ValidationErrorDetail | optional             |\n\n## (grpc.federation.message).def.validation.error.def\n`def` defines a variable scoped to the error block.\n\nIt is important to note that definitions scoped at the top level of the error block will be evaluated before `error.if`.\n\n## (grpc.federation.message).def.validation.error.code\nA gRPC status code to be returned in case of validation error. For the available Enum codes, check [googleapis/google/rpc /code.proto](https://github.com/googleapis/googleapis/blob/89b562b76f5b215990a20d3ea08bc6e1c0377906/google/rpc/code.proto#L32-L186).\n\n## (grpc.federation.message).def.validation.error.message\nA gRPC status message in case of validation error. If omitted, the message will be auto-generated from the configurations.\n\n## (grpc.federation.message).def.validation.error.if\nA validation rule in [CEL](./cel.md). If the condition is true, the validation returns the error.\nThe return value must always be of type boolean. Either `if` or `details` must be specified.\n\n### Example\n\n```proto\nmessage MyMessage {\n  option (grpc.federation.message) = {\n    def {\n      validation {\n        name: \"myMessageValidation\",\n        error {\n          code: FAILED_PRECONDITION\n          message: \"MyMessage validation failed\",\n          if: \"$.id == 'wrong'\"\n        }\n      }\n    }\n  };\n  ...\n}\n```\n\n## (grpc.federation.message).def.validation.error.details\n\n`details` is a list of validation rules and error details. If the validation fails, the corresponding error details are set.\nEither `if` or `details` must be specified. The other error detail types will be supported soon.\n\n| field                                                                                        | type                                    | required or optional |\n|----------------------------------------------------------------------------------------------|-----------------------------------------|----------------------|\n| [`def`](#grpcfederationmessagedef)                           | repeated VariableDefinition   | optional                                | \n| [`if`](#grpcfederationmessagedefvalidationerrordetailsif)                                    | [CEL](./cel.md)                                     | required             |\n| [`by`](#grpcfederationmessagedefvalidationerrordetailsby)                                    | repeated [CEL](./cel.md)                         | optional             |\n| [`message`](#grpcfederationmessagedefvalidationerrordetailsmessage)                          | repeated MessageExpr                    | optional             |\n| [`precondition_failure`](#grpcfederationmessagedefvalidationerrordetailspreconditionfailure) | repeated google.rpc.PreconditionFailure | optional             |\n| [`bad_request`](#grpcfederationmessagedefvalidationerrordetailsbadrequest)                   | repeated google.rpc.BadRequest          | optional             |\n| [`localized_message`](#grpcfederationmessagedefvalidationerrordetailslocalizedmessage)       | repeated google.rpc.LocalizedMessage    | optional             |\n\n```proto\nmessage MyMessage {\n  option (grpc.federation.message) = {\n    def {\n      validation {\n        name: \"myMessageValidation\",\n        error {\n          code: FAILED_PRECONDITION\n          message: \"MyMessage validation failed\",\n          details {\n            if: \"$.id == 'wrong'\",\n            by: \"pkg.Message{field: value}\"\n            message {\n              name: \"ErrorMessage\",\n              args {\n                name: \"message\",\n                by: \"'some message'\"\n              }\n            }\n            precondition_failure {\n              violations {\n                type: \"'some-type'\"\n                subject: \"'some-subject'\"\n                description: \"'some-desc'\"\n              }\n            }\n            bad_request {\n              field_violations {\n                field: \"'some-field'\"\n                description: \"'some-desc'\"\n              }\n            }\n            localized_message {\n              locale: \"en-US\"\n              message: \"'some message'\"\n            }\n          }\n        }\n      }\n    }\n  };\n  ...\n}\n```\n\n## (grpc.federation.message).def.validation.error.details.def\n`def` defines a variable scoped to the error details block.\n\nIt is important to note that definitions scoped at the top level of the error detail block will be evaluated before `details.if`.\n\n## (grpc.federation.message).def.validation.error.details.if\n\n`if` specifies validation rule in [CEL](./cel.md). If the condition is true, the validation returns an error with the specified details.\n\n## (grpc.federation.message).def.validation.error.details.by\n\n`by` specify a message in [CEL](./cel.md) to express the details of the error.\n\n## (grpc.federation.message).def.validation.error.details.message\n\n`message` represents arbitrary proto messages to describe the error detail.\n\n## (grpc.federation.message).def.validation.error.details.precondition_failure\n\n`precondition_failure` describes what preconditions have failed. See [google.rpc.PreconditionFailure](https://github.com/googleapis/googleapis/blob/89b562b76f5b215990a20d3ea08bc6e1c0377906/google/rpc/error_details.proto#L144) for the details.\n\n## (grpc.federation.message).def.validation.error.details.bad_request\n\n`bad_request` describes violations in a client request. See [google.rpc.BadRequest](https://github.com/googleapis/googleapis/blob/89b562b76f5b215990a20d3ea08bc6e1c0377906/google/rpc/error_details.proto#L170) for the details.\n\n## (grpc.federation.message).def.validation.error.details.localized_message\n\n`localized_message` provides a localized error message that is safe to return to the user. See [google.rpc.BadRequest](https://github.com/googleapis/googleapis/blob/89b562b76f5b215990a20d3ea08bc6e1c0377906/google/rpc/error_details.proto#L277) for the details.\n\n## (grpc.federation.message).custom_resolver\n\nThere is a limit to what can be expressed in proto, so if you want to execute a process that cannot be expressed in proto, you will need to implement it yourself in the Go language.  \n\nIf custom_resolver is true, the resolver for this message is implemented by Go.\nIf there are any values retrieved by `def`, they are passed as arguments for custom resolver.\nEach field of the message returned by the custom resolver is automatically bound.\nIf you want to change the binding process for a particular field, set `custom_resolver=true` option for that field.\n\n### Example\n\n```proto\nmessage Foo {\n  option (grpc.federation.message).custom_resolver = true;\n}\n```\n\nor\n\n```proto\nmessage Foo {\n  User user = 1 [(grpc.federation.field).custom_resolver = true];\n}\n```\n\n## (grpc.federation.message).alias\n\n`alias` mapping between messages defined in other packages and messages defined on the federation service side.\nThe `alias` is the FQDN ( `<package-name>.<message-name>` ) to the message.\nIf this definition exists, type conversion is automatically performed before the field assignment operation.\nIf a message with this option has a field that is not present in the message specified by alias, and the alias option is not specified for that field, an error is occurred.\n\n# grpc.federation.field\n\n| field | type | required or optional |\n| ----- | ---- | -------------------- |\n| [`by`](#grpcfederationfieldby) | string | optional |\n| [`oneof`](#grpcfederationfieldoneof) | FieldOneof | optional |\n| [`custom_resolver`](#grpcfederationfieldcustom_resolver) | bool | optional |\n| [`alias`](#grpcfederationfieldalias) | string | optional |\n\n## (grpc.federation.field).by\n\n`by` used to refer to a variable or message argument defined in a `grpc.federation.message` option by [CEL](./cel.md).\nYou need to use `$.` to refer to the message argument.\n\n## (grpc.federation.field).oneof\n\n`oneof` used to directly assign a value to a field defined by `oneof`.\n\n| field | type | required or optional |\n| ----- | ---- | -------------------- |\n| [`if`](#grpcfederationfieldoneofif) | [CEL](./cel.md) | optional |\n| [`default`](#grpcfederationfieldoneofdefault) | bool | optional |\n| [`def`](#grpcfederationfieldoneofdef) | repeated VariableDefinition | optional |\n| [`by`](#grpcfederationfieldoneofby) | [CEL](./cel.md) | optional |\n\n## (grpc.federation.field).oneof.if\n\n`if` is the condition to be assigned to oneof field.\nThe return value must be of bool type.\n\n## (grpc.federation.field).oneof.default\n\n`default` used to assign a value when none of the other fields match any of the specified expressions.\nOnly one value can be defined per oneof.\n\n## (grpc.federation.field).oneof.def\n\n`def` defines the list of variables to which the oneof field refers.\n\n## (grpc.federation.field).oneof.by\n\n`by` used to refer to a variable or message argument defined in a `grpc.federation.message` and `grpc.federation.field.oneof` by [CEL](./cel.md).\nYou need to use `$.` to refer to the message argument.\n\n## (grpc.federation.field).custom_resolver\n\nIf custom_resolver is true, the field binding process is to be implemented in Go.\nIf there are any values retrieved by `grpc.federation.message` option, they are passed as arguments for custom resolver.\n\n## (grpc.federation.field).alias\n\n`alias` can be used when `alias` is specified in `grpc.federation.message` option,\nand specifies the field name to be referenced among the messages specified in `alias` of message option.\nIf the specified field has the same type or can be converted automatically, its value is assigned.\n\n# Message Argument\n\nMessage argument is an argument passed when depends on other messages via the `def.message` feature. This parameter propagates the information necessary to resolve message dependencies.\n\nNormally, only values explicitly specified in `args` can be referenced as message arguments.\n\nHowever, exceptionally, a field in the gRPC method's request message can be referenced as a message argument to the method's response.\n\nFor example, consider the `GetPost` method of the `FederationService`: the `GetPostReply` message implicitly allows the fields of the `GetPostRequest` message to be used as message arguments.\n\nIn summary, it looks like this.\n\n1. For the response message of rpc, the request message fields are the message arguments.\n2. For other messages, the parameters explicitly passed in `def.message.args` option are the message arguments.\n3. You can access to the message argument with `$.` prefix.\n"
  },
  {
    "path": "generator/code_generator.go",
    "content": "package generator\n\nimport (\n\t\"bytes\"\n\t\"embed\"\n\t\"errors\"\n\t\"fmt\"\n\t\"go/format\"\n\t\"log\"\n\t\"log/slog\"\n\t\"sort\"\n\t\"strings\"\n\t\"text/template\"\n\n\t\"golang.org/x/text/cases\"\n\t\"golang.org/x/text/language\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\t\"github.com/mercari/grpc-federation/resolver\"\n\t\"github.com/mercari/grpc-federation/types\"\n\t\"github.com/mercari/grpc-federation/util\"\n)\n\ntype CodeGenerator struct {\n}\n\nfunc NewCodeGenerator() *CodeGenerator {\n\treturn &CodeGenerator{}\n}\n\nfunc (g *CodeGenerator) Generate(file *resolver.File) ([]byte, error) {\n\ttmpl, err := loadTemplate()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn generateGoContent(tmpl, NewFile(file))\n}\n\ntype File struct {\n\t*resolver.File\n\tpkgMap   map[*resolver.GoPackage]struct{}\n\taliasMap map[*resolver.GoPackage]string\n}\n\nfunc NewFile(file *resolver.File) *File {\n\treturn &File{\n\t\tFile:     file,\n\t\tpkgMap:   make(map[*resolver.GoPackage]struct{}),\n\t\taliasMap: make(map[*resolver.GoPackage]string),\n\t}\n}\n\nfunc (f *File) Version() string {\n\treturn grpcfed.Version\n}\n\nfunc (f *File) Source() string {\n\treturn f.Name\n}\n\nfunc (f *File) Services() []*Service {\n\tret := make([]*Service, 0, len(f.File.Services))\n\tfor _, svc := range f.File.Services {\n\t\tret = append(ret, newService(svc, f))\n\t}\n\treturn ret\n}\n\ntype CELPlugin struct {\n\tfile *File\n\t*resolver.CELPlugin\n}\n\nfunc (p *CELPlugin) FederationVersion() string {\n\treturn grpcfed.Version\n}\n\nfunc (p *CELPlugin) FieldName() string {\n\treturn util.ToPublicGoVariable(p.Name)\n}\n\nfunc (p *CELPlugin) PluginName() string {\n\treturn fmt.Sprintf(\"%sPlugin\", util.ToPublicGoVariable(p.Name))\n}\n\nfunc (p *CELPlugin) Functions() []*CELFunction {\n\tret := make([]*CELFunction, 0, len(p.CELPlugin.Functions))\n\tfor _, fn := range p.CELPlugin.Functions {\n\t\tret = append(ret, &CELFunction{\n\t\t\tfile:        p.file,\n\t\t\tCELFunction: fn,\n\t\t})\n\t}\n\treturn ret\n}\n\ntype CELFunction struct {\n\tfile *File\n\t*resolver.CELFunction\n\toverloadIdx int\n}\n\nfunc (f *CELFunction) GoName() string {\n\tfuncName := f.CELFunction.Name\n\tif f.overloadIdx != 0 {\n\t\tfuncName += fmt.Sprint(f.overloadIdx + 1)\n\t}\n\tif f.Receiver != nil {\n\t\treturn protoFQDNToPublicGoName(fmt.Sprintf(\"%s.%s\", f.Receiver.FQDN(), funcName))\n\t}\n\treturn protoFQDNToPublicGoName(funcName)\n}\n\nfunc (f *CELFunction) Name() string {\n\tfuncName := f.CELFunction.Name\n\tif f.Receiver != nil {\n\t\treturn protoFQDNToPublicGoName(fmt.Sprintf(\"%s.%s\", f.Receiver.FQDN(), funcName))\n\t}\n\treturn protoFQDNToPublicGoName(funcName)\n}\n\nfunc (f *CELFunction) IsMethod() bool {\n\treturn f.CELFunction.Receiver != nil\n}\n\nfunc (f *CELFunction) ExportName() string {\n\treturn f.ID\n}\n\nfunc (f *CELFunction) Args() []*CELFunctionArgument {\n\tret := make([]*CELFunctionArgument, 0, len(f.CELFunction.Args))\n\tfor _, arg := range f.CELFunction.Args {\n\t\targ := arg\n\t\tret = append(ret, &CELFunctionArgument{\n\t\t\ttypeFunc: func() string {\n\t\t\t\treturn f.file.toTypeText(arg)\n\t\t\t},\n\t\t\tfile: f.file,\n\t\t\targ:  arg,\n\t\t})\n\t}\n\treturn ret\n}\n\nfunc (f *CELFunction) Return() *CELFunctionReturn {\n\treturn &CELFunctionReturn{\n\t\ttypeFunc: func() string {\n\t\t\treturn f.file.toTypeText(f.CELFunction.Return)\n\t\t},\n\t\tret:  f.CELFunction.Return,\n\t\tfile: f.file,\n\t}\n}\n\ntype CELFunctionArgument struct {\n\ttypeFunc func() string\n\tfile     *File\n\targ      *resolver.Type\n}\n\nfunc (f *CELFunctionArgument) Type() string {\n\treturn f.typeFunc()\n}\n\nfunc (f *CELFunctionArgument) CELType() string {\n\treturn toCELTypeDeclare(f.arg)\n}\n\nfunc (f *CELFunctionArgument) Converter() string {\n\tif f.arg.Repeated {\n\t\tswitch f.arg.Kind {\n\t\tcase types.Double:\n\t\t\treturn \"ToFloat64List\"\n\t\tcase types.Float:\n\t\t\treturn \"ToFloat32List\"\n\t\tcase types.Int32, types.Sint32, types.Sfixed32:\n\t\t\treturn \"ToInt32List\"\n\t\tcase types.Int64, types.Sint64, types.Sfixed64:\n\t\t\treturn \"ToInt64List\"\n\t\tcase types.Uint32, types.Fixed32:\n\t\t\treturn \"ToUint32List\"\n\t\tcase types.Uint64, types.Fixed64:\n\t\t\treturn \"ToUint64List\"\n\t\tcase types.Bool:\n\t\t\treturn \"ToBoolList\"\n\t\tcase types.String:\n\t\t\treturn \"ToStringList\"\n\t\tcase types.Bytes:\n\t\t\treturn \"ToBytesList\"\n\t\tcase types.Enum:\n\t\t\tcloned := f.arg.Clone()\n\t\t\tcloned.Repeated = false\n\t\t\tenum := f.file.toTypeText(cloned)\n\t\t\treturn fmt.Sprintf(\"ToEnumList[%s]\", enum)\n\t\tcase types.Message:\n\t\t\tcloned := f.arg.Clone()\n\t\t\tcloned.Repeated = false\n\t\t\tmsg := f.file.toTypeText(cloned)\n\t\t\treturn fmt.Sprintf(\"ToMessageList[%s]\", msg)\n\t\t}\n\t}\n\tswitch f.arg.Kind {\n\tcase types.Double:\n\t\treturn \"ToFloat64\"\n\tcase types.Float:\n\t\treturn \"ToFloat32\"\n\tcase types.Int32, types.Sint32, types.Sfixed32:\n\t\treturn \"ToInt32\"\n\tcase types.Int64, types.Sint64, types.Sfixed64:\n\t\treturn \"ToInt64\"\n\tcase types.Uint32, types.Fixed32:\n\t\treturn \"ToUint32\"\n\tcase types.Uint64, types.Fixed64:\n\t\treturn \"ToUint64\"\n\tcase types.Bool:\n\t\treturn \"ToBool\"\n\tcase types.String:\n\t\treturn \"ToString\"\n\tcase types.Bytes:\n\t\treturn \"ToBytes\"\n\tcase types.Enum:\n\t\tenum := f.file.toTypeText(f.arg)\n\t\treturn fmt.Sprintf(\"ToEnum[%s]\", enum)\n\tcase types.Message:\n\t\tmsg := f.file.toTypeText(f.arg)\n\t\treturn fmt.Sprintf(\"ToMessage[%s]\", msg)\n\t}\n\treturn \"\"\n}\n\ntype CELFunctionReturn struct {\n\ttypeFunc func() string\n\tfile     *File\n\tret      *resolver.Type\n}\n\nfunc (r *CELFunctionReturn) Type() string {\n\treturn r.typeFunc()\n}\n\nfunc (r *CELFunctionReturn) CELType() string {\n\treturn toCELTypeDeclare(r.ret)\n}\n\nfunc (r *CELFunctionReturn) FuncName() string {\n\treturn util.ToPublicGoVariable(r.ret.Kind.ToString())\n}\n\nfunc (r *CELFunctionReturn) Converter() string {\n\tif r.ret.Repeated {\n\t\tswitch r.ret.Kind {\n\t\tcase types.Double:\n\t\t\treturn \"ToFloat64ListCELPluginResponse\"\n\t\tcase types.Float:\n\t\t\treturn \"ToFloat32ListCELPluginResponse\"\n\t\tcase types.Int32, types.Sint32, types.Sfixed32, types.Enum:\n\t\t\treturn \"ToInt32ListCELPluginResponse\"\n\t\tcase types.Int64, types.Sint64, types.Sfixed64:\n\t\t\treturn \"ToInt64ListCELPluginResponse\"\n\t\tcase types.Uint32, types.Fixed32:\n\t\t\treturn \"ToUint32ListCELPluginResponse\"\n\t\tcase types.Uint64, types.Fixed64:\n\t\t\treturn \"ToUint64ListCELPluginResponse\"\n\t\tcase types.Bool:\n\t\t\treturn \"ToBoolListCELPluginResponse\"\n\t\tcase types.String:\n\t\t\treturn \"ToStringListCELPluginResponse\"\n\t\tcase types.Bytes:\n\t\t\treturn \"ToBytesListCELPluginResponse\"\n\t\tcase types.Message:\n\t\t\tcloned := r.ret.Clone()\n\t\t\tcloned.Repeated = false\n\t\t\tmsg := r.file.toTypeText(cloned)\n\t\t\treturn fmt.Sprintf(\"ToMessageListCELPluginResponse[%s]\", msg)\n\t\t}\n\t}\n\tswitch r.ret.Kind {\n\tcase types.Double:\n\t\treturn \"ToFloat64CELPluginResponse\"\n\tcase types.Float:\n\t\treturn \"ToFloat32CELPluginResponse\"\n\tcase types.Int32, types.Sint32, types.Sfixed32, types.Enum:\n\t\treturn \"ToInt32CELPluginResponse\"\n\tcase types.Int64, types.Sint64, types.Sfixed64:\n\t\treturn \"ToInt64CELPluginResponse\"\n\tcase types.Uint32, types.Fixed32:\n\t\treturn \"ToUint32CELPluginResponse\"\n\tcase types.Uint64, types.Fixed64:\n\t\treturn \"ToUint64CELPluginResponse\"\n\tcase types.Bool:\n\t\treturn \"ToBoolCELPluginResponse\"\n\tcase types.String:\n\t\treturn \"ToStringCELPluginResponse\"\n\tcase types.Bytes:\n\t\treturn \"ToBytesCELPluginResponse\"\n\tcase types.Message:\n\t\tmsg := r.file.toTypeText(r.ret)\n\t\treturn fmt.Sprintf(\"ToMessageCELPluginResponse[%s]\", msg)\n\t}\n\treturn \"\"\n}\n\nfunc (p *CELPlugin) PluginFunctions() []*CELFunction {\n\tret := make([]*CELFunction, 0, len(p.CELPlugin.Functions))\n\toverloadCount := make(map[string]int)\n\tfor _, fn := range p.CELPlugin.Functions {\n\t\tret = append(ret, &CELFunction{\n\t\t\tfile:        p.file,\n\t\t\tCELFunction: fn,\n\t\t\toverloadIdx: overloadCount[fn.Name],\n\t\t})\n\t\toverloadCount[fn.Name]++\n\t}\n\treturn ret\n}\n\nfunc (f *File) CELPlugins() []*CELPlugin {\n\tret := make([]*CELPlugin, 0, len(f.File.CELPlugins))\n\tfor _, plug := range f.File.CELPlugins {\n\t\tret = append(ret, &CELPlugin{\n\t\t\tfile:      f,\n\t\t\tCELPlugin: plug,\n\t\t})\n\t}\n\treturn ret\n}\n\ntype Service struct {\n\t*resolver.Service\n\tfile              *File\n\tnameToLogValueMap map[string]*LogValue\n\tcelCacheIndex     int\n}\n\nfunc newService(svc *resolver.Service, file *File) *Service {\n\treturn &Service{\n\t\tService:           svc,\n\t\tfile:              file,\n\t\tnameToLogValueMap: make(map[string]*LogValue),\n\t}\n}\n\nfunc (s *Service) CELCacheIndex() int {\n\ts.celCacheIndex++\n\treturn s.celCacheIndex\n}\n\nfunc (s *Service) Env() *Env {\n\tif s.Rule == nil {\n\t\treturn nil\n\t}\n\tif s.Rule.Env == nil {\n\t\treturn nil\n\t}\n\treturn &Env{\n\t\tEnv:  s.Rule.Env,\n\t\tfile: s.file,\n\t}\n}\n\nfunc (s *Service) ServiceVariables() *ServiceVariables {\n\tif s.Rule == nil {\n\t\treturn nil\n\t}\n\tif len(s.Rule.Vars) == 0 {\n\t\treturn nil\n\t}\n\tsvcVars := make([]*ServiceVariable, 0, len(s.Rule.Vars))\n\tfor _, v := range s.Rule.Vars {\n\t\tsvcVars = append(svcVars, &ServiceVariable{\n\t\t\tServiceVariable: v,\n\t\t\tfile:            s.file,\n\t\t})\n\t}\n\treturn &ServiceVariables{\n\t\tVars: svcVars,\n\t\tsvc:  s,\n\t}\n}\n\ntype Env struct {\n\t*resolver.Env\n\tfile *File\n}\n\nfunc (e *Env) Vars() []*EnvVar {\n\tret := make([]*EnvVar, 0, len(e.Env.Vars))\n\tfor _, v := range e.Env.Vars {\n\t\tret = append(ret, &EnvVar{\n\t\t\tEnvVar: v,\n\t\t\tfile:   e.file,\n\t\t})\n\t}\n\treturn ret\n}\n\ntype EnvVar struct {\n\t*resolver.EnvVar\n\tfile *File\n}\n\nfunc (v *EnvVar) Name() string {\n\treturn util.ToPublicGoVariable(v.EnvVar.Name)\n}\n\nfunc (v *EnvVar) ProtoName() string {\n\treturn v.EnvVar.Name\n}\n\nconst durationPkg = \"google.golang.org/protobuf/types/known/durationpb\"\n\nfunc (v *EnvVar) CELType() string {\n\treturn toCELTypeDeclare(v.EnvVar.Type)\n}\n\nfunc (v *EnvVar) Type() string {\n\tvar existsDurationPkg bool\n\tfor pkg := range v.file.pkgMap {\n\t\tif pkg.ImportPath == durationPkg {\n\t\t\texistsDurationPkg = true\n\t\t\tbreak\n\t\t}\n\t}\n\n\ttext := v.file.toTypeText(v.EnvVar.Type)\n\n\t// Since it is not possible to read env values directly into *durationpb.Duration,\n\t// replace it with the grpcfed.Duration type.\n\tdefer func() {\n\t\t// If the duration type was not used previously, delete it to maintain consistency.\n\t\tif !existsDurationPkg {\n\t\t\tfor pkg := range v.file.pkgMap {\n\t\t\t\tif pkg.ImportPath == durationPkg {\n\t\t\t\t\tdelete(v.file.pkgMap, pkg)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}()\n\treturn strings.ReplaceAll(text, \"*durationpb.\", \"grpcfed.\")\n}\n\nfunc (v *EnvVar) Tag() string {\n\tname := strings.ToUpper(v.EnvVar.Name)\n\tif v.EnvVar.Option == nil {\n\t\treturn fmt.Sprintf(\"envconfig:%q\", name)\n\t}\n\n\tif v.EnvVar.Option.Alternate != \"\" {\n\t\tname = v.EnvVar.Option.Alternate\n\t}\n\n\topts := []string{fmt.Sprintf(\"envconfig:%q\", name)}\n\tif v.EnvVar.Option.Default != \"\" {\n\t\topts = append(opts, fmt.Sprintf(\"default:%q\", v.EnvVar.Option.Default))\n\t}\n\tif v.EnvVar.Option.Required {\n\t\topts = append(opts, `required:\"true\"`)\n\t}\n\tif v.EnvVar.Option.Ignored {\n\t\topts = append(opts, `ignored:\"true\"`)\n\t}\n\treturn strings.Join(opts, \" \")\n}\n\ntype ServiceVariables struct {\n\tVars []*ServiceVariable\n\tsvc  *Service\n}\n\nfunc (v *ServiceVariables) Defs() []*VariableDefinition {\n\tret := make([]*VariableDefinition, 0, len(v.Vars))\n\tfor _, svcVar := range v.Vars {\n\t\tret = append(ret, &VariableDefinition{\n\t\t\tVariableDefinition: svcVar.ToVariableDefinition(),\n\t\t\tService:            v.svc,\n\t\t\tfile:               v.svc.file,\n\t\t})\n\t}\n\treturn ret\n}\n\ntype ServiceVariable struct {\n\t*resolver.ServiceVariable\n\tfile *File\n}\n\nfunc (v *ServiceVariable) Name() string {\n\treturn util.ToPublicGoVariable(v.ServiceVariable.Name)\n}\n\nfunc (v *ServiceVariable) ProtoName() string {\n\treturn v.ServiceVariable.Name\n}\n\nfunc (v *ServiceVariable) CELType() string {\n\treturn toCELTypeDeclare(v.Expr.Type)\n}\n\nfunc (v *ServiceVariable) Type() string {\n\treturn v.file.toTypeText(v.Expr.Type)\n}\n\ntype Import struct {\n\tPath  string\n\tAlias string\n\tUsed  bool\n}\n\nfunc (f *File) StandardImports() []*Import {\n\tvar (\n\t\texistsServiceDef   bool\n\t\texistsPluginDef    bool\n\t\texistsPluginNetDef bool\n\t)\n\tif len(f.File.Services) != 0 {\n\t\texistsServiceDef = true\n\t}\n\tif len(f.File.CELPlugins) != 0 {\n\t\texistsPluginDef = true\n\t\tfor _, plg := range f.File.CELPlugins {\n\t\t\tif plg.Capability != nil && plg.Capability.Network != nil {\n\t\t\t\texistsPluginNetDef = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\tpkgs := []*Import{\n\t\t{Path: \"context\", Used: existsServiceDef || existsPluginDef},\n\t\t{Path: \"fmt\", Used: existsPluginDef},\n\t\t{Path: \"net/http\", Used: existsPluginNetDef},\n\t\t{Path: \"io\", Used: existsServiceDef},\n\t\t{Path: \"log/slog\", Used: existsServiceDef},\n\t\t{Path: \"reflect\", Used: true},\n\t}\n\tusedPkgs := make([]*Import, 0, len(pkgs))\n\tfor _, pkg := range pkgs {\n\t\tif !pkg.Used {\n\t\t\tcontinue\n\t\t}\n\t\tusedPkgs = append(usedPkgs, pkg)\n\t}\n\treturn usedPkgs\n}\n\nfunc (f *File) DefaultImports() []*Import {\n\tvar (\n\t\texistsServiceDef   bool\n\t\texistsPluginDef    bool\n\t\texistsPluginNetDef bool\n\t\texistsEnumAttrDef  bool\n\t)\n\tif len(f.File.Services) != 0 {\n\t\texistsServiceDef = true\n\t}\n\tif len(f.File.CELPlugins) != 0 {\n\t\texistsPluginDef = true\n\t\tfor _, plg := range f.File.CELPlugins {\n\t\t\tif plg.Capability != nil && plg.Capability.Network != nil {\n\t\t\t\texistsPluginNetDef = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\tif len(f.EnumAttributes()) != 0 {\n\t\texistsEnumAttrDef = true\n\t}\n\tpkgs := []*Import{\n\t\t{Alias: \"grpcfed\", Path: \"github.com/mercari/grpc-federation/grpc/federation\", Used: existsServiceDef || existsPluginDef || existsEnumAttrDef},\n\t\t{Alias: \"grpcfedcel\", Path: \"github.com/mercari/grpc-federation/grpc/federation/cel\", Used: existsServiceDef},\n\t\t{Alias: \"grpcfednet\", Path: \"github.com/mercari/grpc-federation/grpc/federation/net\", Used: existsPluginNetDef},\n\n\t\t{Path: \"go.opentelemetry.io/otel\", Used: existsServiceDef},\n\t\t{Path: \"go.opentelemetry.io/otel/trace\", Used: existsServiceDef},\n\n\t\t{Path: \"google.golang.org/protobuf/types/descriptorpb\"},\n\t\t{Path: \"google.golang.org/protobuf/types/known/dynamicpb\"},\n\t\t{Path: \"google.golang.org/protobuf/types/known/anypb\"},\n\t\t{Path: \"google.golang.org/protobuf/types/known/durationpb\"},\n\t\t{Path: \"google.golang.org/protobuf/types/known/emptypb\"},\n\t\t{Path: \"google.golang.org/protobuf/types/known/timestamppb\"},\n\t}\n\timportMap := make(map[string]*Import)\n\tfor _, pkg := range pkgs {\n\t\timportMap[pkg.Path] = pkg\n\t}\n\n\tfor pkg := range f.pkgMap {\n\t\tif imprt, exists := importMap[pkg.ImportPath]; exists {\n\t\t\timprt.Used = true\n\t\t}\n\t}\n\tusedPkgs := make([]*Import, 0, len(pkgs))\n\tfor _, pkg := range pkgs {\n\t\tif !pkg.Used {\n\t\t\tcontinue\n\t\t}\n\t\tusedPkgs = append(usedPkgs, pkg)\n\t}\n\treturn usedPkgs\n}\n\nfunc (f *File) Imports() []*Import {\n\timportPathMap := make(map[string]struct{})\n\timportAliasMap := make(map[string]struct{})\n\timportPathToAlias := make(map[string]string)\n\tfor _, imprt := range f.DefaultImports() {\n\t\timportPathMap[imprt.Path] = struct{}{}\n\t\timportAliasMap[imprt.Alias] = struct{}{}\n\t}\n\tcurImportPath := f.GoPackage.ImportPath\n\n\timports := make([]*Import, 0, len(f.pkgMap))\n\taddImport := func(pkg *resolver.GoPackage) {\n\t\t// ignore standard library's enum.\n\t\tif strings.HasPrefix(pkg.Name, \"google.\") {\n\t\t\treturn\n\t\t}\n\t\tif pkg.ImportPath == curImportPath {\n\t\t\treturn\n\t\t}\n\t\tif _, exists := importPathMap[pkg.ImportPath]; exists {\n\t\t\t// Multiple proto files in the same Go package produce distinct GoPackage pointers.\n\t\t\t// Register this pointer with the same alias assigned to the first pointer.\n\t\t\tif alias, ok := importPathToAlias[pkg.ImportPath]; ok {\n\t\t\t\tf.aliasMap[pkg] = alias\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t\talias := pkg.Name\n\t\tif _, exists := importAliasMap[pkg.Name]; exists {\n\t\t\t// conflict alias name\n\t\t\tsuffixIndex := 1 // start from 1.\n\t\t\tfor {\n\t\t\t\talias = pkg.Name + fmt.Sprint(suffixIndex)\n\t\t\t\tif _, exists := importAliasMap[alias]; !exists {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tsuffixIndex++\n\t\t\t}\n\t\t}\n\t\tf.aliasMap[pkg] = alias\n\t\timports = append(imports, &Import{\n\t\t\tPath:  pkg.ImportPath,\n\t\t\tAlias: alias,\n\t\t\tUsed:  true,\n\t\t})\n\t\timportPathMap[pkg.ImportPath] = struct{}{}\n\t\timportAliasMap[alias] = struct{}{}\n\t\timportPathToAlias[pkg.ImportPath] = alias\n\t}\n\tsortedPkgs := make([]*resolver.GoPackage, 0, len(f.pkgMap))\n\tfor pkg := range f.pkgMap {\n\t\tsortedPkgs = append(sortedPkgs, pkg)\n\t}\n\tsort.Slice(sortedPkgs, func(i, j int) bool {\n\t\treturn sortedPkgs[i].ImportPath < sortedPkgs[j].ImportPath\n\t})\n\tfor _, pkg := range sortedPkgs {\n\t\taddImport(pkg)\n\t}\n\tsort.Slice(imports, func(i, j int) bool {\n\t\treturn imports[i].Path < imports[j].Path\n\t})\n\treturn imports\n}\n\nfunc (f *File) getAlias(pkg *resolver.GoPackage) string {\n\talias, exists := f.aliasMap[pkg]\n\tif exists {\n\t\treturn alias\n\t}\n\treturn pkg.Name\n}\n\ntype Enum struct {\n\tProtoName     string\n\tGoName        string\n\tEnumAttribute *EnumAttribute\n}\n\nfunc (f *File) Enums() []*Enum {\n\tvar enums []*Enum\n\tfor _, enum := range f.AllEnumsIncludeDeps() {\n\t\tprotoName := enum.FQDN()\n\t\t// ignore standard library's enum.\n\t\tif strings.HasPrefix(protoName, \"google.\") {\n\t\t\tcontinue\n\t\t}\n\t\tif strings.HasPrefix(protoName, \"grpc.federation.\") {\n\t\t\tcontinue\n\t\t}\n\t\t// Currently Enums are used only from a File contains Services.\n\t\tif len(f.File.Services) != 0 {\n\t\t\tf.pkgMap[enum.GoPackage()] = struct{}{}\n\t\t}\n\t\tvar enumAttr *EnumAttribute\n\t\tattrMap := enum.AttributeMap()\n\t\tif len(attrMap) != 0 {\n\t\t\tenumAttr = &EnumAttribute{\n\t\t\t\tName:      f.enumTypeToText(enum),\n\t\t\t\tProtoName: enum.FQDN(),\n\t\t\t}\n\t\t\tfor _, value := range enum.Values {\n\t\t\t\tenumAttr.Values = append(enumAttr.Values, &EnumValueAttribute{\n\t\t\t\t\tName:  toEnumValueText(toEnumValuePrefix(f, resolver.NewEnumType(enum, false)), value.Value),\n\t\t\t\t\tAttrs: value.Rule.Attrs,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tenums = append(enums, &Enum{\n\t\t\tProtoName:     protoName,\n\t\t\tGoName:        f.enumTypeToText(enum),\n\t\t\tEnumAttribute: enumAttr,\n\t\t})\n\t}\n\treturn enums\n}\n\ntype EnumAttribute struct {\n\tName      string\n\tProtoName string\n\tValues    []*EnumValueAttribute\n}\n\ntype EnumValueAttribute struct {\n\tName  string\n\tType  string\n\tAttrs []*resolver.EnumValueAttribute\n}\n\nfunc (f *File) EnumAttributes() []*EnumAttribute {\n\tenums := f.AllEnums()\n\tenumAttrs := make([]*EnumAttribute, 0, len(enums))\n\tfor _, enum := range enums {\n\t\tattrMap := enum.AttributeMap()\n\t\tif len(attrMap) == 0 {\n\t\t\tcontinue\n\t\t}\n\t\tenumAttr := &EnumAttribute{\n\t\t\tName:      f.enumTypeToText(enum),\n\t\t\tProtoName: enum.FQDN(),\n\t\t}\n\t\tfor _, value := range enum.Values {\n\t\t\tenumAttr.Values = append(enumAttr.Values, &EnumValueAttribute{\n\t\t\t\tName:  toEnumValueText(toEnumValuePrefix(f, resolver.NewEnumType(enum, false)), value.Value),\n\t\t\t\tAttrs: value.Rule.Attrs,\n\t\t\t})\n\t\t}\n\t\tenumAttrs = append(enumAttrs, enumAttr)\n\t}\n\treturn enumAttrs\n}\n\nfunc newServiceTypeDeclares(file *File, msgs []*resolver.Message) []*Type {\n\tvar ret []*Type\n\tfor _, msg := range msgs {\n\t\tret = append(ret, newTypeDeclaresWithMessage(file, msg)...)\n\t}\n\tsort.Slice(ret, func(i, j int) bool {\n\t\treturn ret[i].Name < ret[j].Name\n\t})\n\treturn ret\n}\n\nfunc newTypeDeclaresWithMessage(file *File, msg *resolver.Message) []*Type {\n\tif !msg.HasRule() {\n\t\treturn nil\n\t}\n\targ := msg.Rule.MessageArgument\n\tif arg == nil {\n\t\treturn nil\n\t}\n\tmsgName := fullMessageName(msg)\n\targName := fmt.Sprintf(\"%sArgument\", msgName)\n\tmsgFQDN := fmt.Sprintf(`%s.%s`, msg.PackageName(), msg.Name)\n\ttyp := &Type{\n\t\tName:      argName,\n\t\tDesc:      fmt.Sprintf(`%s is argument for %q message`, argName, msgFQDN),\n\t\tProtoFQDN: arg.FQDN(),\n\t}\n\n\tfieldNameMap := make(map[string]struct{})\n\tfor _, field := range arg.Fields {\n\t\ttyp.ProtoFields = append(typ.ProtoFields, &ProtoField{Field: field})\n\t\tfieldName := util.ToPublicGoVariable(field.Name)\n\t\tif _, exists := fieldNameMap[fieldName]; exists {\n\t\t\tcontinue\n\t\t}\n\t\tvar typText string\n\t\tif field.Type.OneofField != nil {\n\t\t\tt := field.Type.OneofField.Type.Clone()\n\t\t\tt.OneofField = nil\n\t\t\ttypText = file.toTypeText(t)\n\t\t} else {\n\t\t\ttypText = file.toTypeText(field.Type)\n\t\t}\n\t\ttyp.Fields = append(typ.Fields, &Field{\n\t\t\tName: fieldName,\n\t\t\tType: typText,\n\t\t})\n\t\tfieldNameMap[fieldName] = struct{}{}\n\t}\n\tsort.Slice(typ.Fields, func(i, j int) bool {\n\t\treturn typ.Fields[i].Name < typ.Fields[j].Name\n\t})\n\n\tgenMsg := &Message{Message: msg, file: file}\n\tvarTypName := variableTypeName(msg)\n\tvarTyp := &VariableType{\n\t\tName: varTypName,\n\t\tDesc: fmt.Sprintf(`%s represents variable definitions in %q`, varTypName, msgFQDN),\n\t}\n\ttyp.VariableType = varTyp\n\tfieldNameMap = make(map[string]struct{})\n\tfor _, group := range genMsg.VariableDefinitionGroups() {\n\t\tfor _, def := range group.VariableDefinitions() {\n\t\t\tif def == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif !def.Used {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tfieldName := util.ToPublicGoVariable(def.Name)\n\t\t\tif varTyp.HasField(fieldName) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif _, exists := fieldNameMap[fieldName]; exists {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tvarTyp.Fields = append(varTyp.Fields, &Field{\n\t\t\t\tName: fieldName,\n\t\t\t\tType: file.toTypeText(def.Expr.Type),\n\t\t\t})\n\t\t\tfieldNameMap[fieldName] = struct{}{}\n\t\t}\n\t}\n\tsort.Slice(varTyp.Fields, func(i, j int) bool {\n\t\treturn varTyp.Fields[i].Name < varTyp.Fields[j].Name\n\t})\n\n\tdeclTypes := []*Type{typ}\n\tfor _, field := range msg.CustomResolverFields() {\n\t\ttypeName := fmt.Sprintf(\"%s_%sArgument\", msgName, util.ToPublicGoVariable(field.Name))\n\t\tfields := []*Field{{Type: argName}}\n\t\tif msg.HasCustomResolver() {\n\t\t\tfields = append(fields, &Field{\n\t\t\t\tName: msgName,\n\t\t\t\tType: file.toTypeText(resolver.NewMessageType(msg, false)),\n\t\t\t})\n\t\t}\n\t\tsort.Slice(fields, func(i, j int) bool {\n\t\t\treturn fields[i].Name < fields[j].Name\n\t\t})\n\t\tdeclTypes = append(declTypes, &Type{\n\t\t\tName:   typeName,\n\t\t\tFields: fields,\n\t\t\tDesc: fmt.Sprintf(\n\t\t\t\t`%s is custom resolver's argument for %q field of %q message`,\n\t\t\t\ttypeName,\n\t\t\t\tfield.Name,\n\t\t\t\tmsgFQDN,\n\t\t\t),\n\t\t})\n\t}\n\treturn declTypes\n}\n\ntype OneofType struct {\n\tName             string\n\tFieldName        string\n\tMessageProtoFQDN string\n\tTypeDeclare      string\n\tFieldZeroValues  []string\n\tFieldGetterNames []string\n\tReturnZeroValue  string\n}\n\nfunc (s *Service) CELPlugins() []*CELPlugin {\n\tret := make([]*CELPlugin, 0, len(s.Service.CELPlugins))\n\tfor _, plugin := range s.Service.CELPlugins {\n\t\tret = append(ret, &CELPlugin{\n\t\t\tCELPlugin: plugin,\n\t\t\tfile:      s.file,\n\t\t})\n\t}\n\treturn ret\n}\n\nfunc (s *Service) Types() Types {\n\treturn newServiceTypeDeclares(s.file, s.Service.Messages)\n}\n\nfunc (s *Service) OneofTypes() []*OneofType {\n\tvar ret []*OneofType\n\tsvc := s.Service\n\tfor _, msg := range svc.Messages {\n\t\tfor _, oneof := range msg.Oneofs {\n\t\t\tif !oneof.IsSameType() {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tfieldZeroValues := make([]string, 0, len(oneof.Fields))\n\t\t\tfieldGetterNames := make([]string, 0, len(oneof.Fields))\n\t\t\tfor _, field := range oneof.Fields {\n\t\t\t\tfieldZeroValues = append(\n\t\t\t\t\tfieldZeroValues,\n\t\t\t\t\ttoMakeZeroValue(s.file, field.Type),\n\t\t\t\t)\n\t\t\t\tfieldGetterNames = append(\n\t\t\t\t\tfieldGetterNames,\n\t\t\t\t\tfmt.Sprintf(\"Get%s\", util.ToPublicGoVariable(field.Name)),\n\t\t\t\t)\n\t\t\t}\n\t\t\tcloned := oneof.Fields[0].Type.Clone()\n\t\t\tcloned.OneofField = nil\n\t\t\treturnZeroValue := toMakeZeroValue(s.file, cloned)\n\t\t\tret = append(ret, &OneofType{\n\t\t\t\tName:             oneof.Name,\n\t\t\t\tFieldName:        util.ToPublicGoVariable(oneof.Name),\n\t\t\t\tMessageProtoFQDN: oneof.Message.FQDN(),\n\t\t\t\tTypeDeclare:      toCELTypeDeclare(oneof.Fields[0].Type),\n\t\t\t\tFieldZeroValues:  fieldZeroValues,\n\t\t\t\tFieldGetterNames: fieldGetterNames,\n\t\t\t\tReturnZeroValue:  returnZeroValue,\n\t\t\t})\n\t\t}\n\t}\n\treturn ret\n}\n\nfunc (s *Service) ServiceName() string {\n\treturn util.ToPublicGoVariable(s.Name)\n}\n\nfunc (s *Service) PackageName() string {\n\treturn s.file.getAlias(s.GoPackage())\n}\n\ntype ServiceDependency struct {\n\t*resolver.ServiceDependency\n\tfile *File\n}\n\nfunc (dep *ServiceDependency) ServiceName() string {\n\treturn fmt.Sprintf(\"%s.%s\", dep.Service.PackageName(), dep.Service.Name)\n}\n\nfunc (dep *ServiceDependency) NameConfig() string {\n\treturn dep.Name\n}\n\nfunc (dep *ServiceDependency) ClientName() string {\n\tsvcName := fullServiceName(dep.Service)\n\treturn fmt.Sprintf(\"%sClient\", svcName)\n}\n\nfunc (dep *ServiceDependency) PrivateClientName() string {\n\tsvcName := fullServiceName(dep.Service)\n\treturn fmt.Sprintf(\"%sClient\", util.ToPrivateGoVariable(svcName))\n}\n\nfunc (dep *ServiceDependency) ClientType() string {\n\treturn fmt.Sprintf(\n\t\t\"%s.%sClient\",\n\t\tdep.file.getAlias(dep.Service.GoPackage()),\n\t\tdep.Service.Name,\n\t)\n}\n\nfunc (dep *ServiceDependency) ClientConstructor() string {\n\treturn fmt.Sprintf(\n\t\t\"%s.New%sClient\",\n\t\tdep.file.getAlias(dep.Service.GoPackage()),\n\t\tdep.Service.Name,\n\t)\n}\n\nfunc (s *Service) ServiceDependencies() []*ServiceDependency {\n\tdeps := s.Service.ServiceDependencies()\n\tret := make([]*ServiceDependency, 0, len(deps))\n\tfor _, dep := range deps {\n\t\tret = append(ret, &ServiceDependency{\n\t\t\tServiceDependency: dep,\n\t\t\tfile:              s.file,\n\t\t})\n\t}\n\treturn ret\n}\n\ntype CustomResolver struct {\n\t*resolver.CustomResolver\n\tService *resolver.Service\n\tfile    *File\n}\n\nfunc (r *CustomResolver) Name() string {\n\treturn fmt.Sprintf(\"Resolve_%s\", r.fullName())\n}\n\nfunc (r *CustomResolver) RequestType() string {\n\treturn fmt.Sprintf(\"%sArgument\", r.fullName())\n}\n\nfunc (r *CustomResolver) fullName() string {\n\tur := r.CustomResolver\n\tmsg := fullMessageName(ur.Message)\n\tif ur.Field != nil {\n\t\treturn fmt.Sprintf(\"%s_%s\", msg, util.ToPublicGoVariable(ur.Field.Name))\n\t}\n\treturn msg\n}\n\nfunc (r *CustomResolver) ProtoFQDN() string {\n\tfqdn := r.Message.FQDN()\n\tif r.Field != nil {\n\t\treturn fmt.Sprintf(\"%s.%s\", fqdn, r.Field.Name)\n\t}\n\treturn fqdn\n}\n\nfunc (r *CustomResolver) ReturnType() string {\n\tur := r.CustomResolver\n\tif ur.Field != nil {\n\t\t// field resolver\n\t\treturn r.file.toTypeText(ur.Field.Type)\n\t}\n\t// message resolver\n\treturn r.file.toTypeText(resolver.NewMessageType(ur.Message, false))\n}\n\nfunc (s *Service) CustomResolvers() []*CustomResolver {\n\tresolvers := s.Service.CustomResolvers()\n\tret := make([]*CustomResolver, 0, len(resolvers))\n\tfor _, resolver := range resolvers {\n\t\tret = append(ret, &CustomResolver{\n\t\t\tCustomResolver: resolver,\n\t\t\tService:        s.Service,\n\t\t\tfile:           s.file,\n\t\t})\n\t}\n\treturn ret\n}\n\ntype Types []*Type\n\ntype Type struct {\n\tName         string\n\tFields       []*Field\n\tProtoFields  []*ProtoField\n\tDesc         string\n\tProtoFQDN    string\n\tVariableType *VariableType\n}\n\ntype VariableType struct {\n\tName   string\n\tFields []*Field\n\tDesc   string\n}\n\nfunc variableTypeName(msg *resolver.Message) string {\n\treturn fmt.Sprintf(\"%sVariable\", fullMessageName(msg))\n}\n\nfunc (t *VariableType) HasField(fieldName string) bool {\n\tfor _, field := range t.Fields {\n\t\tif field.Name == fieldName {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\ntype ProtoField struct {\n\t*resolver.Field\n}\n\nfunc (f *ProtoField) FieldName() string {\n\treturn util.ToPublicGoVariable(f.Field.Name)\n}\n\nfunc (f *ProtoField) Name() string {\n\treturn f.Field.Name\n}\n\nfunc (f *ProtoField) TypeDeclare() string {\n\treturn toCELTypeDeclare(f.Field.Type)\n}\n\ntype Field struct {\n\tName string\n\tType string\n}\n\nfunc toMakeZeroValue(file *File, t *resolver.Type) string {\n\ttext := file.toTypeText(t)\n\tif t.Repeated || t.Kind == types.Bytes {\n\t\treturn fmt.Sprintf(\"%s(nil)\", text)\n\t}\n\tif t.OneofField != nil {\n\t\treturn fmt.Sprintf(\"(%s)(nil)\", text)\n\t}\n\tif t.IsNumber() || t.Kind == types.Enum {\n\t\treturn fmt.Sprintf(\"%s(0)\", text)\n\t}\n\tswitch t.Kind {\n\tcase types.Bool:\n\t\treturn `false`\n\tcase types.String:\n\t\treturn `\"\"`\n\t}\n\treturn fmt.Sprintf(\"(%s)(nil)\", text)\n}\n\nfunc toCELTypeDeclare(t *resolver.Type) string {\n\tif t.Repeated {\n\t\tcloned := t.Clone()\n\t\tcloned.Repeated = false\n\t\treturn fmt.Sprintf(\"grpcfed.NewCELListType(%s)\", toCELTypeDeclare(cloned))\n\t}\n\tswitch t.Kind {\n\tcase types.Double, types.Float:\n\t\treturn \"grpcfed.CELDoubleType\"\n\tcase types.Int32, types.Int64, types.Sint32, types.Sint64, types.Sfixed32, types.Sfixed64, types.Enum:\n\t\treturn \"grpcfed.CELIntType\"\n\tcase types.Uint32, types.Uint64, types.Fixed32, types.Fixed64:\n\t\treturn \"grpcfed.CELUintType\"\n\tcase types.Bool:\n\t\treturn \"grpcfed.CELBoolType\"\n\tcase types.String:\n\t\treturn \"grpcfed.CELStringType\"\n\tcase types.Bytes:\n\t\treturn \"grpcfed.CELBytesType\"\n\tcase types.Message:\n\t\tif t.Message != nil && t.Message.IsMapEntry {\n\t\t\tkey := toCELTypeDeclare(t.Message.Fields[0].Type)\n\t\t\tvalue := toCELTypeDeclare(t.Message.Fields[1].Type)\n\t\t\treturn fmt.Sprintf(`grpcfed.NewCELMapType(%s, %s)`, key, value)\n\t\t}\n\t\tif t == resolver.DurationType {\n\t\t\treturn \"grpcfed.CELDurationType\"\n\t\t}\n\t\treturn fmt.Sprintf(`grpcfed.NewCELObjectType(%q)`, t.Message.FQDN())\n\t}\n\treturn \"\"\n}\n\nfunc (f *File) toTypeText(t *resolver.Type) string {\n\tif t == nil || t.IsNull {\n\t\treturn \"any\"\n\t}\n\tif t.OneofField != nil {\n\t\ttyp := f.oneofTypeToText(t.OneofField)\n\t\tif t.Repeated {\n\t\t\treturn \"[]\" + typ\n\t\t}\n\t\treturn typ\n\t}\n\n\tvar typ string\n\tswitch t.Kind {\n\tcase types.Double:\n\t\ttyp = \"float64\"\n\tcase types.Float:\n\t\ttyp = \"float32\"\n\tcase types.Int32:\n\t\ttyp = \"int32\"\n\tcase types.Int64:\n\t\ttyp = \"int64\"\n\tcase types.Uint32:\n\t\ttyp = \"uint32\"\n\tcase types.Uint64:\n\t\ttyp = \"uint64\"\n\tcase types.Sint32:\n\t\ttyp = \"int32\"\n\tcase types.Sint64:\n\t\ttyp = \"int64\"\n\tcase types.Fixed32:\n\t\ttyp = \"uint32\"\n\tcase types.Fixed64:\n\t\ttyp = \"uint64\"\n\tcase types.Sfixed32:\n\t\ttyp = \"int32\"\n\tcase types.Sfixed64:\n\t\ttyp = \"int64\"\n\tcase types.Bool:\n\t\ttyp = \"bool\"\n\tcase types.String:\n\t\ttyp = \"string\"\n\tcase types.Bytes:\n\t\ttyp = \"[]byte\"\n\tcase types.Enum:\n\t\tf.pkgMap[t.Enum.GoPackage()] = struct{}{}\n\t\ttyp = f.enumTypeToText(t.Enum)\n\tcase types.Message:\n\t\tif t.Message.IsMapEntry {\n\t\t\treturn fmt.Sprintf(\"map[%s]%s\", f.toTypeText(t.Message.Fields[0].Type), f.toTypeText(t.Message.Fields[1].Type))\n\t\t}\n\t\ttyp = f.messageTypeToText(t.Message)\n\tdefault:\n\t\tlog.Fatalf(\"grpc-federation: specified unsupported type value %s\", t.Kind.ToString())\n\t}\n\tif t.Repeated {\n\t\treturn \"[]\" + typ\n\t}\n\treturn typ\n}\n\nfunc (f *File) oneofTypeToText(oneofField *resolver.OneofField) string {\n\tmsg := f.messageTypeToText(oneofField.Oneof.Message)\n\toneof := fmt.Sprintf(\"%s_%s\", msg, util.ToPublicGoVariable(oneofField.Field.Name))\n\tif oneofField.IsConflict() {\n\t\toneof += \"_\"\n\t}\n\treturn oneof\n}\n\nfunc (f *File) messageTypeToText(msg *resolver.Message) string {\n\tf.pkgMap[msg.GoPackage()] = struct{}{}\n\tif msg.PackageName() == \"google.protobuf\" {\n\t\tswitch msg.Name {\n\t\tcase \"Any\":\n\t\t\treturn \"*anypb.Any\"\n\t\tcase \"Timestamp\":\n\t\t\treturn \"*timestamppb.Timestamp\"\n\t\tcase \"Duration\":\n\t\t\treturn \"*durationpb.Duration\"\n\t\tcase \"Empty\":\n\t\t\treturn \"*emptypb.Empty\"\n\t\t}\n\t}\n\tif msg.IsMapEntry {\n\t\tkey := f.toTypeText(msg.Field(\"key\").Type)\n\t\tvalue := f.toTypeText(msg.Field(\"value\").Type)\n\t\treturn fmt.Sprintf(\"map[%s]%s\", key, value)\n\t}\n\tvar names []string\n\tfor _, name := range append(msg.ParentMessageNames(), msg.Name) {\n\t\tnames = append(names, util.ToPublicGoVariable(name))\n\t}\n\tname := strings.Join(names, \"_\")\n\tif f.GoPackage.ImportPath == msg.GoPackage().ImportPath {\n\t\treturn fmt.Sprintf(\"*%s\", name)\n\t}\n\treturn fmt.Sprintf(\"*%s.%s\", f.getAlias(msg.GoPackage()), name)\n}\n\nfunc (f *File) enumTypeToText(enum *resolver.Enum) string {\n\tvar name string\n\tif enum.Message != nil {\n\t\tvar names []string\n\t\tfor _, n := range append(enum.Message.ParentMessageNames(), enum.Message.Name, enum.Name) {\n\t\t\tnames = append(names, util.ToPublicGoVariable(n))\n\t\t}\n\t\tname = strings.Join(names, \"_\")\n\t} else {\n\t\tname = util.ToPublicGoVariable(enum.Name)\n\t}\n\tif f.GoPackage.ImportPath == enum.GoPackage().ImportPath {\n\t\treturn name\n\t}\n\treturn fmt.Sprintf(\"%s.%s\", f.getAlias(enum.GoPackage()), name)\n}\n\ntype LogValue struct {\n\tName      string\n\tValueType string\n\tAttrs     []*LogValueAttr\n\tType      *resolver.Type\n\tValue     string // for repeated type\n}\n\nfunc (v *LogValue) IsRepeated() bool {\n\tif v.IsMap() {\n\t\treturn false\n\t}\n\treturn v.Type.Repeated\n}\n\nfunc (v *LogValue) IsMessage() bool {\n\treturn v.Type.Kind == types.Message\n}\n\nfunc (v *LogValue) IsMap() bool {\n\tif !v.IsMessage() {\n\t\treturn false\n\t}\n\treturn v.Type.Message.IsMapEntry\n}\n\ntype LogValueAttr struct {\n\tType  string\n\tKey   string\n\tValue string\n}\n\nfunc (s *Service) LogValues() []*LogValue {\n\tmsgs := s.Service.Messages\n\tfor _, dep := range s.Service.ServiceDependencies() {\n\t\tfor _, method := range dep.Service.Methods {\n\t\t\tmsgs = append(msgs, method.Request)\n\t\t}\n\t}\n\n\tfor _, msg := range msgs {\n\t\tif msg.Rule != nil {\n\t\t\ts.setLogValueByMessageArgument(msg)\n\t\t}\n\t\ts.setLogValueByMessage(msg)\n\t}\n\tlogValues := make([]*LogValue, 0, len(s.nameToLogValueMap))\n\tfor _, logValue := range s.nameToLogValueMap {\n\t\tlogValues = append(logValues, logValue)\n\t}\n\tsort.Slice(logValues, func(i, j int) bool {\n\t\treturn logValues[i].Name < logValues[j].Name\n\t})\n\treturn logValues\n}\n\nfunc (s *Service) setLogValueByMessage(msg *resolver.Message) {\n\tif msg.IsMapEntry {\n\t\ts.setLogValueByMapMessage(msg)\n\t\treturn\n\t}\n\tname := s.messageToLogValueName(msg)\n\tif _, exists := s.nameToLogValueMap[name]; exists {\n\t\treturn\n\t}\n\tmsgType := resolver.NewMessageType(msg, false)\n\tlogValue := &LogValue{\n\t\tName:      name,\n\t\tValueType: s.file.toTypeText(msgType),\n\t\tAttrs:     make([]*LogValueAttr, 0, len(msg.Fields)),\n\t\tType:      msgType,\n\t}\n\ts.nameToLogValueMap[name] = logValue\n\tfor _, field := range msg.Fields {\n\t\tlogValue.Attrs = append(logValue.Attrs, &LogValueAttr{\n\t\t\tType:  s.logType(field.Type),\n\t\t\tKey:   field.Name,\n\t\t\tValue: s.logValue(field),\n\t\t})\n\t\ts.setLogValueByType(field.Type)\n\t}\n\tfor _, msg := range msg.NestedMessages {\n\t\ts.setLogValueByMessage(msg)\n\t}\n\tfor _, enum := range msg.Enums {\n\t\ts.setLogValueByEnum(enum)\n\t}\n}\n\nfunc (s *Service) setLogValueByMapMessage(msg *resolver.Message) {\n\tname := s.messageToLogValueName(msg)\n\tif _, exists := s.nameToLogValueMap[name]; exists {\n\t\treturn\n\t}\n\tvalue := msg.Field(\"value\")\n\tmsgType := resolver.NewMessageType(msg, false)\n\tlogValue := &LogValue{\n\t\tName:      name,\n\t\tValueType: s.file.toTypeText(msgType),\n\t\tType:      msgType,\n\t\tValue:     s.logMapValue(value),\n\t}\n\ts.nameToLogValueMap[name] = logValue\n\ts.setLogValueByType(value.Type)\n}\n\nfunc (s *Service) setLogValueByType(typ *resolver.Type) {\n\tisMap := typ.Message != nil && typ.Message.IsMapEntry\n\tif typ.Message != nil {\n\t\ts.setLogValueByMessage(typ.Message)\n\t}\n\tif typ.Enum != nil {\n\t\ts.setLogValueByEnum(typ.Enum)\n\t}\n\tif typ.Repeated && !isMap {\n\t\ts.setLogValueByRepeatedType(typ)\n\t}\n}\n\nfunc (s *Service) setLogValueByMessageArgument(msg *resolver.Message) {\n\targ := msg.Rule.MessageArgument\n\n\t// The message argument belongs to \"grpc.federation.private\" package,\n\t// but we want to change the package name temporarily\n\t// because we want to use the name of the package to which the message belongs as log value's function name.\n\tpkg := arg.File.Package\n\tdefer func() {\n\t\t// restore the original package name.\n\t\targ.File.Package = pkg\n\t}()\n\t// replace package name to message's package name.\n\targ.File.Package = msg.File.Package\n\n\tname := s.messageToLogValueName(arg)\n\tif _, exists := s.nameToLogValueMap[name]; exists {\n\t\treturn\n\t}\n\tlogValue := &LogValue{\n\t\tName:      name,\n\t\tValueType: \"*\" + s.ServiceName() + \"_\" + protoFQDNToPublicGoName(arg.FQDN()),\n\t\tAttrs:     make([]*LogValueAttr, 0, len(arg.Fields)),\n\t\tType:      resolver.NewMessageType(arg, false),\n\t}\n\ts.nameToLogValueMap[name] = logValue\n\tfor _, field := range arg.Fields {\n\t\tlogValue.Attrs = append(logValue.Attrs, &LogValueAttr{\n\t\t\tType:  s.logType(field.Type),\n\t\t\tKey:   field.Name,\n\t\t\tValue: s.msgArgumentLogValue(field),\n\t\t})\n\t\ts.setLogValueByType(field.Type)\n\t}\n}\n\nfunc (s *Service) setLogValueByEnum(enum *resolver.Enum) {\n\tname := s.enumToLogValueName(enum)\n\tif _, exists := s.nameToLogValueMap[name]; exists {\n\t\treturn\n\t}\n\tenumType := &resolver.Type{Kind: types.Enum, Enum: enum}\n\tlogValue := &LogValue{\n\t\tName:      name,\n\t\tValueType: s.file.toTypeText(enumType),\n\t\tAttrs:     make([]*LogValueAttr, 0, len(enum.Values)),\n\t\tType:      enumType,\n\t}\n\tfor _, value := range enum.Values {\n\t\tlogValue.Attrs = append(logValue.Attrs, &LogValueAttr{\n\t\t\tKey:   value.Value,\n\t\t\tValue: toEnumValueText(toEnumValuePrefix(s.file, enumType), value.Value),\n\t\t})\n\t}\n\ts.nameToLogValueMap[name] = logValue\n}\n\nfunc (s *Service) setLogValueByRepeatedType(typ *resolver.Type) {\n\tif typ.Kind != types.Message && typ.Kind != types.Enum {\n\t\treturn\n\t}\n\tvar (\n\t\tname  string\n\t\tvalue string\n\t)\n\tif typ.Kind == types.Message {\n\t\tname = s.repeatedMessageToLogValueName(typ.Message)\n\t\tvalue = s.messageToLogValueName(typ.Message)\n\t} else {\n\t\tname = s.repeatedEnumToLogValueName(typ.Enum)\n\t\tvalue = s.enumToLogValueName(typ.Enum)\n\t}\n\tif _, exists := s.nameToLogValueMap[name]; exists {\n\t\treturn\n\t}\n\tlogValue := &LogValue{\n\t\tName:      name,\n\t\tValueType: s.file.toTypeText(typ),\n\t\tType:      typ,\n\t\tValue:     value,\n\t}\n\ts.nameToLogValueMap[name] = logValue\n}\n\nfunc (s *Service) messageToLogValueName(msg *resolver.Message) string {\n\treturn fmt.Sprintf(\"logvalue_%s\", protoFQDNToPublicGoName(msg.FQDN()))\n}\n\nfunc (s *Service) enumToLogValueName(enum *resolver.Enum) string {\n\treturn fmt.Sprintf(\"logvalue_%s\", protoFQDNToPublicGoName(enum.FQDN()))\n}\n\nfunc (s *Service) repeatedMessageToLogValueName(msg *resolver.Message) string {\n\treturn fmt.Sprintf(\"logvalue_repeated_%s\", protoFQDNToPublicGoName(msg.FQDN()))\n}\n\nfunc (s *Service) repeatedEnumToLogValueName(enum *resolver.Enum) string {\n\treturn fmt.Sprintf(\"logvalue_repeated_%s\", protoFQDNToPublicGoName(enum.FQDN()))\n}\n\nfunc (s *Service) logType(typ *resolver.Type) string {\n\tif typ.Repeated {\n\t\treturn \"Any\"\n\t}\n\tswitch typ.Kind {\n\tcase types.Double, types.Float:\n\t\treturn \"Float64\"\n\tcase types.Int32, types.Int64, types.Sint32, types.Sint64, types.Sfixed32, types.Sfixed64:\n\t\treturn \"Int64\"\n\tcase types.Uint32, types.Uint64, types.Fixed32, types.Fixed64:\n\t\treturn \"Uint64\"\n\tcase types.Bool:\n\t\treturn \"Bool\"\n\tcase types.String, types.Bytes:\n\t\treturn \"String\"\n\tcase types.Enum:\n\t\treturn \"String\"\n\tcase types.Group, types.Message:\n\t\treturn \"Any\"\n\t}\n\tlog.Fatalf(\"grpc-federation: specified unknown type value %s\", typ.Kind.ToString())\n\treturn \"\"\n}\n\nfunc (s *Service) logValue(field *resolver.Field) string {\n\ttyp := field.Type\n\tbase := fmt.Sprintf(\"v.Get%s()\", util.ToPublicGoVariable(field.Name))\n\tif typ.Kind == types.Message {\n\t\treturn fmt.Sprintf(\"%s(%s)\", s.logValueFuncName(typ), base)\n\t} else if typ.Kind == types.Enum {\n\t\tif typ.Repeated {\n\t\t\treturn fmt.Sprintf(\"%s(%s)\", s.logValueFuncName(typ), base)\n\t\t}\n\t\treturn fmt.Sprintf(\"%s(%s).String()\", s.logValueFuncName(typ), base)\n\t}\n\tif field.Type.Repeated {\n\t\treturn base\n\t}\n\tswitch field.Type.Kind {\n\tcase types.Int32, types.Sint32, types.Sfixed32:\n\t\tbase = fmt.Sprintf(\"int64(%s)\", base)\n\tcase types.Uint32, types.Fixed32:\n\t\tbase = fmt.Sprintf(\"uint64(%s)\", base)\n\tcase types.Float:\n\t\tbase = fmt.Sprintf(\"float64(%s)\", base)\n\tcase types.Bytes:\n\t\tbase = fmt.Sprintf(\"string(%s)\", base)\n\t}\n\treturn base\n}\n\nfunc (s *Service) logMapValue(value *resolver.Field) string {\n\ttyp := value.Type\n\tif typ.Kind == types.Message {\n\t\treturn fmt.Sprintf(\"%s(value)\", s.logValueFuncName(typ))\n\t} else if typ.Kind == types.Enum {\n\t\tif typ.Repeated {\n\t\t\treturn fmt.Sprintf(\"%s(value)\", s.logValueFuncName(typ))\n\t\t}\n\t\treturn fmt.Sprintf(\"slog.StringValue(%s(value).String())\", s.logValueFuncName(typ))\n\t} else if typ.Kind == types.Bytes {\n\t\treturn \"slog.StringValue(string(value))\"\n\t}\n\treturn \"slog.AnyValue(value)\"\n}\n\nfunc (s *Service) msgArgumentLogValue(field *resolver.Field) string {\n\ttyp := field.Type\n\tbase := fmt.Sprintf(\"v.%s\", util.ToPublicGoVariable(field.Name))\n\tif typ.Kind == types.Message {\n\t\treturn fmt.Sprintf(\"%s(%s)\", s.logValueFuncName(typ), base)\n\t} else if typ.Kind == types.Enum {\n\t\tif typ.Repeated {\n\t\t\treturn fmt.Sprintf(\"%s(%s)\", s.logValueFuncName(typ), base)\n\t\t}\n\t\treturn fmt.Sprintf(\"%s(%s).String()\", s.logValueFuncName(typ), base)\n\t}\n\tif field.Type.Repeated {\n\t\treturn base\n\t}\n\tswitch field.Type.Kind {\n\tcase types.Int32, types.Sint32, types.Sfixed32:\n\t\tbase = fmt.Sprintf(\"int64(%s)\", base)\n\tcase types.Uint32, types.Fixed32:\n\t\tbase = fmt.Sprintf(\"uint64(%s)\", base)\n\tcase types.Float:\n\t\tbase = fmt.Sprintf(\"float64(%s)\", base)\n\tcase types.Bytes:\n\t\tbase = fmt.Sprintf(\"string(%s)\", base)\n\t}\n\treturn base\n}\n\nfunc (s *Service) logValueFuncName(typ *resolver.Type) string {\n\tif typ.Kind == types.Message {\n\t\tisMap := typ.Message.IsMapEntry\n\t\tif typ.Repeated && !isMap {\n\t\t\treturn fmt.Sprintf(\"s.%s\", s.repeatedMessageToLogValueName(typ.Message))\n\t\t}\n\t\treturn fmt.Sprintf(\"s.%s\", s.messageToLogValueName(typ.Message))\n\t}\n\tif typ.Kind == types.Enum {\n\t\tif typ.Repeated {\n\t\t\treturn fmt.Sprintf(\"s.%s\", s.repeatedEnumToLogValueName(typ.Enum))\n\t\t}\n\t\treturn fmt.Sprintf(\"s.%s\", s.enumToLogValueName(typ.Enum))\n\t}\n\treturn \"\"\n}\n\ntype DependentMethod struct {\n\tName string\n\tFQDN string\n}\n\nfunc (s *Service) DependentMethods() []*DependentMethod {\n\tmethodMap := make(map[string]*DependentMethod)\n\tfor _, method := range s.Service.Methods {\n\t\tfor _, depMethod := range s.dependentMethods(method.FederationResponse()) {\n\t\t\tmethodMap[depMethod.Name] = depMethod\n\t\t}\n\t}\n\tdepMethods := make([]*DependentMethod, 0, len(methodMap))\n\tfor _, depMethod := range methodMap {\n\t\tdepMethods = append(depMethods, depMethod)\n\t}\n\tsort.Slice(depMethods, func(i, j int) bool {\n\t\treturn depMethods[i].Name < depMethods[j].Name\n\t})\n\treturn depMethods\n}\n\nfunc (s *Service) dependentMethods(msg *resolver.Message) []*DependentMethod {\n\tif msg.Rule == nil {\n\t\treturn nil\n\t}\n\tvar ret []*DependentMethod\n\tfor _, varDef := range msg.Rule.DefSet.Definitions() {\n\t\tif varDef.Expr == nil {\n\t\t\tcontinue\n\t\t}\n\n\t\texpr := varDef.Expr\n\t\tif expr.Call != nil {\n\t\t\tif expr.Call.Method != nil {\n\t\t\t\tmethod := expr.Call.Method\n\t\t\t\tret = append(ret, &DependentMethod{\n\t\t\t\t\tName: fmt.Sprintf(\"%s_%s\", fullServiceName(method.Service), method.Name),\n\t\t\t\t\tFQDN: \"/\" + method.FQDN(),\n\t\t\t\t})\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\tfor _, msgExpr := range varDef.MessageExprs() {\n\t\t\tret = append(ret, s.dependentMethods(msgExpr.Message)...)\n\t\t}\n\t}\n\tfor _, field := range msg.Fields {\n\t\tif field.Rule == nil {\n\t\t\tcontinue\n\t\t}\n\t\tif field.Rule.Oneof == nil {\n\t\t\tcontinue\n\t\t}\n\t\tfor _, varDef := range field.Rule.Oneof.DefSet.Definitions() {\n\t\t\tif varDef.Expr == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\texpr := varDef.Expr\n\t\t\tif expr.Call != nil {\n\t\t\t\tif expr.Call.Method != nil {\n\t\t\t\t\tmethod := expr.Call.Method\n\t\t\t\t\tret = append(ret, &DependentMethod{\n\t\t\t\t\t\tName: fmt.Sprintf(\"%s_%s\", fullServiceName(method.Service), method.Name),\n\t\t\t\t\t\tFQDN: \"/\" + method.FQDN(),\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tfor _, msgExpr := range varDef.MessageExprs() {\n\t\t\t\tret = append(ret, s.dependentMethods(msgExpr.Message)...)\n\t\t\t}\n\t\t}\n\t}\n\treturn ret\n}\n\ntype Method struct {\n\t*resolver.Method\n\tService *Service\n\tfile    *File\n}\n\nfunc (m *Method) Name() string {\n\treturn util.ToPublicGoVariable(m.Method.Name)\n}\n\nfunc (m *Method) ProtoFQDN() string {\n\treturn m.FQDN()\n}\n\nfunc (m *Method) UseTimeout() bool {\n\tif m.Rule == nil {\n\t\treturn false\n\t}\n\treturn m.Rule.Timeout != nil\n}\n\nfunc (m *Method) Timeout() string {\n\treturn fmt.Sprintf(\"%[1]d/* %[1]s */\", *m.Rule.Timeout)\n}\n\nfunc (m *Method) CustomResponse() bool {\n\treturn m.Rule != nil && m.Rule.Response != nil\n}\n\nfunc (m *Method) ResponseCastFuncName() string {\n\treturn castFuncName(\n\t\tresolver.NewMessageType(m.Rule.Response, false),\n\t\tresolver.NewMessageType(m.Response, false),\n\t)\n}\n\nfunc (m *Method) ResolverName() string {\n\tresponse := m.FederationResponse()\n\tmsg := fullMessageName(response)\n\tif response.Rule == nil {\n\t\treturn fmt.Sprintf(\"resolver.Resolve_%s\", msg)\n\t}\n\treturn fmt.Sprintf(\"resolve_%s\", msg)\n}\n\nfunc (m *Method) ArgumentName() string {\n\tmsg := fullMessageName(m.FederationResponse())\n\treturn fmt.Sprintf(\"%s_%sArgument\", m.Service.ServiceName(), msg)\n}\n\nfunc (m *Method) RequestType() string {\n\treturn m.file.toTypeText(resolver.NewMessageType(m.Request, false))\n}\n\nfunc (m *Method) ReturnType() string {\n\treturn m.file.toTypeText(resolver.NewMessageType(m.Response, false))\n}\n\nfunc (m *Method) ReturnTypeWithoutPtr() string {\n\treturn strings.TrimPrefix(m.ReturnType(), \"*\")\n}\n\nfunc (m *Method) ReturnTypeArguments() []string {\n\tvar args []string\n\tfor _, field := range m.Request.Fields {\n\t\targs = append(args, util.ToPublicGoVariable(field.Name))\n\t}\n\treturn args\n}\n\nfunc (s *Service) Methods() []*Method {\n\tmethods := make([]*Method, 0, len(s.Service.Methods))\n\tfor _, method := range s.Service.Methods {\n\t\tmethods = append(methods, &Method{\n\t\t\tService: s,\n\t\t\tMethod:  method,\n\t\t\tfile:    s.file,\n\t\t})\n\t}\n\treturn methods\n}\n\ntype Message struct {\n\t*resolver.Message\n\tService *Service\n\tfile    *File\n}\n\nfunc (m *Message) CELCacheIndex() int {\n\treturn m.Service.CELCacheIndex()\n}\n\nfunc (m *Message) ProtoFQDN() string {\n\treturn m.FQDN()\n}\n\nfunc (m *Message) ResolverName() string {\n\tmsg := fullMessageName(m.Message)\n\treturn fmt.Sprintf(\"resolve_%s\", msg)\n}\n\nfunc (m *Message) RequestType() string {\n\tmsg := fullMessageName(m.Message)\n\treturn fmt.Sprintf(\"%sArgument\", msg)\n}\n\nfunc (m *Message) RequestProtoType() string {\n\treturn m.Message.Rule.MessageArgument.FQDN()\n}\n\nfunc (m *Message) CustomResolverName() string {\n\tmsg := fullMessageName(m.Message)\n\treturn fmt.Sprintf(\"Resolve_%s\", msg)\n}\n\nfunc (m *Message) ReturnType() string {\n\treturn strings.TrimPrefix(m.file.toTypeText(resolver.NewMessageType(m.Message, false)), \"*\")\n}\n\nfunc (m *Message) LogValueReturnType() string {\n\treturn fullMessageName(m.Message)\n}\n\nfunc (m *Message) VariableDefinitionSet() *VariableDefinitionSet {\n\tif m.Rule == nil {\n\t\treturn nil\n\t}\n\tif m.Rule.DefSet == nil {\n\t\treturn nil\n\t}\n\tif len(m.Rule.DefSet.Defs) == 0 {\n\t\treturn nil\n\t}\n\treturn &VariableDefinitionSet{\n\t\tVariableDefinitionSet: m.Rule.DefSet,\n\t\tsvc:                   m.Service,\n\t}\n}\n\ntype VariableDefinitionSet struct {\n\tsvc *Service\n\t*resolver.VariableDefinitionSet\n}\n\nfunc (set *VariableDefinitionSet) Definitions() []*VariableDefinition {\n\tif set == nil {\n\t\treturn nil\n\t}\n\tret := make([]*VariableDefinition, 0, len(set.VariableDefinitionSet.Definitions()))\n\tfor _, def := range set.VariableDefinitionSet.Definitions() {\n\t\tret = append(ret, &VariableDefinition{\n\t\t\tService:            set.svc,\n\t\t\tVariableDefinition: def,\n\t\t\tfile:               set.svc.file,\n\t\t})\n\t}\n\treturn ret\n}\n\nfunc (set *VariableDefinitionSet) DependencyGraph() string {\n\tif set == nil {\n\t\treturn \"\"\n\t}\n\ttree := resolver.DependencyGraphTreeFormat(set.DefinitionGroups())\n\tif !strings.HasSuffix(tree, \"\\n\") {\n\t\t// If there is only one node, no newline code is added at the end.\n\t\t// In this case, do not display graphs.\n\t\treturn \"\"\n\t}\n\treturn tree\n}\n\nfunc (set *VariableDefinitionSet) VariableDefinitionGroups() []*VariableDefinitionGroup {\n\tif set == nil {\n\t\treturn nil\n\t}\n\tvar groups []*VariableDefinitionGroup\n\tfor _, group := range set.DefinitionGroups() {\n\t\tgroups = append(groups, &VariableDefinitionGroup{\n\t\t\tService:                 set.svc,\n\t\t\tVariableDefinitionGroup: group,\n\t\t})\n\t}\n\treturn groups\n}\n\nfunc (m *Message) IsDeclVariables() bool {\n\treturn m.HasCELValue() || m.Rule != nil && len(m.Rule.DefSet.DefinitionGroups()) != 0\n}\n\ntype DeclVariable struct {\n\tName string\n\tType string\n}\n\nfunc (m *Message) DeclVariables() []*DeclVariable {\n\tif m.Rule == nil {\n\t\treturn nil\n\t}\n\tif !m.HasResolvers() {\n\t\treturn nil\n\t}\n\tvalueMap := map[string]*DeclVariable{}\n\tfor _, group := range m.Message.VariableDefinitionGroups() {\n\t\tfor _, def := range group.VariableDefinitions() {\n\t\t\tif def == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tvalueMap[def.Name] = &DeclVariable{\n\t\t\t\tName: util.ToPublicGoVariable(def.Name),\n\t\t\t\tType: m.file.toTypeText(def.Expr.Type),\n\t\t\t}\n\t\t}\n\t}\n\tvalues := make([]*DeclVariable, 0, len(valueMap))\n\tfor _, value := range valueMap {\n\t\tvalues = append(values, value)\n\t}\n\tsort.Slice(values, func(i, j int) bool {\n\t\treturn values[i].Name < values[j].Name\n\t})\n\treturn values\n}\n\ntype ReturnField struct {\n\tCustomResolver *CustomResolverReturnField\n\tOneof          *OneofReturnField\n\tCEL            *CELReturnField\n\tAutoBind       *AutoBindReturnField\n}\n\ntype OneofReturnField struct {\n\tName              string\n\tOneofCaseFields   []*OneofField\n\tOneofDefaultField *OneofField\n}\n\ntype CELReturnField struct {\n\tCEL          *resolver.CELValue\n\tSetterParam  *SetterParam\n\tProtoComment string\n\tType         string\n}\n\ntype SetterParam struct {\n\tName           string\n\tValue          string\n\tRequiredCast   bool\n\tCastFunc       string\n\tEnumSelector   *EnumSelectorSetterParam\n\tOneofTypeName  string\n\tOneofFieldName string\n}\n\ntype EnumSelectorSetterParam struct {\n\tType                  string\n\tRequiredCastTrueType  bool\n\tRequiredCastFalseType bool\n\tTrueType              string\n\tFalseType             string\n\tCastTrueTypeFunc      string\n\tCastFalseTypeFunc     string\n\tTrueEnumSelector      *EnumSelectorSetterParam\n\tFalseEnumSelector     *EnumSelectorSetterParam\n}\n\ntype CustomResolverReturnField struct {\n\tName                string\n\tResolverName        string\n\tRequestType         string\n\tMessageArgumentName string\n\tMessageName         string\n}\n\ntype AutoBindReturnField struct {\n\tName         string\n\tValue        string\n\tRequiredCast bool\n\tCastFunc     string\n\tProtoComment string\n}\n\nfunc (f *OneofReturnField) HasFieldOneofRule() bool {\n\tfor _, field := range f.OneofCaseFields {\n\t\tif field.FieldOneofRule != nil {\n\t\t\treturn true\n\t\t}\n\t}\n\tif f.OneofDefaultField != nil && f.OneofDefaultField.FieldOneofRule != nil {\n\t\treturn true\n\t}\n\treturn false\n}\n\ntype OneofField struct {\n\tExpr           string\n\tBy             string\n\tType           string\n\tCondition      string\n\tName           string\n\tValue          string\n\tCastValue      string\n\tMessage        *Message\n\tFieldOneofRule *resolver.FieldOneofRule\n\tSetterParam    *SetterParam\n}\n\nfunc (oneof *OneofField) VariableDefinitionSet() *VariableDefinitionSet {\n\tif oneof.FieldOneofRule == nil {\n\t\treturn nil\n\t}\n\tif oneof.FieldOneofRule.DefSet == nil {\n\t\treturn nil\n\t}\n\tif len(oneof.FieldOneofRule.DefSet.Defs) == 0 {\n\t\treturn nil\n\t}\n\treturn &VariableDefinitionSet{\n\t\tVariableDefinitionSet: oneof.FieldOneofRule.DefSet,\n\t\tsvc:                   oneof.Message.Service,\n\t}\n}\n\ntype CastField struct {\n\tName     string\n\tservice  *resolver.Service\n\tfromType *resolver.Type\n\ttoType   *resolver.Type\n\tfile     *File\n}\n\nfunc (f *CastField) RequestType() string {\n\treturn f.file.toTypeText(f.fromType)\n}\n\n// ResponseType this represents the type of the return value of the cast function.\n// This type is always struct when the conversion destination type belongs to oneof.\nfunc (f *CastField) ResponseType() string {\n\treturn f.file.toTypeText(f.toType)\n}\n\n// ReturnType this type that is output regardless of whether the destination type is a oneof field or not.\n// This is used internally in the cast process.\nfunc (f *CastField) ReturnType() string {\n\ttoType := f.toType.Clone()\n\ttoType.OneofField = nil\n\treturn f.file.toTypeText(toType)\n}\n\nfunc (f *CastField) RequestProtoFQDN() string {\n\treturn f.fromType.FQDN()\n}\n\nfunc (f *CastField) ResponseProtoFQDN() string {\n\treturn f.toType.FQDN()\n}\n\nfunc (f *CastField) IsSlice() bool {\n\treturn f.fromType.Repeated\n}\n\nfunc (f *CastField) IsOneof() bool {\n\treturn f.fromType.OneofField != nil\n}\n\nfunc (f *CastField) IsStruct() bool {\n\treturn f.fromType.Kind == types.Message\n}\n\nfunc (f *CastField) IsEnumToNumber() bool {\n\treturn f.fromType.Kind == types.Enum && f.toType.Kind != types.Enum && f.toType.IsNumber()\n}\n\nfunc (f *CastField) IsNumberToEnum() bool {\n\treturn f.fromType.Kind != types.Enum && f.fromType.IsNumber() && f.toType.Kind == types.Enum\n}\n\nfunc (f *CastField) IsEnum() bool {\n\treturn f.fromType.Kind == types.Enum && f.toType.Kind == types.Enum\n}\n\nfunc (f *CastField) IsMap() bool {\n\treturn f.fromType.Kind == types.Message && f.fromType.Message.IsMapEntry &&\n\t\tf.toType.Kind == types.Message && f.toType.Message.IsMapEntry\n}\n\nvar (\n\tcastValidationNumberMap = map[string]bool{\n\t\ttypes.Int64.ToString() + types.Int32.ToString():   true,\n\t\ttypes.Int64.ToString() + types.Uint32.ToString():  true,\n\t\ttypes.Int64.ToString() + types.Uint64.ToString():  true,\n\t\ttypes.Int32.ToString() + types.Uint32.ToString():  true,\n\t\ttypes.Int32.ToString() + types.Uint64.ToString():  true,\n\t\ttypes.Uint64.ToString() + types.Int32.ToString():  true,\n\t\ttypes.Uint64.ToString() + types.Int64.ToString():  true,\n\t\ttypes.Uint64.ToString() + types.Uint32.ToString(): true,\n\t\ttypes.Uint32.ToString() + types.Int32.ToString():  true,\n\t}\n)\n\nfunc (f *CastField) IsRequiredValidationNumber() bool {\n\treturn castValidationNumberMap[f.fromType.Kind.ToString()+f.toType.Kind.ToString()]\n}\n\nfunc (f *CastField) CastWithValidationName() string {\n\treturn fmt.Sprintf(\"%sTo%s\", util.ToPublicVariable(f.RequestType()), util.ToPublicVariable(f.ReturnType()))\n}\n\ntype CastOneofWrapper struct {\n\tName      string\n\tFieldName string\n}\n\ntype CastEnum struct {\n\t*CastOneofWrapper\n\tFromValues   []*CastEnumValue\n\tDefaultValue string\n\tReturnType   string\n}\n\ntype CastEnumValue struct {\n\tFromValue string\n\tToValue   string\n}\n\nfunc (f *CastField) CastOneofWrapper() *CastOneofWrapper {\n\tif f.toType.OneofField == nil {\n\t\treturn nil\n\t}\n\tfield := f.toType.OneofField\n\tfieldName := util.ToPublicGoVariable(field.Name)\n\ttypeName := strings.TrimPrefix(f.file.messageTypeToText(field.Message), \"*\") + \"_\" + fieldName\n\tif field.IsConflict() {\n\t\ttypeName += \"_\"\n\t}\n\treturn &CastOneofWrapper{\n\t\tName:      typeName,\n\t\tFieldName: fieldName,\n\t}\n}\n\nfunc (f *CastField) ToEnum() (*CastEnum, error) {\n\ttoEnum := f.toType.Enum\n\tif toEnum.Rule != nil && len(toEnum.Rule.Aliases) != 0 {\n\t\treturn f.toEnumFromDepServiceToService(toEnum, f.fromType.Enum), nil\n\t}\n\tfromEnum := f.fromType.Enum\n\tif fromEnum.Rule != nil && len(fromEnum.Rule.Aliases) != 0 {\n\t\t// the type conversion is performed at the time of gRPC method call.\n\t\treturn f.toEnumFromServiceToDepService(fromEnum, f.toType.Enum)\n\t}\n\ttoEnumName := toEnumValuePrefix(f.file, f.toType)\n\tfromEnumName := toEnumValuePrefix(f.file, f.fromType)\n\tvar enumValues []*CastEnumValue\n\tfor _, toValue := range toEnum.Values {\n\t\tif toValue.Rule == nil {\n\t\t\tcontinue\n\t\t}\n\t\tif toValue.Rule.NoAlias {\n\t\t\tcontinue\n\t\t}\n\t\tfromValue := fromEnum.Value(toValue.Value)\n\t\tif fromValue == nil {\n\t\t\tcontinue\n\t\t}\n\t\tenumValues = append(enumValues, &CastEnumValue{\n\t\t\tFromValue: toEnumValueText(fromEnumName, fromValue.Value),\n\t\t\tToValue:   toEnumValueText(toEnumName, toValue.Value),\n\t\t})\n\t}\n\treturn &CastEnum{\n\t\tCastOneofWrapper: f.CastOneofWrapper(),\n\t\tFromValues:       enumValues,\n\t\tDefaultValue:     \"0\",\n\t\tReturnType:       f.ReturnType(),\n\t}, nil\n}\n\n// toEnumFromDepServiceToService converts dependent service's enum type to our service's enum type.\n// alias is defined for dependent service.\nfunc (f *CastField) toEnumFromDepServiceToService(enum, depSvcEnum *resolver.Enum) *CastEnum {\n\tvar (\n\t\tenumValues   []*CastEnumValue\n\t\tdefaultValue = \"0\"\n\t)\n\tsvcEnumName := toEnumValuePrefix(f.file, f.toType)\n\tdepSvcEnumName := toEnumValuePrefix(f.file, f.fromType)\n\tfor _, value := range enum.Values {\n\t\tif value.Rule == nil {\n\t\t\tcontinue\n\t\t}\n\t\tfor _, enumValueAlias := range value.Rule.Aliases {\n\t\t\tif enumValueAlias.EnumAlias != depSvcEnum {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tfor _, alias := range enumValueAlias.Aliases {\n\t\t\t\tenumValues = append(enumValues, &CastEnumValue{\n\t\t\t\t\tFromValue: toEnumValueText(depSvcEnumName, alias.Value),\n\t\t\t\t\tToValue:   toEnumValueText(svcEnumName, value.Value),\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tif value.Rule.Default {\n\t\t\tdefaultValue = toEnumValueText(svcEnumName, value.Value)\n\t\t}\n\t}\n\treturn &CastEnum{\n\t\tCastOneofWrapper: f.CastOneofWrapper(),\n\t\tFromValues:       enumValues,\n\t\tDefaultValue:     defaultValue,\n\t\tReturnType:       f.ReturnType(),\n\t}\n}\n\n// toEnumFromServiceToDepService converts our service's enum type to dependent service's enum type.\n// alias is defined for dependent service.\nfunc (f *CastField) toEnumFromServiceToDepService(enum, depSvcEnum *resolver.Enum) (*CastEnum, error) {\n\tvar (\n\t\tenumValues   []*CastEnumValue\n\t\tdefaultValue = \"0\"\n\t)\n\tdepSvcEnumName := toEnumValuePrefix(f.file, f.toType)\n\tsvcEnumName := toEnumValuePrefix(f.file, f.fromType)\n\tfor _, value := range enum.Values {\n\t\tif value.Rule == nil {\n\t\t\tcontinue\n\t\t}\n\t\tfor _, enumValueAlias := range value.Rule.Aliases {\n\t\t\tif enumValueAlias.EnumAlias != depSvcEnum {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif len(enumValueAlias.Aliases) != 1 {\n\t\t\t\treturn nil, fmt.Errorf(\"found multiple aliases are set. the conversion destination cannot be uniquely determined\")\n\t\t\t}\n\t\t\tdepEnumValue := enumValueAlias.Aliases[0]\n\t\t\tenumValues = append(enumValues, &CastEnumValue{\n\t\t\t\tFromValue: toEnumValueText(svcEnumName, value.Value),\n\t\t\t\tToValue:   toEnumValueText(depSvcEnumName, depEnumValue.Value),\n\t\t\t})\n\t\t}\n\t\tif value.Rule.Default {\n\t\t\treturn nil, fmt.Errorf(\"found default alias is set. the conversion destination cannot be uniquely determined\")\n\t\t}\n\t}\n\treturn &CastEnum{\n\t\tCastOneofWrapper: f.CastOneofWrapper(),\n\t\tFromValues:       enumValues,\n\t\tDefaultValue:     defaultValue,\n\t\tReturnType:       f.ReturnType(),\n\t}, nil\n}\n\ntype CastSlice struct {\n\t*CastOneofWrapper\n\tReturnType       string\n\tElemRequiredCast bool\n\tElemCastName     string\n}\n\nfunc (f *CastField) ToSlice() *CastSlice {\n\tfromElemType := f.fromType.Clone()\n\ttoElemType := f.toType.Clone()\n\tfromElemType.Repeated = false\n\ttoElemType.Repeated = false\n\treturn &CastSlice{\n\t\tCastOneofWrapper: f.CastOneofWrapper(),\n\t\tReturnType:       f.ReturnType(),\n\t\tElemRequiredCast: requiredCast(fromElemType, toElemType),\n\t\tElemCastName:     castFuncName(fromElemType, toElemType),\n\t}\n}\n\ntype CastStruct struct {\n\t*CastOneofWrapper\n\tName   string\n\tFields []*CastStructField\n\tOneofs []*CastOneofStruct\n}\n\ntype CastOneofStruct struct {\n\tName   string\n\tFields []*CastStructField\n}\n\ntype CastStructField struct {\n\tFromType      string\n\tToFieldName   string\n\tFromFieldName string\n\tCastName      string\n\tRequiredCast  bool\n}\n\nfunc (f *CastField) ToStruct() *CastStruct {\n\ttoMsg := f.toType.Message\n\tfromMsg := f.fromType.Message\n\n\tvar castFields []*CastStructField\n\tfor _, toField := range toMsg.Fields {\n\t\tif toField.Type.OneofField != nil {\n\t\t\tcontinue\n\t\t}\n\t\tfield := f.toStructField(toField, fromMsg)\n\t\tif field == nil {\n\t\t\tcontinue\n\t\t}\n\t\tcastFields = append(castFields, field)\n\t}\n\n\tvar castOneofStructs []*CastOneofStruct\n\tfor _, oneof := range toMsg.Oneofs {\n\t\tvar fields []*CastStructField\n\t\tfor _, toField := range oneof.Fields {\n\t\t\tif toField.Type.OneofField == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tfield := f.toStructField(toField, fromMsg)\n\t\t\tif field == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tfields = append(fields, field)\n\t\t}\n\t\tcastOneofStructs = append(castOneofStructs, &CastOneofStruct{\n\t\t\tName:   util.ToPublicGoVariable(oneof.Name),\n\t\t\tFields: fields,\n\t\t})\n\t}\n\n\tvar names []string\n\tfor _, n := range append(toMsg.ParentMessageNames(), toMsg.Name) {\n\t\tnames = append(names, util.ToPublicGoVariable(n))\n\t}\n\tname := strings.Join(names, \"_\")\n\tif f.service.GoPackage().ImportPath != toMsg.GoPackage().ImportPath {\n\t\tname = fmt.Sprintf(\"%s.%s\", f.file.getAlias(toMsg.GoPackage()), name)\n\t}\n\n\treturn &CastStruct{\n\t\tCastOneofWrapper: f.CastOneofWrapper(),\n\t\tName:             name,\n\t\tFields:           castFields,\n\t\tOneofs:           castOneofStructs,\n\t}\n}\n\nfunc (f *CastField) toStructField(toField *resolver.Field, fromMsg *resolver.Message) *CastStructField {\n\tif toField.HasRule() && len(toField.Rule.Aliases) != 0 {\n\t\tfor _, alias := range toField.Rule.Aliases {\n\t\t\tif fromMsg != alias.Message {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tfromField := alias\n\t\t\tfromType := fromField.Type\n\t\t\ttoType := toField.Type\n\t\t\trequiredCast := requiredCast(fromType, toType)\n\t\t\treturn &CastStructField{\n\t\t\t\tFromType:      f.file.toTypeText(fromType),\n\t\t\t\tToFieldName:   util.ToPublicGoVariable(toField.Name),\n\t\t\t\tFromFieldName: util.ToPublicGoVariable(fromField.Name),\n\t\t\t\tRequiredCast:  requiredCast,\n\t\t\t\tCastName:      castFuncName(fromType, toType),\n\t\t\t}\n\t\t}\n\t}\n\tfromField := fromMsg.Field(toField.Name)\n\tif fromField == nil {\n\t\treturn nil\n\t}\n\tfromType := fromField.Type\n\ttoType := toField.Type\n\trequiredCast := requiredCast(fromType, toType)\n\treturn &CastStructField{\n\t\tFromType:      f.file.toTypeText(fromType),\n\t\tToFieldName:   util.ToPublicGoVariable(toField.Name),\n\t\tFromFieldName: util.ToPublicGoVariable(fromField.Name),\n\t\tRequiredCast:  requiredCast,\n\t\tCastName:      castFuncName(fromType, toType),\n\t}\n}\n\ntype CastOneof struct {\n\tName          string\n\tFromFieldName string\n\tToFieldName   string\n\tCastName      string\n\tRequiredCast  bool\n}\n\nfunc (f *CastField) ToOneof() *CastOneof {\n\ttoField := f.toType.OneofField\n\tmsg := f.toType.OneofField.Oneof.Message\n\n\tfromField := f.fromType.OneofField\n\tfromType := fromField.Type.Clone()\n\ttoType := toField.Type.Clone()\n\tfromType.OneofField = nil\n\ttoType.OneofField = nil\n\trequiredCast := requiredCast(fromType, toType)\n\tvar names []string\n\tfor _, n := range append(msg.ParentMessageNames(), msg.Name, toField.Name) {\n\t\tnames = append(names, util.ToPublicGoVariable(n))\n\t}\n\tname := strings.Join(names, \"_\")\n\tif toField.IsConflict() {\n\t\tname += \"_\"\n\t}\n\tif f.service.GoPackage().ImportPath != msg.GoPackage().ImportPath {\n\t\tname = fmt.Sprintf(\"%s.%s\", f.file.getAlias(msg.GoPackage()), name)\n\t}\n\treturn &CastOneof{\n\t\tName:          name,\n\t\tFromFieldName: util.ToPublicGoVariable(fromField.Name),\n\t\tToFieldName:   util.ToPublicGoVariable(toField.Name),\n\t\tRequiredCast:  requiredCast,\n\t\tCastName:      castFuncName(fromType, toType),\n\t}\n}\n\ntype CastMap struct {\n\t*CastOneofWrapper\n\tReturnType        string\n\tKeyRequiredCast   bool\n\tKeyCastName       string\n\tValueRequiredCast bool\n\tValueCastName     string\n}\n\nfunc (f *CastField) ToMap() *CastMap {\n\tfromKeyType := f.fromType.Message.Fields[0].Type\n\ttoKeyType := f.toType.Message.Fields[0].Type\n\tfromValueType := f.fromType.Message.Fields[1].Type\n\ttoValueType := f.toType.Message.Fields[1].Type\n\treturn &CastMap{\n\t\tCastOneofWrapper:  f.CastOneofWrapper(),\n\t\tReturnType:        f.ReturnType(),\n\t\tKeyRequiredCast:   requiredCast(fromKeyType, toKeyType),\n\t\tKeyCastName:       castFuncName(fromKeyType, toKeyType),\n\t\tValueRequiredCast: requiredCast(fromValueType, toValueType),\n\t\tValueCastName:     castFuncName(fromValueType, toValueType),\n\t}\n}\n\nfunc (m *Message) CustomResolverArguments() []*Argument {\n\tvar args []*Argument\n\targName := variableTypeName(m.Message)\n\targNameMap := make(map[string]struct{})\n\tfor _, group := range m.VariableDefinitionGroups() {\n\t\tfor _, def := range group.VariableDefinitions() {\n\t\t\tif def == nil || !def.Used {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tname := def.Name\n\t\t\tif _, exists := argNameMap[name]; exists {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\targs = append(args, &Argument{\n\t\t\t\tName:  fmt.Sprintf(\"%s_%s.%s\", m.Service.ServiceName(), argName, util.ToPublicGoVariable(name)),\n\t\t\t\tValue: toUserDefinedVariable(name),\n\t\t\t})\n\t\t\targNameMap[name] = struct{}{}\n\t\t}\n\t}\n\tsort.Slice(args, func(i, j int) bool {\n\t\treturn args[i].Name < args[j].Name\n\t})\n\treturn args\n}\n\nfunc (m *Message) ReturnFields() ([]*ReturnField, error) {\n\tvar returnFields []*ReturnField\n\tfor _, field := range m.Fields {\n\t\tif field.Oneof != nil {\n\t\t\tcontinue\n\t\t}\n\t\tif !field.HasRule() {\n\t\t\tcontinue\n\t\t}\n\t\trule := field.Rule\n\t\tswitch {\n\t\tcase rule.CustomResolver:\n\t\t\treturnFields = append(returnFields, &ReturnField{\n\t\t\t\tCustomResolver: m.customResolverToReturnField(field),\n\t\t\t})\n\t\tcase rule.Value != nil:\n\t\t\tvalue := rule.Value\n\t\t\treturnFields = append(returnFields, &ReturnField{\n\t\t\t\tCEL: m.celValueToReturnField(field, value.CEL),\n\t\t\t})\n\t\tcase rule.AutoBindField != nil:\n\t\t\tautoBind, err := m.autoBindFieldToReturnField(field, rule.AutoBindField)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturnFields = append(returnFields, &ReturnField{\n\t\t\t\tAutoBind: autoBind,\n\t\t\t})\n\t\t}\n\t}\n\tfor _, oneof := range m.Oneofs {\n\t\treturnField, err := m.oneofValueToReturnField(oneof)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturnFields = append(returnFields, &ReturnField{\n\t\t\tOneof: returnField,\n\t\t})\n\t}\n\treturn returnFields, nil\n}\n\nfunc (m *Message) autoBindFieldToReturnField(field *resolver.Field, autoBindField *resolver.AutoBindField) (*AutoBindReturnField, error) {\n\tvar name string\n\tif autoBindField.VariableDefinition != nil {\n\t\tname = autoBindField.VariableDefinition.Name\n\t}\n\n\tfieldName := util.ToPublicGoVariable(field.Name)\n\tvar (\n\t\tvalue    string\n\t\tcastFunc string\n\t)\n\tif field.Oneof != nil {\n\t\tvalue = fmt.Sprintf(\n\t\t\t\"value.vars.%s.%s.(%s)\",\n\t\t\tutil.ToPublicGoVariable(name),\n\t\t\tutil.ToPublicGoVariable(field.Oneof.Name),\n\t\t\tm.file.toTypeText(autoBindField.Field.Type),\n\t\t)\n\t} else {\n\t\tvalue = fmt.Sprintf(\"value.vars.%s.Get%s()\", util.ToPublicGoVariable(name), fieldName)\n\t}\n\trequiredCast := field.RequiredTypeConversion(resolver.FieldConversionKindAutoBind)\n\tif requiredCast {\n\t\tvar fromType *resolver.Type\n\t\tfor _, sourceType := range field.SourceTypes(resolver.FieldConversionKindAutoBind) {\n\t\t\tif typ := m.autoBindSourceType(autoBindField, sourceType); typ != nil {\n\t\t\t\tfromType = typ\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif fromType == nil {\n\t\t\treturn nil, fmt.Errorf(\n\t\t\t\t\"failed to autobind: expected message type is %q but it is not found from %q field\",\n\t\t\t\tautoBindField.Field.Message.FQDN(),\n\t\t\t\tfield.FQDN(),\n\t\t\t)\n\t\t}\n\t\tcastFunc = castFuncName(fromType, field.Type)\n\t}\n\treturn &AutoBindReturnField{\n\t\tName:         fieldName,\n\t\tValue:        value,\n\t\tRequiredCast: requiredCast,\n\t\tCastFunc:     castFunc,\n\t\tProtoComment: fmt.Sprintf(`// { name: %q, autobind: true }`, name),\n\t}, nil\n}\n\nfunc (m *Message) autoBindSourceType(autoBindField *resolver.AutoBindField, candidateType *resolver.Type) *resolver.Type {\n\tswitch autoBindField.Field.Type.Kind {\n\tcase types.Message:\n\t\tif candidateType.Message == nil {\n\t\t\treturn nil\n\t\t}\n\t\tif autoBindField.Field.Type.Message != candidateType.Message {\n\t\t\treturn nil\n\t\t}\n\t\treturn candidateType\n\tcase types.Enum:\n\t\tif candidateType.Enum == nil {\n\t\t\treturn nil\n\t\t}\n\t\tif autoBindField.Field.Type.Enum != candidateType.Enum {\n\t\t\treturn nil\n\t\t}\n\t\treturn candidateType\n\tdefault:\n\t\treturn candidateType\n\t}\n}\n\nfunc (m *Message) celValueToReturnField(field *resolver.Field, value *resolver.CELValue) *CELReturnField {\n\ttoType := field.Type\n\tfromType := value.Out\n\n\tenumSelectorSetterParam := m.file.createEnumSelectorParam(fromType.Message, toType)\n\n\ttoText := m.file.toTypeText(toType)\n\tfromText := m.file.toTypeText(fromType)\n\n\tvar (\n\t\ttyp          string\n\t\trequiredCast bool\n\t)\n\tswitch fromType.Kind {\n\tcase types.Message, types.Enum:\n\t\ttyp = fromText\n\t\trequiredCast = field.RequiredTypeConversion(resolver.FieldConversionKindValue)\n\tdefault:\n\t\t// Since fromType is a primitive type, type conversion is possible on the CEL side.\n\t\ttyp = toText\n\t}\n\treturn &CELReturnField{\n\t\tCEL: value,\n\t\tProtoComment: field.Rule.ProtoFormat(&resolver.ProtoFormatOption{\n\t\t\tPrefix:         \"// \",\n\t\t\tIndentSpaceNum: 2,\n\t\t}),\n\t\tType: typ,\n\t\tSetterParam: &SetterParam{\n\t\t\tName:         util.ToPublicGoVariable(field.Name),\n\t\t\tValue:        \"v\",\n\t\t\tRequiredCast: requiredCast,\n\t\t\tEnumSelector: enumSelectorSetterParam,\n\t\t\tCastFunc:     castFuncName(fromType, toType),\n\t\t},\n\t}\n}\n\nfunc (f *File) createEnumSelectorParam(msg *resolver.Message, toType *resolver.Type) *EnumSelectorSetterParam {\n\tif msg == nil {\n\t\treturn nil\n\t}\n\tif !msg.IsEnumSelector() {\n\t\treturn nil\n\t}\n\tret := &EnumSelectorSetterParam{\n\t\tType: f.toTypeText(toType),\n\t}\n\ttrueType := msg.Fields[0].Type\n\tif trueType.Message != nil && trueType.Message.IsEnumSelector() {\n\t\tret.TrueEnumSelector = f.createEnumSelectorParam(trueType.Message, toType)\n\t} else {\n\t\tret.RequiredCastTrueType = requiredCast(trueType, toType)\n\t\tret.TrueType = f.toTypeText(trueType)\n\t\tret.CastTrueTypeFunc = castFuncName(trueType, toType)\n\t}\n\tfalseType := msg.Fields[1].Type\n\tif falseType.Message != nil && falseType.Message.IsEnumSelector() {\n\t\tret.FalseEnumSelector = f.createEnumSelectorParam(falseType.Message, toType)\n\t} else {\n\t\tret.RequiredCastFalseType = requiredCast(falseType, toType)\n\t\tret.FalseType = f.toTypeText(falseType)\n\t\tret.CastFalseTypeFunc = castFuncName(falseType, toType)\n\t}\n\treturn ret\n}\n\nfunc (m *Message) customResolverToReturnField(field *resolver.Field) *CustomResolverReturnField {\n\tmsgName := fullMessageName(m.Message)\n\tresolverName := fmt.Sprintf(\"Resolve_%s_%s\", msgName, util.ToPublicGoVariable(field.Name))\n\trequestType := fmt.Sprintf(\"%s_%sArgument\", msgName, util.ToPublicGoVariable(field.Name))\n\treturn &CustomResolverReturnField{\n\t\tName:                util.ToPublicGoVariable(field.Name),\n\t\tResolverName:        resolverName,\n\t\tRequestType:         requestType,\n\t\tMessageArgumentName: fmt.Sprintf(\"%sArgument\", msgName),\n\t\tMessageName:         msgName,\n\t}\n}\n\nfunc (m *Message) oneofValueToReturnField(oneof *resolver.Oneof) (*OneofReturnField, error) {\n\tvar (\n\t\tcaseFields   []*OneofField\n\t\tdefaultField *OneofField\n\t)\n\tfor _, field := range oneof.Fields {\n\t\tif !field.HasRule() {\n\t\t\tcontinue\n\t\t}\n\t\trule := field.Rule\n\t\tswitch {\n\t\tcase rule.AutoBindField != nil:\n\t\t\tautoBind, err := m.autoBindFieldToReturnField(field, rule.AutoBindField)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tvar castValue string\n\t\t\tif autoBind.CastFunc != \"\" {\n\t\t\t\tcastValue = fmt.Sprintf(\"s.%s(%s)\", autoBind.CastFunc, autoBind.Value)\n\t\t\t}\n\t\t\tcaseFields = append(caseFields, &OneofField{\n\t\t\t\tCondition: fmt.Sprintf(\"_, ok := %s; ok\", autoBind.Value),\n\t\t\t\tName:      autoBind.Name,\n\t\t\t\tValue:     autoBind.Value,\n\t\t\t\tCastValue: castValue,\n\t\t\t})\n\t\tcase rule.Oneof != nil:\n\t\t\t// explicit binding with FieldOneofRule.\n\t\t\tfromType := rule.Oneof.By.Out\n\t\t\ttoType := field.Type\n\n\t\t\tfieldName := util.ToPublicGoVariable(field.Name)\n\t\t\toneofTypeName := strings.TrimPrefix(m.file.messageTypeToText(m.Message), \"*\") + \"_\" + fieldName\n\t\t\tif toType.OneofField.IsConflict() {\n\t\t\t\toneofTypeName += \"_\"\n\t\t\t}\n\t\t\tvar (\n\t\t\t\tvalue     string\n\t\t\t\tcastValue string\n\t\t\t\tcastFunc  string\n\t\t\t)\n\t\t\ttyp := m.file.toTypeText(fromType)\n\t\t\tif requiredCast(fromType, toType) {\n\t\t\t\tcastFunc = castFuncName(fromType, toType)\n\t\t\t\tcastValue = fmt.Sprintf(\"&%s{%s: s.%s(v)}\", oneofTypeName, fieldName, castFunc)\n\t\t\t\tvalue = \"v\"\n\t\t\t} else {\n\t\t\t\tvalue = fmt.Sprintf(\"&%s{%s: v}\", oneofTypeName, fieldName)\n\t\t\t}\n\n\t\t\tif rule.Oneof.Default {\n\t\t\t\tdefaultField = &OneofField{\n\t\t\t\t\tBy:             rule.Oneof.By.Expr,\n\t\t\t\t\tType:           typ,\n\t\t\t\t\tCondition:      fmt.Sprintf(`oneof_%s.(bool)`, fieldName),\n\t\t\t\t\tName:           fieldName,\n\t\t\t\t\tValue:          value,\n\t\t\t\t\tCastValue:      castValue,\n\t\t\t\t\tFieldOneofRule: rule.Oneof,\n\t\t\t\t\tMessage:        m,\n\t\t\t\t\tSetterParam: &SetterParam{\n\t\t\t\t\t\tName:         util.ToPublicGoVariable(oneof.Name),\n\t\t\t\t\t\tValue:        value,\n\t\t\t\t\t\tEnumSelector: nil,\n\t\t\t\t\t\tRequiredCast: castFunc != \"\",\n\t\t\t\t\t\tCastFunc:     castFunc,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcaseFields = append(caseFields, &OneofField{\n\t\t\t\t\tExpr:           rule.Oneof.If.Expr,\n\t\t\t\t\tBy:             rule.Oneof.By.Expr,\n\t\t\t\t\tType:           typ,\n\t\t\t\t\tCondition:      fmt.Sprintf(`oneof_%s.(bool)`, fieldName),\n\t\t\t\t\tName:           fieldName,\n\t\t\t\t\tValue:          value,\n\t\t\t\t\tCastValue:      castValue,\n\t\t\t\t\tFieldOneofRule: rule.Oneof,\n\t\t\t\t\tMessage:        m,\n\t\t\t\t\tSetterParam: &SetterParam{\n\t\t\t\t\t\tName:         util.ToPublicGoVariable(oneof.Name),\n\t\t\t\t\t\tValue:        value,\n\t\t\t\t\t\tEnumSelector: nil,\n\t\t\t\t\t\tRequiredCast: castFunc != \"\",\n\t\t\t\t\t\tCastFunc:     castFunc,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n\treturn &OneofReturnField{\n\t\tName:              util.ToPublicGoVariable(oneof.Name),\n\t\tOneofCaseFields:   caseFields,\n\t\tOneofDefaultField: defaultField,\n\t}, nil\n}\n\ntype VariableDefinitionGroup struct {\n\tService *Service\n\tresolver.VariableDefinitionGroup\n}\n\nfunc (g *VariableDefinitionGroup) IsConcurrent() bool {\n\treturn g.Type() == resolver.ConcurrentVariableDefinitionGroupType\n}\n\nfunc (g *VariableDefinitionGroup) ExistsStart() bool {\n\trg, ok := g.VariableDefinitionGroup.(*resolver.SequentialVariableDefinitionGroup)\n\tif !ok {\n\t\treturn false\n\t}\n\treturn rg.Start != nil\n}\n\nfunc (g *VariableDefinitionGroup) ExistsEnd() bool {\n\tswitch rg := g.VariableDefinitionGroup.(type) {\n\tcase *resolver.SequentialVariableDefinitionGroup:\n\t\treturn rg.End != nil\n\tcase *resolver.ConcurrentVariableDefinitionGroup:\n\t\treturn rg.End != nil\n\t}\n\treturn false\n}\n\nfunc (g *VariableDefinitionGroup) Starts() []*VariableDefinitionGroup {\n\trg, ok := g.VariableDefinitionGroup.(*resolver.ConcurrentVariableDefinitionGroup)\n\tif !ok {\n\t\treturn nil\n\t}\n\tvar starts []*VariableDefinitionGroup\n\tfor _, start := range rg.Starts {\n\t\tstarts = append(starts, &VariableDefinitionGroup{\n\t\t\tService:                 g.Service,\n\t\t\tVariableDefinitionGroup: start,\n\t\t})\n\t}\n\treturn starts\n}\n\nfunc (g *VariableDefinitionGroup) Start() *VariableDefinitionGroup {\n\trg, ok := g.VariableDefinitionGroup.(*resolver.SequentialVariableDefinitionGroup)\n\tif !ok {\n\t\treturn nil\n\t}\n\treturn &VariableDefinitionGroup{\n\t\tService:                 g.Service,\n\t\tVariableDefinitionGroup: rg.Start,\n\t}\n}\n\nfunc (g *VariableDefinitionGroup) End() *VariableDefinition {\n\tswitch rg := g.VariableDefinitionGroup.(type) {\n\tcase *resolver.SequentialVariableDefinitionGroup:\n\t\treturn &VariableDefinition{\n\t\t\tService:            g.Service,\n\t\t\tVariableDefinition: rg.End,\n\t\t\tfile:               g.Service.file,\n\t\t}\n\tcase *resolver.ConcurrentVariableDefinitionGroup:\n\t\treturn &VariableDefinition{\n\t\t\tService:            g.Service,\n\t\t\tVariableDefinition: rg.End,\n\t\t\tfile:               g.Service.file,\n\t\t}\n\t}\n\treturn nil\n}\n\ntype VariableDefinition struct {\n\tService *Service\n\t*resolver.VariableDefinition\n\tfile *File\n}\n\nfunc (d *VariableDefinition) CELCacheIndex() int {\n\treturn d.Service.CELCacheIndex()\n}\n\nfunc (d *VariableDefinition) Key() string {\n\treturn d.VariableDefinition.Name\n}\n\nfunc (d *VariableDefinition) VarFieldName() string {\n\treturn util.ToPublicGoVariable(d.VariableDefinition.Name)\n}\n\nfunc (d *VariableDefinition) UseIf() bool {\n\treturn d.VariableDefinition.If != nil\n}\n\nfunc (d *VariableDefinition) If() string {\n\treturn d.VariableDefinition.If.Expr\n}\n\nfunc (d *VariableDefinition) UseTimeout() bool {\n\texpr := d.VariableDefinition.Expr\n\treturn expr.Call != nil && expr.Call.Timeout != nil\n}\n\nfunc (d *VariableDefinition) UseRetry() bool {\n\texpr := d.VariableDefinition.Expr\n\treturn expr.Call != nil && expr.Call.Retry != nil\n}\n\nfunc (d *VariableDefinition) Retry() *resolver.RetryPolicy {\n\treturn d.VariableDefinition.Expr.Call.Retry\n}\n\nfunc (d *VariableDefinition) UseCallOption() bool {\n\texpr := d.VariableDefinition.Expr\n\treturn expr.Call != nil && expr.Call.Option != nil\n}\n\nfunc (d *VariableDefinition) CallOption() *GRPCCallOption {\n\treturn &GRPCCallOption{d.VariableDefinition.Expr.Call.Option}\n}\n\nfunc (d *VariableDefinition) UseMetadata() bool {\n\texpr := d.VariableDefinition.Expr\n\treturn expr.Call != nil && expr.Call.Metadata != nil\n}\n\nfunc (d *VariableDefinition) Metadata() string {\n\treturn d.VariableDefinition.Expr.Call.Metadata.Expr\n}\n\ntype GRPCCallOption struct {\n\t*resolver.GRPCCallOption\n}\n\nfunc (o *GRPCCallOption) ContentSubtype() string {\n\tif o.GRPCCallOption.ContentSubtype == nil {\n\t\treturn \"\"\n\t}\n\treturn *o.GRPCCallOption.ContentSubtype\n}\n\nfunc (o *GRPCCallOption) HeaderValueName() string {\n\tif o.Header == nil {\n\t\treturn \"\"\n\t}\n\treturn util.ToPublicGoVariable(o.Header.Name)\n}\n\nfunc (o *GRPCCallOption) TrailerValueName() string {\n\tif o.Trailer == nil {\n\t\treturn \"\"\n\t}\n\treturn util.ToPublicGoVariable(o.Trailer.Name)\n}\n\nfunc (o *GRPCCallOption) UseMaxCallRecvMsgSize() bool {\n\treturn o.GRPCCallOption.MaxCallRecvMsgSize != nil\n}\n\nfunc (o *GRPCCallOption) UseMaxCallSendMsgSize() bool {\n\treturn o.GRPCCallOption.MaxCallSendMsgSize != nil\n}\n\nfunc (o *GRPCCallOption) StaticMethod() bool {\n\treturn o.GRPCCallOption.StaticMethod != nil && *o.GRPCCallOption.StaticMethod\n}\n\nfunc (o *GRPCCallOption) UseWaitForReady() bool {\n\treturn o.GRPCCallOption.WaitForReady != nil\n}\n\nfunc (o *GRPCCallOption) MaxCallRecvMsgSize() int64 {\n\treturn *o.GRPCCallOption.MaxCallRecvMsgSize\n}\n\nfunc (o *GRPCCallOption) MaxCallSendMsgSize() int64 {\n\treturn *o.GRPCCallOption.MaxCallSendMsgSize\n}\n\nfunc (o *GRPCCallOption) WaitForReady() bool {\n\treturn *o.GRPCCallOption.WaitForReady\n}\n\nfunc (d *VariableDefinition) MethodFQDN() string {\n\texpr := d.VariableDefinition.Expr\n\tif expr.Call != nil {\n\t\treturn expr.Call.Method.FQDN()\n\t}\n\treturn \"\"\n}\n\nfunc (d *VariableDefinition) RequestTypeFQDN() string {\n\texpr := d.VariableDefinition.Expr\n\tif expr.Call != nil {\n\t\treturn expr.Call.Request.Type.FQDN()\n\t}\n\treturn \"\"\n}\n\nfunc (d *VariableDefinition) Timeout() string {\n\texpr := d.VariableDefinition.Expr\n\tif expr.Call != nil {\n\t\treturn fmt.Sprintf(\"%[1]d/* %[1]s */\", *expr.Call.Timeout)\n\t}\n\treturn \"\"\n}\n\nfunc (d *VariableDefinition) UseArgs() bool {\n\texpr := d.VariableDefinition.Expr\n\tswitch {\n\tcase expr.By != nil:\n\t\treturn false\n\tcase expr.Map != nil:\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (d *VariableDefinition) Caller() string {\n\texpr := d.VariableDefinition.Expr\n\tswitch {\n\tcase expr.Call != nil:\n\t\tmethod := expr.Call.Method\n\t\tmethodName := method.Name\n\t\tsvcName := fullServiceName(method.Service)\n\t\treturn fmt.Sprintf(\"client.%sClient.%s\", svcName, methodName)\n\tcase expr.Message != nil:\n\t\tmsgName := fullMessageName(expr.Message.Message)\n\t\tif expr.Message.Message.HasRule() {\n\t\t\treturn fmt.Sprintf(\"resolve_%s\", msgName)\n\t\t}\n\t\treturn fmt.Sprintf(\"resolver.Resolve_%s\", msgName)\n\t}\n\treturn \"\"\n}\n\nfunc (d *VariableDefinition) HasErrorHandler() bool {\n\treturn d.VariableDefinition.Expr.Call != nil\n}\n\nfunc (d *VariableDefinition) GRPCErrors() []*GRPCError {\n\tcallExpr := d.VariableDefinition.Expr.Call\n\tif callExpr == nil {\n\t\treturn nil\n\t}\n\tret := make([]*GRPCError, 0, len(callExpr.Errors))\n\tfor _, grpcErr := range callExpr.Errors {\n\t\tret = append(ret, &GRPCError{\n\t\t\tGRPCError: grpcErr,\n\t\t\tsvc:       d.Service,\n\t\t})\n\t}\n\treturn ret\n}\n\ntype GRPCError struct {\n\t*resolver.GRPCError\n\tsvc *Service\n}\n\nfunc (e *GRPCError) CELCacheIndex() int {\n\treturn e.svc.CELCacheIndex()\n}\n\n// GoGRPCStatusCode converts a gRPC status code to a corresponding Go const name\n// e.g. FAILED_PRECONDITION -> FailedPrecondition.\nfunc (e *GRPCError) GoGRPCStatusCode() string {\n\tstrCode := e.Code.String()\n\tif strCode == \"OK\" {\n\t\t// The only exception that the second character is in capital case as well\n\t\treturn \"OKCode\"\n\t}\n\n\tparts := strings.Split(strCode, \"_\")\n\ttitles := make([]string, 0, len(parts))\n\tfor _, part := range parts {\n\t\ttitles = append(titles, cases.Title(language.Und).String(part))\n\t}\n\treturn strings.Join(titles, \"\") + \"Code\"\n}\n\nfunc (e *GRPCError) LogLevelValue() string {\n\tswitch e.LogLevel {\n\tcase slog.LevelDebug:\n\t\treturn \"slog.LevelDebug\"\n\tcase slog.LevelInfo:\n\t\treturn \"slog.LevelInfo\"\n\tcase slog.LevelWarn:\n\t\treturn \"slog.LevelWarn\"\n\t}\n\treturn \"slog.LevelError\"\n}\n\nfunc (e *GRPCError) VariableDefinitionSet() *VariableDefinitionSet {\n\tif e.DefSet == nil {\n\t\treturn nil\n\t}\n\tif len(e.DefSet.Defs) == 0 {\n\t\treturn nil\n\t}\n\treturn &VariableDefinitionSet{\n\t\tVariableDefinitionSet: e.DefSet,\n\t\tsvc:                   e.svc,\n\t}\n}\n\nfunc (e *GRPCError) Details() []*GRPCErrorDetail {\n\tret := make([]*GRPCErrorDetail, 0, len(e.GRPCError.Details))\n\tfor _, detail := range e.GRPCError.Details {\n\t\tret = append(ret, &GRPCErrorDetail{\n\t\t\tGRPCErrorDetail: detail,\n\t\t\tsvc:             e.svc,\n\t\t})\n\t}\n\treturn ret\n}\n\ntype GRPCErrorDetail struct {\n\t*resolver.GRPCErrorDetail\n\tsvc *Service\n}\n\nfunc (detail *GRPCErrorDetail) VariableDefinitionSet() *VariableDefinitionSet {\n\tif detail == nil {\n\t\treturn nil\n\t}\n\tif detail.DefSet == nil {\n\t\treturn nil\n\t}\n\tif len(detail.DefSet.Defs) == 0 {\n\t\treturn nil\n\t}\n\treturn &VariableDefinitionSet{\n\t\tVariableDefinitionSet: detail.DefSet,\n\t\tsvc:                   detail.svc,\n\t}\n}\n\nfunc (detail *GRPCErrorDetail) MessageSet() *VariableDefinitionSet {\n\tif detail == nil {\n\t\treturn nil\n\t}\n\tif detail.Messages == nil {\n\t\treturn nil\n\t}\n\tif len(detail.Messages.Defs) == 0 {\n\t\treturn nil\n\t}\n\treturn &VariableDefinitionSet{\n\t\tVariableDefinitionSet: detail.Messages,\n\t\tsvc:                   detail.svc,\n\t}\n}\n\ntype GRPCErrorDetailBy struct {\n\tExpr string\n\tType string\n}\n\nfunc (detail *GRPCErrorDetail) By() []*GRPCErrorDetailBy {\n\tret := make([]*GRPCErrorDetailBy, 0, len(detail.GRPCErrorDetail.By))\n\tfor _, by := range detail.GRPCErrorDetail.By {\n\t\tret = append(ret, &GRPCErrorDetailBy{\n\t\t\tExpr: by.Expr,\n\t\t\tType: toMakeZeroValue(detail.svc.file, by.Out),\n\t\t})\n\t}\n\treturn ret\n}\n\nfunc (detail *GRPCErrorDetail) PreconditionFailures() []*PreconditionFailure {\n\tret := make([]*PreconditionFailure, 0, len(detail.GRPCErrorDetail.PreconditionFailures))\n\tfor _, pf := range detail.GRPCErrorDetail.PreconditionFailures {\n\t\tret = append(ret, &PreconditionFailure{\n\t\t\tPreconditionFailure: pf,\n\t\t\tsvc:                 detail.svc,\n\t\t})\n\t}\n\treturn ret\n}\n\nfunc (detail *GRPCErrorDetail) BadRequests() []*BadRequest {\n\tret := make([]*BadRequest, 0, len(detail.GRPCErrorDetail.BadRequests))\n\tfor _, b := range detail.GRPCErrorDetail.BadRequests {\n\t\tret = append(ret, &BadRequest{\n\t\t\tBadRequest: b,\n\t\t\tsvc:        detail.svc,\n\t\t})\n\t}\n\treturn ret\n}\n\nfunc (detail *GRPCErrorDetail) LocalizedMessages() []*LocalizedMessage {\n\tret := make([]*LocalizedMessage, 0, len(detail.GRPCErrorDetail.LocalizedMessages))\n\tfor _, m := range detail.GRPCErrorDetail.LocalizedMessages {\n\t\tret = append(ret, &LocalizedMessage{\n\t\t\tLocalizedMessage: m,\n\t\t\tsvc:              detail.svc,\n\t\t})\n\t}\n\treturn ret\n}\n\ntype PreconditionFailure struct {\n\t*resolver.PreconditionFailure\n\tsvc *Service\n}\n\ntype PreconditionFailureViolation struct {\n\t*resolver.PreconditionFailureViolation\n\tsvc *Service\n}\n\nfunc (pf *PreconditionFailure) Violations() []*PreconditionFailureViolation {\n\tret := make([]*PreconditionFailureViolation, 0, len(pf.PreconditionFailure.Violations))\n\tfor _, v := range pf.PreconditionFailure.Violations {\n\t\tret = append(ret, &PreconditionFailureViolation{\n\t\t\tPreconditionFailureViolation: v,\n\t\t\tsvc:                          pf.svc,\n\t\t})\n\t}\n\treturn ret\n}\n\nfunc (v *PreconditionFailureViolation) CELCacheIndex() int {\n\treturn v.svc.CELCacheIndex()\n}\n\ntype BadRequest struct {\n\t*resolver.BadRequest\n\tsvc *Service\n}\n\ntype BadRequestFieldViolation struct {\n\t*resolver.BadRequestFieldViolation\n\tsvc *Service\n}\n\nfunc (b *BadRequest) FieldViolations() []*BadRequestFieldViolation {\n\tret := make([]*BadRequestFieldViolation, 0, len(b.BadRequest.FieldViolations))\n\tfor _, v := range b.BadRequest.FieldViolations {\n\t\tret = append(ret, &BadRequestFieldViolation{\n\t\t\tBadRequestFieldViolation: v,\n\t\t\tsvc:                      b.svc,\n\t\t})\n\t}\n\treturn ret\n}\n\nfunc (v *BadRequestFieldViolation) CELCacheIndex() int {\n\treturn v.svc.CELCacheIndex()\n}\n\ntype LocalizedMessage struct {\n\tsvc *Service\n\t*resolver.LocalizedMessage\n}\n\nfunc (m *LocalizedMessage) CELCacheIndex() int {\n\treturn m.svc.CELCacheIndex()\n}\n\nfunc (d *VariableDefinition) ServiceName() string {\n\treturn util.ToPublicGoVariable(d.Service.Name)\n}\n\nfunc (d *VariableDefinition) DependentMethodName() string {\n\tmethod := d.VariableDefinition.Expr.Call.Method\n\treturn fmt.Sprintf(\"%s_%s\", fullServiceName(method.Service), util.ToPublicGoVariable(method.Name))\n}\n\nfunc (d *VariableDefinition) RequestType() string {\n\texpr := d.VariableDefinition.Expr\n\tswitch {\n\tcase expr.Call != nil:\n\t\trequest := expr.Call.Request\n\t\treturn fmt.Sprintf(\"%s.%s\",\n\t\t\td.file.getAlias(request.Type.GoPackage()),\n\t\t\tutil.ToPublicGoVariable(request.Type.Name),\n\t\t)\n\tcase expr.Message != nil:\n\t\tmsgName := fullMessageName(expr.Message.Message)\n\t\treturn fmt.Sprintf(\"%s_%sArgument\", d.ServiceName(), msgName)\n\t}\n\treturn \"\"\n}\n\nfunc (d *VariableDefinition) LogValueRequestType() string {\n\texpr := d.VariableDefinition.Expr\n\tif expr.Call != nil {\n\t\treturn fullMessageName(expr.Call.Request.Type)\n\t}\n\treturn \"\"\n}\n\nfunc (d *VariableDefinition) ReturnType() string {\n\texpr := d.VariableDefinition.Expr\n\tswitch {\n\tcase expr.Call != nil:\n\t\tresponse := expr.Call.Method.Response\n\t\treturn fmt.Sprintf(\"%s.%s\",\n\t\t\td.file.getAlias(response.GoPackage()),\n\t\t\tresponse.Name,\n\t\t)\n\tcase expr.Message != nil:\n\t\treturn expr.Message.Message.Name\n\t}\n\treturn \"\"\n}\n\nfunc (d *VariableDefinition) UseResponseVariable() bool {\n\treturn d.VariableDefinition.Used\n}\n\nfunc (d *VariableDefinition) IsBy() bool {\n\treturn d.VariableDefinition.Expr.By != nil\n}\n\nfunc (d *VariableDefinition) IsSwitch() bool {\n\treturn d.VariableDefinition.Expr.Switch != nil\n}\n\nfunc (d *VariableDefinition) IsEnum() bool {\n\treturn d.VariableDefinition.Expr.Enum != nil\n}\n\nfunc (d *VariableDefinition) IsMap() bool {\n\treturn d.VariableDefinition.Expr.Map != nil\n}\n\nfunc (d *VariableDefinition) IsCall() bool {\n\treturn d.VariableDefinition.Expr.Call != nil\n}\n\nfunc (d *VariableDefinition) MapResolver() *MapResolver {\n\treturn &MapResolver{\n\t\tService: d.Service,\n\t\tMapExpr: d.VariableDefinition.Expr.Map,\n\t\tfile:    d.file,\n\t}\n}\n\nfunc (d *VariableDefinition) Switch() *SwitchResolver {\n\treturn &SwitchResolver{\n\t\tService:    d.Service,\n\t\tSwitchExpr: d.VariableDefinition.Expr.Switch,\n\t\tfile:       d.file,\n\t}\n}\n\nfunc (d *VariableDefinition) IsValidation() bool {\n\treturn d.VariableDefinition.Expr.Validation != nil\n}\n\nfunc (d *VariableDefinition) By() *resolver.CELValue {\n\treturn d.VariableDefinition.Expr.By\n}\n\nfunc (d *VariableDefinition) Enum() *resolver.EnumExpr {\n\treturn d.VariableDefinition.Expr.Enum\n}\n\nfunc (d *VariableDefinition) EnumSrcType() string {\n\treturn d.file.toTypeText(d.Enum().By.Out)\n}\n\nfunc (d *VariableDefinition) EnumSrcZeroValue() string {\n\treturn toMakeZeroValue(d.file, d.Enum().By.Out)\n}\n\nfunc (d *VariableDefinition) EnumSelector() *EnumSelectorSetterParam {\n\ttyp := d.VariableDefinition.Expr.Enum.By.Out\n\treturn d.file.createEnumSelectorParam(typ.Message, d.VariableDefinition.Expr.Type)\n}\n\nfunc (d *VariableDefinition) ZeroValue() string {\n\treturn toMakeZeroValue(d.file, d.VariableDefinition.Expr.Type)\n}\n\nfunc (d *VariableDefinition) ProtoComment() string {\n\topt := &resolver.ProtoFormatOption{\n\t\tPrefix:         \"\",\n\t\tIndentSpaceNum: 2,\n\t}\n\treturn d.VariableDefinition.ProtoFormat(opt)\n}\n\nfunc (d *VariableDefinition) Type() string {\n\treturn d.file.toTypeText(d.VariableDefinition.Expr.Type)\n}\n\nfunc (d *VariableDefinition) TypeWithoutPtr() string {\n\treturn strings.TrimPrefix(d.Type(), \"*\")\n}\n\nfunc (d *VariableDefinition) EnumCastFunc() string {\n\ttyp := d.Enum().By.Out\n\tif typ == nil {\n\t\treturn \"v\"\n\t}\n\tif typ.Enum == d.VariableDefinition.Expr.Type.Enum {\n\t\treturn \"v\"\n\t}\n\treturn fmt.Sprintf(\"s.%s(v)\",\n\t\tcastFuncName(\n\t\t\ttyp,\n\t\t\td.VariableDefinition.Expr.Type,\n\t\t),\n\t)\n}\n\nfunc (d *VariableDefinition) CELType() string {\n\treturn toCELNativeType(d.VariableDefinition.Expr.Type)\n}\n\ntype ResponseVariable struct {\n\tName    string\n\tCELExpr string\n\tCELType string\n}\n\nfunc (d *VariableDefinition) ResponseVariable() *ResponseVariable {\n\tif !d.VariableDefinition.Used {\n\t\treturn nil\n\t}\n\n\treturn &ResponseVariable{\n\t\tName:    toUserDefinedVariable(d.VariableDefinition.Name),\n\t\tCELExpr: d.VariableDefinition.Name,\n\t\tCELType: toCELNativeType(d.VariableDefinition.Expr.Type),\n\t}\n}\n\ntype MapResolver struct {\n\tService *Service\n\tMapExpr *resolver.MapExpr\n\tfile    *File\n}\n\nfunc (r *MapResolver) IteratorName() string {\n\treturn r.MapExpr.Iterator.Name\n}\n\nfunc (r *MapResolver) IteratorCELType() string {\n\titerType := r.MapExpr.Iterator.Source.Expr.Type.Clone()\n\titerType.Repeated = false\n\treturn toCELNativeType(iterType)\n}\n\nfunc (r *MapResolver) IteratorType() string {\n\titerType := r.MapExpr.Expr.Type.Clone()\n\titerType.Repeated = false\n\treturn r.file.toTypeText(iterType)\n}\n\nfunc (r *MapResolver) IteratorZeroValue() string {\n\titerType := r.MapExpr.Expr.Type.Clone()\n\titerType.Repeated = false\n\treturn toMakeZeroValue(r.file, iterType)\n}\n\nfunc (r *MapResolver) EnumSelector() (*EnumSelectorSetterParam, error) {\n\tenumExpr := r.MapExpr.Expr.Enum\n\tif enumExpr == nil || enumExpr.Enum == nil {\n\t\treturn nil, errors.New(\"cannot find enum value from map iterator\")\n\t}\n\ttyp := enumExpr.By.Out\n\toutType := r.MapExpr.Expr.Type.Clone()\n\toutType.Repeated = false\n\treturn r.file.createEnumSelectorParam(typ.Message, outType), nil\n}\n\nfunc (r *MapResolver) EnumCastFunc() (string, error) {\n\tenumExpr := r.MapExpr.Expr.Enum\n\tif enumExpr == nil || enumExpr.Enum == nil {\n\t\treturn \"\", errors.New(\"cannot find enum value from map iterator\")\n\t}\n\ttyp := enumExpr.By.Out\n\tif typ == nil {\n\t\treturn \"v\", nil\n\t}\n\toutType := r.MapExpr.Expr.Type.Clone()\n\toutType.Repeated = false\n\tif typ.Enum == outType.Enum {\n\t\treturn \"v\", nil\n\t}\n\treturn fmt.Sprintf(\"s.%s(v)\",\n\t\tcastFuncName(\n\t\t\ttyp,\n\t\t\toutType,\n\t\t),\n\t), nil\n}\n\nfunc (r *MapResolver) EnumSrcType() (string, error) {\n\tenumExpr := r.MapExpr.Expr.Enum\n\tif enumExpr == nil || enumExpr.Enum == nil {\n\t\treturn \"\", errors.New(\"cannot find enum value from map iterator\")\n\t}\n\treturn r.file.toTypeText(enumExpr.By.Out), nil\n}\n\nfunc (r *MapResolver) EnumDrcType() (string, error) {\n\tenumExpr := r.MapExpr.Expr.Enum\n\tif enumExpr == nil || enumExpr.Enum == nil {\n\t\treturn \"\", errors.New(\"cannot find enum value from map iterator\")\n\t}\n\treturn r.file.toTypeText(enumExpr.By.Out), nil\n}\n\nfunc (r *MapResolver) EnumSrcZeroValue() (string, error) {\n\tenumExpr := r.MapExpr.Expr.Enum\n\tif enumExpr == nil || enumExpr.Enum == nil {\n\t\treturn \"\", errors.New(\"cannot find enum value from map iterator\")\n\t}\n\treturn toMakeZeroValue(r.file, enumExpr.By.Out), nil\n}\n\nfunc (r *MapResolver) IteratorSource() string {\n\treturn toUserDefinedVariable(r.MapExpr.Iterator.Source.Name)\n}\n\nfunc (r *MapResolver) IteratorSourceType() string {\n\tcloned := r.MapExpr.Iterator.Source.Expr.Type.Clone()\n\tcloned.Repeated = false\n\treturn r.file.toTypeText(cloned)\n}\n\nfunc (r *MapResolver) IsBy() bool {\n\treturn r.MapExpr.Expr.By != nil\n}\n\nfunc (r *MapResolver) IsMessage() bool {\n\treturn r.MapExpr.Expr.Message != nil\n}\n\nfunc (r *MapResolver) IsEnum() bool {\n\treturn r.MapExpr.Expr.Enum != nil\n}\n\nfunc (r *MapResolver) Arguments() []*Argument {\n\treturn arguments(r.file, r.MapExpr.Expr.ToVariableExpr())\n}\n\nfunc (r *MapResolver) MapOutType() string {\n\tcloned := r.MapExpr.Expr.Type.Clone()\n\tcloned.Repeated = true\n\treturn r.file.toTypeText(cloned)\n}\n\nfunc (r *MapResolver) Caller() string {\n\tmsgName := fullMessageName(r.MapExpr.Expr.Message.Message)\n\tif r.MapExpr.Expr.Message.Message.HasRule() {\n\t\treturn fmt.Sprintf(\"resolve_%s\", msgName)\n\t}\n\treturn fmt.Sprintf(\"resolver.Resolve_%s\", msgName)\n}\n\nfunc (r *MapResolver) RequestType() string {\n\texpr := r.MapExpr.Expr\n\tswitch {\n\tcase expr.Message != nil:\n\t\tmsgName := fullMessageName(expr.Message.Message)\n\t\treturn fmt.Sprintf(\"%sArgument\", msgName)\n\t}\n\treturn \"\"\n}\n\ntype SwitchResolver struct {\n\tService    *Service\n\tSwitchExpr *resolver.SwitchExpr\n\tfile       *File\n}\n\nfunc (r *SwitchResolver) Type() string {\n\treturn r.file.toTypeText(r.SwitchExpr.Type)\n}\n\nfunc (r *SwitchResolver) CELCacheIndex() int {\n\treturn r.Service.CELCacheIndex()\n}\n\ntype SwitchCaseResolver struct {\n\tService    *Service\n\tSwitchCase *resolver.SwitchCaseExpr\n}\n\ntype SwitchDefaultResolver struct {\n\tService       *Service\n\tSwitchDefault *resolver.SwitchDefaultExpr\n}\n\nfunc (r *SwitchResolver) Cases() []*SwitchCaseResolver {\n\tret := make([]*SwitchCaseResolver, 0, len(r.SwitchExpr.Cases))\n\tfor _, cse := range r.SwitchExpr.Cases {\n\t\tret = append(ret, &SwitchCaseResolver{\n\t\t\tService:    r.Service,\n\t\t\tSwitchCase: cse,\n\t\t})\n\t}\n\treturn ret\n}\n\nfunc (r *SwitchResolver) Default() *SwitchDefaultResolver {\n\treturn &SwitchDefaultResolver{\n\t\tService:       r.Service,\n\t\tSwitchDefault: r.SwitchExpr.Default,\n\t}\n}\n\nfunc (r *SwitchCaseResolver) DefSet() *VariableDefinitionSet {\n\tif r.SwitchCase.DefSet == nil || len(r.SwitchCase.DefSet.Defs) == 0 {\n\t\treturn nil\n\t}\n\treturn &VariableDefinitionSet{\n\t\tVariableDefinitionSet: r.SwitchCase.DefSet,\n\t\tsvc:                   r.Service,\n\t}\n}\n\nfunc (r *SwitchCaseResolver) If() *resolver.CELValue {\n\treturn r.SwitchCase.If\n}\n\nfunc (r *SwitchCaseResolver) By() *resolver.CELValue {\n\treturn r.SwitchCase.By\n}\n\nfunc (r *SwitchDefaultResolver) DefSet() *VariableDefinitionSet {\n\tif r.SwitchDefault.DefSet == nil || len(r.SwitchDefault.DefSet.Defs) == 0 {\n\t\treturn nil\n\t}\n\treturn &VariableDefinitionSet{\n\t\tVariableDefinitionSet: r.SwitchDefault.DefSet,\n\t\tsvc:                   r.Service,\n\t}\n}\n\nfunc (r *SwitchDefaultResolver) By() *resolver.CELValue {\n\treturn r.SwitchDefault.By\n}\n\nfunc toCELNativeType(t *resolver.Type) string {\n\tif t.Repeated {\n\t\tcloned := t.Clone()\n\t\tcloned.Repeated = false\n\t\treturn fmt.Sprintf(\"grpcfed.CELListType(%s)\", toCELNativeType(cloned))\n\t}\n\tif t.IsNull {\n\t\treturn \"grpcfed.CELNullType\"\n\t}\n\tswitch t.Kind {\n\tcase types.Double, types.Float:\n\t\treturn \"grpcfed.CELDoubleType\"\n\tcase types.Int32, types.Int64, types.Sint32, types.Sint64, types.Sfixed32, types.Sfixed64, types.Enum:\n\t\treturn \"grpcfed.CELIntType\"\n\tcase types.Uint32, types.Uint64, types.Fixed32, types.Fixed64:\n\t\treturn \"grpcfed.CELUintType\"\n\tcase types.Bool:\n\t\treturn \"grpcfed.CELBoolType\"\n\tcase types.String:\n\t\treturn \"grpcfed.CELStringType\"\n\tcase types.Bytes:\n\t\treturn \"grpcfed.CELBytesType\"\n\tcase types.Message:\n\t\tif t.Message.IsMapEntry {\n\t\t\treturn fmt.Sprintf(\"grpcfed.NewCELMapType(%s, %s)\", toCELNativeType(t.Message.Field(\"key\").Type), toCELNativeType(t.Message.Field(\"value\").Type))\n\t\t}\n\t\treturn fmt.Sprintf(\"grpcfed.CELObjectType(%q)\", t.Message.FQDN())\n\tdefault:\n\t\tlog.Fatalf(\"grpc-federation: specified unsupported type value %s\", t.Kind.ToString())\n\t}\n\treturn \"\"\n}\n\nfunc (d *VariableDefinition) ValidationError() *GRPCError {\n\tif d.Expr == nil {\n\t\treturn nil\n\t}\n\tif d.Expr.Validation == nil {\n\t\treturn nil\n\t}\n\tif d.Expr.Validation.Error == nil {\n\t\treturn nil\n\t}\n\treturn &GRPCError{\n\t\tGRPCError: d.Expr.Validation.Error,\n\t\tsvc:       d.Service,\n\t}\n}\n\ntype Argument struct {\n\tName           string\n\tValue          string\n\tCEL            *resolver.CELValue\n\tIf             *resolver.CELValue\n\tInlineFields   []*Argument\n\tProtoComment   string\n\tZeroValue      string\n\tType           string\n\tOneofName      string\n\tOneofFieldName string\n\tRequiredCast   bool\n}\n\nfunc (d *VariableDefinition) Arguments() []*Argument {\n\treturn arguments(d.file, d.Expr)\n}\n\nfunc arguments(file *File, expr *resolver.VariableExpr) []*Argument {\n\tvar (\n\t\tisRequestArgument bool\n\t\tmsgArg            *resolver.Message\n\t\targs              []*resolver.Argument\n\t)\n\tswitch {\n\tcase expr.Call != nil:\n\t\tisRequestArgument = true\n\t\targs = expr.Call.Request.Args\n\tcase expr.Message != nil:\n\t\tmsg := expr.Message.Message\n\t\tif msg.Rule != nil {\n\t\t\tmsgArg = msg.Rule.MessageArgument\n\t\t}\n\t\targs = expr.Message.Args\n\tcase expr.By != nil:\n\t\treturn nil\n\t}\n\tvar generateArgs []*Argument\n\tfor _, arg := range args {\n\t\tfor _, generatedArg := range argument(file, msgArg, arg) {\n\t\t\tprotofmt := arg.ProtoFormat(resolver.DefaultProtoFormatOption, isRequestArgument)\n\t\t\tif protofmt != \"\" {\n\t\t\t\tgeneratedArg.ProtoComment = \"// \" + protofmt\n\t\t\t}\n\t\t\tgenerateArgs = append(generateArgs, generatedArg)\n\t\t}\n\t}\n\treturn generateArgs\n}\n\nfunc argument(file *File, msgArg *resolver.Message, arg *resolver.Argument) []*Argument {\n\tif arg.Value.CEL == nil {\n\t\treturn nil\n\t}\n\tvar (\n\t\toneofName      string\n\t\toneofFieldName string\n\t)\n\tif arg.Type != nil && arg.Type.OneofField != nil {\n\t\toneofName = util.ToPublicGoVariable(arg.Type.OneofField.Oneof.Name)\n\t\toneofFieldName = strings.TrimPrefix(file.oneofTypeToText(arg.Type.OneofField), \"*\")\n\t}\n\tvar inlineFields []*Argument\n\tif arg.Value.Inline {\n\t\tfor _, field := range arg.Value.CEL.Out.Message.Fields {\n\t\t\tinlineFields = append(inlineFields, &Argument{\n\t\t\t\tName:           util.ToPublicGoVariable(field.Name),\n\t\t\t\tValue:          fmt.Sprintf(\"v.Get%s()\", util.ToPublicGoVariable(field.Name)),\n\t\t\t\tOneofName:      oneofName,\n\t\t\t\tOneofFieldName: oneofFieldName,\n\t\t\t\tIf:             arg.If,\n\t\t\t})\n\t\t}\n\t}\n\n\tfromType := arg.Value.Type()\n\tvar toType *resolver.Type\n\tif msgArg != nil {\n\t\t// If a message argument exists and there is a field corresponding to the argument name,\n\t\t// the type of that field will be used as the destination type.\n\t\ttoField := msgArg.Field(arg.Name)\n\t\tif toField != nil {\n\t\t\ttoType = toField.Type\n\t\t}\n\t}\n\tif toType == nil {\n\t\tif arg.Type != nil {\n\t\t\ttoType = arg.Type\n\t\t} else {\n\t\t\ttoType = fromType\n\t\t}\n\t}\n\n\ttoText := file.toTypeText(toType)\n\tfromText := file.toTypeText(fromType)\n\n\tvar (\n\t\targValue       = \"v\"\n\t\tzeroValue      string\n\t\targType        string\n\t\tisRequiredCast bool\n\t)\n\tswitch fromType.Kind {\n\tcase types.Message:\n\t\tzeroValue = toMakeZeroValue(file, fromType)\n\t\targType = fromText\n\t\tisRequiredCast = requiredCast(fromType, toType)\n\t\tif isRequiredCast {\n\t\t\tt := toType.Clone()\n\t\t\tif oneofName != \"\" {\n\t\t\t\tt.OneofField = nil\n\t\t\t}\n\t\t\tcastFuncName := castFuncName(fromType, t)\n\t\t\targValue = fmt.Sprintf(\"s.%s(%s)\", castFuncName, argValue)\n\t\t}\n\tcase types.Enum:\n\t\tzeroValue = toMakeZeroValue(file, fromType)\n\t\targType = fromText\n\t\tif msgArg != nil && arg.Name != \"\" {\n\t\t\tmsgArgField := msgArg.Field(arg.Name)\n\t\t\tisRequiredCast = msgArgField != nil && msgArgField.Type.Kind != toType.Kind\n\t\t\tif isRequiredCast {\n\t\t\t\tcastFuncName := castFuncName(fromType, msgArgField.Type)\n\t\t\t\targValue = fmt.Sprintf(\"s.%s(%s)\", castFuncName, argValue)\n\t\t\t}\n\t\t}\n\t\tif !isRequiredCast {\n\t\t\tisRequiredCast = requiredCast(fromType, toType)\n\t\t\tif isRequiredCast {\n\t\t\t\tcastFuncName := castFuncName(fromType, toType)\n\t\t\t\targValue = fmt.Sprintf(\"s.%s(%s)\", castFuncName, argValue)\n\t\t\t}\n\t\t}\n\tdefault:\n\t\t// Since fromType is a primitive type, type conversion is possible on the CEL side.\n\t\tzeroValue = toMakeZeroValue(file, toType)\n\t\tif oneofName != \"\" {\n\t\t\tt := toType.Clone()\n\t\t\tt.OneofField = nil\n\t\t\targType = file.toTypeText(t)\n\t\t} else {\n\t\t\targType = toText\n\t\t}\n\t\tif msgArg != nil && arg.Name != \"\" {\n\t\t\tmsgArgField := msgArg.Field(arg.Name)\n\t\t\tisRequiredCast = msgArgField != nil && msgArgField.Type.Kind != toType.Kind\n\t\t\tif isRequiredCast {\n\t\t\t\tcastFuncName := castFuncName(toType, msgArgField.Type)\n\t\t\t\targValue = fmt.Sprintf(\"s.%s(%s)\", castFuncName, argValue)\n\t\t\t}\n\t\t}\n\t}\n\treturn []*Argument{\n\t\t{\n\t\t\tName:           util.ToPublicGoVariable(arg.Name),\n\t\t\tValue:          argValue,\n\t\t\tCEL:            arg.Value.CEL,\n\t\t\tInlineFields:   inlineFields,\n\t\t\tZeroValue:      zeroValue,\n\t\t\tType:           argType,\n\t\t\tOneofName:      oneofName,\n\t\t\tOneofFieldName: oneofFieldName,\n\t\t\tIf:             arg.If,\n\t\t\tRequiredCast:   isRequiredCast,\n\t\t},\n\t}\n}\n\nfunc (s *Service) Messages() []*Message {\n\tmsgs := make([]*Message, 0, len(s.Service.Messages))\n\tfor _, msg := range s.Service.Messages {\n\t\tmsgs = append(msgs, &Message{\n\t\t\tMessage: msg,\n\t\t\tService: s,\n\t\t\tfile:    s.file,\n\t\t})\n\t}\n\tsort.Slice(msgs, func(i, j int) bool {\n\t\treturn msgs[i].ResolverName() < msgs[j].ResolverName()\n\t})\n\treturn msgs\n}\n\nfunc (s *Service) CastFields() []*CastField {\n\tcastFieldMap := make(map[string]*CastField)\n\tfor _, mtd := range s.Service.Methods {\n\t\tif mtd.Rule == nil {\n\t\t\tcontinue\n\t\t}\n\t\tif mtd.Rule.Response == nil {\n\t\t\tcontinue\n\t\t}\n\t\tfromType := resolver.NewMessageType(mtd.Rule.Response, false)\n\t\ttoType := resolver.NewMessageType(mtd.Response, false)\n\t\tfnName := castFuncName(fromType, toType)\n\t\tcastFieldMap[fnName] = &CastField{\n\t\t\tName:     fnName,\n\t\t\tservice:  s.Service,\n\t\t\tfromType: fromType,\n\t\t\ttoType:   toType,\n\t\t\tfile:     s.file,\n\t\t}\n\t}\n\tfor _, msg := range s.Service.Messages {\n\t\tfor _, decl := range msg.TypeConversionDecls() {\n\t\t\tfnName := castFuncName(decl.From, decl.To)\n\t\t\tcastFieldMap[fnName] = &CastField{\n\t\t\t\tName:     fnName,\n\t\t\t\tservice:  s.Service,\n\t\t\t\tfromType: decl.From,\n\t\t\t\ttoType:   decl.To,\n\t\t\t\tfile:     s.file,\n\t\t\t}\n\t\t}\n\t}\n\tret := make([]*CastField, 0, len(castFieldMap))\n\tfor _, field := range castFieldMap {\n\t\tret = append(ret, field)\n\t}\n\tsort.Slice(ret, func(i, j int) bool {\n\t\treturn ret[i].Name < ret[j].Name\n\t})\n\treturn ret\n}\n\nfunc loadTemplate() (*template.Template, error) {\n\ttmpl, err := template.New(\"server.go.tmpl\").Funcs(\n\t\tmap[string]any{\n\t\t\t\"add\":             Add,\n\t\t\t\"map\":             CreateMap,\n\t\t\t\"parentCtx\":       ParentCtx,\n\t\t\t\"toLocalVariable\": LocalVariable,\n\t\t},\n\t).ParseFS(tmpls, \"templates/*.tmpl\")\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to parse template: %w\", err)\n\t}\n\treturn tmpl, nil\n}\n\nfunc generateGoContent(tmpl *template.Template, f *File) ([]byte, error) {\n\t// TODO: Change to evaluate only once.\n\tvar b bytes.Buffer\n\n\t// Evaluate template once to create File.pkgMap.\n\t// pkgMap is created when evaluating typeToText, so all values must be evaluated once.\n\tif err := tmpl.Execute(&b, f); err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to execute template: %w\", err)\n\t}\n\tb.Reset()\n\n\t// Evaluate the value of File.pkgMap to make the import statement correct and then evaluate it.\n\tif err := tmpl.Execute(&b, f); err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to execute template: %w\", err)\n\t}\n\n\tbuf, err := format.Source(b.Bytes())\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to format %s: %w\", b.String(), err)\n\t}\n\treturn buf, nil\n}\n\n//go:embed templates\nvar tmpls embed.FS\n\nfunc toUserDefinedVariable(name string) string {\n\treturn \"value.vars.\" + util.ToPublicGoVariable(name)\n}\n\nfunc toEnumValuePrefix(file *File, typ *resolver.Type) string {\n\tenum := typ.Enum\n\tvar name string\n\tif enum.Message != nil {\n\t\tvar names []string\n\t\tfor _, n := range append(enum.Message.ParentMessageNames(), enum.Message.Name) {\n\t\t\tnames = append(names, util.ToPublicGoVariable(n))\n\t\t}\n\t\tname = strings.Join(names, \"_\")\n\t} else {\n\t\tname = util.ToPublicGoVariable(enum.Name)\n\t}\n\tif file.GoPackage.ImportPath == enum.GoPackage().ImportPath {\n\t\treturn name\n\t}\n\treturn fmt.Sprintf(\"%s.%s\", file.getAlias(enum.GoPackage()), name)\n}\n\nfunc toEnumValueText(enumValuePrefix string, value string) string {\n\treturn fmt.Sprintf(\"%s_%s\", enumValuePrefix, value)\n}\n\nfunc protoFQDNToPublicGoName(fqdn string) string {\n\tnames := strings.Split(fqdn, \".\")\n\tformattedNames := make([]string, 0, len(names))\n\tfor _, name := range names {\n\t\tname = strings.Replace(name, \"-\", \"_\", -1)\n\t\tformattedNames = append(formattedNames, util.ToPublicGoVariable(name))\n\t}\n\treturn strings.Join(formattedNames, \"_\")\n}\n\nfunc fullServiceName(svc *resolver.Service) string {\n\treturn protoFQDNToPublicGoName(svc.FQDN())\n}\n\nfunc fullOneofName(oneofField *resolver.OneofField) string {\n\tgoName := protoFQDNToPublicGoName(oneofField.FQDN())\n\tif oneofField.IsConflict() {\n\t\tgoName += \"_\"\n\t}\n\treturn goName\n}\n\nfunc fullMessageName(msg *resolver.Message) string {\n\treturn protoFQDNToPublicGoName(msg.FQDN())\n}\n\nfunc fullEnumName(enum *resolver.Enum) string {\n\treturn protoFQDNToPublicGoName(enum.FQDN())\n}\n\nfunc requiredCast(from, to *resolver.Type) bool {\n\tif from == nil || to == nil {\n\t\treturn false\n\t}\n\tif from.OneofField != to.OneofField {\n\t\treturn true\n\t}\n\tif from.Kind == types.Message {\n\t\tif from.Message.IsMapEntry && to.Message.IsMapEntry {\n\t\t\treturn requiredCast(from.Message.Fields[0].Type, to.Message.Fields[0].Type) || requiredCast(from.Message.Fields[1].Type, to.Message.Fields[1].Type)\n\t\t}\n\t\treturn from.Message != to.Message\n\t}\n\tif from.Kind == types.Enum {\n\t\treturn from.Enum != to.Enum\n\t}\n\treturn from.Kind != to.Kind\n}\n\nfunc castFuncName(from, to *resolver.Type) string {\n\treturn fmt.Sprintf(\"cast_%s__to__%s\", castName(from), castName(to))\n}\n\nfunc castName(typ *resolver.Type) string {\n\tvar ret string\n\tif typ.Repeated {\n\t\tret = \"repeated_\"\n\t}\n\tswitch {\n\tcase typ.OneofField != nil:\n\t\tret += fullOneofName(typ.OneofField)\n\tcase typ.Kind == types.Message:\n\t\tif typ.Message.IsMapEntry {\n\t\t\tret = \"map_\" + castName(typ.Message.Fields[0].Type) + \"_\" + castName(typ.Message.Fields[1].Type)\n\t\t} else {\n\t\t\tret += fullMessageName(typ.Message)\n\t\t}\n\tcase typ.Kind == types.Enum:\n\t\tret += fullEnumName(typ.Enum)\n\tdefault:\n\t\tret += new(File).toTypeText(&resolver.Type{Kind: typ.Kind, IsNull: typ.IsNull})\n\t}\n\treturn ret\n}\n"
  },
  {
    "path": "generator/code_generator_test.go",
    "content": "package generator_test\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/goccy/go-yaml\"\n\t\"github.com/google/go-cmp/cmp\"\n\t\"golang.org/x/mod/modfile\"\n\t\"google.golang.org/genproto/googleapis/rpc/code\"\n\n\t\"github.com/mercari/grpc-federation/generator\"\n\t\"github.com/mercari/grpc-federation/internal/testutil\"\n\t\"github.com/mercari/grpc-federation/resolver\"\n)\n\nfunc TestCodeGenerate(t *testing.T) {\n\tt.Parallel()\n\ttmpDir := filepath.Join(t.TempDir(), \"grpc-federation\")\n\n\ttests := []string{\n\t\t\"simple_aggregation\",\n\t\t\"minimum\",\n\t\t\"create_post\",\n\t\t\"custom_resolver\",\n\t\t\"async\",\n\t\t\"alias\",\n\t\t\"alias_multifile\",\n\t\t\"autobind\",\n\t\t\"multi_user\",\n\t\t\"resolver_overlaps\",\n\t\t\"oneof\",\n\t\t\"validation\",\n\t\t\"map\",\n\t\t\"condition\",\n\t\t\"error_handler\",\n\t\t\"inline_env\",\n\t\t\"ref_env\",\n\t\t\"switch\",\n\t}\n\tfor _, test := range tests {\n\t\ttest := test\n\t\tt.Run(test, func(t *testing.T) {\n\t\t\tt.Parallel()\n\t\t\ttestdataDir := filepath.Join(testutil.RepoRoot(), \"testdata\")\n\t\t\tfiles := testutil.Compile(t, filepath.Join(testdataDir, test+\".proto\"))\n\n\t\t\tvar dependentFiles []string\n\t\t\tfor _, file := range files {\n\t\t\t\tfileName := file.GetName()\n\t\t\t\tif filepath.IsAbs(fileName) {\n\t\t\t\t\tdependentFiles = append(dependentFiles, fileName)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif !strings.Contains(fileName, \"/\") {\n\t\t\t\t\tdependentFiles = append(dependentFiles, fileName)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tr := resolver.New(files, resolver.ImportPathOption(testdataDir))\n\t\t\tresult, err := r.Resolve()\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tif len(result.Files) != 1 {\n\t\t\t\tt.Fatalf(\"failed to get files. expected 1 but got %d\", len(result.Files))\n\t\t\t}\n\t\t\tresult.Files[0].Name = filepath.Base(result.Files[0].Name)\n\t\t\tout, err := generator.NewCodeGenerator().Generate(result.Files[0])\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tpath := filepath.Join(\"testdata\", fmt.Sprintf(\"expected_%s.go\", test))\n\t\t\tdata, err := os.ReadFile(path)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tif diff := cmp.Diff(string(out), string(data)); diff != \"\" {\n\t\t\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t}\n\t\t\tfor _, importFile := range result.Files[0].ImportFiles {\n\t\t\t\tif strings.HasPrefix(importFile.Name, \"google/protobuf\") || strings.HasPrefix(importFile.Name, \"grpc/federation\") {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tdependentFiles = append(dependentFiles, importFile.Name)\n\t\t\t}\n\n\t\t\t// Tests whether the automatically generated files can be compiled.\n\t\t\t// Compilation also requires files generated by `protoc-gen-go` and `protoc-gen-go-grpc`, so we generate them and build them.\n\t\t\tt.Run(\"build test\", func(t *testing.T) {\n\t\t\t\tvar srcFiles []string\n\t\t\t\tfor _, dependentFile := range dependentFiles {\n\t\t\t\t\tif filepath.IsAbs(dependentFile) {\n\t\t\t\t\t\tsrcFiles = append(srcFiles, dependentFile)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsrcFiles = append(srcFiles, filepath.Join(\"..\", \"testdata\", dependentFile))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontent, err := yaml.Marshal(struct {\n\t\t\t\t\tImports []string                  `yaml:\"imports\"`\n\t\t\t\t\tSrc     []string                  `yaml:\"src\"`\n\t\t\t\t\tOut     string                    `yaml:\"out\"`\n\t\t\t\t\tPlugins []*generator.PluginConfig `yaml:\"plugins\"`\n\t\t\t\t}{\n\t\t\t\t\tImports: []string{filepath.Join(\"..\", \"testdata\")},\n\t\t\t\t\tSrc:     srcFiles,\n\t\t\t\t\tOut:     tmpDir,\n\t\t\t\t\tPlugins: []*generator.PluginConfig{\n\t\t\t\t\t\t{Plugin: \"go\", Opt: &generator.PluginOption{Opts: []string{\"paths=import\"}}},\n\t\t\t\t\t\t{Plugin: \"go-grpc\", Opt: &generator.PluginOption{Opts: []string{\"paths=import\"}}},\n\t\t\t\t\t\t{Plugin: \"grpc-federation\", Opt: &generator.PluginOption{Opts: []string{\"paths=import\", fmt.Sprintf(\"import_paths=%s\", filepath.Join(\"..\", \"testdata\"))}}},\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\t\t\t\tcfg, err := generator.LoadConfigFromReader(bytes.NewBuffer(content))\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\t\t\t\tg := generator.New(cfg)\n\t\t\t\tbuildCacheMap, err := g.GenerateAll(context.Background())\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\n\t\t\t\t// TODO: The current implementation expects the `go_package` defined in the proto file of testdata to start with \"example/\".\n\t\t\t\t// To support other packages, this process needs to be modified.\n\t\t\t\tmodFilePath := filepath.Join(tmpDir, test, \"example\", \"go.mod\")\n\t\t\t\tmodFile := new(modfile.File)\n\t\t\t\tif err := modFile.AddModuleStmt(\"example\"); err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\t\t\t\tif err := modFile.AddGoStmt(\"1.21\"); err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\t\t\t\treplacePath, err := filepath.Rel(filepath.Dir(modFilePath), testutil.RepoRoot())\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\t\t\t\tt.Logf(\"replace path: %s\", replacePath)\n\t\t\t\tif err := modFile.AddReplace(\n\t\t\t\t\t\"github.com/mercari/grpc-federation\",\n\t\t\t\t\t\"\",\n\t\t\t\t\treplacePath,\n\t\t\t\t\t\"\",\n\t\t\t\t); err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\t\t\t\tmodContent, err := modFile.Format()\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\t\t\t\tt.Logf(\"write %s\", modFilePath)\n\t\t\t\tif err := os.MkdirAll(filepath.Dir(modFilePath), 0o755); err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\t\t\t\tif err := os.WriteFile(modFilePath, modContent, 0o600); err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\t\t\t\tvar federationFilePath string\n\t\t\t\tfor _, buildCache := range buildCacheMap {\n\t\t\t\t\tfor _, response := range buildCache.Responses {\n\t\t\t\t\t\tfor _, file := range response.File {\n\t\t\t\t\t\t\tpath := filepath.Join(tmpDir, test, file.GetName())\n\t\t\t\t\t\t\tif err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {\n\t\t\t\t\t\t\t\tt.Fatal(err)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tt.Logf(\"write %s\", path)\n\t\t\t\t\t\t\tif resolver.IsGRPCFederationGeneratedFile(path) {\n\t\t\t\t\t\t\t\tfederationFilePath = path\n\t\t\t\t\t\t\t\tif err := os.WriteFile(path, out, 0o600); err != nil {\n\t\t\t\t\t\t\t\t\tt.Fatal(err)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tif err := os.WriteFile(path, []byte(file.GetContent()), 0o600); err != nil {\n\t\t\t\t\t\t\t\t\tt.Fatal(err)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif federationFilePath == \"\" {\n\t\t\t\t\tt.Fatalf(\"failed to find grpc federation file\")\n\t\t\t\t}\n\t\t\t\tbuildRelPath, err := filepath.Rel(filepath.Dir(modFilePath), filepath.Dir(federationFilePath))\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\t\t\t\tt.Logf(\"build relative path: %s\", buildRelPath)\n\t\t\t\tt.Run(\"go mod tidy\", func(t *testing.T) {\n\t\t\t\t\tcmd := exec.Command(\"go\", \"mod\", \"tidy\")\n\t\t\t\t\tcmd.Dir = filepath.Dir(modFilePath)\n\t\t\t\t\tout, err := cmd.CombinedOutput()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tt.Fatalf(\"%q: %s\", out, err)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tt.Run(\"go build\", func(t *testing.T) {\n\t\t\t\t\tcmd := exec.Command(\"go\", \"build\", fmt.Sprintf(\"./%s\", buildRelPath)) //nolint: gosec\n\t\t\t\t\tcmd.Dir = filepath.Dir(modFilePath)\n\t\t\t\t\tout, err := cmd.CombinedOutput()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tt.Fatalf(\"%q: %s\", out, err)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t}\n}\n\nfunc TestValidationError_GoGRPCStatusCode(t *testing.T) {\n\tt.Parallel()\n\ttests := []struct {\n\t\tdesc     string\n\t\tcode     code.Code\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tdesc:     \"code is OK\",\n\t\t\tcode:     code.Code_OK,\n\t\t\texpected: \"OKCode\",\n\t\t},\n\t\t{\n\t\t\tdesc:     \"code is FAILED_PRECONDITION\",\n\t\t\tcode:     code.Code_FAILED_PRECONDITION,\n\t\t\texpected: \"FailedPreconditionCode\",\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\ttc := tc\n\t\tt.Run(tc.desc, func(t *testing.T) {\n\t\t\tvalidation := generator.GRPCError{\n\t\t\t\tGRPCError: &resolver.GRPCError{\n\t\t\t\t\tCode: &tc.code,\n\t\t\t\t},\n\t\t\t}\n\t\t\tif got := validation.GoGRPCStatusCode(); got != tc.expected {\n\t\t\t\tt.Fatalf(\"received unexpected gRPC status code: got: %s, expected: %s\", got, tc.expected)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "generator/config.go",
    "content": "package generator\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/goccy/go-yaml\"\n)\n\ntype Config struct {\n\t// Imports specify list of import path. This is the same as the list of paths specified by protoc's '-I' option.\n\tImports []string `yaml:\"imports\"`\n\t// Src specifies the directory to be monitored when watch mode is enabled.\n\tSrc []string `yaml:\"src\"`\n\t// Out specify the output destination for automatically generated code.\n\tOut string `yaml:\"out\"`\n\t// Plugins specify protoc's plugin configuration.\n\tPlugins []*PluginConfig `yaml:\"plugins\"`\n\t// AutoProtocGenGo automatically run protoc-gen-go at the time of editing proto. default is true.\n\tAutoProtocGenGo *bool `yaml:\"autoProtocGenGo\"`\n\t// AutoProtocGenGoGRPC automatically run protoc-gen-go-grpc at the time of editing proto. default is true.\n\tAutoProtocGenGoGRPC *bool `yaml:\"autoProtocGenGoGrpc\"`\n}\n\ntype PluginConfig struct {\n\t// Plugin name of the protoc plugin.\n\t// If the name of the plugin is 'protoc-gen-go', write 'go'. ('protoc-gen-' prefix can be omitted).\n\tPlugin string `yaml:\"plugin\"`\n\t// Option specify options to be passed protoc plugin.\n\tOpt           *PluginOption `yaml:\"opt\"`\n\tinstalledPath string\n}\n\ntype PluginOption struct {\n\tOpts []string\n}\n\nfunc (o *PluginOption) String() string {\n\tif o == nil {\n\t\treturn \"\"\n\t}\n\treturn strings.Join(o.Opts, \",\")\n}\n\nfunc (o *PluginOption) MarshalYAML() ([]byte, error) {\n\tif o == nil {\n\t\treturn nil, nil\n\t}\n\treturn []byte(o.String()), nil\n}\n\nfunc (o *PluginOption) UnmarshalYAML(b []byte) error {\n\t{\n\t\tvar v []string\n\t\tif err := yaml.Unmarshal(b, &v); err == nil {\n\t\t\to.Opts = append(o.Opts, v...)\n\t\t\treturn nil\n\t\t}\n\t}\n\tvar v string\n\tif err := yaml.Unmarshal(b, &v); err != nil {\n\t\treturn err\n\t}\n\to.Opts = append(o.Opts, v)\n\treturn nil\n}\n\nfunc (c *Config) GetAutoProtocGenGo() bool {\n\tif c.AutoProtocGenGo == nil {\n\t\treturn true\n\t}\n\treturn *c.AutoProtocGenGo\n}\n\nfunc (c *Config) GetAutoProtocGenGoGRPC() bool {\n\tif c.AutoProtocGenGoGRPC == nil {\n\t\treturn true\n\t}\n\treturn *c.AutoProtocGenGoGRPC\n}\n\nfunc LoadConfig(path string) (Config, error) {\n\tf, err := os.Open(path)\n\tif err != nil {\n\t\treturn Config{}, err\n\t}\n\treturn LoadConfigFromReader(f)\n}\n\nfunc LoadConfigFromReader(r io.Reader) (Config, error) {\n\tvar cfg Config\n\tcontent, err := io.ReadAll(r)\n\tif err != nil {\n\t\treturn cfg, err\n\t}\n\tif err := yaml.Unmarshal(content, &cfg); err != nil {\n\t\treturn cfg, err\n\t}\n\tif err := setupConfig(&cfg); err != nil {\n\t\treturn cfg, err\n\t}\n\treturn cfg, nil\n}\n\nfunc setupConfig(cfg *Config) error {\n\tstandardPluginMap := createStandardPluginMap(cfg)\n\tpluginNameMap := make(map[string]struct{})\n\tfor _, plugin := range cfg.Plugins {\n\t\tname := plugin.Plugin\n\t\tif !strings.HasPrefix(name, \"protoc-gen-\") {\n\t\t\tname = \"protoc-gen-\" + name\n\t\t}\n\t\tpath, err := lookupProtocPlugin(name, standardPluginMap)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(`failed to find protoc plugin \"%s\" on your system: %w`, name, err)\n\t\t}\n\t\tplugin.Plugin = name\n\t\tplugin.installedPath = path\n\t\tpluginNameMap[name] = struct{}{}\n\t}\n\tfor standardPlugin, use := range standardPluginMap {\n\t\tif _, exists := pluginNameMap[standardPlugin]; !exists && use {\n\t\t\taddStandardPlugin(cfg, standardPlugin)\n\t\t}\n\t}\n\tif cfg.Out == \"\" {\n\t\tcfg.Out = \".\"\n\t}\n\tout, err := filepath.Abs(cfg.Out)\n\tif err != nil {\n\t\treturn err\n\t}\n\tcfg.Out = out\n\treturn nil\n}\n\nfunc createStandardPluginMap(cfg *Config) map[string]bool {\n\treturn map[string]bool{\n\t\tprotocGenGo:             cfg.GetAutoProtocGenGo(),\n\t\tprotocGenGoGRPC:         cfg.GetAutoProtocGenGoGRPC(),\n\t\tprotocGenGRPCFederation: true,\n\t}\n}\n\nfunc lookupProtocPlugin(name string, standardPluginMap map[string]bool) (string, error) {\n\tpath, err := exec.LookPath(name)\n\tif err == nil {\n\t\treturn path, nil\n\t}\n\tif _, exists := standardPluginMap[name]; exists {\n\t\treturn \"\", nil\n\t}\n\treturn \"\", fmt.Errorf(`failed to find protoc plugin \"%s\" on your system: %w`, name, err)\n}\n\nfunc addStandardPlugin(cfg *Config, name string) {\n\tpath, _ := exec.LookPath(name)\n\tcfg.Plugins = append(cfg.Plugins, &PluginConfig{\n\t\tPlugin:        name,\n\t\tOpt:           &PluginOption{Opts: []string{\"paths=source_relative\"}},\n\t\tinstalledPath: path,\n\t})\n}\n"
  },
  {
    "path": "generator/funcs.go",
    "content": "package generator\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\n\t\"github.com/mercari/grpc-federation/util\"\n)\n\n// CreateMap creates a map from a list of key-value pairs to pass multiple arguments to sub-templates.\nfunc CreateMap(pairs ...any) (map[string]any, error) {\n\tif len(pairs)%2 != 0 {\n\t\treturn nil, errors.New(\"the number of arguments must be divisible by two\")\n\t}\n\n\tm := make(map[string]any, len(pairs)/2)\n\tfor i := 0; i < len(pairs); i += 2 {\n\t\tkey, ok := pairs[i].(string)\n\n\t\tif !ok {\n\t\t\treturn nil, fmt.Errorf(\"cannot use type %T as map key\", pairs[i])\n\t\t}\n\t\tm[key] = pairs[i+1]\n\t}\n\treturn m, nil\n}\n\n// ParentCtx creates parent context name from the given level.\nfunc ParentCtx(level int) (string, error) {\n\tif level <= 0 {\n\t\treturn \"\", errors.New(\"level cannot be less than or equal to 0\")\n\t}\n\n\t// the level 0 (root) context should be ctx, not ctx0\n\tif level == 1 {\n\t\treturn \"ctx\", nil\n\t}\n\n\treturn fmt.Sprintf(\"ctx%d\", level-1), nil\n}\n\n// Add adds two numbers.\nfunc Add(n1, n2 int) int {\n\treturn n1 + n2\n}\n\nfunc LocalVariable(v string) string {\n\treturn util.ToPrivateGoVariable(v) + \"Value\"\n}\n"
  },
  {
    "path": "generator/funcs_test.go",
    "content": "package generator\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n)\n\nfunc TestCreateMap(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tdesc        string\n\t\tpairs       []any\n\t\texpected    map[string]any\n\t\texpectedErr string\n\t}{\n\t\t{\n\t\t\tdesc:  \"success\",\n\t\t\tpairs: []any{\"key1\", \"value1\", \"key2\", \"value2\"},\n\t\t\texpected: map[string]any{\n\t\t\t\t\"key1\": \"value1\",\n\t\t\t\t\"key2\": \"value2\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc:        \"invalid number of arguments\",\n\t\t\tpairs:       []any{\"key1\", \"value1\", \"key2\"},\n\t\t\texpectedErr: \"the number of arguments must be divisible by two\",\n\t\t},\n\t\t{\n\t\t\tdesc:        \"invalid key type\",\n\t\t\tpairs:       []any{1, \"value1\"},\n\t\t\texpectedErr: \"cannot use type int as map key\",\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.desc, func(t *testing.T) {\n\t\t\tgot, err := CreateMap(tc.pairs...)\n\t\t\tif err != nil {\n\t\t\t\tif tc.expectedErr == \"\" {\n\t\t\t\t\tt.Fatalf(\"failed to call CreateMap: %v\", err)\n\t\t\t\t}\n\n\t\t\t\tif !strings.Contains(err.Error(), tc.expectedErr) {\n\t\t\t\t\tt.Fatalf(\"received an unexpected error: %q should have contained %q\", err.Error(), tc.expectedErr)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif tc.expectedErr != \"\" {\n\t\t\t\tt.Fatal(\"expected to receive an error but got nil\")\n\t\t\t}\n\n\t\t\tif diff := cmp.Diff(got, tc.expected); diff != \"\" {\n\t\t\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestParentCtx(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tdesc        string\n\t\tlevel       int\n\t\texpected    string\n\t\texpectedErr string\n\t}{\n\t\t{\n\t\t\tdesc:     \"level is more than or equal to 2\",\n\t\t\tlevel:    2,\n\t\t\texpected: \"ctx1\",\n\t\t},\n\t\t{\n\t\t\tdesc:     \"level is 1\",\n\t\t\tlevel:    1,\n\t\t\texpected: \"ctx\",\n\t\t},\n\t\t{\n\t\t\tdesc:        \"level is less than or equal to 0\",\n\t\t\tlevel:       0,\n\t\t\texpectedErr: \"level cannot be less than or equal to 0\",\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.desc, func(t *testing.T) {\n\t\t\tgot, err := ParentCtx(tc.level)\n\t\t\tif err != nil {\n\t\t\t\tif tc.expectedErr == \"\" {\n\t\t\t\t\tt.Fatalf(\"failed to call ParentCtx: %v\", err)\n\t\t\t\t}\n\n\t\t\t\tif !strings.Contains(err.Error(), tc.expectedErr) {\n\t\t\t\t\tt.Fatalf(\"received an unexpected error: %q should have contained %q\", err.Error(), tc.expectedErr)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif tc.expectedErr != \"\" {\n\t\t\t\tt.Fatal(\"expected to receive an error but got nil\")\n\t\t\t}\n\n\t\t\tif diff := cmp.Diff(got, tc.expected); diff != \"\" {\n\t\t\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestAdd(t *testing.T) {\n\tgot := Add(1, 2)\n\tif got != 3 {\n\t\tt.Fatalf(\"received unexpecd result: got: %d, expected: %d\", got, 3)\n\t}\n}\n"
  },
  {
    "path": "generator/generator.go",
    "content": "package generator\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/fs\"\n\t\"log\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/fsnotify/fsnotify\"\n\tgengo \"google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo\"\n\t\"google.golang.org/protobuf/compiler/protogen\"\n\t\"google.golang.org/protobuf/proto\"\n\t\"google.golang.org/protobuf/types/pluginpb\"\n\n\t\"github.com/mercari/grpc-federation/compiler\"\n\t\"github.com/mercari/grpc-federation/grpc/federation/generator\"\n\t\"github.com/mercari/grpc-federation/resolver\"\n\t\"github.com/mercari/grpc-federation/source\"\n\t\"github.com/mercari/grpc-federation/validator\"\n)\n\nconst (\n\tprotocGenGRPCFederation = \"protoc-gen-grpc-federation\"\n\tprotocGenGo             = \"protoc-gen-go\"\n\tprotocGenGoGRPC         = \"protoc-gen-go-grpc\"\n)\n\ntype Generator struct {\n\tcfg                       *Config\n\tfederationGeneratorOption *CodeGeneratorOption\n\twatcher                   *Watcher\n\tcompiler                  *compiler.Compiler\n\tvalidator                 *validator.Validator\n\timportPaths               []string\n\tpostProcessHandler        PostProcessHandler\n\tbuildCacheMap             BuildCacheMap\n\tabsPathToRelativePath     map[string]string\n\twasmPluginCache           *wasmPluginCache\n}\n\ntype Option func(*Generator) error\n\ntype PostProcessHandler func(context.Context, string, Result) error\n\ntype BuildCache struct {\n\tResponses       []*pluginpb.CodeGeneratorResponse\n\tFederationFiles []*resolver.File\n}\n\ntype BuildCacheMap map[string]*BuildCache\n\ntype Result []*ProtoFileResult\n\ntype ProtoFileResult struct {\n\tProtoPath       string\n\tType            ActionType\n\tFiles           []*pluginpb.CodeGeneratorResponse_File\n\tFederationFiles []*resolver.File\n\tOut             string\n}\n\ntype ActionType string\n\nconst (\n\tKeepAction   ActionType = \"keep\"\n\tCreateAction ActionType = \"create\"\n\tDeleteAction ActionType = \"delete\"\n\tUpdateAction ActionType = \"update\"\n\tProtocAction ActionType = \"protoc\"\n)\n\ntype PluginRequest struct {\n\treq       *pluginpb.CodeGeneratorRequest\n\tcontent   *bytes.Buffer\n\tgenplugin *protogen.Plugin\n\tprotoPath string\n}\n\nfunc WatchMode() func(*Generator) error {\n\treturn func(g *Generator) error {\n\t\tw, err := NewWatcher()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := g.setWatcher(w); err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t}\n}\n\nfunc (r *ProtoFileResult) WriteFiles(ctx context.Context) error {\n\tswitch r.Type {\n\tcase DeleteAction:\n\t\tfor _, file := range r.Files {\n\t\t\tpath := filepath.Join(r.Out, file.GetName())\n\t\t\tif !existsPath(path) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tlog.Printf(\"remove %s file\", path)\n\t\t\tif err := os.Remove(path); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\tdefault:\n\t\tfor _, file := range r.Files {\n\t\t\tpath := filepath.Join(r.Out, file.GetName())\n\t\t\tif err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tlog.Printf(\"write %s file\", path)\n\t\t\tif err := os.WriteFile(path, []byte(file.GetContent()), 0o600); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc New(cfg Config) *Generator {\n\treturn &Generator{\n\t\tcfg:                   &cfg,\n\t\tcompiler:              compiler.New(),\n\t\tvalidator:             validator.New(),\n\t\timportPaths:           cfg.Imports,\n\t\tabsPathToRelativePath: make(map[string]string),\n\t\twasmPluginCache:       newWasmPluginCache(),\n\t}\n}\n\n// Close releases resources held by the Generator, including cached WASM plugin runtimes.\nfunc (g *Generator) Close(ctx context.Context) error {\n\tif g.wasmPluginCache != nil {\n\t\treturn g.wasmPluginCache.Close(ctx)\n\t}\n\treturn nil\n}\n\nfunc (g *Generator) SetPostProcessHandler(postProcessHandler func(ctx context.Context, path string, result Result) error) {\n\tg.postProcessHandler = postProcessHandler\n}\n\nfunc (g *Generator) Generate(ctx context.Context, protoPath string, opts ...Option) error {\n\tpath, err := filepath.Abs(protoPath)\n\tif err != nil {\n\t\treturn err\n\t}\n\tg.absPathToRelativePath[path] = protoPath\n\tfor _, opt := range opts {\n\t\tif err := opt(g); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif g.buildCacheMap == nil {\n\t\tbuildCacheMap, err := g.GenerateAll(ctx)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tg.buildCacheMap = buildCacheMap\n\t}\n\tif g.watcher != nil {\n\t\tdefer g.watcher.Close()\n\t\tfor _, src := range g.cfg.Src {\n\t\t\tlog.Printf(\"watch %v directory's proto files\", src)\n\t\t}\n\t\treturn g.watcher.Run(ctx)\n\t}\n\n\tresults := g.otherResults(path)\n\tif _, exists := g.buildCacheMap[path]; exists {\n\t\tresult, err := g.updateProtoFile(ctx, path)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresults = append(results, result)\n\t} else {\n\t\tresult, err := g.createProtoFile(ctx, path)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tresults = append(results, result)\n\t}\n\tpluginResp, err := evalAllCodeGenerationPlugin(ctx, results, g.federationGeneratorOption, g.wasmPluginCache)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif len(pluginResp.File) != 0 {\n\t\tresults = append(results, &ProtoFileResult{\n\t\t\tType:      KeepAction,\n\t\t\tProtoPath: path,\n\t\t\tOut:       g.cfg.Out,\n\t\t\tFiles:     pluginResp.File,\n\t\t})\n\t}\n\tg.buildCacheMap[path].Responses = append(g.buildCacheMap[path].Responses, pluginResp)\n\tif g.postProcessHandler != nil {\n\t\tif err := g.postProcessHandler(ctx, path, results); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (g *Generator) GenerateAll(ctx context.Context) (BuildCacheMap, error) {\n\tprotoPathMap, err := g.createProtoPathMap()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tbuildCacheMap := BuildCacheMap{}\n\tfor protoPath := range protoPathMap {\n\t\treq, err := g.compileProto(ctx, protoPath)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tfor _, pluginCfg := range g.cfg.Plugins {\n\t\t\tpluginReq, err := newPluginRequest(protoPath, req, pluginCfg.Opt)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tres, err := g.generateByPlugin(ctx, pluginReq, pluginCfg)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif res == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tbuildCache := buildCacheMap[protoPath]\n\t\t\tif buildCache == nil {\n\t\t\t\tbuildCache = &BuildCache{}\n\t\t\t\tbuildCacheMap[protoPath] = buildCache\n\t\t\t}\n\t\t\tif pluginCfg.Plugin == \"protoc-gen-grpc-federation\" {\n\t\t\t\tfiles, err := g.createGRPCFederationFiles(pluginReq)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tbuildCache.FederationFiles = append(buildCache.FederationFiles, files...)\n\t\t\t}\n\t\t\tbuildCache.Responses = append(buildCache.Responses, res)\n\t\t}\n\t}\n\treturn buildCacheMap, nil\n}\n\nfunc newPluginRequest(protoPath string, org *pluginpb.CodeGeneratorRequest, pluginOpt *PluginOption) (*PluginRequest, error) {\n\topt := pluginOpt.String()\n\treq := &pluginpb.CodeGeneratorRequest{\n\t\tFileToGenerate:  org.FileToGenerate,\n\t\tParameter:       &opt,\n\t\tProtoFile:       org.ProtoFile,\n\t\tCompilerVersion: org.CompilerVersion,\n\t}\n\tcontent, err := proto.Marshal(req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tgenplugin, err := protogen.Options{}.New(req)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to create protogen.Plugin: %w\", err)\n\t}\n\treturn &PluginRequest{\n\t\tprotoPath: protoPath,\n\t\treq:       req,\n\t\tcontent:   bytes.NewBuffer(content),\n\t\tgenplugin: genplugin,\n\t}, nil\n}\n\nfunc (g *Generator) generateByPlugin(ctx context.Context, req *PluginRequest, cfg *PluginConfig) (*pluginpb.CodeGeneratorResponse, error) {\n\tif cfg.installedPath == \"\" {\n\t\tswitch cfg.Plugin {\n\t\tcase protocGenGo:\n\t\t\treturn g.generateByProtogenGo(req)\n\t\tcase protocGenGoGRPC:\n\t\t\treturn g.generateByProtogenGoGRPC(req)\n\t\tcase protocGenGRPCFederation:\n\t\t\treturn g.generateByGRPCFederation(req)\n\t\t}\n\t\treturn nil, fmt.Errorf(\"failed to find installed path for %s\", cfg.Plugin)\n\t}\n\tvar (\n\t\tstdout, stderr bytes.Buffer\n\t)\n\t//nolint:gosec // only valid values are set to cfg.installedPath\n\tcmd := exec.CommandContext(ctx, cfg.installedPath)\n\tcmd.Stdin = req.content\n\tcmd.Stdout = &stdout\n\tcmd.Stderr = &stderr\n\tif err := cmd.Run(); err != nil {\n\t\treturn nil, fmt.Errorf(\n\t\t\t\"grpc-federation: %s: %s: %w\",\n\t\t\tstdout.String(),\n\t\t\tstderr.String(),\n\t\t\terr,\n\t\t)\n\t}\n\tvar res pluginpb.CodeGeneratorResponse\n\tif err := proto.Unmarshal(stdout.Bytes(), &res); err != nil {\n\t\treturn nil, err\n\t}\n\treturn &res, nil\n}\n\nfunc (g *Generator) createProtoPathMap() (map[string]struct{}, error) {\n\tprotoPathMap := map[string]struct{}{}\n\tfor _, src := range g.cfg.Src {\n\t\tif err := filepath.Walk(src, func(path string, info fs.FileInfo, err error) error {\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif filepath.Ext(path) != \".proto\" {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tabspath, err := filepath.Abs(path)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tg.absPathToRelativePath[abspath] = path\n\t\t\tprotoPathMap[abspath] = struct{}{}\n\t\t\treturn nil\n\t\t}); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn protoPathMap, nil\n}\n\nfunc (g *Generator) setWatcher(w *Watcher) error {\n\tif err := w.SetWatchPath(g.cfg.Src...); err != nil {\n\t\treturn err\n\t}\n\tw.SetHandler(func(ctx context.Context, event fsnotify.Event) {\n\t\tpath, err := filepath.Abs(event.Name)\n\t\tif err != nil {\n\t\t\tlog.Printf(\"failed to create absolute path from %s: %+v\", event.Name, err)\n\t\t\treturn\n\t\t}\n\t\tg.absPathToRelativePath[path] = event.Name\n\n\t\tvar results []*ProtoFileResult\n\t\tswitch {\n\t\tcase event.Has(fsnotify.Create):\n\t\t\tresult, err := g.createProtoFile(ctx, path)\n\t\t\tif err != nil {\n\t\t\t\tlog.Printf(\"failed to generate from created proto %s: %+v\", path, err)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tresults = append(results, result)\n\t\tcase event.Has(fsnotify.Remove), event.Has(fsnotify.Rename):\n\t\t\tresults = append(results, g.deleteProtoFile(path))\n\t\tcase event.Has(fsnotify.Write):\n\t\t\tresult, err := g.updateProtoFile(ctx, path)\n\t\t\tif err != nil {\n\t\t\t\tlog.Printf(\"failed to generate from updated proto %s: %+v\", path, err)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tresults = append(results, result)\n\t\t}\n\t\tresults = append(results, g.otherResults(path)...)\n\t\tpluginResp, err := evalAllCodeGenerationPlugin(ctx, results, g.federationGeneratorOption, g.wasmPluginCache)\n\t\tif err != nil {\n\t\t\tlog.Printf(\"failed to run code generator plugin: %+v\", err)\n\t\t}\n\t\tif len(pluginResp.File) != 0 {\n\t\t\tresults = append(results, &ProtoFileResult{\n\t\t\t\tType:      KeepAction,\n\t\t\t\tProtoPath: path,\n\t\t\t\tOut:       g.cfg.Out,\n\t\t\t\tFiles:     pluginResp.File,\n\t\t\t})\n\t\t}\n\t\tif g.postProcessHandler != nil {\n\t\t\tif err := g.postProcessHandler(ctx, path, results); err != nil {\n\t\t\t\tlog.Printf(\"%+v\", err)\n\t\t\t}\n\t\t}\n\t})\n\tg.watcher = w\n\treturn nil\n}\n\nfunc existsPath(path string) bool {\n\t_, err := os.Stat(path)\n\treturn err == nil\n}\n\nfunc (g *Generator) otherResults(path string) []*ProtoFileResult {\n\tresults := make([]*ProtoFileResult, 0, len(g.buildCacheMap))\n\tfor p, buildCache := range g.buildCacheMap {\n\t\tif path == p {\n\t\t\tcontinue\n\t\t}\n\t\tif !existsPath(p) {\n\t\t\t// Sometimes fsnotify cannot detect a file remove event, so it may contain a path that does not exist.\n\t\t\t// If the path does not exist, create result for delete.\n\t\t\tresults = append(results, g.deleteProtoFile(p))\n\t\t\tcontinue\n\t\t}\n\n\t\tresult := &ProtoFileResult{\n\t\t\tProtoPath:       p,\n\t\t\tOut:             g.cfg.Out,\n\t\t\tType:            KeepAction,\n\t\t\tFederationFiles: buildCache.FederationFiles,\n\t\t}\n\t\tfor _, r := range buildCache.Responses {\n\t\t\tresult.Files = append(result.Files, r.GetFile()...)\n\t\t}\n\t\tresults = append(results, result)\n\t}\n\treturn results\n}\n\nfunc (g *Generator) createProtoFile(ctx context.Context, path string) (*ProtoFileResult, error) {\n\tresult, err := g.createGeneratorResult(ctx, path)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresult.Type = CreateAction\n\treturn result, nil\n}\n\nfunc (g *Generator) updateProtoFile(ctx context.Context, path string) (*ProtoFileResult, error) {\n\tdelete(g.buildCacheMap, path)\n\n\tresult, err := g.createGeneratorResult(ctx, path)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresult.Type = UpdateAction\n\treturn result, nil\n}\n\nfunc (g *Generator) deleteProtoFile(path string) *ProtoFileResult {\n\tresult := &ProtoFileResult{\n\t\tProtoPath: path,\n\t\tType:      DeleteAction,\n\t\tOut:       g.cfg.Out,\n\t}\n\tbuildCache, exists := g.buildCacheMap[path]\n\tif exists {\n\t\tresult.FederationFiles = buildCache.FederationFiles\n\t\tfor _, resp := range buildCache.Responses {\n\t\t\tresult.Files = append(result.Files, resp.GetFile()...)\n\t\t}\n\t}\n\tdelete(g.buildCacheMap, path)\n\treturn result\n}\n\nfunc (g *Generator) createGeneratorResult(ctx context.Context, path string) (*ProtoFileResult, error) {\n\treq, err := g.compileProto(ctx, path)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresult := &ProtoFileResult{\n\t\tProtoPath: path,\n\t\tOut:       g.cfg.Out,\n\t}\n\tfor _, pluginCfg := range g.cfg.Plugins {\n\t\tpluginReq, err := newPluginRequest(path, req, pluginCfg.Opt)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tresp, err := g.generateByPlugin(ctx, pluginReq, pluginCfg)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif resp == nil {\n\t\t\tcontinue\n\t\t}\n\t\tbuildCache := g.buildCacheMap[path]\n\t\tif buildCache == nil {\n\t\t\tbuildCache = &BuildCache{}\n\t\t\tg.buildCacheMap[path] = buildCache\n\t\t}\n\t\tif pluginCfg.Plugin == \"protoc-gen-grpc-federation\" {\n\t\t\tfiles, err := g.createGRPCFederationFiles(pluginReq)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tresult.FederationFiles = files\n\t\t\tbuildCache.FederationFiles = append(buildCache.FederationFiles, files...)\n\t\t}\n\t\tresult.Files = append(result.Files, resp.GetFile()...)\n\t\tbuildCache.Responses = append(buildCache.Responses, resp)\n\t}\n\treturn result, nil\n}\n\nfunc (g *Generator) compileProto(ctx context.Context, protoPath string) (*pluginpb.CodeGeneratorRequest, error) {\n\tif protoPath == \"\" {\n\t\treturn nil, fmt.Errorf(\"grpc-federation: proto file path is empty\")\n\t}\n\tif filepath.Ext(protoPath) != \".proto\" {\n\t\treturn nil, fmt.Errorf(\"grpc-federation: %s is not proto file\", protoPath)\n\t}\n\tlog.Printf(\"compile %s\", protoPath)\n\tcontent, err := os.ReadFile(protoPath)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tfile, err := source.NewFile(protoPath, content)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to create source file: %w\", err)\n\t}\n\tif outs := g.validator.Validate(ctx, file, validator.ImportPathOption(g.importPaths...)); len(outs) != 0 {\n\t\tout := validator.Format(outs)\n\t\tif validator.ExistsError(outs) {\n\t\t\treturn nil, errors.New(out)\n\t\t}\n\t\tfmt.Fprint(os.Stdout, out)\n\t}\n\tprotos, err := g.compiler.Compile(ctx, file, compiler.ImportPathOption(g.importPaths...))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\trelPath, err := compiler.RelativePathFromImportPaths(protoPath, g.importPaths)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &pluginpb.CodeGeneratorRequest{\n\t\tFileToGenerate: []string{relPath},\n\t\tProtoFile:      protos,\n\t}, nil\n}\n\nfunc (g *Generator) generateByProtogenGo(r *PluginRequest) (*pluginpb.CodeGeneratorResponse, error) {\n\topt, err := parseOptString(r.req.GetParameter())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\topt.Path.ImportPaths = g.cfg.Imports\n\trelativePath := g.absPathToRelativePath[r.protoPath]\n\tpathResolver := resolver.NewOutputFilePathResolver(opt.Path)\n\tvar res pluginpb.CodeGeneratorResponse\n\tfor _, f := range r.genplugin.Files {\n\t\tif !f.Generate {\n\t\t\tcontinue\n\t\t}\n\t\tgopkg, err := resolver.ResolveGoPackage(f.Proto)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tdir, err := pathResolver.OutputDir(relativePath, gopkg)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tgeneratedFile := gengo.GenerateFile(r.genplugin, f)\n\t\tcontent, err := generatedFile.Content()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tc := string(content)\n\t\tfileName := filepath.Base(f.Proto.GetName())\n\t\tpath := filepath.Join(dir, g.fileNameWithoutExt(fileName)+\".pb.go\")\n\t\tres.File = append(res.File, &pluginpb.CodeGeneratorResponse_File{\n\t\t\tName:    &path,\n\t\t\tContent: &c,\n\t\t})\n\t}\n\treturn &res, nil\n}\n\nfunc (g *Generator) generateByProtogenGoGRPC(r *PluginRequest) (*pluginpb.CodeGeneratorResponse, error) {\n\topt, err := parseOptString(r.req.GetParameter())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\topt.Path.ImportPaths = g.cfg.Imports\n\trelativePath := g.absPathToRelativePath[r.protoPath]\n\tpathResolver := resolver.NewOutputFilePathResolver(opt.Path)\n\n\tvar res pluginpb.CodeGeneratorResponse\n\tfor _, f := range r.genplugin.Files {\n\t\tif !f.Generate {\n\t\t\tcontinue\n\t\t}\n\t\tgeneratedFile := runProtogenGoGRPC(r.genplugin, f, true)\n\t\tif generatedFile == nil {\n\t\t\tcontinue\n\t\t}\n\t\tcontent, err := generatedFile.Content()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tgopkg, err := resolver.ResolveGoPackage(f.Proto)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tdir, err := pathResolver.OutputDir(relativePath, gopkg)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tc := string(content)\n\t\tfileName := filepath.Base(f.Proto.GetName())\n\t\tpath := filepath.Join(dir, g.fileNameWithoutExt(fileName)+\"_grpc.pb.go\")\n\t\tres.File = append(res.File, &pluginpb.CodeGeneratorResponse_File{\n\t\t\tName:    &path,\n\t\t\tContent: &c,\n\t\t})\n\t}\n\treturn &res, nil\n}\n\nfunc (g *Generator) generateByGRPCFederation(r *PluginRequest) (*pluginpb.CodeGeneratorResponse, error) {\n\topt, err := parseOptString(r.req.GetParameter())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\topt.Path.ImportPaths = g.cfg.Imports\n\tg.federationGeneratorOption = opt\n\trelativePath := g.absPathToRelativePath[r.protoPath]\n\tpathResolver := resolver.NewOutputFilePathResolver(opt.Path)\n\n\tresult, err := resolver.New(r.req.GetProtoFile(), resolver.ImportPathOption(opt.Path.ImportPaths...)).Resolve()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar resp pluginpb.CodeGeneratorResponse\n\tfor _, file := range result.Files {\n\t\tout, err := NewCodeGenerator().Generate(file)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tdir, err := pathResolver.OutputDir(relativePath, file.GoPackage)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tpath := filepath.Join(dir, pathResolver.FileName(file))\n\t\tresp.File = append(resp.File, &pluginpb.CodeGeneratorResponse_File{\n\t\t\tName:    proto.String(path),\n\t\t\tContent: proto.String(string(out)),\n\t\t})\n\t}\n\treturn &resp, nil\n}\n\nfunc (g *Generator) createGRPCFederationFiles(r *PluginRequest) ([]*resolver.File, error) {\n\tresult, err := resolver.New(r.req.GetProtoFile(), resolver.ImportPathOption(g.cfg.Imports...)).Resolve()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn result.Files, nil\n}\n\nfunc (g *Generator) fileNameWithoutExt(name string) string {\n\treturn name[:len(name)-len(filepath.Ext(name))]\n}\n\nfunc CreateCodeGeneratorResponse(ctx context.Context, req *pluginpb.CodeGeneratorRequest) (_ *pluginpb.CodeGeneratorResponse, err error) {\n\topt, err := parseOptString(req.GetParameter())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\toutputPathResolver := resolver.NewOutputFilePathResolver(opt.Path)\n\tresult, err := resolver.New(req.GetProtoFile(), resolver.ImportPathOption(opt.Path.ImportPaths...)).Resolve()\n\tif outs := validator.New().ToValidationOutputByResolverResult(result, err, validator.ImportPathOption(opt.Path.ImportPaths...)); len(outs) > 0 {\n\t\tif validator.ExistsError(outs) {\n\t\t\treturn nil, errors.New(validator.Format(outs))\n\t\t}\n\t\tfmt.Fprint(os.Stderr, validator.Format(outs))\n\t}\n\n\tvar resp pluginpb.CodeGeneratorResponse\n\t// TODO: Since we don’t currently support editions, we will comment it out.\n\t// Strictly speaking, proto3 optional is also not fully supported, but because it cannot be used together when other plugins support proto3 optional,\n\t// we have enabled it for the time being.\n\tresp.SupportedFeatures = proto.Uint64(uint64(pluginpb.CodeGeneratorResponse_FEATURE_PROTO3_OPTIONAL /*| pluginpb.CodeGeneratorResponse_FEATURE_SUPPORTS_EDITIONS*/))\n\n\tif len(result.Files) == 0 {\n\t\treturn &resp, nil\n\t}\n\n\tcache := newWasmPluginCache()\n\tdefer func() {\n\t\tif closeErr := cache.Close(ctx); closeErr != nil {\n\t\t\terr = errors.Join(err, closeErr)\n\t\t}\n\t}()\n\tpluginResp, err := evalAllCodeGenerationPlugin(ctx, []*ProtoFileResult{\n\t\t{\n\t\t\tType:            ProtocAction,\n\t\t\tProtoPath:       \"\",\n\t\t\tFederationFiles: result.Files,\n\t\t},\n\t}, opt, cache)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp.File = append(resp.File, pluginResp.File...)\n\tfor _, file := range result.Files {\n\t\tout, err := NewCodeGenerator().Generate(file)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\toutputFilePath, err := outputPathResolver.OutputPath(file)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tresp.File = append(resp.File, &pluginpb.CodeGeneratorResponse_File{\n\t\t\tName:    proto.String(outputFilePath),\n\t\t\tContent: proto.String(string(out)),\n\t\t})\n\t}\n\treturn &resp, nil\n}\n\nfunc evalAllCodeGenerationPlugin(ctx context.Context, results []*ProtoFileResult, opt *CodeGeneratorOption, cache *wasmPluginCache) (*pluginpb.CodeGeneratorResponse, error) {\n\tif len(results) == 0 {\n\t\treturn &pluginpb.CodeGeneratorResponse{}, nil\n\t}\n\tif opt == nil || len(opt.Plugins) == 0 {\n\t\treturn &pluginpb.CodeGeneratorResponse{}, nil\n\t}\n\n\tvar resp pluginpb.CodeGeneratorResponse\n\tfor _, result := range results {\n\t\tfor _, p := range opt.Plugins {\n\t\t\twp, err := cache.getOrCreate(ctx, p)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tgenReq := generator.CreateCodeGeneratorRequest(&generator.CodeGeneratorRequestConfig{\n\t\t\t\tProtoPath:            result.ProtoPath,\n\t\t\t\tGRPCFederationFiles:  result.FederationFiles,\n\t\t\t\tOutputFilePathConfig: opt.Path,\n\t\t\t})\n\t\t\tencodedGenReq, err := proto.Marshal(genReq)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tpluginRes, err := wp.Execute(ctx, bytes.NewBuffer(encodedGenReq))\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tresp.File = append(resp.File, pluginRes.File...)\n\t\t}\n\t}\n\n\treturn &resp, nil\n}\n\ntype CodeGeneratorOption struct {\n\tPath    resolver.OutputFilePathConfig\n\tPlugins []*WasmPluginOption\n}\n\ntype WasmPluginOption struct {\n\tPath   string\n\tSha256 string\n}\n\nfunc parseOptString(opt string) (*CodeGeneratorOption, error) {\n\tvar ret CodeGeneratorOption\n\tfor _, part := range splitOpt(opt) {\n\t\tif err := parseOpt(&ret, part); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn &ret, nil\n}\n\nfunc parseOpt(opt *CodeGeneratorOption, pat string) error {\n\tif pat == \"\" {\n\t\t// nothing option.\n\t\treturn nil\n\t}\n\tpartOpt, err := splitOptPattern(pat)\n\tif err != nil {\n\t\treturn err\n\t}\n\tswitch partOpt.kind {\n\tcase \"module\":\n\t\tif err := parseModuleOption(opt, partOpt.value); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase \"paths\":\n\t\tif err := parsePathsOption(opt, partOpt.value); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase \"plugins\":\n\t\tif err := parsePluginsOption(opt, partOpt.value); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase \"import_paths\":\n\t\tif err := parseImportPathsOption(opt, partOpt.value); err != nil {\n\t\t\treturn err\n\t\t}\n\tdefault:\n\t\treturn fmt.Errorf(\"grpc-federation: unexpected option: %s\", partOpt.kind)\n\t}\n\treturn nil\n}\n\nfunc parseModuleOption(opt *CodeGeneratorOption, value string) error {\n\tif value == \"\" {\n\t\treturn fmt.Errorf(`grpc-federation: failed to find prefix name for module option`)\n\t}\n\topt.Path.Mode = resolver.ModulePrefixMode\n\topt.Path.Prefix = value\n\treturn nil\n}\n\nfunc parsePathsOption(opt *CodeGeneratorOption, value string) error {\n\tswitch value {\n\tcase \"source_relative\":\n\t\topt.Path.Mode = resolver.SourceRelativeMode\n\tcase \"import\":\n\t\topt.Path.Mode = resolver.ImportMode\n\tdefault:\n\t\treturn fmt.Errorf(\"grpc-federation: unexpected paths option: %s\", value)\n\t}\n\treturn nil\n}\n\ntype pluginURI struct {\n\toriginalURL string\n\tparsedURL   *url.URL\n\thash        string\n}\n\nfunc parsePluginURI(value string) (*pluginURI, error) {\n\t// Find the last colon to separate potential hash\n\tlastColonIdx := strings.LastIndex(value, \":\")\n\tif lastColonIdx == -1 {\n\t\t// No hash provided\n\t\tparsedURL, err := url.Parse(value)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"grpc-federation: invalid URI format: %w\", err)\n\t\t}\n\t\treturn &pluginURI{\n\t\t\toriginalURL: value,\n\t\t\tparsedURL:   parsedURL,\n\t\t\thash:        \"\",\n\t\t}, nil\n\t}\n\n\t// Try parsing with potential hash\n\turiPart := value[:lastColonIdx]\n\thashPart := value[lastColonIdx+1:]\n\n\t// Validate the URI part\n\tparsedURL, err := url.Parse(uriPart)\n\tif err != nil {\n\t\t// If parsing fails, maybe the colon is part of the URI (like a port)\n\t\tparsedURL, err = url.Parse(value)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"grpc-federation: invalid URI format: %w\", err)\n\t\t}\n\t\treturn &pluginURI{\n\t\t\toriginalURL: value,\n\t\t\tparsedURL:   parsedURL,\n\t\t\thash:        \"\",\n\t\t}, nil\n\t}\n\n\t// Check if hashPart looks like a valid SHA256 hash (64 hex characters)\n\tif len(hashPart) == 64 {\n\t\tisValidHash := true\n\t\tfor _, r := range hashPart {\n\t\t\tif !((r >= '0' && r <= '9') || (r >= 'a' && r <= 'f') || (r >= 'A' && r <= 'F')) {\n\t\t\t\tisValidHash = false\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif isValidHash {\n\t\t\treturn &pluginURI{\n\t\t\t\toriginalURL: uriPart,\n\t\t\t\tparsedURL:   parsedURL,\n\t\t\t\thash:        hashPart,\n\t\t\t}, nil\n\t\t}\n\t}\n\n\t// Hash part is not valid, treat the whole string as URI\n\tparsedURL, err = url.Parse(value)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"grpc-federation: invalid URI format: %w\", err)\n\t}\n\treturn &pluginURI{\n\t\toriginalURL: value,\n\t\tparsedURL:   parsedURL,\n\t\thash:        \"\",\n\t}, nil\n}\n\nvar (\n\tschemeToOptionParser = map[string]func(*CodeGeneratorOption, *pluginURI) error{\n\t\t\"file\":  parseFileSchemeOption,\n\t\t\"http\":  parseHTTPSchemeOption,\n\t\t\"https\": parseHTTPSSchemeOption,\n\t}\n)\n\nfunc parsePluginsOption(opt *CodeGeneratorOption, value string) error {\n\tpluginURI, err := parsePluginURI(value)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tparser, exists := schemeToOptionParser[pluginURI.parsedURL.Scheme]\n\tif !exists {\n\t\treturn fmt.Errorf(\n\t\t\t`grpc-federation: location of the plugin file must be specified with the \"file://\" or \"http(s)://\" schemes but specified %s`,\n\t\t\tvalue,\n\t\t)\n\t}\n\n\treturn parser(opt, pluginURI)\n}\n\nfunc parseFileSchemeOption(opt *CodeGeneratorOption, pluginURI *pluginURI) error {\n\t// For file URLs, we need to handle both file:///path and file://path patterns\n\t// file:///path -> Host: \"\", Path: \"/path\"\n\t// file://path -> Host: \"path\", Path: \"\"\n\t// file://hostname/path -> Host: \"hostname\", Path: \"/path\"\n\n\tvar path string\n\tif pluginURI.parsedURL.Host != \"\" && pluginURI.parsedURL.Path == \"\" {\n\t\t// Case: file://path (host part contains the path)\n\t\tpath = pluginURI.parsedURL.Host\n\t} else if pluginURI.parsedURL.Host == \"\" && pluginURI.parsedURL.Path != \"\" {\n\t\t// Case: file:///path (path part contains the path)\n\t\tpath = pluginURI.parsedURL.Path\n\t} else if pluginURI.parsedURL.Host != \"\" && pluginURI.parsedURL.Path != \"\" {\n\t\t// Case: file://hostname/path (UNC path or network path)\n\t\tpath = pluginURI.parsedURL.Host + pluginURI.parsedURL.Path\n\t} else {\n\t\treturn fmt.Errorf(`grpc-federation: plugin option must be specified with \"file://path/to/file.wasm:sha256hash\" or \"file://path/to/file.wasm\"`)\n\t}\n\n\t// Check for invalid colon in path (except Windows drive letters)\n\tif strings.Contains(path, \":\") {\n\t\t// Allow Windows drive letters like /C:/ or C:/\n\t\tif !(len(path) >= 3 && path[1] == ':' && (path[2] == '/' || path[2] == '\\\\')) &&\n\t\t\t!(len(path) >= 4 && path[0] == '/' && path[2] == ':' && (path[3] == '/' || path[3] == '\\\\')) {\n\t\t\treturn fmt.Errorf(`grpc-federation: invalid file path contains colon: %s`, path)\n\t\t}\n\t}\n\n\tif !filepath.IsAbs(path) {\n\t\tabs, err := filepath.Abs(path)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"grpc-federation: failed to get absolute path by %s: %w\", path, err)\n\t\t}\n\t\tpath = abs\n\t}\n\n\topt.Plugins = append(opt.Plugins, &WasmPluginOption{\n\t\tPath:   path,\n\t\tSha256: pluginURI.hash,\n\t})\n\treturn nil\n}\n\nfunc parseHTTPSchemeOption(opt *CodeGeneratorOption, pluginURI *pluginURI) error {\n\t// Validate that if a hash is provided, it's a valid SHA256 hash\n\tif pluginURI.hash != \"\" && len(pluginURI.hash) != 64 {\n\t\treturn fmt.Errorf(\"grpc-federation: invalid SHA256 hash length: expected 64 characters, got %d\", len(pluginURI.hash))\n\t}\n\tif pluginURI.hash != \"\" {\n\t\tfor _, r := range pluginURI.hash {\n\t\t\tif !((r >= '0' && r <= '9') || (r >= 'a' && r <= 'f') || (r >= 'A' && r <= 'F')) {\n\t\t\t\treturn fmt.Errorf(\"grpc-federation: invalid SHA256 hash: contains non-hex characters\")\n\t\t\t}\n\t\t}\n\t}\n\n\tfile, err := downloadFile(pluginURI.originalURL)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\topt.Plugins = append(opt.Plugins, &WasmPluginOption{\n\t\tPath:   file.Name(),\n\t\tSha256: pluginURI.hash,\n\t})\n\treturn nil\n}\n\nfunc parseHTTPSSchemeOption(opt *CodeGeneratorOption, pluginURI *pluginURI) error {\n\t// Validate that if a hash is provided, it's a valid SHA256 hash\n\tif pluginURI.hash != \"\" && len(pluginURI.hash) != 64 {\n\t\treturn fmt.Errorf(\"grpc-federation: invalid SHA256 hash length: expected 64 characters, got %d\", len(pluginURI.hash))\n\t}\n\tif pluginURI.hash != \"\" {\n\t\tfor _, r := range pluginURI.hash {\n\t\t\tif !((r >= '0' && r <= '9') || (r >= 'a' && r <= 'f') || (r >= 'A' && r <= 'F')) {\n\t\t\t\treturn fmt.Errorf(\"grpc-federation: invalid SHA256 hash: contains non-hex characters\")\n\t\t\t}\n\t\t}\n\t}\n\n\tfile, err := downloadFile(pluginURI.originalURL)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\topt.Plugins = append(opt.Plugins, &WasmPluginOption{\n\t\tPath:   file.Name(),\n\t\tSha256: pluginURI.hash,\n\t})\n\treturn nil\n}\n\nfunc downloadFile(url string) (*os.File, error) {\n\tresp, err := http.Get(url) //nolint:gosec\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"grpc-federation: failed to download %s: %w\", url, err)\n\t}\n\tdefer resp.Body.Close()\n\n\tf, err := os.CreateTemp(\"\", \"grpc-federation-code-generation-plugin\")\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"grpc-federation: failed to create temp file: %w\", err)\n\t}\n\tdefer f.Close()\n\n\tif _, err := io.Copy(f, resp.Body); err != nil {\n\t\treturn nil, fmt.Errorf(\"grpc-federation: failed to copy downloaded content to temp file: %w\", err)\n\t}\n\treturn f, nil\n}\n\nfunc splitOpt(opt string) []string {\n\treturn strings.Split(opt, \",\")\n}\n\ntype partOption struct {\n\tkind  string\n\tvalue string\n}\n\nfunc splitOptPattern(opt string) (*partOption, error) {\n\tparts := strings.Split(opt, \"=\")\n\tif len(parts) != 2 {\n\t\treturn nil, fmt.Errorf(\"grpc-federation: unexpected option format: %s\", opt)\n\t}\n\treturn &partOption{\n\t\tkind:  parts[0],\n\t\tvalue: parts[1],\n\t}, nil\n}\n\nfunc parseImportPathsOption(opt *CodeGeneratorOption, value string) error {\n\topt.Path.ImportPaths = append(opt.Path.ImportPaths, value)\n\treturn nil\n}\n"
  },
  {
    "path": "generator/generator_test.go",
    "content": "package generator_test\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/mercari/grpc-federation/generator\"\n)\n\nfunc TestGenerateAll(t *testing.T) {\n\tbinDir, err := filepath.Abs(\"../bin\")\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tpath := os.Getenv(\"PATH\")\n\tt.Setenv(\"PATH\", fmt.Sprintf(\"%s:%s\", binDir, path))\n\n\tconst standardPluginNum = 3\n\n\tt.Run(\"explicit_declare_standard_plugins\", func(t *testing.T) {\n\t\tt.Parallel()\n\t\tcontent := `\nimports:\n  - ../testdata\nsrc:\n  - ../testdata\nout: .\nplugins:\n  - plugin: go\n    opt: paths=source_relative\n  - plugin: go-grpc\n    opt: paths=source_relative\n  - plugin: grpc-federation\n    opt: \n    - paths=source_relative\n    - import_paths=../testdata\n`\n\t\tcfg, err := generator.LoadConfigFromReader(strings.NewReader(content))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tg := generator.New(cfg)\n\t\tbuildCacheMap, err := g.GenerateAll(context.Background())\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tfor name, buildCache := range buildCacheMap {\n\t\t\tif len(buildCache.Responses) != standardPluginNum {\n\t\t\t\tt.Fatalf(\"failed to generate standard plugin for %s. code generator response number is %d\", name, len(buildCache.Responses))\n\t\t\t}\n\t\t}\n\t})\n\tt.Run(\"no_option\", func(t *testing.T) {\n\t\tt.Parallel()\n\t\tcontent := `\nimports:\n  - ../testdata\nsrc:\n  - ../testdata\nout: .\nplugins:\n  - plugin: go\n  - plugin: go-grpc\n  - plugin: grpc-federation\n    opt: import_paths=../testdata\n`\n\t\tcfg, err := generator.LoadConfigFromReader(strings.NewReader(content))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tg := generator.New(cfg)\n\t\tbuildCacheMap, err := g.GenerateAll(context.Background())\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tfor name, buildCache := range buildCacheMap {\n\t\t\tif len(buildCache.Responses) != standardPluginNum {\n\t\t\t\tt.Fatalf(\"failed to generate standard plugin for %s. code generator response number is %d\", name, len(buildCache.Responses))\n\t\t\t}\n\t\t}\n\t})\n\tt.Run(\"implicit_declare_standard_plugins\", func(t *testing.T) {\n\t\tt.Parallel()\n\t\tcontent := `\nimports:\n  - ../testdata\nsrc:\n  - ../testdata\nout: .\nplugins:\n  - plugin: grpc-federation\n    opt: import_paths=../testdata\n`\n\t\tcfg, err := generator.LoadConfigFromReader(strings.NewReader(content))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tg := generator.New(cfg)\n\t\tbuildCacheMap, err := g.GenerateAll(context.Background())\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tfor name, buildCache := range buildCacheMap {\n\t\t\tif len(buildCache.Responses) != standardPluginNum {\n\t\t\t\tt.Fatalf(\"failed to generate standard plugin for %s. code generator response number is %d\", name, len(buildCache.Responses))\n\t\t\t}\n\t\t}\n\t})\n\tt.Run(\"additional_plugin\", func(t *testing.T) {\n\t\tt.Parallel()\n\t\tcontent := `\nimports:\n  - ../testdata\nsrc:\n  - ../testdata\nout: .\nplugins:\n  - plugin: grpc-federation\n    opt: import_paths=../testdata\n  - plugin: validate-go\n`\n\t\tcfg, err := generator.LoadConfigFromReader(strings.NewReader(content))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tg := generator.New(cfg)\n\t\tbuildCacheMap, err := g.GenerateAll(context.Background())\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tpluginNum := standardPluginNum + 1 // validate-go\n\t\tfor name, buildCache := range buildCacheMap {\n\t\t\tif len(buildCache.Responses) != pluginNum {\n\t\t\t\tt.Fatalf(\"failed to generate standard plugin for %s. code generator response number is %d\", name, len(buildCache.Responses))\n\t\t\t}\n\t\t}\n\t})\n}\n"
  },
  {
    "path": "generator/plugin_option_test.go",
    "content": "package generator\n\nimport (\n\t\"net/url\"\n\t\"path/filepath\"\n\t\"testing\"\n)\n\nfunc TestParsePluginURI(t *testing.T) {\n\ttests := []struct {\n\t\tname            string\n\t\tinput           string\n\t\twantScheme      string\n\t\twantPath        string\n\t\twantHash        string\n\t\twantOriginalURL string\n\t\twantErr         bool\n\t}{\n\t\t{\n\t\t\tname:            \"file scheme without hash\",\n\t\t\tinput:           \"file:///path/to/plugin.wasm\",\n\t\t\twantScheme:      \"file\",\n\t\t\twantPath:        \"/path/to/plugin.wasm\",\n\t\t\twantHash:        \"\",\n\t\t\twantOriginalURL: \"file:///path/to/plugin.wasm\",\n\t\t\twantErr:         false,\n\t\t},\n\t\t{\n\t\t\tname:            \"file scheme without leading slash\",\n\t\t\tinput:           \"file://path/to/plugin.wasm\",\n\t\t\twantScheme:      \"file\",\n\t\t\twantPath:        \"/to/plugin.wasm\",\n\t\t\twantHash:        \"\",\n\t\t\twantOriginalURL: \"file://path/to/plugin.wasm\",\n\t\t\twantErr:         false,\n\t\t},\n\t\t{\n\t\t\tname:            \"file scheme with hash\",\n\t\t\tinput:           \"file:///path/to/plugin.wasm:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\",\n\t\t\twantScheme:      \"file\",\n\t\t\twantPath:        \"/path/to/plugin.wasm\",\n\t\t\twantHash:        \"1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\",\n\t\t\twantOriginalURL: \"file:///path/to/plugin.wasm\",\n\t\t\twantErr:         false,\n\t\t},\n\t\t{\n\t\t\tname:            \"file scheme with Windows path without hash\",\n\t\t\tinput:           \"file:///C:/path/to/plugin.wasm\",\n\t\t\twantScheme:      \"file\",\n\t\t\twantPath:        \"/C:/path/to/plugin.wasm\",\n\t\t\twantHash:        \"\",\n\t\t\twantOriginalURL: \"file:///C:/path/to/plugin.wasm\",\n\t\t\twantErr:         false,\n\t\t},\n\t\t{\n\t\t\tname:            \"file scheme with Windows path with hash\",\n\t\t\tinput:           \"file:///C:/path/to/plugin.wasm:abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890\",\n\t\t\twantScheme:      \"file\",\n\t\t\twantPath:        \"/C:/path/to/plugin.wasm\",\n\t\t\twantHash:        \"abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890\",\n\t\t\twantOriginalURL: \"file:///C:/path/to/plugin.wasm\",\n\t\t\twantErr:         false,\n\t\t},\n\t\t{\n\t\t\tname:            \"http scheme without hash\",\n\t\t\tinput:           \"http://example.com/plugin.wasm\",\n\t\t\twantScheme:      \"http\",\n\t\t\twantPath:        \"/plugin.wasm\",\n\t\t\twantHash:        \"\",\n\t\t\twantOriginalURL: \"http://example.com/plugin.wasm\",\n\t\t\twantErr:         false,\n\t\t},\n\t\t{\n\t\t\tname:            \"http scheme with hash\",\n\t\t\tinput:           \"http://example.com/plugin.wasm:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\",\n\t\t\twantScheme:      \"http\",\n\t\t\twantPath:        \"/plugin.wasm\",\n\t\t\twantHash:        \"1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\",\n\t\t\twantOriginalURL: \"http://example.com/plugin.wasm\",\n\t\t\twantErr:         false,\n\t\t},\n\t\t{\n\t\t\tname:            \"http scheme with port without hash\",\n\t\t\tinput:           \"http://example.com:8080/plugin.wasm\",\n\t\t\twantScheme:      \"http\",\n\t\t\twantPath:        \"/plugin.wasm\",\n\t\t\twantHash:        \"\",\n\t\t\twantOriginalURL: \"http://example.com:8080/plugin.wasm\",\n\t\t\twantErr:         false,\n\t\t},\n\t\t{\n\t\t\tname:            \"http scheme with port and hash\",\n\t\t\tinput:           \"http://example.com:8080/plugin.wasm:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\",\n\t\t\twantScheme:      \"http\",\n\t\t\twantPath:        \"/plugin.wasm\",\n\t\t\twantHash:        \"1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\",\n\t\t\twantOriginalURL: \"http://example.com:8080/plugin.wasm\",\n\t\t\twantErr:         false,\n\t\t},\n\t\t{\n\t\t\tname:            \"https scheme without hash\",\n\t\t\tinput:           \"https://example.com/plugin.wasm\",\n\t\t\twantScheme:      \"https\",\n\t\t\twantPath:        \"/plugin.wasm\",\n\t\t\twantHash:        \"\",\n\t\t\twantOriginalURL: \"https://example.com/plugin.wasm\",\n\t\t\twantErr:         false,\n\t\t},\n\t\t{\n\t\t\tname:            \"https scheme with hash\",\n\t\t\tinput:           \"https://example.com/plugin.wasm:abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890\",\n\t\t\twantScheme:      \"https\",\n\t\t\twantPath:        \"/plugin.wasm\",\n\t\t\twantHash:        \"abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890\",\n\t\t\twantOriginalURL: \"https://example.com/plugin.wasm\",\n\t\t\twantErr:         false,\n\t\t},\n\t\t{\n\t\t\tname:            \"https scheme with port and path without hash\",\n\t\t\tinput:           \"https://example.com:443/path/to/plugin.wasm\",\n\t\t\twantScheme:      \"https\",\n\t\t\twantPath:        \"/path/to/plugin.wasm\",\n\t\t\twantHash:        \"\",\n\t\t\twantOriginalURL: \"https://example.com:443/path/to/plugin.wasm\",\n\t\t\twantErr:         false,\n\t\t},\n\t\t{\n\t\t\tname:            \"invalid hash (not 64 chars)\",\n\t\t\tinput:           \"file:///path/to/plugin.wasm:shorthhash\",\n\t\t\twantScheme:      \"file\",\n\t\t\twantPath:        \"/path/to/plugin.wasm:shorthhash\",\n\t\t\twantHash:        \"\",\n\t\t\twantOriginalURL: \"file:///path/to/plugin.wasm:shorthhash\",\n\t\t\twantErr:         false,\n\t\t},\n\t\t{\n\t\t\tname:            \"invalid hash (non-hex chars) results in invalid path\",\n\t\t\tinput:           \"file:///path/to/plugin.wasm:zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz\",\n\t\t\twantScheme:      \"file\",\n\t\t\twantPath:        \"/path/to/plugin.wasm:zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz\",\n\t\t\twantHash:        \"\",\n\t\t\twantOriginalURL: \"file:///path/to/plugin.wasm:zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz\",\n\t\t\twantErr:         false, // parsePluginURI itself doesn't error, but parseFileSchemeOption will\n\t\t},\n\t\t{\n\t\t\tname:            \"http with port and invalid hash length\",\n\t\t\tinput:           \"http://example.com:8080/plugin.wasm:shortinvalidhash\",\n\t\t\twantScheme:      \"http\",\n\t\t\twantPath:        \"/plugin.wasm:shortinvalidhash\",\n\t\t\twantHash:        \"\",\n\t\t\twantOriginalURL: \"http://example.com:8080/plugin.wasm:shortinvalidhash\",\n\t\t\twantErr:         false, // parsePluginURI treats the whole string as URL when hash is invalid\n\t\t},\n\t\t{\n\t\t\tname:            \"https with port and invalid hash characters\",\n\t\t\tinput:           \"https://example.com:443/plugin.wasm:invalidnonhexhash\",\n\t\t\twantScheme:      \"https\",\n\t\t\twantPath:        \"/plugin.wasm:invalidnonhexhash\",\n\t\t\twantHash:        \"\",\n\t\t\twantOriginalURL: \"https://example.com:443/plugin.wasm:invalidnonhexhash\",\n\t\t\twantErr:         false, // parsePluginURI treats the whole string as URL when hash is invalid\n\t\t},\n\t\t{\n\t\t\tname:            \"url with query parameters\",\n\t\t\tinput:           \"https://example.com/plugin.wasm?version=1.0\",\n\t\t\twantScheme:      \"https\",\n\t\t\twantPath:        \"/plugin.wasm\",\n\t\t\twantHash:        \"\",\n\t\t\twantOriginalURL: \"https://example.com/plugin.wasm?version=1.0\",\n\t\t\twantErr:         false,\n\t\t},\n\t\t{\n\t\t\tname:            \"url with fragment\",\n\t\t\tinput:           \"https://example.com/plugin.wasm#latest\",\n\t\t\twantScheme:      \"https\",\n\t\t\twantPath:        \"/plugin.wasm\",\n\t\t\twantHash:        \"\",\n\t\t\twantOriginalURL: \"https://example.com/plugin.wasm#latest\",\n\t\t\twantErr:         false,\n\t\t},\n\t\t{\n\t\t\tname:    \"invalid url\",\n\t\t\tinput:   \"://invalid-url\",\n\t\t\twantErr: true,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tgot, err := parsePluginURI(tt.input)\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Errorf(\"parsePluginURI() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif tt.wantErr {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif got.parsedURL.Scheme != tt.wantScheme {\n\t\t\t\tt.Errorf(\"parsePluginURI() scheme = %v, want %v\", got.parsedURL.Scheme, tt.wantScheme)\n\t\t\t}\n\t\t\tif got.parsedURL.Path != tt.wantPath {\n\t\t\t\tt.Errorf(\"parsePluginURI() path = %v, want %v\", got.parsedURL.Path, tt.wantPath)\n\t\t\t}\n\t\t\tif got.hash != tt.wantHash {\n\t\t\t\tt.Errorf(\"parsePluginURI() hash = %v, want %v\", got.hash, tt.wantHash)\n\t\t\t}\n\t\t\tif got.originalURL != tt.wantOriginalURL {\n\t\t\t\tt.Errorf(\"parsePluginURI() originalURL = %v, want %v\", got.originalURL, tt.wantOriginalURL)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestParsePluginsOption(t *testing.T) {\n\ttests := []struct {\n\t\tname     string\n\t\tinput    string\n\t\twantErr  bool\n\t\tvalidate func(*testing.T, *CodeGeneratorOption)\n\t}{\n\t\t{\n\t\t\tname:    \"file scheme\",\n\t\t\tinput:   \"file:///path/to/plugin.wasm\",\n\t\t\twantErr: false,\n\t\t\tvalidate: func(t *testing.T, opt *CodeGeneratorOption) {\n\t\t\t\tif len(opt.Plugins) != 1 {\n\t\t\t\t\tt.Errorf(\"expected 1 plugin, got %d\", len(opt.Plugins))\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif opt.Plugins[0].Path != \"/path/to/plugin.wasm\" {\n\t\t\t\t\tt.Errorf(\"expected path '/path/to/plugin.wasm', got %s\", opt.Plugins[0].Path)\n\t\t\t\t}\n\t\t\t\tif opt.Plugins[0].Sha256 != \"\" {\n\t\t\t\t\tt.Errorf(\"expected empty hash, got %s\", opt.Plugins[0].Sha256)\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:    \"file scheme with hash\",\n\t\t\tinput:   \"file:///path/to/plugin.wasm:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\",\n\t\t\twantErr: false,\n\t\t\tvalidate: func(t *testing.T, opt *CodeGeneratorOption) {\n\t\t\t\tif len(opt.Plugins) != 1 {\n\t\t\t\t\tt.Errorf(\"expected 1 plugin, got %d\", len(opt.Plugins))\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif opt.Plugins[0].Path != \"/path/to/plugin.wasm\" {\n\t\t\t\t\tt.Errorf(\"expected path '/path/to/plugin.wasm', got %s\", opt.Plugins[0].Path)\n\t\t\t\t}\n\t\t\t\tif opt.Plugins[0].Sha256 != \"1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\" {\n\t\t\t\t\tt.Errorf(\"expected hash '1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef', got %s\", opt.Plugins[0].Sha256)\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:    \"unsupported scheme\",\n\t\t\tinput:   \"ftp://example.com/plugin.wasm\",\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname:    \"invalid URL\",\n\t\t\tinput:   \"://invalid\",\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname:    \"file with invalid path (invalid hash treated as path)\",\n\t\t\tinput:   \"file:///path/to/plugin.wasm:zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz\",\n\t\t\twantErr: true,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\topt := &CodeGeneratorOption{}\n\t\t\terr := parsePluginsOption(opt, tt.input)\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Errorf(\"parsePluginsOption() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif !tt.wantErr && tt.validate != nil {\n\t\t\t\ttt.validate(t, opt)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestParseFileSchemeOption(t *testing.T) {\n\ttests := []struct {\n\t\tname     string\n\t\turi      *pluginURI\n\t\twantErr  bool\n\t\tvalidate func(*testing.T, *CodeGeneratorOption)\n\t}{\n\t\t{\n\t\t\tname: \"valid file path\",\n\t\t\turi: &pluginURI{\n\t\t\t\toriginalURL: \"file:///path/to/plugin.wasm\",\n\t\t\t\tparsedURL: &url.URL{\n\t\t\t\t\tScheme: \"file\",\n\t\t\t\t\tPath:   \"/path/to/plugin.wasm\",\n\t\t\t\t},\n\t\t\t\thash: \"\",\n\t\t\t},\n\t\t\twantErr: false,\n\t\t\tvalidate: func(t *testing.T, opt *CodeGeneratorOption) {\n\t\t\t\tif len(opt.Plugins) != 1 {\n\t\t\t\t\tt.Errorf(\"expected 1 plugin, got %d\", len(opt.Plugins))\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif opt.Plugins[0].Path != \"/path/to/plugin.wasm\" {\n\t\t\t\t\tt.Errorf(\"expected path '/path/to/plugin.wasm', got %s\", opt.Plugins[0].Path)\n\t\t\t\t}\n\t\t\t\tif opt.Plugins[0].Sha256 != \"\" {\n\t\t\t\t\tt.Errorf(\"expected empty hash, got %s\", opt.Plugins[0].Sha256)\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"relative path file\",\n\t\t\turi: &pluginURI{\n\t\t\t\toriginalURL: \"file://path/to/plugin.wasm\",\n\t\t\t\tparsedURL: &url.URL{\n\t\t\t\t\tScheme: \"file\",\n\t\t\t\t\tHost:   \"path\",\n\t\t\t\t\tPath:   \"/to/plugin.wasm\",\n\t\t\t\t},\n\t\t\t\thash: \"\",\n\t\t\t},\n\t\t\twantErr: false,\n\t\t\tvalidate: func(t *testing.T, opt *CodeGeneratorOption) {\n\t\t\t\tif len(opt.Plugins) != 1 {\n\t\t\t\t\tt.Errorf(\"expected 1 plugin, got %d\", len(opt.Plugins))\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t// Should be converted to absolute path\n\t\t\t\tif !filepath.IsAbs(opt.Plugins[0].Path) {\n\t\t\t\t\tt.Errorf(\"expected absolute path, got %s\", opt.Plugins[0].Path)\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"valid file path with hash\",\n\t\t\turi: &pluginURI{\n\t\t\t\toriginalURL: \"file:///path/to/plugin.wasm\",\n\t\t\t\tparsedURL: &url.URL{\n\t\t\t\t\tScheme: \"file\",\n\t\t\t\t\tPath:   \"/path/to/plugin.wasm\",\n\t\t\t\t},\n\t\t\t\thash: \"abcdef1234567890\",\n\t\t\t},\n\t\t\twantErr: false,\n\t\t\tvalidate: func(t *testing.T, opt *CodeGeneratorOption) {\n\t\t\t\tif len(opt.Plugins) != 1 {\n\t\t\t\t\tt.Errorf(\"expected 1 plugin, got %d\", len(opt.Plugins))\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif opt.Plugins[0].Sha256 != \"abcdef1234567890\" {\n\t\t\t\t\tt.Errorf(\"expected hash 'abcdef1234567890', got %s\", opt.Plugins[0].Sha256)\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"empty path\",\n\t\t\turi: &pluginURI{\n\t\t\t\toriginalURL: \"file://\",\n\t\t\t\tparsedURL: &url.URL{\n\t\t\t\t\tScheme: \"file\",\n\t\t\t\t\tPath:   \"\",\n\t\t\t\t},\n\t\t\t\thash: \"\",\n\t\t\t},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"invalid path with colon\",\n\t\t\turi: &pluginURI{\n\t\t\t\toriginalURL: \"file:///path/to/plugin.wasm:invalidhash\",\n\t\t\t\tparsedURL: &url.URL{\n\t\t\t\t\tScheme: \"file\",\n\t\t\t\t\tPath:   \"/path/to/plugin.wasm:invalidhash\",\n\t\t\t\t},\n\t\t\t\thash: \"\",\n\t\t\t},\n\t\t\twantErr: true,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\topt := &CodeGeneratorOption{}\n\t\t\terr := parseFileSchemeOption(opt, tt.uri)\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Errorf(\"parseFileSchemeOption() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif !tt.wantErr && tt.validate != nil {\n\t\t\t\ttt.validate(t, opt)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestParseHTTPSchemeOption(t *testing.T) {\n\ttests := []struct {\n\t\tname    string\n\t\turi     *pluginURI\n\t\twantErr bool\n\t}{\n\t\t{\n\t\t\tname: \"invalid hash length\",\n\t\t\turi: &pluginURI{\n\t\t\t\toriginalURL: \"http://example.com/plugin.wasm\",\n\t\t\t\tparsedURL: &url.URL{\n\t\t\t\t\tScheme: \"http\",\n\t\t\t\t\tHost:   \"example.com\",\n\t\t\t\t\tPath:   \"/plugin.wasm\",\n\t\t\t\t},\n\t\t\t\thash: \"invalidhash\",\n\t\t\t},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"invalid hash with non-hex characters\",\n\t\t\turi: &pluginURI{\n\t\t\t\toriginalURL: \"http://example.com/plugin.wasm\",\n\t\t\t\tparsedURL: &url.URL{\n\t\t\t\t\tScheme: \"http\",\n\t\t\t\t\tHost:   \"example.com\",\n\t\t\t\t\tPath:   \"/plugin.wasm\",\n\t\t\t\t},\n\t\t\t\thash: \"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz\",\n\t\t\t},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"url with port and invalid hash length\",\n\t\t\turi: &pluginURI{\n\t\t\t\toriginalURL: \"http://example.com:8080/plugin.wasm\",\n\t\t\t\tparsedURL: &url.URL{\n\t\t\t\t\tScheme: \"http\",\n\t\t\t\t\tHost:   \"example.com:8080\",\n\t\t\t\t\tPath:   \"/plugin.wasm\",\n\t\t\t\t},\n\t\t\t\thash: \"invalidhash\",\n\t\t\t},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"url with port and invalid hash characters\",\n\t\t\turi: &pluginURI{\n\t\t\t\toriginalURL: \"http://example.com:3000/plugin.wasm\",\n\t\t\t\tparsedURL: &url.URL{\n\t\t\t\t\tScheme: \"http\",\n\t\t\t\t\tHost:   \"example.com:3000\",\n\t\t\t\t\tPath:   \"/plugin.wasm\",\n\t\t\t\t},\n\t\t\t\thash: \"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz\",\n\t\t\t},\n\t\t\twantErr: true,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\topt := &CodeGeneratorOption{}\n\t\t\terr := parseHTTPSchemeOption(opt, tt.uri)\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Errorf(\"parseHTTPSchemeOption() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestParseHTTPSSchemeOption(t *testing.T) {\n\ttests := []struct {\n\t\tname    string\n\t\turi     *pluginURI\n\t\twantErr bool\n\t}{\n\t\t{\n\t\t\tname: \"invalid hash length\",\n\t\t\turi: &pluginURI{\n\t\t\t\toriginalURL: \"https://example.com/plugin.wasm\",\n\t\t\t\tparsedURL: &url.URL{\n\t\t\t\t\tScheme: \"https\",\n\t\t\t\t\tHost:   \"example.com\",\n\t\t\t\t\tPath:   \"/plugin.wasm\",\n\t\t\t\t},\n\t\t\t\thash: \"invalidhash\",\n\t\t\t},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"invalid hash with non-hex characters\",\n\t\t\turi: &pluginURI{\n\t\t\t\toriginalURL: \"https://example.com/plugin.wasm\",\n\t\t\t\tparsedURL: &url.URL{\n\t\t\t\t\tScheme: \"https\",\n\t\t\t\t\tHost:   \"example.com\",\n\t\t\t\t\tPath:   \"/plugin.wasm\",\n\t\t\t\t},\n\t\t\t\thash: \"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz\",\n\t\t\t},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"url with port and invalid hash length\",\n\t\t\turi: &pluginURI{\n\t\t\t\toriginalURL: \"https://example.com:443/plugin.wasm\",\n\t\t\t\tparsedURL: &url.URL{\n\t\t\t\t\tScheme: \"https\",\n\t\t\t\t\tHost:   \"example.com:443\",\n\t\t\t\t\tPath:   \"/plugin.wasm\",\n\t\t\t\t},\n\t\t\t\thash: \"shortinvalidhash\",\n\t\t\t},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"url with port and invalid hash characters\",\n\t\t\turi: &pluginURI{\n\t\t\t\toriginalURL: \"https://example.com:9443/plugin.wasm\",\n\t\t\t\tparsedURL: &url.URL{\n\t\t\t\t\tScheme: \"https\",\n\t\t\t\t\tHost:   \"example.com:9443\",\n\t\t\t\t\tPath:   \"/plugin.wasm\",\n\t\t\t\t},\n\t\t\t\thash: \"gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg\",\n\t\t\t},\n\t\t\twantErr: true,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\topt := &CodeGeneratorOption{}\n\t\t\terr := parseHTTPSSchemeOption(opt, tt.uri)\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Errorf(\"parseHTTPSSchemeOption() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "generator/protoc_gen_go_grpc.go",
    "content": "/*\n *\n * Copyright 2020 gRPC authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\n// This file is copied from https://github.com/grpc/grpc-go/blob/cmd/protoc-gen-go-grpc/v1.3.0/cmd/protoc-gen-go-grpc/grpc.go.\n// We use the original `generateFile` function with the name and arguments changed to suit our purposes.\n\n//nolint:all\npackage generator\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"google.golang.org/protobuf/compiler/protogen\"\n\t\"google.golang.org/protobuf/reflect/protoreflect\"\n\t\"google.golang.org/protobuf/types/descriptorpb\"\n)\n\nconst version = \"1.3.0\"\n\nvar requireUnimplemented *bool\n\nconst (\n\tcontextPackage = protogen.GoImportPath(\"context\")\n\tgrpcPackage    = protogen.GoImportPath(\"google.golang.org/grpc\")\n\tcodesPackage   = protogen.GoImportPath(\"google.golang.org/grpc/codes\")\n\tstatusPackage  = protogen.GoImportPath(\"google.golang.org/grpc/status\")\n)\n\ntype serviceGenerateHelperInterface interface {\n\tformatFullMethodSymbol(service *protogen.Service, method *protogen.Method) string\n\tgenFullMethods(g *protogen.GeneratedFile, service *protogen.Service)\n\tgenerateClientStruct(g *protogen.GeneratedFile, clientName string)\n\tgenerateNewClientDefinitions(g *protogen.GeneratedFile, service *protogen.Service, clientName string)\n\tgenerateUnimplementedServerType(gen *protogen.Plugin, file *protogen.File, g *protogen.GeneratedFile, service *protogen.Service)\n\tgenerateServerFunctions(gen *protogen.Plugin, file *protogen.File, g *protogen.GeneratedFile, service *protogen.Service, serverType string, serviceDescVar string)\n\tformatHandlerFuncName(service *protogen.Service, hname string) string\n}\n\ntype serviceGenerateHelper struct{}\n\nfunc (serviceGenerateHelper) formatFullMethodSymbol(service *protogen.Service, method *protogen.Method) string {\n\treturn fmt.Sprintf(\"%s_%s_FullMethodName\", service.GoName, method.GoName)\n}\n\nfunc (serviceGenerateHelper) genFullMethods(g *protogen.GeneratedFile, service *protogen.Service) {\n\tg.P(\"const (\")\n\tfor _, method := range service.Methods {\n\t\tfmSymbol := helper.formatFullMethodSymbol(service, method)\n\t\tfmName := fmt.Sprintf(\"/%s/%s\", service.Desc.FullName(), method.Desc.Name())\n\t\tg.P(fmSymbol, ` = \"`, fmName, `\"`)\n\t}\n\tg.P(\")\")\n\tg.P()\n}\n\nfunc (serviceGenerateHelper) generateClientStruct(g *protogen.GeneratedFile, clientName string) {\n\tg.P(\"type \", unexport(clientName), \" struct {\")\n\tg.P(\"cc \", grpcPackage.Ident(\"ClientConnInterface\"))\n\tg.P(\"}\")\n\tg.P()\n}\n\nfunc (serviceGenerateHelper) generateNewClientDefinitions(g *protogen.GeneratedFile, service *protogen.Service, clientName string) {\n\tg.P(\"return &\", unexport(clientName), \"{cc}\")\n}\n\nfunc (serviceGenerateHelper) generateUnimplementedServerType(gen *protogen.Plugin, file *protogen.File, g *protogen.GeneratedFile, service *protogen.Service) {\n\tserverType := service.GoName + \"Server\"\n\tmustOrShould := \"must\"\n\tif !*requireUnimplemented {\n\t\tmustOrShould = \"should\"\n\t}\n\t// Server Unimplemented struct for forward compatibility.\n\tg.P(\"// Unimplemented\", serverType, \" \", mustOrShould, \" be embedded to have forward compatible implementations.\")\n\tg.P(\"type Unimplemented\", serverType, \" struct {\")\n\tg.P(\"}\")\n\tg.P()\n\tfor _, method := range service.Methods {\n\t\tnilArg := \"\"\n\t\tif !method.Desc.IsStreamingClient() && !method.Desc.IsStreamingServer() {\n\t\t\tnilArg = \"nil,\"\n\t\t}\n\t\tg.P(\"func (Unimplemented\", serverType, \") \", serverSignature(g, method), \"{\")\n\t\tg.P(\"return \", nilArg, statusPackage.Ident(\"Errorf\"), \"(\", codesPackage.Ident(\"Unimplemented\"), `, \"method `, method.GoName, ` not implemented\")`)\n\t\tg.P(\"}\")\n\t}\n\tif *requireUnimplemented {\n\t\tg.P(\"func (Unimplemented\", serverType, \") mustEmbedUnimplemented\", serverType, \"() {}\")\n\t}\n\tg.P()\n}\n\nfunc (serviceGenerateHelper) generateServerFunctions(gen *protogen.Plugin, file *protogen.File, g *protogen.GeneratedFile, service *protogen.Service, serverType string, serviceDescVar string) {\n\t// Server handler implementations.\n\thandlerNames := make([]string, 0, len(service.Methods))\n\tfor _, method := range service.Methods {\n\t\thname := genServerMethod(gen, file, g, method, func(hname string) string {\n\t\t\treturn hname\n\t\t})\n\t\thandlerNames = append(handlerNames, hname)\n\t}\n\tgenServiceDesc(file, g, serviceDescVar, serverType, service, handlerNames)\n}\n\nfunc (serviceGenerateHelper) formatHandlerFuncName(service *protogen.Service, hname string) string {\n\treturn hname\n}\n\nvar helper serviceGenerateHelperInterface = serviceGenerateHelper{}\n\n// FileDescriptorProto.package field number\nconst fileDescriptorProtoPackageFieldNumber = 2\n\n// FileDescriptorProto.syntax field number\nconst fileDescriptorProtoSyntaxFieldNumber = 12\n\n// generateFile generates a _grpc.pb.go file containing gRPC service definitions.\nfunc runProtogenGoGRPC(gen *protogen.Plugin, file *protogen.File, requireUnimplementedServers bool) *protogen.GeneratedFile {\n\tif len(file.Services) == 0 {\n\t\treturn nil\n\t}\n\trequireUnimplemented = &requireUnimplementedServers\n\tfilename := file.GeneratedFilenamePrefix + \"_grpc.pb.go\"\n\tg := gen.NewGeneratedFile(filename, file.GoImportPath)\n\t// Attach all comments associated with the syntax field.\n\tgenLeadingComments(g, file.Desc.SourceLocations().ByPath(protoreflect.SourcePath{fileDescriptorProtoSyntaxFieldNumber}))\n\tg.P(\"// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\")\n\tg.P(\"// versions:\")\n\tg.P(\"// - protoc-gen-go-grpc v\", version)\n\tg.P(\"// - protoc             \", protocVersion(gen))\n\tif file.Proto.GetOptions().GetDeprecated() {\n\t\tg.P(\"// \", file.Desc.Path(), \" is a deprecated file.\")\n\t} else {\n\t\tg.P(\"// source: \", file.Desc.Path())\n\t}\n\tg.P()\n\t// Attach all comments associated with the package field.\n\tgenLeadingComments(g, file.Desc.SourceLocations().ByPath(protoreflect.SourcePath{fileDescriptorProtoPackageFieldNumber}))\n\tg.P(\"package \", file.GoPackageName)\n\tg.P()\n\tgenerateFileContent(gen, file, g)\n\treturn g\n}\n\nfunc protocVersion(gen *protogen.Plugin) string {\n\tv := gen.Request.GetCompilerVersion()\n\tif v == nil {\n\t\treturn \"(unknown)\"\n\t}\n\tvar suffix string\n\tif s := v.GetSuffix(); s != \"\" {\n\t\tsuffix = \"-\" + s\n\t}\n\treturn fmt.Sprintf(\"v%d.%d.%d%s\", v.GetMajor(), v.GetMinor(), v.GetPatch(), suffix)\n}\n\n// generateFileContent generates the gRPC service definitions, excluding the package statement.\nfunc generateFileContent(gen *protogen.Plugin, file *protogen.File, g *protogen.GeneratedFile) {\n\tif len(file.Services) == 0 {\n\t\treturn\n\t}\n\n\tg.P(\"// This is a compile-time assertion to ensure that this generated file\")\n\tg.P(\"// is compatible with the grpc package it is being compiled against.\")\n\tg.P(\"// Requires gRPC-Go v1.32.0 or later.\")\n\tg.P(\"const _ = \", grpcPackage.Ident(\"SupportPackageIsVersion7\")) // When changing, update version number above.\n\tg.P()\n\tfor _, service := range file.Services {\n\t\tgenService(gen, file, g, service)\n\t}\n}\n\nfunc genService(gen *protogen.Plugin, file *protogen.File, g *protogen.GeneratedFile, service *protogen.Service) {\n\t// Full methods constants.\n\thelper.genFullMethods(g, service)\n\n\t// Client interface.\n\tclientName := service.GoName + \"Client\"\n\n\tg.P(\"// \", clientName, \" is the client API for \", service.GoName, \" service.\")\n\tg.P(\"//\")\n\tg.P(\"// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.\")\n\n\tif service.Desc.Options().(*descriptorpb.ServiceOptions).GetDeprecated() {\n\t\tg.P(\"//\")\n\t\tg.P(deprecationComment)\n\t}\n\tg.Annotate(clientName, service.Location)\n\tg.P(\"type \", clientName, \" interface {\")\n\tfor _, method := range service.Methods {\n\t\tg.Annotate(clientName+\".\"+method.GoName, method.Location)\n\t\tif method.Desc.Options().(*descriptorpb.MethodOptions).GetDeprecated() {\n\t\t\tg.P(deprecationComment)\n\t\t}\n\t\tg.P(method.Comments.Leading,\n\t\t\tclientSignature(g, method))\n\t}\n\tg.P(\"}\")\n\tg.P()\n\n\t// Client structure.\n\thelper.generateClientStruct(g, clientName)\n\n\t// NewClient factory.\n\tif service.Desc.Options().(*descriptorpb.ServiceOptions).GetDeprecated() {\n\t\tg.P(deprecationComment)\n\t}\n\tg.P(\"func New\", clientName, \" (cc \", grpcPackage.Ident(\"ClientConnInterface\"), \") \", clientName, \" {\")\n\thelper.generateNewClientDefinitions(g, service, clientName)\n\tg.P(\"}\")\n\tg.P()\n\n\tvar methodIndex, streamIndex int\n\t// Client method implementations.\n\tfor _, method := range service.Methods {\n\t\tif !method.Desc.IsStreamingServer() && !method.Desc.IsStreamingClient() {\n\t\t\t// Unary RPC method\n\t\t\tgenClientMethod(gen, file, g, method, methodIndex)\n\t\t\tmethodIndex++\n\t\t} else {\n\t\t\t// Streaming RPC method\n\t\t\tgenClientMethod(gen, file, g, method, streamIndex)\n\t\t\tstreamIndex++\n\t\t}\n\t}\n\n\tmustOrShould := \"must\"\n\tif !*requireUnimplemented {\n\t\tmustOrShould = \"should\"\n\t}\n\n\t// Server interface.\n\tserverType := service.GoName + \"Server\"\n\tg.P(\"// \", serverType, \" is the server API for \", service.GoName, \" service.\")\n\tg.P(\"// All implementations \", mustOrShould, \" embed Unimplemented\", serverType)\n\tg.P(\"// for forward compatibility\")\n\tif service.Desc.Options().(*descriptorpb.ServiceOptions).GetDeprecated() {\n\t\tg.P(\"//\")\n\t\tg.P(deprecationComment)\n\t}\n\tg.Annotate(serverType, service.Location)\n\tg.P(\"type \", serverType, \" interface {\")\n\tfor _, method := range service.Methods {\n\t\tg.Annotate(serverType+\".\"+method.GoName, method.Location)\n\t\tif method.Desc.Options().(*descriptorpb.MethodOptions).GetDeprecated() {\n\t\t\tg.P(deprecationComment)\n\t\t}\n\t\tg.P(method.Comments.Leading,\n\t\t\tserverSignature(g, method))\n\t}\n\tif *requireUnimplemented {\n\t\tg.P(\"mustEmbedUnimplemented\", serverType, \"()\")\n\t}\n\tg.P(\"}\")\n\tg.P()\n\n\t// Server Unimplemented struct for forward compatibility.\n\thelper.generateUnimplementedServerType(gen, file, g, service)\n\n\t// Unsafe Server interface to opt-out of forward compatibility.\n\tg.P(\"// Unsafe\", serverType, \" may be embedded to opt out of forward compatibility for this service.\")\n\tg.P(\"// Use of this interface is not recommended, as added methods to \", serverType, \" will\")\n\tg.P(\"// result in compilation errors.\")\n\tg.P(\"type Unsafe\", serverType, \" interface {\")\n\tg.P(\"mustEmbedUnimplemented\", serverType, \"()\")\n\tg.P(\"}\")\n\n\t// Server registration.\n\tif service.Desc.Options().(*descriptorpb.ServiceOptions).GetDeprecated() {\n\t\tg.P(deprecationComment)\n\t}\n\tserviceDescVar := service.GoName + \"_ServiceDesc\"\n\tg.P(\"func Register\", service.GoName, \"Server(s \", grpcPackage.Ident(\"ServiceRegistrar\"), \", srv \", serverType, \") {\")\n\tg.P(\"s.RegisterService(&\", serviceDescVar, `, srv)`)\n\tg.P(\"}\")\n\tg.P()\n\n\thelper.generateServerFunctions(gen, file, g, service, serverType, serviceDescVar)\n}\n\nfunc clientSignature(g *protogen.GeneratedFile, method *protogen.Method) string {\n\ts := method.GoName + \"(ctx \" + g.QualifiedGoIdent(contextPackage.Ident(\"Context\"))\n\tif !method.Desc.IsStreamingClient() {\n\t\ts += \", in *\" + g.QualifiedGoIdent(method.Input.GoIdent)\n\t}\n\ts += \", opts ...\" + g.QualifiedGoIdent(grpcPackage.Ident(\"CallOption\")) + \") (\"\n\tif !method.Desc.IsStreamingClient() && !method.Desc.IsStreamingServer() {\n\t\ts += \"*\" + g.QualifiedGoIdent(method.Output.GoIdent)\n\t} else {\n\t\ts += method.Parent.GoName + \"_\" + method.GoName + \"Client\"\n\t}\n\ts += \", error)\"\n\treturn s\n}\n\nfunc genClientMethod(gen *protogen.Plugin, file *protogen.File, g *protogen.GeneratedFile, method *protogen.Method, index int) {\n\tservice := method.Parent\n\tfmSymbol := helper.formatFullMethodSymbol(service, method)\n\n\tif method.Desc.Options().(*descriptorpb.MethodOptions).GetDeprecated() {\n\t\tg.P(deprecationComment)\n\t}\n\tg.P(\"func (c *\", unexport(service.GoName), \"Client) \", clientSignature(g, method), \"{\")\n\tif !method.Desc.IsStreamingServer() && !method.Desc.IsStreamingClient() {\n\t\tg.P(\"out := new(\", method.Output.GoIdent, \")\")\n\t\tg.P(`err := c.cc.Invoke(ctx, `, fmSymbol, `, in, out, opts...)`)\n\t\tg.P(\"if err != nil { return nil, err }\")\n\t\tg.P(\"return out, nil\")\n\t\tg.P(\"}\")\n\t\tg.P()\n\t\treturn\n\t}\n\tstreamType := unexport(service.GoName) + method.GoName + \"Client\"\n\tserviceDescVar := service.GoName + \"_ServiceDesc\"\n\tg.P(\"stream, err := c.cc.NewStream(ctx, &\", serviceDescVar, \".Streams[\", index, `], `, fmSymbol, `, opts...)`)\n\tg.P(\"if err != nil { return nil, err }\")\n\tg.P(\"x := &\", streamType, \"{stream}\")\n\tif !method.Desc.IsStreamingClient() {\n\t\tg.P(\"if err := x.ClientStream.SendMsg(in); err != nil { return nil, err }\")\n\t\tg.P(\"if err := x.ClientStream.CloseSend(); err != nil { return nil, err }\")\n\t}\n\tg.P(\"return x, nil\")\n\tg.P(\"}\")\n\tg.P()\n\n\tgenSend := method.Desc.IsStreamingClient()\n\tgenRecv := method.Desc.IsStreamingServer()\n\tgenCloseAndRecv := !method.Desc.IsStreamingServer()\n\n\t// Stream auxiliary types and methods.\n\tg.P(\"type \", service.GoName, \"_\", method.GoName, \"Client interface {\")\n\tif genSend {\n\t\tg.P(\"Send(*\", method.Input.GoIdent, \") error\")\n\t}\n\tif genRecv {\n\t\tg.P(\"Recv() (*\", method.Output.GoIdent, \", error)\")\n\t}\n\tif genCloseAndRecv {\n\t\tg.P(\"CloseAndRecv() (*\", method.Output.GoIdent, \", error)\")\n\t}\n\tg.P(grpcPackage.Ident(\"ClientStream\"))\n\tg.P(\"}\")\n\tg.P()\n\n\tg.P(\"type \", streamType, \" struct {\")\n\tg.P(grpcPackage.Ident(\"ClientStream\"))\n\tg.P(\"}\")\n\tg.P()\n\n\tif genSend {\n\t\tg.P(\"func (x *\", streamType, \") Send(m *\", method.Input.GoIdent, \") error {\")\n\t\tg.P(\"return x.ClientStream.SendMsg(m)\")\n\t\tg.P(\"}\")\n\t\tg.P()\n\t}\n\tif genRecv {\n\t\tg.P(\"func (x *\", streamType, \") Recv() (*\", method.Output.GoIdent, \", error) {\")\n\t\tg.P(\"m := new(\", method.Output.GoIdent, \")\")\n\t\tg.P(\"if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err }\")\n\t\tg.P(\"return m, nil\")\n\t\tg.P(\"}\")\n\t\tg.P()\n\t}\n\tif genCloseAndRecv {\n\t\tg.P(\"func (x *\", streamType, \") CloseAndRecv() (*\", method.Output.GoIdent, \", error) {\")\n\t\tg.P(\"if err := x.ClientStream.CloseSend(); err != nil { return nil, err }\")\n\t\tg.P(\"m := new(\", method.Output.GoIdent, \")\")\n\t\tg.P(\"if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err }\")\n\t\tg.P(\"return m, nil\")\n\t\tg.P(\"}\")\n\t\tg.P()\n\t}\n}\n\nfunc serverSignature(g *protogen.GeneratedFile, method *protogen.Method) string {\n\tvar reqArgs []string\n\tret := \"error\"\n\tif !method.Desc.IsStreamingClient() && !method.Desc.IsStreamingServer() {\n\t\treqArgs = append(reqArgs, g.QualifiedGoIdent(contextPackage.Ident(\"Context\")))\n\t\tret = \"(*\" + g.QualifiedGoIdent(method.Output.GoIdent) + \", error)\"\n\t}\n\tif !method.Desc.IsStreamingClient() {\n\t\treqArgs = append(reqArgs, \"*\"+g.QualifiedGoIdent(method.Input.GoIdent))\n\t}\n\tif method.Desc.IsStreamingClient() || method.Desc.IsStreamingServer() {\n\t\treqArgs = append(reqArgs, method.Parent.GoName+\"_\"+method.GoName+\"Server\")\n\t}\n\treturn method.GoName + \"(\" + strings.Join(reqArgs, \", \") + \") \" + ret\n}\n\nfunc genServiceDesc(file *protogen.File, g *protogen.GeneratedFile, serviceDescVar string, serverType string, service *protogen.Service, handlerNames []string) {\n\t// Service descriptor.\n\tg.P(\"// \", serviceDescVar, \" is the \", grpcPackage.Ident(\"ServiceDesc\"), \" for \", service.GoName, \" service.\")\n\tg.P(\"// It's only intended for direct use with \", grpcPackage.Ident(\"RegisterService\"), \",\")\n\tg.P(\"// and not to be introspected or modified (even as a copy)\")\n\tg.P(\"var \", serviceDescVar, \" = \", grpcPackage.Ident(\"ServiceDesc\"), \" {\")\n\tg.P(\"ServiceName: \", strconv.Quote(string(service.Desc.FullName())), \",\")\n\tg.P(\"HandlerType: (*\", serverType, \")(nil),\")\n\tg.P(\"Methods: []\", grpcPackage.Ident(\"MethodDesc\"), \"{\")\n\tfor i, method := range service.Methods {\n\t\tif method.Desc.IsStreamingClient() || method.Desc.IsStreamingServer() {\n\t\t\tcontinue\n\t\t}\n\t\tg.P(\"{\")\n\t\tg.P(\"MethodName: \", strconv.Quote(string(method.Desc.Name())), \",\")\n\t\tg.P(\"Handler: \", handlerNames[i], \",\")\n\t\tg.P(\"},\")\n\t}\n\tg.P(\"},\")\n\tg.P(\"Streams: []\", grpcPackage.Ident(\"StreamDesc\"), \"{\")\n\tfor i, method := range service.Methods {\n\t\tif !method.Desc.IsStreamingClient() && !method.Desc.IsStreamingServer() {\n\t\t\tcontinue\n\t\t}\n\t\tg.P(\"{\")\n\t\tg.P(\"StreamName: \", strconv.Quote(string(method.Desc.Name())), \",\")\n\t\tg.P(\"Handler: \", handlerNames[i], \",\")\n\t\tif method.Desc.IsStreamingServer() {\n\t\t\tg.P(\"ServerStreams: true,\")\n\t\t}\n\t\tif method.Desc.IsStreamingClient() {\n\t\t\tg.P(\"ClientStreams: true,\")\n\t\t}\n\t\tg.P(\"},\")\n\t}\n\tg.P(\"},\")\n\tg.P(\"Metadata: \\\"\", file.Desc.Path(), \"\\\",\")\n\tg.P(\"}\")\n\tg.P()\n}\n\nfunc genServerMethod(gen *protogen.Plugin, file *protogen.File, g *protogen.GeneratedFile, method *protogen.Method, hnameFuncNameFormatter func(string) string) string {\n\tservice := method.Parent\n\thname := fmt.Sprintf(\"_%s_%s_Handler\", service.GoName, method.GoName)\n\n\tif !method.Desc.IsStreamingClient() && !method.Desc.IsStreamingServer() {\n\t\tg.P(\"func \", hnameFuncNameFormatter(hname), \"(srv interface{}, ctx \", contextPackage.Ident(\"Context\"), \", dec func(interface{}) error, interceptor \", grpcPackage.Ident(\"UnaryServerInterceptor\"), \") (interface{}, error) {\")\n\t\tg.P(\"in := new(\", method.Input.GoIdent, \")\")\n\t\tg.P(\"if err := dec(in); err != nil { return nil, err }\")\n\t\tg.P(\"if interceptor == nil { return srv.(\", service.GoName, \"Server).\", method.GoName, \"(ctx, in) }\")\n\t\tg.P(\"info := &\", grpcPackage.Ident(\"UnaryServerInfo\"), \"{\")\n\t\tg.P(\"Server: srv,\")\n\t\tfmSymbol := helper.formatFullMethodSymbol(service, method)\n\t\tg.P(\"FullMethod: \", fmSymbol, \",\")\n\t\tg.P(\"}\")\n\t\tg.P(\"handler := func(ctx \", contextPackage.Ident(\"Context\"), \", req interface{}) (interface{}, error) {\")\n\t\tg.P(\"return srv.(\", service.GoName, \"Server).\", method.GoName, \"(ctx, req.(*\", method.Input.GoIdent, \"))\")\n\t\tg.P(\"}\")\n\t\tg.P(\"return interceptor(ctx, in, info, handler)\")\n\t\tg.P(\"}\")\n\t\tg.P()\n\t\treturn hname\n\t}\n\tstreamType := unexport(service.GoName) + method.GoName + \"Server\"\n\tg.P(\"func \", hnameFuncNameFormatter(hname), \"(srv interface{}, stream \", grpcPackage.Ident(\"ServerStream\"), \") error {\")\n\tif !method.Desc.IsStreamingClient() {\n\t\tg.P(\"m := new(\", method.Input.GoIdent, \")\")\n\t\tg.P(\"if err := stream.RecvMsg(m); err != nil { return err }\")\n\t\tg.P(\"return srv.(\", service.GoName, \"Server).\", method.GoName, \"(m, &\", streamType, \"{stream})\")\n\t} else {\n\t\tg.P(\"return srv.(\", service.GoName, \"Server).\", method.GoName, \"(&\", streamType, \"{stream})\")\n\t}\n\tg.P(\"}\")\n\tg.P()\n\n\tgenSend := method.Desc.IsStreamingServer()\n\tgenSendAndClose := !method.Desc.IsStreamingServer()\n\tgenRecv := method.Desc.IsStreamingClient()\n\n\t// Stream auxiliary types and methods.\n\tg.P(\"type \", service.GoName, \"_\", method.GoName, \"Server interface {\")\n\tif genSend {\n\t\tg.P(\"Send(*\", method.Output.GoIdent, \") error\")\n\t}\n\tif genSendAndClose {\n\t\tg.P(\"SendAndClose(*\", method.Output.GoIdent, \") error\")\n\t}\n\tif genRecv {\n\t\tg.P(\"Recv() (*\", method.Input.GoIdent, \", error)\")\n\t}\n\tg.P(grpcPackage.Ident(\"ServerStream\"))\n\tg.P(\"}\")\n\tg.P()\n\n\tg.P(\"type \", streamType, \" struct {\")\n\tg.P(grpcPackage.Ident(\"ServerStream\"))\n\tg.P(\"}\")\n\tg.P()\n\n\tif genSend {\n\t\tg.P(\"func (x *\", streamType, \") Send(m *\", method.Output.GoIdent, \") error {\")\n\t\tg.P(\"return x.ServerStream.SendMsg(m)\")\n\t\tg.P(\"}\")\n\t\tg.P()\n\t}\n\tif genSendAndClose {\n\t\tg.P(\"func (x *\", streamType, \") SendAndClose(m *\", method.Output.GoIdent, \") error {\")\n\t\tg.P(\"return x.ServerStream.SendMsg(m)\")\n\t\tg.P(\"}\")\n\t\tg.P()\n\t}\n\tif genRecv {\n\t\tg.P(\"func (x *\", streamType, \") Recv() (*\", method.Input.GoIdent, \", error) {\")\n\t\tg.P(\"m := new(\", method.Input.GoIdent, \")\")\n\t\tg.P(\"if err := x.ServerStream.RecvMsg(m); err != nil { return nil, err }\")\n\t\tg.P(\"return m, nil\")\n\t\tg.P(\"}\")\n\t\tg.P()\n\t}\n\n\treturn hname\n}\n\nfunc genLeadingComments(g *protogen.GeneratedFile, loc protoreflect.SourceLocation) {\n\tfor _, s := range loc.LeadingDetachedComments {\n\t\tg.P(protogen.Comments(s))\n\t\tg.P()\n\t}\n\tif s := loc.LeadingComments; s != \"\" {\n\t\tg.P(protogen.Comments(s))\n\t\tg.P()\n\t}\n}\n\nconst deprecationComment = \"// Deprecated: Do not use.\"\n\nfunc unexport(s string) string { return strings.ToLower(s[:1]) + s[1:] }\n"
  },
  {
    "path": "generator/templates/cast.go.tmpl",
    "content": "{{- define \"castRepeated\" }}\nret := make({{ .ReturnType }}, 0, len(from))\nfor _, v := range from {\n\t{{- if .ElemRequiredCast }}\n\tcasted, err := s.{{ .ElemCastName }}(v)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret = append(ret, casted)\n\t{{- else }}\n\tret = append(ret, v)\n\t{{- end }}\n}\n{{- $wrapper := .CastOneofWrapper }}\n{{- if $wrapper }}\nreturn &{{ $wrapper.Name }}{\n\t{{ $wrapper.FieldName }}: ret,\n}, nil\n{{- else }}\nreturn ret, nil\n{{- end }}\n{{- end }}\n\n{{- define \"castMessage\" }}\nif from == nil {\n\treturn nil, nil\n}\n{{- range .Fields }}\n{{- $fieldName := toLocalVariable .ToFieldName }}\n{{- if .RequiredCast }}\n{{ $fieldName }}, err := s.{{ .CastName }}(from.Get{{ .FromFieldName }}())\nif err != nil {\n\treturn nil, err\n}\n{{- else }}\n{{ $fieldName }} := from.Get{{ .FromFieldName }}()\n{{- end }}\n{{- end }}\nret := &{{ .Name }}{\n\t{{- range .Fields }}\n\t{{ .ToFieldName }}: {{ toLocalVariable .ToFieldName }},\n\t{{- end }}\n}\n\n\n{{ $oneofs := .Oneofs }}\n{{- if $oneofs }}\n{{- range $oneofs }}\nswitch x := from.{{ .Name }}.(type) {\n\t{{ $name := .Name }}\n\t{{- $localName := toLocalVariable $name }}\n\t{{- range .Fields }}\n\tcase {{ .FromType }}:\n\t{{- if .RequiredCast }}\n\t{{ $localName }}, err := s.{{ .CastName }}(x)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\t{{- else }}\n\t{{ $localName }} := x\n\t{{- end }}\n\tret.{{ $name }} = {{ $localName }}\n\t{{- end }}\n}\n{{- end }}\n{{- end }}\n{{- $wrapper := .CastOneofWrapper }}\n{{- if $wrapper }}\nreturn &{{ $wrapper.Name }}{\n\t{{ $wrapper.FieldName }}: ret,\n}, nil\n{{- else }}\nreturn ret, nil\n{{- end }}\n\n{{- end }}\n\n{{- define \"castOneof\" }}\nif from == nil {\n\treturn nil, nil\n}\n{{ $fieldName := toLocalVariable .ToFieldName }}\n{{- if .RequiredCast }}\n{{ $fieldName }}, err := s.{{ .CastName }}(from.{{ .FromFieldName }})\nif err != nil {\n\treturn nil, err\n}\n{{- else }}\n{{ $fieldName }} := from.{{ .FromFieldName }}\n{{- end }}\nreturn &{{ .Name }}{ {{ .ToFieldName }}: {{ $fieldName }} }, nil\n{{- end }}\n\n{{- define \"castEnum\" }}\nvar ret {{ .ReturnType }}\nswitch from {\n\t{{- range .FromValues }}\n\tcase {{ .FromValue }}:\n\t\tret = {{ .ToValue }}\n\t{{- end }}\n\t{{- if .DefaultValue }}\n\tdefault:\n\t\tret = {{ .DefaultValue }}\n\t{{- end }}\n}\n{{- $wrapper := .CastOneofWrapper }}\n{{- if $wrapper }}\nreturn &{{ $wrapper.Name }}{\n\t{{ $wrapper.FieldName }}: ret,\n}, nil\n{{- else }}\nreturn ret, nil\n{{- end }}\n{{- end }}\n\n{{- define \"castMap\" }}\nret := {{ .ReturnType }}{}\nfor k, v := range from {\n\t{{- if .KeyRequiredCast }}\n\tkey, err := s.{{ .KeyCastName }}(k)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\t{{- else }}\n\tkey := k\n\t{{- end }}\n\t{{- if .ValueRequiredCast }}\n\tval, err := s.{{ .ValueCastName }}(v)\n\tif err != nil {\n\treturn nil, err\n\t}\n\t{{- else }}\n\tval := v\n\t{{- end }}\n\tret[key] = val\n}\n{{- $wrapper := .CastOneofWrapper }}\n{{- if $wrapper }}\nreturn &{{ $wrapper.Name }}{\n\t{{ $wrapper.FieldName }}: ret,\n}, nil\n{{- else }}\nreturn ret, nil\n{{- end }}\n{{- end }}\n\n{{- define \"castEnumAndNumber\" }}\n{{- $wrapper := .CastOneofWrapper }}\n{{- if $wrapper }}\nreturn &{{ $wrapper.Name }}{\n\t{{ $wrapper.FieldName }}: {{ .ReturnType }}(from),\n}, nil\n{{- else }}\nreturn {{ .ReturnType }}(from), nil\n{{- end }}\n{{- end }}\n\n{{- define \"castRequiredValidationNumber\" }}\nret, err := grpcfed.{{ .CastWithValidationName }}(from)\n{{- $wrapper := .CastOneofWrapper }}\n{{- if $wrapper }}\nif err != nil {\n\treturn nil, err\n}\nreturn &{{ $wrapper.Name }}{\n\t{{ $wrapper.FieldName }}: ret,\n}, nil\n{{- else }}\nif err != nil {\n\treturn ret, err\n}\nreturn ret, nil\n{{- end }}\n{{- end }}\n\n{{- define \"castDefault\" }}\n{{- $wrapper := .CastOneofWrapper }}\n{{- if $wrapper }}\nreturn &{{ $wrapper.Name }}{\n\t{{ $wrapper.FieldName }}: {{ .ReturnType }}(from),\n}, nil\n{{- else }}\nreturn {{ .ReturnType }}(from), nil\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "generator/templates/error_handler.go.tmpl",
    "content": "{{- define \"errorHandler\" }}\n{{- $def := .Definition }}\n{{- if $def.HasErrorHandler }}\n{{- $grpcErrors := $def.GRPCErrors }}\n{{- if $grpcErrors }}\ngrpcErr := grpcfed.ToGRPCError(ctx, err)\nctx = grpcfed.WithGRPCError(ctx, grpcErr)\nvar (\n\tdefaultMsg string\n\tdefaultCode grpcfed.Code\n\tdefaultDetails []grpcfed.ProtoMessage\n)\nif stat, exists := grpcfed.GRPCStatusFromError(err); exists {\n\tdefaultMsg = stat.Message()\n\tdefaultCode = stat.Code()\n\tdetails := stat.Details()\n\tdefaultDetails = make([]grpcfed.ProtoMessage, 0, len(details))\n\tfor _, detail := range details {\n\t\tmsg, ok := detail.(grpcfed.ProtoMessage)\n\t\tif ok {\n\t\t\tdefaultDetails = append(defaultDetails, msg)\n\t\t}\n\t}\n\t_ = defaultMsg\n\t_ = defaultCode\n\t_ = defaultDetails\n}\n\ntype localStatusType struct {\n\tstatus *grpcfed.Status\n\tlogLevel slog.Level\n}\nstat, handleErr := func() (*localStatusType, error) {\n\tvar stat *grpcfed.Status\n\t{{- range $grpcErrors }}\n\t{\n\t\t{{- $logLevel := .LogLevelValue }}\n\t\t{{- if .VariableDefinitionSet }}\n\t\t{{- template \"evalDefSet\" .VariableDefinitionSet }}\n\t\t{{- end }}\n\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\tValue: value,\n\t\t\tExpr: `{{ .If.Expr }}`,\n\t\t\tCacheIndex: {{ $def.CELCacheIndex }},\n\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t{{- if .Ignore }}\n\t\t\t\tstat = grpcfed.NewGRPCStatus(grpcfed.OKCode, \"ignore error\")\n\t\t\t\tret = &{{ $def.TypeWithoutPtr }}{}\n\t\t\t\treturn nil\n\t\t\t\t{{- else if .IgnoreAndResponse }}\n\t\t\t\tstat = grpcfed.NewGRPCStatus(grpcfed.OKCode, \"ignore error\")\n\t\t\t\tif err := grpcfed.IgnoreAndResponse(ctx, value, grpcfed.Def[{{ $def.Type }}, *localValueType]{\n\t\t\t\t\tName: \"{{ $def.Key }}\",\n\t\t\t\t\tType: {{ $def.CELType }},\n\t\t\t\t\tSetter: func(value *localValueType, v {{ $def.Type }}) error {\n\t\t\t\t\t\tret = v // assign customized response to the result value.\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t\tBy: `{{ .IgnoreAndResponse.Expr }}`,\n\t\t\t\t\tByCacheIndex: {{ $def.CELCacheIndex }},\n\t\t\t\t}); err != nil {\n\t\t\t\t\tgrpcfed.Logger(ctx).ErrorContext(ctx, \"failed to set response when ignored\", slog.String(\"error\", err.Error()))\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t\t{{- else }}\n\n\t\t\t\t{{- if .Message }}\n\t\t\t\terrmsg, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\t\tValue: value,\n\t\t\t\t\tExpr: `{{ .Message.Expr }}`,\n\t\t\t\t\tOutType: reflect.TypeOf(\"\"),\n\t\t\t\t\tCacheIndex: {{ $def.CELCacheIndex }},\n\t\t\t\t})\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\terrorMessage := errmsg.(string)\n\t\t\t\t{{- else }}\n\t\t\t\tvar errorMessage string\n\t\t\t\tif defaultMsg != \"\" {\n\t\t\t\t\terrorMessage = defaultMsg\n\t\t\t\t} else {\n\t\t\t\t\terrorMessage = \"error\"\n\t\t\t\t}\n\t\t\t\t{{- end }}\n\n\t\t\t\t{{- $details := .Details }}\n\t\t\t\t{{- if $details }}\n\t\t\t\tvar details       []grpcfed.ProtoMessage\n\t\t\t\t{{- range $details }}\n\t\t\t\t{{- if .VariableDefinitionSet }}\n\t\t\t\tif _, err := func() (any, error){\n\t\t\t\t\t{{- template \"evalDefSet\" .VariableDefinitionSet }}\n\t\t\t\t\treturn nil, nil\n\t\t\t\t}(); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\t{{- end }}\n\t\t\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\t\t\tValue: value,\n\t\t\t\t\tExpr: `{{ .If.Expr }}`,\n\t\t\t\t\tCacheIndex: {{ $def.CELCacheIndex }},\n\t\t\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t\t\t{{- if .MessageSet }}\n\t\t\t\t\t\tif _, err := func() (any, error){\n\t\t\t\t\t\t\t{{- template \"evalDefSet\" .MessageSet }}\n\t\t\t\t\t\t\treturn nil, nil\n\t\t\t\t\t\t}(); err != nil {\n\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t}\n\t\t\t\t\t\t{{- range $idx, $def := .MessageSet.Definitions }}\n\t\t\t\t\t\tif detail := grpcfed.CustomMessage(ctx, &grpcfed.CustomMessageParam{\n\t\t\t\t\t\t\tValue: value,\n\t\t\t\t\t\t\tMessageValueName: \"{{ $def.Name }}\",\n\t\t\t\t\t\t\tCacheIndex: {{ $def.CELCacheIndex }},\n\t\t\t\t\t\t\tMessageIndex: {{ $idx }},\n\t\t\t\t\t\t}); detail != nil {\n\t\t\t\t\t\t\tdetails = append(details, detail)\n\t\t\t\t\t\t}\n\t\t\t\t\t\t{{- end }}\n\t\t\t\t\t\t{{- end }}\n\n\t\t\t\t\t\t{{- range .By }}\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdetail, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\t\t\t\t\tValue: value,\n\t\t\t\t\t\t\t\tExpr: `{{ .Expr }}`,\n\t\t\t\t\t\t\t\tOutType: reflect.TypeOf({{ .Type }}),\n\t\t\t\t\t\t\t\tCacheIndex: {{ $def.CELCacheIndex }},\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\tgrpcfed.Logger(ctx).ErrorContext(ctx, \"failed setting error details\", slog.String(\"error\", err.Error()))\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif detail != nil {\n\t\t\t\t\t\t\t\tdetails = append(details, detail.(grpcfed.ProtoMessage))\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t{{- end }}\n\n\t\t\t\t\t\t{{- range .PreconditionFailures }}\n\t\t\t\t\t\t{{- template \"preconditionFailure\" . }}\n\t\t\t\t\t\t{{- end }}\n\t\t\t\t\t\t{{- range .BadRequests }}\n\t\t\t\t\t\t{{- template \"badRequest\" . }}\n\t\t\t\t\t\t{{- end }}\n\t\t\t\t\t\t{{- range .LocalizedMessages }}\n\t\t\t\t\t\t{{- template \"localizedMessage\" . }}\n\t\t\t\t\t\t{{- end }}\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\t{{- end }}\n\t\t\t\t{{- end }}\n\n\t\t\t\tvar code grpcfed.Code\n\t\t\t\t{{- if .Code }}\n\t\t\t\tcode = grpcfed.{{ .GoGRPCStatusCode }}\n\t\t\t\t{{- else }}\n\t\t\t\tcode = defaultCode\n\t\t\t\t{{- end }}\n\t\t\t\t{{- if $details }}\n\t\t\t\tstatus := grpcfed.NewGRPCStatus(code, errorMessage)\n\t\t\t\tstatusWithDetails, err := status.WithDetails(details...)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgrpcfed.Logger(ctx).ErrorContext(ctx, \"failed setting error details\", slog.String(\"error\", err.Error()))\n\t\t\t\t\tstat = status\n\t\t\t\t} else {\n\t\t\t\t\tstat = statusWithDetails\n\t\t\t\t}\n\t\t\t\t{{- else }}\n\t\t\t\tstatus := grpcfed.NewGRPCStatus(code, errorMessage)\n\t\t\t\tstatusWithDetails, err := status.WithDetails(defaultDetails...)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgrpcfed.Logger(ctx).ErrorContext(ctx, \"failed setting error details\", slog.String(\"error\", err.Error()))\n\t\t\t\t\tstat = status\n\t\t\t\t} else {\n\t\t\t\t\tstat = statusWithDetails\n\t\t\t\t}\n\t\t\t\t{{- end }}\n\t\t\t\treturn nil\n\t\t\t\t{{- end }}\n\t\t\t},\n\t\t}); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif stat != nil {\n\t\t\treturn &localStatusType{status: stat, logLevel: {{ $logLevel }}}, nil\n\t\t}\n\t}\n\t{{- end }}\n\treturn nil, nil\n}()\nif handleErr != nil {\n\tgrpcfed.Logger(ctx).ErrorContext(ctx, \"failed to handle error\", slog.String(\"error\", handleErr.Error()))\n\t// If it fails during error handling, return the original error.\n\tif err := s.errorHandler(ctx, {{ $def.ServiceName }}_DependentMethod_{{ $def.DependentMethodName }}, err); err != nil {\n\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t}\n} else if stat != nil {\n\tif err := s.errorHandler(ctx, {{ $def.ServiceName }}_DependentMethod_{{ $def.DependentMethodName }}, stat.status.Err()); err != nil {\n\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, stat.logLevel, grpcfed.LogAttrs(ctx))\n\t}\n} else {\n\tif err := s.errorHandler(ctx, {{ $def.ServiceName }}_DependentMethod_{{ $def.DependentMethodName }}, err); err != nil {\n\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t}\n}\nvalue.SetGRPCError(ret, grpcErr)\n{{- else }}\nif err := s.errorHandler(ctx, {{ $def.ServiceName }}_DependentMethod_{{ $def.DependentMethodName }}, err); err != nil {\n\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n}\n{{- end }}\n{{- else }}\nreturn nil, err\n{{- end }}\n{{- end }}\n\n{{- define \"detailMessages\" }}\n{{- $defGroups := .VariableDefinitionGroups }}\n{{- $defGroupsLen := len $defGroups }}\n{{- if gt $defGroupsLen 0 }}\nfunc(){\n\t_, err := func() (any, error) {\n\t\t{{- if eq $defGroupsLen 1 }}\n\t\t{{- template \"evalDefGroup\" (map \"Level\" 1 \"Definition\" (index $defGroups 0)) }}\n\t\t{{- else }}\n\t\t{{- if . }}\n\t\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\t\t{{- end }}\n\t\t{{- range $defGroups }}\n\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t{{- template \"evalDefGroup\" (map \"Level\" 2 \"Definition\" .) }}\n\t\t\treturn nil, nil\n\t\t})\n\t\t{{- end }}\n\t\t{{- if $defGroups }}\n\t\tif err := eg.Wait(); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\t{{- end }}\n\t\t{{- end }}\n\t\treturn nil, nil\n\t}()\n\tif err != nil {\n\t\tgrpcfed.Logger(ctx).ErrorContext(ctx, \"failed resolving messages\", slog.String(\"error\", err.Error()))\n\t\treturn\n\t}\n\t{{- range $i, $message := .Messages.Defs }}\n\tif detail := grpcfed.CustomMessage(ctx, &grpcfed.CustomMessageParam{\n\t\tValue: value,\n\t\tMessageValueName: \"{{ $message.Name }}\",\n\t\tCacheIndex: {{ $message.CELCacheIndex }},\n\t\tMessageIndex: {{ $i }},\n\t}); detail != nil {\n\t\tdetails = append(details, detail)\n\t}\n\t{{- end }}\n}()\n{{- end }}\n{{- end }}\n\n{{- define \"preconditionFailure\" }}\nif detail := grpcfed.PreconditionFailure(ctx, value, []*grpcfed.PreconditionFailureViolation{\n\t{{- range .Violations }}\n\t{\n\t\tType:    `{{ .Type.Expr }}`,\n\t\tSubject: `{{ .Subject.Expr }}`,\n\t\tDesc:    `{{ .Description.Expr }}`,\n\t\tTypeCacheIndex: {{ .CELCacheIndex }},\n\t\tSubjectCacheIndex: {{ .CELCacheIndex }},\n\t\tDescCacheIndex: {{ .CELCacheIndex }},\n\t},\n\t{{- end }}\n}); detail != nil {\n\tdetails = append(details, detail)\n}\n{{- end }}\n\n{{- define \"badRequest\" }}\nif detail := grpcfed.BadRequest(ctx, value, []*grpcfed.BadRequestFieldViolation{\n\t{{- range .FieldViolations }}\n\t{\n\t\tField: `{{ .Field.Expr }}`,\n\t\tDesc:  `{{ .Description.Expr }}`,\n\t\tFieldCacheIndex: {{ .CELCacheIndex }},\n\t\tDescCacheIndex: {{ .CELCacheIndex }},\n\t},\n\t{{- end }}\n}); detail != nil {\n\tdetails = append(details, detail)\n}\n{{- end }}\n\n{{- define \"localizedMessage\" }}\nif detail := grpcfed.LocalizedMessage(ctx, &grpcfed.LocalizedMessageParam{\n\tValue: value,\n\tLocale: \"{{ .Locale }}\",\n\tMessage: `{{ .Message.Expr }}`,\n\tCacheIndex: {{ .CELCacheIndex }},\n}); detail != nil {\n\tdetails = append(details, detail)\n}\n{{- end }}\n"
  },
  {
    "path": "generator/templates/eval.go.tmpl",
    "content": "{{- define \"declDef\" }}\n{{- $def := . }}\n/*\n{{ .ProtoComment }}\n*/\ndef_{{ .Key }} := func(ctx context.Context) error {\n\t{{- if .IsMap -}}\n\t{{- $mapResolver := .MapResolver -}}\n\treturn grpcfed.EvalDefMap(ctx, value, grpcfed.DefMap[{{ .Type }}, {{ $mapResolver.IteratorSourceType }}, *localValueType]{\n\t\t{{- if .UseIf }}\n\t\tIf: `{{ .If }}`,\n\t\tIfCacheIndex: {{ .CELCacheIndex }},\n\t\t{{- end }}\n\t\tName:   `{{ .Key }}`,\n\t\tType:   {{ .CELType }},\n\t\tSetter: func(value *localValueType, v {{ .Type }}) error {\n\t\t\tvalue.vars.{{ .VarFieldName }} = v\n\t\t\treturn nil\n\t\t},\n\t\tIteratorName: `{{ $mapResolver.IteratorName }}`,\n\t\tIteratorType: {{ $mapResolver.IteratorCELType }},\n\t\tIteratorSource: func(value *localValueType) []{{ $mapResolver.IteratorSourceType }}{ return {{ $mapResolver.IteratorSource }} },\n\t\tIterator: func(ctx context.Context, value *grpcfed.MapIteratorValue) (any, error) {\n\t\t\t{{- if $mapResolver.IsBy }}\n\t\t\t{{- $by := $mapResolver.MapExpr.Expr.By }}\n\t\t\treturn grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\tValue: value,\n\t\t\t\tExpr: `{{ $by.Expr }}`,\n\t\t\t\tOutType: reflect.TypeOf({{ $mapResolver.IteratorZeroValue }}),\n\t\t\t\tCacheIndex: {{ .CELCacheIndex }},\n\t\t\t})\n\t\t\t{{- else if $mapResolver.IsEnum }}\n\t\t\t{{- $enumExpr := $mapResolver.MapExpr.Expr.Enum }}\n\t\t\t{{- $enumSelector := $mapResolver.EnumSelector }}\n\t\t\tsrc, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\tValue: value,\n\t\t\t\tExpr: `{{ $mapResolver.MapExpr.Expr.Enum.By.Expr }}`,\n\t\t\t\tOutType: reflect.TypeOf({{ $mapResolver.EnumSrcZeroValue }}),\n\t\t\t\tCacheIndex: {{ .CELCacheIndex }},\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\treturn 0, err\n\t\t\t}\n\t\t\tv := src.({{ $mapResolver.EnumSrcType }})\n\t\t\t{{- if $enumSelector }}\n\t\t\tvar dst {{ $mapResolver.IteratorType }}\n\t\t\tif err := func() error {\n\t\t\t\t{{- template \"setEnumValueByEnumSelector\" (map \"Dst\" \"dst\" \"EnumSelector\" $enumSelector ) }}\n\t\t\t\treturn nil\n\t\t\t}(); err != nil {\n\t\t\t\treturn 0, err\n\t\t\t}\n\t\t\treturn dst, nil\n\t\t\t{{- else }}\n\t\t\treturn {{ $mapResolver.EnumCastFunc }}\n\t\t\t{{- end }}\n\t\t\t{{- else if $mapResolver.IsMessage }}\n\t\t\t{{- $arguments := $mapResolver.Arguments }}\n\t\t\targs := &{{ $mapResolver.Service.ServiceName }}_{{ $mapResolver.RequestType }}{\n\t\t\t\t{{- range $arguments }}\n\t\t\t\t{{- if not .CEL }}\n\t\t\t\t{{ .Name }}: {{ .Value }}, {{ .ProtoComment }}\n\t\t\t\t{{- end }}\n\t\t\t\t{{- end }}\n\t\t\t}\n\t\t\t{{- range $arguments }}\n\t\t\t{{- template \"setCELArgument\" (map \"Argument\" . \"Definition\" $def) }}\n\t\t\t{{- end }}\n\t\t\treturn s.{{ $mapResolver.Caller }}(ctx, args)\n\t\t\t{{- end }}\n\t\t},\n\t})\n\t{{- else -}}\n\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[{{ .Type }}, *localValueType]{\n\t\t{{- if .UseIf }}\n\t\tIf: `{{ .If }}`,\n\t\tIfCacheIndex: {{ .CELCacheIndex }},\n\t\t{{- end }}\n\t\tName:   `{{ .Key }}`,\n\t\tType:   {{ .CELType }},\n\t\tSetter: func(value *localValueType, v {{ .Type }}) error {\n\t\t\tvalue.vars.{{ .VarFieldName }} = v\n\t\t\treturn nil\n\t\t},\n\t\t{{- if .IsBy }}\n\t\tBy:     `{{ .By.Expr }}`,\n\t\tByCacheIndex: {{ .CELCacheIndex }},\n\t\t{{- else if .IsValidation }}\n\t\tValidation:  func(ctx context.Context, value *localValueType) error {\n\t\t\t{{- template \"messageValidation\" (map \"Ctx\" \"ctx\" \"Error\" .ValidationError) }}\n\t\t},\n\t\t{{- else if .IsSwitch }}\n\t\tSwitch: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t    {{- template \"declSwitch\" . }}\n\t\t},\n\t\t{{- else if .IsEnum }}\n\t\tEnum: func(ctx context.Context, value *localValueType) ({{ .Type }}, error) {\n\t\t\t{{- $enumSelector := .EnumSelector }}\n\t\t\tsrc, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\tValue: value,\n\t\t\t\tExpr: `{{ .Enum.By.Expr }}`,\n\t\t\t\tOutType: reflect.TypeOf({{ .EnumSrcZeroValue }}),\n\t\t\t\tCacheIndex: {{ .CELCacheIndex }},\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\treturn 0, err\n\t\t\t}\n\t\t\tv := src.({{ .EnumSrcType }})\n\t\t\t{{- if $enumSelector }}\n\t\t\tvar dst {{ .Type }}\n\t\t\tif err := func() error {\n\t\t\t\t{{- template \"setEnumValueByEnumSelector\" (map \"Dst\" \"dst\" \"EnumSelector\" $enumSelector ) }}\n\t\t\t\treturn nil\n\t\t\t}(); err != nil {\n\t\t\t\treturn 0, err\n\t\t\t}\n\t\t\treturn dst, nil\n\t\t\t{{- else }}\n\t\t\treturn {{ .EnumCastFunc }}\n\t\t\t{{- end }}\n\t\t},\n\t\t{{- else }}\n\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t{{- $arguments := .Arguments }}\n\t\t\t{{- if .UseArgs }}\n\t\t\targs := &{{ .RequestType }}{\n\t\t\t\t{{- range $arguments }}\n\t\t\t\t{{- if not .CEL }}\n\t\t\t\t{{ .Name }}: {{ .Value }}, {{ .ProtoComment }}\n\t\t\t\t{{- end }}\n\t\t\t\t{{- end }}\n\t\t\t}\n\t\t\t{{- end }}\n\t\t\t{{- range $arguments }}\n\t\t\t{{- template \"setCELArgument\" (map \"Argument\" . \"Definition\" $def) }}\n\t\t\t{{- end }}\n\t\t\t{{- if .IsCall }}\n\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call {{ .MethodFQDN }}\", slog.Any(\"{{ .RequestTypeFQDN }}\", s.logvalue_{{ .LogValueRequestType }}(args)))\n\t\t\t{{- if .UseMetadata }}\n\t\t\tmd, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\tValue: value,\n\t\t\t\tExpr: `{{ .Metadata }}`,\n\t\t\t\tOutType: reflect.TypeOf(map[string][]string{}),\n\t\t\t\tCacheIndex: {{ .CELCacheIndex }},\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tfor k, v := range md.(map[string][]string) {\n\t\t\t\tfor _, vv := range v {\n\t\t\t\t\tctx = grpcfed.AppendToOutgoingContext(ctx, k, vv)\n\t\t\t\t}\n\t\t\t}\n\t\t\t{{- end }}\n\t\t\t{{- template \"defineCallOpts\" . }}\n\t\t\t{{- end }}\n\t\t\t{{- if .UseTimeout }}\n\t\t\tret, err := grpcfed.WithTimeout[{{ .ReturnType }}](ctx, \"{{ .MethodFQDN }}\", {{ .Timeout }}, func(ctx context.Context) (*{{ .ReturnType }}, error) {\n\t\t\t\t{{- if .UseRetry }}\n\t\t\t\t{{- template \"retry\" (map \"Retry\" .Retry) }}\n\t\t\t\treturn grpcfed.WithRetry(ctx, &grpcfed.RetryParam[{{ .ReturnType }}]{\n\t\t\t\t\tValue: value,\n\t\t\t\t\tIf: `{{ .Retry.If.Expr }}`,\n\t\t\t\t\tCacheIndex: {{ .CELCacheIndex }},\n\t\t\t\t\tBackOff: b,\n\t\t\t\t\tBody: func() (*{{ .ReturnType }}, error) {\n\t\t\t\t\t\t{{- if .UseCallOption }}\n\t\t\t\t\t\t{{- template \"callWithOption\" . }}\n\t\t\t\t\t\t{{- else }}\n\t\t\t\t\t\treturn s.{{ .Caller }}(ctx, args)\n\t\t\t\t\t\t{{- end }}\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\t{{- else }}\n\t\t\t\t{{- if .UseCallOption }}\n\t\t\t\t{{- template \"callWithOption\" . }}\n\t\t\t\t{{- else }}\n\t\t\t\treturn s.{{ .Caller }}(ctx, args)\n\t\t\t\t{{- end }}\n\t\t\t\t{{- end }}\n\t\t\t})\n\t\t\t{{- else if .UseRetry }}\n\t\t\t{{- template \"retry\" (map \"Retry\" .Retry) }}\n\t\t\tret, err := grpcfed.WithRetry(ctx, &grpcfed.RetryParam[{{ .ReturnType }}]{\n\t\t\t\tValue: value,\n\t\t\t\tIf: `{{ .Retry.If.Expr }}`,\n\t\t\t\tCacheIndex: {{ .CELCacheIndex }},\n\t\t\t\tBackOff: b,\n\t\t\t\tBody: func() (*{{ .ReturnType }}, error) {\n\t\t\t\t\t{{- if .UseCallOption }}\n\t\t\t\t\t{{- template \"callWithOption\" . }}\n\t\t\t\t\t{{- else }}\n\t\t\t\t\treturn s.{{ .Caller }}(ctx, args)\n\t\t\t\t\t{{- end }}\n\t\t\t\t},\n\t\t\t})\n\t\t\t{{- else }}\n\t\t\t{{- if .UseCallOption }}\n\t\t\t{{- template \"callWithOption\" . }}\n\t\t\t{{- else }}\n\t\t\tret, err := s.{{ .Caller }}(ctx, args)\n\t\t\t{{- end }}\n\t\t\t{{- end }}\n\t\t\tif err != nil {\n\t\t\t\t{{- template \"errorHandler\" (map \"Definition\" .) }}\n\t\t\t}\n\t\t\treturn ret, nil\n\t\t},\n\t\t{{- end }}\n\t})\n\t{{- end }}\n}\n{{- end }}\n\n{{- define \"defineCallOpts\" }}\n\n{{- if .UseCallOption }}\n{{ $callOpt := .CallOption }}\nvar callOpts []grpcfed.CallOption\n{{- if $callOpt.ContentSubtype }}\ncallOpts = append(callOpts, grpcfed.GRPCCallOptionContentSubtype(`{{ $callOpt.ContentSubtype }}`))\n{{- end }}\n{{- if $callOpt.HeaderValueName }}\nvar hdr grpcfed.GRPCMetadata\ncallOpts = append(callOpts, grpcfed.GRPCCallOptionHeader(&hdr))\n{{- end }}\n{{- if $callOpt.TrailerValueName }}\nvar tlr grpcfed.GRPCMetadata\ncallOpts = append(callOpts, grpcfed.GRPCCallOptionTrailer(&tlr))\n{{- end }}\n{{- if $callOpt.UseMaxCallRecvMsgSize }}\ncallOpts = append(callOpts, grpcfed.GRPCCallOptionMaxCallRecvMsgSize({{ $callOpt.MaxCallRecvMsgSize }}))\n{{- end }}\n{{- if $callOpt.UseMaxCallSendMsgSize }}\ncallOpts = append(callOpts, grpcfed.GRPCCallOptionMaxCallSendMsgSize({{ $callOpt.MaxCallSendMsgSize }}))\n{{- end }}\n{{- if $callOpt.StaticMethod }}\ncallOpts = append(callOpts, grpcfed.GRPCCallOptionStaticMethod())\n{{- end }}\n{{- if $callOpt.UseWaitForReady }}\ncallOpts = append(callOpts, grpcfed.GRPCCallOptionWaitForReady({{ $callOpt.WaitForReady }}))\n{{- end }}\n{{- end }}\n\n{{- end }}\n\n{{- define \"callWithOption\" }}\n\n{{ $callOpt := .CallOption }}\nret, err := s.{{ .Caller }}(ctx, args, callOpts...)\nvalue.WithLock(func() {\n\t{{- if $callOpt.HeaderValueName }}\n\tif value.vars.{{ $callOpt.HeaderValueName }} != nil {\n\t\tfor k, v := range hdr {\n\t\t\tvalue.vars.{{ $callOpt.HeaderValueName }}[k] = v\n\t\t}\n\t}\n\t{{- end }}\n\t{{- if $callOpt.TrailerValueName }}\n\tif value.vars.{{ $callOpt.TrailerValueName }} != nil {\n\t\tfor k, v := range tlr {\n\t\t\tvalue.vars.{{ $callOpt.TrailerValueName }}[k] = v\n\t\t}\n\t}\n\t{{- end }}\n})\n\n{{- end }}\n\n{{- define \"evalMessageDef\" }}\nif err := def_{{ .Definition.Key }}({{ .Ctx }}); err != nil {\n\tgrpcfed.RecordErrorToSpan({{ .Ctx }}, err)\n\treturn nil, err\n}\n{{- end }}\n\n{{- define \"evalDefGroup\" }}\n{{- if .Definition.IsConcurrent }}\neg, {{ printf \"ctx%d\" .Level }} := grpcfed.ErrorGroupWithContext({{ parentCtx .Level }})\n{{- range .Definition.Starts }}\ngrpcfed.GoWithRecover(eg, func() (any, error) {\n\t{{- template \"evalDefGroup\" (map \"Level\" (add $.Level 1) \"Definition\" .) }}\n\treturn nil, nil\n})\n{{- end }}\nif err := eg.Wait(); err != nil {\n\treturn nil, err\n}\n{{- if .Definition.ExistsEnd }}\n{{- template \"evalMessageDef\" (map \"Ctx\" (parentCtx .Level) \"Definition\" .Definition.End) }}\n{{- end -}}\n\n{{- else -}}\n\n{{- if .Definition.ExistsStart }}\n{{- template \"evalDefGroup\" (map \"Level\" .Level \"Definition\" .Definition.Start) }}\n{{- end -}}\n\n{{- if .Definition.ExistsEnd }}\n{{- template \"evalMessageDef\" (map \"Ctx\" (parentCtx .Level) \"Definition\" .Definition.End) }}\n{{- end -}}\n\n{{- end -}}\n{{- end }}\n\n{{- define \"evalDefSet\" -}}\n\n{{ range .Definitions }}\n{{- template \"declDef\" . }}\n{{ end }}\n{{- $depGraph := .DependencyGraph }}\n{{- if $depGraph }}\n// A tree view of message dependencies is shown below.\n/*\n{{ $depGraph }}*/\n{{- end }}\n{{- $defGroups := .VariableDefinitionGroups }}\n{{- $defGroupsLen := len $defGroups }}\n{{- if eq $defGroupsLen 1 }}\n{{- template \"evalDefGroup\" (map \"Level\" 1 \"Definition\" (index $defGroups 0)) }}\n{{- else }}\n{{- if $defGroups }}\neg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n{{- end }}\n{{ range $defGroups }}\ngrpcfed.GoWithRecover(eg, func() (any, error) {\n\t{{- template \"evalDefGroup\" (map \"Level\" 2 \"Definition\" .) }}\n\treturn nil, nil\n})\n{{ end }}\n{{- if $defGroups }}\nif err := eg.Wait(); err != nil {\n\treturn nil, err\n}\n{{- end }}\n{{- end }}\n\n{{- end }}\n\n{{- define \"setCELArgument\" -}}\n{{- $def := .Definition }}\n{{- $arg := .Argument }}\n\n{{- if $arg.CEL }}\n{{- if $arg.If }}\n{{ $arg.ProtoComment }}\nif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\tValue: value,\n\tExpr: `{{ $arg.If.Expr }}`,\n\tCacheIndex: {{ $def.CELCacheIndex }},\n\tBody: func(value *localValueType) error {\n\t\treturn grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[{{ $arg.Type }}]{\n\t\t\tValue: value,\n\t\t\tExpr: `{{ $arg.CEL.Expr }}`,\n\t\t\tCacheIndex: {{ $def.CELCacheIndex }},\n\t\t\tSetter: func(v {{ $arg.Type }}) error {\n\t\t\t\t{{- template \"setArgumentBySetter\" $arg }}\n\t\t\t},\n\t\t})\n\t},\n}); err != nil {\n\treturn nil, err\n}\n{{- else }}\n{{ $arg.ProtoComment }}\nif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[{{ $arg.Type }}]{\n\tValue: value,\n\tExpr: `{{ $arg.CEL.Expr }}`,\n\tCacheIndex: {{ $def.CELCacheIndex }},\n\tSetter: func(v {{ $arg.Type }}) error {\n\t\t{{- template \"setArgumentBySetter\" $arg }}\n\t},\n}); err != nil {\n\treturn nil, err\n}\n{{- end }}\n{{- end }}\n\n{{- end }}\n\n{{- define \"setCELValue\" -}}\n{{- $def := .Definition }}\n{{- $arg := .Argument }}\n\nif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[{{ $arg.Type }}]{\n\tValue: value,\n\tExpr: `{{ $arg.CEL.Expr }}`,\n\tCacheIndex: {{ $def.CELCacheIndex }},\n\tSetter: func(v {{ $arg.Type }}) error {\n\t\t{{- template \"setArgumentBySetter\" $arg }}\n\t},\n}); err != nil {\n\treturn err\n}\n{{- end }}\n\n{{- define \"setArgumentBySetter\" -}}\n\n{{- if ne (len .InlineFields) 0 }}\n{{- range .InlineFields }}\n{{- template \"setArgument\" . }}\n{{- end }}\n{{- else }}\n{{- template \"setArgument\" . }}\n{{- end }}\nreturn nil\n\n{{- end }}\n\n{{- define \"setArgument\" -}}\n\n{{- if .OneofName }}\n{{- if .RequiredCast }}\n{{ toLocalVariable .Name }}, err := {{ .Value }}\nif err != nil {\n\treturn err\n}\nargs.{{ .OneofName }} = &{{ .OneofFieldName }}{\n\t{{ .Name }}: {{ toLocalVariable .Name }},\n}\n{{- else }}\nargs.{{ .OneofName }} = &{{ .OneofFieldName }}{\n\t{{ .Name }}: {{ .Value }},\n}\n{{- end }}\n\n{{- else }}\n\n{{- if .RequiredCast }}\n{{ toLocalVariable .Name }}, err := {{ .Value }}\nif err != nil {\n\treturn err\n}\nargs.{{ .Name }} = {{ toLocalVariable .Name }}\n{{- else }}\nargs.{{ .Name }} = {{ .Value }}\n{{- end }}\n\n{{- end }}\n\n{{- end }}\n\n{{- define \"setEnumValueByEnumSelector\" -}}\n{{- $enumSelector := .EnumSelector }}\nif v.GetCond() {\n\t{{- if $enumSelector.TrueEnumSelector }}\n\tif err := func(v *grpcfedcel.EnumSelector) error {\n\t\t{{- template \"setEnumValueByEnumSelector\" (map \"Dst\" .Dst \"EnumSelector\" $enumSelector.TrueEnumSelector ) }}\n\t\treturn nil\n\t}(v.GetTrueSelector()); err != nil {\n\t\treturn err\n\t}\n\t{{- else if $enumSelector.RequiredCastTrueType }}\n\tcasted, err := s.{{ $enumSelector.CastTrueTypeFunc }}({{ $enumSelector.TrueType }}(v.GetTrueValue()))\n\tif err != nil {\n\t\treturn err\n\t}\n\t{{ .Dst }} = casted\n\t{{- else }}\n\t{{ .Dst }} = {{ $enumSelector.TrueType }}(v.GetTrueValue())\n\t{{- end }}\n} else {\n\t{{- if $enumSelector.FalseEnumSelector }}\n\tif err := func(v *grpcfedcel.EnumSelector) {\n\t\t{{- template \"setEnumValueByEnumSelector\" (map \"Dst\" .Dst \"EnumSelector\" $enumSelector.FalseEnumSelector ) }}\n\t\treturn nil\n\t}(v.GetFalseSelector()); err != nil {\n\t\treturn err\n\t}\n\t{{- else if $enumSelector.RequiredCastFalseType }}\n\tcasted, err := s.{{ $enumSelector.CastFalseTypeFunc }}({{ $enumSelector.FalseType }}(v.GetFalseValue()))\n\tif err != nil {\n\t\treturn err\n\t}\n\t{{ .Dst }} = casted\n\t{{- else }}\n\t{{ .Dst }} = {{ $enumSelector.FalseType }}(v.GetFalseValue())\n\t{{- end }}\n}\n\n{{- end -}}\n"
  },
  {
    "path": "generator/templates/plugin.go.tmpl",
    "content": "{{- define \"plugin\" }}\n{{- range . }}\n{{ $pluginName := .PluginName }}\n{{ $pluginFunctions := .PluginFunctions }}\ntype {{ $pluginName }} interface {\n\t{{- range $pluginFunctions }}\n\t{{ .GoName }}(context.Context, {{- range .Args }}{{ .Type }},{{- end }}) ({{- .Return.Type }}, error)\n\t{{- end }}\n}\n\n{{- if .Capability.Network }}\n\nfunc init() {\n\thttp.DefaultTransport = grpcfednet.DefaultTransport()\n}\n\n{{- end }}\n\nfunc Register{{ $pluginName }}(plug {{ $pluginName }}) {\n\tgrpcfed.PluginMainLoop(\n\t\tgrpcfed.CELPluginVersionSchema{\n\t\t\tProtocolVersion:   grpcfed.CELPluginProtocolVersion,\n\t\t\tFederationVersion: \"{{ .FederationVersion }}\",\n\t\t\tFunctions: []string{\n\t\t\t\t{{- range $pluginFunctions }}\n\t\t\t\t\"{{ .ExportName }}\",\n\t\t\t\t{{- end }}\n\t\t\t},\n\t\t},\n\t\tfunc(ctx context.Context, req *grpcfed.CELPluginRequest) (*grpcfed.CELPluginResponse, error) {\n\t\t\tswitch req.GetMethod() {\n\t\t\t{{- range $pluginFunctions }}\n\t\t\tcase \"{{ .ExportName }}\":\n\t\t\t\t{{- $argLen := len .Args }}\n\t\t\t\tif len(req.GetArgs()) != {{ $argLen }} {\n\t\t\t\t\treturn nil, fmt.Errorf(\"%s: invalid argument number: %d. expected number is %d\", req.GetMethod(), len(req.GetArgs()), {{ $argLen }})\n\t\t\t\t}\n\t\t\t\t{{- range $idx, $arg := .Args }}\n\t\t\t\targ{{ $idx }}, err := grpcfed.{{ $arg.Converter }}(req.GetArgs()[{{ $idx }}])\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t{{- end }}\n\t\t\t\tret, err := plug.{{ .GoName }}(ctx, {{- range $idx, $arg := .Args }}arg{{ $idx }},{{- end }})\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn grpcfed.{{ .Return.Converter }}(ret)\n\t\t\t{{- end }}\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"unexpected method name: %s\", req.GetMethod())\n\t\t},\n\t)\n}\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "generator/templates/retry.go.tmpl",
    "content": "{{- define \"retry\" }}\n{{- if .Retry.Constant }}\nb := grpcfed.NewConstantBackOff({{ .Retry.Constant.Interval.Nanoseconds }}) /* {{ .Retry.Constant.Interval }} */\n{{- else }}\nb := grpcfed.NewExponentialBackOff(&grpcfed.ExponentialBackOffConfig{\n\tInitialInterval: {{ .Retry.Exponential.InitialInterval.Nanoseconds }}, /* {{ .Retry.Exponential.InitialInterval }} */\n\tRandomizationFactor: {{ .Retry.Exponential.RandomizationFactor }},\n\tMultiplier: {{ .Retry.Exponential.Multiplier }},\n\tMaxInterval: {{ .Retry.Exponential.MaxInterval.Nanoseconds }}, /* {{ .Retry.Exponential.MaxInterval }} */\n\tMaxElapsedTime: {{ .Retry.Exponential.MaxElapsedTime.Nanoseconds }}, /* {{ .Retry.Exponential.MaxElapsedTime }} */\n})\n{{- end }}\n{{- if .Retry.MaxRetries }}\nb = grpcfed.BackOffWithMaxRetries(b, {{ .Retry.MaxRetries }})\n{{- end }}\nb = grpcfed.BackOffWithContext(b, ctx)\n{{- end }}\n"
  },
  {
    "path": "generator/templates/server.go.tmpl",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//     protoc-gen-grpc-federation: {{ .Version }}\n// source: {{ .Source }}\npackage {{ .GoPackage.Name }}\n\nimport (\n\t{{- range .StandardImports }}\n\t\"{{ .Path }}\"\n\t{{- end }}\n\t{{ range .DefaultImports }}\n\t{{- if .Alias }}\n\t{{ .Alias }} \"{{ .Path }}\"\n\t{{- else }}\n\t\"{{ .Path }}\"\n\t{{- end }}\n\t{{- end }}\n\n\t{{ range .Imports }}\n\t{{ .Alias }} \"{{ .Path }}\"\n\t{{- end }}\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n{{- $pkgName := .Package.Name }}\n{{- $enums := .Enums }}\n{{- $useMethods := .AllUseMethods }}\n\n{{- range .EnumAttributes }}\n\nvar {{ .Name }}_attrMap = grpcfed.EnumAttributeMap[{{ .Name }}]{\n\t{{- range .Values }}\n\t{{ .Name }}: grpcfed.EnumValueAttributeMap{\n\t\t{{- range .Attrs }}\n\t\t`{{ .Name }}`: `{{ .Value }}`,\n\t\t{{- end }}\n\t},\n\t{{- end }}\n}\n\n{{- end }}\n\n{{- range .Services }}\n\n{{- $serviceName := .ServiceName }}\n{{- $serviceDependencies := .ServiceDependencies }}\n{{- $customResolvers := .CustomResolvers }}\n{{- $types := .Types }}\n{{- $oneofTypes := .OneofTypes }}\n{{- $celPlugins := .CELPlugins }}\n{{- $env := .Env }}\n{{- $svcVars := .ServiceVariables }}\n\n{{- range $types }}\n\n{{- if .VariableType }}\n// {{ .VariableType.Desc }}.\ntype {{ $serviceName }}_{{ .VariableType.Name }} struct {\n\t{{- range .VariableType.Fields }}\n\t{{ .Name }} {{ .Type }}\n\t{{- end }}\n}\n{{- end }}\n\n// {{ .Desc }}.\ntype {{ $serviceName }}_{{ .Name }} struct {\n\t{{- range .Fields }}\n\t{{- if .Name }}\n\t{{ .Name }} {{ .Type }}\n\t{{- else }}\n\t*{{ $serviceName }}_{{ .Type }}\n\t{{- end }}\n\t{{- end }}\n\t{{- if .VariableType }}\n\t{{ $serviceName }}_{{ .VariableType.Name }}\n\t{{- end }}\n}\n\n{{- end }}\n\n// {{ $serviceName }}Config configuration required to initialize the service that use GRPC Federation.\ntype {{ $serviceName }}Config struct {\n\t{{- if $serviceDependencies }}\n\t// Client provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\n\t// If this interface is not provided, an error is returned during initialization.\n\tClient {{ $serviceName }}ClientFactory // required\n\t{{- end }}\n\t{{- if $customResolvers }}\n\t// Resolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\n\t// If this interface is not provided, an error is returned during initialization.\n\tResolver {{ $serviceName }}Resolver // required\n\t{{- end }}\n\t{{- if $celPlugins }}\n\t// CELPlugin If you use the plugin feature to extend the CEL API,\n\t// you must write a plugin and output WebAssembly.\n\t// In this field, configure to load wasm with the path to the WebAssembly file and the sha256 value.\n\tCELPlugin *{{ $serviceName }}CELPluginConfig\n\t{{- end }}\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// {{ $serviceName }}ClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype {{ $serviceName }}ClientFactory interface {\n\t{{- range $serviceDependencies }}\n\t// {{ .ClientName }} create a gRPC Client to be used to call methods in {{ .ServiceName }}.\n\t{{ .ClientName }}({{ $serviceName }}ClientConfig) ({{ .ClientType }}, error)\n\t{{- end }}\n}\n\n// {{ $serviceName }}ClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype {{ $serviceName }}ClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// {{ $serviceName }}DependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype {{ $serviceName }}DependentClientSet struct {\n\t{{- range $serviceDependencies }}\n\t{{ .ClientName }} {{ .ClientType }}\n\t{{- end }}\n}\n\n// {{ $serviceName }}Resolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype {{ $serviceName }}Resolver interface {\n\t{{- range $customResolvers }}\n\t// {{ .Name }} implements resolver for \"{{ .ProtoFQDN }}\".\n\t{{ .Name }}(context.Context, *{{ $serviceName }}_{{ .RequestType }}) ({{ .ReturnType }}, error)\n\t{{- end }}\n}\n\n// {{ $serviceName }}CELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype {{ $serviceName }}CELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// {{ $serviceName }}CELPluginConfig hints for loading a WebAssembly based plugin.\ntype {{ $serviceName }}CELPluginConfig struct {\n\t{{- range $celPlugins }}\n\t{{ .FieldName }} {{ $serviceName }}CELPluginWasmConfig\n\t{{- end }}\n\tCacheDir string\n}\n\n{{- if $env }}\n// {{ $serviceName }}Env keeps the values read from environment variables.\ntype {{ $serviceName }}Env struct {\n\t{{- range $env.Vars }}\n\t{{ .Name }} {{ .Type }} `{{ .Tag }}`\n\t{{- end }}\n}\n\ntype key{{ $serviceName }}Env struct{}\n\n// Get{{ $serviceName }}Env gets environment variables.\nfunc Get{{ $serviceName }}Env(ctx context.Context) *{{ $serviceName }}Env {\n\tvalue := ctx.Value(key{{ $serviceName }}Env{})\n\tif value == nil {\n\t\treturn nil\n\t}\n\treturn value.(*{{ $serviceName }}Env)\n}\n\nfunc with{{ $serviceName }}Env(ctx context.Context, env *{{ $serviceName }}Env) context.Context {\n\treturn context.WithValue(ctx, key{{ $serviceName }}Env{}, env)\n}\n{{- end }}\n\n{{- if $svcVars }}\n// {{ $serviceName }}Variable keeps the initial values.\ntype {{ $serviceName }}Variable struct {\n\t{{- range $svcVars.Vars }}\n\t{{ .Name }} {{ .Type }}\n\t{{- end }}\n}\n\ntype key{{ $serviceName }}Variable struct{}\n\n// Get{{ $serviceName }}Variable gets initial variables.\nfunc Get{{ $serviceName }}Variable(ctx context.Context) *{{ $serviceName }}Variable {\n\tvalue := ctx.Value(key{{ $serviceName }}Variable{})\n\tif value == nil {\n\t\treturn nil\n\t}\n\treturn value.(*{{ $serviceName }}Variable)\n}\n\nfunc with{{ $serviceName }}Variable(ctx context.Context, svcVar *{{ $serviceName }}Variable) context.Context {\n\treturn context.WithValue(ctx, key{{ $serviceName }}Variable{}, svcVar)\n}\n{{- end }}\n\n// {{ $serviceName }}UnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype {{ $serviceName }}UnimplementedResolver struct {}\n\n{{- range $customResolvers }}\n// {{ .Name }} resolve \"{{ .ProtoFQDN }}\".\n// This method always returns Unimplemented error.\nfunc ({{ $serviceName }}UnimplementedResolver) {{ .Name }}(context.Context, *{{ $serviceName }}_{{ .RequestType }}) (ret {{ .ReturnType }}, e error) {\n\te = grpcfed.GRPCErrorf(grpcfed.UnimplementedCode, \"method {{ .Name }} not implemented\")\n\treturn\n}\n{{- end }}\n\n{{- $dependentMethods := .DependentMethods }}\n{{- if $dependentMethods }}\nconst (\n\t{{- range $dependentMethods }}\n\t{{ $serviceName }}_DependentMethod_{{ .Name }} = \"{{ .FQDN }}\"\n\t{{- end }}\n)\n{{- end }}\n\n// {{ $serviceName }} represents Federation Service.\ntype {{ $serviceName }} struct {\n\tUnimplemented{{ $serviceName }}Server\n\tcfg {{ $serviceName }}Config\n\tlogger *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler grpcfed.ErrorHandler\n\tcelCacheMap *grpcfed.CELCacheMap\n\ttracer trace.Tracer\n\t{{- if $env }}\n\tenv *{{ $serviceName }}Env\n\t{{- end }}\n\t{{- if $svcVars }}\n\tsvcVar *{{ $serviceName }}Variable\n\t{{- end }}\n\t{{- if $customResolvers }}\n\tresolver {{ $serviceName }}Resolver\n\t{{- end }}\n\tcelTypeHelper *grpcfed.CELTypeHelper\n\tcelEnvOpts []grpcfed.CELEnvOption\n\tcelPlugins []*grpcfedcel.CELPlugin\n\tclient *{{ $serviceName }}DependentClientSet\n}\n\n// New{{ $serviceName }} creates {{ $serviceName }} instance by {{ $serviceName }}Config.\nfunc New{{ $serviceName }}(cfg {{ $serviceName }}Config) (*{{ $serviceName }}, error) {\n\t{{- if $serviceDependencies }}\n\tif cfg.Client == nil {\n\t\treturn nil, grpcfed.ErrClientConfig\n\t}\n\t{{- end }}\n\t{{- if $customResolvers }}\n\tif cfg.Resolver == nil {\n\t\treturn nil, grpcfed.ErrResolverConfig\n\t}\n\t{{- end }}\n\t{{- if $celPlugins }}\n\tif cfg.CELPlugin == nil {\n\t\treturn nil, grpcfed.ErrCELPluginConfig\n\t}\n\t{{- end }}\n\t{{- range $serviceDependencies }}\n\t{{ .ClientName }}, err := cfg.Client.{{ .ClientName }}({{ $serviceName }}ClientConfig{\n\t\tService: \"{{ .ServiceName }}\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\t{{- end }}\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"{{ .FQDN }}\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t{{- range $types }}\n\t\t{{- if .ProtoFQDN }}\n\t\t\"{{ .ProtoFQDN }}\": {\n\t\t\t{{- if .ProtoFields }}\n\t\t\t{{- range .ProtoFields }}\n\t\t\t\"{{ .Name }}\": grpcfed.NewCELFieldType({{ .TypeDeclare }}, \"{{ .FieldName }}\"),\n\t\t\t{{- end }}\n\t\t\t{{- end }}\n\t\t},\n\t\t{{- end }}\n\t\t{{- end }}\n\n\t\t{{- range $oneofTypes }}\n\t\t\"{{ .MessageProtoFQDN }}\": {\n\t\t\t\"{{ .Name }}\": grpcfed.NewOneofSelectorFieldType(\n\t\t\t\t{{ .TypeDeclare }}, \"{{ .FieldName }}\",\n\t\t\t\t[]reflect.Type{ {{- range .FieldZeroValues }}reflect.TypeOf({{ . }}),{{- end }} },\n\t\t\t\t[]string{ {{- range .FieldGetterNames }}\"{{ . }}\",{{- end }} },\n\t\t\t\treflect.Zero(reflect.TypeOf({{ .ReturnZeroValue }})),\n\t\t\t),\n\t\t},\n\t\t{{- end }}\n\n\t\t{{- if $env }}\n\t\t\"grpc.federation.private.Env\": {\n\t\t\t{{- range $env.Vars }}\n\t\t\t\"{{ .ProtoName }}\": grpcfed.NewCELFieldType({{ .CELType }}, \"{{ .Name }}\"),\n\t\t\t{{- end }}\n\t\t},\n\t\t{{- end }}\n\n\t\t{{- if $svcVars }}\n\t\t\"grpc.federation.private.ServiceVariable\": {\n\t\t\t{{- range $svcVars.Vars }}\n\t\t\t\"{{ .ProtoName }}\": grpcfed.NewCELFieldType({{ .CELType }}, \"{{ .Name }}\"),\n\t\t\t{{- end }}\n\t\t},\n\t\t{{- end }}\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"{{ $pkgName }}\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\t{{- range $useMethods }}\n\tcelEnvOpts = append(celEnvOpts, grpcfed.GRPCErrorAccessorOptions(celTypeHelper, \"{{ .Response.FQDN }}\")...)\n\t{{- end }}\n\t{{- range $enums }}\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"{{ .ProtoName }}\", {{ .GoName }}_value, {{ .GoName }}_name)...)\n\t{{- if .EnumAttribute }}\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAttrOption[{{ .EnumAttribute.Name }}](\"{{ .EnumAttribute.ProtoName }}\", {{ .EnumAttribute.Name }}_attrMap))\n\t{{- end }}\n\t{{- end }}\n\t{{- if $env }}\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewCELVariable(\"grpc.federation.env\", grpcfed.CELObjectType(\"grpc.federation.private.Env\")))\n\t{{- end }}\n\t{{- if $svcVars }}\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewCELVariable(\"grpc.federation.var\", grpcfed.CELObjectType(\"grpc.federation.private.ServiceVariable\")))\n\t{{- end }}\n\t{{- if $celPlugins }}\n\tvar celPlugins []*grpcfedcel.CELPlugin\n\t{{- end }}\n\t{{- range $celPlugins }}\n\t{\n\t\tplugin, err := grpcfedcel.NewCELPlugin(ctx, grpcfedcel.CELPluginConfig{\n\t\t\tName: \"{{ .Name }}\",\n\t\t\tWasm: cfg.CELPlugin.{{ .FieldName }},\n\t\t\tCacheDir: cfg.CELPlugin.CacheDir,\n\t\t\tFunctions: []*grpcfedcel.CELFunction{\n\t\t\t\t{{- range .Functions }}\n\t\t\t\t{\n\t\t\t\t\tName: \"{{ .CELFunction.Name }}\",\n\t\t\t\t\tID: \"{{ .ID }}\",\n\t\t\t\t\tArgs: []*grpcfed.CELTypeDeclare{\n\t\t\t\t\t\t{{- range .Args }}\n\t\t\t\t\t\t{{ .CELType }},\n\t\t\t\t\t\t{{- end }}\n\t\t\t\t\t},\n\t\t\t\t\tReturn: {{ .Return.CELType }},\n\t\t\t\t\tIsMethod: {{ .IsMethod }},\n\t\t\t\t},\n\t\t\t\t{{- end }}\n\t\t\t},\n\t\t\tCapability: &grpcfedcel.CELPluginCapability{\n\t\t\t\t{{- if .Capability.Env }}\n\t\t\t\tEnv: &grpcfedcel.CELPluginEnvCapability{\n\t\t\t\t\tAll: {{ .Capability.Env.All }},\n\t\t\t\t\tNames: []string{\n\t\t\t\t\t\t{{- range .Capability.Env.Names }}\n\t\t\t\t\t\t\"{{ . }}\",\n\t\t\t\t\t\t{{- end }}\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{{- end }}\n\t\t\t\t{{- if .Capability.FileSystem }}\n\t\t\t\tFileSystem: &grpcfedcel.CELPluginFileSystemCapability{\n\t\t\t\t\tMountPath: \"{{ .Capability.FileSystem.MountPath }}\",\n\t\t\t\t},\n\t\t\t\t{{- end }}\n\t\t\t\t{{- if .Capability.Network }}\n\t\t\t\tNetwork: &grpcfedcel.CELPluginNetworkCapability{},\n\t\t\t\t{{- end }}\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tinstance, err := plugin.CreateInstance(ctx, celTypeHelper.CELRegistry())\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := instance.ValidatePlugin(ctx); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tcelPlugins = append(celPlugins, plugin)\n\t\tcelEnvOpts = append(celEnvOpts, grpcfed.CELLib(plugin))\n\t}\n\t{{- end }}\n\t{{- if $env }}\n\tvar env {{ $serviceName }}Env\n\tif err := grpcfed.LoadEnv(\"\", &env); err != nil {\n\t\treturn nil, err\n\t}\n\t{{- end }}\n\tsvc := &{{ $serviceName }}{\n\t\tcfg: cfg,\n\t\tlogger: logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler: errorHandler,\n\t\tcelEnvOpts: celEnvOpts,\n\t\tcelTypeHelper: celTypeHelper,\n\t\tcelCacheMap: grpcfed.NewCELCacheMap(),\n\t\ttracer: tracer,\n\t\t{{- if $env }}\n\t\tenv: &env,\n\t\t{{- end }}\n\t\t{{- if $svcVars }}\n\t\tsvcVar: new({{ $serviceName }}Variable),\n\t\t{{- end }}\n\t\t{{- if $customResolvers }}\n\t\tresolver: cfg.Resolver,\n\t\t{{- end }}\n\t\t{{- if $celPlugins }}\n\t\tcelPlugins: celPlugins,\n\t\t{{- end }}\n\t\tclient: &{{ $serviceName}}DependentClientSet{\n\t\t\t{{- range $serviceDependencies }}\n\t\t\t{{ .ClientName }}: {{ .ClientName }},\n\t\t\t{{- end }}\n\t\t},\n\t}\n\t{{- if $svcVars }}\n\tif err := svc.initServiceVariables(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\t{{- end }}\n\t{{- if $customResolvers }}\n\tif resolver, ok := cfg.Resolver.(grpcfed.CustomResolverInitializer); ok {\n\t\tctx := context.Background()\n\t\t{{- if $env }}\n\t\tctx = with{{ $serviceName }}Env(ctx, svc.env)\n\t\t{{- end }}\n\t\t{{- if $svcVars }}\n\t\tctx = with{{ $serviceName }}Variable(ctx, svc.svcVar)\n\t\t{{- end }}\n\t\tif err := resolver.Init(ctx); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\t{{- end }}\n\treturn svc, nil\n}\n\n// Cleanup{{ $serviceName }} cleanup all resources to prevent goroutine leaks.\nfunc Cleanup{{ $serviceName }}(ctx context.Context, svc *{{ $serviceName }}) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *{{ $serviceName }}) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n{{- if $svcVars }}\nfunc (s *{{ $serviceName }}) initServiceVariables(ctx context.Context) error {\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars *{{ $serviceName }}Variable\n\t}\n\tvalue := &localValueType{\n\t\tLocalValue: grpcfed.NewServiceVariableLocalValue(s.celEnvOpts),\n\t\tvars: s.svcVar,\n\t}\n\t{{- if $env }}\n\tvalue.AddEnv(s.env)\n\t{{- end }}\n\tvalue.AddServiceVariable(s.svcVar)\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t{{ range $svcVars.Defs }}\n\t{{- if .IsValidation }}\n\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\tValue: value,\n\t\tExpr: `{{ .Expr.Validation.Error.If.Expr }}`,\n\t\tCacheIndex: {{ .CELCacheIndex }},\n\t\tBody: func(value *localValueType) error {\n\t\t\terrmsg, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\tValue: value,\n\t\t\t\tExpr: `{{ .Expr.Validation.Error.Message.Expr }}`,\n\t\t\t\tOutType: reflect.TypeOf(\"\"),\n\t\t\t\tCacheIndex: {{ .CELCacheIndex }},\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\treturn grpcfed.NewGRPCStatus(grpcfed.InternalCode, errmsg.(string)).Err()\n\t\t},\n\t}); err != nil {\n\t\treturn err\n\t}\n\t{{- else }}\n\t{{- template \"declDef\" . }}\n\tif err := def_{{ .Key }}(ctx); err != nil {\n\t\treturn err\n\t}\n\t{{- end }}\n\t{{ end }}\n\treturn nil\n}\n{{- end }}\n\n{{- range .Methods }}\n\n// {{ .Name }} implements \"{{ .ProtoFQDN }}\" method.\nfunc (s *{{ $serviceName }}) {{ .Name }}(ctx context.Context, req {{ .RequestType }}) (res {{ .ReturnType }}, e error) {\n\tctx, span := s.tracer.Start(ctx, \"{{ .ProtoFQDN }}\")\n\tdefer span.End()\n\n\t{{- if $env }}\n\tctx = with{{ $serviceName }}Env(ctx, s.env)\n\t{{- end }}\n\t{{- if $svcVars }}\n\tctx = with{{ $serviceName }}Variable(ctx, s.svcVar)\n\t{{- end }}\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\n\t{{- if .UseTimeout }}\n\tres, err := grpcfed.WithTimeout[{{ .ReturnTypeWithoutPtr }}](ctx, \"{{ .ProtoFQDN }}\", {{ .Timeout }}, func(ctx context.Context) ({{ .ReturnType }}, error) {\n\t\treturn s.{{ .ResolverName }}(ctx, &{{ .ArgumentName }}{\n\t\t\t{{- range .ReturnTypeArguments }}\n\t\t\t{{ . }}: req.Get{{ . }}(),\n\t\t\t{{- end }}\n\t\t})\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n\t{{- else if .CustomResponse }}\n\tcustomRes, err := s.{{ .ResolverName }}(ctx, &{{ .ArgumentName }}{\n\t\t{{- range .ReturnTypeArguments }}\n\t\t{{ . }}: req.Get{{ . }}(),\n\t\t{{- end }}\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\tret, err := s.{{ .ResponseCastFuncName }}(customRes)\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn ret, nil\n\t{{- else }}\n\tres, err := s.{{ .ResolverName }}(ctx, &{{ .ArgumentName }}{\n\t\t{{- range .ReturnTypeArguments }}\n\t\t{{ . }}: req.Get{{ . }}(),\n\t\t{{- end }}\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n\t{{- end }}\n}\n\n{{- end }}\n\n{{- range .Messages }}\n{{- $msg := . }}\n{{- $hasCELValue := .HasCELValue }}\n{{ if .HasRule }}\n// {{ .ResolverName }} resolve \"{{ .ProtoFQDN }}\" message.\nfunc (s *{{ $serviceName }}) {{ .ResolverName }}(ctx context.Context, req *{{ $serviceName }}_{{ .RequestType }}) (*{{ .ReturnType }}, error) {\n\tctx, span := s.tracer.Start(ctx, \"{{ .ProtoFQDN }}\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve {{ .ProtoFQDN }}\", slog.Any(\"message_args\", s.logvalue_{{ .RequestType }}(req)))\n\t{{- if .IsDeclVariables }}\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\t{{- range .DeclVariables }}\n\t\t\t{{ .Name }} {{ .Type }}\n\t\t\t{{- end }}\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"{{ .RequestProtoType }}\", req)}\n\t{{- if $env }}\n\tvalue.AddEnv(s.env)\n\t{{- end }}\n\t{{- if $svcVars }}\n\tvalue.AddServiceVariable(s.svcVar)\n\t{{- end }}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t{{- end }}\n\t{{- template \"evalDefSet\" .VariableDefinitionSet }}\n\n\t{{- $customResolverArguments := .CustomResolverArguments }}\n\t{{- if $customResolverArguments }}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\t{{- end }}\n\t{{- range $customResolverArguments }}\n\treq.{{ .Name }} = {{ .Value }}\n\t{{- end }}\n\n\t// create a message value to be returned.\n\t{{- $hasMsgCustomResolver := .HasCustomResolver }}\n\t{{- if $hasMsgCustomResolver }}\n\t// `custom_resolver = true` in \"grpc.federation.message\" option.\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx))  // create a new reference to logger.\n\tret, err := s.resolver.{{ .CustomResolverName }}(ctx, req)\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t{{- else }}\n\tret := &{{ .ReturnType }}{}\n\t{{- end }}\n\n\t{{- $returnFields := .ReturnFields }}\n\t{{- if $returnFields }}\n\n\t// field binding section.\n\t{{- end }}\n\t{{- range $returnFields }}\n\t{{- if .CustomResolver }}\n\t{{- template \"setReturnValueByFieldCustomResolver\" (map \"HasMsgCustomResolver\" $hasMsgCustomResolver \"Value\" .CustomResolver \"ServiceName\" $serviceName) }}\n\t{{- else if .Oneof }}\n\t{{- template \"setReturnValueByOneofFields\" (map \"Message\" $msg \"Value\" .Oneof) }}\n\t{{- else if .CEL }}\n\t{{- template \"setReturnValueByCEL\" (map \"Message\" $msg \"Value\" .CEL) }}\n\t{{- else }}\n\t{{- template \"setReturnValueByAutoBind\" .AutoBind }}\n\t{{- end }}\n\t{{- end }}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved {{ .ProtoFQDN }}\", slog.Any(\"{{ .ProtoFQDN }}\", s.logvalue_{{ .LogValueReturnType }}(ret)))\n\treturn ret, nil\n}\n{{ end }}\n{{- end }}\n{{ range .CastFields }}\n// {{ .Name }} cast from \"{{ .RequestProtoFQDN }}\" to \"{{ .ResponseProtoFQDN }}\".\nfunc (s *{{ $serviceName }}) {{ .Name }}(from {{ .RequestType }}) ({{ .ResponseType }}, error) {\n\t{{- if .IsSlice }}\n\t{{- template \"castRepeated\" .ToSlice }}\n\t{{- else if .IsMap }}\n\t{{- template \"castMap\" .ToMap }}\n\t{{- else if .IsOneof }}\n\t{{- template \"castOneof\" .ToOneof }}\n\t{{- else if .IsStruct }}\n\t{{- template \"castMessage\" .ToStruct }}\n\t{{- else if .IsEnumToNumber }}\n\t{{- template \"castEnumAndNumber\" . }}\n\t{{- else if .IsNumberToEnum }}\n\t{{- template \"castEnumAndNumber\" . }}\n\t{{- else if .IsEnum }}\n\t{{- template \"castEnum\" .ToEnum }}\n\t{{- else if .IsRequiredValidationNumber }}\n\t{{- template \"castRequiredValidationNumber\" . }}\n\t{{- else }}\n\t{{- template \"castDefault\" . }}\n\t{{- end }}\n}\n{{ end }}\n{{ range .LogValues }}\n{{- if .IsRepeated }}\nfunc (s *{{ $serviceName }}) {{ .Name }}(v {{ .ValueType }}) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tattrs := make([]slog.Attr, 0, len(v))\n\tfor idx, vv := range v {\n\t\tattrs = append(attrs, slog.Attr{\n\t\t\tKey: grpcfed.ToLogAttrKey(idx),\n\t\t\tValue: s.{{ .Value }}(vv),\n\t\t})\n\t}\n\treturn slog.GroupValue(attrs...)\n}\n{{- else if .IsMap }}\nfunc (s *{{ $serviceName }}) {{ .Name }}(v {{ .ValueType }}) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tattrs := make([]slog.Attr, 0, len(v))\n\tfor key, value := range v {\n\t\tattrs = append(attrs, slog.Attr{\n\t\t\tKey: grpcfed.ToLogAttrKey(key),\n\t\t\tValue: {{ .Value }},\n\t\t})\n\t}\n\treturn slog.GroupValue(attrs...)\n}\n{{- else if .IsMessage }}\nfunc (s *{{ $serviceName }}) {{ .Name }}(v {{ .ValueType }}) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\t{{- range .Attrs }}\n\t\tslog.{{ .Type }}(\"{{ .Key }}\", {{ .Value }}),\n\t\t{{- end }}\n\t)\n}\n{{- else }}\nfunc (s *{{ $serviceName }}) {{ .Name }}(v {{ .ValueType }}) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tswitch v {\n\t{{- range .Attrs }}\n\tcase {{ .Value }}:\n\treturn slog.StringValue(\"{{ .Key }}\")\n\t{{- end }}\n\t}\n\treturn slog.StringValue(\"\")\n}\n{{- end }}\n{{ end }}\n\n{{- end }}\n\n{{- template \"plugin\" .CELPlugins }}\n\n{{- define \"setReturnValueByFieldCustomResolver\" -}}\n{{- $hasMsgCustomResolver := .HasMsgCustomResolver }}\n{{- $value := .Value }}\n{\n\t// (grpc.federation.field).custom_resolver = true\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx)) // create a new reference to logger.\n\tvar err error\n\tret.{{ $value.Name }}, err = s.resolver.{{ $value.ResolverName }}(ctx, &{{ .ServiceName }}_{{ $value.RequestType }}{\n\t\t{{ .ServiceName }}_{{ $value.MessageArgumentName }}: req,\n\t\t{{- if $hasMsgCustomResolver }}\n\t\t{{ $value.MessageName }}: ret,\n\t\t{{- end }}\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n}\n{{- end }}\n\n{{- define \"setReturnValueByOneofFields\" }}\n{{- $msg := .Message }}\n{{- $value := .Value }}\n{{- $name := $value.Name }}\n{{- $oneofFields := $value.OneofCaseFields }}\n{{- $defaultOneofField := $value.OneofDefaultField }}\n{{- if $value.HasFieldOneofRule }}\n{{- range $oneofFields }}\noneof_{{ .Name }}, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\tValue: value,\n\tExpr: `{{ .Expr }}`,\n\tOutType: reflect.TypeOf(true),\n\tCacheIndex: {{ $msg.CELCacheIndex }},\n})\nif err != nil {\n\tgrpcfed.RecordErrorToSpan(ctx, err)\n\treturn nil, err\n}\n{{- end }}\n{{- end }}\nif false {\n\t// For code generation reasons, we're using a loop to generate the oneof conditional branches,\n\t// so to avoid treating the first element specially, we always generate if branch with false condition.\n\t{{- range $oneofFields }}\n} else if {{ .Condition }} {\n\t{{- template \"setReturnValueByOneofField\" (map \"Message\" $msg \"Name\" $name \"Value\" . ) }}\n\t{{- end }}\n\t{{- if $defaultOneofField }}\n} else {\n\t{{- template \"setReturnValueByOneofField\" (map \"Message\" $msg \"Value\" $defaultOneofField ) }}\n\t{{- end }}\n}\n{{- end }}\n\n{{- define \"setReturnValueByOneofField\" -}}\n{{- $msg := .Message }}\n{{- $value := .Value }}\n{{- $name := .Name }}\n{{- template \"evalDefSet\" $value.VariableDefinitionSet }}\n{{- if $value.By }}\nif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[{{ $value.Type }}]{\n\tValue: value,\n\tExpr: `{{ $value.By }}`,\n\tCacheIndex: {{ $msg.CELCacheIndex }},\n\tSetter: func(v {{ $value.Type }}) error {\n\t\t{{- template \"setReturnValueBySetter\" $value.SetterParam }}\n\t\treturn nil\n\t},\n}); err != nil {\n\tgrpcfed.RecordErrorToSpan(ctx, err)\n\treturn nil, err\n}\n{{- else if $value.CastValue }}\n{{ toLocalVariable $name }}, err := {{ $value.CastValue }}\nif err != nil {\n\treturn nil, err\n}\nret.{{ $name }} = {{ toLocalVariable $name }}\n{{- else }}\nret.{{ $name }} = {{ $value.Value }}\n{{- end }}\n{{- end }}\n\n{{- define \"setReturnValueByCEL\" -}}\n{{- $msg := .Message }}\n{{- $value := .Value }}\n{{ $value.ProtoComment }}\nif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[{{ $value.Type }}]{\n\tValue: value,\n\tExpr: `{{ $value.CEL.Expr }}`,\n\tCacheIndex: {{ $msg.CELCacheIndex }},\n\tSetter: func(v {{ $value.Type }}) error {\n\t\t{{- template \"setReturnValueBySetter\" $value.SetterParam }}\n\t\treturn nil\n\t},\n}); err != nil {\n\tgrpcfed.RecordErrorToSpan(ctx, err)\n\treturn nil, err\n}\n{{- end }}\n\n{{- define \"setReturnValueByAutoBind\" -}}\n{{- if .RequiredCast }}\n{\n\t{{ toLocalVariable .Name }}, err := s.{{ .CastFunc }}({{ .Value }}) {{ .ProtoComment }}\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\tret.{{ .Name }} = {{ toLocalVariable .Name }}\n}\n{{- else }}\nret.{{ .Name }} = {{ .Value }} {{ .ProtoComment }}\n{{- end }}\n{{- end }}\n\n{{- define \"setReturnValueBySetter\" -}}\n{{- $name := .Name }}\n{{- $v := .Value }}\n{{- $enumSelector := .EnumSelector }}\n{{- if $enumSelector }}\n{{- template \"setReturnValueByEnumSelector\" (map \"Name\" $name \"EnumSelector\" $enumSelector ) }}\n{{- else if .RequiredCast }}\n{{ toLocalVariable $name }}, err := s.{{ .CastFunc }}({{ $v }})\nif err != nil {\n\treturn err\n}\nret.{{ $name }} = {{ toLocalVariable $name }}\n{{- else }}\nret.{{ $name }} = {{ $v }}\n{{- end }}\n{{- end -}}\n\n{{- define \"setReturnValueByEnumSelector\" -}}\n{{- $dst := toLocalVariable .Name }}\n{{- $enumSelector := .EnumSelector }}\nvar {{ $dst }} {{ $enumSelector.Type }}\n{{- template \"setEnumValueByEnumSelector\" (map \"Dst\" $dst \"EnumSelector\" $enumSelector) }}\nret.{{ .Name }} = {{ $dst }}\n{{- end -}}\n"
  },
  {
    "path": "generator/templates/switch.go.tmpl",
    "content": "{{- define \"declSwitch\" }}\n\t{{- $switch := .Switch }}\n\t{{- $cases := $switch.Cases }}\n\tcases := []*grpcfed.EvalSwitchCase[*localValueType]{}\n\t{{- range $cases }}\n\tcases = append(cases, &grpcfed.EvalSwitchCase[*localValueType]{\n\t    {{- if .DefSet }}\n\t\tDefs: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t{{- template \"evalDefSet\" .DefSet }}\n            return nil, nil\n\t\t},\n\t\t{{- end }}\n\t\tIf: `{{ .If.Expr }}`,\n\t\tIfCacheIndex: {{ $switch.CELCacheIndex }},\n\t\tBy: `{{ .By.Expr }}`,\n\t\tByCacheIndex: {{ $switch.CELCacheIndex }},\n\t})\n\t{{- end }}\n\treturn grpcfed.EvalSwitch[{{ .Type }}](ctx, value, cases, &grpcfed.EvalSwitchDefault[*localValueType]{\n\t\t{{- if $switch.Default.DefSet }}\n\t\tDefs: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t{{- template \"evalDefSet\" $switch.Default.DefSet }}\n\t\t\treturn nil, nil\n\t\t},\n\t\t{{- end }}\n\t\tBy: `{{ $switch.Default.By.Expr }}`,\n\t\tByCacheIndex: {{ $switch.CELCacheIndex }},\n\t})\n{{- end }}"
  },
  {
    "path": "generator/templates/validation.go.tmpl",
    "content": "{{- define \"messageValidation\" }}\n{{- $ctx := .Ctx }}\n{{- $error := .Error }}\nvar stat *grpcfed.Status\n{{- if $error.VariableDefinitionSet }}\nif _, err := func() (any, error) {\n\t{{- template \"evalDefSet\" $error.VariableDefinitionSet }}\n\treturn nil, nil\n}(); err != nil {\n\treturn err\n}\n{{- end }}\nif err := grpcfed.If({{ $ctx }}, &grpcfed.IfParam[*localValueType]{\n\tValue: value,\n\tExpr: `{{ $error.If.Expr }}`,\n\tCacheIndex: {{ $error.CELCacheIndex }},\n\tBody: func(value *localValueType) error {\n\t\t{{- if $error.Message }}\n\t\terrmsg, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\tValue: value,\n\t\t\tExpr: `{{ $error.Message.Expr }}`,\n\t\t\tOutType: reflect.TypeOf(\"\"),\n\t\t\tCacheIndex: {{ $error.CELCacheIndex }},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\terrorMessage := errmsg.(string)\n\t\t{{- else }}\n\t\terrorMessage := \"error\"\n\t\t{{- end }}\n\t\t{{- $details := $error.Details }}\n\t\t{{- if $details }}\n\t\tvar details       []grpcfed.ProtoMessage\n\t\t{{- range $details }}\n\t\t{{- if .VariableDefinitionSet }}\n\t\tif _, err := func() (any, error){\n\t\t\t{{- template \"evalDefSet\" .VariableDefinitionSet }}\n\t\t\treturn nil, nil\n\t\t}(); err != nil {\n\t\t\treturn err\n\t\t}\n\t\t{{- end }}\n\t\tif err := grpcfed.If({{ $ctx }}, &grpcfed.IfParam[*localValueType]{\n\t\t\tValue: value,\n\t\t\tExpr: `{{ .If.Expr }}`,\n\t\t\tCacheIndex: {{ $error.CELCacheIndex }},\n\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t{{- if .MessageSet }}\n\t\t\t\tif _, err := func() (any, error){\n\t\t\t\t\t{{- template \"evalDefSet\" .MessageSet }}\n\t\t\t\t\treturn nil, nil\n\t\t\t\t}(); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\t{{- range $idx, $def := .MessageSet.Definitions }}\n\t\t\t\tif detail := grpcfed.CustomMessage({{ $ctx }}, &grpcfed.CustomMessageParam{\n\t\t\t\t\tValue: value,\n\t\t\t\t\tMessageValueName: \"{{ $def.Name }}\",\n\t\t\t\t\tCacheIndex: {{ $error.CELCacheIndex }},\n\t\t\t\t\tMessageIndex: {{ $idx }},\n\t\t\t\t}); detail != nil {\n\t\t\t\t\tdetails = append(details, detail)\n\t\t\t\t}\n\t\t\t\t{{- end }}\n\t\t\t\t{{- end }}\n\n\t\t\t\t{{- range .By }}\n\t\t\t\t{\n\t\t\t\t\tdetail, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\t\t\tValue: value,\n\t\t\t\t\t\tExpr: `{{ .Expr }}`,\n\t\t\t\t\t\tOutType: reflect.TypeOf({{ .Type }}),\n\t\t\t\t\t\tCacheIndex: {{ $error.CELCacheIndex }},\n\t\t\t\t\t})\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgrpcfed.Logger(ctx).ErrorContext(ctx, \"failed setting error details\", slog.String(\"error\", err.Error()))\n\t\t\t\t\t}\n\t\t\t\t\tif detail != nil {\n\t\t\t\t\t\tdetails = append(details, detail.(grpcfed.ProtoMessage))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t{{- end }}\n\n\t\t\t\t{{- range .PreconditionFailures }}\n\t\t\t\t{{- template \"preconditionFailure\" . }}\n\t\t\t\t{{- end }}\n\t\t\t\t{{- range .BadRequests }}\n\t\t\t\t{{- template \"badRequest\" . }}\n\t\t\t\t{{- end }}\n\t\t\t\t{{- range .LocalizedMessages }}\n\t\t\t\t{{- template \"localizedMessage\" . }}\n\t\t\t\t{{- end }}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t}); err != nil {\n\t\t\treturn err\n\t\t}\n\t\t{{- end }}\n\t\t{{- end }}\n\t\t{{- if $details }}\n\t\tstatus := grpcfed.NewGRPCStatus(grpcfed.{{ .Error.GoGRPCStatusCode }}, errorMessage)\n\t\tstatusWithDetails, err := status.WithDetails(details...)\n\t\tif err != nil {\n\t\t\tgrpcfed.Logger({{ $ctx }}).ErrorContext({{ $ctx }}, \"failed setting error details\", slog.String(\"error\", err.Error()))\n\t\t\tstat = status\n\t\t} else {\n\t\t\tstat = statusWithDetails\n\t\t}\n\t\t{{- else }}\n\t\tstat = grpcfed.NewGRPCStatus(grpcfed.{{ .Error.GoGRPCStatusCode }}, errorMessage)\n\t\t{{- end }}\n\t\treturn nil\n\t},\n}); err != nil {\n\treturn err\n}\nreturn grpcfed.NewErrorWithLogAttrs(stat.Err(), {{ $error.LogLevelValue }}, grpcfed.LogAttrs({{ $ctx }}))\n{{- end }}\n"
  },
  {
    "path": "generator/testdata/expected_alias.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: alias.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n\n\tpost \"example/post\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Org_Federation_GetPostResponseVariable represents variable definitions in \"org.federation.GetPostResponse\".\ntype FederationService_Org_Federation_GetPostResponseVariable struct {\n\tPost *Post\n}\n\n// Org_Federation_GetPostResponseArgument is argument for \"org.federation.GetPostResponse\" message.\ntype FederationService_Org_Federation_GetPostResponseArgument struct {\n\tA  *GetPostRequest_ConditionA\n\tB  *GetPostRequest_ConditionB\n\tId string\n\tFederationService_Org_Federation_GetPostResponseVariable\n}\n\n// Org_Federation_PostVariable represents variable definitions in \"org.federation.Post\".\ntype FederationService_Org_Federation_PostVariable struct {\n\tPost *post.Post\n\tRes  *post.GetPostResponse\n}\n\n// Org_Federation_PostArgument is argument for \"org.federation.Post\" message.\ntype FederationService_Org_Federation_PostArgument struct {\n\tA  *GetPostRequest_ConditionA\n\tB  *GetPostRequest_ConditionB\n\tId string\n\tFederationService_Org_Federation_PostVariable\n}\n\n// FederationServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationServiceConfig struct {\n\t// Client provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\n\t// If this interface is not provided, an error is returned during initialization.\n\tClient FederationServiceClientFactory // required\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationServiceClientFactory interface {\n\t// Org_Post_PostServiceClient create a gRPC Client to be used to call methods in org.post.PostService.\n\tOrg_Post_PostServiceClient(FederationServiceClientConfig) (post.PostServiceClient, error)\n}\n\n// FederationServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationServiceDependentClientSet struct {\n\tOrg_Post_PostServiceClient post.PostServiceClient\n}\n\n// FederationServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationServiceResolver interface {\n}\n\n// FederationServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// FederationServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationServiceUnimplementedResolver struct{}\n\nconst (\n\tFederationService_DependentMethod_Org_Post_PostService_GetPost = \"/org.post.PostService/GetPost\"\n)\n\n// FederationService represents Federation Service.\ntype FederationService struct {\n\tUnimplementedFederationServiceServer\n\tcfg             FederationServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationServiceDependentClientSet\n}\n\n// NewFederationService creates FederationService instance by FederationServiceConfig.\nfunc NewFederationService(cfg FederationServiceConfig) (*FederationService, error) {\n\tif cfg.Client == nil {\n\t\treturn nil, grpcfed.ErrClientConfig\n\t}\n\tOrg_Post_PostServiceClient, err := cfg.Client.Org_Post_PostServiceClient(FederationServiceClientConfig{\n\t\tService: \"org.post.PostService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"org.federation.FederationService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.org.federation.GetPostResponseArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t\t\"a\":  grpcfed.NewCELFieldType(grpcfed.NewCELObjectType(\"org.federation.GetPostRequest.ConditionA\"), \"A\"),\n\t\t\t\"b\":  grpcfed.NewCELFieldType(grpcfed.NewCELObjectType(\"org.federation.GetPostRequest.ConditionB\"), \"B\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.PostArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t\t\"a\":  grpcfed.NewCELFieldType(grpcfed.NewCELObjectType(\"org.federation.GetPostRequest.ConditionA\"), \"A\"),\n\t\t\t\"b\":  grpcfed.NewCELFieldType(grpcfed.NewCELObjectType(\"org.federation.GetPostRequest.ConditionB\"), \"B\"),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"org.federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.GRPCErrorAccessorOptions(celTypeHelper, \"org.post.GetPostResponse\")...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.federation.PostContent.Category\", PostContent_Category_value, PostContent_Category_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.federation.PostType\", PostType_value, PostType_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.post.PostContent.Category\", post.PostContent_Category_value, post.PostContent_Category_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.post.PostDataType\", post.PostDataType_value, post.PostDataType_name)...)\n\tsvc := &FederationService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tclient: &FederationServiceDependentClientSet{\n\t\t\tOrg_Post_PostServiceClient: Org_Post_PostServiceClient,\n\t\t},\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationService(ctx context.Context, svc *FederationService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n// GetPost implements \"org.federation.FederationService/GetPost\" method.\nfunc (s *FederationService) GetPost(ctx context.Context, req *GetPostRequest) (res *GetPostResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.FederationService/GetPost\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Org_Federation_GetPostResponse(ctx, &FederationService_Org_Federation_GetPostResponseArgument{\n\t\tId: req.GetId(),\n\t\tA:  req.GetA(),\n\t\tB:  req.GetB(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Org_Federation_GetPostResponse resolve \"org.federation.GetPostResponse\" message.\nfunc (s *FederationService) resolve_Org_Federation_GetPostResponse(ctx context.Context, req *FederationService_Org_Federation_GetPostResponseArgument) (*GetPostResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.GetPostResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.GetPostResponse\", slog.Any(\"message_args\", s.logvalue_Org_Federation_GetPostResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tPost *Post\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.GetPostResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"post\"\n\t\t  message {\n\t\t    name: \"Post\"\n\t\t    args: [\n\t\t      { name: \"id\", by: \"$.id\" },\n\t\t      { name: \"a\", by: \"$.a\" },\n\t\t      { name: \"b\", by: \"$.b\" }\n\t\t    ]\n\t\t  }\n\t\t}\n\t*/\n\tdef_post := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Post, *localValueType]{\n\t\t\tName: `post`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.Post\"),\n\t\t\tSetter: func(value *localValueType, v *Post) error {\n\t\t\t\tvalue.vars.Post = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_PostArgument{}\n\t\t\t\t// { name: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 1,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { name: \"a\", by: \"$.a\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*GetPostRequest_ConditionA]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.a`,\n\t\t\t\t\tCacheIndex: 2,\n\t\t\t\t\tSetter: func(v *GetPostRequest_ConditionA) error {\n\t\t\t\t\t\targs.A = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { name: \"b\", by: \"$.b\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*GetPostRequest_ConditionB]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.b`,\n\t\t\t\t\tCacheIndex: 3,\n\t\t\t\t\tSetter: func(v *GetPostRequest_ConditionB) error {\n\t\t\t\t\t\targs.B = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_Post(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_post(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_GetPostResponseVariable.Post = value.vars.Post\n\n\t// create a message value to be returned.\n\tret := &GetPostResponse{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"post\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*Post]{\n\t\tValue:      value,\n\t\tExpr:       `post`,\n\t\tCacheIndex: 4,\n\t\tSetter: func(v *Post) error {\n\t\t\tret.Post = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.GetPostResponse\", slog.Any(\"org.federation.GetPostResponse\", s.logvalue_Org_Federation_GetPostResponse(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_Post resolve \"org.federation.Post\" message.\nfunc (s *FederationService) resolve_Org_Federation_Post(ctx context.Context, req *FederationService_Org_Federation_PostArgument) (*Post, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.Post\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.Post\", slog.Any(\"message_args\", s.logvalue_Org_Federation_PostArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tPost *post.Post\n\t\t\tRes  *post.GetPostResponse\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.PostArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"org.post.PostService/GetPost\"\n\t\t    request: [\n\t\t      { field: \"id\", by: \"$.id\" },\n\t\t      { field: \"a\", by: \"$.a\", if: \"$.a != null\" },\n\t\t      { field: \"b\", by: \"$.b\", if: \"$.b != null\" }\n\t\t    ]\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.GetPostResponse, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"org.post.GetPostResponse\"),\n\t\t\tSetter: func(value *localValueType, v *post.GetPostResponse) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &post.GetPostRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 5,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"a\", by: \"$.a\", if: \"$.a != null\" }\n\t\t\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.a != null`,\n\t\t\t\t\tCacheIndex: 6,\n\t\t\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t\t\treturn grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*GetPostRequest_ConditionA]{\n\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\tExpr:       `$.a`,\n\t\t\t\t\t\t\tCacheIndex: 7,\n\t\t\t\t\t\t\tSetter: func(v *GetPostRequest_ConditionA) error {\n\t\t\t\t\t\t\t\taValue, err := s.cast_Org_Federation_GetPostRequest_ConditionA__to__Org_Post_PostConditionA(v)\n\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\targs.Condition = &post.GetPostRequest_A{\n\t\t\t\t\t\t\t\t\tA: aValue,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"b\", by: \"$.b\", if: \"$.b != null\" }\n\t\t\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.b != null`,\n\t\t\t\t\tCacheIndex: 8,\n\t\t\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t\t\treturn grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*GetPostRequest_ConditionB]{\n\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\tExpr:       `$.b`,\n\t\t\t\t\t\t\tCacheIndex: 9,\n\t\t\t\t\t\t\tSetter: func(v *GetPostRequest_ConditionB) error {\n\t\t\t\t\t\t\t\tbValue, err := s.cast_Org_Federation_GetPostRequest_ConditionB__to__Org_Post_PostConditionB(v)\n\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\targs.Condition = &post.GetPostRequest_B{\n\t\t\t\t\t\t\t\t\tB: bValue,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call org.post.PostService/GetPost\", slog.Any(\"org.post.GetPostRequest\", s.logvalue_Org_Post_GetPostRequest(args)))\n\t\t\t\tret, err := s.client.Org_Post_PostServiceClient.GetPost(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Org_Post_PostService_GetPost, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"post\"\n\t\t  autobind: true\n\t\t  by: \"res.post\"\n\t\t}\n\t*/\n\tdef_post := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.Post, *localValueType]{\n\t\t\tName: `post`,\n\t\t\tType: grpcfed.CELObjectType(\"org.post.Post\"),\n\t\t\tSetter: func(value *localValueType, v *post.Post) error {\n\t\t\t\tvalue.vars.Post = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `res.post`,\n\t\t\tByCacheIndex: 10,\n\t\t})\n\t}\n\n\tif err := def_res(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\tif err := def_post(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_PostVariable.Post = value.vars.Post\n\treq.FederationService_Org_Federation_PostVariable.Res = value.vars.Res\n\n\t// create a message value to be returned.\n\tret := &Post{}\n\n\t// field binding section.\n\tret.Id = value.vars.Post.GetId() // { name: \"post\", autobind: true }\n\t{\n\t\tdataValue, err := s.cast_Org_Post_PostData__to__Org_Federation_PostData(value.vars.Post.GetData()) // { name: \"post\", autobind: true }\n\t\tif err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tret.Data = dataValue\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.Post\", slog.Any(\"org.federation.Post\", s.logvalue_Org_Federation_Post(ret)))\n\treturn ret, nil\n}\n\n// cast_Org_Federation_GetPostRequest_ConditionA__to__Org_Post_PostConditionA cast from \"org.federation.GetPostRequest.ConditionA\" to \"org.post.PostConditionA\".\nfunc (s *FederationService) cast_Org_Federation_GetPostRequest_ConditionA__to__Org_Post_PostConditionA(from *GetPostRequest_ConditionA) (*post.PostConditionA, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tpropValue := from.GetProp()\n\tret := &post.PostConditionA{\n\t\tProp: propValue,\n\t}\n\n\treturn ret, nil\n}\n\n// cast_Org_Federation_GetPostRequest_ConditionB__to__Org_Post_PostConditionB cast from \"org.federation.GetPostRequest.ConditionB\" to \"org.post.PostConditionB\".\nfunc (s *FederationService) cast_Org_Federation_GetPostRequest_ConditionB__to__Org_Post_PostConditionB(from *GetPostRequest_ConditionB) (*post.PostConditionB, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tret := &post.PostConditionB{}\n\n\treturn ret, nil\n}\n\n// cast_Org_Post_PostContent_Category__to__Org_Federation_PostContent_Category cast from \"org.post.PostContent.Category\" to \"org.federation.PostContent.Category\".\nfunc (s *FederationService) cast_Org_Post_PostContent_Category__to__Org_Federation_PostContent_Category(from post.PostContent_Category) (PostContent_Category, error) {\n\tvar ret PostContent_Category\n\tswitch from {\n\tcase post.PostContent_CATEGORY_A:\n\t\tret = PostContent_CATEGORY_A\n\tcase post.PostContent_CATEGORY_B:\n\t\tret = PostContent_CATEGORY_B\n\tdefault:\n\t\tret = 0\n\t}\n\treturn ret, nil\n}\n\n// cast_Org_Post_PostContent__to__Org_Federation_PostContent cast from \"org.post.PostContent\" to \"org.federation.PostContent\".\nfunc (s *FederationService) cast_Org_Post_PostContent__to__Org_Federation_PostContent(from *post.PostContent) (*PostContent, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tcategoryValue, err := s.cast_Org_Post_PostContent_Category__to__Org_Federation_PostContent_Category(from.GetCategory())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\theadValue := from.GetHead()\n\tbodyValue := from.GetBody()\n\tdupBodyValue := from.GetBody()\n\tcountsValue := from.GetCounts()\n\tcastCountsValue, err := s.cast_map_int64_int64__to__map_int32_int32(from.GetCastCounts())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret := &PostContent{\n\t\tCategory:   categoryValue,\n\t\tHead:       headValue,\n\t\tBody:       bodyValue,\n\t\tDupBody:    dupBodyValue,\n\t\tCounts:     countsValue,\n\t\tCastCounts: castCountsValue,\n\t}\n\n\treturn ret, nil\n}\n\n// cast_Org_Post_PostDataType__to__Org_Federation_PostType cast from \"org.post.PostDataType\" to \"org.federation.PostType\".\nfunc (s *FederationService) cast_Org_Post_PostDataType__to__Org_Federation_PostType(from post.PostDataType) (PostType, error) {\n\tvar ret PostType\n\tswitch from {\n\tcase post.PostDataType_POST_TYPE_A:\n\t\tret = PostType_POST_TYPE_FOO\n\tcase post.PostDataType_POST_TYPE_B:\n\t\tret = PostType_POST_TYPE_BAR\n\tcase post.PostDataType_POST_TYPE_C:\n\t\tret = PostType_POST_TYPE_BAR\n\tdefault:\n\t\tret = PostType_POST_TYPE_UNKNOWN\n\t}\n\treturn ret, nil\n}\n\n// cast_Org_Post_PostData__to__Org_Federation_PostData cast from \"org.post.PostData\" to \"org.federation.PostData\".\nfunc (s *FederationService) cast_Org_Post_PostData__to__Org_Federation_PostData(from *post.PostData) (*PostData, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\ttypeValue, err := s.cast_Org_Post_PostDataType__to__Org_Federation_PostType(from.GetType())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\ttitleValue := from.GetTitle()\n\tcontentValue, err := s.cast_Org_Post_PostContent__to__Org_Federation_PostContent(from.GetContent())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret := &PostData{\n\t\tType:    typeValue,\n\t\tTitle:   titleValue,\n\t\tContent: contentValue,\n\t}\n\n\treturn ret, nil\n}\n\n// cast_int64__to__int32 cast from \"int64\" to \"int32\".\nfunc (s *FederationService) cast_int64__to__int32(from int64) (int32, error) {\n\tret, err := grpcfed.Int64ToInt32(from)\n\tif err != nil {\n\t\treturn ret, err\n\t}\n\treturn ret, nil\n}\n\n// cast_map_int64_int64__to__map_int32_int32 cast from \"map<int64, int64>\" to \"map<int32, int32>\".\nfunc (s *FederationService) cast_map_int64_int64__to__map_int32_int32(from map[int64]int64) (map[int32]int32, error) {\n\tret := map[int32]int32{}\n\tfor k, v := range from {\n\t\tkey, err := s.cast_int64__to__int32(k)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tval, err := s.cast_int64__to__int32(v)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret[key] = val\n\t}\n\treturn ret, nil\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostRequest_ConditionA(v *GetPostRequest_ConditionA) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"prop\", v.GetProp()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostRequest_ConditionB(v *GetPostRequest_ConditionB) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostResponse(v *GetPostResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"post\", s.logvalue_Org_Federation_Post(v.GetPost())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostResponseArgument(v *FederationService_Org_Federation_GetPostResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t\tslog.Any(\"a\", s.logvalue_Org_Federation_GetPostRequest_ConditionA(v.A)),\n\t\tslog.Any(\"b\", s.logvalue_Org_Federation_GetPostRequest_ConditionB(v.B)),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_Post(v *Post) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.Any(\"data\", s.logvalue_Org_Federation_PostData(v.GetData())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_PostArgument(v *FederationService_Org_Federation_PostArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t\tslog.Any(\"a\", s.logvalue_Org_Federation_GetPostRequest_ConditionA(v.A)),\n\t\tslog.Any(\"b\", s.logvalue_Org_Federation_GetPostRequest_ConditionB(v.B)),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_PostContent(v *PostContent) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"category\", s.logvalue_Org_Federation_PostContent_Category(v.GetCategory()).String()),\n\t\tslog.String(\"head\", v.GetHead()),\n\t\tslog.String(\"body\", v.GetBody()),\n\t\tslog.String(\"dup_body\", v.GetDupBody()),\n\t\tslog.Any(\"counts\", s.logvalue_Org_Federation_PostContent_CountsEntry(v.GetCounts())),\n\t\tslog.Any(\"cast_counts\", s.logvalue_Org_Federation_PostContent_CastCountsEntry(v.GetCastCounts())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_PostContent_CastCountsEntry(v map[int32]int32) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tattrs := make([]slog.Attr, 0, len(v))\n\tfor key, value := range v {\n\t\tattrs = append(attrs, slog.Attr{\n\t\t\tKey:   grpcfed.ToLogAttrKey(key),\n\t\t\tValue: slog.AnyValue(value),\n\t\t})\n\t}\n\treturn slog.GroupValue(attrs...)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_PostContent_Category(v PostContent_Category) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tswitch v {\n\tcase PostContent_CATEGORY_A:\n\t\treturn slog.StringValue(\"CATEGORY_A\")\n\tcase PostContent_CATEGORY_B:\n\t\treturn slog.StringValue(\"CATEGORY_B\")\n\tcase PostContent_CATEGORY_C:\n\t\treturn slog.StringValue(\"CATEGORY_C\")\n\t}\n\treturn slog.StringValue(\"\")\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_PostContent_CountsEntry(v map[int32]int32) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tattrs := make([]slog.Attr, 0, len(v))\n\tfor key, value := range v {\n\t\tattrs = append(attrs, slog.Attr{\n\t\t\tKey:   grpcfed.ToLogAttrKey(key),\n\t\t\tValue: slog.AnyValue(value),\n\t\t})\n\t}\n\treturn slog.GroupValue(attrs...)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_PostData(v *PostData) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"type\", s.logvalue_Org_Federation_PostType(v.GetType()).String()),\n\t\tslog.String(\"title\", v.GetTitle()),\n\t\tslog.Any(\"content\", s.logvalue_Org_Federation_PostContent(v.GetContent())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_PostType(v PostType) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tswitch v {\n\tcase PostType_POST_TYPE_UNKNOWN:\n\t\treturn slog.StringValue(\"POST_TYPE_UNKNOWN\")\n\tcase PostType_POST_TYPE_FOO:\n\t\treturn slog.StringValue(\"POST_TYPE_FOO\")\n\tcase PostType_POST_TYPE_BAR:\n\t\treturn slog.StringValue(\"POST_TYPE_BAR\")\n\tcase PostType_POST_TYPE_BAZ:\n\t\treturn slog.StringValue(\"POST_TYPE_BAZ\")\n\t}\n\treturn slog.StringValue(\"\")\n}\n\nfunc (s *FederationService) logvalue_Org_Post_GetPostRequest(v *post.GetPostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.Any(\"a\", s.logvalue_Org_Post_PostConditionA(v.GetA())),\n\t\tslog.Any(\"b\", s.logvalue_Org_Post_PostConditionB(v.GetB())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_PostConditionA(v *post.PostConditionA) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"prop\", v.GetProp()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_PostConditionB(v *post.PostConditionB) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n"
  },
  {
    "path": "generator/testdata/expected_alias_multifile.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: alias_multifile.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n\n\tpost \"example/post\"\n\tpost1 \"example/post/v2\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Org_Federation_GetPostResponseVariable represents variable definitions in \"org.federation.GetPostResponse\".\ntype FederationService_Org_Federation_GetPostResponseVariable struct {\n\tPost *Post\n}\n\n// Org_Federation_GetPostResponseArgument is argument for \"org.federation.GetPostResponse\" message.\ntype FederationService_Org_Federation_GetPostResponseArgument struct {\n\tId string\n\tFederationService_Org_Federation_GetPostResponseVariable\n}\n\n// Org_Federation_PostVariable represents variable definitions in \"org.federation.Post\".\ntype FederationService_Org_Federation_PostVariable struct {\n\tPost   *post.Post\n\tRes    *post.GetPostResponse\n\tRes2   *post1.GetPostResponse\n\tV2Data *post1.PostData\n\tV2Post *post1.Post\n}\n\n// Org_Federation_PostArgument is argument for \"org.federation.Post\" message.\ntype FederationService_Org_Federation_PostArgument struct {\n\tId string\n\tFederationService_Org_Federation_PostVariable\n}\n\n// FederationServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationServiceConfig struct {\n\t// Client provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\n\t// If this interface is not provided, an error is returned during initialization.\n\tClient FederationServiceClientFactory // required\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationServiceClientFactory interface {\n\t// Org_Post_PostServiceClient create a gRPC Client to be used to call methods in org.post.PostService.\n\tOrg_Post_PostServiceClient(FederationServiceClientConfig) (post.PostServiceClient, error)\n\t// Org_Post_V2_PostServiceClient create a gRPC Client to be used to call methods in org.post.v2.PostService.\n\tOrg_Post_V2_PostServiceClient(FederationServiceClientConfig) (post1.PostServiceClient, error)\n}\n\n// FederationServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationServiceDependentClientSet struct {\n\tOrg_Post_PostServiceClient    post.PostServiceClient\n\tOrg_Post_V2_PostServiceClient post1.PostServiceClient\n}\n\n// FederationServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationServiceResolver interface {\n}\n\n// FederationServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// FederationServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationServiceUnimplementedResolver struct{}\n\nconst (\n\tFederationService_DependentMethod_Org_Post_PostService_GetPost    = \"/org.post.PostService/GetPost\"\n\tFederationService_DependentMethod_Org_Post_V2_PostService_GetPost = \"/org.post.v2.PostService/GetPost\"\n)\n\n// FederationService represents Federation Service.\ntype FederationService struct {\n\tUnimplementedFederationServiceServer\n\tcfg             FederationServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationServiceDependentClientSet\n}\n\n// NewFederationService creates FederationService instance by FederationServiceConfig.\nfunc NewFederationService(cfg FederationServiceConfig) (*FederationService, error) {\n\tif cfg.Client == nil {\n\t\treturn nil, grpcfed.ErrClientConfig\n\t}\n\tOrg_Post_PostServiceClient, err := cfg.Client.Org_Post_PostServiceClient(FederationServiceClientConfig{\n\t\tService: \"org.post.PostService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tOrg_Post_V2_PostServiceClient, err := cfg.Client.Org_Post_V2_PostServiceClient(FederationServiceClientConfig{\n\t\tService: \"org.post.v2.PostService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"org.federation.FederationService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.org.federation.GetPostResponseArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.PostArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"org.federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.GRPCErrorAccessorOptions(celTypeHelper, \"org.post.GetPostResponse\")...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.GRPCErrorAccessorOptions(celTypeHelper, \"org.post.v2.GetPostResponse\")...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.federation.ExtraKind\", ExtraKind_value, ExtraKind_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.federation.PostContent.Category\", PostContent_Category_value, PostContent_Category_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.federation.PostType\", PostType_value, PostType_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.post.PostContent.Category\", post.PostContent_Category_value, post.PostContent_Category_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.post.PostDataType\", post.PostDataType_value, post.PostDataType_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.post.v2.ExtraType\", post1.ExtraType_value, post1.ExtraType_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.post.v2.PostContent.Category\", post1.PostContent_Category_value, post1.PostContent_Category_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.post.v2.PostDataType\", post1.PostDataType_value, post1.PostDataType_name)...)\n\tsvc := &FederationService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tclient: &FederationServiceDependentClientSet{\n\t\t\tOrg_Post_PostServiceClient:    Org_Post_PostServiceClient,\n\t\t\tOrg_Post_V2_PostServiceClient: Org_Post_V2_PostServiceClient,\n\t\t},\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationService(ctx context.Context, svc *FederationService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n// GetPost implements \"org.federation.FederationService/GetPost\" method.\nfunc (s *FederationService) GetPost(ctx context.Context, req *GetPostRequest) (res *GetPostResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.FederationService/GetPost\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Org_Federation_GetPostResponse(ctx, &FederationService_Org_Federation_GetPostResponseArgument{\n\t\tId: req.GetId(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Org_Federation_GetPostResponse resolve \"org.federation.GetPostResponse\" message.\nfunc (s *FederationService) resolve_Org_Federation_GetPostResponse(ctx context.Context, req *FederationService_Org_Federation_GetPostResponseArgument) (*GetPostResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.GetPostResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.GetPostResponse\", slog.Any(\"message_args\", s.logvalue_Org_Federation_GetPostResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tPost *Post\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.GetPostResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"post\"\n\t\t  message {\n\t\t    name: \"Post\"\n\t\t    args { name: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_post := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Post, *localValueType]{\n\t\t\tName: `post`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.Post\"),\n\t\t\tSetter: func(value *localValueType, v *Post) error {\n\t\t\t\tvalue.vars.Post = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_PostArgument{}\n\t\t\t\t// { name: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 1,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_Post(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_post(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_GetPostResponseVariable.Post = value.vars.Post\n\n\t// create a message value to be returned.\n\tret := &GetPostResponse{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"post\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*Post]{\n\t\tValue:      value,\n\t\tExpr:       `post`,\n\t\tCacheIndex: 2,\n\t\tSetter: func(v *Post) error {\n\t\t\tret.Post = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.GetPostResponse\", slog.Any(\"org.federation.GetPostResponse\", s.logvalue_Org_Federation_GetPostResponse(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_Post resolve \"org.federation.Post\" message.\nfunc (s *FederationService) resolve_Org_Federation_Post(ctx context.Context, req *FederationService_Org_Federation_PostArgument) (*Post, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.Post\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.Post\", slog.Any(\"message_args\", s.logvalue_Org_Federation_PostArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tPost   *post.Post\n\t\t\tRes    *post.GetPostResponse\n\t\t\tRes2   *post1.GetPostResponse\n\t\t\tV2Data *post1.PostData\n\t\t\tV2Post *post1.Post\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.PostArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"org.post.PostService/GetPost\"\n\t\t    request { field: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.GetPostResponse, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"org.post.GetPostResponse\"),\n\t\t\tSetter: func(value *localValueType, v *post.GetPostResponse) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &post.GetPostRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 3,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call org.post.PostService/GetPost\", slog.Any(\"org.post.GetPostRequest\", s.logvalue_Org_Post_GetPostRequest(args)))\n\t\t\t\tret, err := s.client.Org_Post_PostServiceClient.GetPost(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Org_Post_PostService_GetPost, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"post\"\n\t\t  autobind: true\n\t\t  by: \"res.post\"\n\t\t}\n\t*/\n\tdef_post := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.Post, *localValueType]{\n\t\t\tName: `post`,\n\t\t\tType: grpcfed.CELObjectType(\"org.post.Post\"),\n\t\t\tSetter: func(value *localValueType, v *post.Post) error {\n\t\t\t\tvalue.vars.Post = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `res.post`,\n\t\t\tByCacheIndex: 4,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"res2\"\n\t\t  call {\n\t\t    method: \"org.post.v2.PostService/GetPost\"\n\t\t    request { field: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res2 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post1.GetPostResponse, *localValueType]{\n\t\t\tName: `res2`,\n\t\t\tType: grpcfed.CELObjectType(\"org.post.v2.GetPostResponse\"),\n\t\t\tSetter: func(value *localValueType, v *post1.GetPostResponse) error {\n\t\t\t\tvalue.vars.Res2 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &post1.GetPostRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 5,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call org.post.v2.PostService/GetPost\", slog.Any(\"org.post.v2.GetPostRequest\", s.logvalue_Org_Post_V2_GetPostRequest(args)))\n\t\t\t\tret, err := s.client.Org_Post_V2_PostServiceClient.GetPost(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Org_Post_V2_PostService_GetPost, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"v2post\"\n\t\t  by: \"res2.post\"\n\t\t}\n\t*/\n\tdef_v2post := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post1.Post, *localValueType]{\n\t\t\tName: `v2post`,\n\t\t\tType: grpcfed.CELObjectType(\"org.post.v2.Post\"),\n\t\t\tSetter: func(value *localValueType, v *post1.Post) error {\n\t\t\t\tvalue.vars.V2Post = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `res2.post`,\n\t\t\tByCacheIndex: 6,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"v2data\"\n\t\t  by: \"v2post.data\"\n\t\t}\n\t*/\n\tdef_v2data := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post1.PostData, *localValueType]{\n\t\t\tName: `v2data`,\n\t\t\tType: grpcfed.CELObjectType(\"org.post.v2.PostData\"),\n\t\t\tSetter: func(value *localValueType, v *post1.PostData) error {\n\t\t\t\tvalue.vars.V2Data = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `v2post.data`,\n\t\t\tByCacheIndex: 7,\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t            res ─┐\n\t                   post ─┐\n\t   res2 ─┐               │\n\t         v2post ─┐       │\n\t                 v2data ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_post(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res2(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_v2post(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_v2data(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_PostVariable.Post = value.vars.Post\n\treq.FederationService_Org_Federation_PostVariable.Res = value.vars.Res\n\treq.FederationService_Org_Federation_PostVariable.Res2 = value.vars.Res2\n\treq.FederationService_Org_Federation_PostVariable.V2Data = value.vars.V2Data\n\treq.FederationService_Org_Federation_PostVariable.V2Post = value.vars.V2Post\n\n\t// create a message value to be returned.\n\tret := &Post{}\n\n\t// field binding section.\n\tret.Id = value.vars.Post.GetId() // { name: \"post\", autobind: true }\n\t{\n\t\tdataValue, err := s.cast_Org_Post_PostData__to__Org_Federation_PostData(value.vars.Post.GetData()) // { name: \"post\", autobind: true }\n\t\tif err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tret.Data = dataValue\n\t}\n\t// (grpc.federation.field).by = \"v2data\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*post1.PostData]{\n\t\tValue:      value,\n\t\tExpr:       `v2data`,\n\t\tCacheIndex: 8,\n\t\tSetter: func(v *post1.PostData) error {\n\t\t\tv2DataValue, err := s.cast_Org_Post_V2_PostData__to__Org_Federation_PostData(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.V2Data = v2DataValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.Post\", slog.Any(\"org.federation.Post\", s.logvalue_Org_Federation_Post(ret)))\n\treturn ret, nil\n}\n\n// cast_Org_Post_PostContent_Category__to__Org_Federation_PostContent_Category cast from \"org.post.PostContent.Category\" to \"org.federation.PostContent.Category\".\nfunc (s *FederationService) cast_Org_Post_PostContent_Category__to__Org_Federation_PostContent_Category(from post.PostContent_Category) (PostContent_Category, error) {\n\tvar ret PostContent_Category\n\tswitch from {\n\tcase post.PostContent_CATEGORY_A:\n\t\tret = PostContent_CATEGORY_A\n\tcase post.PostContent_CATEGORY_B:\n\t\tret = PostContent_CATEGORY_B\n\tdefault:\n\t\tret = 0\n\t}\n\treturn ret, nil\n}\n\n// cast_Org_Post_PostContent__to__Org_Federation_PostContent cast from \"org.post.PostContent\" to \"org.federation.PostContent\".\nfunc (s *FederationService) cast_Org_Post_PostContent__to__Org_Federation_PostContent(from *post.PostContent) (*PostContent, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tcategoryValue, err := s.cast_Org_Post_PostContent_Category__to__Org_Federation_PostContent_Category(from.GetCategory())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\theadValue := from.GetHead()\n\tbodyValue := from.GetBody()\n\tret := &PostContent{\n\t\tCategory: categoryValue,\n\t\tHead:     headValue,\n\t\tBody:     bodyValue,\n\t}\n\n\treturn ret, nil\n}\n\n// cast_Org_Post_PostDataType__to__Org_Federation_PostType cast from \"org.post.PostDataType\" to \"org.federation.PostType\".\nfunc (s *FederationService) cast_Org_Post_PostDataType__to__Org_Federation_PostType(from post.PostDataType) (PostType, error) {\n\tvar ret PostType\n\tswitch from {\n\tcase post.PostDataType_POST_TYPE_A:\n\t\tret = PostType_POST_TYPE_FOO\n\tcase post.PostDataType_POST_TYPE_B:\n\t\tret = PostType_POST_TYPE_BAR\n\tcase post.PostDataType_POST_TYPE_C:\n\t\tret = PostType_POST_TYPE_BAR\n\tdefault:\n\t\tret = PostType_POST_TYPE_UNKNOWN\n\t}\n\treturn ret, nil\n}\n\n// cast_Org_Post_PostData__to__Org_Federation_PostData cast from \"org.post.PostData\" to \"org.federation.PostData\".\nfunc (s *FederationService) cast_Org_Post_PostData__to__Org_Federation_PostData(from *post.PostData) (*PostData, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\ttypeValue, err := s.cast_Org_Post_PostDataType__to__Org_Federation_PostType(from.GetType())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\ttitleValue := from.GetTitle()\n\tcontentValue, err := s.cast_Org_Post_PostContent__to__Org_Federation_PostContent(from.GetContent())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret := &PostData{\n\t\tType:    typeValue,\n\t\tTitle:   titleValue,\n\t\tContent: contentValue,\n\t}\n\n\treturn ret, nil\n}\n\n// cast_Org_Post_V2_PostContent_Category__to__Org_Federation_PostContent_Category cast from \"org.post.v2.PostContent.Category\" to \"org.federation.PostContent.Category\".\nfunc (s *FederationService) cast_Org_Post_V2_PostContent_Category__to__Org_Federation_PostContent_Category(from post1.PostContent_Category) (PostContent_Category, error) {\n\tvar ret PostContent_Category\n\tswitch from {\n\tcase post1.PostContent_CATEGORY_A:\n\t\tret = PostContent_CATEGORY_A\n\tcase post1.PostContent_CATEGORY_B:\n\t\tret = PostContent_CATEGORY_B\n\tdefault:\n\t\tret = 0\n\t}\n\treturn ret, nil\n}\n\n// cast_Org_Post_V2_PostContent__to__Org_Federation_PostContent cast from \"org.post.v2.PostContent\" to \"org.federation.PostContent\".\nfunc (s *FederationService) cast_Org_Post_V2_PostContent__to__Org_Federation_PostContent(from *post1.PostContent) (*PostContent, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tcategoryValue, err := s.cast_Org_Post_V2_PostContent_Category__to__Org_Federation_PostContent_Category(from.GetCategory())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\theadValue := from.GetHead()\n\tbodyValue := from.GetBody()\n\tret := &PostContent{\n\t\tCategory: categoryValue,\n\t\tHead:     headValue,\n\t\tBody:     bodyValue,\n\t}\n\n\treturn ret, nil\n}\n\n// cast_Org_Post_V2_PostDataType__to__Org_Federation_PostType cast from \"org.post.v2.PostDataType\" to \"org.federation.PostType\".\nfunc (s *FederationService) cast_Org_Post_V2_PostDataType__to__Org_Federation_PostType(from post1.PostDataType) (PostType, error) {\n\tvar ret PostType\n\tswitch from {\n\tcase post1.PostDataType_POST_TYPE_A:\n\t\tret = PostType_POST_TYPE_FOO\n\tcase post1.PostDataType_POST_V2_TYPE_B:\n\t\tret = PostType_POST_TYPE_BAR\n\tcase post1.PostDataType_POST_V2_TYPE_C:\n\t\tret = PostType_POST_TYPE_BAR\n\tdefault:\n\t\tret = PostType_POST_TYPE_UNKNOWN\n\t}\n\treturn ret, nil\n}\n\n// cast_Org_Post_V2_PostData__to__Org_Federation_PostData cast from \"org.post.v2.PostData\" to \"org.federation.PostData\".\nfunc (s *FederationService) cast_Org_Post_V2_PostData__to__Org_Federation_PostData(from *post1.PostData) (*PostData, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\ttypeValue, err := s.cast_Org_Post_V2_PostDataType__to__Org_Federation_PostType(from.GetType())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\ttitleValue := from.GetTitle()\n\tcontentValue, err := s.cast_Org_Post_V2_PostContent__to__Org_Federation_PostContent(from.GetContent())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret := &PostData{\n\t\tType:    typeValue,\n\t\tTitle:   titleValue,\n\t\tContent: contentValue,\n\t}\n\n\treturn ret, nil\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostResponse(v *GetPostResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"post\", s.logvalue_Org_Federation_Post(v.GetPost())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostResponseArgument(v *FederationService_Org_Federation_GetPostResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_Post(v *Post) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.Any(\"data\", s.logvalue_Org_Federation_PostData(v.GetData())),\n\t\tslog.Any(\"v2data\", s.logvalue_Org_Federation_PostData(v.GetV2Data())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_PostArgument(v *FederationService_Org_Federation_PostArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_PostContent(v *PostContent) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"category\", s.logvalue_Org_Federation_PostContent_Category(v.GetCategory()).String()),\n\t\tslog.String(\"head\", v.GetHead()),\n\t\tslog.String(\"body\", v.GetBody()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_PostContent_Category(v PostContent_Category) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tswitch v {\n\tcase PostContent_CATEGORY_A:\n\t\treturn slog.StringValue(\"CATEGORY_A\")\n\tcase PostContent_CATEGORY_B:\n\t\treturn slog.StringValue(\"CATEGORY_B\")\n\t}\n\treturn slog.StringValue(\"\")\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_PostData(v *PostData) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"type\", s.logvalue_Org_Federation_PostType(v.GetType()).String()),\n\t\tslog.String(\"title\", v.GetTitle()),\n\t\tslog.Any(\"content\", s.logvalue_Org_Federation_PostContent(v.GetContent())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_PostType(v PostType) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tswitch v {\n\tcase PostType_POST_TYPE_UNKNOWN:\n\t\treturn slog.StringValue(\"POST_TYPE_UNKNOWN\")\n\tcase PostType_POST_TYPE_FOO:\n\t\treturn slog.StringValue(\"POST_TYPE_FOO\")\n\tcase PostType_POST_TYPE_BAR:\n\t\treturn slog.StringValue(\"POST_TYPE_BAR\")\n\t}\n\treturn slog.StringValue(\"\")\n}\n\nfunc (s *FederationService) logvalue_Org_Post_GetPostRequest(v *post.GetPostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.Any(\"a\", s.logvalue_Org_Post_PostConditionA(v.GetA())),\n\t\tslog.Any(\"b\", s.logvalue_Org_Post_PostConditionB(v.GetB())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_PostConditionA(v *post.PostConditionA) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"prop\", v.GetProp()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_PostConditionB(v *post.PostConditionB) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Post_V2_GetPostRequest(v *post1.GetPostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t)\n}\n"
  },
  {
    "path": "generator/testdata/expected_async.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: async.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Org_Federation_AAVariable represents variable definitions in \"org.federation.AA\".\ntype FederationService_Org_Federation_AAVariable struct {\n}\n\n// Org_Federation_AAArgument is argument for \"org.federation.AA\" message.\ntype FederationService_Org_Federation_AAArgument struct {\n\tFederationService_Org_Federation_AAVariable\n}\n\n// Org_Federation_AVariable represents variable definitions in \"org.federation.A\".\ntype FederationService_Org_Federation_AVariable struct {\n}\n\n// Org_Federation_AArgument is argument for \"org.federation.A\" message.\ntype FederationService_Org_Federation_AArgument struct {\n\tFederationService_Org_Federation_AVariable\n}\n\n// Org_Federation_ABVariable represents variable definitions in \"org.federation.AB\".\ntype FederationService_Org_Federation_ABVariable struct {\n}\n\n// Org_Federation_ABArgument is argument for \"org.federation.AB\" message.\ntype FederationService_Org_Federation_ABArgument struct {\n\tFederationService_Org_Federation_ABVariable\n}\n\n// Org_Federation_BVariable represents variable definitions in \"org.federation.B\".\ntype FederationService_Org_Federation_BVariable struct {\n}\n\n// Org_Federation_BArgument is argument for \"org.federation.B\" message.\ntype FederationService_Org_Federation_BArgument struct {\n\tFederationService_Org_Federation_BVariable\n}\n\n// Org_Federation_CVariable represents variable definitions in \"org.federation.C\".\ntype FederationService_Org_Federation_CVariable struct {\n}\n\n// Org_Federation_CArgument is argument for \"org.federation.C\" message.\ntype FederationService_Org_Federation_CArgument struct {\n\tA string\n\tFederationService_Org_Federation_CVariable\n}\n\n// Org_Federation_DVariable represents variable definitions in \"org.federation.D\".\ntype FederationService_Org_Federation_DVariable struct {\n}\n\n// Org_Federation_DArgument is argument for \"org.federation.D\" message.\ntype FederationService_Org_Federation_DArgument struct {\n\tB string\n\tFederationService_Org_Federation_DVariable\n}\n\n// Org_Federation_EVariable represents variable definitions in \"org.federation.E\".\ntype FederationService_Org_Federation_EVariable struct {\n}\n\n// Org_Federation_EArgument is argument for \"org.federation.E\" message.\ntype FederationService_Org_Federation_EArgument struct {\n\tC string\n\tD string\n\tFederationService_Org_Federation_EVariable\n}\n\n// Org_Federation_FVariable represents variable definitions in \"org.federation.F\".\ntype FederationService_Org_Federation_FVariable struct {\n}\n\n// Org_Federation_FArgument is argument for \"org.federation.F\" message.\ntype FederationService_Org_Federation_FArgument struct {\n\tC string\n\tD string\n\tFederationService_Org_Federation_FVariable\n}\n\n// Org_Federation_GVariable represents variable definitions in \"org.federation.G\".\ntype FederationService_Org_Federation_GVariable struct {\n}\n\n// Org_Federation_GArgument is argument for \"org.federation.G\" message.\ntype FederationService_Org_Federation_GArgument struct {\n\tFederationService_Org_Federation_GVariable\n}\n\n// Org_Federation_GetResponseVariable represents variable definitions in \"org.federation.GetResponse\".\ntype FederationService_Org_Federation_GetResponseVariable struct {\n\tA *A\n\tB *B\n\tC *C\n\tD *D\n\tE *E\n\tF *F\n\tG *G\n\tH *H\n\tI *I\n\tJ *J\n}\n\n// Org_Federation_GetResponseArgument is argument for \"org.federation.GetResponse\" message.\ntype FederationService_Org_Federation_GetResponseArgument struct {\n\tFederationService_Org_Federation_GetResponseVariable\n}\n\n// Org_Federation_HVariable represents variable definitions in \"org.federation.H\".\ntype FederationService_Org_Federation_HVariable struct {\n}\n\n// Org_Federation_HArgument is argument for \"org.federation.H\" message.\ntype FederationService_Org_Federation_HArgument struct {\n\tE string\n\tF string\n\tG string\n\tFederationService_Org_Federation_HVariable\n}\n\n// Org_Federation_IVariable represents variable definitions in \"org.federation.I\".\ntype FederationService_Org_Federation_IVariable struct {\n}\n\n// Org_Federation_IArgument is argument for \"org.federation.I\" message.\ntype FederationService_Org_Federation_IArgument struct {\n\tFederationService_Org_Federation_IVariable\n}\n\n// Org_Federation_JVariable represents variable definitions in \"org.federation.J\".\ntype FederationService_Org_Federation_JVariable struct {\n}\n\n// Org_Federation_JArgument is argument for \"org.federation.J\" message.\ntype FederationService_Org_Federation_JArgument struct {\n\tI string\n\tFederationService_Org_Federation_JVariable\n}\n\n// FederationServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationServiceConfig struct {\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationServiceClientFactory interface {\n}\n\n// FederationServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationServiceDependentClientSet struct {\n}\n\n// FederationServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationServiceResolver interface {\n}\n\n// FederationServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// FederationServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationServiceUnimplementedResolver struct{}\n\n// FederationService represents Federation Service.\ntype FederationService struct {\n\tUnimplementedFederationServiceServer\n\tcfg             FederationServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationServiceDependentClientSet\n}\n\n// NewFederationService creates FederationService instance by FederationServiceConfig.\nfunc NewFederationService(cfg FederationServiceConfig) (*FederationService, error) {\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"org.federation.FederationService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.org.federation.AAArgument\": {},\n\t\t\"grpc.federation.private.org.federation.AArgument\":  {},\n\t\t\"grpc.federation.private.org.federation.ABArgument\": {},\n\t\t\"grpc.federation.private.org.federation.BArgument\":  {},\n\t\t\"grpc.federation.private.org.federation.CArgument\": {\n\t\t\t\"a\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"A\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.DArgument\": {\n\t\t\t\"b\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"B\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.EArgument\": {\n\t\t\t\"c\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"C\"),\n\t\t\t\"d\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"D\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.FArgument\": {\n\t\t\t\"c\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"C\"),\n\t\t\t\"d\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"D\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.GArgument\":           {},\n\t\t\"grpc.federation.private.org.federation.GetResponseArgument\": {},\n\t\t\"grpc.federation.private.org.federation.HArgument\": {\n\t\t\t\"e\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"E\"),\n\t\t\t\"f\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"F\"),\n\t\t\t\"g\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"G\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.IArgument\": {},\n\t\t\"grpc.federation.private.org.federation.JArgument\": {\n\t\t\t\"i\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"I\"),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"org.federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tsvc := &FederationService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tclient:          &FederationServiceDependentClientSet{},\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationService(ctx context.Context, svc *FederationService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n// Get implements \"org.federation.FederationService/Get\" method.\nfunc (s *FederationService) Get(ctx context.Context, req *GetRequest) (res *GetResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.FederationService/Get\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Org_Federation_GetResponse(ctx, &FederationService_Org_Federation_GetResponseArgument{})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Org_Federation_A resolve \"org.federation.A\" message.\nfunc (s *FederationService) resolve_Org_Federation_A(ctx context.Context, req *FederationService_Org_Federation_AArgument) (*A, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.A\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.A\", slog.Any(\"message_args\", s.logvalue_Org_Federation_AArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tAa *AA\n\t\t\tAb *AB\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.AArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"aa\"\n\t\t  message {\n\t\t    name: \"AA\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_aa := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*AA, *localValueType]{\n\t\t\tName: `aa`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.AA\"),\n\t\t\tSetter: func(value *localValueType, v *AA) error {\n\t\t\t\tvalue.vars.Aa = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_AAArgument{}\n\t\t\t\tret, err := s.resolve_Org_Federation_AA(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"ab\"\n\t\t  message {\n\t\t    name: \"AB\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_ab := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*AB, *localValueType]{\n\t\t\tName: `ab`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.AB\"),\n\t\t\tSetter: func(value *localValueType, v *AB) error {\n\t\t\t\tvalue.vars.Ab = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_ABArgument{}\n\t\t\t\tret, err := s.resolve_Org_Federation_AB(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t   aa ─┐\n\t   ab ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_aa(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_ab(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// create a message value to be returned.\n\tret := &A{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'a'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'a'`,\n\t\tCacheIndex: 1,\n\t\tSetter: func(v string) error {\n\t\t\tret.Name = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.A\", slog.Any(\"org.federation.A\", s.logvalue_Org_Federation_A(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_AA resolve \"org.federation.AA\" message.\nfunc (s *FederationService) resolve_Org_Federation_AA(ctx context.Context, req *FederationService_Org_Federation_AAArgument) (*AA, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.AA\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.AA\", slog.Any(\"message_args\", s.logvalue_Org_Federation_AAArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.AAArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &AA{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'aa'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'aa'`,\n\t\tCacheIndex: 2,\n\t\tSetter: func(v string) error {\n\t\t\tret.Name = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.AA\", slog.Any(\"org.federation.AA\", s.logvalue_Org_Federation_AA(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_AB resolve \"org.federation.AB\" message.\nfunc (s *FederationService) resolve_Org_Federation_AB(ctx context.Context, req *FederationService_Org_Federation_ABArgument) (*AB, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.AB\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.AB\", slog.Any(\"message_args\", s.logvalue_Org_Federation_ABArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.ABArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &AB{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'ab'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'ab'`,\n\t\tCacheIndex: 3,\n\t\tSetter: func(v string) error {\n\t\t\tret.Name = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.AB\", slog.Any(\"org.federation.AB\", s.logvalue_Org_Federation_AB(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_B resolve \"org.federation.B\" message.\nfunc (s *FederationService) resolve_Org_Federation_B(ctx context.Context, req *FederationService_Org_Federation_BArgument) (*B, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.B\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.B\", slog.Any(\"message_args\", s.logvalue_Org_Federation_BArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.BArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &B{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'b'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'b'`,\n\t\tCacheIndex: 4,\n\t\tSetter: func(v string) error {\n\t\t\tret.Name = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.B\", slog.Any(\"org.federation.B\", s.logvalue_Org_Federation_B(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_C resolve \"org.federation.C\" message.\nfunc (s *FederationService) resolve_Org_Federation_C(ctx context.Context, req *FederationService_Org_Federation_CArgument) (*C, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.C\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.C\", slog.Any(\"message_args\", s.logvalue_Org_Federation_CArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.CArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &C{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'c'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'c'`,\n\t\tCacheIndex: 5,\n\t\tSetter: func(v string) error {\n\t\t\tret.Name = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.C\", slog.Any(\"org.federation.C\", s.logvalue_Org_Federation_C(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_D resolve \"org.federation.D\" message.\nfunc (s *FederationService) resolve_Org_Federation_D(ctx context.Context, req *FederationService_Org_Federation_DArgument) (*D, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.D\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.D\", slog.Any(\"message_args\", s.logvalue_Org_Federation_DArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.DArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &D{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'d'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'d'`,\n\t\tCacheIndex: 6,\n\t\tSetter: func(v string) error {\n\t\t\tret.Name = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.D\", slog.Any(\"org.federation.D\", s.logvalue_Org_Federation_D(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_E resolve \"org.federation.E\" message.\nfunc (s *FederationService) resolve_Org_Federation_E(ctx context.Context, req *FederationService_Org_Federation_EArgument) (*E, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.E\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.E\", slog.Any(\"message_args\", s.logvalue_Org_Federation_EArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.EArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &E{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'e'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'e'`,\n\t\tCacheIndex: 7,\n\t\tSetter: func(v string) error {\n\t\t\tret.Name = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.E\", slog.Any(\"org.federation.E\", s.logvalue_Org_Federation_E(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_F resolve \"org.federation.F\" message.\nfunc (s *FederationService) resolve_Org_Federation_F(ctx context.Context, req *FederationService_Org_Federation_FArgument) (*F, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.F\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.F\", slog.Any(\"message_args\", s.logvalue_Org_Federation_FArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.FArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &F{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'f'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'f'`,\n\t\tCacheIndex: 8,\n\t\tSetter: func(v string) error {\n\t\t\tret.Name = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.F\", slog.Any(\"org.federation.F\", s.logvalue_Org_Federation_F(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_G resolve \"org.federation.G\" message.\nfunc (s *FederationService) resolve_Org_Federation_G(ctx context.Context, req *FederationService_Org_Federation_GArgument) (*G, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.G\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.G\", slog.Any(\"message_args\", s.logvalue_Org_Federation_GArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.GArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &G{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'g'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'g'`,\n\t\tCacheIndex: 9,\n\t\tSetter: func(v string) error {\n\t\t\tret.Name = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.G\", slog.Any(\"org.federation.G\", s.logvalue_Org_Federation_G(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_GetResponse resolve \"org.federation.GetResponse\" message.\nfunc (s *FederationService) resolve_Org_Federation_GetResponse(ctx context.Context, req *FederationService_Org_Federation_GetResponseArgument) (*GetResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.GetResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.GetResponse\", slog.Any(\"message_args\", s.logvalue_Org_Federation_GetResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tA *A\n\t\t\tB *B\n\t\t\tC *C\n\t\t\tD *D\n\t\t\tE *E\n\t\t\tF *F\n\t\t\tG *G\n\t\t\tH *H\n\t\t\tI *I\n\t\t\tJ *J\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.GetResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"a\"\n\t\t  message {\n\t\t    name: \"A\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_a := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*A, *localValueType]{\n\t\t\tName: `a`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.A\"),\n\t\t\tSetter: func(value *localValueType, v *A) error {\n\t\t\t\tvalue.vars.A = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_AArgument{}\n\t\t\t\tret, err := s.resolve_Org_Federation_A(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"b\"\n\t\t  message {\n\t\t    name: \"B\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_b := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*B, *localValueType]{\n\t\t\tName: `b`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.B\"),\n\t\t\tSetter: func(value *localValueType, v *B) error {\n\t\t\t\tvalue.vars.B = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_BArgument{}\n\t\t\t\tret, err := s.resolve_Org_Federation_B(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"c\"\n\t\t  message {\n\t\t    name: \"C\"\n\t\t    args { name: \"a\", by: \"a.name\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_c := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*C, *localValueType]{\n\t\t\tName: `c`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.C\"),\n\t\t\tSetter: func(value *localValueType, v *C) error {\n\t\t\t\tvalue.vars.C = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_CArgument{}\n\t\t\t\t// { name: \"a\", by: \"a.name\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `a.name`,\n\t\t\t\t\tCacheIndex: 10,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.A = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_C(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"d\"\n\t\t  message {\n\t\t    name: \"D\"\n\t\t    args { name: \"b\", by: \"b.name\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_d := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*D, *localValueType]{\n\t\t\tName: `d`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.D\"),\n\t\t\tSetter: func(value *localValueType, v *D) error {\n\t\t\t\tvalue.vars.D = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_DArgument{}\n\t\t\t\t// { name: \"b\", by: \"b.name\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `b.name`,\n\t\t\t\t\tCacheIndex: 11,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.B = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_D(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"e\"\n\t\t  message {\n\t\t    name: \"E\"\n\t\t    args: [\n\t\t      { name: \"c\", by: \"c.name\" },\n\t\t      { name: \"d\", by: \"d.name\" }\n\t\t    ]\n\t\t  }\n\t\t}\n\t*/\n\tdef_e := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*E, *localValueType]{\n\t\t\tName: `e`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.E\"),\n\t\t\tSetter: func(value *localValueType, v *E) error {\n\t\t\t\tvalue.vars.E = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_EArgument{}\n\t\t\t\t// { name: \"c\", by: \"c.name\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `c.name`,\n\t\t\t\t\tCacheIndex: 12,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.C = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { name: \"d\", by: \"d.name\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `d.name`,\n\t\t\t\t\tCacheIndex: 13,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.D = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_E(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"f\"\n\t\t  message {\n\t\t    name: \"F\"\n\t\t    args: [\n\t\t      { name: \"c\", by: \"c.name\" },\n\t\t      { name: \"d\", by: \"d.name\" }\n\t\t    ]\n\t\t  }\n\t\t}\n\t*/\n\tdef_f := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*F, *localValueType]{\n\t\t\tName: `f`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.F\"),\n\t\t\tSetter: func(value *localValueType, v *F) error {\n\t\t\t\tvalue.vars.F = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_FArgument{}\n\t\t\t\t// { name: \"c\", by: \"c.name\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `c.name`,\n\t\t\t\t\tCacheIndex: 14,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.C = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { name: \"d\", by: \"d.name\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `d.name`,\n\t\t\t\t\tCacheIndex: 15,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.D = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_F(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"g\"\n\t\t  message {\n\t\t    name: \"G\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_g := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*G, *localValueType]{\n\t\t\tName: `g`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.G\"),\n\t\t\tSetter: func(value *localValueType, v *G) error {\n\t\t\t\tvalue.vars.G = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_GArgument{}\n\t\t\t\tret, err := s.resolve_Org_Federation_G(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"h\"\n\t\t  message {\n\t\t    name: \"H\"\n\t\t    args: [\n\t\t      { name: \"e\", by: \"e.name\" },\n\t\t      { name: \"f\", by: \"f.name\" },\n\t\t      { name: \"g\", by: \"g.name\" }\n\t\t    ]\n\t\t  }\n\t\t}\n\t*/\n\tdef_h := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*H, *localValueType]{\n\t\t\tName: `h`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.H\"),\n\t\t\tSetter: func(value *localValueType, v *H) error {\n\t\t\t\tvalue.vars.H = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_HArgument{}\n\t\t\t\t// { name: \"e\", by: \"e.name\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `e.name`,\n\t\t\t\t\tCacheIndex: 16,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.E = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { name: \"f\", by: \"f.name\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `f.name`,\n\t\t\t\t\tCacheIndex: 17,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.F = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { name: \"g\", by: \"g.name\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `g.name`,\n\t\t\t\t\tCacheIndex: 18,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.G = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_H(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"i\"\n\t\t  message {\n\t\t    name: \"I\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_i := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*I, *localValueType]{\n\t\t\tName: `i`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.I\"),\n\t\t\tSetter: func(value *localValueType, v *I) error {\n\t\t\t\tvalue.vars.I = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_IArgument{}\n\t\t\t\tret, err := s.resolve_Org_Federation_I(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"j\"\n\t\t  message {\n\t\t    name: \"J\"\n\t\t    args { name: \"i\", by: \"i.name\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_j := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*J, *localValueType]{\n\t\t\tName: `j`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.J\"),\n\t\t\tSetter: func(value *localValueType, v *J) error {\n\t\t\t\tvalue.vars.J = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_JArgument{}\n\t\t\t\t// { name: \"i\", by: \"i.name\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `i.name`,\n\t\t\t\t\tCacheIndex: 19,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.I = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_J(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t   a ─┐\n\t      c ─┐\n\t   b ─┐  │\n\t      d ─┤\n\t         e ─┐\n\t   a ─┐     │\n\t      c ─┐  │\n\t   b ─┐  │  │\n\t      d ─┤  │\n\t         f ─┤\n\t         g ─┤\n\t            h ─┐\n\t         i ─┐  │\n\t            j ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\teg, ctx2 := grpcfed.ErrorGroupWithContext(ctx1)\n\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\teg, ctx3 := grpcfed.ErrorGroupWithContext(ctx2)\n\t\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\t\tif err := def_a(ctx3); err != nil {\n\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx3, err)\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tif err := def_c(ctx3); err != nil {\n\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx3, err)\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn nil, nil\n\t\t\t})\n\t\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\t\tif err := def_b(ctx3); err != nil {\n\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx3, err)\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tif err := def_d(ctx3); err != nil {\n\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx3, err)\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn nil, nil\n\t\t\t})\n\t\t\tif err := eg.Wait(); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif err := def_e(ctx2); err != nil {\n\t\t\t\tgrpcfed.RecordErrorToSpan(ctx2, err)\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn nil, nil\n\t\t})\n\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\teg, ctx3 := grpcfed.ErrorGroupWithContext(ctx2)\n\t\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\t\tif err := def_a(ctx3); err != nil {\n\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx3, err)\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tif err := def_c(ctx3); err != nil {\n\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx3, err)\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn nil, nil\n\t\t\t})\n\t\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\t\tif err := def_b(ctx3); err != nil {\n\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx3, err)\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tif err := def_d(ctx3); err != nil {\n\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx3, err)\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn nil, nil\n\t\t\t})\n\t\t\tif err := eg.Wait(); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif err := def_f(ctx2); err != nil {\n\t\t\t\tgrpcfed.RecordErrorToSpan(ctx2, err)\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn nil, nil\n\t\t})\n\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\tif err := def_g(ctx2); err != nil {\n\t\t\t\tgrpcfed.RecordErrorToSpan(ctx2, err)\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn nil, nil\n\t\t})\n\t\tif err := eg.Wait(); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_h(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_i(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_j(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_GetResponseVariable.A = value.vars.A\n\treq.FederationService_Org_Federation_GetResponseVariable.B = value.vars.B\n\treq.FederationService_Org_Federation_GetResponseVariable.C = value.vars.C\n\treq.FederationService_Org_Federation_GetResponseVariable.D = value.vars.D\n\treq.FederationService_Org_Federation_GetResponseVariable.E = value.vars.E\n\treq.FederationService_Org_Federation_GetResponseVariable.F = value.vars.F\n\treq.FederationService_Org_Federation_GetResponseVariable.G = value.vars.G\n\treq.FederationService_Org_Federation_GetResponseVariable.H = value.vars.H\n\treq.FederationService_Org_Federation_GetResponseVariable.I = value.vars.I\n\treq.FederationService_Org_Federation_GetResponseVariable.J = value.vars.J\n\n\t// create a message value to be returned.\n\tret := &GetResponse{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"h.name\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `h.name`,\n\t\tCacheIndex: 20,\n\t\tSetter: func(v string) error {\n\t\t\tret.Hname = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"j.name\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `j.name`,\n\t\tCacheIndex: 21,\n\t\tSetter: func(v string) error {\n\t\t\tret.Jname = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.GetResponse\", slog.Any(\"org.federation.GetResponse\", s.logvalue_Org_Federation_GetResponse(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_H resolve \"org.federation.H\" message.\nfunc (s *FederationService) resolve_Org_Federation_H(ctx context.Context, req *FederationService_Org_Federation_HArgument) (*H, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.H\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.H\", slog.Any(\"message_args\", s.logvalue_Org_Federation_HArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.HArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &H{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'h'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'h'`,\n\t\tCacheIndex: 22,\n\t\tSetter: func(v string) error {\n\t\t\tret.Name = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.H\", slog.Any(\"org.federation.H\", s.logvalue_Org_Federation_H(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_I resolve \"org.federation.I\" message.\nfunc (s *FederationService) resolve_Org_Federation_I(ctx context.Context, req *FederationService_Org_Federation_IArgument) (*I, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.I\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.I\", slog.Any(\"message_args\", s.logvalue_Org_Federation_IArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.IArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &I{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'i'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'i'`,\n\t\tCacheIndex: 23,\n\t\tSetter: func(v string) error {\n\t\t\tret.Name = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.I\", slog.Any(\"org.federation.I\", s.logvalue_Org_Federation_I(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_J resolve \"org.federation.J\" message.\nfunc (s *FederationService) resolve_Org_Federation_J(ctx context.Context, req *FederationService_Org_Federation_JArgument) (*J, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.J\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.J\", slog.Any(\"message_args\", s.logvalue_Org_Federation_JArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.JArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &J{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'j'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'j'`,\n\t\tCacheIndex: 24,\n\t\tSetter: func(v string) error {\n\t\t\tret.Name = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.J\", slog.Any(\"org.federation.J\", s.logvalue_Org_Federation_J(ret)))\n\treturn ret, nil\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_A(v *A) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_AA(v *AA) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_AAArgument(v *FederationService_Org_Federation_AAArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_AArgument(v *FederationService_Org_Federation_AArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_AB(v *AB) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_ABArgument(v *FederationService_Org_Federation_ABArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_B(v *B) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_BArgument(v *FederationService_Org_Federation_BArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_C(v *C) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_CArgument(v *FederationService_Org_Federation_CArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"a\", v.A),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_D(v *D) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_DArgument(v *FederationService_Org_Federation_DArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"b\", v.B),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_E(v *E) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_EArgument(v *FederationService_Org_Federation_EArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"c\", v.C),\n\t\tslog.String(\"d\", v.D),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_F(v *F) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_FArgument(v *FederationService_Org_Federation_FArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"c\", v.C),\n\t\tslog.String(\"d\", v.D),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_G(v *G) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GArgument(v *FederationService_Org_Federation_GArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetResponse(v *GetResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"hname\", v.GetHname()),\n\t\tslog.String(\"jname\", v.GetJname()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetResponseArgument(v *FederationService_Org_Federation_GetResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_H(v *H) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_HArgument(v *FederationService_Org_Federation_HArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"e\", v.E),\n\t\tslog.String(\"f\", v.F),\n\t\tslog.String(\"g\", v.G),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_I(v *I) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_IArgument(v *FederationService_Org_Federation_IArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_J(v *J) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_JArgument(v *FederationService_Org_Federation_JArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"i\", v.I),\n\t)\n}\n"
  },
  {
    "path": "generator/testdata/expected_autobind.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: autobind.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n\n\tpost \"example/post\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Org_Federation_GetPostResponseVariable represents variable definitions in \"org.federation.GetPostResponse\".\ntype FederationService_Org_Federation_GetPostResponseVariable struct {\n\tXDef0 *Post\n}\n\n// Org_Federation_GetPostResponseArgument is argument for \"org.federation.GetPostResponse\" message.\ntype FederationService_Org_Federation_GetPostResponseArgument struct {\n\tId string\n\tFederationService_Org_Federation_GetPostResponseVariable\n}\n\n// Org_Federation_PostVariable represents variable definitions in \"org.federation.Post\".\ntype FederationService_Org_Federation_PostVariable struct {\n\tRes   *post.GetPostResponse\n\tXDef1 *post.Post\n\tXDef2 *User\n}\n\n// Org_Federation_PostArgument is argument for \"org.federation.Post\" message.\ntype FederationService_Org_Federation_PostArgument struct {\n\tId string\n\tFederationService_Org_Federation_PostVariable\n}\n\n// Org_Federation_UserVariable represents variable definitions in \"org.federation.User\".\ntype FederationService_Org_Federation_UserVariable struct {\n}\n\n// Org_Federation_UserArgument is argument for \"org.federation.User\" message.\ntype FederationService_Org_Federation_UserArgument struct {\n\tUserId string\n\tFederationService_Org_Federation_UserVariable\n}\n\n// FederationServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationServiceConfig struct {\n\t// Client provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\n\t// If this interface is not provided, an error is returned during initialization.\n\tClient FederationServiceClientFactory // required\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationServiceClientFactory interface {\n\t// Org_Post_PostServiceClient create a gRPC Client to be used to call methods in org.post.PostService.\n\tOrg_Post_PostServiceClient(FederationServiceClientConfig) (post.PostServiceClient, error)\n}\n\n// FederationServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationServiceDependentClientSet struct {\n\tOrg_Post_PostServiceClient post.PostServiceClient\n}\n\n// FederationServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationServiceResolver interface {\n}\n\n// FederationServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// FederationServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationServiceUnimplementedResolver struct{}\n\nconst (\n\tFederationService_DependentMethod_Org_Post_PostService_GetPost = \"/org.post.PostService/GetPost\"\n)\n\n// FederationService represents Federation Service.\ntype FederationService struct {\n\tUnimplementedFederationServiceServer\n\tcfg             FederationServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationServiceDependentClientSet\n}\n\n// NewFederationService creates FederationService instance by FederationServiceConfig.\nfunc NewFederationService(cfg FederationServiceConfig) (*FederationService, error) {\n\tif cfg.Client == nil {\n\t\treturn nil, grpcfed.ErrClientConfig\n\t}\n\tOrg_Post_PostServiceClient, err := cfg.Client.Org_Post_PostServiceClient(FederationServiceClientConfig{\n\t\tService: \"org.post.PostService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"org.federation.FederationService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.org.federation.GetPostResponseArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.PostArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.UserArgument\": {\n\t\t\t\"user_id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"UserId\"),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"org.federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.GRPCErrorAccessorOptions(celTypeHelper, \"org.post.GetPostResponse\")...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.post.PostType\", post.PostType_value, post.PostType_name)...)\n\tsvc := &FederationService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tclient: &FederationServiceDependentClientSet{\n\t\t\tOrg_Post_PostServiceClient: Org_Post_PostServiceClient,\n\t\t},\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationService(ctx context.Context, svc *FederationService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n// GetPost implements \"org.federation.FederationService/GetPost\" method.\nfunc (s *FederationService) GetPost(ctx context.Context, req *GetPostRequest) (res *GetPostResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.FederationService/GetPost\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Org_Federation_GetPostResponse(ctx, &FederationService_Org_Federation_GetPostResponseArgument{\n\t\tId: req.GetId(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Org_Federation_GetPostResponse resolve \"org.federation.GetPostResponse\" message.\nfunc (s *FederationService) resolve_Org_Federation_GetPostResponse(ctx context.Context, req *FederationService_Org_Federation_GetPostResponseArgument) (*GetPostResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.GetPostResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.GetPostResponse\", slog.Any(\"message_args\", s.logvalue_Org_Federation_GetPostResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tXDef0 *Post\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.GetPostResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"_def0\"\n\t\t  autobind: true\n\t\t  message {\n\t\t    name: \"Post\"\n\t\t    args { name: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef__def0 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Post, *localValueType]{\n\t\t\tName: `_def0`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.Post\"),\n\t\t\tSetter: func(value *localValueType, v *Post) error {\n\t\t\t\tvalue.vars.XDef0 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_PostArgument{}\n\t\t\t\t// { name: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 1,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_Post(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def__def0(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_GetPostResponseVariable.XDef0 = value.vars.XDef0\n\n\t// create a message value to be returned.\n\tret := &GetPostResponse{}\n\n\t// field binding section.\n\tret.Id = value.vars.XDef0.GetId()           // { name: \"_def0\", autobind: true }\n\tret.Title = value.vars.XDef0.GetTitle()     // { name: \"_def0\", autobind: true }\n\tret.Content = value.vars.XDef0.GetContent() // { name: \"_def0\", autobind: true }\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.GetPostResponse\", slog.Any(\"org.federation.GetPostResponse\", s.logvalue_Org_Federation_GetPostResponse(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_Post resolve \"org.federation.Post\" message.\nfunc (s *FederationService) resolve_Org_Federation_Post(ctx context.Context, req *FederationService_Org_Federation_PostArgument) (*Post, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.Post\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.Post\", slog.Any(\"message_args\", s.logvalue_Org_Federation_PostArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tRes   *post.GetPostResponse\n\t\t\tXDef1 *post.Post\n\t\t\tXDef2 *User\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.PostArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"org.post.PostService/GetPost\"\n\t\t    request { field: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.GetPostResponse, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"org.post.GetPostResponse\"),\n\t\t\tSetter: func(value *localValueType, v *post.GetPostResponse) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &post.GetPostRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 2,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call org.post.PostService/GetPost\", slog.Any(\"org.post.GetPostRequest\", s.logvalue_Org_Post_GetPostRequest(args)))\n\t\t\t\tret, err := s.client.Org_Post_PostServiceClient.GetPost(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Org_Post_PostService_GetPost, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"_def1\"\n\t\t  autobind: true\n\t\t  by: \"res.post\"\n\t\t}\n\t*/\n\tdef__def1 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.Post, *localValueType]{\n\t\t\tName: `_def1`,\n\t\t\tType: grpcfed.CELObjectType(\"org.post.Post\"),\n\t\t\tSetter: func(value *localValueType, v *post.Post) error {\n\t\t\t\tvalue.vars.XDef1 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `res.post`,\n\t\t\tByCacheIndex: 3,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"_def2\"\n\t\t  autobind: true\n\t\t  message {\n\t\t    name: \"User\"\n\t\t    args { name: \"user_id\", by: \"'foo'\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef__def2 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*User, *localValueType]{\n\t\t\tName: `_def2`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.User\"),\n\t\t\tSetter: func(value *localValueType, v *User) error {\n\t\t\t\tvalue.vars.XDef2 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_UserArgument{}\n\t\t\t\t// { name: \"user_id\", by: \"'foo'\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `'foo'`,\n\t\t\t\t\tCacheIndex: 4,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.UserId = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_User(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t   res ─┐\n\t        _def1 ─┐\n\t        _def2 ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def__def1(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def__def2(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_PostVariable.Res = value.vars.Res\n\treq.FederationService_Org_Federation_PostVariable.XDef1 = value.vars.XDef1\n\treq.FederationService_Org_Federation_PostVariable.XDef2 = value.vars.XDef2\n\n\t// create a message value to be returned.\n\tret := &Post{}\n\n\t// field binding section.\n\tret.Id = value.vars.XDef1.GetId()           // { name: \"_def1\", autobind: true }\n\tret.Title = value.vars.XDef1.GetTitle()     // { name: \"_def1\", autobind: true }\n\tret.Content = value.vars.XDef1.GetContent() // { name: \"_def1\", autobind: true }\n\tret.Uid = value.vars.XDef2.GetUid()         // { name: \"_def2\", autobind: true }\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.Post\", slog.Any(\"org.federation.Post\", s.logvalue_Org_Federation_Post(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_User resolve \"org.federation.User\" message.\nfunc (s *FederationService) resolve_Org_Federation_User(ctx context.Context, req *FederationService_Org_Federation_UserArgument) (*User, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.User\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.User\", slog.Any(\"message_args\", s.logvalue_Org_Federation_UserArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.UserArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &User{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"$.user_id\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `$.user_id`,\n\t\tCacheIndex: 5,\n\t\tSetter: func(v string) error {\n\t\t\tret.Uid = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.User\", slog.Any(\"org.federation.User\", s.logvalue_Org_Federation_User(ret)))\n\treturn ret, nil\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostResponse(v *GetPostResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.String(\"title\", v.GetTitle()),\n\t\tslog.String(\"content\", v.GetContent()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostResponseArgument(v *FederationService_Org_Federation_GetPostResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_Post(v *Post) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.String(\"title\", v.GetTitle()),\n\t\tslog.String(\"content\", v.GetContent()),\n\t\tslog.String(\"uid\", v.GetUid()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_PostArgument(v *FederationService_Org_Federation_PostArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_User(v *User) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"uid\", v.GetUid()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_UserArgument(v *FederationService_Org_Federation_UserArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"user_id\", v.UserId),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_CreatePost(v *post.CreatePost) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"title\", v.GetTitle()),\n\t\tslog.String(\"content\", v.GetContent()),\n\t\tslog.String(\"user_id\", v.GetUserId()),\n\t\tslog.String(\"type\", s.logvalue_Org_Post_PostType(v.GetType()).String()),\n\t\tslog.Int64(\"post_type\", int64(v.GetPostType())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_CreatePostRequest(v *post.CreatePostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"post\", s.logvalue_Org_Post_CreatePost(v.GetPost())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_GetPostRequest(v *post.GetPostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_GetPostsRequest(v *post.GetPostsRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.GetIds()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_PostType(v post.PostType) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tswitch v {\n\tcase post.PostType_POST_TYPE_UNKNOWN:\n\t\treturn slog.StringValue(\"POST_TYPE_UNKNOWN\")\n\tcase post.PostType_POST_TYPE_A:\n\t\treturn slog.StringValue(\"POST_TYPE_A\")\n\tcase post.PostType_POST_TYPE_B:\n\t\treturn slog.StringValue(\"POST_TYPE_B\")\n\t}\n\treturn slog.StringValue(\"\")\n}\n\nfunc (s *FederationService) logvalue_Org_Post_UpdatePostRequest(v *post.UpdatePostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t)\n}\n"
  },
  {
    "path": "generator/testdata/expected_condition.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: condition.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n\n\tpost \"example/post\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Org_Federation_GetPostResponseVariable represents variable definitions in \"org.federation.GetPostResponse\".\ntype FederationService_Org_Federation_GetPostResponseVariable struct {\n\tPost *Post\n}\n\n// Org_Federation_GetPostResponseArgument is argument for \"org.federation.GetPostResponse\" message.\ntype FederationService_Org_Federation_GetPostResponseArgument struct {\n\tId string\n\tFederationService_Org_Federation_GetPostResponseVariable\n}\n\n// Org_Federation_PostVariable represents variable definitions in \"org.federation.Post\".\ntype FederationService_Org_Federation_PostVariable struct {\n\tPost  *post.Post\n\tPosts []*post.Post\n\tRes   *post.GetPostResponse\n\tUser  *User\n\tUsers []*User\n}\n\n// Org_Federation_PostArgument is argument for \"org.federation.Post\" message.\ntype FederationService_Org_Federation_PostArgument struct {\n\tId string\n\tFederationService_Org_Federation_PostVariable\n}\n\n// Org_Federation_UserVariable represents variable definitions in \"org.federation.User\".\ntype FederationService_Org_Federation_UserVariable struct {\n}\n\n// Org_Federation_UserArgument is argument for \"org.federation.User\" message.\ntype FederationService_Org_Federation_UserArgument struct {\n\tUserId string\n\tFederationService_Org_Federation_UserVariable\n}\n\n// FederationServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationServiceConfig struct {\n\t// Client provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\n\t// If this interface is not provided, an error is returned during initialization.\n\tClient FederationServiceClientFactory // required\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationServiceClientFactory interface {\n\t// Org_Post_PostServiceClient create a gRPC Client to be used to call methods in org.post.PostService.\n\tOrg_Post_PostServiceClient(FederationServiceClientConfig) (post.PostServiceClient, error)\n}\n\n// FederationServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationServiceDependentClientSet struct {\n\tOrg_Post_PostServiceClient post.PostServiceClient\n}\n\n// FederationServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationServiceResolver interface {\n}\n\n// FederationServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// FederationServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationServiceUnimplementedResolver struct{}\n\nconst (\n\tFederationService_DependentMethod_Org_Post_PostService_GetPost = \"/org.post.PostService/GetPost\"\n)\n\n// FederationService represents Federation Service.\ntype FederationService struct {\n\tUnimplementedFederationServiceServer\n\tcfg             FederationServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationServiceDependentClientSet\n}\n\n// NewFederationService creates FederationService instance by FederationServiceConfig.\nfunc NewFederationService(cfg FederationServiceConfig) (*FederationService, error) {\n\tif cfg.Client == nil {\n\t\treturn nil, grpcfed.ErrClientConfig\n\t}\n\tOrg_Post_PostServiceClient, err := cfg.Client.Org_Post_PostServiceClient(FederationServiceClientConfig{\n\t\tService: \"org.post.PostService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"org.federation.FederationService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.org.federation.GetPostResponseArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.PostArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.UserArgument\": {\n\t\t\t\"user_id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"UserId\"),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"org.federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.GRPCErrorAccessorOptions(celTypeHelper, \"org.post.GetPostResponse\")...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.post.PostType\", post.PostType_value, post.PostType_name)...)\n\tsvc := &FederationService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tclient: &FederationServiceDependentClientSet{\n\t\t\tOrg_Post_PostServiceClient: Org_Post_PostServiceClient,\n\t\t},\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationService(ctx context.Context, svc *FederationService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n// GetPost implements \"org.federation.FederationService/GetPost\" method.\nfunc (s *FederationService) GetPost(ctx context.Context, req *GetPostRequest) (res *GetPostResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.FederationService/GetPost\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Org_Federation_GetPostResponse(ctx, &FederationService_Org_Federation_GetPostResponseArgument{\n\t\tId: req.GetId(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Org_Federation_GetPostResponse resolve \"org.federation.GetPostResponse\" message.\nfunc (s *FederationService) resolve_Org_Federation_GetPostResponse(ctx context.Context, req *FederationService_Org_Federation_GetPostResponseArgument) (*GetPostResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.GetPostResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.GetPostResponse\", slog.Any(\"message_args\", s.logvalue_Org_Federation_GetPostResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tPost *Post\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.GetPostResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"post\"\n\t\t  message {\n\t\t    name: \"Post\"\n\t\t    args { name: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_post := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Post, *localValueType]{\n\t\t\tName: `post`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.Post\"),\n\t\t\tSetter: func(value *localValueType, v *Post) error {\n\t\t\t\tvalue.vars.Post = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_PostArgument{}\n\t\t\t\t// { name: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 1,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_Post(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_post(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_GetPostResponseVariable.Post = value.vars.Post\n\n\t// create a message value to be returned.\n\tret := &GetPostResponse{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"post\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*Post]{\n\t\tValue:      value,\n\t\tExpr:       `post`,\n\t\tCacheIndex: 2,\n\t\tSetter: func(v *Post) error {\n\t\t\tret.Post = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.GetPostResponse\", slog.Any(\"org.federation.GetPostResponse\", s.logvalue_Org_Federation_GetPostResponse(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_Post resolve \"org.federation.Post\" message.\nfunc (s *FederationService) resolve_Org_Federation_Post(ctx context.Context, req *FederationService_Org_Federation_PostArgument) (*Post, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.Post\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.Post\", slog.Any(\"message_args\", s.logvalue_Org_Federation_PostArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tPost  *post.Post\n\t\t\tPosts []*post.Post\n\t\t\tRes   *post.GetPostResponse\n\t\t\tUser  *User\n\t\t\tUsers []*User\n\t\t\tXDef5 bool\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.PostArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  if: \"$.id != ''\"\n\t\t  call {\n\t\t    method: \"org.post.PostService/GetPost\"\n\t\t    request { field: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.GetPostResponse, *localValueType]{\n\t\t\tIf:           `$.id != ''`,\n\t\t\tIfCacheIndex: 3,\n\t\t\tName:         `res`,\n\t\t\tType:         grpcfed.CELObjectType(\"org.post.GetPostResponse\"),\n\t\t\tSetter: func(value *localValueType, v *post.GetPostResponse) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &post.GetPostRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 4,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call org.post.PostService/GetPost\", slog.Any(\"org.post.GetPostRequest\", s.logvalue_Org_Post_GetPostRequest(args)))\n\t\t\t\tret, err := s.client.Org_Post_PostServiceClient.GetPost(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Org_Post_PostService_GetPost, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"post\"\n\t\t  if: \"res != null\"\n\t\t  by: \"res.post\"\n\t\t}\n\t*/\n\tdef_post := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.Post, *localValueType]{\n\t\t\tIf:           `res != null`,\n\t\t\tIfCacheIndex: 5,\n\t\t\tName:         `post`,\n\t\t\tType:         grpcfed.CELObjectType(\"org.post.Post\"),\n\t\t\tSetter: func(value *localValueType, v *post.Post) error {\n\t\t\t\tvalue.vars.Post = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `res.post`,\n\t\t\tByCacheIndex: 6,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"user\"\n\t\t  if: \"post != null\"\n\t\t  message {\n\t\t    name: \"User\"\n\t\t    args { name: \"user_id\", by: \"post.user_id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_user := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*User, *localValueType]{\n\t\t\tIf:           `post != null`,\n\t\t\tIfCacheIndex: 7,\n\t\t\tName:         `user`,\n\t\t\tType:         grpcfed.CELObjectType(\"org.federation.User\"),\n\t\t\tSetter: func(value *localValueType, v *User) error {\n\t\t\t\tvalue.vars.User = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_UserArgument{}\n\t\t\t\t// { name: \"user_id\", by: \"post.user_id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `post.user_id`,\n\t\t\t\t\tCacheIndex: 8,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.UserId = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_User(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"posts\"\n\t\t  by: \"[post]\"\n\t\t}\n\t*/\n\tdef_posts := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[[]*post.Post, *localValueType]{\n\t\t\tName: `posts`,\n\t\t\tType: grpcfed.CELListType(grpcfed.CELObjectType(\"org.post.Post\")),\n\t\t\tSetter: func(value *localValueType, v []*post.Post) error {\n\t\t\t\tvalue.vars.Posts = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `[post]`,\n\t\t\tByCacheIndex: 9,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"users\"\n\t\t  if: \"user != null\"\n\t\t  map {\n\t\t    iterator {\n\t\t      name: \"iter\"\n\t\t      src: \"posts\"\n\t\t    }\n\t\t    message {\n\t\t      name: \"User\"\n\t\t      args { name: \"user_id\", by: \"iter.user_id\" }\n\t\t    }\n\t\t  }\n\t\t}\n\t*/\n\tdef_users := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDefMap(ctx, value, grpcfed.DefMap[[]*User, *post.Post, *localValueType]{\n\t\t\tIf:           `user != null`,\n\t\t\tIfCacheIndex: 10,\n\t\t\tName:         `users`,\n\t\t\tType:         grpcfed.CELListType(grpcfed.CELObjectType(\"org.federation.User\")),\n\t\t\tSetter: func(value *localValueType, v []*User) error {\n\t\t\t\tvalue.vars.Users = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tIteratorName:   `iter`,\n\t\t\tIteratorType:   grpcfed.CELObjectType(\"org.post.Post\"),\n\t\t\tIteratorSource: func(value *localValueType) []*post.Post { return value.vars.Posts },\n\t\t\tIterator: func(ctx context.Context, value *grpcfed.MapIteratorValue) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_UserArgument{}\n\t\t\t\t// { name: \"user_id\", by: \"iter.user_id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `iter.user_id`,\n\t\t\t\t\tCacheIndex: 11,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.UserId = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn s.resolve_Org_Federation_User(ctx, args)\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"_def5\"\n\t\t  if: \"users.size() > 0\"\n\t\t  validation {\n\t\t    error {\n\t\t      code: INVALID_ARGUMENT\n\t\t      if: \"users[0].id == ''\"\n\t\t    }\n\t\t  }\n\t\t}\n\t*/\n\tdef__def5 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[bool, *localValueType]{\n\t\t\tIf:           `users.size() > 0`,\n\t\t\tIfCacheIndex: 12,\n\t\t\tName:         `_def5`,\n\t\t\tType:         grpcfed.CELBoolType,\n\t\t\tSetter: func(value *localValueType, v bool) error {\n\t\t\t\tvalue.vars.XDef5 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tValidation: func(ctx context.Context, value *localValueType) error {\n\t\t\t\tvar stat *grpcfed.Status\n\t\t\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `users[0].id == ''`,\n\t\t\t\t\tCacheIndex: 13,\n\t\t\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t\t\terrorMessage := \"error\"\n\t\t\t\t\t\tstat = grpcfed.NewGRPCStatus(grpcfed.InvalidArgumentCode, errorMessage)\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\treturn grpcfed.NewErrorWithLogAttrs(stat.Err(), slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t},\n\t\t})\n\t}\n\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_post(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_posts(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_post(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_user(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\tif err := def_users(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\tif err := def__def5(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_PostVariable.Post = value.vars.Post\n\treq.FederationService_Org_Federation_PostVariable.Posts = value.vars.Posts\n\treq.FederationService_Org_Federation_PostVariable.Res = value.vars.Res\n\treq.FederationService_Org_Federation_PostVariable.User = value.vars.User\n\treq.FederationService_Org_Federation_PostVariable.Users = value.vars.Users\n\n\t// create a message value to be returned.\n\tret := &Post{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"post.id\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `post.id`,\n\t\tCacheIndex: 14,\n\t\tSetter: func(v string) error {\n\t\t\tret.Id = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"post.title\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `post.title`,\n\t\tCacheIndex: 15,\n\t\tSetter: func(v string) error {\n\t\t\tret.Title = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"users[0]\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*User]{\n\t\tValue:      value,\n\t\tExpr:       `users[0]`,\n\t\tCacheIndex: 16,\n\t\tSetter: func(v *User) error {\n\t\t\tret.User = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.Post\", slog.Any(\"org.federation.Post\", s.logvalue_Org_Federation_Post(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_User resolve \"org.federation.User\" message.\nfunc (s *FederationService) resolve_Org_Federation_User(ctx context.Context, req *FederationService_Org_Federation_UserArgument) (*User, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.User\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.User\", slog.Any(\"message_args\", s.logvalue_Org_Federation_UserArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.UserArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &User{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"$.user_id\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `$.user_id`,\n\t\tCacheIndex: 17,\n\t\tSetter: func(v string) error {\n\t\t\tret.Id = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.User\", slog.Any(\"org.federation.User\", s.logvalue_Org_Federation_User(ret)))\n\treturn ret, nil\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostResponse(v *GetPostResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"post\", s.logvalue_Org_Federation_Post(v.GetPost())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostResponseArgument(v *FederationService_Org_Federation_GetPostResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_Post(v *Post) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.String(\"title\", v.GetTitle()),\n\t\tslog.Any(\"user\", s.logvalue_Org_Federation_User(v.GetUser())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_PostArgument(v *FederationService_Org_Federation_PostArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_User(v *User) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_UserArgument(v *FederationService_Org_Federation_UserArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"user_id\", v.UserId),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_CreatePost(v *post.CreatePost) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"title\", v.GetTitle()),\n\t\tslog.String(\"content\", v.GetContent()),\n\t\tslog.String(\"user_id\", v.GetUserId()),\n\t\tslog.String(\"type\", s.logvalue_Org_Post_PostType(v.GetType()).String()),\n\t\tslog.Int64(\"post_type\", int64(v.GetPostType())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_CreatePostRequest(v *post.CreatePostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"post\", s.logvalue_Org_Post_CreatePost(v.GetPost())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_GetPostRequest(v *post.GetPostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_GetPostsRequest(v *post.GetPostsRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.GetIds()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_PostType(v post.PostType) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tswitch v {\n\tcase post.PostType_POST_TYPE_UNKNOWN:\n\t\treturn slog.StringValue(\"POST_TYPE_UNKNOWN\")\n\tcase post.PostType_POST_TYPE_A:\n\t\treturn slog.StringValue(\"POST_TYPE_A\")\n\tcase post.PostType_POST_TYPE_B:\n\t\treturn slog.StringValue(\"POST_TYPE_B\")\n\t}\n\treturn slog.StringValue(\"\")\n}\n\nfunc (s *FederationService) logvalue_Org_Post_UpdatePostRequest(v *post.UpdatePostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t)\n}\n"
  },
  {
    "path": "generator/testdata/expected_create_post.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: create_post.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n\t\"google.golang.org/protobuf/types/known/emptypb\"\n\n\tpost \"example/post\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Org_Federation_CreatePostVariable represents variable definitions in \"org.federation.CreatePost\".\ntype FederationService_Org_Federation_CreatePostVariable struct {\n}\n\n// Org_Federation_CreatePostArgument is argument for \"org.federation.CreatePost\" message.\ntype FederationService_Org_Federation_CreatePostArgument struct {\n\tContent string\n\tTitle   string\n\tType    PostType\n\tUserId  string\n\tFederationService_Org_Federation_CreatePostVariable\n}\n\n// Org_Federation_CreatePostResponseVariable represents variable definitions in \"org.federation.CreatePostResponse\".\ntype FederationService_Org_Federation_CreatePostResponseVariable struct {\n\tCp  *CreatePost\n\tP   *post.Post\n\tRes *post.CreatePostResponse\n}\n\n// Org_Federation_CreatePostResponseArgument is argument for \"org.federation.CreatePostResponse\" message.\ntype FederationService_Org_Federation_CreatePostResponseArgument struct {\n\tContent string\n\tTitle   string\n\tType    PostType\n\tUserId  string\n\tFederationService_Org_Federation_CreatePostResponseVariable\n}\n\n// Org_Federation_UpdatePostResponseVariable represents variable definitions in \"org.federation.UpdatePostResponse\".\ntype FederationService_Org_Federation_UpdatePostResponseVariable struct {\n}\n\n// Org_Federation_UpdatePostResponseArgument is argument for \"org.federation.UpdatePostResponse\" message.\ntype FederationService_Org_Federation_UpdatePostResponseArgument struct {\n\tId string\n\tFederationService_Org_Federation_UpdatePostResponseVariable\n}\n\n// FederationServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationServiceConfig struct {\n\t// Client provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\n\t// If this interface is not provided, an error is returned during initialization.\n\tClient FederationServiceClientFactory // required\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationServiceClientFactory interface {\n\t// Org_Post_PostServiceClient create a gRPC Client to be used to call methods in org.post.PostService.\n\tOrg_Post_PostServiceClient(FederationServiceClientConfig) (post.PostServiceClient, error)\n}\n\n// FederationServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationServiceDependentClientSet struct {\n\tOrg_Post_PostServiceClient post.PostServiceClient\n}\n\n// FederationServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationServiceResolver interface {\n}\n\n// FederationServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// FederationServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationServiceUnimplementedResolver struct{}\n\nconst (\n\tFederationService_DependentMethod_Org_Post_PostService_CreatePost = \"/org.post.PostService/CreatePost\"\n\tFederationService_DependentMethod_Org_Post_PostService_UpdatePost = \"/org.post.PostService/UpdatePost\"\n)\n\n// FederationService represents Federation Service.\ntype FederationService struct {\n\tUnimplementedFederationServiceServer\n\tcfg             FederationServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationServiceDependentClientSet\n}\n\n// NewFederationService creates FederationService instance by FederationServiceConfig.\nfunc NewFederationService(cfg FederationServiceConfig) (*FederationService, error) {\n\tif cfg.Client == nil {\n\t\treturn nil, grpcfed.ErrClientConfig\n\t}\n\tOrg_Post_PostServiceClient, err := cfg.Client.Org_Post_PostServiceClient(FederationServiceClientConfig{\n\t\tService: \"org.post.PostService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"org.federation.FederationService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.org.federation.CreatePostArgument\": {\n\t\t\t\"title\":   grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Title\"),\n\t\t\t\"content\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Content\"),\n\t\t\t\"user_id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"UserId\"),\n\t\t\t\"type\":    grpcfed.NewCELFieldType(grpcfed.CELIntType, \"Type\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.CreatePostResponseArgument\": {\n\t\t\t\"title\":   grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Title\"),\n\t\t\t\"content\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Content\"),\n\t\t\t\"user_id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"UserId\"),\n\t\t\t\"type\":    grpcfed.NewCELFieldType(grpcfed.CELIntType, \"Type\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.UpdatePostResponseArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"org.federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.GRPCErrorAccessorOptions(celTypeHelper, \"org.post.CreatePostResponse\")...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.GRPCErrorAccessorOptions(celTypeHelper, \"org.post.UpdatePostResponse\")...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.federation.PostType\", PostType_value, PostType_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.post.PostType\", post.PostType_value, post.PostType_name)...)\n\tsvc := &FederationService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tclient: &FederationServiceDependentClientSet{\n\t\t\tOrg_Post_PostServiceClient: Org_Post_PostServiceClient,\n\t\t},\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationService(ctx context.Context, svc *FederationService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n// CreatePost implements \"org.federation.FederationService/CreatePost\" method.\nfunc (s *FederationService) CreatePost(ctx context.Context, req *CreatePostRequest) (res *CreatePostResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.FederationService/CreatePost\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Org_Federation_CreatePostResponse(ctx, &FederationService_Org_Federation_CreatePostResponseArgument{\n\t\tTitle:   req.GetTitle(),\n\t\tContent: req.GetContent(),\n\t\tUserId:  req.GetUserId(),\n\t\tType:    req.GetType(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// UpdatePost implements \"org.federation.FederationService/UpdatePost\" method.\nfunc (s *FederationService) UpdatePost(ctx context.Context, req *UpdatePostRequest) (res *emptypb.Empty, e error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.FederationService/UpdatePost\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tcustomRes, err := s.resolve_Org_Federation_UpdatePostResponse(ctx, &FederationService_Org_Federation_UpdatePostResponseArgument{\n\t\tId: req.GetId(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\tret, err := s.cast_Org_Federation_UpdatePostResponse__to__Google_Protobuf_Empty(customRes)\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_CreatePost resolve \"org.federation.CreatePost\" message.\nfunc (s *FederationService) resolve_Org_Federation_CreatePost(ctx context.Context, req *FederationService_Org_Federation_CreatePostArgument) (*CreatePost, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.CreatePost\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.CreatePost\", slog.Any(\"message_args\", s.logvalue_Org_Federation_CreatePostArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.CreatePostArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &CreatePost{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"$.title\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `$.title`,\n\t\tCacheIndex: 1,\n\t\tSetter: func(v string) error {\n\t\t\tret.Title = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"$.content\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `$.content`,\n\t\tCacheIndex: 2,\n\t\tSetter: func(v string) error {\n\t\t\tret.Content = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"$.user_id\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `$.user_id`,\n\t\tCacheIndex: 3,\n\t\tSetter: func(v string) error {\n\t\t\tret.UserId = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"PostType.from($.type)\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[PostType]{\n\t\tValue:      value,\n\t\tExpr:       `PostType.from($.type)`,\n\t\tCacheIndex: 4,\n\t\tSetter: func(v PostType) error {\n\t\t\tret.Type = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"PostType.TYPE_A\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[int32]{\n\t\tValue:      value,\n\t\tExpr:       `PostType.TYPE_A`,\n\t\tCacheIndex: 5,\n\t\tSetter: func(v int32) error {\n\t\t\tret.PostType = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.CreatePost\", slog.Any(\"org.federation.CreatePost\", s.logvalue_Org_Federation_CreatePost(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_CreatePostResponse resolve \"org.federation.CreatePostResponse\" message.\nfunc (s *FederationService) resolve_Org_Federation_CreatePostResponse(ctx context.Context, req *FederationService_Org_Federation_CreatePostResponseArgument) (*CreatePostResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.CreatePostResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.CreatePostResponse\", slog.Any(\"message_args\", s.logvalue_Org_Federation_CreatePostResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tCp  *CreatePost\n\t\t\tP   *post.Post\n\t\t\tRes *post.CreatePostResponse\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.CreatePostResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"cp\"\n\t\t  message {\n\t\t    name: \"CreatePost\"\n\t\t    args: [\n\t\t      { name: \"title\", by: \"$.title\" },\n\t\t      { name: \"content\", by: \"$.content\" },\n\t\t      { name: \"user_id\", by: \"$.user_id\" },\n\t\t      { name: \"type\", by: \"$.type\" }\n\t\t    ]\n\t\t  }\n\t\t}\n\t*/\n\tdef_cp := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*CreatePost, *localValueType]{\n\t\t\tName: `cp`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.CreatePost\"),\n\t\t\tSetter: func(value *localValueType, v *CreatePost) error {\n\t\t\t\tvalue.vars.Cp = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_CreatePostArgument{}\n\t\t\t\t// { name: \"title\", by: \"$.title\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.title`,\n\t\t\t\t\tCacheIndex: 6,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Title = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { name: \"content\", by: \"$.content\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.content`,\n\t\t\t\t\tCacheIndex: 7,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Content = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { name: \"user_id\", by: \"$.user_id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.user_id`,\n\t\t\t\t\tCacheIndex: 8,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.UserId = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { name: \"type\", by: \"$.type\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[PostType]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.type`,\n\t\t\t\t\tCacheIndex: 9,\n\t\t\t\t\tSetter: func(v PostType) error {\n\t\t\t\t\t\targs.Type = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_CreatePost(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"org.post.PostService/CreatePost\"\n\t\t    request { field: \"post\", by: \"cp\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.CreatePostResponse, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"org.post.CreatePostResponse\"),\n\t\t\tSetter: func(value *localValueType, v *post.CreatePostResponse) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &post.CreatePostRequest{}\n\t\t\t\t// { field: \"post\", by: \"cp\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*CreatePost]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `cp`,\n\t\t\t\t\tCacheIndex: 10,\n\t\t\t\t\tSetter: func(v *CreatePost) error {\n\t\t\t\t\t\tpostValue, err := s.cast_Org_Federation_CreatePost__to__Org_Post_CreatePost(v)\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t}\n\t\t\t\t\t\targs.Post = postValue\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call org.post.PostService/CreatePost\", slog.Any(\"org.post.CreatePostRequest\", s.logvalue_Org_Post_CreatePostRequest(args)))\n\t\t\t\tret, err := s.client.Org_Post_PostServiceClient.CreatePost(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Org_Post_PostService_CreatePost, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"p\"\n\t\t  by: \"res.post\"\n\t\t}\n\t*/\n\tdef_p := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.Post, *localValueType]{\n\t\t\tName: `p`,\n\t\t\tType: grpcfed.CELObjectType(\"org.post.Post\"),\n\t\t\tSetter: func(value *localValueType, v *post.Post) error {\n\t\t\t\tvalue.vars.P = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `res.post`,\n\t\t\tByCacheIndex: 11,\n\t\t})\n\t}\n\n\tif err := def_cp(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\tif err := def_res(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\tif err := def_p(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_CreatePostResponseVariable.Cp = value.vars.Cp\n\treq.FederationService_Org_Federation_CreatePostResponseVariable.P = value.vars.P\n\treq.FederationService_Org_Federation_CreatePostResponseVariable.Res = value.vars.Res\n\n\t// create a message value to be returned.\n\tret := &CreatePostResponse{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"p\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*post.Post]{\n\t\tValue:      value,\n\t\tExpr:       `p`,\n\t\tCacheIndex: 12,\n\t\tSetter: func(v *post.Post) error {\n\t\t\tpostValue, err := s.cast_Org_Post_Post__to__Org_Federation_Post(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.Post = postValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.CreatePostResponse\", slog.Any(\"org.federation.CreatePostResponse\", s.logvalue_Org_Federation_CreatePostResponse(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_UpdatePostResponse resolve \"org.federation.UpdatePostResponse\" message.\nfunc (s *FederationService) resolve_Org_Federation_UpdatePostResponse(ctx context.Context, req *FederationService_Org_Federation_UpdatePostResponseArgument) (*UpdatePostResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.UpdatePostResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.UpdatePostResponse\", slog.Any(\"message_args\", s.logvalue_Org_Federation_UpdatePostResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tXDef0 *post.UpdatePostResponse\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.UpdatePostResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"_def0\"\n\t\t  call {\n\t\t    method: \"org.post.PostService/UpdatePost\"\n\t\t    request { field: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef__def0 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.UpdatePostResponse, *localValueType]{\n\t\t\tName: `_def0`,\n\t\t\tType: grpcfed.CELObjectType(\"org.post.UpdatePostResponse\"),\n\t\t\tSetter: func(value *localValueType, v *post.UpdatePostResponse) error {\n\t\t\t\tvalue.vars.XDef0 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &post.UpdatePostRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 13,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call org.post.PostService/UpdatePost\", slog.Any(\"org.post.UpdatePostRequest\", s.logvalue_Org_Post_UpdatePostRequest(args)))\n\t\t\t\tret, err := s.client.Org_Post_PostServiceClient.UpdatePost(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Org_Post_PostService_UpdatePost, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def__def0(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// create a message value to be returned.\n\tret := &UpdatePostResponse{}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.UpdatePostResponse\", slog.Any(\"org.federation.UpdatePostResponse\", s.logvalue_Org_Federation_UpdatePostResponse(ret)))\n\treturn ret, nil\n}\n\n// cast_Org_Federation_CreatePost__to__Org_Post_CreatePost cast from \"org.federation.CreatePost\" to \"org.post.CreatePost\".\nfunc (s *FederationService) cast_Org_Federation_CreatePost__to__Org_Post_CreatePost(from *CreatePost) (*post.CreatePost, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\ttitleValue := from.GetTitle()\n\tcontentValue := from.GetContent()\n\tuserIdValue := from.GetUserId()\n\ttypeValue, err := s.cast_Org_Federation_PostType__to__Org_Post_PostType(from.GetType())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tpostTypeValue := from.GetPostType()\n\tret := &post.CreatePost{\n\t\tTitle:    titleValue,\n\t\tContent:  contentValue,\n\t\tUserId:   userIdValue,\n\t\tType:     typeValue,\n\t\tPostType: postTypeValue,\n\t}\n\n\treturn ret, nil\n}\n\n// cast_Org_Federation_PostType__to__Org_Post_PostType cast from \"org.federation.PostType\" to \"org.post.PostType\".\nfunc (s *FederationService) cast_Org_Federation_PostType__to__Org_Post_PostType(from PostType) (post.PostType, error) {\n\tvar ret post.PostType\n\tswitch from {\n\tcase PostType_TYPE_UNKNOWN:\n\t\tret = post.PostType_POST_TYPE_UNKNOWN\n\tcase PostType_TYPE_A:\n\t\tret = post.PostType_POST_TYPE_A\n\tcase PostType_TYPE_B:\n\t\tret = post.PostType_POST_TYPE_B\n\tdefault:\n\t\tret = 0\n\t}\n\treturn ret, nil\n}\n\n// cast_Org_Federation_UpdatePostResponse__to__Google_Protobuf_Empty cast from \"org.federation.UpdatePostResponse\" to \"google.protobuf.Empty\".\nfunc (s *FederationService) cast_Org_Federation_UpdatePostResponse__to__Google_Protobuf_Empty(from *UpdatePostResponse) (*emptypb.Empty, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tret := &emptypb.Empty{}\n\n\treturn ret, nil\n}\n\n// cast_Org_Post_PostType__to__Org_Federation_PostType cast from \"org.post.PostType\" to \"org.federation.PostType\".\nfunc (s *FederationService) cast_Org_Post_PostType__to__Org_Federation_PostType(from post.PostType) (PostType, error) {\n\tvar ret PostType\n\tswitch from {\n\tcase post.PostType_POST_TYPE_UNKNOWN:\n\t\tret = PostType_TYPE_UNKNOWN\n\tcase post.PostType_POST_TYPE_A:\n\t\tret = PostType_TYPE_A\n\tcase post.PostType_POST_TYPE_B:\n\t\tret = PostType_TYPE_B\n\tdefault:\n\t\tret = 0\n\t}\n\treturn ret, nil\n}\n\n// cast_Org_Post_Post__to__Org_Federation_Post cast from \"org.post.Post\" to \"org.federation.Post\".\nfunc (s *FederationService) cast_Org_Post_Post__to__Org_Federation_Post(from *post.Post) (*Post, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tidValue := from.GetId()\n\ttitleValue := from.GetTitle()\n\tcontentValue := from.GetContent()\n\tuserIdValue := from.GetUserId()\n\tret := &Post{\n\t\tId:      idValue,\n\t\tTitle:   titleValue,\n\t\tContent: contentValue,\n\t\tUserId:  userIdValue,\n\t}\n\n\treturn ret, nil\n}\n\n// cast_int64__to__int32 cast from \"int64\" to \"int32\".\nfunc (s *FederationService) cast_int64__to__int32(from int64) (int32, error) {\n\tret, err := grpcfed.Int64ToInt32(from)\n\tif err != nil {\n\t\treturn ret, err\n\t}\n\treturn ret, nil\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_CreatePost(v *CreatePost) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"title\", v.GetTitle()),\n\t\tslog.String(\"content\", v.GetContent()),\n\t\tslog.String(\"user_id\", v.GetUserId()),\n\t\tslog.String(\"type\", s.logvalue_Org_Federation_PostType(v.GetType()).String()),\n\t\tslog.Int64(\"post_type\", int64(v.GetPostType())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_CreatePostArgument(v *FederationService_Org_Federation_CreatePostArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"title\", v.Title),\n\t\tslog.String(\"content\", v.Content),\n\t\tslog.String(\"user_id\", v.UserId),\n\t\tslog.String(\"type\", s.logvalue_Org_Federation_PostType(v.Type).String()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_CreatePostResponse(v *CreatePostResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"post\", s.logvalue_Org_Federation_Post(v.GetPost())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_CreatePostResponseArgument(v *FederationService_Org_Federation_CreatePostResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"title\", v.Title),\n\t\tslog.String(\"content\", v.Content),\n\t\tslog.String(\"user_id\", v.UserId),\n\t\tslog.String(\"type\", s.logvalue_Org_Federation_PostType(v.Type).String()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_Post(v *Post) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.String(\"title\", v.GetTitle()),\n\t\tslog.String(\"content\", v.GetContent()),\n\t\tslog.String(\"user_id\", v.GetUserId()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_PostType(v PostType) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tswitch v {\n\tcase PostType_TYPE_UNKNOWN:\n\t\treturn slog.StringValue(\"TYPE_UNKNOWN\")\n\tcase PostType_TYPE_A:\n\t\treturn slog.StringValue(\"TYPE_A\")\n\tcase PostType_TYPE_B:\n\t\treturn slog.StringValue(\"TYPE_B\")\n\t}\n\treturn slog.StringValue(\"\")\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_UpdatePostResponse(v *UpdatePostResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_UpdatePostResponseArgument(v *FederationService_Org_Federation_UpdatePostResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_CreatePost(v *post.CreatePost) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"title\", v.GetTitle()),\n\t\tslog.String(\"content\", v.GetContent()),\n\t\tslog.String(\"user_id\", v.GetUserId()),\n\t\tslog.String(\"type\", s.logvalue_Org_Post_PostType(v.GetType()).String()),\n\t\tslog.Int64(\"post_type\", int64(v.GetPostType())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_CreatePostRequest(v *post.CreatePostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"post\", s.logvalue_Org_Post_CreatePost(v.GetPost())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_GetPostRequest(v *post.GetPostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_GetPostsRequest(v *post.GetPostsRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.GetIds()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_PostType(v post.PostType) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tswitch v {\n\tcase post.PostType_POST_TYPE_UNKNOWN:\n\t\treturn slog.StringValue(\"POST_TYPE_UNKNOWN\")\n\tcase post.PostType_POST_TYPE_A:\n\t\treturn slog.StringValue(\"POST_TYPE_A\")\n\tcase post.PostType_POST_TYPE_B:\n\t\treturn slog.StringValue(\"POST_TYPE_B\")\n\t}\n\treturn slog.StringValue(\"\")\n}\n\nfunc (s *FederationService) logvalue_Org_Post_UpdatePostRequest(v *post.UpdatePostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t)\n}\n"
  },
  {
    "path": "generator/testdata/expected_custom_resolver.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: custom_resolver.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n\n\tpost \"example/post\"\n\tuser \"example/user\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Org_Federation_GetPostResponseVariable represents variable definitions in \"org.federation.GetPostResponse\".\ntype FederationService_Org_Federation_GetPostResponseVariable struct {\n\tPost *Post\n}\n\n// Org_Federation_GetPostResponseArgument is argument for \"org.federation.GetPostResponse\" message.\ntype FederationService_Org_Federation_GetPostResponseArgument struct {\n\tId string\n\tFederationService_Org_Federation_GetPostResponseVariable\n}\n\n// Org_Federation_PostVariable represents variable definitions in \"org.federation.Post\".\ntype FederationService_Org_Federation_PostVariable struct {\n\tPost *post.Post\n\tRes  *post.GetPostResponse\n\tUser *User\n}\n\n// Org_Federation_PostArgument is argument for \"org.federation.Post\" message.\ntype FederationService_Org_Federation_PostArgument struct {\n\tId string\n\tFederationService_Org_Federation_PostVariable\n}\n\n// Org_Federation_Post_UserArgument is custom resolver's argument for \"user\" field of \"org.federation.Post\" message.\ntype FederationService_Org_Federation_Post_UserArgument struct {\n\t*FederationService_Org_Federation_PostArgument\n}\n\n// Org_Federation_UserVariable represents variable definitions in \"org.federation.User\".\ntype FederationService_Org_Federation_UserVariable struct {\n\tRes *user.GetUserResponse\n\tU   *user.User\n}\n\n// Org_Federation_UserArgument is argument for \"org.federation.User\" message.\ntype FederationService_Org_Federation_UserArgument struct {\n\tContent string\n\tId      string\n\tTitle   string\n\tUserId  string\n\tFederationService_Org_Federation_UserVariable\n}\n\n// Org_Federation_User_NameArgument is custom resolver's argument for \"name\" field of \"org.federation.User\" message.\ntype FederationService_Org_Federation_User_NameArgument struct {\n\t*FederationService_Org_Federation_UserArgument\n\tOrg_Federation_User *User\n}\n\n// FederationServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationServiceConfig struct {\n\t// Client provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\n\t// If this interface is not provided, an error is returned during initialization.\n\tClient FederationServiceClientFactory // required\n\t// Resolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\n\t// If this interface is not provided, an error is returned during initialization.\n\tResolver FederationServiceResolver // required\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationServiceClientFactory interface {\n\t// Org_Post_PostServiceClient create a gRPC Client to be used to call methods in org.post.PostService.\n\tOrg_Post_PostServiceClient(FederationServiceClientConfig) (post.PostServiceClient, error)\n\t// Org_User_UserServiceClient create a gRPC Client to be used to call methods in org.user.UserService.\n\tOrg_User_UserServiceClient(FederationServiceClientConfig) (user.UserServiceClient, error)\n}\n\n// FederationServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationServiceDependentClientSet struct {\n\tOrg_Post_PostServiceClient post.PostServiceClient\n\tOrg_User_UserServiceClient user.UserServiceClient\n}\n\n// FederationServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationServiceResolver interface {\n\t// Resolve_Org_Federation_Post_User implements resolver for \"org.federation.Post.user\".\n\tResolve_Org_Federation_Post_User(context.Context, *FederationService_Org_Federation_Post_UserArgument) (*User, error)\n\t// Resolve_Org_Federation_User implements resolver for \"org.federation.User\".\n\tResolve_Org_Federation_User(context.Context, *FederationService_Org_Federation_UserArgument) (*User, error)\n\t// Resolve_Org_Federation_User_Name implements resolver for \"org.federation.User.name\".\n\tResolve_Org_Federation_User_Name(context.Context, *FederationService_Org_Federation_User_NameArgument) (string, error)\n}\n\n// FederationServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// FederationServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationServiceUnimplementedResolver struct{}\n\n// Resolve_Org_Federation_Post_User resolve \"org.federation.Post.user\".\n// This method always returns Unimplemented error.\nfunc (FederationServiceUnimplementedResolver) Resolve_Org_Federation_Post_User(context.Context, *FederationService_Org_Federation_Post_UserArgument) (ret *User, e error) {\n\te = grpcfed.GRPCErrorf(grpcfed.UnimplementedCode, \"method Resolve_Org_Federation_Post_User not implemented\")\n\treturn\n}\n\n// Resolve_Org_Federation_User resolve \"org.federation.User\".\n// This method always returns Unimplemented error.\nfunc (FederationServiceUnimplementedResolver) Resolve_Org_Federation_User(context.Context, *FederationService_Org_Federation_UserArgument) (ret *User, e error) {\n\te = grpcfed.GRPCErrorf(grpcfed.UnimplementedCode, \"method Resolve_Org_Federation_User not implemented\")\n\treturn\n}\n\n// Resolve_Org_Federation_User_Name resolve \"org.federation.User.name\".\n// This method always returns Unimplemented error.\nfunc (FederationServiceUnimplementedResolver) Resolve_Org_Federation_User_Name(context.Context, *FederationService_Org_Federation_User_NameArgument) (ret string, e error) {\n\te = grpcfed.GRPCErrorf(grpcfed.UnimplementedCode, \"method Resolve_Org_Federation_User_Name not implemented\")\n\treturn\n}\n\nconst (\n\tFederationService_DependentMethod_Org_Post_PostService_GetPost = \"/org.post.PostService/GetPost\"\n\tFederationService_DependentMethod_Org_User_UserService_GetUser = \"/org.user.UserService/GetUser\"\n)\n\n// FederationService represents Federation Service.\ntype FederationService struct {\n\tUnimplementedFederationServiceServer\n\tcfg             FederationServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tresolver        FederationServiceResolver\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationServiceDependentClientSet\n}\n\n// NewFederationService creates FederationService instance by FederationServiceConfig.\nfunc NewFederationService(cfg FederationServiceConfig) (*FederationService, error) {\n\tif cfg.Client == nil {\n\t\treturn nil, grpcfed.ErrClientConfig\n\t}\n\tif cfg.Resolver == nil {\n\t\treturn nil, grpcfed.ErrResolverConfig\n\t}\n\tOrg_Post_PostServiceClient, err := cfg.Client.Org_Post_PostServiceClient(FederationServiceClientConfig{\n\t\tService: \"org.post.PostService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tOrg_User_UserServiceClient, err := cfg.Client.Org_User_UserServiceClient(FederationServiceClientConfig{\n\t\tService: \"org.user.UserService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"org.federation.FederationService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.org.federation.GetPostResponseArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.PostArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.UserArgument\": {\n\t\t\t\"id\":      grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t\t\"title\":   grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Title\"),\n\t\t\t\"content\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Content\"),\n\t\t\t\"user_id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"UserId\"),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"org.federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.GRPCErrorAccessorOptions(celTypeHelper, \"org.post.GetPostResponse\")...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.GRPCErrorAccessorOptions(celTypeHelper, \"org.user.GetUserResponse\")...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.post.PostType\", post.PostType_value, post.PostType_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.user.Item.ItemType\", user.Item_ItemType_value, user.Item_ItemType_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.user.UserType\", user.UserType_value, user.UserType_name)...)\n\tsvc := &FederationService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tresolver:        cfg.Resolver,\n\t\tclient: &FederationServiceDependentClientSet{\n\t\t\tOrg_Post_PostServiceClient: Org_Post_PostServiceClient,\n\t\t\tOrg_User_UserServiceClient: Org_User_UserServiceClient,\n\t\t},\n\t}\n\tif resolver, ok := cfg.Resolver.(grpcfed.CustomResolverInitializer); ok {\n\t\tctx := context.Background()\n\t\tif err := resolver.Init(ctx); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationService(ctx context.Context, svc *FederationService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n// GetPost implements \"org.federation.FederationService/GetPost\" method.\nfunc (s *FederationService) GetPost(ctx context.Context, req *GetPostRequest) (res *GetPostResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.FederationService/GetPost\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Org_Federation_GetPostResponse(ctx, &FederationService_Org_Federation_GetPostResponseArgument{\n\t\tId: req.GetId(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Org_Federation_GetPostResponse resolve \"org.federation.GetPostResponse\" message.\nfunc (s *FederationService) resolve_Org_Federation_GetPostResponse(ctx context.Context, req *FederationService_Org_Federation_GetPostResponseArgument) (*GetPostResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.GetPostResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.GetPostResponse\", slog.Any(\"message_args\", s.logvalue_Org_Federation_GetPostResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tPost *Post\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.GetPostResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"post\"\n\t\t  message {\n\t\t    name: \"Post\"\n\t\t    args { name: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_post := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Post, *localValueType]{\n\t\t\tName: `post`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.Post\"),\n\t\t\tSetter: func(value *localValueType, v *Post) error {\n\t\t\t\tvalue.vars.Post = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_PostArgument{}\n\t\t\t\t// { name: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 1,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_Post(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_post(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_GetPostResponseVariable.Post = value.vars.Post\n\n\t// create a message value to be returned.\n\tret := &GetPostResponse{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"post\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*Post]{\n\t\tValue:      value,\n\t\tExpr:       `post`,\n\t\tCacheIndex: 2,\n\t\tSetter: func(v *Post) error {\n\t\t\tret.Post = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.GetPostResponse\", slog.Any(\"org.federation.GetPostResponse\", s.logvalue_Org_Federation_GetPostResponse(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_Post resolve \"org.federation.Post\" message.\nfunc (s *FederationService) resolve_Org_Federation_Post(ctx context.Context, req *FederationService_Org_Federation_PostArgument) (*Post, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.Post\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.Post\", slog.Any(\"message_args\", s.logvalue_Org_Federation_PostArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tPost *post.Post\n\t\t\tRes  *post.GetPostResponse\n\t\t\tUser *User\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.PostArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"org.post.PostService/GetPost\"\n\t\t    request { field: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.GetPostResponse, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"org.post.GetPostResponse\"),\n\t\t\tSetter: func(value *localValueType, v *post.GetPostResponse) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &post.GetPostRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 3,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call org.post.PostService/GetPost\", slog.Any(\"org.post.GetPostRequest\", s.logvalue_Org_Post_GetPostRequest(args)))\n\t\t\t\tret, err := s.client.Org_Post_PostServiceClient.GetPost(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Org_Post_PostService_GetPost, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"post\"\n\t\t  autobind: true\n\t\t  by: \"res.post\"\n\t\t}\n\t*/\n\tdef_post := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.Post, *localValueType]{\n\t\t\tName: `post`,\n\t\t\tType: grpcfed.CELObjectType(\"org.post.Post\"),\n\t\t\tSetter: func(value *localValueType, v *post.Post) error {\n\t\t\t\tvalue.vars.Post = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `res.post`,\n\t\t\tByCacheIndex: 4,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"user\"\n\t\t  message {\n\t\t    name: \"User\"\n\t\t    args { inline: \"post\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_user := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*User, *localValueType]{\n\t\t\tName: `user`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.User\"),\n\t\t\tSetter: func(value *localValueType, v *User) error {\n\t\t\t\tvalue.vars.User = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_UserArgument{}\n\t\t\t\t// { inline: \"post\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*post.Post]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `post`,\n\t\t\t\t\tCacheIndex: 5,\n\t\t\t\t\tSetter: func(v *post.Post) error {\n\t\t\t\t\t\targs.Id = v.GetId()\n\t\t\t\t\t\targs.Title = v.GetTitle()\n\t\t\t\t\t\targs.Content = v.GetContent()\n\t\t\t\t\t\targs.UserId = v.GetUserId()\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_User(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_res(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\tif err := def_post(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\tif err := def_user(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_PostVariable.Post = value.vars.Post\n\treq.FederationService_Org_Federation_PostVariable.Res = value.vars.Res\n\treq.FederationService_Org_Federation_PostVariable.User = value.vars.User\n\n\t// create a message value to be returned.\n\tret := &Post{}\n\n\t// field binding section.\n\tret.Id = value.vars.Post.GetId()           // { name: \"post\", autobind: true }\n\tret.Title = value.vars.Post.GetTitle()     // { name: \"post\", autobind: true }\n\tret.Content = value.vars.Post.GetContent() // { name: \"post\", autobind: true }\n\t{\n\t\t// (grpc.federation.field).custom_resolver = true\n\t\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx)) // create a new reference to logger.\n\t\tvar err error\n\t\tret.User, err = s.resolver.Resolve_Org_Federation_Post_User(ctx, &FederationService_Org_Federation_Post_UserArgument{\n\t\t\tFederationService_Org_Federation_PostArgument: req,\n\t\t})\n\t\tif err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.Post\", slog.Any(\"org.federation.Post\", s.logvalue_Org_Federation_Post(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_User resolve \"org.federation.User\" message.\nfunc (s *FederationService) resolve_Org_Federation_User(ctx context.Context, req *FederationService_Org_Federation_UserArgument) (*User, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.User\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.User\", slog.Any(\"message_args\", s.logvalue_Org_Federation_UserArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tRes *user.GetUserResponse\n\t\t\tU   *user.User\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.UserArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"org.user.UserService/GetUser\"\n\t\t    request { field: \"id\", by: \"$.user_id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*user.GetUserResponse, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"org.user.GetUserResponse\"),\n\t\t\tSetter: func(value *localValueType, v *user.GetUserResponse) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &user.GetUserRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.user_id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.user_id`,\n\t\t\t\t\tCacheIndex: 6,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call org.user.UserService/GetUser\", slog.Any(\"org.user.GetUserRequest\", s.logvalue_Org_User_GetUserRequest(args)))\n\t\t\t\tret, err := s.client.Org_User_UserServiceClient.GetUser(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Org_User_UserService_GetUser, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"u\"\n\t\t  by: \"res.user\"\n\t\t}\n\t*/\n\tdef_u := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*user.User, *localValueType]{\n\t\t\tName: `u`,\n\t\t\tType: grpcfed.CELObjectType(\"org.user.User\"),\n\t\t\tSetter: func(value *localValueType, v *user.User) error {\n\t\t\t\tvalue.vars.U = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `res.user`,\n\t\t\tByCacheIndex: 7,\n\t\t})\n\t}\n\n\tif err := def_res(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\tif err := def_u(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_UserVariable.Res = value.vars.Res\n\treq.FederationService_Org_Federation_UserVariable.U = value.vars.U\n\n\t// create a message value to be returned.\n\t// `custom_resolver = true` in \"grpc.federation.message\" option.\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx)) // create a new reference to logger.\n\tret, err := s.resolver.Resolve_Org_Federation_User(ctx, req)\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// field binding section.\n\t{\n\t\t// (grpc.federation.field).custom_resolver = true\n\t\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx)) // create a new reference to logger.\n\t\tvar err error\n\t\tret.Name, err = s.resolver.Resolve_Org_Federation_User_Name(ctx, &FederationService_Org_Federation_User_NameArgument{\n\t\t\tFederationService_Org_Federation_UserArgument: req,\n\t\t\tOrg_Federation_User:                           ret,\n\t\t})\n\t\tif err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.User\", slog.Any(\"org.federation.User\", s.logvalue_Org_Federation_User(ret)))\n\treturn ret, nil\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostResponse(v *GetPostResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"post\", s.logvalue_Org_Federation_Post(v.GetPost())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostResponseArgument(v *FederationService_Org_Federation_GetPostResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_Post(v *Post) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.String(\"title\", v.GetTitle()),\n\t\tslog.String(\"content\", v.GetContent()),\n\t\tslog.Any(\"user\", s.logvalue_Org_Federation_User(v.GetUser())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_PostArgument(v *FederationService_Org_Federation_PostArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_User(v *User) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_UserArgument(v *FederationService_Org_Federation_UserArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t\tslog.String(\"title\", v.Title),\n\t\tslog.String(\"content\", v.Content),\n\t\tslog.String(\"user_id\", v.UserId),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_CreatePost(v *post.CreatePost) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"title\", v.GetTitle()),\n\t\tslog.String(\"content\", v.GetContent()),\n\t\tslog.String(\"user_id\", v.GetUserId()),\n\t\tslog.String(\"type\", s.logvalue_Org_Post_PostType(v.GetType()).String()),\n\t\tslog.Int64(\"post_type\", int64(v.GetPostType())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_CreatePostRequest(v *post.CreatePostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"post\", s.logvalue_Org_Post_CreatePost(v.GetPost())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_GetPostRequest(v *post.GetPostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_GetPostsRequest(v *post.GetPostsRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.GetIds()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_PostType(v post.PostType) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tswitch v {\n\tcase post.PostType_POST_TYPE_UNKNOWN:\n\t\treturn slog.StringValue(\"POST_TYPE_UNKNOWN\")\n\tcase post.PostType_POST_TYPE_A:\n\t\treturn slog.StringValue(\"POST_TYPE_A\")\n\tcase post.PostType_POST_TYPE_B:\n\t\treturn slog.StringValue(\"POST_TYPE_B\")\n\t}\n\treturn slog.StringValue(\"\")\n}\n\nfunc (s *FederationService) logvalue_Org_Post_UpdatePostRequest(v *post.UpdatePostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_User_GetUserRequest(v *user.GetUserRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.Int64(\"foo\", v.GetFoo()),\n\t\tslog.String(\"bar\", v.GetBar()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_User_GetUsersRequest(v *user.GetUsersRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.GetIds()),\n\t)\n}\n"
  },
  {
    "path": "generator/testdata/expected_env.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: dev\n//\n// source: env.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Org_Federation_EnvArgument is argument for \"org.federation.Env\" message.\ntype Org_Federation_EnvArgument struct {\n}\n\n// InlineEnvServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype InlineEnvServiceConfig struct {\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// InlineEnvServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype InlineEnvServiceClientFactory interface {\n}\n\n// InlineEnvServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype InlineEnvServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// InlineEnvServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype InlineEnvServiceDependentClientSet struct {\n}\n\n// InlineEnvServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype InlineEnvServiceResolver interface {\n}\n\n// InlineEnvServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype InlineEnvServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// InlineEnvServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype InlineEnvServiceCELPluginConfig struct {\n}\n\n// InlineEnvServiceEnv keeps the values read from environment variables.\ntype InlineEnvServiceEnv struct {\n\tAaa string                      `default:\"xxx\"`\n\tBbb []int64                     `envconfig:\"yyy\"`\n\tCcc map[string]grpcfed.Duration `envconfig:\"c\" required:\"true\"`\n\tDdd float64                     `ignored:\"true\"`\n}\n\ntype keyInlineEnvServiceEnv struct{}\n\n// GetInlineEnvServiceEnv gets environment variables.\nfunc GetInlineEnvServiceEnv(ctx context.Context) *InlineEnvServiceEnv {\n\tvalue := ctx.Value(keyInlineEnvServiceEnv{})\n\tif value == nil {\n\t\treturn nil\n\t}\n\treturn value.(*InlineEnvServiceEnv)\n}\n\nfunc withInlineEnvServiceEnv(ctx context.Context, env *InlineEnvServiceEnv) context.Context {\n\treturn context.WithValue(ctx, keyInlineEnvServiceEnv{}, env)\n}\n\n// InlineEnvServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype InlineEnvServiceUnimplementedResolver struct{}\n\n// InlineEnvService represents Federation Service.\ntype InlineEnvService struct {\n\tUnimplementedInlineEnvServiceServer\n\tcfg           InlineEnvServiceConfig\n\tlogger        *slog.Logger\n\terrorHandler  grpcfed.ErrorHandler\n\tcelCacheMap   *grpcfed.CELCacheMap\n\ttracer        trace.Tracer\n\tenv           *InlineEnvServiceEnv\n\tcelTypeHelper *grpcfed.CELTypeHelper\n\tcelEnvOpts    []grpcfed.CELEnvOption\n\tcelPlugins    []*grpcfedcel.CELPlugin\n\tclient        *InlineEnvServiceDependentClientSet\n}\n\n// NewInlineEnvService creates InlineEnvService instance by InlineEnvServiceConfig.\nfunc NewInlineEnvService(cfg InlineEnvServiceConfig) (*InlineEnvService, error) {\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.Env\": {\n\t\t\t\"aaa\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Aaa\"),\n\t\t\t\"bbb\": grpcfed.NewCELFieldType(grpcfed.NewCELListType(grpcfed.CELIntType), \"Bbb\"),\n\t\t\t\"ccc\": grpcfed.NewCELFieldType(grpcfed.NewCELMapType(grpcfed.CELStringType, grpcfed.CELDurationType), \"Ccc\"),\n\t\t\t\"ddd\": grpcfed.NewCELFieldType(grpcfed.CELDoubleType, \"Ddd\"),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.CELVariable(\"grpc.federation.env\", grpcfed.CELObjectType(\"grpc.federation.private.Env\")))\n\tvar env InlineEnvServiceEnv\n\tif err := grpcfed.LoadEnv(\"\", &env); err != nil {\n\t\treturn nil, err\n\t}\n\treturn &InlineEnvService{\n\t\tcfg:           cfg,\n\t\tlogger:        logger,\n\t\terrorHandler:  errorHandler,\n\t\tcelEnvOpts:    celEnvOpts,\n\t\tcelTypeHelper: celTypeHelper,\n\t\tcelCacheMap:   grpcfed.NewCELCacheMap(),\n\t\ttracer:        otel.Tracer(\"org.federation.InlineEnvService\"),\n\t\tenv:           &env,\n\t\tclient:        &InlineEnvServiceDependentClientSet{},\n\t}, nil\n}\n\n// RefEnvServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype RefEnvServiceConfig struct {\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// RefEnvServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype RefEnvServiceClientFactory interface {\n}\n\n// RefEnvServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype RefEnvServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// RefEnvServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype RefEnvServiceDependentClientSet struct {\n}\n\n// RefEnvServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype RefEnvServiceResolver interface {\n}\n\n// RefEnvServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype RefEnvServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// RefEnvServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype RefEnvServiceCELPluginConfig struct {\n}\n\n// RefEnvServiceEnv keeps the values read from environment variables.\ntype RefEnvServiceEnv struct {\n\tAaa string                      `default:\"xxx\"`\n\tBbb []int64                     `envconfig:\"yyy\"`\n\tCcc map[string]grpcfed.Duration `envconfig:\"c\" required:\"true\"`\n\tDdd float64                     `ignored:\"true\"`\n}\n\ntype keyRefEnvServiceEnv struct{}\n\n// GetRefEnvServiceEnv gets environment variables.\nfunc GetRefEnvServiceEnv(ctx context.Context) *RefEnvServiceEnv {\n\tvalue := ctx.Value(keyRefEnvServiceEnv{})\n\tif value == nil {\n\t\treturn nil\n\t}\n\treturn value.(*RefEnvServiceEnv)\n}\n\nfunc withRefEnvServiceEnv(ctx context.Context, env *RefEnvServiceEnv) context.Context {\n\treturn context.WithValue(ctx, keyRefEnvServiceEnv{}, env)\n}\n\n// RefEnvServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype RefEnvServiceUnimplementedResolver struct{}\n\n// RefEnvService represents Federation Service.\ntype RefEnvService struct {\n\tUnimplementedRefEnvServiceServer\n\tcfg           RefEnvServiceConfig\n\tlogger        *slog.Logger\n\terrorHandler  grpcfed.ErrorHandler\n\tcelCacheMap   *grpcfed.CELCacheMap\n\ttracer        trace.Tracer\n\tenv           *RefEnvServiceEnv\n\tcelTypeHelper *grpcfed.CELTypeHelper\n\tcelEnvOpts    []grpcfed.CELEnvOption\n\tcelPlugins    []*grpcfedcel.CELPlugin\n\tclient        *RefEnvServiceDependentClientSet\n}\n\n// NewRefEnvService creates RefEnvService instance by RefEnvServiceConfig.\nfunc NewRefEnvService(cfg RefEnvServiceConfig) (*RefEnvService, error) {\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.Env\": {\n\t\t\t\"aaa\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Aaa\"),\n\t\t\t\"bbb\": grpcfed.NewCELFieldType(grpcfed.NewCELListType(grpcfed.CELIntType), \"Bbb\"),\n\t\t\t\"ccc\": grpcfed.NewCELFieldType(grpcfed.NewCELMapType(grpcfed.CELStringType, grpcfed.NewCELObjectType(\"google.protobuf.Duration\")), \"Ccc\"),\n\t\t\t\"ddd\": grpcfed.NewCELFieldType(grpcfed.CELDoubleType, \"Ddd\"),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.CELVariable(\"grpc.federation.env\", grpcfed.CELObjectType(\"grpc.federation.private.Env\")))\n\tvar env RefEnvServiceEnv\n\tif err := grpcfed.LoadEnv(\"\", &env); err != nil {\n\t\treturn nil, err\n\t}\n\treturn &RefEnvService{\n\t\tcfg:           cfg,\n\t\tlogger:        logger,\n\t\terrorHandler:  errorHandler,\n\t\tcelEnvOpts:    celEnvOpts,\n\t\tcelTypeHelper: celTypeHelper,\n\t\tcelCacheMap:   grpcfed.NewCELCacheMap(),\n\t\ttracer:        otel.Tracer(\"org.federation.RefEnvService\"),\n\t\tenv:           &env,\n\t\tclient:        &RefEnvServiceDependentClientSet{},\n\t}, nil\n}\n"
  },
  {
    "path": "generator/testdata/expected_error_handler.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: error_handler.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n\n\tpost \"example/post\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Org_Federation_CustomMessageVariable represents variable definitions in \"org.federation.CustomMessage\".\ntype FederationService_Org_Federation_CustomMessageVariable struct {\n}\n\n// Org_Federation_CustomMessageArgument is argument for \"org.federation.CustomMessage\" message.\ntype FederationService_Org_Federation_CustomMessageArgument struct {\n\tMsg string\n\tFederationService_Org_Federation_CustomMessageVariable\n}\n\n// Org_Federation_GetPostResponseVariable represents variable definitions in \"org.federation.GetPostResponse\".\ntype FederationService_Org_Federation_GetPostResponseVariable struct {\n\tPost *Post\n}\n\n// Org_Federation_GetPostResponseArgument is argument for \"org.federation.GetPostResponse\" message.\ntype FederationService_Org_Federation_GetPostResponseArgument struct {\n\tId string\n\tFederationService_Org_Federation_GetPostResponseVariable\n}\n\n// Org_Federation_LocalizedMessageVariable represents variable definitions in \"org.federation.LocalizedMessage\".\ntype FederationService_Org_Federation_LocalizedMessageVariable struct {\n}\n\n// Org_Federation_LocalizedMessageArgument is argument for \"org.federation.LocalizedMessage\" message.\ntype FederationService_Org_Federation_LocalizedMessageArgument struct {\n\tValue string\n\tFederationService_Org_Federation_LocalizedMessageVariable\n}\n\n// Org_Federation_PostVariable represents variable definitions in \"org.federation.Post\".\ntype FederationService_Org_Federation_PostVariable struct {\n\tId                  string\n\tLocalizedMsg        *LocalizedMessage\n\tPost                *post.Post\n\tRes                 *post.GetPostResponse\n\tXDef0ErrDetail0Msg0 *CustomMessage\n}\n\n// Org_Federation_PostArgument is argument for \"org.federation.Post\" message.\ntype FederationService_Org_Federation_PostArgument struct {\n\tId string\n\tFederationService_Org_Federation_PostVariable\n}\n\n// FederationServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationServiceConfig struct {\n\t// Client provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\n\t// If this interface is not provided, an error is returned during initialization.\n\tClient FederationServiceClientFactory // required\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationServiceClientFactory interface {\n\t// Org_Post_PostServiceClient create a gRPC Client to be used to call methods in org.post.PostService.\n\tOrg_Post_PostServiceClient(FederationServiceClientConfig) (post.PostServiceClient, error)\n}\n\n// FederationServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationServiceDependentClientSet struct {\n\tOrg_Post_PostServiceClient post.PostServiceClient\n}\n\n// FederationServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationServiceResolver interface {\n}\n\n// FederationServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// FederationServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationServiceUnimplementedResolver struct{}\n\nconst (\n\tFederationService_DependentMethod_Org_Post_PostService_GetPost = \"/org.post.PostService/GetPost\"\n)\n\n// FederationService represents Federation Service.\ntype FederationService struct {\n\tUnimplementedFederationServiceServer\n\tcfg             FederationServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationServiceDependentClientSet\n}\n\n// NewFederationService creates FederationService instance by FederationServiceConfig.\nfunc NewFederationService(cfg FederationServiceConfig) (*FederationService, error) {\n\tif cfg.Client == nil {\n\t\treturn nil, grpcfed.ErrClientConfig\n\t}\n\tOrg_Post_PostServiceClient, err := cfg.Client.Org_Post_PostServiceClient(FederationServiceClientConfig{\n\t\tService: \"org.post.PostService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"org.federation.FederationService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.org.federation.CustomMessageArgument\": {\n\t\t\t\"msg\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Msg\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.GetPostResponseArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.LocalizedMessageArgument\": {\n\t\t\t\"value\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Value\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.PostArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"org.federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.GRPCErrorAccessorOptions(celTypeHelper, \"org.post.GetPostResponse\")...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.post.PostType\", post.PostType_value, post.PostType_name)...)\n\tsvc := &FederationService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tclient: &FederationServiceDependentClientSet{\n\t\t\tOrg_Post_PostServiceClient: Org_Post_PostServiceClient,\n\t\t},\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationService(ctx context.Context, svc *FederationService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n// GetPost implements \"org.federation.FederationService/GetPost\" method.\nfunc (s *FederationService) GetPost(ctx context.Context, req *GetPostRequest) (res *GetPostResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.FederationService/GetPost\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Org_Federation_GetPostResponse(ctx, &FederationService_Org_Federation_GetPostResponseArgument{\n\t\tId: req.GetId(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Org_Federation_CustomMessage resolve \"org.federation.CustomMessage\" message.\nfunc (s *FederationService) resolve_Org_Federation_CustomMessage(ctx context.Context, req *FederationService_Org_Federation_CustomMessageArgument) (*CustomMessage, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.CustomMessage\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.CustomMessage\", slog.Any(\"message_args\", s.logvalue_Org_Federation_CustomMessageArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.CustomMessageArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &CustomMessage{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'custom error message:' + $.msg\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'custom error message:' + $.msg`,\n\t\tCacheIndex: 1,\n\t\tSetter: func(v string) error {\n\t\t\tret.Msg = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.CustomMessage\", slog.Any(\"org.federation.CustomMessage\", s.logvalue_Org_Federation_CustomMessage(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_GetPostResponse resolve \"org.federation.GetPostResponse\" message.\nfunc (s *FederationService) resolve_Org_Federation_GetPostResponse(ctx context.Context, req *FederationService_Org_Federation_GetPostResponseArgument) (*GetPostResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.GetPostResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.GetPostResponse\", slog.Any(\"message_args\", s.logvalue_Org_Federation_GetPostResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tPost *Post\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.GetPostResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"post\"\n\t\t  message {\n\t\t    name: \"Post\"\n\t\t    args { name: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_post := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Post, *localValueType]{\n\t\t\tName: `post`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.Post\"),\n\t\t\tSetter: func(value *localValueType, v *Post) error {\n\t\t\t\tvalue.vars.Post = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_PostArgument{}\n\t\t\t\t// { name: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 2,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_Post(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_post(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_GetPostResponseVariable.Post = value.vars.Post\n\n\t// create a message value to be returned.\n\tret := &GetPostResponse{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"post\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*Post]{\n\t\tValue:      value,\n\t\tExpr:       `post`,\n\t\tCacheIndex: 3,\n\t\tSetter: func(v *Post) error {\n\t\t\tret.Post = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.GetPostResponse\", slog.Any(\"org.federation.GetPostResponse\", s.logvalue_Org_Federation_GetPostResponse(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_LocalizedMessage resolve \"org.federation.LocalizedMessage\" message.\nfunc (s *FederationService) resolve_Org_Federation_LocalizedMessage(ctx context.Context, req *FederationService_Org_Federation_LocalizedMessageArgument) (*LocalizedMessage, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.LocalizedMessage\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.LocalizedMessage\", slog.Any(\"message_args\", s.logvalue_Org_Federation_LocalizedMessageArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.LocalizedMessageArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &LocalizedMessage{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'localized value:' + $.value\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'localized value:' + $.value`,\n\t\tCacheIndex: 4,\n\t\tSetter: func(v string) error {\n\t\t\tret.Value = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.LocalizedMessage\", slog.Any(\"org.federation.LocalizedMessage\", s.logvalue_Org_Federation_LocalizedMessage(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_Post resolve \"org.federation.Post\" message.\nfunc (s *FederationService) resolve_Org_Federation_Post(ctx context.Context, req *FederationService_Org_Federation_PostArgument) (*Post, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.Post\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.Post\", slog.Any(\"message_args\", s.logvalue_Org_Federation_PostArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tId                  string\n\t\t\tLocalizedMsg        *LocalizedMessage\n\t\t\tPost                *post.Post\n\t\t\tRes                 *post.GetPostResponse\n\t\t\tXDef0ErrDetail0Msg0 *CustomMessage\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.PostArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"org.post.PostService/GetPost\"\n\t\t    request { field: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.GetPostResponse, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"org.post.GetPostResponse\"),\n\t\t\tSetter: func(value *localValueType, v *post.GetPostResponse) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &post.GetPostRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 5,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call org.post.PostService/GetPost\", slog.Any(\"org.post.GetPostRequest\", s.logvalue_Org_Post_GetPostRequest(args)))\n\t\t\t\tret, err := s.client.Org_Post_PostServiceClient.GetPost(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgrpcErr := grpcfed.ToGRPCError(ctx, err)\n\t\t\t\t\tctx = grpcfed.WithGRPCError(ctx, grpcErr)\n\t\t\t\t\tvar (\n\t\t\t\t\t\tdefaultMsg     string\n\t\t\t\t\t\tdefaultCode    grpcfed.Code\n\t\t\t\t\t\tdefaultDetails []grpcfed.ProtoMessage\n\t\t\t\t\t)\n\t\t\t\t\tif stat, exists := grpcfed.GRPCStatusFromError(err); exists {\n\t\t\t\t\t\tdefaultMsg = stat.Message()\n\t\t\t\t\t\tdefaultCode = stat.Code()\n\t\t\t\t\t\tdetails := stat.Details()\n\t\t\t\t\t\tdefaultDetails = make([]grpcfed.ProtoMessage, 0, len(details))\n\t\t\t\t\t\tfor _, detail := range details {\n\t\t\t\t\t\t\tmsg, ok := detail.(grpcfed.ProtoMessage)\n\t\t\t\t\t\t\tif ok {\n\t\t\t\t\t\t\t\tdefaultDetails = append(defaultDetails, msg)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t_ = defaultMsg\n\t\t\t\t\t\t_ = defaultCode\n\t\t\t\t\t\t_ = defaultDetails\n\t\t\t\t\t}\n\n\t\t\t\t\ttype localStatusType struct {\n\t\t\t\t\t\tstatus   *grpcfed.Status\n\t\t\t\t\t\tlogLevel slog.Level\n\t\t\t\t\t}\n\t\t\t\t\tstat, handleErr := func() (*localStatusType, error) {\n\t\t\t\t\t\tvar stat *grpcfed.Status\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t\tdef {\n\t\t\t\t\t\t\t\t  name: \"id\"\n\t\t\t\t\t\t\t\t  by: \"$.id\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\tdef_id := func(ctx context.Context) error {\n\t\t\t\t\t\t\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[string, *localValueType]{\n\t\t\t\t\t\t\t\t\tName: `id`,\n\t\t\t\t\t\t\t\t\tType: grpcfed.CELStringType,\n\t\t\t\t\t\t\t\t\tSetter: func(value *localValueType, v string) error {\n\t\t\t\t\t\t\t\t\t\tvalue.vars.Id = v\n\t\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tBy:           `$.id`,\n\t\t\t\t\t\t\t\t\tByCacheIndex: 6,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif err := def_id(ctx); err != nil {\n\t\t\t\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\t\tExpr:       `error.precondition_failures.map(f, f.violations[0]).first(v, v.subject == '').?subject == optional.of('')`,\n\t\t\t\t\t\t\t\tCacheIndex: 7,\n\t\t\t\t\t\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t\t\t\t\t\terrmsg, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\t\t\t\tExpr:       `'id must be not empty'`,\n\t\t\t\t\t\t\t\t\t\tOutType:    reflect.TypeOf(\"\"),\n\t\t\t\t\t\t\t\t\t\tCacheIndex: 8,\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\terrorMessage := errmsg.(string)\n\t\t\t\t\t\t\t\t\tvar details []grpcfed.ProtoMessage\n\t\t\t\t\t\t\t\t\tif _, err := func() (any, error) {\n\t\t\t\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t\t\t\t\tdef {\n\t\t\t\t\t\t\t\t\t\t\t  name: \"localized_msg\"\n\t\t\t\t\t\t\t\t\t\t\t  message {\n\t\t\t\t\t\t\t\t\t\t\t    name: \"LocalizedMessage\"\n\t\t\t\t\t\t\t\t\t\t\t    args { name: \"value\", by: \"id\" }\n\t\t\t\t\t\t\t\t\t\t\t  }\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\t\t\t\tdef_localized_msg := func(ctx context.Context) error {\n\t\t\t\t\t\t\t\t\t\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*LocalizedMessage, *localValueType]{\n\t\t\t\t\t\t\t\t\t\t\t\tName: `localized_msg`,\n\t\t\t\t\t\t\t\t\t\t\t\tType: grpcfed.CELObjectType(\"org.federation.LocalizedMessage\"),\n\t\t\t\t\t\t\t\t\t\t\t\tSetter: func(value *localValueType, v *LocalizedMessage) error {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvalue.vars.LocalizedMsg = v\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\t\t\t\t\t\t\t\t\t\targs := &FederationService_Org_Federation_LocalizedMessageArgument{}\n\t\t\t\t\t\t\t\t\t\t\t\t\t// { name: \"value\", by: \"id\" }\n\t\t\t\t\t\t\t\t\t\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tExpr:       `id`,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tCacheIndex: 9,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\targs.Value = v\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tret, err := s.resolve_Org_Federation_LocalizedMessage(ctx, args)\n\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn ret, nil\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif err := def_localized_msg(ctx); err != nil {\n\t\t\t\t\t\t\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\treturn nil, nil\n\t\t\t\t\t\t\t\t\t}(); err != nil {\n\t\t\t\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\t\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\t\t\t\tExpr:       `true`,\n\t\t\t\t\t\t\t\t\t\tCacheIndex: 10,\n\t\t\t\t\t\t\t\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t\t\t\t\t\t\t\tif _, err := func() (any, error) {\n\t\t\t\t\t\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t\t\t\t\t\t\tdef {\n\t\t\t\t\t\t\t\t\t\t\t\t\t  name: \"_def0_err_detail0_msg0\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t  message {\n\t\t\t\t\t\t\t\t\t\t\t\t\t    name: \"CustomMessage\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t    args { name: \"msg\", by: \"id\" }\n\t\t\t\t\t\t\t\t\t\t\t\t\t  }\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\t\t\t\t\t\tdef__def0_err_detail0_msg0 := func(ctx context.Context) error {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*CustomMessage, *localValueType]{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tName: `_def0_err_detail0_msg0`,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tType: grpcfed.CELObjectType(\"org.federation.CustomMessage\"),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetter: func(value *localValueType, v *CustomMessage) error {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue.vars.XDef0ErrDetail0Msg0 = v\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\targs := &FederationService_Org_Federation_CustomMessageArgument{}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// { name: \"msg\", by: \"id\" }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tExpr:       `id`,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tCacheIndex: 11,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\targs.Msg = v\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tret, err := s.resolve_Org_Federation_CustomMessage(ctx, args)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn ret, nil\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tif err := def__def0_err_detail0_msg0(ctx); err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\treturn nil, nil\n\t\t\t\t\t\t\t\t\t\t\t}(); err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tif detail := grpcfed.CustomMessage(ctx, &grpcfed.CustomMessageParam{\n\t\t\t\t\t\t\t\t\t\t\t\tValue:            value,\n\t\t\t\t\t\t\t\t\t\t\t\tMessageValueName: \"_def0_err_detail0_msg0\",\n\t\t\t\t\t\t\t\t\t\t\t\tCacheIndex:       12,\n\t\t\t\t\t\t\t\t\t\t\t\tMessageIndex:     0,\n\t\t\t\t\t\t\t\t\t\t\t}); detail != nil {\n\t\t\t\t\t\t\t\t\t\t\t\tdetails = append(details, detail)\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tdetail, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\t\t\t\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\t\t\t\t\t\t\tExpr:       `org.post.Post{id: 'foo'}`,\n\t\t\t\t\t\t\t\t\t\t\t\t\tOutType:    reflect.TypeOf((*post.Post)(nil)),\n\t\t\t\t\t\t\t\t\t\t\t\t\tCacheIndex: 13,\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\tgrpcfed.Logger(ctx).ErrorContext(ctx, \"failed setting error details\", slog.String(\"error\", err.Error()))\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tif detail != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\tdetails = append(details, detail.(grpcfed.ProtoMessage))\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tdetail, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\t\t\t\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\t\t\t\t\t\t\tExpr:       `org.post.CreatePost{title: 'bar'}`,\n\t\t\t\t\t\t\t\t\t\t\t\t\tOutType:    reflect.TypeOf((*post.CreatePost)(nil)),\n\t\t\t\t\t\t\t\t\t\t\t\t\tCacheIndex: 14,\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\tgrpcfed.Logger(ctx).ErrorContext(ctx, \"failed setting error details\", slog.String(\"error\", err.Error()))\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tif detail != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\tdetails = append(details, detail.(grpcfed.ProtoMessage))\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tif detail := grpcfed.PreconditionFailure(ctx, value, []*grpcfed.PreconditionFailureViolation{\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tType:              `'some-type'`,\n\t\t\t\t\t\t\t\t\t\t\t\t\tSubject:           `'some-subject'`,\n\t\t\t\t\t\t\t\t\t\t\t\t\tDesc:              `'some-description'`,\n\t\t\t\t\t\t\t\t\t\t\t\t\tTypeCacheIndex:    15,\n\t\t\t\t\t\t\t\t\t\t\t\t\tSubjectCacheIndex: 16,\n\t\t\t\t\t\t\t\t\t\t\t\t\tDescCacheIndex:    17,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t}); detail != nil {\n\t\t\t\t\t\t\t\t\t\t\t\tdetails = append(details, detail)\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tif detail := grpcfed.LocalizedMessage(ctx, &grpcfed.LocalizedMessageParam{\n\t\t\t\t\t\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\t\t\t\t\t\tLocale:     \"en-US\",\n\t\t\t\t\t\t\t\t\t\t\t\tMessage:    `localized_msg.value`,\n\t\t\t\t\t\t\t\t\t\t\t\tCacheIndex: 18,\n\t\t\t\t\t\t\t\t\t\t\t}); detail != nil {\n\t\t\t\t\t\t\t\t\t\t\t\tdetails = append(details, detail)\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tvar code grpcfed.Code\n\t\t\t\t\t\t\t\t\tcode = grpcfed.FailedPreconditionCode\n\t\t\t\t\t\t\t\t\tstatus := grpcfed.NewGRPCStatus(code, errorMessage)\n\t\t\t\t\t\t\t\t\tstatusWithDetails, err := status.WithDetails(details...)\n\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\tgrpcfed.Logger(ctx).ErrorContext(ctx, \"failed setting error details\", slog.String(\"error\", err.Error()))\n\t\t\t\t\t\t\t\t\t\tstat = status\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tstat = statusWithDetails\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif stat != nil {\n\t\t\t\t\t\t\t\treturn &localStatusType{status: stat, logLevel: slog.LevelError}, nil\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\t\tExpr:       `error.code == google.rpc.Code.UNIMPLEMENTED`,\n\t\t\t\t\t\t\t\tCacheIndex: 19,\n\t\t\t\t\t\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t\t\t\t\t\tstat = grpcfed.NewGRPCStatus(grpcfed.OKCode, \"ignore error\")\n\t\t\t\t\t\t\t\t\tif err := grpcfed.IgnoreAndResponse(ctx, value, grpcfed.Def[*post.GetPostResponse, *localValueType]{\n\t\t\t\t\t\t\t\t\t\tName: \"res\",\n\t\t\t\t\t\t\t\t\t\tType: grpcfed.CELObjectType(\"org.post.GetPostResponse\"),\n\t\t\t\t\t\t\t\t\t\tSetter: func(value *localValueType, v *post.GetPostResponse) error {\n\t\t\t\t\t\t\t\t\t\t\tret = v // assign customized response to the result value.\n\t\t\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tBy:           `org.post.GetPostResponse{post: org.post.Post{id: 'anonymous', title: 'none'}}`,\n\t\t\t\t\t\t\t\t\t\tByCacheIndex: 20,\n\t\t\t\t\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\t\t\t\t\tgrpcfed.Logger(ctx).ErrorContext(ctx, \"failed to set response when ignored\", slog.String(\"error\", err.Error()))\n\t\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif stat != nil {\n\t\t\t\t\t\t\t\treturn &localStatusType{status: stat, logLevel: slog.LevelError}, nil\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\t\tExpr:       `true`,\n\t\t\t\t\t\t\t\tCacheIndex: 21,\n\t\t\t\t\t\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t\t\t\t\t\tstat = grpcfed.NewGRPCStatus(grpcfed.OKCode, \"ignore error\")\n\t\t\t\t\t\t\t\t\tret = &post.GetPostResponse{}\n\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif stat != nil {\n\t\t\t\t\t\t\t\treturn &localStatusType{status: stat, logLevel: slog.LevelError}, nil\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn nil, nil\n\t\t\t\t\t}()\n\t\t\t\t\tif handleErr != nil {\n\t\t\t\t\t\tgrpcfed.Logger(ctx).ErrorContext(ctx, \"failed to handle error\", slog.String(\"error\", handleErr.Error()))\n\t\t\t\t\t\t// If it fails during error handling, return the original error.\n\t\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Org_Post_PostService_GetPost, err); err != nil {\n\t\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if stat != nil {\n\t\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Org_Post_PostService_GetPost, stat.status.Err()); err != nil {\n\t\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, stat.logLevel, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Org_Post_PostService_GetPost, err); err != nil {\n\t\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tvalue.SetGRPCError(ret, grpcErr)\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"post\"\n\t\t  autobind: true\n\t\t  by: \"res.post\"\n\t\t}\n\t*/\n\tdef_post := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.Post, *localValueType]{\n\t\t\tName: `post`,\n\t\t\tType: grpcfed.CELObjectType(\"org.post.Post\"),\n\t\t\tSetter: func(value *localValueType, v *post.Post) error {\n\t\t\t\tvalue.vars.Post = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `res.post`,\n\t\t\tByCacheIndex: 22,\n\t\t})\n\t}\n\n\tif err := def_res(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\tif err := def_post(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_PostVariable.Id = value.vars.Id\n\treq.FederationService_Org_Federation_PostVariable.LocalizedMsg = value.vars.LocalizedMsg\n\treq.FederationService_Org_Federation_PostVariable.Post = value.vars.Post\n\treq.FederationService_Org_Federation_PostVariable.Res = value.vars.Res\n\treq.FederationService_Org_Federation_PostVariable.XDef0ErrDetail0Msg0 = value.vars.XDef0ErrDetail0Msg0\n\n\t// create a message value to be returned.\n\tret := &Post{}\n\n\t// field binding section.\n\tret.Id = value.vars.Post.GetId()       // { name: \"post\", autobind: true }\n\tret.Title = value.vars.Post.GetTitle() // { name: \"post\", autobind: true }\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.Post\", slog.Any(\"org.federation.Post\", s.logvalue_Org_Federation_Post(ret)))\n\treturn ret, nil\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_CustomMessage(v *CustomMessage) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"msg\", v.GetMsg()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_CustomMessageArgument(v *FederationService_Org_Federation_CustomMessageArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"msg\", v.Msg),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostResponse(v *GetPostResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"post\", s.logvalue_Org_Federation_Post(v.GetPost())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostResponseArgument(v *FederationService_Org_Federation_GetPostResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_LocalizedMessage(v *LocalizedMessage) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"value\", v.GetValue()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_LocalizedMessageArgument(v *FederationService_Org_Federation_LocalizedMessageArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"value\", v.Value),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_Post(v *Post) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.String(\"title\", v.GetTitle()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_PostArgument(v *FederationService_Org_Federation_PostArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_CreatePost(v *post.CreatePost) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"title\", v.GetTitle()),\n\t\tslog.String(\"content\", v.GetContent()),\n\t\tslog.String(\"user_id\", v.GetUserId()),\n\t\tslog.String(\"type\", s.logvalue_Org_Post_PostType(v.GetType()).String()),\n\t\tslog.Int64(\"post_type\", int64(v.GetPostType())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_CreatePostRequest(v *post.CreatePostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"post\", s.logvalue_Org_Post_CreatePost(v.GetPost())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_GetPostRequest(v *post.GetPostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_GetPostsRequest(v *post.GetPostsRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.GetIds()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_PostType(v post.PostType) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tswitch v {\n\tcase post.PostType_POST_TYPE_UNKNOWN:\n\t\treturn slog.StringValue(\"POST_TYPE_UNKNOWN\")\n\tcase post.PostType_POST_TYPE_A:\n\t\treturn slog.StringValue(\"POST_TYPE_A\")\n\tcase post.PostType_POST_TYPE_B:\n\t\treturn slog.StringValue(\"POST_TYPE_B\")\n\t}\n\treturn slog.StringValue(\"\")\n}\n\nfunc (s *FederationService) logvalue_Org_Post_UpdatePostRequest(v *post.UpdatePostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t)\n}\n"
  },
  {
    "path": "generator/testdata/expected_inline_env.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: inline_env.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// InlineEnvServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype InlineEnvServiceConfig struct {\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// InlineEnvServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype InlineEnvServiceClientFactory interface {\n}\n\n// InlineEnvServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype InlineEnvServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// InlineEnvServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype InlineEnvServiceDependentClientSet struct {\n}\n\n// InlineEnvServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype InlineEnvServiceResolver interface {\n}\n\n// InlineEnvServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype InlineEnvServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// InlineEnvServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype InlineEnvServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// InlineEnvServiceEnv keeps the values read from environment variables.\ntype InlineEnvServiceEnv struct {\n\tAaa string                      `envconfig:\"AAA\" default:\"xxx\"`\n\tBbb []int64                     `envconfig:\"yyy\"`\n\tCcc map[string]grpcfed.Duration `envconfig:\"c\" required:\"true\"`\n\tDdd float64                     `envconfig:\"DDD\" ignored:\"true\"`\n}\n\ntype keyInlineEnvServiceEnv struct{}\n\n// GetInlineEnvServiceEnv gets environment variables.\nfunc GetInlineEnvServiceEnv(ctx context.Context) *InlineEnvServiceEnv {\n\tvalue := ctx.Value(keyInlineEnvServiceEnv{})\n\tif value == nil {\n\t\treturn nil\n\t}\n\treturn value.(*InlineEnvServiceEnv)\n}\n\nfunc withInlineEnvServiceEnv(ctx context.Context, env *InlineEnvServiceEnv) context.Context {\n\treturn context.WithValue(ctx, keyInlineEnvServiceEnv{}, env)\n}\n\n// InlineEnvServiceVariable keeps the initial values.\ntype InlineEnvServiceVariable struct {\n\tX string\n\tY []int64\n\tbool\n}\n\ntype keyInlineEnvServiceVariable struct{}\n\n// GetInlineEnvServiceVariable gets initial variables.\nfunc GetInlineEnvServiceVariable(ctx context.Context) *InlineEnvServiceVariable {\n\tvalue := ctx.Value(keyInlineEnvServiceVariable{})\n\tif value == nil {\n\t\treturn nil\n\t}\n\treturn value.(*InlineEnvServiceVariable)\n}\n\nfunc withInlineEnvServiceVariable(ctx context.Context, svcVar *InlineEnvServiceVariable) context.Context {\n\treturn context.WithValue(ctx, keyInlineEnvServiceVariable{}, svcVar)\n}\n\n// InlineEnvServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype InlineEnvServiceUnimplementedResolver struct{}\n\n// InlineEnvService represents Federation Service.\ntype InlineEnvService struct {\n\tUnimplementedInlineEnvServiceServer\n\tcfg             InlineEnvServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tenv             *InlineEnvServiceEnv\n\tsvcVar          *InlineEnvServiceVariable\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *InlineEnvServiceDependentClientSet\n}\n\n// NewInlineEnvService creates InlineEnvService instance by InlineEnvServiceConfig.\nfunc NewInlineEnvService(cfg InlineEnvServiceConfig) (*InlineEnvService, error) {\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"org.federation.InlineEnvService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.Env\": {\n\t\t\t\"aaa\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Aaa\"),\n\t\t\t\"bbb\": grpcfed.NewCELFieldType(grpcfed.NewCELListType(grpcfed.CELIntType), \"Bbb\"),\n\t\t\t\"ccc\": grpcfed.NewCELFieldType(grpcfed.NewCELMapType(grpcfed.CELStringType, grpcfed.CELDurationType), \"Ccc\"),\n\t\t\t\"ddd\": grpcfed.NewCELFieldType(grpcfed.CELDoubleType, \"Ddd\"),\n\t\t},\n\t\t\"grpc.federation.private.ServiceVariable\": {\n\t\t\t\"x\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"X\"),\n\t\t\t\"y\": grpcfed.NewCELFieldType(grpcfed.NewCELListType(grpcfed.CELIntType), \"Y\"),\n\t\t\t\"\":  grpcfed.NewCELFieldType(grpcfed.CELBoolType, \"\"),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"org.federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewCELVariable(\"grpc.federation.env\", grpcfed.CELObjectType(\"grpc.federation.private.Env\")))\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewCELVariable(\"grpc.federation.var\", grpcfed.CELObjectType(\"grpc.federation.private.ServiceVariable\")))\n\tvar env InlineEnvServiceEnv\n\tif err := grpcfed.LoadEnv(\"\", &env); err != nil {\n\t\treturn nil, err\n\t}\n\tsvc := &InlineEnvService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tenv:             &env,\n\t\tsvcVar:          new(InlineEnvServiceVariable),\n\t\tclient:          &InlineEnvServiceDependentClientSet{},\n\t}\n\tif err := svc.initServiceVariables(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\treturn svc, nil\n}\n\n// CleanupInlineEnvService cleanup all resources to prevent goroutine leaks.\nfunc CleanupInlineEnvService(ctx context.Context, svc *InlineEnvService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *InlineEnvService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\nfunc (s *InlineEnvService) initServiceVariables(ctx context.Context) error {\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars *InlineEnvServiceVariable\n\t}\n\tvalue := &localValueType{\n\t\tLocalValue: grpcfed.NewServiceVariableLocalValue(s.celEnvOpts),\n\t\tvars:       s.svcVar,\n\t}\n\tvalue.AddEnv(s.env)\n\tvalue.AddServiceVariable(s.svcVar)\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t/*\n\t\tdef {\n\t\t  name: \"x\"\n\t\t  by: \"grpc.federation.env.aaa\"\n\t\t}\n\t*/\n\tdef_x := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[string, *localValueType]{\n\t\t\tName: `x`,\n\t\t\tType: grpcfed.CELStringType,\n\t\t\tSetter: func(value *localValueType, v string) error {\n\t\t\t\tvalue.vars.X = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `grpc.federation.env.aaa`,\n\t\t\tByCacheIndex: 1,\n\t\t})\n\t}\n\tif err := def_x(ctx); err != nil {\n\t\treturn err\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"y\"\n\t\t  switch {\n\t\t    case {\n\t\t      if: \"grpc.federation.env.aaa == 'xxx'\"\n\t\t      by: \"grpc.federation.env.bbb\"\n\t\t    }\n\t\t    default {\n\t\t      by: \"[0, 0]\"\n\t\t    }\n\t\t  }\n\t\t}\n\t*/\n\tdef_y := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[[]int64, *localValueType]{\n\t\t\tName: `y`,\n\t\t\tType: grpcfed.CELListType(grpcfed.CELIntType),\n\t\t\tSetter: func(value *localValueType, v []int64) error {\n\t\t\t\tvalue.vars.Y = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tSwitch: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\tcases := []*grpcfed.EvalSwitchCase[*localValueType]{}\n\t\t\t\tcases = append(cases, &grpcfed.EvalSwitchCase[*localValueType]{\n\t\t\t\t\tIf:           `grpc.federation.env.aaa == 'xxx'`,\n\t\t\t\t\tIfCacheIndex: 2,\n\t\t\t\t\tBy:           `grpc.federation.env.bbb`,\n\t\t\t\t\tByCacheIndex: 3,\n\t\t\t\t})\n\t\t\t\treturn grpcfed.EvalSwitch[[]int64](ctx, value, cases, &grpcfed.EvalSwitchDefault[*localValueType]{\n\t\t\t\t\tBy:           `[0, 0]`,\n\t\t\t\t\tByCacheIndex: 4,\n\t\t\t\t})\n\t\t\t},\n\t\t})\n\t}\n\tif err := def_y(ctx); err != nil {\n\t\treturn err\n\t}\n\n\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\tValue:      value,\n\t\tExpr:       `grpc.federation.env.bbb == 1`,\n\t\tCacheIndex: 5,\n\t\tBody: func(value *localValueType) error {\n\t\t\terrmsg, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\tValue:      value,\n\t\t\t\tExpr:       `'error'`,\n\t\t\t\tOutType:    reflect.TypeOf(\"\"),\n\t\t\t\tCacheIndex: 6,\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\treturn grpcfed.NewGRPCStatus(grpcfed.InternalCode, errmsg.(string)).Err()\n\t\t},\n\t}); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "generator/testdata/expected_map.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: map.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n\n\tpost \"example/post\"\n\tuser \"example/user\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Org_Federation_GetPostsResponseVariable represents variable definitions in \"org.federation.GetPostsResponse\".\ntype FederationService_Org_Federation_GetPostsResponseVariable struct {\n\tPosts *Posts\n}\n\n// Org_Federation_GetPostsResponseArgument is argument for \"org.federation.GetPostsResponse\" message.\ntype FederationService_Org_Federation_GetPostsResponseArgument struct {\n\tIds []string\n\tFederationService_Org_Federation_GetPostsResponseVariable\n}\n\n// Org_Federation_PostsVariable represents variable definitions in \"org.federation.Posts\".\ntype FederationService_Org_Federation_PostsVariable struct {\n\tIds             []string\n\tItems           []*Posts_PostItem\n\tPosts           []*post.Post\n\tRes             *post.GetPostsResponse\n\tSourceUserTypes []user.UserType\n\tUserTypes       []UserType\n\tUsers           []*User\n}\n\n// Org_Federation_PostsArgument is argument for \"org.federation.Posts\" message.\ntype FederationService_Org_Federation_PostsArgument struct {\n\tPostIds []string\n\tFederationService_Org_Federation_PostsVariable\n}\n\n// Org_Federation_Posts_PostItemVariable represents variable definitions in \"org.federation.PostItem\".\ntype FederationService_Org_Federation_Posts_PostItemVariable struct {\n}\n\n// Org_Federation_Posts_PostItemArgument is argument for \"org.federation.PostItem\" message.\ntype FederationService_Org_Federation_Posts_PostItemArgument struct {\n\tId string\n\tFederationService_Org_Federation_Posts_PostItemVariable\n}\n\n// Org_Federation_UserVariable represents variable definitions in \"org.federation.User\".\ntype FederationService_Org_Federation_UserVariable struct {\n\tRes  *user.GetUserResponse\n\tUser *user.User\n}\n\n// Org_Federation_UserArgument is argument for \"org.federation.User\" message.\ntype FederationService_Org_Federation_UserArgument struct {\n\tUserId string\n\tFederationService_Org_Federation_UserVariable\n}\n\n// FederationServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationServiceConfig struct {\n\t// Client provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\n\t// If this interface is not provided, an error is returned during initialization.\n\tClient FederationServiceClientFactory // required\n\t// Resolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\n\t// If this interface is not provided, an error is returned during initialization.\n\tResolver FederationServiceResolver // required\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationServiceClientFactory interface {\n\t// Org_Post_PostServiceClient create a gRPC Client to be used to call methods in org.post.PostService.\n\tOrg_Post_PostServiceClient(FederationServiceClientConfig) (post.PostServiceClient, error)\n\t// Org_User_UserServiceClient create a gRPC Client to be used to call methods in org.user.UserService.\n\tOrg_User_UserServiceClient(FederationServiceClientConfig) (user.UserServiceClient, error)\n}\n\n// FederationServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationServiceDependentClientSet struct {\n\tOrg_Post_PostServiceClient post.PostServiceClient\n\tOrg_User_UserServiceClient user.UserServiceClient\n}\n\n// FederationServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationServiceResolver interface {\n\t// Resolve_Org_Federation_User implements resolver for \"org.federation.User\".\n\tResolve_Org_Federation_User(context.Context, *FederationService_Org_Federation_UserArgument) (*User, error)\n}\n\n// FederationServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// FederationServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationServiceUnimplementedResolver struct{}\n\n// Resolve_Org_Federation_User resolve \"org.federation.User\".\n// This method always returns Unimplemented error.\nfunc (FederationServiceUnimplementedResolver) Resolve_Org_Federation_User(context.Context, *FederationService_Org_Federation_UserArgument) (ret *User, e error) {\n\te = grpcfed.GRPCErrorf(grpcfed.UnimplementedCode, \"method Resolve_Org_Federation_User not implemented\")\n\treturn\n}\n\nconst (\n\tFederationService_DependentMethod_Org_Post_PostService_GetPosts = \"/org.post.PostService/GetPosts\"\n\tFederationService_DependentMethod_Org_User_UserService_GetUser  = \"/org.user.UserService/GetUser\"\n)\n\n// FederationService represents Federation Service.\ntype FederationService struct {\n\tUnimplementedFederationServiceServer\n\tcfg             FederationServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tresolver        FederationServiceResolver\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationServiceDependentClientSet\n}\n\n// NewFederationService creates FederationService instance by FederationServiceConfig.\nfunc NewFederationService(cfg FederationServiceConfig) (*FederationService, error) {\n\tif cfg.Client == nil {\n\t\treturn nil, grpcfed.ErrClientConfig\n\t}\n\tif cfg.Resolver == nil {\n\t\treturn nil, grpcfed.ErrResolverConfig\n\t}\n\tOrg_Post_PostServiceClient, err := cfg.Client.Org_Post_PostServiceClient(FederationServiceClientConfig{\n\t\tService: \"org.post.PostService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tOrg_User_UserServiceClient, err := cfg.Client.Org_User_UserServiceClient(FederationServiceClientConfig{\n\t\tService: \"org.user.UserService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"org.federation.FederationService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.org.federation.GetPostsResponseArgument\": {\n\t\t\t\"ids\": grpcfed.NewCELFieldType(grpcfed.NewCELListType(grpcfed.CELStringType), \"Ids\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.PostsArgument\": {\n\t\t\t\"post_ids\": grpcfed.NewCELFieldType(grpcfed.NewCELListType(grpcfed.CELStringType), \"PostIds\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.Posts_PostItemArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.UserArgument\": {\n\t\t\t\"user_id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"UserId\"),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"org.federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.GRPCErrorAccessorOptions(celTypeHelper, \"org.post.GetPostsResponse\")...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.GRPCErrorAccessorOptions(celTypeHelper, \"org.user.GetUserResponse\")...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.federation.UserType\", UserType_value, UserType_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.post.PostType\", post.PostType_value, post.PostType_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.user.Item.ItemType\", user.Item_ItemType_value, user.Item_ItemType_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.user.UserType\", user.UserType_value, user.UserType_name)...)\n\tsvc := &FederationService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tresolver:        cfg.Resolver,\n\t\tclient: &FederationServiceDependentClientSet{\n\t\t\tOrg_Post_PostServiceClient: Org_Post_PostServiceClient,\n\t\t\tOrg_User_UserServiceClient: Org_User_UserServiceClient,\n\t\t},\n\t}\n\tif resolver, ok := cfg.Resolver.(grpcfed.CustomResolverInitializer); ok {\n\t\tctx := context.Background()\n\t\tif err := resolver.Init(ctx); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationService(ctx context.Context, svc *FederationService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n// GetPosts implements \"org.federation.FederationService/GetPosts\" method.\nfunc (s *FederationService) GetPosts(ctx context.Context, req *GetPostsRequest) (res *GetPostsResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.FederationService/GetPosts\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Org_Federation_GetPostsResponse(ctx, &FederationService_Org_Federation_GetPostsResponseArgument{\n\t\tIds: req.GetIds(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Org_Federation_GetPostsResponse resolve \"org.federation.GetPostsResponse\" message.\nfunc (s *FederationService) resolve_Org_Federation_GetPostsResponse(ctx context.Context, req *FederationService_Org_Federation_GetPostsResponseArgument) (*GetPostsResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.GetPostsResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.GetPostsResponse\", slog.Any(\"message_args\", s.logvalue_Org_Federation_GetPostsResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tPosts *Posts\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.GetPostsResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"posts\"\n\t\t  message {\n\t\t    name: \"Posts\"\n\t\t    args { name: \"post_ids\", by: \"$.ids\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_posts := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Posts, *localValueType]{\n\t\t\tName: `posts`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.Posts\"),\n\t\t\tSetter: func(value *localValueType, v *Posts) error {\n\t\t\t\tvalue.vars.Posts = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_PostsArgument{}\n\t\t\t\t// { name: \"post_ids\", by: \"$.ids\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.ids`,\n\t\t\t\t\tCacheIndex: 1,\n\t\t\t\t\tSetter: func(v []string) error {\n\t\t\t\t\t\targs.PostIds = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_Posts(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_posts(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_GetPostsResponseVariable.Posts = value.vars.Posts\n\n\t// create a message value to be returned.\n\tret := &GetPostsResponse{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"posts\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*Posts]{\n\t\tValue:      value,\n\t\tExpr:       `posts`,\n\t\tCacheIndex: 2,\n\t\tSetter: func(v *Posts) error {\n\t\t\tret.Posts = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.GetPostsResponse\", slog.Any(\"org.federation.GetPostsResponse\", s.logvalue_Org_Federation_GetPostsResponse(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_Posts resolve \"org.federation.Posts\" message.\nfunc (s *FederationService) resolve_Org_Federation_Posts(ctx context.Context, req *FederationService_Org_Federation_PostsArgument) (*Posts, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.Posts\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.Posts\", slog.Any(\"message_args\", s.logvalue_Org_Federation_PostsArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tIds             []string\n\t\t\tItems           []*Posts_PostItem\n\t\t\tPosts           []*post.Post\n\t\t\tRes             *post.GetPostsResponse\n\t\t\tSourceUserTypes []user.UserType\n\t\t\tUserTypes       []UserType\n\t\t\tUsers           []*User\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.PostsArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"org.post.PostService/GetPosts\"\n\t\t    request { field: \"ids\", by: \"$.post_ids\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.GetPostsResponse, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"org.post.GetPostsResponse\"),\n\t\t\tSetter: func(value *localValueType, v *post.GetPostsResponse) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &post.GetPostsRequest{}\n\t\t\t\t// { field: \"ids\", by: \"$.post_ids\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.post_ids`,\n\t\t\t\t\tCacheIndex: 3,\n\t\t\t\t\tSetter: func(v []string) error {\n\t\t\t\t\t\targs.Ids = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call org.post.PostService/GetPosts\", slog.Any(\"org.post.GetPostsRequest\", s.logvalue_Org_Post_GetPostsRequest(args)))\n\t\t\t\tret, err := s.client.Org_Post_PostServiceClient.GetPosts(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Org_Post_PostService_GetPosts, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"posts\"\n\t\t  by: \"res.posts\"\n\t\t}\n\t*/\n\tdef_posts := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[[]*post.Post, *localValueType]{\n\t\t\tName: `posts`,\n\t\t\tType: grpcfed.CELListType(grpcfed.CELObjectType(\"org.post.Post\")),\n\t\t\tSetter: func(value *localValueType, v []*post.Post) error {\n\t\t\t\tvalue.vars.Posts = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `res.posts`,\n\t\t\tByCacheIndex: 4,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"ids\"\n\t\t  map {\n\t\t    iterator {\n\t\t      name: \"post\"\n\t\t      src: \"posts\"\n\t\t    }\n\t\t    by: \"post.id\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_ids := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDefMap(ctx, value, grpcfed.DefMap[[]string, *post.Post, *localValueType]{\n\t\t\tName: `ids`,\n\t\t\tType: grpcfed.CELListType(grpcfed.CELStringType),\n\t\t\tSetter: func(value *localValueType, v []string) error {\n\t\t\t\tvalue.vars.Ids = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tIteratorName:   `post`,\n\t\t\tIteratorType:   grpcfed.CELObjectType(\"org.post.Post\"),\n\t\t\tIteratorSource: func(value *localValueType) []*post.Post { return value.vars.Posts },\n\t\t\tIterator: func(ctx context.Context, value *grpcfed.MapIteratorValue) (any, error) {\n\t\t\t\treturn grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `post.id`,\n\t\t\t\t\tOutType:    reflect.TypeOf(\"\"),\n\t\t\t\t\tCacheIndex: 5,\n\t\t\t\t})\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"users\"\n\t\t  map {\n\t\t    iterator {\n\t\t      name: \"iter\"\n\t\t      src: \"posts\"\n\t\t    }\n\t\t    message {\n\t\t      name: \"User\"\n\t\t      args { name: \"user_id\", by: \"iter.user_id\" }\n\t\t    }\n\t\t  }\n\t\t}\n\t*/\n\tdef_users := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDefMap(ctx, value, grpcfed.DefMap[[]*User, *post.Post, *localValueType]{\n\t\t\tName: `users`,\n\t\t\tType: grpcfed.CELListType(grpcfed.CELObjectType(\"org.federation.User\")),\n\t\t\tSetter: func(value *localValueType, v []*User) error {\n\t\t\t\tvalue.vars.Users = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tIteratorName:   `iter`,\n\t\t\tIteratorType:   grpcfed.CELObjectType(\"org.post.Post\"),\n\t\t\tIteratorSource: func(value *localValueType) []*post.Post { return value.vars.Posts },\n\t\t\tIterator: func(ctx context.Context, value *grpcfed.MapIteratorValue) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_UserArgument{}\n\t\t\t\t// { name: \"user_id\", by: \"iter.user_id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `iter.user_id`,\n\t\t\t\t\tCacheIndex: 6,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.UserId = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn s.resolve_Org_Federation_User(ctx, args)\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"items\"\n\t\t  map {\n\t\t    iterator {\n\t\t      name: \"iter\"\n\t\t      src: \"posts\"\n\t\t    }\n\t\t    message {\n\t\t      name: \"PostItem\"\n\t\t      args { name: \"id\", by: \"iter.id\" }\n\t\t    }\n\t\t  }\n\t\t}\n\t*/\n\tdef_items := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDefMap(ctx, value, grpcfed.DefMap[[]*Posts_PostItem, *post.Post, *localValueType]{\n\t\t\tName: `items`,\n\t\t\tType: grpcfed.CELListType(grpcfed.CELObjectType(\"org.federation.Posts.PostItem\")),\n\t\t\tSetter: func(value *localValueType, v []*Posts_PostItem) error {\n\t\t\t\tvalue.vars.Items = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tIteratorName:   `iter`,\n\t\t\tIteratorType:   grpcfed.CELObjectType(\"org.post.Post\"),\n\t\t\tIteratorSource: func(value *localValueType) []*post.Post { return value.vars.Posts },\n\t\t\tIterator: func(ctx context.Context, value *grpcfed.MapIteratorValue) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_Posts_PostItemArgument{}\n\t\t\t\t// { name: \"id\", by: \"iter.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `iter.id`,\n\t\t\t\t\tCacheIndex: 7,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn s.resolve_Org_Federation_Posts_PostItem(ctx, args)\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"source_user_types\"\n\t\t  by: \"[org.user.UserType.value('USER_TYPE_1'), org.user.UserType.value('USER_TYPE_2')]\"\n\t\t}\n\t*/\n\tdef_source_user_types := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[[]user.UserType, *localValueType]{\n\t\t\tName: `source_user_types`,\n\t\t\tType: grpcfed.CELListType(grpcfed.CELIntType),\n\t\t\tSetter: func(value *localValueType, v []user.UserType) error {\n\t\t\t\tvalue.vars.SourceUserTypes = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `[org.user.UserType.value('USER_TYPE_1'), org.user.UserType.value('USER_TYPE_2')]`,\n\t\t\tByCacheIndex: 8,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"user_types\"\n\t\t  map {\n\t\t    iterator {\n\t\t      name: \"typ\"\n\t\t      src: \"source_user_types\"\n\t\t    }\n\t\t  }\n\t\t}\n\t*/\n\tdef_user_types := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDefMap(ctx, value, grpcfed.DefMap[[]UserType, user.UserType, *localValueType]{\n\t\t\tName: `user_types`,\n\t\t\tType: grpcfed.CELListType(grpcfed.CELIntType),\n\t\t\tSetter: func(value *localValueType, v []UserType) error {\n\t\t\t\tvalue.vars.UserTypes = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tIteratorName:   `typ`,\n\t\t\tIteratorType:   grpcfed.CELIntType,\n\t\t\tIteratorSource: func(value *localValueType) []user.UserType { return value.vars.SourceUserTypes },\n\t\t\tIterator: func(ctx context.Context, value *grpcfed.MapIteratorValue) (any, error) {\n\t\t\t\tsrc, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `typ`,\n\t\t\t\t\tOutType:    reflect.TypeOf(user.UserType(0)),\n\t\t\t\t\tCacheIndex: 9,\n\t\t\t\t})\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn 0, err\n\t\t\t\t}\n\t\t\t\tv := src.(user.UserType)\n\t\t\t\treturn s.cast_Org_User_UserType__to__Org_Federation_UserType(v)\n\t\t\t},\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t   res ─┐\n\t                    posts ─┐\n\t                                  ids ─┐\n\t   res ─┐                              │\n\t                    posts ─┐           │\n\t                                items ─┤\n\t        source_user_types ─┐           │\n\t                           user_types ─┤\n\t   res ─┐                              │\n\t                    posts ─┐           │\n\t                                users ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_posts(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_ids(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_posts(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_items(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_source_user_types(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_user_types(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_posts(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_users(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_PostsVariable.Ids = value.vars.Ids\n\treq.FederationService_Org_Federation_PostsVariable.Items = value.vars.Items\n\treq.FederationService_Org_Federation_PostsVariable.Posts = value.vars.Posts\n\treq.FederationService_Org_Federation_PostsVariable.Res = value.vars.Res\n\treq.FederationService_Org_Federation_PostsVariable.SourceUserTypes = value.vars.SourceUserTypes\n\treq.FederationService_Org_Federation_PostsVariable.UserTypes = value.vars.UserTypes\n\treq.FederationService_Org_Federation_PostsVariable.Users = value.vars.Users\n\n\t// create a message value to be returned.\n\tret := &Posts{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"ids\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]string]{\n\t\tValue:      value,\n\t\tExpr:       `ids`,\n\t\tCacheIndex: 10,\n\t\tSetter: func(v []string) error {\n\t\t\tret.Ids = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"posts.map(post, post.title)\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]string]{\n\t\tValue:      value,\n\t\tExpr:       `posts.map(post, post.title)`,\n\t\tCacheIndex: 11,\n\t\tSetter: func(v []string) error {\n\t\t\tret.Titles = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"posts.map(post, post.content)\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]string]{\n\t\tValue:      value,\n\t\tExpr:       `posts.map(post, post.content)`,\n\t\tCacheIndex: 12,\n\t\tSetter: func(v []string) error {\n\t\t\tret.Contents = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"users\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]*User]{\n\t\tValue:      value,\n\t\tExpr:       `users`,\n\t\tCacheIndex: 13,\n\t\tSetter: func(v []*User) error {\n\t\t\tret.Users = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"items\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]*Posts_PostItem]{\n\t\tValue:      value,\n\t\tExpr:       `items`,\n\t\tCacheIndex: 14,\n\t\tSetter: func(v []*Posts_PostItem) error {\n\t\t\tret.Items = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"user_types\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[[]UserType]{\n\t\tValue:      value,\n\t\tExpr:       `user_types`,\n\t\tCacheIndex: 15,\n\t\tSetter: func(v []UserType) error {\n\t\t\tret.UserTypes = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.Posts\", slog.Any(\"org.federation.Posts\", s.logvalue_Org_Federation_Posts(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_Posts_PostItem resolve \"org.federation.Posts.PostItem\" message.\nfunc (s *FederationService) resolve_Org_Federation_Posts_PostItem(ctx context.Context, req *FederationService_Org_Federation_Posts_PostItemArgument) (*Posts_PostItem, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.Posts.PostItem\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.Posts.PostItem\", slog.Any(\"message_args\", s.logvalue_Org_Federation_Posts_PostItemArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.Posts_PostItemArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &Posts_PostItem{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'item_' + $.id\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'item_' + $.id`,\n\t\tCacheIndex: 16,\n\t\tSetter: func(v string) error {\n\t\t\tret.Name = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.Posts.PostItem\", slog.Any(\"org.federation.Posts.PostItem\", s.logvalue_Org_Federation_Posts_PostItem(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_User resolve \"org.federation.User\" message.\nfunc (s *FederationService) resolve_Org_Federation_User(ctx context.Context, req *FederationService_Org_Federation_UserArgument) (*User, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.User\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.User\", slog.Any(\"message_args\", s.logvalue_Org_Federation_UserArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tRes  *user.GetUserResponse\n\t\t\tUser *user.User\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.UserArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"org.user.UserService/GetUser\"\n\t\t    request { field: \"id\", by: \"$.user_id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*user.GetUserResponse, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"org.user.GetUserResponse\"),\n\t\t\tSetter: func(value *localValueType, v *user.GetUserResponse) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &user.GetUserRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.user_id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.user_id`,\n\t\t\t\t\tCacheIndex: 17,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call org.user.UserService/GetUser\", slog.Any(\"org.user.GetUserRequest\", s.logvalue_Org_User_GetUserRequest(args)))\n\t\t\t\tret, err := s.client.Org_User_UserServiceClient.GetUser(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Org_User_UserService_GetUser, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"user\"\n\t\t  autobind: true\n\t\t  by: \"res.user\"\n\t\t}\n\t*/\n\tdef_user := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*user.User, *localValueType]{\n\t\t\tName: `user`,\n\t\t\tType: grpcfed.CELObjectType(\"org.user.User\"),\n\t\t\tSetter: func(value *localValueType, v *user.User) error {\n\t\t\t\tvalue.vars.User = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `res.user`,\n\t\t\tByCacheIndex: 18,\n\t\t})\n\t}\n\n\tif err := def_res(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\tif err := def_user(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_UserVariable.Res = value.vars.Res\n\treq.FederationService_Org_Federation_UserVariable.User = value.vars.User\n\n\t// create a message value to be returned.\n\t// `custom_resolver = true` in \"grpc.federation.message\" option.\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx)) // create a new reference to logger.\n\tret, err := s.resolver.Resolve_Org_Federation_User(ctx, req)\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.User\", slog.Any(\"org.federation.User\", s.logvalue_Org_Federation_User(ret)))\n\treturn ret, nil\n}\n\n// cast_Org_User_UserType__to__Org_Federation_UserType cast from \"org.user.UserType\" to \"org.federation.UserType\".\nfunc (s *FederationService) cast_Org_User_UserType__to__Org_Federation_UserType(from user.UserType) (UserType, error) {\n\tvar ret UserType\n\tswitch from {\n\tcase user.UserType_USER_TYPE_1:\n\t\tret = UserType_USER_TYPE_1\n\tcase user.UserType_USER_TYPE_2:\n\t\tret = UserType_USER_TYPE_2\n\tdefault:\n\t\tret = 0\n\t}\n\treturn ret, nil\n}\n\n// cast_repeated_Org_User_UserType__to__repeated_Org_Federation_UserType cast from \"repeated org.user.UserType\" to \"repeated org.federation.UserType\".\nfunc (s *FederationService) cast_repeated_Org_User_UserType__to__repeated_Org_Federation_UserType(from []user.UserType) ([]UserType, error) {\n\tret := make([]UserType, 0, len(from))\n\tfor _, v := range from {\n\t\tcasted, err := s.cast_Org_User_UserType__to__Org_Federation_UserType(v)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret = append(ret, casted)\n\t}\n\treturn ret, nil\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostsResponse(v *GetPostsResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"posts\", s.logvalue_Org_Federation_Posts(v.GetPosts())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostsResponseArgument(v *FederationService_Org_Federation_GetPostsResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.Ids),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_Posts(v *Posts) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.GetIds()),\n\t\tslog.Any(\"titles\", v.GetTitles()),\n\t\tslog.Any(\"contents\", v.GetContents()),\n\t\tslog.Any(\"users\", s.logvalue_repeated_Org_Federation_User(v.GetUsers())),\n\t\tslog.Any(\"items\", s.logvalue_repeated_Org_Federation_Posts_PostItem(v.GetItems())),\n\t\tslog.Any(\"user_types\", s.logvalue_repeated_Org_Federation_UserType(v.GetUserTypes())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_PostsArgument(v *FederationService_Org_Federation_PostsArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"post_ids\", v.PostIds),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_Posts_PostItem(v *Posts_PostItem) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_Posts_PostItemArgument(v *FederationService_Org_Federation_Posts_PostItemArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_User(v *User) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_UserArgument(v *FederationService_Org_Federation_UserArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"user_id\", v.UserId),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_UserType(v UserType) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tswitch v {\n\tcase UserType_USER_TYPE_1:\n\t\treturn slog.StringValue(\"USER_TYPE_1\")\n\tcase UserType_USER_TYPE_2:\n\t\treturn slog.StringValue(\"USER_TYPE_2\")\n\t}\n\treturn slog.StringValue(\"\")\n}\n\nfunc (s *FederationService) logvalue_Org_Post_CreatePost(v *post.CreatePost) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"title\", v.GetTitle()),\n\t\tslog.String(\"content\", v.GetContent()),\n\t\tslog.String(\"user_id\", v.GetUserId()),\n\t\tslog.String(\"type\", s.logvalue_Org_Post_PostType(v.GetType()).String()),\n\t\tslog.Int64(\"post_type\", int64(v.GetPostType())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_CreatePostRequest(v *post.CreatePostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"post\", s.logvalue_Org_Post_CreatePost(v.GetPost())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_GetPostRequest(v *post.GetPostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_GetPostsRequest(v *post.GetPostsRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.GetIds()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_PostType(v post.PostType) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tswitch v {\n\tcase post.PostType_POST_TYPE_UNKNOWN:\n\t\treturn slog.StringValue(\"POST_TYPE_UNKNOWN\")\n\tcase post.PostType_POST_TYPE_A:\n\t\treturn slog.StringValue(\"POST_TYPE_A\")\n\tcase post.PostType_POST_TYPE_B:\n\t\treturn slog.StringValue(\"POST_TYPE_B\")\n\t}\n\treturn slog.StringValue(\"\")\n}\n\nfunc (s *FederationService) logvalue_Org_Post_UpdatePostRequest(v *post.UpdatePostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_User_GetUserRequest(v *user.GetUserRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.Int64(\"foo\", v.GetFoo()),\n\t\tslog.String(\"bar\", v.GetBar()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_User_GetUsersRequest(v *user.GetUsersRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.GetIds()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_repeated_Org_Federation_Posts_PostItem(v []*Posts_PostItem) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tattrs := make([]slog.Attr, 0, len(v))\n\tfor idx, vv := range v {\n\t\tattrs = append(attrs, slog.Attr{\n\t\t\tKey:   grpcfed.ToLogAttrKey(idx),\n\t\t\tValue: s.logvalue_Org_Federation_Posts_PostItem(vv),\n\t\t})\n\t}\n\treturn slog.GroupValue(attrs...)\n}\n\nfunc (s *FederationService) logvalue_repeated_Org_Federation_User(v []*User) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tattrs := make([]slog.Attr, 0, len(v))\n\tfor idx, vv := range v {\n\t\tattrs = append(attrs, slog.Attr{\n\t\t\tKey:   grpcfed.ToLogAttrKey(idx),\n\t\t\tValue: s.logvalue_Org_Federation_User(vv),\n\t\t})\n\t}\n\treturn slog.GroupValue(attrs...)\n}\n\nfunc (s *FederationService) logvalue_repeated_Org_Federation_UserType(v []UserType) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tattrs := make([]slog.Attr, 0, len(v))\n\tfor idx, vv := range v {\n\t\tattrs = append(attrs, slog.Attr{\n\t\t\tKey:   grpcfed.ToLogAttrKey(idx),\n\t\t\tValue: s.logvalue_Org_Federation_UserType(vv),\n\t\t})\n\t}\n\treturn slog.GroupValue(attrs...)\n}\n"
  },
  {
    "path": "generator/testdata/expected_minimum.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: minimum.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Org_Federation_GetPostResponseVariable represents variable definitions in \"org.federation.GetPostResponse\".\ntype FederationService_Org_Federation_GetPostResponseVariable struct {\n}\n\n// Org_Federation_GetPostResponseArgument is argument for \"org.federation.GetPostResponse\" message.\ntype FederationService_Org_Federation_GetPostResponseArgument struct {\n\tId   string\n\tType PostType\n\tFederationService_Org_Federation_GetPostResponseVariable\n}\n\n// FederationServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationServiceConfig struct {\n\t// Resolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\n\t// If this interface is not provided, an error is returned during initialization.\n\tResolver FederationServiceResolver // required\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationServiceClientFactory interface {\n}\n\n// FederationServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationServiceDependentClientSet struct {\n}\n\n// FederationServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationServiceResolver interface {\n\t// Resolve_Org_Federation_GetPostResponse implements resolver for \"org.federation.GetPostResponse\".\n\tResolve_Org_Federation_GetPostResponse(context.Context, *FederationService_Org_Federation_GetPostResponseArgument) (*GetPostResponse, error)\n}\n\n// FederationServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// FederationServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationServiceUnimplementedResolver struct{}\n\n// Resolve_Org_Federation_GetPostResponse resolve \"org.federation.GetPostResponse\".\n// This method always returns Unimplemented error.\nfunc (FederationServiceUnimplementedResolver) Resolve_Org_Federation_GetPostResponse(context.Context, *FederationService_Org_Federation_GetPostResponseArgument) (ret *GetPostResponse, e error) {\n\te = grpcfed.GRPCErrorf(grpcfed.UnimplementedCode, \"method Resolve_Org_Federation_GetPostResponse not implemented\")\n\treturn\n}\n\n// FederationService represents Federation Service.\ntype FederationService struct {\n\tUnimplementedFederationServiceServer\n\tcfg             FederationServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tresolver        FederationServiceResolver\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationServiceDependentClientSet\n}\n\n// NewFederationService creates FederationService instance by FederationServiceConfig.\nfunc NewFederationService(cfg FederationServiceConfig) (*FederationService, error) {\n\tif cfg.Resolver == nil {\n\t\treturn nil, grpcfed.ErrResolverConfig\n\t}\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"org.federation.FederationService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.org.federation.GetPostResponseArgument\": {\n\t\t\t\"id\":   grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t\t\"type\": grpcfed.NewCELFieldType(grpcfed.CELIntType, \"Type\"),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"org.federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.federation.PostType\", PostType_value, PostType_name)...)\n\tsvc := &FederationService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tresolver:        cfg.Resolver,\n\t\tclient:          &FederationServiceDependentClientSet{},\n\t}\n\tif resolver, ok := cfg.Resolver.(grpcfed.CustomResolverInitializer); ok {\n\t\tctx := context.Background()\n\t\tif err := resolver.Init(ctx); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationService(ctx context.Context, svc *FederationService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n// GetPost implements \"org.federation.FederationService/GetPost\" method.\nfunc (s *FederationService) GetPost(ctx context.Context, req *GetPostRequest) (res *GetPostResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.FederationService/GetPost\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Org_Federation_GetPostResponse(ctx, &FederationService_Org_Federation_GetPostResponseArgument{\n\t\tId:   req.GetId(),\n\t\tType: req.GetType(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Org_Federation_GetPostResponse resolve \"org.federation.GetPostResponse\" message.\nfunc (s *FederationService) resolve_Org_Federation_GetPostResponse(ctx context.Context, req *FederationService_Org_Federation_GetPostResponseArgument) (*GetPostResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.GetPostResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.GetPostResponse\", slog.Any(\"message_args\", s.logvalue_Org_Federation_GetPostResponseArgument(req)))\n\n\t// create a message value to be returned.\n\t// `custom_resolver = true` in \"grpc.federation.message\" option.\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx)) // create a new reference to logger.\n\tret, err := s.resolver.Resolve_Org_Federation_GetPostResponse(ctx, req)\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.GetPostResponse\", slog.Any(\"org.federation.GetPostResponse\", s.logvalue_Org_Federation_GetPostResponse(ret)))\n\treturn ret, nil\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostResponse(v *GetPostResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"post\", s.logvalue_Org_Federation_Post(v.GetPost())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostResponseArgument(v *FederationService_Org_Federation_GetPostResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t\tslog.String(\"type\", s.logvalue_Org_Federation_PostType(v.Type).String()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_Post(v *Post) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.String(\"title\", v.GetTitle()),\n\t\tslog.String(\"content\", v.GetContent()),\n\t\tslog.Any(\"user\", s.logvalue_Org_Federation_User(v.GetUser())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_PostType(v PostType) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tswitch v {\n\tcase PostType_POST_TYPE_1:\n\t\treturn slog.StringValue(\"POST_TYPE_1\")\n\tcase PostType_POST_TYPE_2:\n\t\treturn slog.StringValue(\"POST_TYPE_2\")\n\t}\n\treturn slog.StringValue(\"\")\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_User(v *User) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n"
  },
  {
    "path": "generator/testdata/expected_multi_user.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: multi_user.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n\n\tuser \"example/user\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Org_Federation_GetResponseVariable represents variable definitions in \"org.federation.GetResponse\".\ntype FederationService_Org_Federation_GetResponseVariable struct {\n\tUid   *UserID\n\tUser  *User\n\tUser2 *User\n}\n\n// Org_Federation_GetResponseArgument is argument for \"org.federation.GetResponse\" message.\ntype FederationService_Org_Federation_GetResponseArgument struct {\n\tFederationService_Org_Federation_GetResponseVariable\n}\n\n// Org_Federation_SubVariable represents variable definitions in \"org.federation.Sub\".\ntype FederationService_Org_Federation_SubVariable struct {\n}\n\n// Org_Federation_SubArgument is argument for \"org.federation.Sub\" message.\ntype FederationService_Org_Federation_SubArgument struct {\n\tFederationService_Org_Federation_SubVariable\n}\n\n// Org_Federation_UserVariable represents variable definitions in \"org.federation.User\".\ntype FederationService_Org_Federation_UserVariable struct {\n\tRes   *user.GetUserResponse\n\tUser  *user.User\n\tXDef2 *Sub\n}\n\n// Org_Federation_UserArgument is argument for \"org.federation.User\" message.\ntype FederationService_Org_Federation_UserArgument struct {\n\tUserId string\n\tFederationService_Org_Federation_UserVariable\n}\n\n// Org_Federation_UserIDVariable represents variable definitions in \"org.federation.UserID\".\ntype FederationService_Org_Federation_UserIDVariable struct {\n}\n\n// Org_Federation_UserIDArgument is argument for \"org.federation.UserID\" message.\ntype FederationService_Org_Federation_UserIDArgument struct {\n\tFederationService_Org_Federation_UserIDVariable\n}\n\n// Org_Federation_User_NameArgument is custom resolver's argument for \"name\" field of \"org.federation.User\" message.\ntype FederationService_Org_Federation_User_NameArgument struct {\n\t*FederationService_Org_Federation_UserArgument\n}\n\n// FederationServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationServiceConfig struct {\n\t// Client provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\n\t// If this interface is not provided, an error is returned during initialization.\n\tClient FederationServiceClientFactory // required\n\t// Resolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\n\t// If this interface is not provided, an error is returned during initialization.\n\tResolver FederationServiceResolver // required\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationServiceClientFactory interface {\n\t// Org_User_UserServiceClient create a gRPC Client to be used to call methods in org.user.UserService.\n\tOrg_User_UserServiceClient(FederationServiceClientConfig) (user.UserServiceClient, error)\n}\n\n// FederationServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationServiceDependentClientSet struct {\n\tOrg_User_UserServiceClient user.UserServiceClient\n}\n\n// FederationServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationServiceResolver interface {\n\t// Resolve_Org_Federation_Sub implements resolver for \"org.federation.Sub\".\n\tResolve_Org_Federation_Sub(context.Context, *FederationService_Org_Federation_SubArgument) (*Sub, error)\n\t// Resolve_Org_Federation_User_Name implements resolver for \"org.federation.User.name\".\n\tResolve_Org_Federation_User_Name(context.Context, *FederationService_Org_Federation_User_NameArgument) (string, error)\n}\n\n// FederationServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// FederationServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationServiceUnimplementedResolver struct{}\n\n// Resolve_Org_Federation_Sub resolve \"org.federation.Sub\".\n// This method always returns Unimplemented error.\nfunc (FederationServiceUnimplementedResolver) Resolve_Org_Federation_Sub(context.Context, *FederationService_Org_Federation_SubArgument) (ret *Sub, e error) {\n\te = grpcfed.GRPCErrorf(grpcfed.UnimplementedCode, \"method Resolve_Org_Federation_Sub not implemented\")\n\treturn\n}\n\n// Resolve_Org_Federation_User_Name resolve \"org.federation.User.name\".\n// This method always returns Unimplemented error.\nfunc (FederationServiceUnimplementedResolver) Resolve_Org_Federation_User_Name(context.Context, *FederationService_Org_Federation_User_NameArgument) (ret string, e error) {\n\te = grpcfed.GRPCErrorf(grpcfed.UnimplementedCode, \"method Resolve_Org_Federation_User_Name not implemented\")\n\treturn\n}\n\nconst (\n\tFederationService_DependentMethod_Org_User_UserService_GetUser = \"/org.user.UserService/GetUser\"\n)\n\n// FederationService represents Federation Service.\ntype FederationService struct {\n\tUnimplementedFederationServiceServer\n\tcfg             FederationServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tresolver        FederationServiceResolver\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationServiceDependentClientSet\n}\n\n// NewFederationService creates FederationService instance by FederationServiceConfig.\nfunc NewFederationService(cfg FederationServiceConfig) (*FederationService, error) {\n\tif cfg.Client == nil {\n\t\treturn nil, grpcfed.ErrClientConfig\n\t}\n\tif cfg.Resolver == nil {\n\t\treturn nil, grpcfed.ErrResolverConfig\n\t}\n\tOrg_User_UserServiceClient, err := cfg.Client.Org_User_UserServiceClient(FederationServiceClientConfig{\n\t\tService: \"org.user.UserService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"org.federation.FederationService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.org.federation.GetResponseArgument\": {},\n\t\t\"grpc.federation.private.org.federation.SubArgument\":         {},\n\t\t\"grpc.federation.private.org.federation.UserArgument\": {\n\t\t\t\"user_id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"UserId\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.UserIDArgument\": {},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"org.federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.GRPCErrorAccessorOptions(celTypeHelper, \"org.user.GetUserResponse\")...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.user.Item.ItemType\", user.Item_ItemType_value, user.Item_ItemType_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.user.UserType\", user.UserType_value, user.UserType_name)...)\n\tsvc := &FederationService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tresolver:        cfg.Resolver,\n\t\tclient: &FederationServiceDependentClientSet{\n\t\t\tOrg_User_UserServiceClient: Org_User_UserServiceClient,\n\t\t},\n\t}\n\tif resolver, ok := cfg.Resolver.(grpcfed.CustomResolverInitializer); ok {\n\t\tctx := context.Background()\n\t\tif err := resolver.Init(ctx); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationService(ctx context.Context, svc *FederationService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n// Get implements \"org.federation.FederationService/Get\" method.\nfunc (s *FederationService) Get(ctx context.Context, req *GetRequest) (res *GetResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.FederationService/Get\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Org_Federation_GetResponse(ctx, &FederationService_Org_Federation_GetResponseArgument{})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Org_Federation_GetResponse resolve \"org.federation.GetResponse\" message.\nfunc (s *FederationService) resolve_Org_Federation_GetResponse(ctx context.Context, req *FederationService_Org_Federation_GetResponseArgument) (*GetResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.GetResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.GetResponse\", slog.Any(\"message_args\", s.logvalue_Org_Federation_GetResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tUid   *UserID\n\t\t\tUser  *User\n\t\t\tUser2 *User\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.GetResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"uid\"\n\t\t  message {\n\t\t    name: \"UserID\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_uid := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*UserID, *localValueType]{\n\t\t\tName: `uid`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.UserID\"),\n\t\t\tSetter: func(value *localValueType, v *UserID) error {\n\t\t\t\tvalue.vars.Uid = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_UserIDArgument{}\n\t\t\t\tret, err := s.resolve_Org_Federation_UserID(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"user\"\n\t\t  message {\n\t\t    name: \"User\"\n\t\t    args { name: \"user_id\", by: \"uid.value\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_user := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*User, *localValueType]{\n\t\t\tName: `user`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.User\"),\n\t\t\tSetter: func(value *localValueType, v *User) error {\n\t\t\t\tvalue.vars.User = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_UserArgument{}\n\t\t\t\t// { name: \"user_id\", by: \"uid.value\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `uid.value`,\n\t\t\t\t\tCacheIndex: 1,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.UserId = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_User(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"user2\"\n\t\t  message {\n\t\t    name: \"User\"\n\t\t    args { name: \"user_id\", by: \"uid.value\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_user2 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*User, *localValueType]{\n\t\t\tName: `user2`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.User\"),\n\t\t\tSetter: func(value *localValueType, v *User) error {\n\t\t\t\tvalue.vars.User2 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_UserArgument{}\n\t\t\t\t// { name: \"user_id\", by: \"uid.value\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `uid.value`,\n\t\t\t\t\tCacheIndex: 2,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.UserId = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_User(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t   uid ─┐\n\t         user ─┐\n\t   uid ─┐      │\n\t        user2 ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_uid(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_user(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_uid(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_user2(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_GetResponseVariable.Uid = value.vars.Uid\n\treq.FederationService_Org_Federation_GetResponseVariable.User = value.vars.User\n\treq.FederationService_Org_Federation_GetResponseVariable.User2 = value.vars.User2\n\n\t// create a message value to be returned.\n\tret := &GetResponse{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"user\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*User]{\n\t\tValue:      value,\n\t\tExpr:       `user`,\n\t\tCacheIndex: 3,\n\t\tSetter: func(v *User) error {\n\t\t\tret.User = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"user2\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*User]{\n\t\tValue:      value,\n\t\tExpr:       `user2`,\n\t\tCacheIndex: 4,\n\t\tSetter: func(v *User) error {\n\t\t\tret.User2 = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.GetResponse\", slog.Any(\"org.federation.GetResponse\", s.logvalue_Org_Federation_GetResponse(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_Sub resolve \"org.federation.Sub\" message.\nfunc (s *FederationService) resolve_Org_Federation_Sub(ctx context.Context, req *FederationService_Org_Federation_SubArgument) (*Sub, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.Sub\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.Sub\", slog.Any(\"message_args\", s.logvalue_Org_Federation_SubArgument(req)))\n\n\t// create a message value to be returned.\n\t// `custom_resolver = true` in \"grpc.federation.message\" option.\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx)) // create a new reference to logger.\n\tret, err := s.resolver.Resolve_Org_Federation_Sub(ctx, req)\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.Sub\", slog.Any(\"org.federation.Sub\", s.logvalue_Org_Federation_Sub(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_User resolve \"org.federation.User\" message.\nfunc (s *FederationService) resolve_Org_Federation_User(ctx context.Context, req *FederationService_Org_Federation_UserArgument) (*User, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.User\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.User\", slog.Any(\"message_args\", s.logvalue_Org_Federation_UserArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tRes   *user.GetUserResponse\n\t\t\tUser  *user.User\n\t\t\tXDef2 *Sub\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.UserArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"org.user.UserService/GetUser\"\n\t\t    request { field: \"id\", by: \"$.user_id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*user.GetUserResponse, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"org.user.GetUserResponse\"),\n\t\t\tSetter: func(value *localValueType, v *user.GetUserResponse) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &user.GetUserRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.user_id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.user_id`,\n\t\t\t\t\tCacheIndex: 5,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call org.user.UserService/GetUser\", slog.Any(\"org.user.GetUserRequest\", s.logvalue_Org_User_GetUserRequest(args)))\n\t\t\t\tret, err := s.client.Org_User_UserServiceClient.GetUser(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Org_User_UserService_GetUser, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"user\"\n\t\t  autobind: true\n\t\t  by: \"res.user\"\n\t\t}\n\t*/\n\tdef_user := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*user.User, *localValueType]{\n\t\t\tName: `user`,\n\t\t\tType: grpcfed.CELObjectType(\"org.user.User\"),\n\t\t\tSetter: func(value *localValueType, v *user.User) error {\n\t\t\t\tvalue.vars.User = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `res.user`,\n\t\t\tByCacheIndex: 6,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"_def2\"\n\t\t  message {\n\t\t    name: \"Sub\"\n\t\t  }\n\t\t}\n\t*/\n\tdef__def2 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Sub, *localValueType]{\n\t\t\tName: `_def2`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.Sub\"),\n\t\t\tSetter: func(value *localValueType, v *Sub) error {\n\t\t\t\tvalue.vars.XDef2 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_SubArgument{}\n\t\t\t\tret, err := s.resolve_Org_Federation_Sub(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t        _def2 ─┐\n\t   res ─┐      │\n\t         user ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def__def2(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_user(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_UserVariable.Res = value.vars.Res\n\treq.FederationService_Org_Federation_UserVariable.User = value.vars.User\n\treq.FederationService_Org_Federation_UserVariable.XDef2 = value.vars.XDef2\n\n\t// create a message value to be returned.\n\tret := &User{}\n\n\t// field binding section.\n\tret.Id = value.vars.User.GetId() // { name: \"user\", autobind: true }\n\t{\n\t\t// (grpc.federation.field).custom_resolver = true\n\t\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx)) // create a new reference to logger.\n\t\tvar err error\n\t\tret.Name, err = s.resolver.Resolve_Org_Federation_User_Name(ctx, &FederationService_Org_Federation_User_NameArgument{\n\t\t\tFederationService_Org_Federation_UserArgument: req,\n\t\t})\n\t\tif err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.User\", slog.Any(\"org.federation.User\", s.logvalue_Org_Federation_User(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_UserID resolve \"org.federation.UserID\" message.\nfunc (s *FederationService) resolve_Org_Federation_UserID(ctx context.Context, req *FederationService_Org_Federation_UserIDArgument) (*UserID, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.UserID\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.UserID\", slog.Any(\"message_args\", s.logvalue_Org_Federation_UserIDArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tXDef0 *Sub\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.UserIDArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"_def0\"\n\t\t  message {\n\t\t    name: \"Sub\"\n\t\t  }\n\t\t}\n\t*/\n\tdef__def0 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Sub, *localValueType]{\n\t\t\tName: `_def0`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.Sub\"),\n\t\t\tSetter: func(value *localValueType, v *Sub) error {\n\t\t\t\tvalue.vars.XDef0 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_SubArgument{}\n\t\t\t\tret, err := s.resolve_Org_Federation_Sub(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def__def0(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// create a message value to be returned.\n\tret := &UserID{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'xxx'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'xxx'`,\n\t\tCacheIndex: 7,\n\t\tSetter: func(v string) error {\n\t\t\tret.Value = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.UserID\", slog.Any(\"org.federation.UserID\", s.logvalue_Org_Federation_UserID(ret)))\n\treturn ret, nil\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetResponse(v *GetResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"user\", s.logvalue_Org_Federation_User(v.GetUser())),\n\t\tslog.Any(\"user2\", s.logvalue_Org_Federation_User(v.GetUser2())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetResponseArgument(v *FederationService_Org_Federation_GetResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_Sub(v *Sub) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_SubArgument(v *FederationService_Org_Federation_SubArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_User(v *User) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.String(\"name\", v.GetName()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_UserArgument(v *FederationService_Org_Federation_UserArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"user_id\", v.UserId),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_UserID(v *UserID) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"value\", v.GetValue()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_UserIDArgument(v *FederationService_Org_Federation_UserIDArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_User_GetUserRequest(v *user.GetUserRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.Int64(\"foo\", v.GetFoo()),\n\t\tslog.String(\"bar\", v.GetBar()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_User_GetUsersRequest(v *user.GetUsersRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.GetIds()),\n\t)\n}\n"
  },
  {
    "path": "generator/testdata/expected_oneof.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: oneof.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n\n\tuser \"example/user\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Org_Federation_GetResponseVariable represents variable definitions in \"org.federation.GetResponse\".\ntype FederationService_Org_Federation_GetResponseVariable struct {\n\tSel *UserSelection\n}\n\n// Org_Federation_GetResponseArgument is argument for \"org.federation.GetResponse\" message.\ntype FederationService_Org_Federation_GetResponseArgument struct {\n\tFederationService_Org_Federation_GetResponseVariable\n}\n\n// Org_Federation_MVariable represents variable definitions in \"org.federation.M\".\ntype FederationService_Org_Federation_MVariable struct {\n}\n\n// Org_Federation_MArgument is argument for \"org.federation.M\" message.\ntype FederationService_Org_Federation_MArgument struct {\n\tFederationService_Org_Federation_MVariable\n}\n\n// Org_Federation_UserVariable represents variable definitions in \"org.federation.User\".\ntype FederationService_Org_Federation_UserVariable struct {\n}\n\n// Org_Federation_UserArgument is argument for \"org.federation.User\" message.\ntype FederationService_Org_Federation_UserArgument struct {\n\tUserId string\n\tFederationService_Org_Federation_UserVariable\n}\n\n// Org_Federation_UserSelectionVariable represents variable definitions in \"org.federation.UserSelection\".\ntype FederationService_Org_Federation_UserSelectionVariable struct {\n\tM  *M\n\tUa *User\n\tUb *User\n\tUc *User\n}\n\n// Org_Federation_UserSelectionArgument is argument for \"org.federation.UserSelection\" message.\ntype FederationService_Org_Federation_UserSelectionArgument struct {\n\tValue string\n\tFederationService_Org_Federation_UserSelectionVariable\n}\n\n// FederationServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationServiceConfig struct {\n\t// Client provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\n\t// If this interface is not provided, an error is returned during initialization.\n\tClient FederationServiceClientFactory // required\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationServiceClientFactory interface {\n\t// Org_User_UserServiceClient create a gRPC Client to be used to call methods in org.user.UserService.\n\tOrg_User_UserServiceClient(FederationServiceClientConfig) (user.UserServiceClient, error)\n}\n\n// FederationServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationServiceDependentClientSet struct {\n\tOrg_User_UserServiceClient user.UserServiceClient\n}\n\n// FederationServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationServiceResolver interface {\n}\n\n// FederationServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// FederationServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationServiceUnimplementedResolver struct{}\n\nconst (\n\tFederationService_DependentMethod_Org_User_UserService_GetUser = \"/org.user.UserService/GetUser\"\n)\n\n// FederationService represents Federation Service.\ntype FederationService struct {\n\tUnimplementedFederationServiceServer\n\tcfg             FederationServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationServiceDependentClientSet\n}\n\n// NewFederationService creates FederationService instance by FederationServiceConfig.\nfunc NewFederationService(cfg FederationServiceConfig) (*FederationService, error) {\n\tif cfg.Client == nil {\n\t\treturn nil, grpcfed.ErrClientConfig\n\t}\n\tOrg_User_UserServiceClient, err := cfg.Client.Org_User_UserServiceClient(FederationServiceClientConfig{\n\t\tService: \"org.user.UserService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"org.federation.FederationService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.org.federation.GetResponseArgument\": {},\n\t\t\"grpc.federation.private.org.federation.MArgument\":           {},\n\t\t\"grpc.federation.private.org.federation.UserArgument\": {\n\t\t\t\"user_id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"UserId\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.UserSelectionArgument\": {\n\t\t\t\"value\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Value\"),\n\t\t},\n\t\t\"org.federation.UserSelection\": {\n\t\t\t\"user\": grpcfed.NewOneofSelectorFieldType(\n\t\t\t\tgrpcfed.NewCELObjectType(\"org.federation.User\"), \"User\",\n\t\t\t\t[]reflect.Type{reflect.TypeOf((*UserSelection_UserA)(nil)), reflect.TypeOf((*UserSelection_UserB)(nil)), reflect.TypeOf((*UserSelection_UserC)(nil))},\n\t\t\t\t[]string{\"GetUserA\", \"GetUserB\", \"GetUserC\"},\n\t\t\t\treflect.Zero(reflect.TypeOf((*User)(nil))),\n\t\t\t),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"org.federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.GRPCErrorAccessorOptions(celTypeHelper, \"org.user.GetUserResponse\")...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.user.Item.ItemType\", user.Item_ItemType_value, user.Item_ItemType_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.user.UserType\", user.UserType_value, user.UserType_name)...)\n\tsvc := &FederationService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tclient: &FederationServiceDependentClientSet{\n\t\t\tOrg_User_UserServiceClient: Org_User_UserServiceClient,\n\t\t},\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationService(ctx context.Context, svc *FederationService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n// Get implements \"org.federation.FederationService/Get\" method.\nfunc (s *FederationService) Get(ctx context.Context, req *GetRequest) (res *GetResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.FederationService/Get\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Org_Federation_GetResponse(ctx, &FederationService_Org_Federation_GetResponseArgument{})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Org_Federation_GetResponse resolve \"org.federation.GetResponse\" message.\nfunc (s *FederationService) resolve_Org_Federation_GetResponse(ctx context.Context, req *FederationService_Org_Federation_GetResponseArgument) (*GetResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.GetResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.GetResponse\", slog.Any(\"message_args\", s.logvalue_Org_Federation_GetResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tSel *UserSelection\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.GetResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"sel\"\n\t\t  message {\n\t\t    name: \"UserSelection\"\n\t\t    args { name: \"value\", by: \"'foo'\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_sel := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*UserSelection, *localValueType]{\n\t\t\tName: `sel`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.UserSelection\"),\n\t\t\tSetter: func(value *localValueType, v *UserSelection) error {\n\t\t\t\tvalue.vars.Sel = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_UserSelectionArgument{}\n\t\t\t\t// { name: \"value\", by: \"'foo'\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `'foo'`,\n\t\t\t\t\tCacheIndex: 1,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Value = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_UserSelection(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_sel(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_GetResponseVariable.Sel = value.vars.Sel\n\n\t// create a message value to be returned.\n\tret := &GetResponse{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"sel.user\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*User]{\n\t\tValue:      value,\n\t\tExpr:       `sel.user`,\n\t\tCacheIndex: 2,\n\t\tSetter: func(v *User) error {\n\t\t\tret.User = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.GetResponse\", slog.Any(\"org.federation.GetResponse\", s.logvalue_Org_Federation_GetResponse(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_M resolve \"org.federation.M\" message.\nfunc (s *FederationService) resolve_Org_Federation_M(ctx context.Context, req *FederationService_Org_Federation_MArgument) (*M, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.M\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.M\", slog.Any(\"message_args\", s.logvalue_Org_Federation_MArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.MArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &M{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'foo'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'foo'`,\n\t\tCacheIndex: 3,\n\t\tSetter: func(v string) error {\n\t\t\tret.Value = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.M\", slog.Any(\"org.federation.M\", s.logvalue_Org_Federation_M(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_User resolve \"org.federation.User\" message.\nfunc (s *FederationService) resolve_Org_Federation_User(ctx context.Context, req *FederationService_Org_Federation_UserArgument) (*User, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.User\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.User\", slog.Any(\"message_args\", s.logvalue_Org_Federation_UserArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tXDef0 *user.GetUserResponse\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.UserArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"_def0\"\n\t\t  call {\n\t\t    method: \"org.user.UserService/GetUser\"\n\t\t    request: [\n\t\t      { field: \"id\", by: \"$.user_id\" },\n\t\t      { field: \"foo\", by: \"1\", if: \"false\" },\n\t\t      { field: \"bar\", by: \"'hello'\", if: \"true\" }\n\t\t    ]\n\t\t  }\n\t\t}\n\t*/\n\tdef__def0 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*user.GetUserResponse, *localValueType]{\n\t\t\tName: `_def0`,\n\t\t\tType: grpcfed.CELObjectType(\"org.user.GetUserResponse\"),\n\t\t\tSetter: func(value *localValueType, v *user.GetUserResponse) error {\n\t\t\t\tvalue.vars.XDef0 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &user.GetUserRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.user_id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.user_id`,\n\t\t\t\t\tCacheIndex: 4,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"foo\", by: \"1\", if: \"false\" }\n\t\t\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `false`,\n\t\t\t\t\tCacheIndex: 5,\n\t\t\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t\t\treturn grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[int64]{\n\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\tExpr:       `1`,\n\t\t\t\t\t\t\tCacheIndex: 6,\n\t\t\t\t\t\t\tSetter: func(v int64) error {\n\t\t\t\t\t\t\t\targs.Foobar = &user.GetUserRequest_Foo{\n\t\t\t\t\t\t\t\t\tFoo: v,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { field: \"bar\", by: \"'hello'\", if: \"true\" }\n\t\t\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `true`,\n\t\t\t\t\tCacheIndex: 7,\n\t\t\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t\t\treturn grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\tExpr:       `'hello'`,\n\t\t\t\t\t\t\tCacheIndex: 8,\n\t\t\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\t\t\targs.Foobar = &user.GetUserRequest_Bar{\n\t\t\t\t\t\t\t\t\tBar: v,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call org.user.UserService/GetUser\", slog.Any(\"org.user.GetUserRequest\", s.logvalue_Org_User_GetUserRequest(args)))\n\t\t\t\tret, err := s.client.Org_User_UserServiceClient.GetUser(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Org_User_UserService_GetUser, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def__def0(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// create a message value to be returned.\n\tret := &User{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"$.user_id\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `$.user_id`,\n\t\tCacheIndex: 9,\n\t\tSetter: func(v string) error {\n\t\t\tret.Id = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.User\", slog.Any(\"org.federation.User\", s.logvalue_Org_Federation_User(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_UserSelection resolve \"org.federation.UserSelection\" message.\nfunc (s *FederationService) resolve_Org_Federation_UserSelection(ctx context.Context, req *FederationService_Org_Federation_UserSelectionArgument) (*UserSelection, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.UserSelection\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.UserSelection\", slog.Any(\"message_args\", s.logvalue_Org_Federation_UserSelectionArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tM  *M\n\t\t\tUa *User\n\t\t\tUb *User\n\t\t\tUc *User\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.UserSelectionArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"m\"\n\t\t  message {\n\t\t    name: \"M\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_m := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*M, *localValueType]{\n\t\t\tName: `m`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.M\"),\n\t\t\tSetter: func(value *localValueType, v *M) error {\n\t\t\t\tvalue.vars.M = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_MArgument{}\n\t\t\t\tret, err := s.resolve_Org_Federation_M(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_m(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_UserSelectionVariable.M = value.vars.M\n\treq.FederationService_Org_Federation_UserSelectionVariable.Ua = value.vars.Ua\n\treq.FederationService_Org_Federation_UserSelectionVariable.Ub = value.vars.Ub\n\treq.FederationService_Org_Federation_UserSelectionVariable.Uc = value.vars.Uc\n\n\t// create a message value to be returned.\n\tret := &UserSelection{}\n\n\t// field binding section.\n\toneof_UserA, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\tValue:      value,\n\t\tExpr:       `m.value == $.value`,\n\t\tOutType:    reflect.TypeOf(true),\n\t\tCacheIndex: 10,\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\toneof_UserB, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\tValue:      value,\n\t\tExpr:       `m.value != $.value`,\n\t\tOutType:    reflect.TypeOf(true),\n\t\tCacheIndex: 11,\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\tif false {\n\t\t// For code generation reasons, we're using a loop to generate the oneof conditional branches,\n\t\t// so to avoid treating the first element specially, we always generate if branch with false condition.\n\t} else if oneof_UserA.(bool) {\n\t\t/*\n\t\t\tdef {\n\t\t\t  name: \"ua\"\n\t\t\t  message {\n\t\t\t    name: \"User\"\n\t\t\t    args { name: \"user_id\", by: \"'a'\" }\n\t\t\t  }\n\t\t\t}\n\t\t*/\n\t\tdef_ua := func(ctx context.Context) error {\n\t\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*User, *localValueType]{\n\t\t\t\tName: `ua`,\n\t\t\t\tType: grpcfed.CELObjectType(\"org.federation.User\"),\n\t\t\t\tSetter: func(value *localValueType, v *User) error {\n\t\t\t\t\tvalue.vars.Ua = v\n\t\t\t\t\treturn nil\n\t\t\t\t},\n\t\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\t\targs := &FederationService_Org_Federation_UserArgument{}\n\t\t\t\t\t// { name: \"user_id\", by: \"'a'\" }\n\t\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\tExpr:       `'a'`,\n\t\t\t\t\t\tCacheIndex: 12,\n\t\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\t\targs.UserId = v\n\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t},\n\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t}\n\t\t\t\t\tret, err := s.resolve_Org_Federation_User(ctx, args)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t}\n\t\t\t\t\treturn ret, nil\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\n\t\tif err := def_ua(ctx); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*User]{\n\t\t\tValue:      value,\n\t\t\tExpr:       `ua`,\n\t\t\tCacheIndex: 13,\n\t\t\tSetter: func(v *User) error {\n\t\t\t\tuserValue, err := s.cast_Org_Federation_User__to__Org_Federation_UserSelection_UserA(v)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tret.User = userValue\n\t\t\t\treturn nil\n\t\t\t},\n\t\t}); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t} else if oneof_UserB.(bool) {\n\t\t/*\n\t\t\tdef {\n\t\t\t  name: \"ub\"\n\t\t\t  message {\n\t\t\t    name: \"User\"\n\t\t\t    args { name: \"user_id\", by: \"'b'\" }\n\t\t\t  }\n\t\t\t}\n\t\t*/\n\t\tdef_ub := func(ctx context.Context) error {\n\t\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*User, *localValueType]{\n\t\t\t\tName: `ub`,\n\t\t\t\tType: grpcfed.CELObjectType(\"org.federation.User\"),\n\t\t\t\tSetter: func(value *localValueType, v *User) error {\n\t\t\t\t\tvalue.vars.Ub = v\n\t\t\t\t\treturn nil\n\t\t\t\t},\n\t\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\t\targs := &FederationService_Org_Federation_UserArgument{}\n\t\t\t\t\t// { name: \"user_id\", by: \"'b'\" }\n\t\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\tExpr:       `'b'`,\n\t\t\t\t\t\tCacheIndex: 14,\n\t\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\t\targs.UserId = v\n\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t},\n\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t}\n\t\t\t\t\tret, err := s.resolve_Org_Federation_User(ctx, args)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t}\n\t\t\t\t\treturn ret, nil\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\n\t\tif err := def_ub(ctx); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*User]{\n\t\t\tValue:      value,\n\t\t\tExpr:       `ub`,\n\t\t\tCacheIndex: 15,\n\t\t\tSetter: func(v *User) error {\n\t\t\t\tuserValue, err := s.cast_Org_Federation_User__to__Org_Federation_UserSelection_UserB(v)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tret.User = userValue\n\t\t\t\treturn nil\n\t\t\t},\n\t\t}); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t} else {\n\t\t/*\n\t\t\tdef {\n\t\t\t  name: \"uc\"\n\t\t\t  message {\n\t\t\t    name: \"User\"\n\t\t\t    args { name: \"user_id\", by: \"$.value\" }\n\t\t\t  }\n\t\t\t}\n\t\t*/\n\t\tdef_uc := func(ctx context.Context) error {\n\t\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*User, *localValueType]{\n\t\t\t\tName: `uc`,\n\t\t\t\tType: grpcfed.CELObjectType(\"org.federation.User\"),\n\t\t\t\tSetter: func(value *localValueType, v *User) error {\n\t\t\t\t\tvalue.vars.Uc = v\n\t\t\t\t\treturn nil\n\t\t\t\t},\n\t\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\t\targs := &FederationService_Org_Federation_UserArgument{}\n\t\t\t\t\t// { name: \"user_id\", by: \"$.value\" }\n\t\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\tExpr:       `$.value`,\n\t\t\t\t\t\tCacheIndex: 16,\n\t\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\t\targs.UserId = v\n\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t},\n\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t}\n\t\t\t\t\tret, err := s.resolve_Org_Federation_User(ctx, args)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t}\n\t\t\t\t\treturn ret, nil\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\n\t\tif err := def_uc(ctx); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*User]{\n\t\t\tValue:      value,\n\t\t\tExpr:       `uc`,\n\t\t\tCacheIndex: 17,\n\t\t\tSetter: func(v *User) error {\n\t\t\t\tuserValue, err := s.cast_Org_Federation_User__to__Org_Federation_UserSelection_UserC(v)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tret.User = userValue\n\t\t\t\treturn nil\n\t\t\t},\n\t\t}); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.UserSelection\", slog.Any(\"org.federation.UserSelection\", s.logvalue_Org_Federation_UserSelection(ret)))\n\treturn ret, nil\n}\n\n// cast_Org_Federation_User__to__Org_Federation_UserSelection_UserA cast from \"org.federation.User\" to \"org.federation.UserSelection.user_a\".\nfunc (s *FederationService) cast_Org_Federation_User__to__Org_Federation_UserSelection_UserA(from *User) (*UserSelection_UserA, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tidValue := from.GetId()\n\tret := &User{\n\t\tId: idValue,\n\t}\n\n\treturn &UserSelection_UserA{\n\t\tUserA: ret,\n\t}, nil\n}\n\n// cast_Org_Federation_User__to__Org_Federation_UserSelection_UserB cast from \"org.federation.User\" to \"org.federation.UserSelection.user_b\".\nfunc (s *FederationService) cast_Org_Federation_User__to__Org_Federation_UserSelection_UserB(from *User) (*UserSelection_UserB, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tidValue := from.GetId()\n\tret := &User{\n\t\tId: idValue,\n\t}\n\n\treturn &UserSelection_UserB{\n\t\tUserB: ret,\n\t}, nil\n}\n\n// cast_Org_Federation_User__to__Org_Federation_UserSelection_UserC cast from \"org.federation.User\" to \"org.federation.UserSelection.user_c\".\nfunc (s *FederationService) cast_Org_Federation_User__to__Org_Federation_UserSelection_UserC(from *User) (*UserSelection_UserC, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tidValue := from.GetId()\n\tret := &User{\n\t\tId: idValue,\n\t}\n\n\treturn &UserSelection_UserC{\n\t\tUserC: ret,\n\t}, nil\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetResponse(v *GetResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"user\", s.logvalue_Org_Federation_User(v.GetUser())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetResponseArgument(v *FederationService_Org_Federation_GetResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_M(v *M) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"value\", v.GetValue()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_MArgument(v *FederationService_Org_Federation_MArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_User(v *User) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_UserArgument(v *FederationService_Org_Federation_UserArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"user_id\", v.UserId),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_UserSelection(v *UserSelection) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"user_a\", s.logvalue_Org_Federation_User(v.GetUserA())),\n\t\tslog.Any(\"user_b\", s.logvalue_Org_Federation_User(v.GetUserB())),\n\t\tslog.Any(\"user_c\", s.logvalue_Org_Federation_User(v.GetUserC())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_UserSelectionArgument(v *FederationService_Org_Federation_UserSelectionArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"value\", v.Value),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_User_GetUserRequest(v *user.GetUserRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.Int64(\"foo\", v.GetFoo()),\n\t\tslog.String(\"bar\", v.GetBar()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_User_GetUsersRequest(v *user.GetUsersRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.GetIds()),\n\t)\n}\n"
  },
  {
    "path": "generator/testdata/expected_ref_env.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: ref_env.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Org_Federation_ConstantVariable represents variable definitions in \"org.federation.Constant\".\ntype RefEnvService_Org_Federation_ConstantVariable struct {\n}\n\n// Org_Federation_ConstantArgument is argument for \"org.federation.Constant\" message.\ntype RefEnvService_Org_Federation_ConstantArgument struct {\n\tRefEnvService_Org_Federation_ConstantVariable\n}\n\n// RefEnvServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype RefEnvServiceConfig struct {\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// RefEnvServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype RefEnvServiceClientFactory interface {\n}\n\n// RefEnvServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype RefEnvServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// RefEnvServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype RefEnvServiceDependentClientSet struct {\n}\n\n// RefEnvServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype RefEnvServiceResolver interface {\n}\n\n// RefEnvServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype RefEnvServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// RefEnvServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype RefEnvServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// RefEnvServiceEnv keeps the values read from environment variables.\ntype RefEnvServiceEnv struct {\n\tAaa string                      `envconfig:\"AAA\" default:\"xxx\"`\n\tBbb []int64                     `envconfig:\"yyy\"`\n\tCcc map[string]grpcfed.Duration `envconfig:\"c\" required:\"true\"`\n\tDdd float64                     `envconfig:\"DDD\" ignored:\"true\"`\n}\n\ntype keyRefEnvServiceEnv struct{}\n\n// GetRefEnvServiceEnv gets environment variables.\nfunc GetRefEnvServiceEnv(ctx context.Context) *RefEnvServiceEnv {\n\tvalue := ctx.Value(keyRefEnvServiceEnv{})\n\tif value == nil {\n\t\treturn nil\n\t}\n\treturn value.(*RefEnvServiceEnv)\n}\n\nfunc withRefEnvServiceEnv(ctx context.Context, env *RefEnvServiceEnv) context.Context {\n\treturn context.WithValue(ctx, keyRefEnvServiceEnv{}, env)\n}\n\n// RefEnvServiceVariable keeps the initial values.\ntype RefEnvServiceVariable struct {\n\tConstant *Constant\n}\n\ntype keyRefEnvServiceVariable struct{}\n\n// GetRefEnvServiceVariable gets initial variables.\nfunc GetRefEnvServiceVariable(ctx context.Context) *RefEnvServiceVariable {\n\tvalue := ctx.Value(keyRefEnvServiceVariable{})\n\tif value == nil {\n\t\treturn nil\n\t}\n\treturn value.(*RefEnvServiceVariable)\n}\n\nfunc withRefEnvServiceVariable(ctx context.Context, svcVar *RefEnvServiceVariable) context.Context {\n\treturn context.WithValue(ctx, keyRefEnvServiceVariable{}, svcVar)\n}\n\n// RefEnvServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype RefEnvServiceUnimplementedResolver struct{}\n\n// RefEnvService represents Federation Service.\ntype RefEnvService struct {\n\tUnimplementedRefEnvServiceServer\n\tcfg             RefEnvServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tenv             *RefEnvServiceEnv\n\tsvcVar          *RefEnvServiceVariable\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *RefEnvServiceDependentClientSet\n}\n\n// NewRefEnvService creates RefEnvService instance by RefEnvServiceConfig.\nfunc NewRefEnvService(cfg RefEnvServiceConfig) (*RefEnvService, error) {\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"org.federation.RefEnvService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.org.federation.ConstantArgument\": {},\n\t\t\"grpc.federation.private.Env\": {\n\t\t\t\"aaa\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Aaa\"),\n\t\t\t\"bbb\": grpcfed.NewCELFieldType(grpcfed.NewCELListType(grpcfed.CELIntType), \"Bbb\"),\n\t\t\t\"ccc\": grpcfed.NewCELFieldType(grpcfed.NewCELMapType(grpcfed.CELStringType, grpcfed.NewCELObjectType(\"google.protobuf.Duration\")), \"Ccc\"),\n\t\t\t\"ddd\": grpcfed.NewCELFieldType(grpcfed.CELDoubleType, \"Ddd\"),\n\t\t},\n\t\t\"grpc.federation.private.ServiceVariable\": {\n\t\t\t\"constant\": grpcfed.NewCELFieldType(grpcfed.NewCELObjectType(\"org.federation.Constant\"), \"Constant\"),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"org.federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewCELVariable(\"grpc.federation.env\", grpcfed.CELObjectType(\"grpc.federation.private.Env\")))\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewCELVariable(\"grpc.federation.var\", grpcfed.CELObjectType(\"grpc.federation.private.ServiceVariable\")))\n\tvar env RefEnvServiceEnv\n\tif err := grpcfed.LoadEnv(\"\", &env); err != nil {\n\t\treturn nil, err\n\t}\n\tsvc := &RefEnvService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tenv:             &env,\n\t\tsvcVar:          new(RefEnvServiceVariable),\n\t\tclient:          &RefEnvServiceDependentClientSet{},\n\t}\n\tif err := svc.initServiceVariables(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\treturn svc, nil\n}\n\n// CleanupRefEnvService cleanup all resources to prevent goroutine leaks.\nfunc CleanupRefEnvService(ctx context.Context, svc *RefEnvService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *RefEnvService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\nfunc (s *RefEnvService) initServiceVariables(ctx context.Context) error {\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars *RefEnvServiceVariable\n\t}\n\tvalue := &localValueType{\n\t\tLocalValue: grpcfed.NewServiceVariableLocalValue(s.celEnvOpts),\n\t\tvars:       s.svcVar,\n\t}\n\tvalue.AddEnv(s.env)\n\tvalue.AddServiceVariable(s.svcVar)\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t/*\n\t\tdef {\n\t\t  name: \"constant\"\n\t\t  message {\n\t\t    name: \"Constant\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_constant := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Constant, *localValueType]{\n\t\t\tName: `constant`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.Constant\"),\n\t\t\tSetter: func(value *localValueType, v *Constant) error {\n\t\t\t\tvalue.vars.Constant = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &RefEnvService_Org_Federation_ConstantArgument{}\n\t\t\t\tret, err := s.resolve_Org_Federation_Constant(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\tif err := def_constant(ctx); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// resolve_Org_Federation_Constant resolve \"org.federation.Constant\" message.\nfunc (s *RefEnvService) resolve_Org_Federation_Constant(ctx context.Context, req *RefEnvService_Org_Federation_ConstantArgument) (*Constant, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.Constant\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.Constant\", slog.Any(\"message_args\", s.logvalue_Org_Federation_ConstantArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.ConstantArgument\", req)}\n\tvalue.AddEnv(s.env)\n\tvalue.AddServiceVariable(s.svcVar)\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &Constant{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"grpc.federation.env.aaa + 'xxx'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `grpc.federation.env.aaa + 'xxx'`,\n\t\tCacheIndex: 1,\n\t\tSetter: func(v string) error {\n\t\t\tret.X = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.Constant\", slog.Any(\"org.federation.Constant\", s.logvalue_Org_Federation_Constant(ret)))\n\treturn ret, nil\n}\n\nfunc (s *RefEnvService) logvalue_Org_Federation_Constant(v *Constant) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"x\", v.GetX()),\n\t)\n}\n\nfunc (s *RefEnvService) logvalue_Org_Federation_ConstantArgument(v *RefEnvService_Org_Federation_ConstantArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n"
  },
  {
    "path": "generator/testdata/expected_resolver_overlaps.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: resolver_overlaps.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n\n\tpost \"example/post\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Org_Federation_GetPostResponse1Variable represents variable definitions in \"org.federation.GetPostResponse1\".\ntype FederationService_Org_Federation_GetPostResponse1Variable struct {\n\tPost *Post\n}\n\n// Org_Federation_GetPostResponse1Argument is argument for \"org.federation.GetPostResponse1\" message.\ntype FederationService_Org_Federation_GetPostResponse1Argument struct {\n\tId string\n\tFederationService_Org_Federation_GetPostResponse1Variable\n}\n\n// Org_Federation_GetPostResponse2Variable represents variable definitions in \"org.federation.GetPostResponse2\".\ntype FederationService_Org_Federation_GetPostResponse2Variable struct {\n\tPost *Post\n}\n\n// Org_Federation_GetPostResponse2Argument is argument for \"org.federation.GetPostResponse2\" message.\ntype FederationService_Org_Federation_GetPostResponse2Argument struct {\n\tId string\n\tFederationService_Org_Federation_GetPostResponse2Variable\n}\n\n// Org_Federation_PostVariable represents variable definitions in \"org.federation.Post\".\ntype FederationService_Org_Federation_PostVariable struct {\n\tRes *post.GetPostResponse\n}\n\n// Org_Federation_PostArgument is argument for \"org.federation.Post\" message.\ntype FederationService_Org_Federation_PostArgument struct {\n\tId string\n\tFederationService_Org_Federation_PostVariable\n}\n\n// FederationServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationServiceConfig struct {\n\t// Client provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\n\t// If this interface is not provided, an error is returned during initialization.\n\tClient FederationServiceClientFactory // required\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationServiceClientFactory interface {\n\t// Org_Post_PostServiceClient create a gRPC Client to be used to call methods in org.post.PostService.\n\tOrg_Post_PostServiceClient(FederationServiceClientConfig) (post.PostServiceClient, error)\n}\n\n// FederationServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationServiceDependentClientSet struct {\n\tOrg_Post_PostServiceClient post.PostServiceClient\n}\n\n// FederationServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationServiceResolver interface {\n}\n\n// FederationServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// FederationServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationServiceUnimplementedResolver struct{}\n\nconst (\n\tFederationService_DependentMethod_Org_Post_PostService_GetPost = \"/org.post.PostService/GetPost\"\n)\n\n// FederationService represents Federation Service.\ntype FederationService struct {\n\tUnimplementedFederationServiceServer\n\tcfg             FederationServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationServiceDependentClientSet\n}\n\n// NewFederationService creates FederationService instance by FederationServiceConfig.\nfunc NewFederationService(cfg FederationServiceConfig) (*FederationService, error) {\n\tif cfg.Client == nil {\n\t\treturn nil, grpcfed.ErrClientConfig\n\t}\n\tOrg_Post_PostServiceClient, err := cfg.Client.Org_Post_PostServiceClient(FederationServiceClientConfig{\n\t\tService: \"org.post.PostService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"org.federation.FederationService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.org.federation.GetPostResponse1Argument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.GetPostResponse2Argument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.PostArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"org.federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.GRPCErrorAccessorOptions(celTypeHelper, \"org.post.GetPostResponse\")...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.post.PostContent.Category\", post.PostContent_Category_value, post.PostContent_Category_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.post.PostDataType\", post.PostDataType_value, post.PostDataType_name)...)\n\tsvc := &FederationService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tclient: &FederationServiceDependentClientSet{\n\t\t\tOrg_Post_PostServiceClient: Org_Post_PostServiceClient,\n\t\t},\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationService(ctx context.Context, svc *FederationService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n// GetPost1 implements \"org.federation.FederationService/GetPost1\" method.\nfunc (s *FederationService) GetPost1(ctx context.Context, req *GetPostRequest) (res *GetPostResponse1, e error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.FederationService/GetPost1\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Org_Federation_GetPostResponse1(ctx, &FederationService_Org_Federation_GetPostResponse1Argument{\n\t\tId: req.GetId(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// GetPost2 implements \"org.federation.FederationService/GetPost2\" method.\nfunc (s *FederationService) GetPost2(ctx context.Context, req *GetPostRequest) (res *GetPostResponse2, e error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.FederationService/GetPost2\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Org_Federation_GetPostResponse2(ctx, &FederationService_Org_Federation_GetPostResponse2Argument{\n\t\tId: req.GetId(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Org_Federation_GetPostResponse1 resolve \"org.federation.GetPostResponse1\" message.\nfunc (s *FederationService) resolve_Org_Federation_GetPostResponse1(ctx context.Context, req *FederationService_Org_Federation_GetPostResponse1Argument) (*GetPostResponse1, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.GetPostResponse1\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.GetPostResponse1\", slog.Any(\"message_args\", s.logvalue_Org_Federation_GetPostResponse1Argument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tPost *Post\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.GetPostResponse1Argument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"post\"\n\t\t  message {\n\t\t    name: \"Post\"\n\t\t    args { name: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_post := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Post, *localValueType]{\n\t\t\tName: `post`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.Post\"),\n\t\t\tSetter: func(value *localValueType, v *Post) error {\n\t\t\t\tvalue.vars.Post = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_PostArgument{}\n\t\t\t\t// { name: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 1,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_Post(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_post(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_GetPostResponse1Variable.Post = value.vars.Post\n\n\t// create a message value to be returned.\n\tret := &GetPostResponse1{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"post\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*Post]{\n\t\tValue:      value,\n\t\tExpr:       `post`,\n\t\tCacheIndex: 2,\n\t\tSetter: func(v *Post) error {\n\t\t\tret.Post = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.GetPostResponse1\", slog.Any(\"org.federation.GetPostResponse1\", s.logvalue_Org_Federation_GetPostResponse1(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_GetPostResponse2 resolve \"org.federation.GetPostResponse2\" message.\nfunc (s *FederationService) resolve_Org_Federation_GetPostResponse2(ctx context.Context, req *FederationService_Org_Federation_GetPostResponse2Argument) (*GetPostResponse2, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.GetPostResponse2\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.GetPostResponse2\", slog.Any(\"message_args\", s.logvalue_Org_Federation_GetPostResponse2Argument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tPost *Post\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.GetPostResponse2Argument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"post\"\n\t\t  message {\n\t\t    name: \"Post\"\n\t\t    args { name: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_post := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Post, *localValueType]{\n\t\t\tName: `post`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.Post\"),\n\t\t\tSetter: func(value *localValueType, v *Post) error {\n\t\t\t\tvalue.vars.Post = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_PostArgument{}\n\t\t\t\t// { name: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 3,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_Post(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_post(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_GetPostResponse2Variable.Post = value.vars.Post\n\n\t// create a message value to be returned.\n\tret := &GetPostResponse2{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"post\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*Post]{\n\t\tValue:      value,\n\t\tExpr:       `post`,\n\t\tCacheIndex: 4,\n\t\tSetter: func(v *Post) error {\n\t\t\tret.Post = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.GetPostResponse2\", slog.Any(\"org.federation.GetPostResponse2\", s.logvalue_Org_Federation_GetPostResponse2(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_Post resolve \"org.federation.Post\" message.\nfunc (s *FederationService) resolve_Org_Federation_Post(ctx context.Context, req *FederationService_Org_Federation_PostArgument) (*Post, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.Post\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.Post\", slog.Any(\"message_args\", s.logvalue_Org_Federation_PostArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tRes *post.GetPostResponse\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.PostArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"org.post.PostService/GetPost\"\n\t\t    request { field: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.GetPostResponse, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"org.post.GetPostResponse\"),\n\t\t\tSetter: func(value *localValueType, v *post.GetPostResponse) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &post.GetPostRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 5,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call org.post.PostService/GetPost\", slog.Any(\"org.post.GetPostRequest\", s.logvalue_Org_Post_GetPostRequest(args)))\n\t\t\t\tret, err := s.client.Org_Post_PostServiceClient.GetPost(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Org_Post_PostService_GetPost, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_res(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_PostVariable.Res = value.vars.Res\n\n\t// create a message value to be returned.\n\tret := &Post{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"res.post.id\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `res.post.id`,\n\t\tCacheIndex: 6,\n\t\tSetter: func(v string) error {\n\t\t\tret.Id = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.Post\", slog.Any(\"org.federation.Post\", s.logvalue_Org_Federation_Post(ret)))\n\treturn ret, nil\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostResponse1(v *GetPostResponse1) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"post\", s.logvalue_Org_Federation_Post(v.GetPost())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostResponse1Argument(v *FederationService_Org_Federation_GetPostResponse1Argument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostResponse2(v *GetPostResponse2) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"post\", s.logvalue_Org_Federation_Post(v.GetPost())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostResponse2Argument(v *FederationService_Org_Federation_GetPostResponse2Argument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_Post(v *Post) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_PostArgument(v *FederationService_Org_Federation_PostArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_GetPostRequest(v *post.GetPostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.Any(\"a\", s.logvalue_Org_Post_PostConditionA(v.GetA())),\n\t\tslog.Any(\"b\", s.logvalue_Org_Post_PostConditionB(v.GetB())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_PostConditionA(v *post.PostConditionA) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"prop\", v.GetProp()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_PostConditionB(v *post.PostConditionB) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n"
  },
  {
    "path": "generator/testdata/expected_simple_aggregation.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: simple_aggregation.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n\t\"google.golang.org/protobuf/types/known/anypb\"\n\n\tpost \"example/post\"\n\tuser \"example/user\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\nvar Item_ItemType_attrMap = grpcfed.EnumAttributeMap[Item_ItemType]{\n\tItem_ITEM_TYPE_1: grpcfed.EnumValueAttributeMap{\n\t\t`en`: `item type 1`,\n\t},\n\tItem_ITEM_TYPE_2: grpcfed.EnumValueAttributeMap{\n\t\t`en`: `item type 2`,\n\t},\n\tItem_ITEM_TYPE_3: grpcfed.EnumValueAttributeMap{\n\t\t`en`: `item type 3`,\n\t},\n}\n\n// Org_Federation_GetPostResponseVariable represents variable definitions in \"org.federation.GetPostResponse\".\ntype FederationService_Org_Federation_GetPostResponseVariable struct {\n\tE        Item_ItemType\n\tId       int64\n\tMapValue map[int64]string\n\tPost     *Post\n\tUuid     *grpcfedcel.UUID\n}\n\n// Org_Federation_GetPostResponseArgument is argument for \"org.federation.GetPostResponse\" message.\ntype FederationService_Org_Federation_GetPostResponseArgument struct {\n\tId string\n\tFederationService_Org_Federation_GetPostResponseVariable\n}\n\n// Org_Federation_MVariable represents variable definitions in \"org.federation.M\".\ntype FederationService_Org_Federation_MVariable struct {\n}\n\n// Org_Federation_MArgument is argument for \"org.federation.M\" message.\ntype FederationService_Org_Federation_MArgument struct {\n\tX uint64\n\tY user.Item_ItemType\n\tFederationService_Org_Federation_MVariable\n}\n\n// Org_Federation_PostVariable represents variable definitions in \"org.federation.Post\".\ntype FederationService_Org_Federation_PostVariable struct {\n\tM    *M\n\tPost *post.Post\n\tRes  *post.GetPostResponse\n\tUser *User\n}\n\n// Org_Federation_PostArgument is argument for \"org.federation.Post\" message.\ntype FederationService_Org_Federation_PostArgument struct {\n\tId string\n\tFederationService_Org_Federation_PostVariable\n}\n\n// Org_Federation_UserVariable represents variable definitions in \"org.federation.User\".\ntype FederationService_Org_Federation_UserVariable struct {\n\tRes   *user.GetUserResponse\n\tUser  *user.User\n\tXDef2 *M\n}\n\n// Org_Federation_UserArgument is argument for \"org.federation.User\" message.\ntype FederationService_Org_Federation_UserArgument struct {\n\tContent string\n\tId      string\n\tTitle   string\n\tUserId  string\n\tFederationService_Org_Federation_UserVariable\n}\n\n// Org_Federation_User_AgeArgument is custom resolver's argument for \"age\" field of \"org.federation.User\" message.\ntype FederationService_Org_Federation_User_AgeArgument struct {\n\t*FederationService_Org_Federation_UserArgument\n}\n\n// Org_Federation_ZVariable represents variable definitions in \"org.federation.Z\".\ntype FederationService_Org_Federation_ZVariable struct {\n}\n\n// Org_Federation_ZArgument is argument for \"org.federation.Z\" message.\ntype FederationService_Org_Federation_ZArgument struct {\n\tFederationService_Org_Federation_ZVariable\n}\n\n// FederationServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationServiceConfig struct {\n\t// Client provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\n\t// If this interface is not provided, an error is returned during initialization.\n\tClient FederationServiceClientFactory // required\n\t// Resolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\n\t// If this interface is not provided, an error is returned during initialization.\n\tResolver FederationServiceResolver // required\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationServiceClientFactory interface {\n\t// Org_Post_PostServiceClient create a gRPC Client to be used to call methods in org.post.PostService.\n\tOrg_Post_PostServiceClient(FederationServiceClientConfig) (post.PostServiceClient, error)\n\t// Org_User_UserServiceClient create a gRPC Client to be used to call methods in org.user.UserService.\n\tOrg_User_UserServiceClient(FederationServiceClientConfig) (user.UserServiceClient, error)\n}\n\n// FederationServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationServiceDependentClientSet struct {\n\tOrg_Post_PostServiceClient post.PostServiceClient\n\tOrg_User_UserServiceClient user.UserServiceClient\n}\n\n// FederationServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationServiceResolver interface {\n\t// Resolve_Org_Federation_User_Age implements resolver for \"org.federation.User.age\".\n\tResolve_Org_Federation_User_Age(context.Context, *FederationService_Org_Federation_User_AgeArgument) (uint64, error)\n\t// Resolve_Org_Federation_Z implements resolver for \"org.federation.Z\".\n\tResolve_Org_Federation_Z(context.Context, *FederationService_Org_Federation_ZArgument) (*Z, error)\n}\n\n// FederationServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// FederationServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationServiceUnimplementedResolver struct{}\n\n// Resolve_Org_Federation_User_Age resolve \"org.federation.User.age\".\n// This method always returns Unimplemented error.\nfunc (FederationServiceUnimplementedResolver) Resolve_Org_Federation_User_Age(context.Context, *FederationService_Org_Federation_User_AgeArgument) (ret uint64, e error) {\n\te = grpcfed.GRPCErrorf(grpcfed.UnimplementedCode, \"method Resolve_Org_Federation_User_Age not implemented\")\n\treturn\n}\n\n// Resolve_Org_Federation_Z resolve \"org.federation.Z\".\n// This method always returns Unimplemented error.\nfunc (FederationServiceUnimplementedResolver) Resolve_Org_Federation_Z(context.Context, *FederationService_Org_Federation_ZArgument) (ret *Z, e error) {\n\te = grpcfed.GRPCErrorf(grpcfed.UnimplementedCode, \"method Resolve_Org_Federation_Z not implemented\")\n\treturn\n}\n\nconst (\n\tFederationService_DependentMethod_Org_Post_PostService_GetPost = \"/org.post.PostService/GetPost\"\n\tFederationService_DependentMethod_Org_User_UserService_GetUser = \"/org.user.UserService/GetUser\"\n)\n\n// FederationService represents Federation Service.\ntype FederationService struct {\n\tUnimplementedFederationServiceServer\n\tcfg             FederationServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tresolver        FederationServiceResolver\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationServiceDependentClientSet\n}\n\n// NewFederationService creates FederationService instance by FederationServiceConfig.\nfunc NewFederationService(cfg FederationServiceConfig) (*FederationService, error) {\n\tif cfg.Client == nil {\n\t\treturn nil, grpcfed.ErrClientConfig\n\t}\n\tif cfg.Resolver == nil {\n\t\treturn nil, grpcfed.ErrResolverConfig\n\t}\n\tOrg_Post_PostServiceClient, err := cfg.Client.Org_Post_PostServiceClient(FederationServiceClientConfig{\n\t\tService: \"org.post.PostService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tOrg_User_UserServiceClient, err := cfg.Client.Org_User_UserServiceClient(FederationServiceClientConfig{\n\t\tService: \"org.user.UserService\",\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"org.federation.FederationService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.org.federation.GetPostResponseArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.MArgument\": {\n\t\t\t\"x\": grpcfed.NewCELFieldType(grpcfed.CELUintType, \"X\"),\n\t\t\t\"y\": grpcfed.NewCELFieldType(grpcfed.CELIntType, \"Y\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.PostArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.UserArgument\": {\n\t\t\t\"id\":      grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t\t\"title\":   grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Title\"),\n\t\t\t\"content\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Content\"),\n\t\t\t\"user_id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"UserId\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.ZArgument\": {},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"org.federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.GRPCErrorAccessorOptions(celTypeHelper, \"org.post.GetPostResponse\")...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.GRPCErrorAccessorOptions(celTypeHelper, \"org.user.GetUserResponse\")...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.federation.Item.ItemType\", Item_ItemType_value, Item_ItemType_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAttrOption[Item_ItemType](\"org.federation.Item.ItemType\", Item_ItemType_attrMap))\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.federation.UserType\", UserType_value, UserType_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.post.PostType\", post.PostType_value, post.PostType_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.user.Item.ItemType\", user.Item_ItemType_value, user.Item_ItemType_name)...)\n\tcelEnvOpts = append(celEnvOpts, grpcfed.EnumAccessorOptions(\"org.user.UserType\", user.UserType_value, user.UserType_name)...)\n\tsvc := &FederationService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tresolver:        cfg.Resolver,\n\t\tclient: &FederationServiceDependentClientSet{\n\t\t\tOrg_Post_PostServiceClient: Org_Post_PostServiceClient,\n\t\t\tOrg_User_UserServiceClient: Org_User_UserServiceClient,\n\t\t},\n\t}\n\tif resolver, ok := cfg.Resolver.(grpcfed.CustomResolverInitializer); ok {\n\t\tctx := context.Background()\n\t\tif err := resolver.Init(ctx); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationService(ctx context.Context, svc *FederationService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n// GetPost implements \"org.federation.FederationService/GetPost\" method.\nfunc (s *FederationService) GetPost(ctx context.Context, req *GetPostRequest) (res *GetPostResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.FederationService/GetPost\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := grpcfed.WithTimeout[GetPostResponse](ctx, \"org.federation.FederationService/GetPost\", 60000000000 /* 1m0s */, func(ctx context.Context) (*GetPostResponse, error) {\n\t\treturn s.resolve_Org_Federation_GetPostResponse(ctx, &FederationService_Org_Federation_GetPostResponseArgument{\n\t\t\tId: req.GetId(),\n\t\t})\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Org_Federation_GetPostResponse resolve \"org.federation.GetPostResponse\" message.\nfunc (s *FederationService) resolve_Org_Federation_GetPostResponse(ctx context.Context, req *FederationService_Org_Federation_GetPostResponseArgument) (*GetPostResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.GetPostResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.GetPostResponse\", slog.Any(\"message_args\", s.logvalue_Org_Federation_GetPostResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tE        Item_ItemType\n\t\t\tId       int64\n\t\t\tMapValue map[int64]string\n\t\t\tPost     *Post\n\t\t\tUuid     *grpcfedcel.UUID\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.GetPostResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"post\"\n\t\t  message {\n\t\t    name: \"Post\"\n\t\t    args { name: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_post := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Post, *localValueType]{\n\t\t\tName: `post`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.Post\"),\n\t\t\tSetter: func(value *localValueType, v *Post) error {\n\t\t\t\tvalue.vars.Post = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_PostArgument{}\n\t\t\t\t// { name: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 1,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_Post(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"uuid\"\n\t\t  by: \"grpc.federation.uuid.newRandom()\"\n\t\t}\n\t*/\n\tdef_uuid := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*grpcfedcel.UUID, *localValueType]{\n\t\t\tName: `uuid`,\n\t\t\tType: grpcfed.CELObjectType(\"grpc.federation.uuid.UUID\"),\n\t\t\tSetter: func(value *localValueType, v *grpcfedcel.UUID) error {\n\t\t\t\tvalue.vars.Uuid = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `grpc.federation.uuid.newRandom()`,\n\t\t\tByCacheIndex: 2,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"map_value\"\n\t\t  by: \"{1:'a', 2:'b', 3:'c'}\"\n\t\t}\n\t*/\n\tdef_map_value := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[map[int64]string, *localValueType]{\n\t\t\tName: `map_value`,\n\t\t\tType: grpcfed.NewCELMapType(grpcfed.CELIntType, grpcfed.CELStringType),\n\t\t\tSetter: func(value *localValueType, v map[int64]string) error {\n\t\t\t\tvalue.vars.MapValue = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `{1:'a', 2:'b', 3:'c'}`,\n\t\t\tByCacheIndex: 3,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"e\"\n\t\t  enum {\n\t\t    name: \"org.federation.Item.ItemType\"\n\t\t    by: \"org.user.Item.ItemType.value('ITEM_TYPE_2')\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_e := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[Item_ItemType, *localValueType]{\n\t\t\tName: `e`,\n\t\t\tType: grpcfed.CELIntType,\n\t\t\tSetter: func(value *localValueType, v Item_ItemType) error {\n\t\t\t\tvalue.vars.E = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tEnum: func(ctx context.Context, value *localValueType) (Item_ItemType, error) {\n\t\t\t\tsrc, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `org.user.Item.ItemType.value('ITEM_TYPE_2')`,\n\t\t\t\t\tOutType:    reflect.TypeOf(user.Item_ItemType(0)),\n\t\t\t\t\tCacheIndex: 4,\n\t\t\t\t})\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn 0, err\n\t\t\t\t}\n\t\t\t\tv := src.(user.Item_ItemType)\n\t\t\t\treturn s.cast_Org_User_Item_ItemType__to__Org_Federation_Item_ItemType(v)\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"id\"\n\t\t  by: \"100\"\n\t\t}\n\t*/\n\tdef_id := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[int64, *localValueType]{\n\t\t\tName: `id`,\n\t\t\tType: grpcfed.CELIntType,\n\t\t\tSetter: func(value *localValueType, v int64) error {\n\t\t\t\tvalue.vars.Id = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `100`,\n\t\t\tByCacheIndex: 5,\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t           e ─┐\n\t          id ─┤\n\t   map_value ─┤\n\t        post ─┤\n\t        uuid ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_e(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_id(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_map_value(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_post(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_uuid(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_GetPostResponseVariable.E = value.vars.E\n\treq.FederationService_Org_Federation_GetPostResponseVariable.Id = value.vars.Id\n\treq.FederationService_Org_Federation_GetPostResponseVariable.MapValue = value.vars.MapValue\n\treq.FederationService_Org_Federation_GetPostResponseVariable.Post = value.vars.Post\n\treq.FederationService_Org_Federation_GetPostResponseVariable.Uuid = value.vars.Uuid\n\n\t// create a message value to be returned.\n\tret := &GetPostResponse{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"post\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*Post]{\n\t\tValue:      value,\n\t\tExpr:       `post`,\n\t\tCacheIndex: 6,\n\t\tSetter: func(v *Post) error {\n\t\t\tret.Post = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"'foo'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'foo'`,\n\t\tCacheIndex: 7,\n\t\tSetter: func(v string) error {\n\t\t\tret.Const = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"uuid.string()\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `uuid.string()`,\n\t\tCacheIndex: 8,\n\t\tSetter: func(v string) error {\n\t\t\tret.Uuid = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"org.federation.Item.ItemType.name(org.federation.Item.ItemType.ITEM_TYPE_1)\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `org.federation.Item.ItemType.name(org.federation.Item.ItemType.ITEM_TYPE_1)`,\n\t\tCacheIndex: 9,\n\t\tSetter: func(v string) error {\n\t\t\tret.EnumName = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"org.federation.Item.ItemType.value('ITEM_TYPE_1')\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[Item_ItemType]{\n\t\tValue:      value,\n\t\tExpr:       `org.federation.Item.ItemType.value('ITEM_TYPE_1')`,\n\t\tCacheIndex: 10,\n\t\tSetter: func(v Item_ItemType) error {\n\t\t\tenumValueValue, err := s.cast_Org_Federation_Item_ItemType__to__int32(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.EnumValue = enumValueValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"map_value\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[map[int64]string]{\n\t\tValue:      value,\n\t\tExpr:       `map_value`,\n\t\tCacheIndex: 11,\n\t\tSetter: func(v map[int64]string) error {\n\t\t\tmapValueValue, err := s.cast_map_int64_string__to__map_int32_string(v)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tret.MapValue = mapValueValue\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"e\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[Item_ItemType]{\n\t\tValue:      value,\n\t\tExpr:       `e`,\n\t\tCacheIndex: 12,\n\t\tSetter: func(v Item_ItemType) error {\n\t\t\tret.ItemType = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"Item.ItemType.attr(e, 'en')\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `Item.ItemType.attr(e, 'en')`,\n\t\tCacheIndex: 13,\n\t\tSetter: func(v string) error {\n\t\t\tret.ItemTypeText = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"id\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[int64]{\n\t\tValue:      value,\n\t\tExpr:       `id`,\n\t\tCacheIndex: 14,\n\t\tSetter: func(v int64) error {\n\t\t\tret.DifferentTypeId = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.GetPostResponse\", slog.Any(\"org.federation.GetPostResponse\", s.logvalue_Org_Federation_GetPostResponse(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_M resolve \"org.federation.M\" message.\nfunc (s *FederationService) resolve_Org_Federation_M(ctx context.Context, req *FederationService_Org_Federation_MArgument) (*M, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.M\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.M\", slog.Any(\"message_args\", s.logvalue_Org_Federation_MArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.MArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &M{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'foo'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'foo'`,\n\t\tCacheIndex: 15,\n\t\tSetter: func(v string) error {\n\t\t\tret.Foo = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"1\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[int64]{\n\t\tValue:      value,\n\t\tExpr:       `1`,\n\t\tCacheIndex: 16,\n\t\tSetter: func(v int64) error {\n\t\t\tret.Bar = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.M\", slog.Any(\"org.federation.M\", s.logvalue_Org_Federation_M(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_Post resolve \"org.federation.Post\" message.\nfunc (s *FederationService) resolve_Org_Federation_Post(ctx context.Context, req *FederationService_Org_Federation_PostArgument) (*Post, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.Post\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.Post\", slog.Any(\"message_args\", s.logvalue_Org_Federation_PostArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tM    *M\n\t\t\tPost *post.Post\n\t\t\tRes  *post.GetPostResponse\n\t\t\tUser *User\n\t\t\tZ    *Z\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.PostArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"org.post.PostService/GetPost\"\n\t\t    request { field: \"id\", by: \"$.id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.GetPostResponse, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"org.post.GetPostResponse\"),\n\t\t\tSetter: func(value *localValueType, v *post.GetPostResponse) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &post.GetPostRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.id`,\n\t\t\t\t\tCacheIndex: 17,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call org.post.PostService/GetPost\", slog.Any(\"org.post.GetPostRequest\", s.logvalue_Org_Post_GetPostRequest(args)))\n\t\t\t\tret, err := grpcfed.WithTimeout[post.GetPostResponse](ctx, \"org.post.PostService/GetPost\", 10000000000 /* 10s */, func(ctx context.Context) (*post.GetPostResponse, error) {\n\t\t\t\t\tb := grpcfed.NewConstantBackOff(2000000000) /* 2s */\n\t\t\t\t\tb = grpcfed.BackOffWithMaxRetries(b, 3)\n\t\t\t\t\tb = grpcfed.BackOffWithContext(b, ctx)\n\t\t\t\t\treturn grpcfed.WithRetry(ctx, &grpcfed.RetryParam[post.GetPostResponse]{\n\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\tIf:         `true`,\n\t\t\t\t\t\tCacheIndex: 18,\n\t\t\t\t\t\tBackOff:    b,\n\t\t\t\t\t\tBody: func() (*post.GetPostResponse, error) {\n\t\t\t\t\t\t\treturn s.client.Org_Post_PostServiceClient.GetPost(ctx, args)\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Org_Post_PostService_GetPost, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"post\"\n\t\t  autobind: true\n\t\t  by: \"res.post\"\n\t\t}\n\t*/\n\tdef_post := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*post.Post, *localValueType]{\n\t\t\tName: `post`,\n\t\t\tType: grpcfed.CELObjectType(\"org.post.Post\"),\n\t\t\tSetter: func(value *localValueType, v *post.Post) error {\n\t\t\t\tvalue.vars.Post = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `res.post`,\n\t\t\tByCacheIndex: 19,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"user\"\n\t\t  message {\n\t\t    name: \"User\"\n\t\t    args { inline: \"post\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_user := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*User, *localValueType]{\n\t\t\tName: `user`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.User\"),\n\t\t\tSetter: func(value *localValueType, v *User) error {\n\t\t\t\tvalue.vars.User = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_UserArgument{}\n\t\t\t\t// { inline: \"post\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*post.Post]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `post`,\n\t\t\t\t\tCacheIndex: 20,\n\t\t\t\t\tSetter: func(v *post.Post) error {\n\t\t\t\t\t\targs.Id = v.GetId()\n\t\t\t\t\t\targs.Title = v.GetTitle()\n\t\t\t\t\t\targs.Content = v.GetContent()\n\t\t\t\t\t\targs.UserId = v.GetUserId()\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_User(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"z\"\n\t\t  message {\n\t\t    name: \"Z\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_z := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Z, *localValueType]{\n\t\t\tName: `z`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.Z\"),\n\t\t\tSetter: func(value *localValueType, v *Z) error {\n\t\t\t\tvalue.vars.Z = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_ZArgument{}\n\t\t\t\tret, err := s.resolve_Org_Federation_Z(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"m\"\n\t\t  autobind: true\n\t\t  message {\n\t\t    name: \"M\"\n\t\t    args: [\n\t\t      { name: \"x\", by: \"10\" },\n\t\t      { name: \"y\", by: \"1\" }\n\t\t    ]\n\t\t  }\n\t\t}\n\t*/\n\tdef_m := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*M, *localValueType]{\n\t\t\tName: `m`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.M\"),\n\t\t\tSetter: func(value *localValueType, v *M) error {\n\t\t\t\tvalue.vars.M = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_MArgument{}\n\t\t\t\t// { name: \"x\", by: \"10\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[uint64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `10`,\n\t\t\t\t\tCacheIndex: 21,\n\t\t\t\t\tSetter: func(v uint64) error {\n\t\t\t\t\t\targs.X = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { name: \"y\", by: \"1\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[user.Item_ItemType]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `1`,\n\t\t\t\t\tCacheIndex: 22,\n\t\t\t\t\tSetter: func(v user.Item_ItemType) error {\n\t\t\t\t\t\targs.Y = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_M(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t                 m ─┐\n\t   res ─┐           │\n\t        post ─┐     │\n\t              user ─┤\n\t                 z ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_m(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_post(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_user(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_z(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_PostVariable.M = value.vars.M\n\treq.FederationService_Org_Federation_PostVariable.Post = value.vars.Post\n\treq.FederationService_Org_Federation_PostVariable.Res = value.vars.Res\n\treq.FederationService_Org_Federation_PostVariable.User = value.vars.User\n\n\t// create a message value to be returned.\n\tret := &Post{}\n\n\t// field binding section.\n\tret.Id = value.vars.Post.GetId()           // { name: \"post\", autobind: true }\n\tret.Title = value.vars.Post.GetTitle()     // { name: \"post\", autobind: true }\n\tret.Content = value.vars.Post.GetContent() // { name: \"post\", autobind: true }\n\t// (grpc.federation.field).by = \"user\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*User]{\n\t\tValue:      value,\n\t\tExpr:       `user`,\n\t\tCacheIndex: 23,\n\t\tSetter: func(v *User) error {\n\t\t\tret.User = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\tret.Foo = value.vars.M.GetFoo() // { name: \"m\", autobind: true }\n\tret.Bar = value.vars.M.GetBar() // { name: \"m\", autobind: true }\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.Post\", slog.Any(\"org.federation.Post\", s.logvalue_Org_Federation_Post(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_User resolve \"org.federation.User\" message.\nfunc (s *FederationService) resolve_Org_Federation_User(ctx context.Context, req *FederationService_Org_Federation_UserArgument) (*User, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.User\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.User\", slog.Any(\"message_args\", s.logvalue_Org_Federation_UserArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tRes   *user.GetUserResponse\n\t\t\tUser  *user.User\n\t\t\tXDef2 *M\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.UserArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"res\"\n\t\t  call {\n\t\t    method: \"org.user.UserService/GetUser\"\n\t\t    request { field: \"id\", by: \"$.user_id\" }\n\t\t  }\n\t\t}\n\t*/\n\tdef_res := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*user.GetUserResponse, *localValueType]{\n\t\t\tName: `res`,\n\t\t\tType: grpcfed.CELObjectType(\"org.user.GetUserResponse\"),\n\t\t\tSetter: func(value *localValueType, v *user.GetUserResponse) error {\n\t\t\t\tvalue.vars.Res = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &user.GetUserRequest{}\n\t\t\t\t// { field: \"id\", by: \"$.user_id\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `$.user_id`,\n\t\t\t\t\tCacheIndex: 24,\n\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\targs.Id = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tgrpcfed.Logger(ctx).DebugContext(ctx, \"call org.user.UserService/GetUser\", slog.Any(\"org.user.GetUserRequest\", s.logvalue_Org_User_GetUserRequest(args)))\n\t\t\t\tret, err := grpcfed.WithTimeout[user.GetUserResponse](ctx, \"org.user.UserService/GetUser\", 20000000000 /* 20s */, func(ctx context.Context) (*user.GetUserResponse, error) {\n\t\t\t\t\tb := grpcfed.NewExponentialBackOff(&grpcfed.ExponentialBackOffConfig{\n\t\t\t\t\t\tInitialInterval:     1000000000, /* 1s */\n\t\t\t\t\t\tRandomizationFactor: 0.7,\n\t\t\t\t\t\tMultiplier:          1.7,\n\t\t\t\t\t\tMaxInterval:         30000000000, /* 30s */\n\t\t\t\t\t\tMaxElapsedTime:      20000000000, /* 20s */\n\t\t\t\t\t})\n\t\t\t\t\tb = grpcfed.BackOffWithMaxRetries(b, 3)\n\t\t\t\t\tb = grpcfed.BackOffWithContext(b, ctx)\n\t\t\t\t\treturn grpcfed.WithRetry(ctx, &grpcfed.RetryParam[user.GetUserResponse]{\n\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\tIf:         `error.code != google.rpc.Code.UNIMPLEMENTED`,\n\t\t\t\t\t\tCacheIndex: 25,\n\t\t\t\t\t\tBackOff:    b,\n\t\t\t\t\t\tBody: func() (*user.GetUserResponse, error) {\n\t\t\t\t\t\t\treturn s.client.Org_User_UserServiceClient.GetUser(ctx, args)\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err := s.errorHandler(ctx, FederationService_DependentMethod_Org_User_UserService_GetUser, err); err != nil {\n\t\t\t\t\t\treturn nil, grpcfed.NewErrorWithLogAttrs(err, slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"user\"\n\t\t  autobind: true\n\t\t  by: \"res.user\"\n\t\t}\n\t*/\n\tdef_user := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*user.User, *localValueType]{\n\t\t\tName: `user`,\n\t\t\tType: grpcfed.CELObjectType(\"org.user.User\"),\n\t\t\tSetter: func(value *localValueType, v *user.User) error {\n\t\t\t\tvalue.vars.User = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tBy:           `res.user`,\n\t\t\tByCacheIndex: 26,\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"_def2\"\n\t\t  message {\n\t\t    name: \"M\"\n\t\t    args: [\n\t\t      { name: \"x\", by: \"uint(2)\" },\n\t\t      { name: \"y\", by: \"org.user.Item.ItemType.value('ITEM_TYPE_2')\" }\n\t\t    ]\n\t\t  }\n\t\t}\n\t*/\n\tdef__def2 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*M, *localValueType]{\n\t\t\tName: `_def2`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.M\"),\n\t\t\tSetter: func(value *localValueType, v *M) error {\n\t\t\t\tvalue.vars.XDef2 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_MArgument{}\n\t\t\t\t// { name: \"x\", by: \"uint(2)\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[uint64]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `uint(2)`,\n\t\t\t\t\tCacheIndex: 27,\n\t\t\t\t\tSetter: func(v uint64) error {\n\t\t\t\t\t\targs.X = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\t// { name: \"y\", by: \"org.user.Item.ItemType.value('ITEM_TYPE_2')\" }\n\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[user.Item_ItemType]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `org.user.Item.ItemType.value('ITEM_TYPE_2')`,\n\t\t\t\t\tCacheIndex: 28,\n\t\t\t\t\tSetter: func(v user.Item_ItemType) error {\n\t\t\t\t\t\targs.Y = v\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tret, err := s.resolve_Org_Federation_M(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t// A tree view of message dependencies is shown below.\n\t/*\n\t        _def2 ─┐\n\t   res ─┐      │\n\t         user ─┤\n\t*/\n\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def__def2(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\tif err := def_res(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := def_user(ctx1); err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, nil\n\t})\n\n\tif err := eg.Wait(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_UserVariable.Res = value.vars.Res\n\treq.FederationService_Org_Federation_UserVariable.User = value.vars.User\n\treq.FederationService_Org_Federation_UserVariable.XDef2 = value.vars.XDef2\n\n\t// create a message value to be returned.\n\tret := &User{}\n\n\t// field binding section.\n\tret.Id = value.vars.User.GetId() // { name: \"user\", autobind: true }\n\t{\n\t\ttypeValue, err := s.cast_Org_User_UserType__to__Org_Federation_UserType(value.vars.User.GetType()) // { name: \"user\", autobind: true }\n\t\tif err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tret.Type = typeValue\n\t}\n\tret.Name = value.vars.User.GetName() // { name: \"user\", autobind: true }\n\t{\n\t\t// (grpc.federation.field).custom_resolver = true\n\t\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx)) // create a new reference to logger.\n\t\tvar err error\n\t\tret.Age, err = s.resolver.Resolve_Org_Federation_User_Age(ctx, &FederationService_Org_Federation_User_AgeArgument{\n\t\t\tFederationService_Org_Federation_UserArgument: req,\n\t\t})\n\t\tif err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t}\n\tret.Desc = value.vars.User.GetDesc() // { name: \"user\", autobind: true }\n\t{\n\t\tmainItemValue, err := s.cast_Org_User_Item__to__Org_Federation_Item(value.vars.User.GetMainItem()) // { name: \"user\", autobind: true }\n\t\tif err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tret.MainItem = mainItemValue\n\t}\n\t{\n\t\titemsValue, err := s.cast_repeated_Org_User_Item__to__repeated_Org_Federation_Item(value.vars.User.GetItems()) // { name: \"user\", autobind: true }\n\t\tif err != nil {\n\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tret.Items = itemsValue\n\t}\n\tret.Profile = value.vars.User.GetProfile() // { name: \"user\", autobind: true }\n\tif false {\n\t\t// For code generation reasons, we're using a loop to generate the oneof conditional branches,\n\t\t// so to avoid treating the first element specially, we always generate if branch with false condition.\n\t} else if _, ok := value.vars.User.Attr.(*user.User_AttrA_); ok {\n\n\t\tattrValue, err := s.cast_Org_User_User_AttrA___to__Org_Federation_User_AttrA_(value.vars.User.Attr.(*user.User_AttrA_))\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret.Attr = attrValue\n\t} else if _, ok := value.vars.User.Attr.(*user.User_B); ok {\n\n\t\tattrValue, err := s.cast_Org_User_User_B__to__Org_Federation_User_B(value.vars.User.Attr.(*user.User_B))\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret.Attr = attrValue\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.User\", slog.Any(\"org.federation.User\", s.logvalue_Org_Federation_User(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_Z resolve \"org.federation.Z\" message.\nfunc (s *FederationService) resolve_Org_Federation_Z(ctx context.Context, req *FederationService_Org_Federation_ZArgument) (*Z, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.Z\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.Z\", slog.Any(\"message_args\", s.logvalue_Org_Federation_ZArgument(req)))\n\n\t// create a message value to be returned.\n\t// `custom_resolver = true` in \"grpc.federation.message\" option.\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx)) // create a new reference to logger.\n\tret, err := s.resolver.Resolve_Org_Federation_Z(ctx, req)\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.Z\", slog.Any(\"org.federation.Z\", s.logvalue_Org_Federation_Z(ret)))\n\treturn ret, nil\n}\n\n// cast_Org_Federation_Item_ItemType__to__int32 cast from \"org.federation.Item.ItemType\" to \"int32\".\nfunc (s *FederationService) cast_Org_Federation_Item_ItemType__to__int32(from Item_ItemType) (int32, error) {\n\treturn int32(from), nil\n}\n\n// cast_Org_User_Item_ItemType__to__Org_Federation_Item_ItemType cast from \"org.user.Item.ItemType\" to \"org.federation.Item.ItemType\".\nfunc (s *FederationService) cast_Org_User_Item_ItemType__to__Org_Federation_Item_ItemType(from user.Item_ItemType) (Item_ItemType, error) {\n\tvar ret Item_ItemType\n\tswitch from {\n\tcase user.Item_ITEM_TYPE_1:\n\t\tret = Item_ITEM_TYPE_1\n\tcase user.Item_ITEM_TYPE_2:\n\t\tret = Item_ITEM_TYPE_2\n\tcase user.Item_ITEM_TYPE_3:\n\t\tret = Item_ITEM_TYPE_3\n\tdefault:\n\t\tret = 0\n\t}\n\treturn ret, nil\n}\n\n// cast_Org_User_Item__to__Org_Federation_Item cast from \"org.user.Item\" to \"org.federation.Item\".\nfunc (s *FederationService) cast_Org_User_Item__to__Org_Federation_Item(from *user.Item) (*Item, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tnameValue := from.GetName()\n\ttypeValue, err := s.cast_Org_User_Item_ItemType__to__Org_Federation_Item_ItemType(from.GetType())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvalueValue, err := s.cast_int64__to__uint32(from.GetValue())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret := &Item{\n\t\tName:  nameValue,\n\t\tType:  typeValue,\n\t\tValue: valueValue,\n\t}\n\n\treturn ret, nil\n}\n\n// cast_Org_User_UserType__to__Org_Federation_UserType cast from \"org.user.UserType\" to \"org.federation.UserType\".\nfunc (s *FederationService) cast_Org_User_UserType__to__Org_Federation_UserType(from user.UserType) (UserType, error) {\n\tvar ret UserType\n\tswitch from {\n\tcase user.UserType_USER_TYPE_1:\n\t\tret = UserType_USER_TYPE_1\n\tcase user.UserType_USER_TYPE_2:\n\t\tret = UserType_USER_TYPE_2\n\tdefault:\n\t\tret = 0\n\t}\n\treturn ret, nil\n}\n\n// cast_Org_User_User_AttrA___to__Org_Federation_User_AttrA_ cast from \"org.user.User.attr_a\" to \"org.federation.User.attr_a\".\nfunc (s *FederationService) cast_Org_User_User_AttrA___to__Org_Federation_User_AttrA_(from *user.User_AttrA_) (*User_AttrA_, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\n\tattrAValue, err := s.cast_Org_User_User_AttrA__to__Org_Federation_User_AttrA(from.AttrA)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &User_AttrA_{AttrA: attrAValue}, nil\n}\n\n// cast_Org_User_User_AttrA__to__Org_Federation_User_AttrA cast from \"org.user.User.AttrA\" to \"org.federation.User.AttrA\".\nfunc (s *FederationService) cast_Org_User_User_AttrA__to__Org_Federation_User_AttrA(from *user.User_AttrA) (*User_AttrA, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tfooValue := from.GetFoo()\n\tret := &User_AttrA{\n\t\tFoo: fooValue,\n\t}\n\n\treturn ret, nil\n}\n\n// cast_Org_User_User_AttrB__to__Org_Federation_User_AttrB cast from \"org.user.User.AttrB\" to \"org.federation.User.AttrB\".\nfunc (s *FederationService) cast_Org_User_User_AttrB__to__Org_Federation_User_AttrB(from *user.User_AttrB) (*User_AttrB, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\tbarValue := from.GetBar()\n\tret := &User_AttrB{\n\t\tBar: barValue,\n\t}\n\n\treturn ret, nil\n}\n\n// cast_Org_User_User_B__to__Org_Federation_User_B cast from \"org.user.User.b\" to \"org.federation.User.b\".\nfunc (s *FederationService) cast_Org_User_User_B__to__Org_Federation_User_B(from *user.User_B) (*User_B, error) {\n\tif from == nil {\n\t\treturn nil, nil\n\t}\n\n\tbValue, err := s.cast_Org_User_User_AttrB__to__Org_Federation_User_AttrB(from.B)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &User_B{B: bValue}, nil\n}\n\n// cast_int64__to__Org_User_Item_ItemType cast from \"int64\" to \"org.user.Item.ItemType\".\nfunc (s *FederationService) cast_int64__to__Org_User_Item_ItemType(from int64) (user.Item_ItemType, error) {\n\treturn user.Item_ItemType(from), nil\n}\n\n// cast_int64__to__int32 cast from \"int64\" to \"int32\".\nfunc (s *FederationService) cast_int64__to__int32(from int64) (int32, error) {\n\tret, err := grpcfed.Int64ToInt32(from)\n\tif err != nil {\n\t\treturn ret, err\n\t}\n\treturn ret, nil\n}\n\n// cast_int64__to__uint32 cast from \"int64\" to \"uint32\".\nfunc (s *FederationService) cast_int64__to__uint32(from int64) (uint32, error) {\n\tret, err := grpcfed.Int64ToUint32(from)\n\tif err != nil {\n\t\treturn ret, err\n\t}\n\treturn ret, nil\n}\n\n// cast_int64__to__uint64 cast from \"int64\" to \"uint64\".\nfunc (s *FederationService) cast_int64__to__uint64(from int64) (uint64, error) {\n\tret, err := grpcfed.Int64ToUint64(from)\n\tif err != nil {\n\t\treturn ret, err\n\t}\n\treturn ret, nil\n}\n\n// cast_map_int64_string__to__map_int32_string cast from \"map<int64, string>\" to \"map<int32, string>\".\nfunc (s *FederationService) cast_map_int64_string__to__map_int32_string(from map[int64]string) (map[int32]string, error) {\n\tret := map[int32]string{}\n\tfor k, v := range from {\n\t\tkey, err := s.cast_int64__to__int32(k)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tval := v\n\t\tret[key] = val\n\t}\n\treturn ret, nil\n}\n\n// cast_repeated_Org_User_Item__to__repeated_Org_Federation_Item cast from \"repeated org.user.Item\" to \"repeated org.federation.Item\".\nfunc (s *FederationService) cast_repeated_Org_User_Item__to__repeated_Org_Federation_Item(from []*user.Item) ([]*Item, error) {\n\tret := make([]*Item, 0, len(from))\n\tfor _, v := range from {\n\t\tcasted, err := s.cast_Org_User_Item__to__Org_Federation_Item(v)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret = append(ret, casted)\n\t}\n\treturn ret, nil\n}\n\nfunc (s *FederationService) logvalue_Google_Protobuf_Any(v *anypb.Any) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"type_url\", v.GetTypeUrl()),\n\t\tslog.String(\"value\", string(v.GetValue())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostResponse(v *GetPostResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"post\", s.logvalue_Org_Federation_Post(v.GetPost())),\n\t\tslog.String(\"const\", v.GetConst()),\n\t\tslog.String(\"uuid\", v.GetUuid()),\n\t\tslog.String(\"enum_name\", v.GetEnumName()),\n\t\tslog.Int64(\"enum_value\", int64(v.GetEnumValue())),\n\t\tslog.Any(\"map_value\", s.logvalue_Org_Federation_GetPostResponse_MapValueEntry(v.GetMapValue())),\n\t\tslog.String(\"item_type\", s.logvalue_Org_Federation_Item_ItemType(v.GetItemType()).String()),\n\t\tslog.String(\"item_type_text\", v.GetItemTypeText()),\n\t\tslog.Int64(\"different_type_id\", v.GetDifferentTypeId()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostResponseArgument(v *FederationService_Org_Federation_GetPostResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostResponse_MapValueEntry(v map[int32]string) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tattrs := make([]slog.Attr, 0, len(v))\n\tfor key, value := range v {\n\t\tattrs = append(attrs, slog.Attr{\n\t\t\tKey:   grpcfed.ToLogAttrKey(key),\n\t\t\tValue: slog.AnyValue(value),\n\t\t})\n\t}\n\treturn slog.GroupValue(attrs...)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_Item(v *Item) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"name\", v.GetName()),\n\t\tslog.String(\"type\", s.logvalue_Org_Federation_Item_ItemType(v.GetType()).String()),\n\t\tslog.Uint64(\"value\", uint64(v.GetValue())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_Item_ItemType(v Item_ItemType) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tswitch v {\n\tcase Item_ITEM_TYPE_1:\n\t\treturn slog.StringValue(\"ITEM_TYPE_1\")\n\tcase Item_ITEM_TYPE_2:\n\t\treturn slog.StringValue(\"ITEM_TYPE_2\")\n\tcase Item_ITEM_TYPE_3:\n\t\treturn slog.StringValue(\"ITEM_TYPE_3\")\n\t}\n\treturn slog.StringValue(\"\")\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_M(v *M) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"foo\", v.GetFoo()),\n\t\tslog.Int64(\"bar\", v.GetBar()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_MArgument(v *FederationService_Org_Federation_MArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Uint64(\"x\", v.X),\n\t\tslog.String(\"y\", s.logvalue_Org_User_Item_ItemType(v.Y).String()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_Post(v *Post) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.String(\"title\", v.GetTitle()),\n\t\tslog.String(\"content\", v.GetContent()),\n\t\tslog.Any(\"user\", s.logvalue_Org_Federation_User(v.GetUser())),\n\t\tslog.String(\"foo\", v.GetFoo()),\n\t\tslog.Int64(\"bar\", v.GetBar()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_PostArgument(v *FederationService_Org_Federation_PostArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_User(v *User) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.String(\"type\", s.logvalue_Org_Federation_UserType(v.GetType()).String()),\n\t\tslog.String(\"name\", v.GetName()),\n\t\tslog.Uint64(\"age\", v.GetAge()),\n\t\tslog.Any(\"desc\", v.GetDesc()),\n\t\tslog.Any(\"main_item\", s.logvalue_Org_Federation_Item(v.GetMainItem())),\n\t\tslog.Any(\"items\", s.logvalue_repeated_Org_Federation_Item(v.GetItems())),\n\t\tslog.Any(\"profile\", s.logvalue_Org_Federation_User_ProfileEntry(v.GetProfile())),\n\t\tslog.Any(\"attr_a\", s.logvalue_Org_Federation_User_AttrA(v.GetAttrA())),\n\t\tslog.Any(\"b\", s.logvalue_Org_Federation_User_AttrB(v.GetB())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_UserArgument(v *FederationService_Org_Federation_UserArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t\tslog.String(\"title\", v.Title),\n\t\tslog.String(\"content\", v.Content),\n\t\tslog.String(\"user_id\", v.UserId),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_UserType(v UserType) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tswitch v {\n\tcase UserType_USER_TYPE_1:\n\t\treturn slog.StringValue(\"USER_TYPE_1\")\n\tcase UserType_USER_TYPE_2:\n\t\treturn slog.StringValue(\"USER_TYPE_2\")\n\t}\n\treturn slog.StringValue(\"\")\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_User_AttrA(v *User_AttrA) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"foo\", v.GetFoo()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_User_AttrB(v *User_AttrB) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Bool(\"bar\", v.GetBar()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_User_ProfileEntry(v map[string]*anypb.Any) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tattrs := make([]slog.Attr, 0, len(v))\n\tfor key, value := range v {\n\t\tattrs = append(attrs, slog.Attr{\n\t\t\tKey:   grpcfed.ToLogAttrKey(key),\n\t\t\tValue: s.logvalue_Google_Protobuf_Any(value),\n\t\t})\n\t}\n\treturn slog.GroupValue(attrs...)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_Z(v *Z) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"foo\", v.GetFoo()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_ZArgument(v *FederationService_Org_Federation_ZArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n\nfunc (s *FederationService) logvalue_Org_Post_CreatePost(v *post.CreatePost) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"title\", v.GetTitle()),\n\t\tslog.String(\"content\", v.GetContent()),\n\t\tslog.String(\"user_id\", v.GetUserId()),\n\t\tslog.String(\"type\", s.logvalue_Org_Post_PostType(v.GetType()).String()),\n\t\tslog.Int64(\"post_type\", int64(v.GetPostType())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_CreatePostRequest(v *post.CreatePostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"post\", s.logvalue_Org_Post_CreatePost(v.GetPost())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_GetPostRequest(v *post.GetPostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_GetPostsRequest(v *post.GetPostsRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.GetIds()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Post_PostType(v post.PostType) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tswitch v {\n\tcase post.PostType_POST_TYPE_UNKNOWN:\n\t\treturn slog.StringValue(\"POST_TYPE_UNKNOWN\")\n\tcase post.PostType_POST_TYPE_A:\n\t\treturn slog.StringValue(\"POST_TYPE_A\")\n\tcase post.PostType_POST_TYPE_B:\n\t\treturn slog.StringValue(\"POST_TYPE_B\")\n\t}\n\treturn slog.StringValue(\"\")\n}\n\nfunc (s *FederationService) logvalue_Org_Post_UpdatePostRequest(v *post.UpdatePostRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_User_GetUserRequest(v *user.GetUserRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.Int64(\"foo\", v.GetFoo()),\n\t\tslog.String(\"bar\", v.GetBar()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_User_GetUsersRequest(v *user.GetUsersRequest) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"ids\", v.GetIds()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_User_Item_ItemType(v user.Item_ItemType) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tswitch v {\n\tcase user.Item_ITEM_TYPE_1:\n\t\treturn slog.StringValue(\"ITEM_TYPE_1\")\n\tcase user.Item_ITEM_TYPE_2:\n\t\treturn slog.StringValue(\"ITEM_TYPE_2\")\n\tcase user.Item_ITEM_TYPE_3:\n\t\treturn slog.StringValue(\"ITEM_TYPE_3\")\n\t}\n\treturn slog.StringValue(\"\")\n}\n\nfunc (s *FederationService) logvalue_repeated_Org_Federation_Item(v []*Item) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tattrs := make([]slog.Attr, 0, len(v))\n\tfor idx, vv := range v {\n\t\tattrs = append(attrs, slog.Attr{\n\t\t\tKey:   grpcfed.ToLogAttrKey(idx),\n\t\t\tValue: s.logvalue_Org_Federation_Item(vv),\n\t\t})\n\t}\n\treturn slog.GroupValue(attrs...)\n}\n"
  },
  {
    "path": "generator/testdata/expected_switch.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: switch.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Org_Federation_GetPostResponseVariable represents variable definitions in \"org.federation.GetPostResponse\".\ntype FederationService_Org_Federation_GetPostResponseVariable struct {\n\tBlue    int64\n\tDefault int64\n\tSwitch  int64\n}\n\n// Org_Federation_GetPostResponseArgument is argument for \"org.federation.GetPostResponse\" message.\ntype FederationService_Org_Federation_GetPostResponseArgument struct {\n\tId string\n\tFederationService_Org_Federation_GetPostResponseVariable\n}\n\n// FederationServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationServiceConfig struct {\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationServiceClientFactory interface {\n}\n\n// FederationServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationServiceDependentClientSet struct {\n}\n\n// FederationServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationServiceResolver interface {\n}\n\n// FederationServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// FederationServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationServiceUnimplementedResolver struct{}\n\n// FederationService represents Federation Service.\ntype FederationService struct {\n\tUnimplementedFederationServiceServer\n\tcfg             FederationServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationServiceDependentClientSet\n}\n\n// NewFederationService creates FederationService instance by FederationServiceConfig.\nfunc NewFederationService(cfg FederationServiceConfig) (*FederationService, error) {\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"org.federation.FederationService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.org.federation.GetPostResponseArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"org.federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tsvc := &FederationService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tclient:          &FederationServiceDependentClientSet{},\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationService(ctx context.Context, svc *FederationService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n// GetPost implements \"org.federation.FederationService/GetPost\" method.\nfunc (s *FederationService) GetPost(ctx context.Context, req *GetPostRequest) (res *GetPostResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.FederationService/GetPost\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Org_Federation_GetPostResponse(ctx, &FederationService_Org_Federation_GetPostResponseArgument{\n\t\tId: req.GetId(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Org_Federation_GetPostResponse resolve \"org.federation.GetPostResponse\" message.\nfunc (s *FederationService) resolve_Org_Federation_GetPostResponse(ctx context.Context, req *FederationService_Org_Federation_GetPostResponseArgument) (*GetPostResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.GetPostResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.GetPostResponse\", slog.Any(\"message_args\", s.logvalue_Org_Federation_GetPostResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tBlue    int64\n\t\t\tDefault int64\n\t\t\tSwitch  int64\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.GetPostResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"switch\"\n\t\t  switch {\n\t\t    case {\n\t\t      def {\n\t\t        name: \"blue\"\n\t\t        by: \"73\"\n\t\t      }\n\t\t      if: \"$.id == 'blue'\"\n\t\t      by: \"blue\"\n\t\t    }\n\t\t    case {\n\t\t      if: \"$.id == 'red'\"\n\t\t      by: \"2\"\n\t\t    }\n\t\t    default {\n\t\t      def {\n\t\t        name: \"default\"\n\t\t        by: \"3\"\n\t\t      }\n\t\t      by: \"default\"\n\t\t    }\n\t\t  }\n\t\t}\n\t*/\n\tdef_switch := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[int64, *localValueType]{\n\t\t\tName: `switch`,\n\t\t\tType: grpcfed.CELIntType,\n\t\t\tSetter: func(value *localValueType, v int64) error {\n\t\t\t\tvalue.vars.Switch = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tSwitch: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\tcases := []*grpcfed.EvalSwitchCase[*localValueType]{}\n\t\t\t\tcases = append(cases, &grpcfed.EvalSwitchCase[*localValueType]{\n\t\t\t\t\tDefs: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t\tdef {\n\t\t\t\t\t\t\t  name: \"blue\"\n\t\t\t\t\t\t\t  by: \"73\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t*/\n\t\t\t\t\t\tdef_blue := func(ctx context.Context) error {\n\t\t\t\t\t\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[int64, *localValueType]{\n\t\t\t\t\t\t\t\tName: `blue`,\n\t\t\t\t\t\t\t\tType: grpcfed.CELIntType,\n\t\t\t\t\t\t\t\tSetter: func(value *localValueType, v int64) error {\n\t\t\t\t\t\t\t\t\tvalue.vars.Blue = v\n\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tBy:           `73`,\n\t\t\t\t\t\t\t\tByCacheIndex: 1,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif err := def_blue(ctx); err != nil {\n\t\t\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn nil, nil\n\t\t\t\t\t},\n\t\t\t\t\tIf:           `$.id == 'blue'`,\n\t\t\t\t\tIfCacheIndex: 2,\n\t\t\t\t\tBy:           `blue`,\n\t\t\t\t\tByCacheIndex: 3,\n\t\t\t\t})\n\t\t\t\tcases = append(cases, &grpcfed.EvalSwitchCase[*localValueType]{\n\t\t\t\t\tIf:           `$.id == 'red'`,\n\t\t\t\t\tIfCacheIndex: 4,\n\t\t\t\t\tBy:           `2`,\n\t\t\t\t\tByCacheIndex: 5,\n\t\t\t\t})\n\t\t\t\treturn grpcfed.EvalSwitch[int64](ctx, value, cases, &grpcfed.EvalSwitchDefault[*localValueType]{\n\t\t\t\t\tDefs: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t\tdef {\n\t\t\t\t\t\t\t  name: \"default\"\n\t\t\t\t\t\t\t  by: \"3\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t*/\n\t\t\t\t\t\tdef_default := func(ctx context.Context) error {\n\t\t\t\t\t\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[int64, *localValueType]{\n\t\t\t\t\t\t\t\tName: `default`,\n\t\t\t\t\t\t\t\tType: grpcfed.CELIntType,\n\t\t\t\t\t\t\t\tSetter: func(value *localValueType, v int64) error {\n\t\t\t\t\t\t\t\t\tvalue.vars.Default = v\n\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tBy:           `3`,\n\t\t\t\t\t\t\t\tByCacheIndex: 6,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif err := def_default(ctx); err != nil {\n\t\t\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn nil, nil\n\t\t\t\t\t},\n\t\t\t\t\tBy:           `default`,\n\t\t\t\t\tByCacheIndex: 7,\n\t\t\t\t})\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_switch(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_GetPostResponseVariable.Blue = value.vars.Blue\n\treq.FederationService_Org_Federation_GetPostResponseVariable.Default = value.vars.Default\n\treq.FederationService_Org_Federation_GetPostResponseVariable.Switch = value.vars.Switch\n\n\t// create a message value to be returned.\n\tret := &GetPostResponse{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"switch\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[int64]{\n\t\tValue:      value,\n\t\tExpr:       `switch`,\n\t\tCacheIndex: 8,\n\t\tSetter: func(v int64) error {\n\t\t\tret.Switch = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.GetPostResponse\", slog.Any(\"org.federation.GetPostResponse\", s.logvalue_Org_Federation_GetPostResponse(ret)))\n\treturn ret, nil\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostResponse(v *GetPostResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Int64(\"switch\", v.GetSwitch()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostResponseArgument(v *FederationService_Org_Federation_GetPostResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n"
  },
  {
    "path": "generator/testdata/expected_validation.go",
    "content": "// Code generated by protoc-gen-grpc-federation. DO NOT EDIT!\n// versions:\n//\n//\tprotoc-gen-grpc-federation: (devel)\n//\n// source: validation.proto\npackage federation\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n)\n\nvar (\n\t_ = reflect.Invalid // to avoid \"imported and not used error\"\n)\n\n// Org_Federation_CustomMessageVariable represents variable definitions in \"org.federation.CustomMessage\".\ntype FederationService_Org_Federation_CustomMessageVariable struct {\n}\n\n// Org_Federation_CustomMessageArgument is argument for \"org.federation.CustomMessage\" message.\ntype FederationService_Org_Federation_CustomMessageArgument struct {\n\tMessage string\n\tFederationService_Org_Federation_CustomMessageVariable\n}\n\n// Org_Federation_GetPostResponseVariable represents variable definitions in \"org.federation.GetPostResponse\".\ntype FederationService_Org_Federation_GetPostResponseVariable struct {\n\tPost                *Post\n\tXDef2ErrDetail0Msg0 *CustomMessage\n\tXDef2ErrDetail0Msg1 *CustomMessage\n}\n\n// Org_Federation_GetPostResponseArgument is argument for \"org.federation.GetPostResponse\" message.\ntype FederationService_Org_Federation_GetPostResponseArgument struct {\n\tId string\n\tFederationService_Org_Federation_GetPostResponseVariable\n}\n\n// Org_Federation_PostVariable represents variable definitions in \"org.federation.Post\".\ntype FederationService_Org_Federation_PostVariable struct {\n}\n\n// Org_Federation_PostArgument is argument for \"org.federation.Post\" message.\ntype FederationService_Org_Federation_PostArgument struct {\n\tFederationService_Org_Federation_PostVariable\n}\n\n// FederationServiceConfig configuration required to initialize the service that use GRPC Federation.\ntype FederationServiceConfig struct {\n\t// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n\t// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\n\tErrorHandler grpcfed.ErrorHandler\n\t// Logger sets the logger used to output Debug/Info/Error information.\n\tLogger *slog.Logger\n}\n\n// FederationServiceClientFactory provides a factory that creates the gRPC Client needed to invoke methods of the gRPC Service on which the Federation Service depends.\ntype FederationServiceClientFactory interface {\n}\n\n// FederationServiceClientConfig helper to create gRPC client.\n// Hints for creating a gRPC Client.\ntype FederationServiceClientConfig struct {\n\t// Service FQDN ( `<package-name>.<service-name>` ) of the service on Protocol Buffers.\n\tService string\n}\n\n// FederationServiceDependentClientSet has a gRPC client for all services on which the federation service depends.\n// This is provided as an argument when implementing the custom resolver.\ntype FederationServiceDependentClientSet struct {\n}\n\n// FederationServiceResolver provides an interface to directly implement message resolver and field resolver not defined in Protocol Buffers.\ntype FederationServiceResolver interface {\n}\n\n// FederationServiceCELPluginWasmConfig type alias for grpcfedcel.WasmConfig.\ntype FederationServiceCELPluginWasmConfig = grpcfedcel.WasmConfig\n\n// FederationServiceCELPluginConfig hints for loading a WebAssembly based plugin.\ntype FederationServiceCELPluginConfig struct {\n\tCacheDir string\n}\n\n// FederationServiceUnimplementedResolver a structure implemented to satisfy the Resolver interface.\n// An Unimplemented error is always returned.\n// This is intended for use when there are many Resolver interfaces that do not need to be implemented,\n// by embedding them in a resolver structure that you have created.\ntype FederationServiceUnimplementedResolver struct{}\n\n// FederationService represents Federation Service.\ntype FederationService struct {\n\tUnimplementedFederationServiceServer\n\tcfg             FederationServiceConfig\n\tlogger          *slog.Logger\n\tisLogLevelDebug bool\n\terrorHandler    grpcfed.ErrorHandler\n\tcelCacheMap     *grpcfed.CELCacheMap\n\ttracer          trace.Tracer\n\tcelTypeHelper   *grpcfed.CELTypeHelper\n\tcelEnvOpts      []grpcfed.CELEnvOption\n\tcelPlugins      []*grpcfedcel.CELPlugin\n\tclient          *FederationServiceDependentClientSet\n}\n\n// NewFederationService creates FederationService instance by FederationServiceConfig.\nfunc NewFederationService(cfg FederationServiceConfig) (*FederationService, error) {\n\tlogger := cfg.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(slog.NewJSONHandler(io.Discard, nil))\n\t}\n\ttracer := otel.Tracer(\"org.federation.FederationService\")\n\tctx := grpcfed.WithLogger(context.Background(), logger)\n\tctx = grpcfed.WithTracer(ctx, tracer)\n\terrorHandler := cfg.ErrorHandler\n\tif errorHandler == nil {\n\t\terrorHandler = func(ctx context.Context, methodName string, err error) error { return err }\n\t}\n\tcelTypeHelperFieldMap := grpcfed.CELTypeHelperFieldMap{\n\t\t\"grpc.federation.private.org.federation.CustomMessageArgument\": {\n\t\t\t\"message\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Message\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.GetPostResponseArgument\": {\n\t\t\t\"id\": grpcfed.NewCELFieldType(grpcfed.CELStringType, \"Id\"),\n\t\t},\n\t\t\"grpc.federation.private.org.federation.PostArgument\": {},\n\t}\n\tcelTypeHelper := grpcfed.NewCELTypeHelper(\"org.federation\", celTypeHelperFieldMap)\n\tvar celEnvOpts []grpcfed.CELEnvOption\n\tcelEnvOpts = append(celEnvOpts, grpcfed.NewDefaultEnvOptions(celTypeHelper)...)\n\tsvc := &FederationService{\n\t\tcfg:             cfg,\n\t\tlogger:          logger,\n\t\tisLogLevelDebug: logger.Enabled(context.Background(), slog.LevelDebug),\n\t\terrorHandler:    errorHandler,\n\t\tcelEnvOpts:      celEnvOpts,\n\t\tcelTypeHelper:   celTypeHelper,\n\t\tcelCacheMap:     grpcfed.NewCELCacheMap(),\n\t\ttracer:          tracer,\n\t\tclient:          &FederationServiceDependentClientSet{},\n\t}\n\treturn svc, nil\n}\n\n// CleanupFederationService cleanup all resources to prevent goroutine leaks.\nfunc CleanupFederationService(ctx context.Context, svc *FederationService) {\n\tsvc.cleanup(ctx)\n}\n\nfunc (s *FederationService) cleanup(ctx context.Context) {\n\tfor _, plugin := range s.celPlugins {\n\t\tplugin.Close()\n\t}\n}\n\n// GetPost implements \"org.federation.FederationService/GetPost\" method.\nfunc (s *FederationService) GetPost(ctx context.Context, req *GetPostRequest) (res *GetPostResponse, e error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.FederationService/GetPost\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, s.logger)\n\tctx = grpcfed.WithCELCacheMap(ctx, s.celCacheMap)\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\te = grpcfed.RecoverError(r, grpcfed.StackTrace())\n\t\t\tgrpcfed.OutputErrorLog(ctx, e)\n\t\t}\n\t}()\n\tdefer func() {\n\t\tfor _, celPlugin := range s.celPlugins {\n\t\t\tcelPlugin.Cleanup()\n\t\t}\n\t}()\n\tres, err := s.resolve_Org_Federation_GetPostResponse(ctx, &FederationService_Org_Federation_GetPostResponseArgument{\n\t\tId: req.GetId(),\n\t})\n\tif err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\tgrpcfed.OutputErrorLog(ctx, err)\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\n// resolve_Org_Federation_CustomMessage resolve \"org.federation.CustomMessage\" message.\nfunc (s *FederationService) resolve_Org_Federation_CustomMessage(ctx context.Context, req *FederationService_Org_Federation_CustomMessageArgument) (*CustomMessage, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.CustomMessage\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.CustomMessage\", slog.Any(\"message_args\", s.logvalue_Org_Federation_CustomMessageArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.CustomMessageArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &CustomMessage{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"$.message\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `$.message`,\n\t\tCacheIndex: 1,\n\t\tSetter: func(v string) error {\n\t\t\tret.Message = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.CustomMessage\", slog.Any(\"org.federation.CustomMessage\", s.logvalue_Org_Federation_CustomMessage(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_GetPostResponse resolve \"org.federation.GetPostResponse\" message.\nfunc (s *FederationService) resolve_Org_Federation_GetPostResponse(ctx context.Context, req *FederationService_Org_Federation_GetPostResponseArgument) (*GetPostResponse, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.GetPostResponse\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.GetPostResponse\", slog.Any(\"message_args\", s.logvalue_Org_Federation_GetPostResponseArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t\tA                   int64\n\t\t\tB                   string\n\t\t\tPost                *Post\n\t\t\tXDef1               bool\n\t\t\tXDef2               bool\n\t\t\tXDef2ErrDetail0Msg0 *CustomMessage\n\t\t\tXDef2ErrDetail0Msg1 *CustomMessage\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.GetPostResponseArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\t/*\n\t\tdef {\n\t\t  name: \"post\"\n\t\t  message {\n\t\t    name: \"Post\"\n\t\t  }\n\t\t}\n\t*/\n\tdef_post := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*Post, *localValueType]{\n\t\t\tName: `post`,\n\t\t\tType: grpcfed.CELObjectType(\"org.federation.Post\"),\n\t\t\tSetter: func(value *localValueType, v *Post) error {\n\t\t\t\tvalue.vars.Post = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\targs := &FederationService_Org_Federation_PostArgument{}\n\t\t\t\tret, err := s.resolve_Org_Federation_Post(ctx, args)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn ret, nil\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"_def1\"\n\t\t  validation {\n\t\t    error {\n\t\t      code: FAILED_PRECONDITION\n\t\t      def {\n\t\t        name: \"a\"\n\t\t        by: \"73\"\n\t\t      }\n\t\t      if: \"post.id != 'some-id'\"\n\t\t      message: \"'validation message 1'\"\n\t\t    }\n\t\t  }\n\t\t}\n\t*/\n\tdef__def1 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[bool, *localValueType]{\n\t\t\tName: `_def1`,\n\t\t\tType: grpcfed.CELBoolType,\n\t\t\tSetter: func(value *localValueType, v bool) error {\n\t\t\t\tvalue.vars.XDef1 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tValidation: func(ctx context.Context, value *localValueType) error {\n\t\t\t\tvar stat *grpcfed.Status\n\t\t\t\tif _, err := func() (any, error) {\n\t\t\t\t\t/*\n\t\t\t\t\t\tdef {\n\t\t\t\t\t\t  name: \"a\"\n\t\t\t\t\t\t  by: \"73\"\n\t\t\t\t\t\t}\n\t\t\t\t\t*/\n\t\t\t\t\tdef_a := func(ctx context.Context) error {\n\t\t\t\t\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[int64, *localValueType]{\n\t\t\t\t\t\t\tName: `a`,\n\t\t\t\t\t\t\tType: grpcfed.CELIntType,\n\t\t\t\t\t\t\tSetter: func(value *localValueType, v int64) error {\n\t\t\t\t\t\t\t\tvalue.vars.A = v\n\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tBy:           `73`,\n\t\t\t\t\t\t\tByCacheIndex: 2,\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\n\t\t\t\t\tif err := def_a(ctx); err != nil {\n\t\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t}\n\t\t\t\t\treturn nil, nil\n\t\t\t\t}(); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `post.id != 'some-id'`,\n\t\t\t\t\tCacheIndex: 3,\n\t\t\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t\t\terrmsg, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\tExpr:       `'validation message 1'`,\n\t\t\t\t\t\t\tOutType:    reflect.TypeOf(\"\"),\n\t\t\t\t\t\t\tCacheIndex: 4,\n\t\t\t\t\t\t})\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t}\n\t\t\t\t\t\terrorMessage := errmsg.(string)\n\t\t\t\t\t\tstat = grpcfed.NewGRPCStatus(grpcfed.FailedPreconditionCode, errorMessage)\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\treturn grpcfed.NewErrorWithLogAttrs(stat.Err(), slog.LevelError, grpcfed.LogAttrs(ctx))\n\t\t\t},\n\t\t})\n\t}\n\n\t/*\n\t\tdef {\n\t\t  name: \"_def2\"\n\t\t  validation {\n\t\t    error {\n\t\t      code: FAILED_PRECONDITION\n\t\t      if: \"true\"\n\t\t      message: \"'validation message 2'\"\n\t\t      details {\n\t\t        def {\n\t\t          name: \"b\"\n\t\t          by: \"'mackerel'\"\n\t\t        }\n\t\t        if: \"post.title != 'some-title'\"\n\t\t        message: [\n\t\t          {...},\n\t\t          {...}\n\t\t        ]\n\t\t        precondition_failure {...}\n\t\t        bad_request {...}\n\t\t        localized_message {...}\n\t\t      }\n\t\t    }\n\t\t  }\n\t\t}\n\t*/\n\tdef__def2 := func(ctx context.Context) error {\n\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[bool, *localValueType]{\n\t\t\tName: `_def2`,\n\t\t\tType: grpcfed.CELBoolType,\n\t\t\tSetter: func(value *localValueType, v bool) error {\n\t\t\t\tvalue.vars.XDef2 = v\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tValidation: func(ctx context.Context, value *localValueType) error {\n\t\t\t\tvar stat *grpcfed.Status\n\t\t\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       `true`,\n\t\t\t\t\tCacheIndex: 5,\n\t\t\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t\t\terrmsg, err := grpcfed.EvalCEL(ctx, &grpcfed.EvalCELRequest{\n\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\tExpr:       `'validation message 2'`,\n\t\t\t\t\t\t\tOutType:    reflect.TypeOf(\"\"),\n\t\t\t\t\t\t\tCacheIndex: 6,\n\t\t\t\t\t\t})\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t}\n\t\t\t\t\t\terrorMessage := errmsg.(string)\n\t\t\t\t\t\tvar details []grpcfed.ProtoMessage\n\t\t\t\t\t\tif _, err := func() (any, error) {\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t\tdef {\n\t\t\t\t\t\t\t\t  name: \"b\"\n\t\t\t\t\t\t\t\t  by: \"'mackerel'\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\tdef_b := func(ctx context.Context) error {\n\t\t\t\t\t\t\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[string, *localValueType]{\n\t\t\t\t\t\t\t\t\tName: `b`,\n\t\t\t\t\t\t\t\t\tType: grpcfed.CELStringType,\n\t\t\t\t\t\t\t\t\tSetter: func(value *localValueType, v string) error {\n\t\t\t\t\t\t\t\t\t\tvalue.vars.B = v\n\t\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tBy:           `'mackerel'`,\n\t\t\t\t\t\t\t\t\tByCacheIndex: 7,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif err := def_b(ctx); err != nil {\n\t\t\t\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn nil, nil\n\t\t\t\t\t\t}(); err != nil {\n\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif err := grpcfed.If(ctx, &grpcfed.IfParam[*localValueType]{\n\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\tExpr:       `post.title != 'some-title'`,\n\t\t\t\t\t\t\tCacheIndex: 8,\n\t\t\t\t\t\t\tBody: func(value *localValueType) error {\n\t\t\t\t\t\t\t\tif _, err := func() (any, error) {\n\t\t\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t\t\t\tdef {\n\t\t\t\t\t\t\t\t\t\t  name: \"_def2_err_detail0_msg0\"\n\t\t\t\t\t\t\t\t\t\t  message {\n\t\t\t\t\t\t\t\t\t\t    name: \"CustomMessage\"\n\t\t\t\t\t\t\t\t\t\t    args { name: \"message\", by: \"'message1'\" }\n\t\t\t\t\t\t\t\t\t\t  }\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\t\t\tdef__def2_err_detail0_msg0 := func(ctx context.Context) error {\n\t\t\t\t\t\t\t\t\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*CustomMessage, *localValueType]{\n\t\t\t\t\t\t\t\t\t\t\tName: `_def2_err_detail0_msg0`,\n\t\t\t\t\t\t\t\t\t\t\tType: grpcfed.CELObjectType(\"org.federation.CustomMessage\"),\n\t\t\t\t\t\t\t\t\t\t\tSetter: func(value *localValueType, v *CustomMessage) error {\n\t\t\t\t\t\t\t\t\t\t\t\tvalue.vars.XDef2ErrDetail0Msg0 = v\n\t\t\t\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\t\t\t\t\t\t\t\t\targs := &FederationService_Org_Federation_CustomMessageArgument{}\n\t\t\t\t\t\t\t\t\t\t\t\t// { name: \"message\", by: \"'message1'\" }\n\t\t\t\t\t\t\t\t\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\t\t\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\t\t\t\t\t\t\tExpr:       `'message1'`,\n\t\t\t\t\t\t\t\t\t\t\t\t\tCacheIndex: 9,\n\t\t\t\t\t\t\t\t\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\targs.Message = v\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tret, err := s.resolve_Org_Federation_CustomMessage(ctx, args)\n\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\treturn ret, nil\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t\t\t\tdef {\n\t\t\t\t\t\t\t\t\t\t  name: \"_def2_err_detail0_msg1\"\n\t\t\t\t\t\t\t\t\t\t  message {\n\t\t\t\t\t\t\t\t\t\t    name: \"CustomMessage\"\n\t\t\t\t\t\t\t\t\t\t    args { name: \"message\", by: \"'message2'\" }\n\t\t\t\t\t\t\t\t\t\t  }\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\t\t\tdef__def2_err_detail0_msg1 := func(ctx context.Context) error {\n\t\t\t\t\t\t\t\t\t\treturn grpcfed.EvalDef(ctx, value, grpcfed.Def[*CustomMessage, *localValueType]{\n\t\t\t\t\t\t\t\t\t\t\tName: `_def2_err_detail0_msg1`,\n\t\t\t\t\t\t\t\t\t\t\tType: grpcfed.CELObjectType(\"org.federation.CustomMessage\"),\n\t\t\t\t\t\t\t\t\t\t\tSetter: func(value *localValueType, v *CustomMessage) error {\n\t\t\t\t\t\t\t\t\t\t\t\tvalue.vars.XDef2ErrDetail0Msg1 = v\n\t\t\t\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\tMessage: func(ctx context.Context, value *localValueType) (any, error) {\n\t\t\t\t\t\t\t\t\t\t\t\targs := &FederationService_Org_Federation_CustomMessageArgument{}\n\t\t\t\t\t\t\t\t\t\t\t\t// { name: \"message\", by: \"'message2'\" }\n\t\t\t\t\t\t\t\t\t\t\t\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\t\t\t\t\t\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\t\t\t\t\t\t\tExpr:       `'message2'`,\n\t\t\t\t\t\t\t\t\t\t\t\t\tCacheIndex: 10,\n\t\t\t\t\t\t\t\t\t\t\t\t\tSetter: func(v string) error {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\targs.Message = v\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tret, err := s.resolve_Org_Federation_CustomMessage(ctx, args)\n\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\treturn ret, nil\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// A tree view of message dependencies is shown below.\n\t\t\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t\t\t   _def2_err_detail0_msg0 ─┐\n\t\t\t\t\t\t\t\t\t   _def2_err_detail0_msg1 ─┤\n\t\t\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\t\t\teg, ctx1 := grpcfed.ErrorGroupWithContext(ctx)\n\n\t\t\t\t\t\t\t\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\t\t\t\t\t\t\t\tif err := def__def2_err_detail0_msg0(ctx1); err != nil {\n\t\t\t\t\t\t\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\treturn nil, nil\n\t\t\t\t\t\t\t\t\t})\n\n\t\t\t\t\t\t\t\t\tgrpcfed.GoWithRecover(eg, func() (any, error) {\n\t\t\t\t\t\t\t\t\t\tif err := def__def2_err_detail0_msg1(ctx1); err != nil {\n\t\t\t\t\t\t\t\t\t\t\tgrpcfed.RecordErrorToSpan(ctx1, err)\n\t\t\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\treturn nil, nil\n\t\t\t\t\t\t\t\t\t})\n\n\t\t\t\t\t\t\t\t\tif err := eg.Wait(); err != nil {\n\t\t\t\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn nil, nil\n\t\t\t\t\t\t\t\t}(); err != nil {\n\t\t\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif detail := grpcfed.CustomMessage(ctx, &grpcfed.CustomMessageParam{\n\t\t\t\t\t\t\t\t\tValue:            value,\n\t\t\t\t\t\t\t\t\tMessageValueName: \"_def2_err_detail0_msg0\",\n\t\t\t\t\t\t\t\t\tCacheIndex:       11,\n\t\t\t\t\t\t\t\t\tMessageIndex:     0,\n\t\t\t\t\t\t\t\t}); detail != nil {\n\t\t\t\t\t\t\t\t\tdetails = append(details, detail)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif detail := grpcfed.CustomMessage(ctx, &grpcfed.CustomMessageParam{\n\t\t\t\t\t\t\t\t\tValue:            value,\n\t\t\t\t\t\t\t\t\tMessageValueName: \"_def2_err_detail0_msg1\",\n\t\t\t\t\t\t\t\t\tCacheIndex:       12,\n\t\t\t\t\t\t\t\t\tMessageIndex:     1,\n\t\t\t\t\t\t\t\t}); detail != nil {\n\t\t\t\t\t\t\t\t\tdetails = append(details, detail)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif detail := grpcfed.PreconditionFailure(ctx, value, []*grpcfed.PreconditionFailureViolation{\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tType:              `'some-type'`,\n\t\t\t\t\t\t\t\t\t\tSubject:           `'some-subject'`,\n\t\t\t\t\t\t\t\t\t\tDesc:              `'some-description'`,\n\t\t\t\t\t\t\t\t\t\tTypeCacheIndex:    13,\n\t\t\t\t\t\t\t\t\t\tSubjectCacheIndex: 14,\n\t\t\t\t\t\t\t\t\t\tDescCacheIndex:    15,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t}); detail != nil {\n\t\t\t\t\t\t\t\t\tdetails = append(details, detail)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif detail := grpcfed.BadRequest(ctx, value, []*grpcfed.BadRequestFieldViolation{\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tField:           `'some-field'`,\n\t\t\t\t\t\t\t\t\t\tDesc:            `'some-description'`,\n\t\t\t\t\t\t\t\t\t\tFieldCacheIndex: 16,\n\t\t\t\t\t\t\t\t\t\tDescCacheIndex:  17,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t}); detail != nil {\n\t\t\t\t\t\t\t\t\tdetails = append(details, detail)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif detail := grpcfed.LocalizedMessage(ctx, &grpcfed.LocalizedMessageParam{\n\t\t\t\t\t\t\t\t\tValue:      value,\n\t\t\t\t\t\t\t\t\tLocale:     \"en-US\",\n\t\t\t\t\t\t\t\t\tMessage:    `'some-message'`,\n\t\t\t\t\t\t\t\t\tCacheIndex: 18,\n\t\t\t\t\t\t\t\t}); detail != nil {\n\t\t\t\t\t\t\t\t\tdetails = append(details, detail)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}); err != nil {\n\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstatus := grpcfed.NewGRPCStatus(grpcfed.FailedPreconditionCode, errorMessage)\n\t\t\t\t\t\tstatusWithDetails, err := status.WithDetails(details...)\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\tgrpcfed.Logger(ctx).ErrorContext(ctx, \"failed setting error details\", slog.String(\"error\", err.Error()))\n\t\t\t\t\t\t\tstat = status\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tstat = statusWithDetails\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t},\n\t\t\t\t}); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\treturn grpcfed.NewErrorWithLogAttrs(stat.Err(), slog.LevelWarn, grpcfed.LogAttrs(ctx))\n\t\t\t},\n\t\t})\n\t}\n\n\tif err := def_post(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\tif err := def__def1(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\tif err := def__def2(ctx); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\t// assign named parameters to message arguments to pass to the custom resolver.\n\treq.FederationService_Org_Federation_GetPostResponseVariable.Post = value.vars.Post\n\treq.FederationService_Org_Federation_GetPostResponseVariable.XDef2ErrDetail0Msg0 = value.vars.XDef2ErrDetail0Msg0\n\treq.FederationService_Org_Federation_GetPostResponseVariable.XDef2ErrDetail0Msg1 = value.vars.XDef2ErrDetail0Msg1\n\n\t// create a message value to be returned.\n\tret := &GetPostResponse{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"post\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[*Post]{\n\t\tValue:      value,\n\t\tExpr:       `post`,\n\t\tCacheIndex: 19,\n\t\tSetter: func(v *Post) error {\n\t\t\tret.Post = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.GetPostResponse\", slog.Any(\"org.federation.GetPostResponse\", s.logvalue_Org_Federation_GetPostResponse(ret)))\n\treturn ret, nil\n}\n\n// resolve_Org_Federation_Post resolve \"org.federation.Post\" message.\nfunc (s *FederationService) resolve_Org_Federation_Post(ctx context.Context, req *FederationService_Org_Federation_PostArgument) (*Post, error) {\n\tctx, span := s.tracer.Start(ctx, \"org.federation.Post\")\n\tdefer span.End()\n\tctx = grpcfed.WithLogger(ctx, grpcfed.Logger(ctx), grpcfed.LogAttrs(ctx)...)\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolve org.federation.Post\", slog.Any(\"message_args\", s.logvalue_Org_Federation_PostArgument(req)))\n\ttype localValueType struct {\n\t\t*grpcfed.LocalValue\n\t\tvars struct {\n\t\t}\n\t}\n\tvalue := &localValueType{LocalValue: grpcfed.NewLocalValue(ctx, s.celEnvOpts, \"grpc.federation.private.org.federation.PostArgument\", req)}\n\tctx = grpcfed.WithLocalValue(ctx, value.LocalValue)\n\n\t// create a message value to be returned.\n\tret := &Post{}\n\n\t// field binding section.\n\t// (grpc.federation.field).by = \"'some-id'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'some-id'`,\n\t\tCacheIndex: 20,\n\t\tSetter: func(v string) error {\n\t\t\tret.Id = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"'some-title'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'some-title'`,\n\t\tCacheIndex: 21,\n\t\tSetter: func(v string) error {\n\t\t\tret.Title = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\t// (grpc.federation.field).by = \"'some-content'\"\n\tif err := grpcfed.SetCELValue(ctx, &grpcfed.SetCELValueParam[string]{\n\t\tValue:      value,\n\t\tExpr:       `'some-content'`,\n\t\tCacheIndex: 22,\n\t\tSetter: func(v string) error {\n\t\t\tret.Content = v\n\t\t\treturn nil\n\t\t},\n\t}); err != nil {\n\t\tgrpcfed.RecordErrorToSpan(ctx, err)\n\t\treturn nil, err\n\t}\n\n\tgrpcfed.Logger(ctx).DebugContext(ctx, \"resolved org.federation.Post\", slog.Any(\"org.federation.Post\", s.logvalue_Org_Federation_Post(ret)))\n\treturn ret, nil\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_CustomMessage(v *CustomMessage) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"message\", v.GetMessage()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_CustomMessageArgument(v *FederationService_Org_Federation_CustomMessageArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"message\", v.Message),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostResponse(v *GetPostResponse) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.Any(\"post\", s.logvalue_Org_Federation_Post(v.GetPost())),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_GetPostResponseArgument(v *FederationService_Org_Federation_GetPostResponseArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.Id),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_Post(v *Post) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue(\n\t\tslog.String(\"id\", v.GetId()),\n\t\tslog.String(\"title\", v.GetTitle()),\n\t\tslog.String(\"content\", v.GetContent()),\n\t)\n}\n\nfunc (s *FederationService) logvalue_Org_Federation_PostArgument(v *FederationService_Org_Federation_PostArgument) slog.Value {\n\tif !s.isLogLevelDebug {\n\t\treturn slog.GroupValue()\n\t}\n\tif v == nil {\n\t\treturn slog.GroupValue()\n\t}\n\treturn slog.GroupValue()\n}\n"
  },
  {
    "path": "generator/wasm.go",
    "content": "package generator\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/tetratelabs/wazero\"\n\t\"github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1\"\n\t\"google.golang.org/protobuf/proto\"\n\t\"google.golang.org/protobuf/types/pluginpb\"\n)\n\n// wasmPlugin holds a compiled WASM module and its runtime, allowing\n// the module to be instantiated multiple times without recompilation.\n// Execute is safe for concurrent use.\ntype wasmPlugin struct {\n\truntime  wazero.Runtime\n\tcompiled wazero.CompiledModule\n}\n\nfunc newWasmPlugin(ctx context.Context, wasmBytes []byte) (*wasmPlugin, error) {\n\truntimeCfg := wazero.NewRuntimeConfigInterpreter()\n\tif cache := getCompilationCache(); cache != nil {\n\t\truntimeCfg = runtimeCfg.WithCompilationCache(cache)\n\t}\n\tr := wazero.NewRuntimeWithConfig(ctx, runtimeCfg)\n\twasi_snapshot_preview1.MustInstantiate(ctx, r)\n\n\tcompiled, err := r.CompileModule(ctx, wasmBytes)\n\tif err != nil {\n\t\tr.Close(ctx)\n\t\treturn nil, fmt.Errorf(\"grpc-federation: failed to compile code-generator plugin: %w\", err)\n\t}\n\treturn &wasmPlugin{\n\t\truntime:  r,\n\t\tcompiled: compiled,\n\t}, nil\n}\n\nfunc (p *wasmPlugin) Execute(ctx context.Context, req io.Reader) (*pluginpb.CodeGeneratorResponse, error) {\n\tbuf := new(bytes.Buffer)\n\tmodCfg := wazero.NewModuleConfig().\n\t\tWithFSConfig(wazero.NewFSConfig().WithDirMount(\".\", \"/\")).\n\t\tWithStdin(req).\n\t\tWithStdout(buf).\n\t\tWithStderr(os.Stderr).\n\t\tWithArgs(\"wasi\")\n\n\tmod, err := p.runtime.InstantiateModule(ctx, p.compiled, modCfg)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"grpc-federation: failed to instantiate code-generator plugin: %w\", err)\n\t}\n\tmod.Close(ctx)\n\n\tvar res pluginpb.CodeGeneratorResponse\n\tresBytes := buf.Bytes()\n\tif len(resBytes) != 0 {\n\t\tif err := proto.Unmarshal(resBytes, &res); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn &res, nil\n}\n\nfunc (p *wasmPlugin) Close(ctx context.Context) error {\n\treturn p.runtime.Close(ctx)\n}\n\n// wasmPluginCache caches compiled WASM plugins so that the expensive\n// compilation step is performed only once per plugin path.\ntype wasmPluginCache struct {\n\tmu      sync.RWMutex\n\tplugins map[string]*wasmPlugin\n}\n\nfunc newWasmPluginCache() *wasmPluginCache {\n\treturn &wasmPluginCache{plugins: make(map[string]*wasmPlugin)}\n}\n\nfunc (c *wasmPluginCache) getOrCreate(ctx context.Context, opt *WasmPluginOption) (*wasmPlugin, error) {\n\twasmFile, err := os.ReadFile(opt.Path)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"grpc-federation: failed to read plugin file: %s: %w\", opt.Path, err)\n\t}\n\thash := sha256.Sum256(wasmFile)\n\tgotHash := hex.EncodeToString(hash[:])\n\tif opt.Sha256 != \"\" && opt.Sha256 != gotHash {\n\t\treturn nil, fmt.Errorf(\n\t\t\t`grpc-federation: expected plugin sha256 value is [%s] but got [%s]`,\n\t\t\topt.Sha256,\n\t\t\tgotHash,\n\t\t)\n\t}\n\tcacheKey := opt.Path + \":\" + gotHash\n\n\tc.mu.RLock()\n\tif wp, ok := c.plugins[cacheKey]; ok {\n\t\tc.mu.RUnlock()\n\t\treturn wp, nil\n\t}\n\tc.mu.RUnlock()\n\n\tc.mu.Lock()\n\tdefer c.mu.Unlock()\n\n\t// Double-check after acquiring write lock.\n\tif wp, ok := c.plugins[cacheKey]; ok {\n\t\treturn wp, nil\n\t}\n\twp, err := newWasmPlugin(ctx, wasmFile)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tc.plugins[cacheKey] = wp\n\treturn wp, nil\n}\n\nfunc (c *wasmPluginCache) Close(ctx context.Context) error {\n\tc.mu.Lock()\n\tdefer c.mu.Unlock()\n\n\terrs := make([]error, 0, len(c.plugins))\n\tfor _, wp := range c.plugins {\n\t\terrs = append(errs, wp.Close(ctx))\n\t}\n\treturn errors.Join(errs...)\n}\n\nfunc getCompilationCache() wazero.CompilationCache {\n\ttmpDir := os.TempDir()\n\tif tmpDir == \"\" {\n\t\treturn nil\n\t}\n\tcacheDir := filepath.Join(tmpDir, \"grpc-federation\")\n\tif _, err := os.Stat(cacheDir); err != nil {\n\t\tif err := os.Mkdir(cacheDir, 0o755); err != nil {\n\t\t\treturn nil\n\t\t}\n\t}\n\tcache, err := wazero.NewCompilationCacheWithDir(cacheDir)\n\tif err != nil {\n\t\treturn nil\n\t}\n\treturn cache\n}\n"
  },
  {
    "path": "generator/watcher.go",
    "content": "package generator\n\nimport (\n\t\"context\"\n\t\"log\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/fsnotify/fsnotify\"\n\t\"golang.org/x/sync/errgroup\"\n)\n\ntype Watcher struct {\n\tisWorking   bool\n\tisWorkingMu sync.RWMutex\n\teventCh     chan fsnotify.Event\n\thandler     func(context.Context, fsnotify.Event)\n\twatcher     *fsnotify.Watcher\n}\n\nfunc NewWatcher() (*Watcher, error) {\n\twatcher, err := fsnotify.NewWatcher()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &Watcher{\n\t\teventCh: make(chan fsnotify.Event),\n\t\thandler: func(context.Context, fsnotify.Event) {},\n\t\twatcher: watcher,\n\t}, nil\n}\n\nfunc (w *Watcher) Close() {\n\tw.watcher.Close()\n}\n\nfunc (w *Watcher) SetHandler(handler func(ctx context.Context, event fsnotify.Event)) {\n\tw.handler = handler\n}\n\nfunc (w *Watcher) SetWatchPath(path ...string) error {\n\treturn w.setWatchPathRecursive(path...)\n}\n\nfunc (w *Watcher) setWatchPathRecursive(path ...string) error {\n\tpathMap := make(map[string]struct{})\n\tfor _, p := range path {\n\t\tif err := filepath.Walk(p, func(path string, info os.FileInfo, err error) error {\n\t\t\tif info == nil {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tif !info.IsDir() {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tif strings.HasPrefix(path, \".\") {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tpathMap[path] = struct{}{}\n\t\t\treturn nil\n\t\t}); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tfor path := range pathMap {\n\t\tif err := w.watcher.Add(path); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (w *Watcher) Run(ctx context.Context) error {\n\teg, ctx := errgroup.WithContext(ctx)\n\teg.Go(func() error {\n\t\tw.sendEventLoop()\n\t\treturn nil\n\t})\n\teg.Go(func() error {\n\t\tw.receiveEventLoop(ctx)\n\t\treturn nil\n\t})\n\tif err := eg.Wait(); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (w *Watcher) sendEventLoop() {\n\tfor {\n\t\tselect {\n\t\tcase event, ok := <-w.watcher.Events:\n\t\t\tif !ok {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tw.handleEvent(event)\n\t\tcase err, ok := <-w.watcher.Errors:\n\t\t\tif !ok {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tlog.Println(\"error:\", err)\n\t\t}\n\t}\n}\n\nfunc (w *Watcher) handleEvent(event fsnotify.Event) {\n\tif w.IsWorking() {\n\t\treturn\n\t}\n\tif !w.isModified(event) {\n\t\treturn\n\t}\n\tif w.ignoreFilePath(event.Name) {\n\t\treturn\n\t}\n\tw.eventCh <- event\n}\n\nfunc (w *Watcher) isModified(ev fsnotify.Event) bool {\n\treturn ev.Has(fsnotify.Write) ||\n\t\tev.Has(fsnotify.Create) ||\n\t\tev.Has(fsnotify.Remove) ||\n\t\tev.Has(fsnotify.Rename)\n}\n\nfunc (w *Watcher) ignoreFilePath(path string) bool {\n\tif strings.HasPrefix(path, \"#\") {\n\t\treturn true\n\t}\n\tif strings.HasPrefix(path, \".\") {\n\t\treturn true\n\t}\n\tif filepath.Ext(path) != \".proto\" {\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (w *Watcher) receiveEventLoop(ctx context.Context) {\n\tfor {\n\t\tevent := <-w.eventCh\n\t\tw.setWorking(true)\n\t\tw.handler(ctx, event)\n\t\tw.setWorking(false)\n\t}\n}\n\nfunc (w *Watcher) IsWorking() bool {\n\tw.isWorkingMu.RLock()\n\tdefer w.isWorkingMu.RUnlock()\n\treturn w.isWorking\n}\n\nfunc (w *Watcher) setWorking(working bool) {\n\tw.isWorkingMu.Lock()\n\tdefer w.isWorkingMu.Unlock()\n\tw.isWorking = working\n}\n"
  },
  {
    "path": "go.mod",
    "content": "module github.com/mercari/grpc-federation\n\ngo 1.24.0\n\nrequire (\n\tgithub.com/bufbuild/protocompile v0.9.0\n\tgithub.com/cenkalti/backoff/v4 v4.2.1\n\tgithub.com/fsnotify/fsnotify v1.7.0\n\tgithub.com/goccy/go-yaml v1.11.2\n\tgithub.com/goccy/wasi-go v0.3.2\n\tgithub.com/goccy/wasi-go-net v0.3.0\n\tgithub.com/google/cel-go v0.23.1\n\tgithub.com/google/go-cmp v0.7.0\n\tgithub.com/google/uuid v1.6.0\n\tgithub.com/jessevdk/go-flags v1.5.0\n\tgithub.com/kelseyhightower/envconfig v1.4.0\n\tgithub.com/mark3labs/mcp-go v0.32.0\n\tgithub.com/tetratelabs/wazero v1.10.1\n\tgo.lsp.dev/jsonrpc2 v0.10.0\n\tgo.lsp.dev/pkg v0.0.0-20210717090340-384b27a52fb2\n\tgo.lsp.dev/protocol v0.12.0\n\tgo.lsp.dev/uri v0.3.0\n\tgo.opentelemetry.io/otel v1.24.0\n\tgo.opentelemetry.io/otel/trace v1.24.0\n\tgo.uber.org/multierr v1.11.0\n\tgo.uber.org/zap v1.27.0\n\tgolang.org/x/mod v0.24.0\n\tgolang.org/x/sync v0.14.0\n\tgolang.org/x/text v0.23.0\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7\n\tgoogle.golang.org/grpc v1.65.0\n\tgoogle.golang.org/protobuf v1.34.2\n)\n\nrequire (\n\tcel.dev/expr v0.19.1 // indirect\n\tgithub.com/antlr4-go/antlr/v4 v4.13.0 // indirect\n\tgithub.com/fatih/color v1.10.0 // indirect\n\tgithub.com/go-logr/logr v1.4.1 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/mattn/go-colorable v0.1.13 // indirect\n\tgithub.com/mattn/go-isatty v0.0.17 // indirect\n\tgithub.com/segmentio/asm v1.1.3 // indirect\n\tgithub.com/segmentio/encoding v0.3.4 // indirect\n\tgithub.com/spf13/cast v1.7.1 // indirect\n\tgithub.com/stealthrocket/wazergo v0.19.1 // indirect\n\tgithub.com/stoewer/go-strcase v1.3.0 // indirect\n\tgithub.com/yosida95/uritemplate/v3 v3.0.2 // indirect\n\tgo.opentelemetry.io/otel/metric v1.24.0 // indirect\n\tgolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect\n\tgolang.org/x/net v0.38.0 // indirect\n\tgolang.org/x/sys v0.37.0 // indirect\n\tgolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect\n)\n"
  },
  {
    "path": "go.sum",
    "content": "cel.dev/expr v0.19.1 h1:NciYrtDRIR0lNCnH1LFJegdjspNx9fI59O7TWcua/W4=\ncel.dev/expr v0.19.1/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw=\ngithub.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=\ngithub.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=\ngithub.com/bufbuild/protocompile v0.9.0 h1:DI8qLG5PEO0Mu1Oj51YFPqtx6I3qYXUAhJVJ/IzAVl0=\ngithub.com/bufbuild/protocompile v0.9.0/go.mod h1:s89m1O8CqSYpyE/YaSGtg1r1YFMF5nLTwh4vlj6O444=\ngithub.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=\ngithub.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg=\ngithub.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=\ngithub.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=\ngithub.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=\ngithub.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=\ngithub.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\ngithub.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q=\ngithub.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=\ngithub.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no=\ngithub.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=\ngithub.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE=\ngithub.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=\ngithub.com/goccy/go-yaml v1.11.2 h1:joq77SxuyIs9zzxEjgyLBugMQ9NEgTWxXfz2wVqwAaQ=\ngithub.com/goccy/go-yaml v1.11.2/go.mod h1:wKnAMd44+9JAAnGQpWVEgBzGt3YuTaQ4uXoHvE4m7WU=\ngithub.com/goccy/wasi-go v0.3.2 h1:wAvGXmqCkfcp0B0AwIp5Ya53hzDwkKm9W8iuT3nCCz0=\ngithub.com/goccy/wasi-go v0.3.2/go.mod h1:nIKD204n9xa4Z20UV+XA483kIr9TAl2vXr+X5qVAO5M=\ngithub.com/goccy/wasi-go-net v0.3.0 h1:I7s6m0lrDBDslxVcEty2SQ7cbSllqXngKZPYav6aZ+A=\ngithub.com/goccy/wasi-go-net v0.3.0/go.mod h1:TwJyFeFt+nPsjt0+640ccN/c/Y3ERaC91gybpOT59CM=\ngithub.com/google/cel-go v0.23.1 h1:91ThhEZlBcE5rB2adBVXqvDoqdL8BG2oyhd0bK1I/r4=\ngithub.com/google/cel-go v0.23.1/go.mod h1:52Pb6QsDbC5kvgxvZhiL9QX1oZEkcUF/ZqaPx1J5Wwo=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\ngithub.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc=\ngithub.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4=\ngithub.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=\ngithub.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y=\ngithub.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=\ngithub.com/mark3labs/mcp-go v0.32.0 h1:fgwmbfL2gbd67obg57OfV2Dnrhs1HtSdlY/i5fn7MU8=\ngithub.com/mark3labs/mcp-go v0.32.0/go.mod h1:rXqOudj/djTORU/ThxYx8fqEVj/5pvTuuebQ2RC7uk4=\ngithub.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=\ngithub.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng=\ngithub.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=\ngithub.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=\ngithub.com/segmentio/asm v1.1.3 h1:WM03sfUOENvvKexOLp+pCqgb/WDjsi7EK8gIsICtzhc=\ngithub.com/segmentio/asm v1.1.3/go.mod h1:Ld3L4ZXGNcSLRg4JBsZ3//1+f/TjYl0Mzen/DQy1EJg=\ngithub.com/segmentio/encoding v0.3.4 h1:WM4IBnxH8B9TakiM2QD5LyNl9JSndh88QbHqVC+Pauc=\ngithub.com/segmentio/encoding v0.3.4/go.mod h1:n0JeuIqEQrQoPDGsjo8UNd1iA0U8d8+oHAA4E3G3OxM=\ngithub.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y=\ngithub.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=\ngithub.com/stealthrocket/wazergo v0.19.1 h1:BPrITETPgSFwiytwmToO0MbUC/+RGC39JScz1JmmG6c=\ngithub.com/stealthrocket/wazergo v0.19.1/go.mod h1:riI0hxw4ndZA5e6z7PesHg2BtTftcZaMxRcoiGGipTs=\ngithub.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs=\ngithub.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tetratelabs/wazero v1.10.1 h1:2DugeJf6VVk58KTPszlNfeeN8AhhpwcZqkJj2wwFuH8=\ngithub.com/tetratelabs/wazero v1.10.1/go.mod h1:DRm5twOQ5Gr1AoEdSi0CLjDQF1J9ZAuyqFIjl1KKfQU=\ngithub.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4=\ngithub.com/yosida95/uritemplate/v3 v3.0.2/go.mod h1:ILOh0sOhIJR3+L/8afwt/kE++YT040gmv5BQTMR2HP4=\ngo.lsp.dev/jsonrpc2 v0.10.0 h1:Pr/YcXJoEOTMc/b6OTmcR1DPJ3mSWl/SWiU1Cct6VmI=\ngo.lsp.dev/jsonrpc2 v0.10.0/go.mod h1:fmEzIdXPi/rf6d4uFcayi8HpFP1nBF99ERP1htC72Ac=\ngo.lsp.dev/pkg v0.0.0-20210717090340-384b27a52fb2 h1:hCzQgh6UcwbKgNSRurYWSqh8MufqRRPODRBblutn4TE=\ngo.lsp.dev/pkg v0.0.0-20210717090340-384b27a52fb2/go.mod h1:gtSHRuYfbCT0qnbLnovpie/WEmqyJ7T4n6VXiFMBtcw=\ngo.lsp.dev/protocol v0.12.0 h1:tNprUI9klQW5FAFVM4Sa+AbPFuVQByWhP1ttNUAjIWg=\ngo.lsp.dev/protocol v0.12.0/go.mod h1:Qb11/HgZQ72qQbeyPfJbu3hZBH23s1sr4st8czGeDMQ=\ngo.lsp.dev/uri v0.3.0 h1:KcZJmh6nFIBeJzTugn5JTU6OOyG0lDOo3R9KwTxTYbo=\ngo.lsp.dev/uri v0.3.0/go.mod h1:P5sbO1IQR+qySTWOCnhnK7phBx+W3zbLqSMDJNTw88I=\ngo.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo=\ngo.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=\ngo.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI=\ngo.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=\ngo.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=\ngo.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=\ngo.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34=\ngolang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=\ngolang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=\ngolang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU=\ngolang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=\ngolang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=\ngolang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=\ngolang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=\ngolang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20211110154304-99a53858aa08/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=\ngolang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=\ngolang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=\ngolang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 h1:YcyjlL1PRr2Q17/I0dPk2JmYS5CDXfcdb2Z3YRioEbw=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7 h1:2035KHhUv+EpyB+hWgJnaWKJOdX1E95w2S8Rr4uWKTs=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=\ngoogle.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=\ngoogle.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=\ngoogle.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=\ngoogle.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "grpc/federation/alias.go",
    "content": "package federation\n\n// Aliases list of types or functions from third-party libraries to minimize the list of imported packages.\n\nimport (\n\t\"context\"\n\t\"os\"\n\t\"runtime/debug\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/cenkalti/backoff/v4\"\n\t\"github.com/google/cel-go/cel\"\n\t\"github.com/google/cel-go/common/types\"\n\t\"github.com/kelseyhightower/envconfig\"\n\t\"golang.org/x/sync/errgroup\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/codes\"\n\t\"google.golang.org/grpc/metadata\"\n\t\"google.golang.org/grpc/status\"\n\t\"google.golang.org/protobuf/protoadapt\"\n)\n\ntype (\n\tErrorGroup     = errgroup.Group\n\tProtoMessage   = protoadapt.MessageV1\n\tCELTypeDeclare = cel.Type\n\tCELEnv         = cel.Env\n\tCELEnvOption   = cel.EnvOption\n\tCELFieldType   = types.FieldType\n\tCode           = codes.Code\n\tRWMutex        = sync.RWMutex\n\tStatus         = status.Status\n\tDuration       = time.Duration\n\tCallOption     = grpc.CallOption\n\tGRPCMetadata   = metadata.MD\n)\n\nvar (\n\tStackTrace                       = debug.Stack\n\tLoadEnv                          = envconfig.Process\n\tGetenv                           = os.Getenv\n\tGRPCErrorf                       = status.Errorf\n\tNewGRPCStatus                    = status.New\n\tGRPCStatusFromError              = status.FromError\n\tErrorGroupWithContext            = errgroup.WithContext\n\tGRPCCallOptionContentSubtype     = grpc.CallContentSubtype\n\tGRPCCallOptionHeader             = grpc.Header\n\tGRPCCallOptionTrailer            = grpc.Trailer\n\tGRPCCallOptionMaxCallRecvMsgSize = grpc.MaxCallRecvMsgSize\n\tGRPCCallOptionMaxCallSendMsgSize = grpc.MaxCallSendMsgSize\n\tGRPCCallOptionStaticMethod       = grpc.StaticMethod\n\tGRPCCallOptionWaitForReady       = grpc.WaitForReady\n\tAppendToOutgoingContext          = metadata.AppendToOutgoingContext\n\tNewCELEnv                        = cel.NewCustomEnv\n\tNewCELVariable                   = cel.Variable\n\tCELLib                           = cel.Lib\n\tCELDoubleType                    = types.DoubleType\n\tCELIntType                       = types.IntType\n\tCELUintType                      = types.UintType\n\tCELBoolType                      = types.BoolType\n\tCELStringType                    = types.StringType\n\tCELBytesType                     = types.BytesType\n\tCELDurationType                  = types.DurationType\n\tCELObjectType                    = cel.ObjectType\n\tCELListType                      = cel.ListType\n\tCELNullType                      = cel.NullType\n\tNewCELListType                   = types.NewListType\n\tNewCELObjectType                 = types.NewObjectType\n\tNewCELMapType                    = types.NewMapType\n)\n\nconst (\n\tOKCode Code = codes.OK\n\n\t// CancelledCode this is not a typo.\n\t// On proto, it is defined as `CANCELLED`, but in Go's library it is defined as Canceled.\n\t// The name of the code is automatically generated by (*GRPCError).GoGRPCStatusCode in generator/code_generator.go.\n\t// So if the name is different, it will not work. Therefore, the names should be the same as the names on the proto side.\n\t// - Proto: https://github.com/googleapis/googleapis/blob/65277ddce9caa1cfd1a0eb7ab67980fc73d20b50/google/rpc/code.proto#L41\n\t// - Go: https://github.com/grpc/grpc-go/blob/9952aa83979822b5915c3fcb2bb0f60afe55aa7d/codes/codes.go#L45\n\t//nolint:misspell\n\tCancelledCode Code = codes.Canceled\n\n\tUnknownCode            Code = codes.Unknown\n\tInvalidArgumentCode    Code = codes.InvalidArgument\n\tDeadlineExceededCode   Code = codes.DeadlineExceeded\n\tNotFoundCode           Code = codes.NotFound\n\tAlreadyExistsCode      Code = codes.AlreadyExists\n\tPermissionDeniedCode   Code = codes.PermissionDenied\n\tResourceExhaustedCode  Code = codes.ResourceExhausted\n\tFailedPreconditionCode Code = codes.FailedPrecondition\n\tAbortedCode            Code = codes.Aborted\n\tOutOfRangeCode         Code = codes.OutOfRange\n\tUnimplementedCode      Code = codes.Unimplemented\n\tInternalCode           Code = codes.Internal\n\tUnavailableCode        Code = codes.Unavailable\n\tDataLossCode           Code = codes.DataLoss\n\tUnauthenticatedCode    Code = codes.Unauthenticated\n)\n\nfunc BackOffWithMaxRetries(b *BackOff, maxRetries uint64) *BackOff {\n\treturn &BackOff{\n\t\tBackOff: backoff.WithMaxRetries(b, maxRetries),\n\t}\n}\n\nfunc BackOffWithContext(b *BackOff, ctx context.Context) *BackOff {\n\treturn &BackOff{\n\t\tBackOff: backoff.WithContext(b, ctx),\n\t}\n}\n"
  },
  {
    "path": "grpc/federation/cast.go",
    "content": "package federation\n\nimport \"fmt\"\n\nfunc Int64ToInt32(v int64) (int32, error) {\n\tif v < -1*(1<<31) || (1<<31) <= v {\n\t\treturn 0, fmt.Errorf(\"failed to convert int64(%d) to int32: %w\", v, ErrOverflowTypeConversion)\n\t}\n\treturn int32(v), nil //nolint:gosec\n}\n\nfunc Int64ToUint32(v int64) (uint32, error) {\n\tif v < 0 || (1<<32) <= v {\n\t\treturn 0, fmt.Errorf(\"failed to convert int64(%d) to uint32: %w\", v, ErrOverflowTypeConversion)\n\t}\n\treturn uint32(v), nil //nolint:gosec\n}\n\nfunc Int64ToUint64(v int64) (uint64, error) {\n\tif v < 0 {\n\t\treturn 0, fmt.Errorf(\"failed to convert int64(%d) to uint64: %w\", v, ErrOverflowTypeConversion)\n\t}\n\treturn uint64(v), nil\n}\n\nfunc Int32ToUint32(v int32) (uint32, error) {\n\tif v < 0 {\n\t\treturn 0, fmt.Errorf(\"failed to convert int32(%d) to uint32: %w\", v, ErrOverflowTypeConversion)\n\t}\n\treturn uint32(v), nil\n}\n\nfunc Int32ToUint64(v int32) (uint64, error) {\n\tif v < 0 {\n\t\treturn 0, fmt.Errorf(\"failed to convert int32(%d) to uint64: %w\", v, ErrOverflowTypeConversion)\n\t}\n\treturn uint64(v), nil\n}\n\nfunc Uint64ToInt32(v uint64) (int32, error) {\n\tif (1 << 31) <= v {\n\t\treturn 0, fmt.Errorf(\"failed to convert uint64(%d) to int32: %w\", v, ErrOverflowTypeConversion)\n\t}\n\treturn int32(v), nil //nolint:gosec\n}\n\nfunc Uint64ToInt64(v uint64) (int64, error) {\n\tif (1 << 63) <= v {\n\t\treturn 0, fmt.Errorf(\"failed to convert uint64(%d) to int64: %w\", v, ErrOverflowTypeConversion)\n\t}\n\treturn int64(v), nil //nolint:gosec\n}\n\nfunc Uint64ToUint32(v uint64) (uint32, error) {\n\tif (1 << 32) <= v {\n\t\treturn 0, fmt.Errorf(\"failed to convert uint64(%d) to uint32: %w\", v, ErrOverflowTypeConversion)\n\t}\n\treturn uint32(v), nil //nolint:gosec\n}\n\nfunc Uint32ToInt32(v uint32) (int32, error) {\n\tif (1 << 31) <= v {\n\t\treturn 0, fmt.Errorf(\"failed to convert uint32(%d) to int32: %w\", v, ErrOverflowTypeConversion)\n\t}\n\treturn int32(v), nil //nolint:gosec\n}\n"
  },
  {
    "path": "grpc/federation/cel/any.go",
    "content": "package cel\n\nimport (\n\t\"context\"\n\t\"reflect\"\n\t\"time\"\n\n\t\"github.com/google/cel-go/cel\"\n\t\"github.com/google/cel-go/common/types\"\n\t\"github.com/google/cel-go/common/types/ref\"\n\t\"google.golang.org/protobuf/proto\"\n\t\"google.golang.org/protobuf/types/known/anypb\"\n\t\"google.golang.org/protobuf/types/known/timestamppb\"\n)\n\nconst AnyPackageName = \"any\"\n\ntype Any struct {\n\t*anypb.Any\n}\n\nfunc (any *Any) ConvertToNative(typeDesc reflect.Type) (any, error) {\n\treturn any.Any, nil\n}\n\nfunc (any *Any) ConvertToType(typeValue ref.Type) ref.Val {\n\treturn nil\n}\n\nfunc (any *Any) Equal(other ref.Val) ref.Val {\n\treturn other\n}\n\nfunc (any *Any) Type() ref.Type {\n\treturn cel.AnyType\n}\n\nfunc (any *Any) Value() any {\n\treturn any.Any\n}\n\nfunc NewAnyLibrary(typeAdapter types.Adapter) *AnyLibrary {\n\treturn &AnyLibrary{\n\t\ttypeAdapter: typeAdapter,\n\t}\n}\n\ntype AnyLibrary struct {\n\ttypeAdapter types.Adapter\n}\n\nfunc (lib *AnyLibrary) LibraryName() string {\n\treturn packageName(AnyPackageName)\n}\n\nfunc createAny(name string) string {\n\treturn createName(AnyPackageName, name)\n}\n\nfunc createAnyID(name string) string {\n\treturn createID(AnyPackageName, name)\n}\n\nfunc (lib *AnyLibrary) CompileOptions() []cel.EnvOption {\n\tvar opts []cel.EnvOption\n\tfor _, funcOpts := range [][]cel.EnvOption{\n\t\tBindFunction(\n\t\t\tcreateAny(\"new\"),\n\t\t\tOverloadFunc(createAnyID(\"new_dyn_any\"),\n\t\t\t\t[]*cel.Type{cel.DynType}, cel.AnyType,\n\t\t\t\tfunc(ctx context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\tvar msg proto.Message\n\t\t\t\t\tswitch v := args[0].Value().(type) {\n\t\t\t\t\tcase proto.Message:\n\t\t\t\t\t\tmsg = v\n\t\t\t\t\tcase time.Time:\n\t\t\t\t\t\t// google.protobuf.Timestamppb\n\t\t\t\t\t\tmsg = timestamppb.New(v)\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn types.NewErrFromString(\"specified type as an argument must be a Protocol Buffers message type\")\n\t\t\t\t\t}\n\t\t\t\t\tanymsg, err := anypb.New(msg)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn &Any{Any: anymsg}\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t} {\n\t\topts = append(opts, funcOpts...)\n\t}\n\treturn opts\n}\n\nfunc (lib *AnyLibrary) ProgramOptions() []cel.ProgramOption {\n\treturn []cel.ProgramOption{}\n}\n"
  },
  {
    "path": "grpc/federation/cel/any_test.go",
    "content": "package cel_test\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/google/cel-go/cel\"\n\t\"github.com/google/cel-go/common/types\"\n\t\"github.com/google/cel-go/common/types/ref\"\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\t\"google.golang.org/protobuf/types/known/anypb\"\n\t\"google.golang.org/protobuf/types/known/emptypb\"\n\t\"google.golang.org/protobuf/types/known/timestamppb\"\n\n\tcellib \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n)\n\nfunc TestAnyFunctions(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\texpr string\n\t\targs map[string]any\n\t\terr  bool\n\t\tcmp  func(ref.Val) error\n\t}{\n\t\t{\n\t\t\tname: \"new_with_empty\",\n\t\t\texpr: `grpc.federation.any.new(google.protobuf.Empty{})`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\texpected, err := anypb.New(&emptypb.Empty{})\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(\n\t\t\t\t\tgot.Value(),\n\t\t\t\t\texpected,\n\t\t\t\t\tcmpopts.IgnoreUnexported(anypb.Any{}, emptypb.Empty{}),\n\t\t\t\t); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"new_with_timestamp\",\n\t\t\texpr: `grpc.federation.any.new(google.protobuf.Timestamp{})`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\texpected, err := anypb.New(&timestamppb.Timestamp{})\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(\n\t\t\t\t\tgot.Value(),\n\t\t\t\t\texpected,\n\t\t\t\t\tcmpopts.IgnoreUnexported(anypb.Any{}, timestamppb.Timestamp{}),\n\t\t\t\t); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"new_with_not_proto_message\",\n\t\t\texpr: `grpc.federation.any.new(1)`,\n\t\t\terr:  true,\n\t\t},\n\t}\n\n\treg, err := types.NewRegistry()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tenv, err := cel.NewEnv(\n\t\t\t\tcel.Variable(cellib.ContextVariableName, cel.ObjectType(cellib.ContextTypeName)),\n\t\t\t\tcel.Lib(cellib.NewAnyLibrary(reg)),\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tast, iss := env.Compile(test.expr)\n\t\t\tif iss.Err() != nil {\n\t\t\t\tt.Fatal(iss.Err())\n\t\t\t}\n\t\t\tprogram, err := env.Program(ast)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\targs := map[string]any{cellib.ContextVariableName: cellib.NewContextValue(context.Background())}\n\t\t\tfor k, v := range test.args {\n\t\t\t\targs[k] = v\n\t\t\t}\n\t\t\tout, _, err := program.Eval(args)\n\t\t\tif test.err {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Fatal(\"expected error\")\n\t\t\t\t}\n\t\t\t} else if err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t} else {\n\t\t\t\tif err := test.cmp(out); err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "grpc/federation/cel/bind.go",
    "content": "package cel\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/google/cel-go/cel\"\n\t\"github.com/google/cel-go/common/ast\"\n\t\"github.com/google/cel-go/common/types\"\n\t\"github.com/google/cel-go/common/types/ref\"\n)\n\ntype BindFunctionOpt struct {\n\tcel.FunctionOpt\n}\n\ntype BindMemberFunctionOpt struct {\n\tcel.FunctionOpt\n}\n\nvar (\n\tfuncNameMap = make(map[string]struct{})\n\tfuncNameMu  sync.RWMutex\n)\n\nfunc BindFunction(name string, opts ...BindFunctionOpt) []cel.EnvOption {\n\tparts := strings.Split(name, \".\")\n\tfuncName := parts[len(parts)-1]\n\tcelOpts := make([]cel.FunctionOpt, 0, len(opts))\n\tfor _, opt := range opts {\n\t\tcelOpts = append(celOpts, opt.FunctionOpt)\n\t}\n\tfuncNameMu.Lock()\n\tdefer funcNameMu.Unlock()\n\tfuncNameMap[name] = struct{}{}\n\n\treturn []cel.EnvOption{\n\t\tcreateMacro(funcName),\n\t\tcel.Function(name, celOpts...),\n\t}\n}\n\nfunc createMacro(funcName string) cel.EnvOption {\n\treturn cel.Macros(cel.ReceiverVarArgMacro(funcName, func(mef cel.MacroExprFactory, target ast.Expr, args []ast.Expr) (ast.Expr, *cel.Error) {\n\t\tsel := toSelectorName(target)\n\t\tfqdn := funcName\n\t\tif sel != \"\" {\n\t\t\tfqdn = sel + \".\" + funcName\n\t\t}\n\t\tfqdn = strings.TrimPrefix(fqdn, \".\")\n\t\tfuncNameMu.RLock()\n\t\tdefer funcNameMu.RUnlock()\n\n\t\tvar argsWithCtx []ast.Expr\n\t\tif len(args) > 0 && args[0].AsIdent() == ContextVariableName {\n\t\t\targsWithCtx = args\n\t\t} else {\n\t\t\targsWithCtx = append([]ast.Expr{mef.NewIdent(ContextVariableName)}, args...)\n\t\t}\n\t\tif _, exists := funcNameMap[fqdn]; !exists {\n\t\t\treturn mef.NewMemberCall(funcName, target, argsWithCtx...), nil\n\t\t}\n\t\treturn mef.NewCall(fqdn, argsWithCtx...), nil\n\t}))\n}\n\nfunc BindMemberFunction(name string, opts ...BindMemberFunctionOpt) []cel.EnvOption {\n\tcelOpts := make([]cel.FunctionOpt, 0, len(opts))\n\tfor _, opt := range opts {\n\t\tcelOpts = append(celOpts, opt.FunctionOpt)\n\t}\n\treturn []cel.EnvOption{\n\t\tcreateMacro(name),\n\t\tcel.Function(name, celOpts...),\n\t}\n}\n\nfunc OverloadFunc(name string, args []*cel.Type, result *cel.Type, cb func(ctx context.Context, values ...ref.Val) ref.Val) BindFunctionOpt {\n\treturn BindFunctionOpt{\n\t\tFunctionOpt: cel.Overload(name,\n\t\t\tappend([]*cel.Type{cel.ObjectType(ContextTypeName)}, args...),\n\t\t\tresult,\n\t\t\tcel.FunctionBinding(func(values ...ref.Val) ref.Val {\n\t\t\t\tctx := values[0].(*ContextValue).Context\n\t\t\t\treturn cb(ctx, values[1:]...)\n\t\t\t}),\n\t\t),\n\t}\n}\n\nfunc MemberOverloadFunc(name string, self *cel.Type, args []*cel.Type, result *cel.Type, cb func(ctx context.Context, self ref.Val, args ...ref.Val) ref.Val) BindMemberFunctionOpt {\n\treturn BindMemberFunctionOpt{\n\t\tFunctionOpt: cel.MemberOverload(name,\n\t\t\tappend([]*cel.Type{self, cel.ObjectType(ContextTypeName)}, args...),\n\t\t\tresult,\n\t\t\tcel.FunctionBinding(func(values ...ref.Val) ref.Val {\n\t\t\t\tself := values[0]\n\t\t\t\tctx := values[1].(*ContextValue).Context\n\t\t\t\treturn cb(ctx, self, values[2:]...)\n\t\t\t}),\n\t\t),\n\t}\n}\n\nfunc BindExtFunction(extLib cel.EnvOption, name, signature string, args []*cel.Type, result *cel.Type) []cel.EnvOption {\n\tdecls := []cel.EnvOption{}\n\targNames := make([]string, 0, len(args))\n\tfor idx, typ := range args {\n\t\targName := fmt.Sprintf(\"arg%d\", idx)\n\t\tdecls = append(decls, cel.Variable(argName, typ))\n\t\targNames = append(argNames, argName)\n\t}\n\tprg, prgErr := compileExt(name, argNames, append([]cel.EnvOption{extLib}, decls...))\n\treturn BindFunction(\n\t\tname,\n\t\tBindFunctionOpt{\n\t\t\tFunctionOpt: cel.Overload(signature,\n\t\t\t\tappend([]*cel.Type{cel.ObjectType(ContextTypeName)}, args...),\n\t\t\t\tresult,\n\t\t\t\tcel.FunctionBinding(func(values ...ref.Val) ref.Val {\n\t\t\t\t\tif prgErr != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(prgErr.Error())\n\t\t\t\t\t}\n\t\t\t\t\targs := map[string]any{}\n\t\t\t\t\tfor idx, value := range values[1:] {\n\t\t\t\t\t\targs[fmt.Sprintf(\"arg%d\", idx)] = value\n\t\t\t\t\t}\n\t\t\t\t\tout, _, err := prg.Eval(args)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn out\n\t\t\t\t}),\n\t\t\t),\n\t\t},\n\t)\n}\n\nfunc BindExtMemberFunction(extLib cel.EnvOption, name, signature string, self *cel.Type, args []*cel.Type, result *cel.Type) []cel.EnvOption {\n\tdecls := []cel.EnvOption{cel.Variable(\"self\", self)}\n\targNames := make([]string, 0, len(args))\n\tfor idx, typ := range args {\n\t\targName := fmt.Sprintf(\"arg%d\", idx)\n\t\tdecls = append(decls, cel.Variable(argName, typ))\n\t\targNames = append(argNames, argName)\n\t}\n\tprg, prgErr := compileMemberExt(name, argNames, append([]cel.EnvOption{extLib}, decls...))\n\treturn BindMemberFunction(\n\t\tname,\n\t\tBindMemberFunctionOpt{\n\t\t\tFunctionOpt: cel.MemberOverload(signature,\n\t\t\t\tappend([]*cel.Type{self, cel.ObjectType(ContextTypeName)}, args...),\n\t\t\t\tresult,\n\t\t\t\tcel.FunctionBinding(func(values ...ref.Val) ref.Val {\n\t\t\t\t\tif prgErr != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(prgErr.Error())\n\t\t\t\t\t}\n\t\t\t\t\tself := values[0]\n\t\t\t\t\targs := map[string]any{\"self\": self}\n\t\t\t\t\tfor idx, value := range values[2:] {\n\t\t\t\t\t\targs[fmt.Sprintf(\"arg%d\", idx)] = value\n\t\t\t\t\t}\n\t\t\t\t\tout, _, err := prg.Eval(args)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn out\n\t\t\t\t}),\n\t\t\t),\n\t\t},\n\t)\n}\n\nfunc compileExt(name string, argNames []string, opts []cel.EnvOption) (cel.Program, error) {\n\tenv, err := cel.NewEnv(opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tast, iss := env.Compile(fmt.Sprintf(\"%s(%s)\", name, strings.Join(argNames, \",\")))\n\tif iss.Err() != nil {\n\t\treturn nil, iss.Err()\n\t}\n\tprg, err := env.Program(ast)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn prg, nil\n}\n\nfunc compileMemberExt(name string, argNames []string, opts []cel.EnvOption) (cel.Program, error) {\n\tenv, err := cel.NewEnv(opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tast, iss := env.Compile(fmt.Sprintf(\"self.%s(%s)\", name, strings.Join(argNames, \",\")))\n\tif iss.Err() != nil {\n\t\treturn nil, iss.Err()\n\t}\n\tprg, err := env.Program(ast)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn prg, nil\n}\n"
  },
  {
    "path": "grpc/federation/cel/bind_test.go",
    "content": "package cel\n\nimport (\n\t\"context\"\n\t\"testing\"\n\n\t\"github.com/google/cel-go/cel\"\n\t\"github.com/google/cel-go/common/types\"\n\t\"github.com/google/cel-go/common/types/ref\"\n)\n\ntype testBindLib struct{}\n\nfunc (lib *testBindLib) LibraryName() string {\n\treturn \"grpc.federation.test\"\n}\n\nfunc (lib *testBindLib) CompileOptions() []cel.EnvOption {\n\tvar opts []cel.EnvOption\n\tfor _, funcOpts := range [][]cel.EnvOption{\n\t\tBindFunction(\n\t\t\t\"grpc.federation.test.foo\",\n\t\t\tOverloadFunc(\"grpc_federation_test_foo_string_string\",\n\t\t\t\t[]*cel.Type{cel.StringType}, cel.StringType,\n\t\t\t\tfunc(ctx context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(\"grpc_federation_test_foo_string_string\")\n\t\t\t\t},\n\t\t\t),\n\t\t\tOverloadFunc(\"grpc_federation_test_foo_int_string\",\n\t\t\t\t[]*cel.Type{cel.IntType}, cel.StringType,\n\t\t\t\tfunc(ctx context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(\"grpc_federation_test_foo_int_string\")\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\t\"grpc.federation.test2.foo\",\n\t\t\tOverloadFunc(\"grpc_federation_test2_foo_string_string\",\n\t\t\t\t[]*cel.Type{cel.StringType}, cel.StringType,\n\t\t\t\tfunc(ctx context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(\"grpc_federation_test2_foo_string_string\")\n\t\t\t\t},\n\t\t\t),\n\t\t\tOverloadFunc(\"grpc_federation_test2_foo_int_string\",\n\t\t\t\t[]*cel.Type{cel.IntType}, cel.BoolType,\n\t\t\t\tfunc(ctx context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(\"grpc_federation_test2_foo_int_string\")\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"foo\",\n\t\t\tMemberOverloadFunc(\"foo_string_int_string\",\n\t\t\t\tcel.StringType, []*cel.Type{cel.IntType}, cel.StringType,\n\t\t\t\tfunc(ctx context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(\"foo_string_int_string\")\n\t\t\t\t},\n\t\t\t),\n\t\t\tMemberOverloadFunc(\"foo_int_string_string\",\n\t\t\t\tcel.IntType, []*cel.Type{cel.StringType}, cel.StringType,\n\t\t\t\tfunc(ctx context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(\"foo_int_string_string\")\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t} {\n\t\topts = append(opts, funcOpts...)\n\t}\n\treturn opts\n}\n\nfunc (lib *testBindLib) ProgramOptions() []cel.ProgramOption {\n\treturn nil\n}\n\nfunc TestBind(t *testing.T) {\n\ttests := []struct {\n\t\tname     string\n\t\texpr     string\n\t\targs     map[string]any\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tname:     \"grpc.federation.test.foo('s')\",\n\t\t\texpr:     \"grpc.federation.test.foo('s')\",\n\t\t\texpected: \"grpc_federation_test_foo_string_string\",\n\t\t},\n\t\t{\n\t\t\tname:     \"grpc.federation.test.foo(1)\",\n\t\t\texpr:     \"grpc.federation.test.foo(1)\",\n\t\t\texpected: \"grpc_federation_test_foo_int_string\",\n\t\t},\n\t\t{\n\t\t\tname:     \"grpc.federation.test2.foo('s')\",\n\t\t\texpr:     \"grpc.federation.test2.foo('s')\",\n\t\t\texpected: \"grpc_federation_test2_foo_string_string\",\n\t\t},\n\t\t{\n\t\t\tname:     \"grpc.federation.test2.foo(1)\",\n\t\t\texpr:     \"grpc.federation.test2.foo(1)\",\n\t\t\texpected: \"grpc_federation_test2_foo_int_string\",\n\t\t},\n\t\t{\n\t\t\tname:     \"10.foo('s')\",\n\t\t\texpr:     \"10.foo('s')\",\n\t\t\texpected: \"foo_int_string_string\",\n\t\t},\n\t\t{\n\t\t\tname:     \"'s'.foo(1)\",\n\t\t\texpr:     \"'s'.foo(1)\",\n\t\t\texpected: \"foo_string_int_string\",\n\t\t},\n\t}\n\tctx := context.Background()\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tenv, err := cel.NewEnv(\n\t\t\t\tcel.Variable(ContextVariableName, cel.ObjectType(ContextTypeName)),\n\t\t\t\tcel.Lib(new(testBindLib)),\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tast, iss := env.Compile(test.expr)\n\t\t\tif iss.Err() != nil {\n\t\t\t\tt.Fatal(iss.Err())\n\t\t\t}\n\t\t\tprogram, err := env.Program(ast)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\targs := map[string]any{ContextVariableName: NewContextValue(ctx)}\n\t\t\tfor k, v := range test.args {\n\t\t\t\targs[k] = v\n\t\t\t}\n\t\t\tout, _, err := program.Eval(args)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\ts, ok := out.(types.String)\n\t\t\tif !ok {\n\t\t\t\tt.Fatalf(\"failed to get result: %v\", out)\n\t\t\t}\n\t\t\tif string(s) != test.expected {\n\t\t\t\tt.Fatalf(\"failed to call function: expected %s but call %s\", test.expected, string(s))\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "grpc/federation/cel/cast.go",
    "content": "package cel\n\nimport (\n\t\"reflect\"\n\n\t\"github.com/google/cel-go/cel\"\n\t\"github.com/google/cel-go/common/types\"\n\t\"github.com/google/cel-go/common/types/ref\"\n)\n\nconst CastPackageName = \"cast\"\n\nconst (\n\tCastNullValueFunc = \"grpc.federation.cast.null_value\"\n)\n\ntype CastLibrary struct{}\n\nfunc (lib *CastLibrary) LibraryName() string {\n\treturn CastPackageName\n}\n\nfunc (lib *CastLibrary) CompileOptions() []cel.EnvOption {\n\topts := []cel.EnvOption{\n\t\tcel.OptionalTypes(),\n\t\tcel.Function(CastNullValueFunc,\n\t\t\tcel.Overload(\"grpc_federation_cast_null_value\",\n\t\t\t\t[]*cel.Type{cel.DynType}, cel.DynType,\n\t\t\t\tcel.UnaryBinding(lib.nullValue),\n\t\t\t),\n\t\t),\n\t}\n\treturn opts\n}\n\nfunc (lib *CastLibrary) ProgramOptions() []cel.ProgramOption {\n\treturn []cel.ProgramOption{}\n}\n\nfunc (lib *CastLibrary) nullValue(val ref.Val) ref.Val {\n\trv := reflect.ValueOf(val.Value())\n\tif val.Value() == nil || val.Equal(types.NullValue) == types.True || rv.Kind() == reflect.Ptr && rv.IsNil() {\n\t\treturn types.NullValue\n\t}\n\treturn val\n}\n"
  },
  {
    "path": "grpc/federation/cel/cast_test.go",
    "content": "package cel_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/google/cel-go/cel\"\n\t\"github.com/google/cel-go/common/types\"\n\t\"github.com/google/cel-go/common/types/ref\"\n\n\tcellib \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"github.com/mercari/grpc-federation/grpc/federation/cel/testdata/testpb\"\n)\n\nfunc TestCast(t *testing.T) {\n\ttests := []struct {\n\t\tname     string\n\t\texpr     string\n\t\tmsg      any\n\t\texpected ref.Val\n\t}{\n\t\t{\n\t\t\tname:     \"cast nil\",\n\t\t\texpr:     \"grpc.federation.cast.null_value(msg) == null\",\n\t\t\tmsg:      nil,\n\t\t\texpected: types.True,\n\t\t},\n\t\t{\n\t\t\tname:     \"cast typed-nil\",\n\t\t\texpr:     \"grpc.federation.cast.null_value(msg) == null\",\n\t\t\tmsg:      (*testpb.Message)(nil),\n\t\t\texpected: types.True,\n\t\t},\n\t\t{\n\t\t\tname:     \"cast struct pointer\",\n\t\t\texpr:     \"grpc.federation.cast.null_value(msg) == null\",\n\t\t\tmsg:      &testpb.Message{},\n\t\t\texpected: types.False,\n\t\t},\n\t\t{\n\t\t\tname:     \"cast lit\",\n\t\t\texpr:     \"grpc.federation.cast.null_value(msg) == null\",\n\t\t\tmsg:      100,\n\t\t\texpected: types.False,\n\t\t},\n\t}\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tenv, err := cel.NewEnv(\n\t\t\t\tcel.Types(&testpb.Message{}),\n\t\t\t\tcel.Lib(new(cellib.CastLibrary)),\n\t\t\t\tcel.Variable(\"msg\", cel.DynType),\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tast, iss := env.Compile(test.expr)\n\t\t\tif iss.Err() != nil {\n\t\t\t\tt.Fatal(iss.Err())\n\t\t\t}\n\t\t\tprogram, err := env.Program(ast)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tout, _, err := program.Eval(map[string]any{\n\t\t\t\t\"msg\": test.msg,\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tif out.Equal(test.expected) == types.False {\n\t\t\t\tt.Fatalf(\"unexpected value: want %v but got %v\", test.expected, out)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "grpc/federation/cel/context.go",
    "content": "package cel\n\nimport (\n\t\"context\"\n\t\"reflect\"\n\n\t\"github.com/google/cel-go/cel\"\n\t\"github.com/google/cel-go/common/types/ref\"\n)\n\nconst (\n\tContextVariableName = \"__CTX__\"\n\tContextTypeName     = \"grpc.federation.private.Context\"\n)\n\ntype ContextValue struct {\n\tcontext.Context\n}\n\nfunc NewContextValue(c context.Context) *ContextValue {\n\treturn &ContextValue{Context: c}\n}\n\nfunc (c *ContextValue) ConvertToNative(typeDesc reflect.Type) (any, error) {\n\treturn c.Context, nil\n}\n\nfunc (c *ContextValue) ConvertToType(typeValue ref.Type) ref.Val {\n\treturn nil\n}\n\nfunc (c *ContextValue) Equal(other ref.Val) ref.Val {\n\treturn other\n}\n\nfunc (c *ContextValue) Type() ref.Type {\n\treturn cel.ObjectType(ContextTypeName)\n}\n\nfunc (c *ContextValue) Value() any {\n\treturn c.Context\n}\n"
  },
  {
    "path": "grpc/federation/cel/conv.go",
    "content": "package cel\n\nimport \"github.com/google/cel-go/common/ast\"\n\nfunc ToIdentifiers(expr ast.Expr) []string {\n\tvar idents []string\n\tswitch expr.Kind() {\n\tcase ast.CallKind:\n\t\tcall := expr.AsCall()\n\t\tidents = append(idents, ToIdentifiers(call.Target())...)\n\t\tfor _, arg := range call.Args() {\n\t\t\tidents = append(idents, ToIdentifiers(arg)...)\n\t\t}\n\tcase ast.IdentKind:\n\t\tidents = append(idents, expr.AsIdent())\n\tcase ast.ListKind:\n\t\tl := expr.AsList()\n\t\tfor _, e := range l.Elements() {\n\t\t\tidents = append(idents, ToIdentifiers(e)...)\n\t\t}\n\tcase ast.MapKind:\n\t\tm := expr.AsMap()\n\t\tfor _, entry := range m.Entries() {\n\t\t\tidents = append(idents, toEntryNames(entry)...)\n\t\t}\n\tcase ast.SelectKind:\n\t\tidents = append(idents, toSelectorName(expr))\n\tcase ast.StructKind:\n\t\tidents = append(idents, expr.AsStruct().TypeName())\n\t\tfor _, field := range expr.AsStruct().Fields() {\n\t\t\tidents = append(idents, toEntryNames(field)...)\n\t\t}\n\t}\n\treturn idents\n}\n\nfunc toEntryNames(entry ast.EntryExpr) []string {\n\tvar ident []string\n\tswitch entry.Kind() {\n\tcase ast.MapEntryKind:\n\t\tident = append(ident, ToIdentifiers(entry.AsMapEntry().Key())...)\n\t\tident = append(ident, ToIdentifiers(entry.AsMapEntry().Value())...)\n\tcase ast.StructFieldKind:\n\t\tident = append(ident, ToIdentifiers(entry.AsStructField().Value())...)\n\t}\n\treturn ident\n}\n\nfunc toSelectorName(v ast.Expr) string {\n\tswitch v.Kind() {\n\tcase ast.SelectKind:\n\t\tsel := v.AsSelect()\n\t\tparent := toSelectorName(sel.Operand())\n\t\tif parent != \"\" {\n\t\t\treturn parent + \".\" + sel.FieldName()\n\t\t}\n\t\treturn sel.FieldName()\n\tcase ast.IdentKind:\n\t\treturn v.AsIdent()\n\tdefault:\n\t\treturn \"\"\n\t}\n}\n"
  },
  {
    "path": "grpc/federation/cel/enum.go",
    "content": "package cel\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"reflect\"\n\n\t\"github.com/google/cel-go/cel\"\n\t\"github.com/google/cel-go/common/ast\"\n\tceltypes \"github.com/google/cel-go/common/types\"\n\t\"github.com/google/cel-go/common/types/ref\"\n)\n\nconst (\n\tEnumPackageName  = \"enum\"\n\tEnumSelectorFQDN = \"grpc.federation.private.EnumSelector\"\n)\n\ntype EnumLibrary struct {\n}\n\nfunc (lib *EnumLibrary) LibraryName() string {\n\treturn packageName(EnumPackageName)\n}\n\nfunc (lib *EnumLibrary) CompileOptions() []cel.EnvOption {\n\ttypeT := celtypes.NewTypeParamType(\"T\")\n\ttypeU := celtypes.NewTypeParamType(\"U\")\n\tenumSelector := celtypes.NewOpaqueType(EnumSelectorFQDN, typeT, typeU)\n\tvar opts []cel.EnvOption\n\tfor _, funcOpts := range [][]cel.EnvOption{\n\t\tBindFunction(\"grpc.federation.enum.select\",\n\t\t\tOverloadFunc(\"grpc_federation_enum_select\",\n\t\t\t\t[]*cel.Type{cel.BoolType, typeT, typeU}, enumSelector,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\tret := &EnumSelector{\n\t\t\t\t\t\tCond: bool(args[0].(celtypes.Bool)),\n\t\t\t\t\t}\n\t\t\t\t\tif sel, ok := args[1].(*EnumSelector); ok {\n\t\t\t\t\t\tret.True = &EnumSelector_TrueSelector{\n\t\t\t\t\t\t\tTrueSelector: sel,\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tret.True = &EnumSelector_TrueValue{\n\t\t\t\t\t\t\tTrueValue: int32(args[1].(celtypes.Int)), //nolint:gosec\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif sel, ok := args[2].(*EnumSelector); ok {\n\t\t\t\t\t\tret.False = &EnumSelector_FalseSelector{\n\t\t\t\t\t\t\tFalseSelector: sel,\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tret.False = &EnumSelector_FalseValue{\n\t\t\t\t\t\t\tFalseValue: int32(args[2].(celtypes.Int)), //nolint:gosec\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn ret\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t} {\n\t\topts = append(opts, funcOpts...)\n\t}\n\treturn opts\n}\n\nfunc (lib *EnumLibrary) ProgramOptions() []cel.ProgramOption {\n\treturn []cel.ProgramOption{}\n}\n\nfunc (s *EnumSelector) ConvertToNative(typeDesc reflect.Type) (any, error) {\n\treturn s, nil\n}\n\nfunc (s *EnumSelector) ConvertToType(typeValue ref.Type) ref.Val {\n\treturn celtypes.NewErr(\"%s: type conversion does not support\", EnumSelectorFQDN)\n}\n\nfunc (s *EnumSelector) Equal(other ref.Val) ref.Val {\n\tif _, ok := other.(*EnumSelector); ok {\n\t\treturn celtypes.True\n\t}\n\treturn celtypes.False\n}\n\nfunc (s *EnumSelector) Type() ref.Type {\n\treturn celtypes.NewObjectType(EnumSelectorFQDN)\n}\n\nfunc (s *EnumSelector) Value() any {\n\treturn s\n}\n\ntype enumValidator struct{}\n\nfunc NewEnumValidator() cel.ASTValidator {\n\treturn &enumValidator{}\n}\n\nfunc (v *enumValidator) Name() string {\n\treturn \"grpc.federation.enum.validator\"\n}\n\nfunc (v *enumValidator) Validate(_ *cel.Env, _ cel.ValidatorConfig, a *ast.AST, iss *cel.Issues) {\n\troot := ast.NavigateAST(a)\n\n\t// Checks at compile time if the value types are int or opaque<int> or EnumSelector.\n\tdupErrs := map[string]struct{}{}\n\tfuncName := \"grpc.federation.enum.select\"\n\tfuncCalls := ast.MatchDescendants(root, ast.FunctionMatcher(funcName))\n\n\tcandidateTypes := []*celtypes.Type{\n\t\tceltypes.NewOpaqueType(EnumSelectorFQDN),\n\t\tceltypes.NewOpaqueType(\"enum\", celtypes.IntType),\n\t}\n\n\tfor _, call := range funcCalls {\n\t\t// first argument ( index zero ) is context.Context type.\n\t\t// second argument ( index one ) is bool type.\n\t\texpr1 := v.getArgExpr(call, 2)\n\t\texpr2 := v.getArgExpr(call, 3)\n\t\tif expr1 == nil || expr2 == nil {\n\t\t\tcontinue\n\t\t}\n\t\ttype1 := expr1.Type()\n\t\ttype2 := expr2.Type()\n\n\t\t// If an error occurs when calling sort macros in a chain, the same error is reported multiple times.\n\t\t// To avoid this, check if the error already report and ignore it.\n\t\tdupKey1 := v.getKey(funcName, expr1, a)\n\t\tdupKey2 := v.getKey(funcName, expr2, a)\n\t\tif err := v.validateType(type1, candidateTypes...); err != nil {\n\t\t\tiss.ReportErrorAtID(expr1.ID(), \"%s\", err.Error())\n\t\t\tdupErrs[dupKey1] = struct{}{}\n\t\t\tcontinue\n\t\t}\n\t\tif err := v.validateType(type2, candidateTypes...); err != nil {\n\t\t\tiss.ReportErrorAtID(expr2.ID(), \"%s\", err.Error())\n\t\t\tdupErrs[dupKey2] = struct{}{}\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\nfunc (v *enumValidator) getArgExpr(expr ast.Expr, argNum int) ast.NavigableExpr {\n\targs := expr.AsCall().Args()\n\tif len(args) <= argNum {\n\t\treturn nil\n\t}\n\targ := args[argNum]\n\tnav, ok := arg.(ast.NavigableExpr)\n\tif !ok {\n\t\treturn nil\n\t}\n\treturn nav\n}\n\nfunc (v *enumValidator) getKey(funcName string, expr ast.NavigableExpr, a *ast.AST) string {\n\tloc := a.SourceInfo().GetStartLocation(expr.ID())\n\treturn fmt.Sprintf(\"%s:%d:%d:%s\", funcName, loc.Column(), loc.Line(), expr.Type())\n}\n\nfunc (v *enumValidator) validateType(got *celtypes.Type, candidates ...*celtypes.Type) error {\n\tfor _, candidate := range candidates {\n\t\tif got.Kind() != candidate.Kind() {\n\t\t\tcontinue\n\t\t}\n\t\tswitch candidate.Kind() {\n\t\tcase celtypes.StructKind:\n\t\t\tif got.TypeName() == candidate.TypeName() {\n\t\t\t\treturn nil\n\t\t\t}\n\t\tcase celtypes.OpaqueKind:\n\t\t\tif got.TypeName() == candidate.TypeName() {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tgotParams := got.Parameters()\n\t\t\tcandidateParams := candidate.Parameters()\n\t\t\tif len(gotParams) != len(candidateParams) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tfor i := 0; i < len(gotParams); i++ {\n\t\t\t\tif err := v.validateType(gotParams[i], candidateParams[i]); err == nil {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\treturn nil\n\t\t}\n\t}\n\tif got.TypeName() == \"int\" {\n\t\treturn fmt.Errorf(\n\t\t\t`cannot specify an int type. if you are directly specifying an enum value, you need to explicitly use \"pkg.EnumName.value('ENUM_VALUE')\" function to use the enum type`,\n\t\t)\n\t}\n\treturn fmt.Errorf(\"%s type is unexpected\", got.TypeName())\n}\n"
  },
  {
    "path": "grpc/federation/cel/lib.go",
    "content": "package cel\n\nimport (\n\t\"strings\"\n\n\t\"github.com/google/cel-go/cel\"\n\t\"github.com/google/cel-go/common/types\"\n)\n\ntype Library struct {\n\tname    string\n\tsubLibs []cel.SingletonLibrary\n}\n\nfunc NewLibrary(typeAdapter types.Adapter) *Library {\n\tmdLib := NewMetadataLibrary()\n\tlogLib := NewLogLibrary()\n\treturn &Library{\n\t\tname: \"grpc.federation.static\",\n\t\tsubLibs: []cel.SingletonLibrary{\n\t\t\tNewURLLibrary(typeAdapter),\n\t\t\tNewStringsLibrary(),\n\t\t\tNewMathLibrary(),\n\t\t\tNewTimeLibrary(typeAdapter),\n\t\t\tNewListLibrary(typeAdapter),\n\t\t\tNewAnyLibrary(typeAdapter),\n\t\t\tnew(RandLibrary),\n\t\t\tnew(UUIDLibrary),\n\t\t\tnew(EnumLibrary),\n\t\t\tmdLib,\n\t\t\tlogLib,\n\t\t\tnew(CastLibrary),\n\t\t\tnew(RegexpLibrary),\n\t\t},\n\t}\n}\n\nfunc NewASTValidators() []cel.ASTValidator {\n\treturn []cel.ASTValidator{\n\t\tNewListValidator(),\n\t\tNewEnumValidator(),\n\t}\n}\n\nfunc IsStandardLibraryType(typeName string) bool {\n\treturn strings.HasPrefix(strings.TrimPrefix(typeName, \".\"), \"grpc.federation.\")\n}\n\nfunc (lib *Library) LibraryName() string {\n\treturn lib.name\n}\n\nfunc (lib *Library) CompileOptions() []cel.EnvOption {\n\tvar opts []cel.EnvOption\n\tfor _, sub := range lib.subLibs {\n\t\topts = append(opts, sub.CompileOptions()...)\n\t}\n\treturn opts\n}\n\nfunc (lib *Library) ProgramOptions() []cel.ProgramOption {\n\tvar opts []cel.ProgramOption\n\tfor _, sub := range lib.subLibs {\n\t\topts = append(opts, sub.ProgramOptions()...)\n\t}\n\treturn opts\n}\n\nfunc packageName(subpkg string) string {\n\treturn \"grpc.federation.\" + subpkg\n}\n\nfunc packageNameID(subpkg string) string {\n\treturn \"grpc_federation_\" + subpkg\n}\n\nfunc createName(subpkg, name string) string {\n\treturn packageName(subpkg) + \".\" + name\n}\n\nfunc createID(subpkg, name string) string {\n\treturn packageNameID(subpkg) + \"_\" + name\n}\n"
  },
  {
    "path": "grpc/federation/cel/list.go",
    "content": "package cel\n\nimport (\n\t\"fmt\"\n\t\"sort\"\n\t\"sync\"\n\n\t\"github.com/google/cel-go/cel\"\n\t\"github.com/google/cel-go/common/ast\"\n\t\"github.com/google/cel-go/common/operators\"\n\t\"github.com/google/cel-go/common/types\"\n\t\"github.com/google/cel-go/common/types/ref\"\n\t\"github.com/google/cel-go/common/types/traits\"\n\t\"github.com/google/cel-go/parser\"\n)\n\nconst ListPackageName = \"list\"\n\nconst (\n\tlistSortAscFunc        = \"grpc.federation.list.@sortAsc\"\n\tlistSortDescFunc       = \"grpc.federation.list.@sortDesc\"\n\tlistSortStableAscFunc  = \"grpc.federation.list.@sortStableAsc\"\n\tlistSortStableDescFunc = \"grpc.federation.list.@sortStableDesc\"\n)\n\ntype ListLibrary struct {\n\ttypeAdapter types.Adapter\n\n\tmu             sync.Mutex\n\ttempVarCounter int\n}\n\nfunc NewListLibrary(typeAdapter types.Adapter) cel.SingletonLibrary {\n\treturn &ListLibrary{\n\t\ttypeAdapter: typeAdapter,\n\t}\n}\n\nfunc (lib *ListLibrary) LibraryName() string {\n\treturn packageName(ListPackageName)\n}\n\nfunc (lib *ListLibrary) CompileOptions() []cel.EnvOption {\n\tlistTypeO := cel.ListType(cel.TypeParamType(\"O\"))\n\tlistTypeE := cel.ListType(cel.TypeParamType(\"E\"))\n\topts := []cel.EnvOption{\n\t\t// add gRPC Federation standard apis.\n\t\tcel.OptionalTypes(),\n\t\tcel.Macros(\n\t\t\t// range.reduce(accumulator, current, <expr>, <init>)\n\t\t\tcel.ReceiverMacro(\"reduce\", 4, lib.makeReduce),\n\n\t\t\t// range.first(var, <expr>)\n\t\t\t// first macro is the shorthand version of the following expression\n\t\t\t// <range>.filter(iter, expr)[?0]\n\t\t\tcel.ReceiverMacro(\"first\", 2, lib.makeFirst),\n\n\t\t\t// <range>.sortAsc(var, <expr>)\n\t\t\tcel.ReceiverMacro(\"sortAsc\", 2, lib.makeSortAsc),\n\n\t\t\t// <range>.sortDesc(var, <expr>)\n\t\t\tcel.ReceiverMacro(\"sortDesc\", 2, lib.makeSortDesc),\n\n\t\t\t// <range>.sortStableAsc(var, <expr>)\n\t\t\tcel.ReceiverMacro(\"sortStableAsc\", 2, lib.makeSortStableAsc),\n\n\t\t\t// <range>.sortStableDesc(var, <expr>)\n\t\t\tcel.ReceiverMacro(\"sortStableDesc\", 2, lib.makeSortStableDesc),\n\t\t),\n\t\tcel.Function(listSortAscFunc,\n\t\t\tcel.Overload(\"grpc_federation_list_@sort_asc\",\n\t\t\t\t[]*cel.Type{listTypeO, listTypeE}, listTypeO,\n\t\t\t\tcel.BinaryBinding(lib.sortAsc),\n\t\t\t),\n\t\t),\n\t\tcel.Function(listSortDescFunc,\n\t\t\tcel.Overload(\"grpc_federation_list_@sort_desc\",\n\t\t\t\t[]*cel.Type{listTypeO, listTypeE}, listTypeO,\n\t\t\t\tcel.BinaryBinding(lib.sortDesc),\n\t\t\t),\n\t\t),\n\t\tcel.Function(listSortStableAscFunc,\n\t\t\tcel.Overload(\"grpc_federation_list_@sort_stable_asc\",\n\t\t\t\t[]*cel.Type{listTypeO, listTypeE}, listTypeO,\n\t\t\t\tcel.BinaryBinding(lib.sortStableAsc),\n\t\t\t),\n\t\t),\n\t\tcel.Function(listSortStableDescFunc,\n\t\t\tcel.Overload(\"grpc_federation_list_@sort_stable_desc\",\n\t\t\t\t[]*cel.Type{listTypeO, listTypeE}, listTypeO,\n\t\t\t\tcel.BinaryBinding(lib.sortStableDesc),\n\t\t\t),\n\t\t),\n\t\tcel.Function(\"flatten\",\n\t\t\tcel.MemberOverload(\"list_flatten\",\n\t\t\t\t[]*cel.Type{cel.ListType(listTypeO)}, listTypeO,\n\t\t\t\tcel.UnaryBinding(func(arg ref.Val) ref.Val {\n\t\t\t\t\tlist, ok := arg.(traits.Lister)\n\t\t\t\t\tif !ok {\n\t\t\t\t\t\treturn types.ValOrErr(arg, \"no such overload: %v.flatten()\", arg.Type())\n\t\t\t\t\t}\n\t\t\t\t\tflatList, err := flatten(list, 1)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.WrapErr(err)\n\t\t\t\t\t}\n\t\t\t\t\treturn lib.typeAdapter.NativeToValue(flatList)\n\t\t\t\t}),\n\t\t\t),\n\t\t),\n\t}\n\treturn opts\n}\n\nfunc flatten(list traits.Lister, depth int64) ([]ref.Val, error) {\n\tif depth < 0 {\n\t\treturn nil, fmt.Errorf(\"level must be non-negative\")\n\t}\n\n\tvar newList []ref.Val\n\titer := list.Iterator()\n\n\tfor iter.HasNext() == types.True {\n\t\tval := iter.Next()\n\t\tnestedList, isList := val.(traits.Lister)\n\n\t\tif !isList || depth == 0 {\n\t\t\tnewList = append(newList, val)\n\t\t\tcontinue\n\t\t} else {\n\t\t\tflattenedList, err := flatten(nestedList, depth-1)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\n\t\t\tnewList = append(newList, flattenedList...)\n\t\t}\n\t}\n\n\treturn newList, nil\n}\n\nfunc (lib *ListLibrary) ProgramOptions() []cel.ProgramOption {\n\treturn []cel.ProgramOption{}\n}\n\nfunc (lib *ListLibrary) makeReduce(mef cel.MacroExprFactory, target ast.Expr, args []ast.Expr) (ast.Expr, *cel.Error) {\n\taccum, found := extractIdent(args[0])\n\tif !found {\n\t\treturn nil, mef.NewError(args[0].ID(), \"argument is not an identifier\")\n\t}\n\tcur, found := extractIdent(args[1])\n\tif !found {\n\t\treturn nil, mef.NewError(args[1].ID(), \"argument is not an identifier\")\n\t}\n\treduce := args[2]\n\tinit := args[3]\n\tcondition := mef.NewLiteral(types.True)\n\taccuExpr := mef.NewIdent(accum)\n\treturn mef.NewComprehension(target, cur, accum, init, condition, reduce, accuExpr), nil\n}\n\nfunc (lib *ListLibrary) makeFirst(mef cel.MacroExprFactory, target ast.Expr, args []ast.Expr) (ast.Expr, *cel.Error) {\n\tfilter, err := parser.MakeFilter(mef, target, args)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn mef.NewCall(operators.OptIndex, filter, mef.NewLiteral(types.Int(0))), nil\n}\n\nfunc (lib *ListLibrary) makeSortAsc(mef cel.MacroExprFactory, target ast.Expr, args []ast.Expr) (ast.Expr, *cel.Error) {\n\treturn lib.makeSort(listSortAscFunc, mef, target, args)\n}\n\nfunc (lib *ListLibrary) makeSortDesc(mef cel.MacroExprFactory, target ast.Expr, args []ast.Expr) (ast.Expr, *cel.Error) {\n\treturn lib.makeSort(listSortDescFunc, mef, target, args)\n}\n\nfunc (lib *ListLibrary) makeSortStableAsc(mef cel.MacroExprFactory, target ast.Expr, args []ast.Expr) (ast.Expr, *cel.Error) {\n\treturn lib.makeSort(listSortStableAscFunc, mef, target, args)\n}\n\nfunc (lib *ListLibrary) makeSortStableDesc(mef cel.MacroExprFactory, target ast.Expr, args []ast.Expr) (ast.Expr, *cel.Error) {\n\treturn lib.makeSort(listSortStableDescFunc, mef, target, args)\n}\n\nfunc (lib *ListLibrary) makeSort(function string, mef cel.MacroExprFactory, target ast.Expr, args []ast.Expr) (ast.Expr, *cel.Error) {\n\t// Create a temporary variable to bind the target expression\n\tlib.mu.Lock()\n\tvarIdent := mef.NewIdent(fmt.Sprintf(\"temp_var_%d\", lib.tempVarCounter))\n\tlib.tempVarCounter++\n\tlib.mu.Unlock()\n\n\tmp, err := parser.MakeMap(mef, varIdent, args)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// To avoid multiple evaluations of the target expression, its result is bound to a temporary variable.\n\t// This approach prevents issues that can arise when the same expression is evaluated more than once,\n\t// particularly in cases involving non-deterministic operations, such as retrieving unordered values (e.g., map keys),\n\t// which may lead to inconsistent behavior like incorrect ordering.\n\treturn mef.NewComprehension(\n\t\tmef.NewList(),\n\t\t\"#unused\",\n\t\tvarIdent.AsIdent(),\n\t\ttarget,\n\t\tmef.NewLiteral(types.False),\n\t\tmef.NewIdent(varIdent.AsIdent()),\n\t\tmef.NewCall(function, varIdent, mp),\n\t), nil\n}\n\nfunc (lib *ListLibrary) sortAsc(orig, expanded ref.Val) ref.Val {\n\treturn lib.sortRefVal(orig, expanded, -types.IntOne, false)\n}\n\nfunc (lib *ListLibrary) sortDesc(orig, expanded ref.Val) ref.Val {\n\treturn lib.sortRefVal(orig, expanded, types.IntOne, false)\n}\n\nfunc (lib *ListLibrary) sortStableAsc(orig, expanded ref.Val) ref.Val {\n\treturn lib.sortRefVal(orig, expanded, -types.IntOne, true)\n}\n\nfunc (lib *ListLibrary) sortStableDesc(orig, expanded ref.Val) ref.Val {\n\treturn lib.sortRefVal(orig, expanded, types.IntOne, true)\n}\n\nfunc (lib *ListLibrary) sortRefVal(orig, expanded ref.Val, direction types.Int, stable bool) ref.Val {\n\torigLister := orig.(traits.Lister)\n\texpandedLister := expanded.(traits.Lister)\n\n\t// The element being sorted must be values before expansion.\n\ttype sortVal struct {\n\t\tOrigVal     ref.Val\n\t\tExpandedVal ref.Val\n\t}\n\tvals := make([]*sortVal, 0, int64(origLister.Size().(types.Int)))\n\tfor i := types.IntZero; i < origLister.Size().(types.Int); i++ {\n\t\torigVal := origLister.Get(i)\n\t\texpVal := expandedLister.Get(i)\n\t\tvals = append(vals, &sortVal{\n\t\t\tOrigVal:     origVal,\n\t\t\tExpandedVal: expVal,\n\t\t})\n\t}\n\n\tfn := sort.Slice\n\tif stable {\n\t\tfn = sort.SliceStable\n\t}\n\tfn(vals, func(i, j int) bool {\n\t\tcmp := vals[i].ExpandedVal.(traits.Comparer)\n\t\tout := cmp.Compare(vals[j].ExpandedVal)\n\t\treturn out == direction\n\t})\n\n\tresVals := make([]ref.Val, 0, len(vals))\n\tfor _, v := range vals {\n\t\tresVals = append(resVals, v.OrigVal)\n\t}\n\treturn lib.typeAdapter.NativeToValue(resVals)\n}\n\nfunc extractIdent(e ast.Expr) (string, bool) {\n\tswitch e.Kind() {\n\tcase ast.IdentKind:\n\t\treturn e.AsIdent(), true\n\t}\n\treturn \"\", false\n}\n\ntype listValidator struct{}\n\nfunc NewListValidator() cel.ASTValidator {\n\treturn &listValidator{}\n}\n\nfunc (v *listValidator) Name() string {\n\treturn \"grpc.federation.list.validator\"\n}\n\nfunc (v *listValidator) Validate(_ *cel.Env, _ cel.ValidatorConfig, a *ast.AST, iss *cel.Issues) {\n\troot := ast.NavigateAST(a)\n\n\t// Checks at compile time if the value types are comparable\n\tfuncNames := []string{\n\t\tlistSortAscFunc,\n\t\tlistSortDescFunc,\n\t\tlistSortStableAscFunc,\n\t\tlistSortStableDescFunc,\n\t}\n\tdupErrs := map[string]struct{}{}\n\tfor _, funcName := range funcNames {\n\t\tfuncCalls := ast.MatchDescendants(root, ast.FunctionMatcher(funcName))\n\t\tfor _, call := range funcCalls {\n\t\t\targ1 := call.AsCall().Args()[1]\n\t\t\texpr, ok := arg1.AsComprehension().Result().(ast.NavigableExpr)\n\t\t\tif !ok {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tparams := expr.Type().Parameters()\n\t\t\tif len(params) == 0 {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t// If an error occurs when calling sort macros in a chain, the same error is reported multiple times.\n\t\t\t// To avoid this, check if the error already report and ignore it.\n\t\t\tloc := a.SourceInfo().GetStartLocation(expr.ID())\n\t\t\tdupKey := fmt.Sprintf(\"%s:%d:%d:%s\", funcName, loc.Column(), loc.Line(), expr.Type())\n\t\t\tif _, exists := dupErrs[dupKey]; !exists && !params[0].HasTrait(traits.ComparerType) {\n\t\t\t\tiss.ReportErrorAtID(expr.ID(), \"%s is not comparable\", expr.Type())\n\t\t\t\tdupErrs[dupKey] = struct{}{}\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "grpc/federation/cel/list_test.go",
    "content": "package cel_test\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/google/cel-go/cel\"\n\t\"github.com/google/cel-go/common/types\"\n\t\"github.com/google/cel-go/common/types/traits\"\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\n\tcellib \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"github.com/mercari/grpc-federation/grpc/federation/cel/testdata/testpb\"\n)\n\nfunc TestList(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\texpr string\n\t\targs map[string]any\n\t\tcmp  func(any) error\n\t}{\n\t\t{\n\t\t\tname: \"reduce\",\n\t\t\texpr: \"[2, 3, 4].reduce(accum, cur, accum + cur, 1)\",\n\t\t\tcmp: func(got any) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(int(gotV), 10); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"first match\",\n\t\t\texpr: \"[1, 2, 3, 4].first(v, v % 2 == 0)\",\n\t\t\tcmp: func(got any) error {\n\t\t\t\topt, ok := got.(*types.Optional)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tgotV, ok := opt.GetValue().(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", opt)\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(int(gotV), 2); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"first not match\",\n\t\t\texpr: \"[1, 2, 3, 4].first(v, v == 5)\",\n\t\t\tcmp: func(got any) error {\n\t\t\t\tgotV, ok := got.(*types.Optional)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tif gotV != types.OptionalNone {\n\t\t\t\t\treturn fmt.Errorf(\"invalid optional type: %v\", gotV)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"sortAsc\",\n\t\t\texpr: \"[4, 1, 3, 2].sortAsc(v, v)\",\n\t\t\tcmp: func(got any) error {\n\t\t\t\tlister, ok := got.(traits.Lister)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := []int64{1, 2, 3, 4}\n\t\t\t\tif lister.Size().(types.Int) != types.Int(len(expected)) {\n\t\t\t\t\treturn fmt.Errorf(\"invalid size\")\n\t\t\t\t}\n\n\t\t\t\tgotV, err := lister.ConvertToNative(reflect.TypeOf([]int64{}))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"failed to convert to native: %w\", err)\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"sortDesc\",\n\t\t\texpr: \"[4, 1, 3, 2].sortDesc(v, v)\",\n\t\t\tcmp: func(got any) error {\n\t\t\t\tlister, ok := got.(traits.Lister)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := []int64{4, 3, 2, 1}\n\t\t\t\tif lister.Size().(types.Int) != types.Int(len(expected)) {\n\t\t\t\t\treturn fmt.Errorf(\"invalid size\")\n\t\t\t\t}\n\n\t\t\t\tgotV, err := lister.ConvertToNative(reflect.TypeOf([]int64{}))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"failed to convert to native: %w\", err)\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"sortAsc field selection\",\n\t\t\texpr: `[\ngrpc.federation.cel.test.Message{id: \"a\", inner: grpc.federation.cel.test.InnerMessage{id: \"a2\"}}, \ngrpc.federation.cel.test.Message{id: \"c\", inner: grpc.federation.cel.test.InnerMessage{id: \"c2\"}}, \ngrpc.federation.cel.test.Message{id: \"b\", inner: grpc.federation.cel.test.InnerMessage{id: \"b2\"}}\n].sortAsc(v, v.inner.id)`,\n\t\t\tcmp: func(got any) error {\n\t\t\t\tlister, ok := got.(traits.Lister)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := []*testpb.Message{\n\t\t\t\t\t{\n\t\t\t\t\t\tId: \"a\",\n\t\t\t\t\t\tInner: &testpb.InnerMessage{\n\t\t\t\t\t\t\tId: \"a2\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tId: \"b\",\n\t\t\t\t\t\tInner: &testpb.InnerMessage{\n\t\t\t\t\t\t\tId: \"b2\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tId: \"c\",\n\t\t\t\t\t\tInner: &testpb.InnerMessage{\n\t\t\t\t\t\t\tId: \"c2\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t\tif lister.Size().(types.Int) != types.Int(len(expected)) {\n\t\t\t\t\treturn fmt.Errorf(\"invalid size\")\n\t\t\t\t}\n\n\t\t\t\tgotV, err := lister.ConvertToNative(reflect.TypeOf([]*testpb.Message{}))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"failed to convert to native: %w\", err)\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotV, expected, cmpopts.IgnoreUnexported(testpb.Message{}, testpb.InnerMessage{})); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"sortAsc key value\",\n\t\t\texpr: \"{'b': 'y', 'a': 'x'}.map(v, v).sortAsc(v, v)\",\n\t\t\tcmp: func(got any) error {\n\t\t\t\tlister, ok := got.(traits.Lister)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := []string{\"a\", \"b\"}\n\t\t\t\tif lister.Size().(types.Int) != types.Int(len(expected)) {\n\t\t\t\t\treturn fmt.Errorf(\"invalid size\")\n\t\t\t\t}\n\n\t\t\t\tgotV, err := lister.ConvertToNative(reflect.TypeOf([]string{}))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"failed to convert to native: %w\", err)\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"sortDesc field selection\",\n\t\t\texpr: `[\ngrpc.federation.cel.test.Message{id: \"a\"}, \ngrpc.federation.cel.test.Message{id: \"c\"}, \ngrpc.federation.cel.test.Message{id: \"b\"}\n].sortDesc(v, v.id)`,\n\t\t\tcmp: func(got any) error {\n\t\t\t\tlister, ok := got.(traits.Lister)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := []*testpb.Message{\n\t\t\t\t\t{\n\t\t\t\t\t\tId: \"c\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tId: \"b\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tId: \"a\",\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t\tif lister.Size().(types.Int) != types.Int(len(expected)) {\n\t\t\t\t\treturn fmt.Errorf(\"invalid size\")\n\t\t\t\t}\n\n\t\t\t\tgotV, err := lister.ConvertToNative(reflect.TypeOf([]*testpb.Message{}))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"failed to convert to native: %w\", err)\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotV, expected, cmpopts.IgnoreUnexported(testpb.Message{})); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"sortStableAsc\",\n\t\t\texpr: `[\ngrpc.federation.cel.test.Message{id:\"A\", num:25}, \ngrpc.federation.cel.test.Message{id:\"E\", num:75}, \ngrpc.federation.cel.test.Message{id:\"A\", num:75}, \ngrpc.federation.cel.test.Message{id:\"B\", num:75},\ngrpc.federation.cel.test.Message{id:\"A\", num:75},\ngrpc.federation.cel.test.Message{id:\"B\", num:25},\ngrpc.federation.cel.test.Message{id:\"C\", num:25},\ngrpc.federation.cel.test.Message{id:\"E\", num:25},\n].sortStableAsc(v, v.id).sortStableAsc(v, v.num)`,\n\t\t\tcmp: func(got any) error {\n\t\t\t\tlister, ok := got.(traits.Lister)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := []*testpb.Message{\n\t\t\t\t\t{\n\t\t\t\t\t\tId:  \"A\",\n\t\t\t\t\t\tNum: 25,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tId:  \"B\",\n\t\t\t\t\t\tNum: 25,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tId:  \"C\",\n\t\t\t\t\t\tNum: 25,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tId:  \"E\",\n\t\t\t\t\t\tNum: 25,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tId:  \"A\",\n\t\t\t\t\t\tNum: 75,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tId:  \"A\",\n\t\t\t\t\t\tNum: 75,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tId:  \"B\",\n\t\t\t\t\t\tNum: 75,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tId:  \"E\",\n\t\t\t\t\t\tNum: 75,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t\tif lister.Size().(types.Int) != types.Int(len(expected)) {\n\t\t\t\t\treturn fmt.Errorf(\"invalid size\")\n\t\t\t\t}\n\n\t\t\t\tgotV, err := lister.ConvertToNative(reflect.TypeOf([]*testpb.Message{}))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"failed to convert to native: %w\", err)\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotV, expected, cmpopts.IgnoreUnexported(testpb.Message{})); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"sortStableDesc\",\n\t\t\texpr: `[\ngrpc.federation.cel.test.Message{id:\"A\", num:25}, \ngrpc.federation.cel.test.Message{id:\"E\", num:75}, \ngrpc.federation.cel.test.Message{id:\"A\", num:75}, \ngrpc.federation.cel.test.Message{id:\"B\", num:75},\ngrpc.federation.cel.test.Message{id:\"A\", num:75},\ngrpc.federation.cel.test.Message{id:\"B\", num:25},\ngrpc.federation.cel.test.Message{id:\"C\", num:25},\ngrpc.federation.cel.test.Message{id:\"E\", num:25},\n].sortStableDesc(v, v.id).sortStableDesc(v, v.num)`,\n\t\t\tcmp: func(got any) error {\n\t\t\t\tlister, ok := got.(traits.Lister)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := []*testpb.Message{\n\t\t\t\t\t{\n\t\t\t\t\t\tId:  \"E\",\n\t\t\t\t\t\tNum: 75,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tId:  \"B\",\n\t\t\t\t\t\tNum: 75,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tId:  \"A\",\n\t\t\t\t\t\tNum: 75,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tId:  \"A\",\n\t\t\t\t\t\tNum: 75,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tId:  \"E\",\n\t\t\t\t\t\tNum: 25,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tId:  \"C\",\n\t\t\t\t\t\tNum: 25,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tId:  \"B\",\n\t\t\t\t\t\tNum: 25,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tId:  \"A\",\n\t\t\t\t\t\tNum: 25,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t\tif lister.Size().(types.Int) != types.Int(len(expected)) {\n\t\t\t\t\treturn fmt.Errorf(\"invalid size\")\n\t\t\t\t}\n\n\t\t\t\tgotV, err := lister.ConvertToNative(reflect.TypeOf([]*testpb.Message{}))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"failed to convert to native: %w\", err)\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotV, expected, cmpopts.IgnoreUnexported(testpb.Message{})); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t}\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tenv, err := cel.NewEnv(\n\t\t\t\tcel.Lib(cellib.NewListLibrary(types.DefaultTypeAdapter)),\n\t\t\t\tcel.Types(&testpb.Message{}, &testpb.InnerMessage{}),\n\t\t\t\tcel.ASTValidators(cellib.NewListValidator()),\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tast, iss := env.Compile(test.expr)\n\t\t\tif iss.Err() != nil {\n\t\t\t\tt.Fatal(iss.Err())\n\t\t\t}\n\t\t\tprogram, err := env.Program(ast)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tout, _, err := program.Eval(test.args)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tif err := test.cmp(out); err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestListValidator(t *testing.T) {\n\ttests := []struct {\n\t\tname     string\n\t\texpr     string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tname:     \"sort int\",\n\t\t\texpr:     `[1, 2].sortAsc(v, v).sortDesc(v, v).sortStableAsc(v, v).sortStableDesc(v, v)`,\n\t\t\texpected: ``,\n\t\t},\n\t\t{\n\t\t\tname:     \"sort string\",\n\t\t\texpr:     `['a', 'b'].sortAsc(v, v).sortDesc(v, v).sortStableAsc(v, v).sortStableDesc(v, v)`,\n\t\t\texpected: ``,\n\t\t},\n\t\t{\n\t\t\tname: \"sort timestamp\",\n\t\t\texpr: `[\ngoogle.protobuf.Timestamp{seconds: 1}, \ngoogle.protobuf.Timestamp{seconds: 2},\n].sortAsc(v, v).sortDesc(v, v).sortStableAsc(v, v).sortStableDesc(v, v)`,\n\t\t\texpected: ``,\n\t\t},\n\t\t{\n\t\t\tname: \"sort uncomparable dynamic type\",\n\t\t\texpr: `[1, 'a'].sortAsc(v, v).sortDesc(v, v).sortStableAsc(v, v).sortStableDesc(v, v)`,\n\t\t\texpected: `ERROR: <input>:1:17: list(dyn) is not comparable\n | [1, 'a'].sortAsc(v, v).sortDesc(v, v).sortStableAsc(v, v).sortStableDesc(v, v)\n | ................^\nERROR: <input>:1:32: list(dyn) is not comparable\n | [1, 'a'].sortAsc(v, v).sortDesc(v, v).sortStableAsc(v, v).sortStableDesc(v, v)\n | ...............................^\nERROR: <input>:1:52: list(dyn) is not comparable\n | [1, 'a'].sortAsc(v, v).sortDesc(v, v).sortStableAsc(v, v).sortStableDesc(v, v)\n | ...................................................^\nERROR: <input>:1:73: list(dyn) is not comparable\n | [1, 'a'].sortAsc(v, v).sortDesc(v, v).sortStableAsc(v, v).sortStableDesc(v, v)\n | ........................................................................^`,\n\t\t},\n\t\t{\n\t\t\tname: \"sort uncomparable struct type\",\n\t\t\texpr: `[\ngrpc.federation.cel.test.Message{id: \"a\"}, \ngrpc.federation.cel.test.Message{id: \"b\"}\n].sortAsc(v, v).sortDesc(v, v).sortStableAsc(v, v).sortStableDesc(v, v)`,\n\t\t\texpected: `ERROR: <input>:4:10: list(grpc.federation.cel.test.Message) is not comparable\n | ].sortAsc(v, v).sortDesc(v, v).sortStableAsc(v, v).sortStableDesc(v, v)\n | .........^\nERROR: <input>:4:25: list(grpc.federation.cel.test.Message) is not comparable\n | ].sortAsc(v, v).sortDesc(v, v).sortStableAsc(v, v).sortStableDesc(v, v)\n | ........................^\nERROR: <input>:4:45: list(grpc.federation.cel.test.Message) is not comparable\n | ].sortAsc(v, v).sortDesc(v, v).sortStableAsc(v, v).sortStableDesc(v, v)\n | ............................................^\nERROR: <input>:4:66: list(grpc.federation.cel.test.Message) is not comparable\n | ].sortAsc(v, v).sortDesc(v, v).sortStableAsc(v, v).sortStableDesc(v, v)\n | .................................................................^`,\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tenv, err := cel.NewEnv(\n\t\t\t\tcel.Lib(cellib.NewListLibrary(types.DefaultTypeAdapter)),\n\t\t\t\tcel.Types(&testpb.Message{}, &testpb.InnerMessage{}),\n\t\t\t\tcel.ASTValidators(cellib.NewListValidator()),\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\t_, iss := env.Compile(test.expr)\n\t\t\tif test.expected == \"\" {\n\t\t\t\tif iss.Err() != nil {\n\t\t\t\t\tt.Errorf(\"expected no error but got: %v\", iss.Err())\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif diff := cmp.Diff(iss.Err().Error(), test.expected); diff != \"\" {\n\t\t\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "grpc/federation/cel/log.go",
    "content": "package cel\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log/slog\"\n\n\t\"github.com/google/cel-go/cel\"\n\t\"github.com/google/cel-go/common/types\"\n\t\"github.com/google/cel-go/common/types/ref\"\n\t\"github.com/google/cel-go/common/types/traits\"\n\n\t\"github.com/mercari/grpc-federation/grpc/federation/log\"\n)\n\nconst LogPackageName = \"log\"\n\nconst (\n\tlogDebugFunc = \"grpc.federation.log.debug\"\n\tlogInfoFunc  = \"grpc.federation.log.info\"\n\tlogWarnFunc  = \"grpc.federation.log.warn\"\n\tlogErrorFunc = \"grpc.federation.log.error\"\n\tlogAddFunc   = \"grpc.federation.log.add\"\n)\n\ntype LogLibrary struct{}\n\nfunc NewLogLibrary() *LogLibrary {\n\treturn &LogLibrary{}\n}\n\nfunc (lib *LogLibrary) LibraryName() string {\n\treturn packageName(LogPackageName)\n}\n\nfunc (lib *LogLibrary) CompileOptions() []cel.EnvOption {\n\topts := []cel.EnvOption{\n\t\tcel.OptionalTypes(),\n\t}\n\tfor _, funcOpts := range [][]cel.EnvOption{\n\t\tBindFunction(\n\t\t\tlogInfoFunc,\n\t\t\tOverloadFunc(\"grpc_federation_log_info\",\n\t\t\t\t[]*cel.Type{cel.StringType}, cel.BoolType,\n\t\t\t\tlib.info,\n\t\t\t),\n\t\t\tOverloadFunc(\"grpc_federation_log_info_args\",\n\t\t\t\t[]*cel.Type{cel.StringType, cel.MapType(cel.StringType, cel.DynType)}, cel.BoolType,\n\t\t\t\tlib.info,\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tlogDebugFunc,\n\t\t\tOverloadFunc(\"grpc_federation_log_debug\",\n\t\t\t\t[]*cel.Type{cel.StringType}, cel.BoolType,\n\t\t\t\tlib.debug,\n\t\t\t),\n\t\t\tOverloadFunc(\"grpc_federation_log_debug_args\",\n\t\t\t\t[]*cel.Type{cel.StringType, cel.MapType(cel.StringType, cel.DynType)}, cel.BoolType,\n\t\t\t\tlib.debug,\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tlogWarnFunc,\n\t\t\tOverloadFunc(\"grpc_federation_log_warn\",\n\t\t\t\t[]*cel.Type{cel.StringType}, cel.BoolType,\n\t\t\t\tlib.warn,\n\t\t\t),\n\t\t\tOverloadFunc(\"grpc_federation_log_warn_args\",\n\t\t\t\t[]*cel.Type{cel.StringType, cel.MapType(cel.StringType, cel.DynType)}, cel.BoolType,\n\t\t\t\tlib.warn,\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tlogErrorFunc,\n\t\t\tOverloadFunc(\"grpc_federation_log_error\",\n\t\t\t\t[]*cel.Type{cel.StringType}, cel.BoolType,\n\t\t\t\tlib.error,\n\t\t\t),\n\t\t\tOverloadFunc(\"grpc_federation_log_error_args\",\n\t\t\t\t[]*cel.Type{cel.StringType, cel.MapType(cel.StringType, cel.DynType)}, cel.BoolType,\n\t\t\t\tlib.error,\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tlogAddFunc,\n\t\t\tOverloadFunc(\"grpc_federation_log_add\",\n\t\t\t\t[]*cel.Type{cel.MapType(cel.StringType, cel.DynType)}, cel.BoolType,\n\t\t\t\tlib.add,\n\t\t\t),\n\t\t),\n\t} {\n\t\topts = append(opts, funcOpts...)\n\t}\n\treturn opts\n}\n\nfunc (lib *LogLibrary) ProgramOptions() []cel.ProgramOption {\n\treturn []cel.ProgramOption{}\n}\n\nfunc (lib *LogLibrary) debug(ctx context.Context, values ...ref.Val) ref.Val {\n\tlogger := log.Logger(ctx)\n\treturn lib.log(ctx, logger.DebugContext, values...)\n}\n\nfunc (lib *LogLibrary) info(ctx context.Context, values ...ref.Val) ref.Val {\n\tlogger := log.Logger(ctx)\n\treturn lib.log(ctx, logger.InfoContext, values...)\n}\n\nfunc (lib *LogLibrary) warn(ctx context.Context, values ...ref.Val) ref.Val {\n\tlogger := log.Logger(ctx)\n\treturn lib.log(ctx, logger.WarnContext, values...)\n}\n\nfunc (lib *LogLibrary) error(ctx context.Context, values ...ref.Val) ref.Val {\n\tlogger := log.Logger(ctx)\n\treturn lib.log(ctx, logger.ErrorContext, values...)\n}\n\nfunc (lib *LogLibrary) log(ctx context.Context, logFn func(ctx context.Context, msg string, args ...any), values ...ref.Val) ref.Val {\n\tswitch len(values) {\n\tcase 1:\n\t\tmsg := values[0]\n\t\tlogFn(ctx, fmt.Sprint(msg.Value()))\n\tcase 2:\n\t\tmsg := values[0]\n\t\targs := values[1].(traits.Mapper)\n\n\t\tvar attrs []any\n\t\tfor it := args.Iterator(); it.HasNext() == types.True; {\n\t\t\tk := it.Next()\n\t\t\tv := args.Get(k)\n\t\t\tattrs = append(attrs, slog.Any(fmt.Sprint(k.Value()), lib.expandVal(v)))\n\t\t}\n\t\tlogFn(ctx, fmt.Sprint(msg.Value()), attrs...)\n\t}\n\treturn types.True\n}\n\nfunc (lib *LogLibrary) expandVal(arg ref.Val) any {\n\t// Expand the lister and mapper type of value to output the actual value in the log\n\tswitch typ := arg.(type) {\n\tcase traits.Mapper:\n\t\to := map[string]any{}\n\t\tfor it := typ.Iterator(); it.HasNext() == types.True; {\n\t\t\tk := it.Next()\n\t\t\tv := typ.Get(k)\n\t\t\to[fmt.Sprint(k.Value())] = lib.expandVal(v)\n\t\t}\n\t\treturn o\n\tcase traits.Lister:\n\t\tvar o []any\n\t\tfor it := typ.Iterator(); it.HasNext() == types.True; {\n\t\t\tv := it.Next()\n\t\t\to = append(o, lib.expandVal(v))\n\t\t}\n\t\treturn o\n\t}\n\treturn arg.Value()\n}\n\nfunc (lib *LogLibrary) add(ctx context.Context, values ...ref.Val) ref.Val {\n\tvalue := values[0]\n\targs := value.(traits.Mapper)\n\tvar attrs []slog.Attr\n\tfor it := args.Iterator(); it.HasNext() == types.True; {\n\t\tk := it.Next()\n\t\tv := args.Get(k)\n\t\tattrs = append(attrs, slog.Any(fmt.Sprint(k.Value()), lib.expandVal(v)))\n\t}\n\n\tlog.AddAttrs(ctx, attrs)\n\treturn types.True\n}\n"
  },
  {
    "path": "grpc/federation/cel/log_test.go",
    "content": "package cel_test\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"testing\"\n\n\t\"github.com/google/cel-go/cel\"\n\t\"github.com/google/go-cmp/cmp\"\n\n\tcellib \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"github.com/mercari/grpc-federation/grpc/federation/log\"\n)\n\nfunc TestLog(t *testing.T) {\n\tnewTestLogger := func(w *bytes.Buffer) *slog.Logger {\n\t\treturn slog.New(slog.NewJSONHandler(w, &slog.HandlerOptions{\n\t\t\tLevel: slog.LevelDebug,\n\t\t\tReplaceAttr: func(groups []string, a slog.Attr) slog.Attr {\n\t\t\t\tif a.Key == slog.TimeKey && len(groups) == 0 {\n\t\t\t\t\treturn slog.Attr{}\n\t\t\t\t}\n\t\t\t\treturn a\n\t\t\t},\n\t\t}))\n\t}\n\n\ttests := []struct {\n\t\tname    string\n\t\texpr    string\n\t\tctx     func(*bytes.Buffer) context.Context\n\t\tcmpDiff func(*bytes.Buffer) string\n\t}{\n\t\t{\n\t\t\tname: \"debug\",\n\t\t\texpr: \"grpc.federation.log.debug('message')\",\n\t\t\tctx: func(w *bytes.Buffer) context.Context {\n\t\t\t\tlogger := newTestLogger(w)\n\t\t\t\treturn log.WithLogger(context.Background(), logger)\n\t\t\t},\n\t\t\tcmpDiff: func(got *bytes.Buffer) string {\n\t\t\t\texpected := `{\"level\":\"DEBUG\",\"msg\":\"message\"}`\n\t\t\t\treturn cmp.Diff(got.String(), fmt.Sprintln(expected))\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"debug with args\",\n\t\t\texpr: \"grpc.federation.log.debug('message', {'a': 100})\",\n\t\t\tctx: func(w *bytes.Buffer) context.Context {\n\t\t\t\tlogger := newTestLogger(w)\n\t\t\t\treturn log.WithLogger(context.Background(), logger)\n\t\t\t},\n\t\t\tcmpDiff: func(got *bytes.Buffer) string {\n\t\t\t\texpected := `{\"level\":\"DEBUG\",\"msg\":\"message\",\"a\":100}`\n\t\t\t\treturn cmp.Diff(got.String(), fmt.Sprintln(expected))\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"info\",\n\t\t\texpr: \"grpc.federation.log.info('message')\",\n\t\t\tctx: func(w *bytes.Buffer) context.Context {\n\t\t\t\tlogger := newTestLogger(w)\n\t\t\t\treturn log.WithLogger(context.Background(), logger)\n\t\t\t},\n\t\t\tcmpDiff: func(got *bytes.Buffer) string {\n\t\t\t\texpected := `{\"level\":\"INFO\",\"msg\":\"message\"}`\n\t\t\t\treturn cmp.Diff(got.String(), fmt.Sprintln(expected))\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"info with args\",\n\t\t\texpr: \"grpc.federation.log.info('message', {'a': 100})\",\n\t\t\tctx: func(w *bytes.Buffer) context.Context {\n\t\t\t\tlogger := newTestLogger(w)\n\t\t\t\treturn log.WithLogger(context.Background(), logger)\n\t\t\t},\n\t\t\tcmpDiff: func(got *bytes.Buffer) string {\n\t\t\t\texpected := `{\"level\":\"INFO\",\"msg\":\"message\",\"a\":100}`\n\t\t\t\treturn cmp.Diff(got.String(), fmt.Sprintln(expected))\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"warn\",\n\t\t\texpr: \"grpc.federation.log.warn('message')\",\n\t\t\tctx: func(w *bytes.Buffer) context.Context {\n\t\t\t\tlogger := newTestLogger(w)\n\t\t\t\treturn log.WithLogger(context.Background(), logger)\n\t\t\t},\n\t\t\tcmpDiff: func(got *bytes.Buffer) string {\n\t\t\t\texpected := `{\"level\":\"WARN\",\"msg\":\"message\"}`\n\t\t\t\treturn cmp.Diff(got.String(), fmt.Sprintln(expected))\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"warn with args\",\n\t\t\texpr: \"grpc.federation.log.warn('message', {'a': 100})\",\n\t\t\tctx: func(w *bytes.Buffer) context.Context {\n\t\t\t\tlogger := newTestLogger(w)\n\t\t\t\treturn log.WithLogger(context.Background(), logger)\n\t\t\t},\n\t\t\tcmpDiff: func(got *bytes.Buffer) string {\n\t\t\t\texpected := `{\"level\":\"WARN\",\"msg\":\"message\",\"a\":100}`\n\t\t\t\treturn cmp.Diff(got.String(), fmt.Sprintln(expected))\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"error\",\n\t\t\texpr: \"grpc.federation.log.error('message')\",\n\t\t\tctx: func(w *bytes.Buffer) context.Context {\n\t\t\t\tlogger := newTestLogger(w)\n\t\t\t\treturn log.WithLogger(context.Background(), logger)\n\t\t\t},\n\t\t\tcmpDiff: func(got *bytes.Buffer) string {\n\t\t\t\texpected := `{\"level\":\"ERROR\",\"msg\":\"message\"}`\n\t\t\t\treturn cmp.Diff(got.String(), fmt.Sprintln(expected))\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"error with args\",\n\t\t\texpr: \"grpc.federation.log.error('message', {'a': 100})\",\n\t\t\tctx: func(w *bytes.Buffer) context.Context {\n\t\t\t\tlogger := newTestLogger(w)\n\t\t\t\treturn log.WithLogger(context.Background(), logger)\n\t\t\t},\n\t\t\tcmpDiff: func(got *bytes.Buffer) string {\n\t\t\t\texpected := `{\"level\":\"ERROR\",\"msg\":\"message\",\"a\":100}`\n\t\t\t\treturn cmp.Diff(got.String(), fmt.Sprintln(expected))\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"add\",\n\t\t\texpr: \"grpc.federation.log.add({'a': 100}) && grpc.federation.log.info('message')\",\n\t\t\tctx: func(w *bytes.Buffer) context.Context {\n\t\t\t\tlogger := newTestLogger(w)\n\t\t\t\treturn log.WithLogger(context.Background(), logger)\n\t\t\t},\n\t\t\tcmpDiff: func(got *bytes.Buffer) string {\n\t\t\t\texpected := `{\"level\":\"INFO\",\"msg\":\"message\",\"a\":100}`\n\t\t\t\treturn cmp.Diff(got.String(), fmt.Sprintln(expected))\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"expand value\",\n\t\t\texpr: `grpc.federation.log.info('message', {\n\t'a': {\n\t\t'b': [\n\t\t\tgoogle.protobuf.Timestamp{seconds: 1},\n\t\t\tgoogle.protobuf.Timestamp{seconds: 2}\n\t\t]\n\t}\n})`,\n\t\t\tctx: func(w *bytes.Buffer) context.Context {\n\t\t\t\tlogger := newTestLogger(w)\n\t\t\t\treturn log.WithLogger(context.Background(), logger)\n\t\t\t},\n\t\t\tcmpDiff: func(got *bytes.Buffer) string {\n\t\t\t\texpected := `{\"level\":\"INFO\",\"msg\":\"message\",\"a\":{\"b\":[\"1970-01-01T00:00:01Z\",\"1970-01-01T00:00:02Z\"]}}`\n\t\t\t\treturn cmp.Diff(got.String(), fmt.Sprintln(expected))\n\t\t\t},\n\t\t},\n\t}\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tvar output bytes.Buffer\n\t\t\tlib := cellib.NewLogLibrary()\n\t\t\tenv, err := cel.NewEnv(\n\t\t\t\tcel.Variable(cellib.ContextVariableName, cel.ObjectType(cellib.ContextTypeName)),\n\t\t\t\tcel.Lib(lib),\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tast, iss := env.Compile(test.expr)\n\t\t\tif iss.Err() != nil {\n\t\t\t\tt.Fatal(iss.Err())\n\t\t\t}\n\t\t\tprogram, err := env.Program(ast)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\t_, _, err = program.Eval(map[string]any{cellib.ContextVariableName: cellib.NewContextValue(test.ctx(&output))})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tif d := test.cmpDiff(&output); d != \"\" {\n\t\t\t\tt.Fatalf(\"(-got, +want)\\n%s\", d)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "grpc/federation/cel/math.go",
    "content": "package cel\n\nimport (\n\t\"context\"\n\t\"math\"\n\n\t\"github.com/google/cel-go/cel\"\n\t\"github.com/google/cel-go/common/types\"\n\t\"github.com/google/cel-go/common/types/ref\"\n)\n\nconst MathPackageName = \"math\"\n\nvar _ cel.SingletonLibrary = new(MathLibrary)\n\ntype MathLibrary struct {\n}\n\nfunc NewMathLibrary() *MathLibrary {\n\treturn &MathLibrary{}\n}\n\nfunc (lib *MathLibrary) LibraryName() string {\n\treturn packageName(MathPackageName)\n}\n\nfunc createMathName(name string) string {\n\treturn createName(MathPackageName, name)\n}\n\nfunc createMathID(name string) string {\n\treturn createID(MathPackageName, name)\n}\n\nfunc (lib *MathLibrary) CompileOptions() []cel.EnvOption {\n\topts := []cel.EnvOption{}\n\n\tfor _, funcOpts := range [][]cel.EnvOption{\n\t\t// math package functions\n\t\tBindFunction(\n\t\t\tcreateMathName(\"sqrt\"),\n\t\t\tOverloadFunc(createMathID(\"sqrt_double_double\"), []*cel.Type{cel.DoubleType}, cel.DoubleType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Double(math.Sqrt(float64(args[0].(types.Double))))\n\t\t\t\t},\n\t\t\t),\n\t\t\tOverloadFunc(createMathID(\"sqrt_int_double\"), []*cel.Type{cel.IntType}, cel.DoubleType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Double(math.Sqrt(float64(args[0].(types.Int))))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateMathName(\"pow\"),\n\t\t\tOverloadFunc(createMathID(\"pow_double_double_double\"), []*cel.Type{cel.DoubleType, cel.DoubleType}, cel.DoubleType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Double(math.Pow(float64(args[0].(types.Double)), float64(args[1].(types.Double))))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateMathName(\"floor\"),\n\t\t\tOverloadFunc(createMathID(\"floor_double_double\"), []*cel.Type{cel.DoubleType}, cel.DoubleType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Double(math.Floor(float64(args[0].(types.Double))))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateMathName(\"round\"),\n\t\t\tOverloadFunc(createMathID(\"round_double_double\"), []*cel.Type{cel.DoubleType}, cel.DoubleType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Double(math.Round(float64(args[0].(types.Double))))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t} {\n\t\topts = append(opts, funcOpts...)\n\t}\n\n\treturn opts\n}\n\nfunc (lib *MathLibrary) ProgramOptions() []cel.ProgramOption {\n\treturn []cel.ProgramOption{}\n}\n"
  },
  {
    "path": "grpc/federation/cel/math_test.go",
    "content": "package cel_test\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"math\"\n\t\"testing\"\n\n\t\"github.com/google/cel-go/cel\"\n\t\"github.com/google/cel-go/common/types\"\n\t\"github.com/google/cel-go/common/types/ref\"\n\t\"github.com/google/go-cmp/cmp\"\n\n\tcellib \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n)\n\nfunc TestMathFunctions(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\texpr string\n\t\targs map[string]any\n\t\tcmp  func(ref.Val) error\n\t}{\n\t\t// math package\n\t\t{\n\t\t\tname: \"sqrt_double\",\n\t\t\texpr: \"grpc.federation.math.sqrt(3.0*3.0 + 4.0*4.0)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Double).Value().(float64)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tconst (\n\t\t\t\t\ta = 3.0\n\t\t\t\t\tb = 4.0\n\t\t\t\t)\n\t\t\t\texpected := math.Sqrt(a*a + b*b)\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"sqrt_int\",\n\t\t\texpr: \"grpc.federation.math.sqrt(3*3 + 4*4)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Double).Value().(float64)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tconst (\n\t\t\t\t\ta = 3\n\t\t\t\t\tb = 4\n\t\t\t\t)\n\t\t\t\texpected := math.Sqrt(float64(a*a + b*b))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"pow\",\n\t\t\texpr: \"grpc.federation.math.pow(2.0, 3.0)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Double).Value().(float64)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tconst (\n\t\t\t\t\ta = 2.0\n\t\t\t\t\tb = 3.0\n\t\t\t\t)\n\t\t\t\texpected := math.Pow(a, b)\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"floor\",\n\t\t\texpr: \"grpc.federation.math.floor(1.51)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Double).Value().(float64)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tconst (\n\t\t\t\t\ta = 1.51\n\t\t\t\t)\n\t\t\t\texpected := math.Floor(a)\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"round\",\n\t\t\texpr: \"grpc.federation.math.round(1.5)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Double).Value().(float64)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tconst (\n\t\t\t\t\ta = 1.5\n\t\t\t\t)\n\t\t\t\texpected := math.Round(a)\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tenv, err := cel.NewEnv(\n\t\t\t\tcel.Variable(cellib.ContextVariableName, cel.ObjectType(cellib.ContextTypeName)),\n\t\t\t\tcel.Lib(cellib.NewMathLibrary()),\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tast, iss := env.Compile(test.expr)\n\t\t\tif iss.Err() != nil {\n\t\t\t\tt.Fatal(iss.Err())\n\t\t\t}\n\t\t\tprogram, err := env.Program(ast)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\targs := map[string]any{cellib.ContextVariableName: cellib.NewContextValue(context.Background())}\n\t\t\tfor k, v := range test.args {\n\t\t\t\targs[k] = v\n\t\t\t}\n\t\t\tout, _, err := program.Eval(args)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tif err := test.cmp(out); err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "grpc/federation/cel/metadata.go",
    "content": "package cel\n\nimport (\n\t\"context\"\n\n\t\"github.com/google/cel-go/cel\"\n\t\"github.com/google/cel-go/common/types\"\n\t\"github.com/google/cel-go/common/types/ref\"\n\t\"google.golang.org/grpc/metadata\"\n)\n\nconst MetadataPackageName = \"metadata\"\n\nfunc NewMetadataLibrary() *MetadataLibrary {\n\treturn &MetadataLibrary{}\n}\n\ntype MetadataLibrary struct{}\n\nfunc (lib *MetadataLibrary) LibraryName() string {\n\treturn packageName(MetadataPackageName)\n}\n\nfunc createMetadata(name string) string {\n\treturn createName(MetadataPackageName, name)\n}\n\nfunc createMetadataID(name string) string {\n\treturn createID(MetadataPackageName, name)\n}\n\nfunc (lib *MetadataLibrary) CompileOptions() []cel.EnvOption {\n\tvar opts []cel.EnvOption\n\tfor _, funcOpts := range [][]cel.EnvOption{\n\t\tBindFunction(\n\t\t\tcreateMetadata(\"new\"),\n\t\t\tOverloadFunc(createMetadataID(\"new_map_string_list_string\"),\n\t\t\t\t[]*cel.Type{}, types.NewMapType(types.StringType, types.NewListType(types.StringType)),\n\t\t\t\tfunc(ctx context.Context, _ ...ref.Val) ref.Val {\n\t\t\t\t\trefMap := make(map[ref.Val]ref.Val)\n\t\t\t\t\treturn types.NewRefValMap(types.DefaultTypeAdapter, refMap)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateMetadata(\"incoming\"),\n\t\t\tOverloadFunc(createMetadataID(\"incoming_map_string_list_string\"),\n\t\t\t\t[]*cel.Type{}, types.NewMapType(types.StringType, types.NewListType(types.StringType)),\n\t\t\t\tfunc(ctx context.Context, _ ...ref.Val) ref.Val {\n\t\t\t\t\trefMap := make(map[ref.Val]ref.Val)\n\t\t\t\t\tmd, ok := metadata.FromIncomingContext(ctx)\n\t\t\t\t\tif !ok {\n\t\t\t\t\t\treturn types.NewRefValMap(types.DefaultTypeAdapter, refMap)\n\t\t\t\t\t}\n\n\t\t\t\t\tfor k, vs := range md {\n\t\t\t\t\t\trefMap[types.String(k)] = types.NewStringList(types.DefaultTypeAdapter, vs)\n\t\t\t\t\t}\n\t\t\t\t\treturn types.NewRefValMap(types.DefaultTypeAdapter, refMap)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t} {\n\t\topts = append(opts, funcOpts...)\n\t}\n\treturn opts\n}\n\nfunc (lib *MetadataLibrary) ProgramOptions() []cel.ProgramOption {\n\treturn []cel.ProgramOption{}\n}\n"
  },
  {
    "path": "grpc/federation/cel/metadata_test.go",
    "content": "package cel_test\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/google/cel-go/cel\"\n\t\"github.com/google/cel-go/common/types\"\n\t\"github.com/google/cel-go/common/types/ref\"\n\t\"github.com/google/go-cmp/cmp\"\n\t\"google.golang.org/grpc/metadata\"\n\n\tcellib \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n)\n\nfunc TestMetadata(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tctx  func() context.Context\n\t\texpr string\n\t\tcmp  func(got ref.Val) error\n\t}{\n\t\t{\n\t\t\tname: \"incoming with incoming context\",\n\t\t\tctx: func() context.Context {\n\t\t\t\tmd := map[string]string{\n\t\t\t\t\t\"key1\": \"value1\",\n\t\t\t\t\t\"key2\": \"value2\",\n\t\t\t\t}\n\t\t\t\treturn metadata.NewIncomingContext(context.Background(), metadata.New(md))\n\t\t\t},\n\t\t\texpr: \"grpc.federation.metadata.incoming()\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.Value().(map[ref.Val]ref.Val)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tgotMap := make(map[string][]string)\n\t\t\t\tfor k, v := range gotV {\n\t\t\t\t\tgotMap[string(k.(types.String))] = v.Value().([]string)\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotMap, map[string][]string{\n\t\t\t\t\t\"key1\": {\"value1\"},\n\t\t\t\t\t\"key2\": {\"value2\"},\n\t\t\t\t}); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"incoming without incoming context\",\n\t\t\tctx:  context.Background,\n\t\t\texpr: \"grpc.federation.metadata.incoming()\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.Value().(map[ref.Val]ref.Val)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tif len(gotV) != 0 {\n\t\t\t\t\treturn fmt.Errorf(\"received an unexpected non-empty map: %v\", gotV)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t}\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tlib := cellib.NewMetadataLibrary()\n\t\t\tenv, err := cel.NewEnv(\n\t\t\t\tcel.Variable(cellib.ContextVariableName, cel.ObjectType(cellib.ContextTypeName)),\n\t\t\t\tcel.Lib(lib),\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tast, iss := env.Compile(test.expr)\n\t\t\tif iss.Err() != nil {\n\t\t\t\tt.Fatal(iss.Err())\n\t\t\t}\n\t\t\tprogram, err := env.Program(ast)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tout, _, err := program.Eval(map[string]any{\n\t\t\t\tcellib.ContextVariableName: cellib.NewContextValue(test.ctx()),\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tif err := test.cmp(out); err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "grpc/federation/cel/plugin/plugin.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: grpc/federation/plugin.proto\n\npackage plugin\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\t_ \"google.golang.org/protobuf/types/descriptorpb\"\n\tanypb \"google.golang.org/protobuf/types/known/anypb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype CELPluginRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMethod   string                   `protobuf:\"bytes,1,opt,name=method,proto3\" json:\"method,omitempty\"`\n\tMetadata []*CELPluginGRPCMetadata `protobuf:\"bytes,2,rep,name=metadata,proto3\" json:\"metadata,omitempty\"`\n\tArgs     []*CELPluginValue        `protobuf:\"bytes,3,rep,name=args,proto3\" json:\"args,omitempty\"`\n}\n\nfunc (x *CELPluginRequest) Reset() {\n\t*x = CELPluginRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_plugin_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginRequest) ProtoMessage() {}\n\nfunc (x *CELPluginRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_plugin_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginRequest.ProtoReflect.Descriptor instead.\nfunc (*CELPluginRequest) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_plugin_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CELPluginRequest) GetMethod() string {\n\tif x != nil {\n\t\treturn x.Method\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELPluginRequest) GetMetadata() []*CELPluginGRPCMetadata {\n\tif x != nil {\n\t\treturn x.Metadata\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginRequest) GetArgs() []*CELPluginValue {\n\tif x != nil {\n\t\treturn x.Args\n\t}\n\treturn nil\n}\n\ntype CELPluginResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tValue *CELPluginValue `protobuf:\"bytes,1,opt,name=value,proto3\" json:\"value,omitempty\"`\n\tError string          `protobuf:\"bytes,2,opt,name=error,proto3\" json:\"error,omitempty\"`\n}\n\nfunc (x *CELPluginResponse) Reset() {\n\t*x = CELPluginResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_plugin_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginResponse) ProtoMessage() {}\n\nfunc (x *CELPluginResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_plugin_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginResponse.ProtoReflect.Descriptor instead.\nfunc (*CELPluginResponse) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_plugin_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *CELPluginResponse) GetValue() *CELPluginValue {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginResponse) GetError() string {\n\tif x != nil {\n\t\treturn x.Error\n\t}\n\treturn \"\"\n}\n\ntype CELPluginGRPCMetadata struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tKey    string   `protobuf:\"bytes,1,opt,name=key,proto3\" json:\"key,omitempty\"`\n\tValues []string `protobuf:\"bytes,2,rep,name=values,proto3\" json:\"values,omitempty\"`\n}\n\nfunc (x *CELPluginGRPCMetadata) Reset() {\n\t*x = CELPluginGRPCMetadata{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_plugin_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginGRPCMetadata) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginGRPCMetadata) ProtoMessage() {}\n\nfunc (x *CELPluginGRPCMetadata) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_plugin_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginGRPCMetadata.ProtoReflect.Descriptor instead.\nfunc (*CELPluginGRPCMetadata) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_plugin_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *CELPluginGRPCMetadata) GetKey() string {\n\tif x != nil {\n\t\treturn x.Key\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELPluginGRPCMetadata) GetValues() []string {\n\tif x != nil {\n\t\treturn x.Values\n\t}\n\treturn nil\n}\n\ntype CELPluginValue struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to Value:\n\t//\n\t//\t*CELPluginValue_Int64\n\t//\t*CELPluginValue_Uint64\n\t//\t*CELPluginValue_Double\n\t//\t*CELPluginValue_String_\n\t//\t*CELPluginValue_Bytes\n\t//\t*CELPluginValue_Bool\n\t//\t*CELPluginValue_Ptr\n\t//\t*CELPluginValue_Message\n\t//\t*CELPluginValue_List\n\tValue isCELPluginValue_Value `protobuf_oneof:\"value\"`\n}\n\nfunc (x *CELPluginValue) Reset() {\n\t*x = CELPluginValue{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_plugin_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginValue) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginValue) ProtoMessage() {}\n\nfunc (x *CELPluginValue) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_plugin_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginValue.ProtoReflect.Descriptor instead.\nfunc (*CELPluginValue) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_plugin_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (m *CELPluginValue) GetValue() isCELPluginValue_Value {\n\tif m != nil {\n\t\treturn m.Value\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginValue) GetInt64() int64 {\n\tif x, ok := x.GetValue().(*CELPluginValue_Int64); ok {\n\t\treturn x.Int64\n\t}\n\treturn 0\n}\n\nfunc (x *CELPluginValue) GetUint64() uint64 {\n\tif x, ok := x.GetValue().(*CELPluginValue_Uint64); ok {\n\t\treturn x.Uint64\n\t}\n\treturn 0\n}\n\nfunc (x *CELPluginValue) GetDouble() float64 {\n\tif x, ok := x.GetValue().(*CELPluginValue_Double); ok {\n\t\treturn x.Double\n\t}\n\treturn 0\n}\n\nfunc (x *CELPluginValue) GetString_() string {\n\tif x, ok := x.GetValue().(*CELPluginValue_String_); ok {\n\t\treturn x.String_\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELPluginValue) GetBytes() []byte {\n\tif x, ok := x.GetValue().(*CELPluginValue_Bytes); ok {\n\t\treturn x.Bytes\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginValue) GetBool() bool {\n\tif x, ok := x.GetValue().(*CELPluginValue_Bool); ok {\n\t\treturn x.Bool\n\t}\n\treturn false\n}\n\nfunc (x *CELPluginValue) GetPtr() uint64 {\n\tif x, ok := x.GetValue().(*CELPluginValue_Ptr); ok {\n\t\treturn x.Ptr\n\t}\n\treturn 0\n}\n\nfunc (x *CELPluginValue) GetMessage() *anypb.Any {\n\tif x, ok := x.GetValue().(*CELPluginValue_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginValue) GetList() *CELPluginListValue {\n\tif x, ok := x.GetValue().(*CELPluginValue_List); ok {\n\t\treturn x.List\n\t}\n\treturn nil\n}\n\ntype isCELPluginValue_Value interface {\n\tisCELPluginValue_Value()\n}\n\ntype CELPluginValue_Int64 struct {\n\tInt64 int64 `protobuf:\"varint,1,opt,name=int64,proto3,oneof\"`\n}\n\ntype CELPluginValue_Uint64 struct {\n\tUint64 uint64 `protobuf:\"varint,2,opt,name=uint64,proto3,oneof\"`\n}\n\ntype CELPluginValue_Double struct {\n\tDouble float64 `protobuf:\"fixed64,3,opt,name=double,proto3,oneof\"`\n}\n\ntype CELPluginValue_String_ struct {\n\tString_ string `protobuf:\"bytes,4,opt,name=string,proto3,oneof\"`\n}\n\ntype CELPluginValue_Bytes struct {\n\tBytes []byte `protobuf:\"bytes,5,opt,name=bytes,proto3,oneof\"`\n}\n\ntype CELPluginValue_Bool struct {\n\tBool bool `protobuf:\"varint,6,opt,name=bool,proto3,oneof\"`\n}\n\ntype CELPluginValue_Ptr struct {\n\tPtr uint64 `protobuf:\"varint,7,opt,name=ptr,proto3,oneof\"`\n}\n\ntype CELPluginValue_Message struct {\n\tMessage *anypb.Any `protobuf:\"bytes,8,opt,name=message,proto3,oneof\"`\n}\n\ntype CELPluginValue_List struct {\n\tList *CELPluginListValue `protobuf:\"bytes,9,opt,name=list,proto3,oneof\"`\n}\n\nfunc (*CELPluginValue_Int64) isCELPluginValue_Value() {}\n\nfunc (*CELPluginValue_Uint64) isCELPluginValue_Value() {}\n\nfunc (*CELPluginValue_Double) isCELPluginValue_Value() {}\n\nfunc (*CELPluginValue_String_) isCELPluginValue_Value() {}\n\nfunc (*CELPluginValue_Bytes) isCELPluginValue_Value() {}\n\nfunc (*CELPluginValue_Bool) isCELPluginValue_Value() {}\n\nfunc (*CELPluginValue_Ptr) isCELPluginValue_Value() {}\n\nfunc (*CELPluginValue_Message) isCELPluginValue_Value() {}\n\nfunc (*CELPluginValue_List) isCELPluginValue_Value() {}\n\ntype CELPluginListValue struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tValues []*CELPluginValue `protobuf:\"bytes,1,rep,name=values,proto3\" json:\"values,omitempty\"`\n}\n\nfunc (x *CELPluginListValue) Reset() {\n\t*x = CELPluginListValue{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_plugin_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginListValue) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginListValue) ProtoMessage() {}\n\nfunc (x *CELPluginListValue) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_plugin_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginListValue.ProtoReflect.Descriptor instead.\nfunc (*CELPluginListValue) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_plugin_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *CELPluginListValue) GetValues() []*CELPluginValue {\n\tif x != nil {\n\t\treturn x.Values\n\t}\n\treturn nil\n}\n\nvar File_grpc_federation_plugin_proto protoreflect.FileDescriptor\n\nvar file_grpc_federation_plugin_proto_rawDesc = []byte{\n\t0x0a, 0x1c, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a,\n\t0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,\n\t0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63,\n\t0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa3, 0x01, 0x0a,\n\t0x10, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,\n\t0x74, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x42, 0x0a, 0x08, 0x6d, 0x65, 0x74,\n\t0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45,\n\t0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x47, 0x52, 0x50, 0x43, 0x4d, 0x65, 0x74, 0x61, 0x64,\n\t0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x33, 0x0a,\n\t0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45,\n\t0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x61, 0x72,\n\t0x67, 0x73, 0x22, 0x60, 0x0a, 0x11, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52,\n\t0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67,\n\t0x69, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14,\n\t0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65,\n\t0x72, 0x72, 0x6f, 0x72, 0x22, 0x41, 0x0a, 0x15, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69,\n\t0x6e, 0x47, 0x52, 0x50, 0x43, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a,\n\t0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12,\n\t0x16, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52,\n\t0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xae, 0x02, 0x0a, 0x0e, 0x43, 0x45, 0x4c, 0x50,\n\t0x6c, 0x75, 0x67, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x16, 0x0a, 0x05, 0x69, 0x6e,\n\t0x74, 0x36, 0x34, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x05, 0x69, 0x6e, 0x74,\n\t0x36, 0x34, 0x12, 0x18, 0x0a, 0x06, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x04, 0x48, 0x00, 0x52, 0x06, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x18, 0x0a, 0x06,\n\t0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x06,\n\t0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,\n\t0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,\n\t0x12, 0x16, 0x0a, 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x48,\n\t0x00, 0x52, 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c,\n\t0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x12, 0x12,\n\t0x0a, 0x03, 0x70, 0x74, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x03, 0x70,\n\t0x74, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x08, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73,\n\t0x73, 0x61, 0x67, 0x65, 0x12, 0x39, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x4c, 0x69,\n\t0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x42,\n\t0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x4d, 0x0a, 0x12, 0x43, 0x45, 0x4c, 0x50,\n\t0x6c, 0x75, 0x67, 0x69, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x37,\n\t0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f,\n\t0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52,\n\t0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x42, 0x46, 0x5a, 0x44, 0x67, 0x69, 0x74, 0x68, 0x75,\n\t0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x65, 0x72, 0x63, 0x61, 0x72, 0x69, 0x2f, 0x67, 0x72,\n\t0x70, 0x63, 0x2d, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x67, 0x72,\n\t0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x63, 0x65,\n\t0x6c, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x3b, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x62,\n\t0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_grpc_federation_plugin_proto_rawDescOnce sync.Once\n\tfile_grpc_federation_plugin_proto_rawDescData = file_grpc_federation_plugin_proto_rawDesc\n)\n\nfunc file_grpc_federation_plugin_proto_rawDescGZIP() []byte {\n\tfile_grpc_federation_plugin_proto_rawDescOnce.Do(func() {\n\t\tfile_grpc_federation_plugin_proto_rawDescData = protoimpl.X.CompressGZIP(file_grpc_federation_plugin_proto_rawDescData)\n\t})\n\treturn file_grpc_federation_plugin_proto_rawDescData\n}\n\nvar file_grpc_federation_plugin_proto_msgTypes = make([]protoimpl.MessageInfo, 5)\nvar file_grpc_federation_plugin_proto_goTypes = []interface{}{\n\t(*CELPluginRequest)(nil),      // 0: grpc.federation.CELPluginRequest\n\t(*CELPluginResponse)(nil),     // 1: grpc.federation.CELPluginResponse\n\t(*CELPluginGRPCMetadata)(nil), // 2: grpc.federation.CELPluginGRPCMetadata\n\t(*CELPluginValue)(nil),        // 3: grpc.federation.CELPluginValue\n\t(*CELPluginListValue)(nil),    // 4: grpc.federation.CELPluginListValue\n\t(*anypb.Any)(nil),             // 5: google.protobuf.Any\n}\nvar file_grpc_federation_plugin_proto_depIdxs = []int32{\n\t2, // 0: grpc.federation.CELPluginRequest.metadata:type_name -> grpc.federation.CELPluginGRPCMetadata\n\t3, // 1: grpc.federation.CELPluginRequest.args:type_name -> grpc.federation.CELPluginValue\n\t3, // 2: grpc.federation.CELPluginResponse.value:type_name -> grpc.federation.CELPluginValue\n\t5, // 3: grpc.federation.CELPluginValue.message:type_name -> google.protobuf.Any\n\t4, // 4: grpc.federation.CELPluginValue.list:type_name -> grpc.federation.CELPluginListValue\n\t3, // 5: grpc.federation.CELPluginListValue.values:type_name -> grpc.federation.CELPluginValue\n\t6, // [6:6] is the sub-list for method output_type\n\t6, // [6:6] is the sub-list for method input_type\n\t6, // [6:6] is the sub-list for extension type_name\n\t6, // [6:6] is the sub-list for extension extendee\n\t0, // [0:6] is the sub-list for field type_name\n}\n\nfunc init() { file_grpc_federation_plugin_proto_init() }\nfunc file_grpc_federation_plugin_proto_init() {\n\tif File_grpc_federation_plugin_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_grpc_federation_plugin_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_plugin_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_plugin_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginGRPCMetadata); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_plugin_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginValue); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_plugin_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginListValue); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\tfile_grpc_federation_plugin_proto_msgTypes[3].OneofWrappers = []interface{}{\n\t\t(*CELPluginValue_Int64)(nil),\n\t\t(*CELPluginValue_Uint64)(nil),\n\t\t(*CELPluginValue_Double)(nil),\n\t\t(*CELPluginValue_String_)(nil),\n\t\t(*CELPluginValue_Bytes)(nil),\n\t\t(*CELPluginValue_Bool)(nil),\n\t\t(*CELPluginValue_Ptr)(nil),\n\t\t(*CELPluginValue_Message)(nil),\n\t\t(*CELPluginValue_List)(nil),\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_grpc_federation_plugin_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   5,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_grpc_federation_plugin_proto_goTypes,\n\t\tDependencyIndexes: file_grpc_federation_plugin_proto_depIdxs,\n\t\tMessageInfos:      file_grpc_federation_plugin_proto_msgTypes,\n\t}.Build()\n\tFile_grpc_federation_plugin_proto = out.File\n\tfile_grpc_federation_plugin_proto_rawDesc = nil\n\tfile_grpc_federation_plugin_proto_goTypes = nil\n\tfile_grpc_federation_plugin_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "grpc/federation/cel/plugin.go",
    "content": "package cel\n\nimport (\n\t\"context\"\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"reflect\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/goccy/wasi-go/imports\"\n\t\"github.com/google/cel-go/cel\"\n\t\"github.com/google/cel-go/common/types\"\n\t\"github.com/google/cel-go/common/types/ref\"\n\t\"github.com/tetratelabs/wazero\"\n\t\"github.com/tetratelabs/wazero/api\"\n\t\"github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1\"\n\t\"google.golang.org/grpc/metadata\"\n\t\"google.golang.org/protobuf/encoding/protojson\"\n\t\"google.golang.org/protobuf/proto\"\n\t\"google.golang.org/protobuf/types/known/anypb\"\n\n\t\"github.com/mercari/grpc-federation/grpc/federation/cel/plugin\"\n\t\"github.com/mercari/grpc-federation/grpc/federation/log\"\n\t\"github.com/mercari/grpc-federation/grpc/federation/trace\"\n)\n\ntype CELPlugin struct {\n\tcfg            CELPluginConfig\n\tmod            wazero.CompiledModule\n\twasmRuntime    wazero.Runtime\n\tinstance       *CELPluginInstance\n\tbackupInstance chan *CELPluginInstance\n\tinstanceMu     sync.RWMutex\n\tcelRegistry    *types.Registry\n}\n\ntype CELFunction struct {\n\tName     string\n\tID       string\n\tArgs     []*cel.Type\n\tReturn   *cel.Type\n\tIsMethod bool\n}\n\ntype CELPluginConfig struct {\n\tName       string\n\tWasm       WasmConfig\n\tFunctions  []*CELFunction\n\tCacheDir   string\n\tCapability *CELPluginCapability\n}\n\ntype CELPluginCapability struct {\n\tEnv        *CELPluginEnvCapability\n\tFileSystem *CELPluginFileSystemCapability\n\tNetwork    *CELPluginNetworkCapability\n}\n\ntype CELPluginEnvCapability struct {\n\tAll   bool\n\tNames []string\n}\n\ntype CELPluginFileSystemCapability struct {\n\tMountPath string\n}\n\ntype CELPluginNetworkCapability struct {\n}\n\ntype WasmConfig struct {\n\tReader io.Reader\n\tSha256 string\n}\n\nvar (\n\tErrWasmContentMismatch = errors.New(\n\t\t`grpc-federation: wasm file content mismatch`,\n\t)\n\tErrWasmGCHang = errors.New(\n\t\t`grpc-federation: cel plugin's GC is taking too long, so active instance will switch to a backup instance`,\n\t)\n)\n\nfunc NewCELPlugin(ctx context.Context, cfg CELPluginConfig) (*CELPlugin, error) {\n\tif cfg.Wasm.Reader == nil {\n\t\treturn nil, fmt.Errorf(\"grpc-federation: WasmConfig.Reader field is required\")\n\t}\n\twasmFile, err := io.ReadAll(cfg.Wasm.Reader)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\thash := sha256.Sum256(wasmFile)\n\tgotHash := hex.EncodeToString(hash[:])\n\tif cfg.Wasm.Sha256 != gotHash {\n\t\treturn nil, fmt.Errorf(`expected [%s] but got [%s]: %w`, cfg.Wasm.Sha256, gotHash, ErrWasmContentMismatch)\n\t}\n\tvar runtimeCfg wazero.RuntimeConfig\n\tif cfg.CacheDir == \"\" {\n\t\truntimeCfg = wazero.NewRuntimeConfigInterpreter()\n\t} else {\n\t\truntimeCfg = wazero.NewRuntimeConfig()\n\t}\n\tif cache := getCompilationCache(cfg.Name, cfg.CacheDir); cache != nil {\n\t\truntimeCfg = runtimeCfg.WithCompilationCache(cache)\n\t}\n\tr := wazero.NewRuntimeWithConfig(ctx, runtimeCfg.WithDebugInfoEnabled(false).WithCloseOnContextDone(true))\n\tmod, err := r.CompileModule(ctx, wasmFile)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif cfg.Capability == nil || cfg.Capability.Network == nil {\n\t\twasi_snapshot_preview1.MustInstantiate(ctx, r)\n\t}\n\n\tret := &CELPlugin{\n\t\tcfg:            cfg,\n\t\tmod:            mod,\n\t\twasmRuntime:    r,\n\t\tbackupInstance: make(chan *CELPluginInstance, 1),\n\t}\n\n\t// These host functions serve as bridge functions for exchanging requests and responses between the host and guest.\n\t// By using these functions along with the pipe functionality, it is possible to exchange properly serialized strings between the host and guest.\n\thost := r.NewHostModuleBuilder(\"grpcfederation\")\n\thost.NewFunctionBuilder().WithGoModuleFunction(\n\t\tapi.GoModuleFunc(func(ctx context.Context, mod api.Module, stack []uint64) {\n\t\t\tinstance := getInstanceFromContext(ctx)\n\t\t\tif instance == nil {\n\t\t\t\tpanic(\"failed to get instance from context\")\n\t\t\t}\n\t\t\treq := <-instance.reqCh\n\n\t\t\t_, span := trace.Trace(instance.reqCtx, \"HostFunction.read_length\")\n\t\t\tspan.SetAttributes(trace.StringAttr(\"instance_id\", instance.id))\n\t\t\tdefer span.End()\n\n\t\t\tinstance.req = req\n\t\t\t// Since the request needs to be referenced again in the `read` host function, it is stored in instance.req.\n\t\t\t// These functions are evaluated sequentially, so they are thread-safe.\n\t\t\tstack[0] = uint64(len(req))\n\t\t}),\n\t\t[]api.ValueType{},\n\t\t[]api.ValueType{api.ValueTypeI32},\n\t).Export(\"read_length\")\n\thost.NewFunctionBuilder().WithGoModuleFunction(\n\t\tapi.GoModuleFunc(func(ctx context.Context, mod api.Module, stack []uint64) {\n\t\t\tinstance := getInstanceFromContext(ctx)\n\t\t\tif instance == nil {\n\t\t\t\tpanic(\"failed to get instance from context\")\n\t\t\t}\n\t\t\t_, span := trace.Trace(instance.reqCtx, \"HostFunction.read\")\n\t\t\tspan.SetAttributes(trace.StringAttr(\"instance_id\", instance.id))\n\t\t\tdefer span.End()\n\n\t\t\t// instance.req is always initialized with the correct value inside the `read_length` host function.\n\t\t\t// The `read_length` host function and the `read` host function are always executed sequentially.\n\t\t\tif ok := mod.Memory().Write(uint32(stack[0]), instance.req); !ok { //nolint:gosec\n\t\t\t\tpanic(\"failed to write plugin request content\")\n\t\t\t}\n\t\t}),\n\t\t[]api.ValueType{api.ValueTypeI32},\n\t\t[]api.ValueType{},\n\t).Export(\"read\")\n\thost.NewFunctionBuilder().WithGoModuleFunction(\n\t\tapi.GoModuleFunc(func(ctx context.Context, mod api.Module, stack []uint64) {\n\t\t\tinstance := getInstanceFromContext(ctx)\n\t\t\tif instance == nil {\n\t\t\t\tpanic(\"failed to get instance from context\")\n\t\t\t}\n\t\t\t_, span := trace.Trace(instance.reqCtx, \"HostFunction.write\")\n\t\t\tspan.SetAttributes(trace.StringAttr(\"instance_id\", instance.id))\n\t\t\tdefer span.End()\n\n\t\t\t//nolint:gosec\n\t\t\tb, ok := mod.Memory().Read(uint32(stack[0]), uint32(stack[1]))\n\t\t\tif !ok {\n\t\t\t\tpanic(\"failed to read memory from plugin\")\n\t\t\t}\n\t\t\tinstance.resCh <- b\n\t\t}),\n\t\t[]api.ValueType{api.ValueTypeI32, api.ValueTypeI32},\n\t\t[]api.ValueType{},\n\t).Export(\"write\")\n\tif _, err := host.Instantiate(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\treturn ret, nil\n}\n\ntype instanceKey struct{}\n\nfunc getInstanceFromContext(ctx context.Context) *CELPluginInstance {\n\tv := ctx.Value(instanceKey{})\n\tif v == nil {\n\t\treturn nil\n\t}\n\treturn v.(*CELPluginInstance)\n}\n\nfunc withInstance(ctx context.Context, instance *CELPluginInstance) context.Context {\n\treturn context.WithValue(ctx, instanceKey{}, instance)\n}\n\nfunc getCompilationCache(name, baseDir string) wazero.CompilationCache {\n\tif baseDir == \"\" {\n\t\ttmpDir := os.TempDir()\n\t\tif tmpDir == \"\" {\n\t\t\treturn nil\n\t\t}\n\t\tbaseDir = tmpDir\n\t}\n\tcacheDir := filepath.Join(baseDir, \"grpc-federation\", name)\n\tif _, err := os.Stat(cacheDir); err != nil {\n\t\tif err := os.MkdirAll(cacheDir, 0o755); err != nil {\n\t\t\treturn nil\n\t\t}\n\t}\n\tcache, err := wazero.NewCompilationCacheWithDir(cacheDir)\n\tif err != nil {\n\t\treturn nil\n\t}\n\treturn cache\n}\n\nfunc (p *CELPlugin) Close() {\n\tp.instanceMu.Lock()\n\tp.instance.Close()\n\tp.instanceMu.Unlock()\n\n\tbackup := <-p.backupInstance\n\tbackup.Close()\n}\n\n// If we treat a CELPluginInstance directly as a CELLibrary, any CELProgram once created will be cached and reused,\n// so the CELPluginInstance that was initially bound to the CELProgram will be captured and continually used.\n// Therefore, in order to switch the CELPluginInstance during operation, we need to treat the CELPlugin as a CELLibrary.\nfunc (p *CELPlugin) CompileOptions() []cel.EnvOption {\n\tvar opts []cel.EnvOption\n\tfor _, fn := range p.cfg.Functions {\n\t\tfn := fn\n\t\tif fn.IsMethod {\n\t\t\topts = append(opts,\n\t\t\t\tBindMemberFunction(\n\t\t\t\t\tfn.Name,\n\t\t\t\t\tMemberOverloadFunc(fn.ID, fn.Args[0], fn.Args[1:], fn.Return, func(ctx context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\t\treturn p.Call(ctx, fn, append([]ref.Val{self}, args...)...)\n\t\t\t\t\t}),\n\t\t\t\t)...,\n\t\t\t)\n\t\t} else {\n\t\t\topts = append(opts,\n\t\t\t\tBindFunction(\n\t\t\t\t\tfn.Name,\n\t\t\t\t\tOverloadFunc(fn.ID, fn.Args, fn.Return, func(ctx context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\t\treturn p.Call(ctx, fn, args...)\n\t\t\t\t\t}),\n\t\t\t\t)...,\n\t\t\t)\n\t\t}\n\t}\n\treturn opts\n}\n\nfunc (p *CELPlugin) Call(ctx context.Context, fn *CELFunction, args ...ref.Val) ref.Val {\n\tctx, span := trace.Trace(ctx, fn.ID)\n\tdefer span.End()\n\n\tmd, ok := metadata.FromIncomingContext(ctx)\n\tif !ok {\n\t\tmd = make(metadata.MD)\n\t}\n\tinstance, err := p.getInstance(ctx)\n\tif err != nil {\n\t\treturn types.NewErrFromString(err.Error())\n\t}\n\tspan.SetAttributes(trace.StringAttr(\"instance_id\", instance.id))\n\tret, err := instance.Call(ctx, fn, md, args...)\n\tif err != nil {\n\t\t// If an error is returned from instance.Call(), it indicates either an issue with the plugin's encode/decode logic or a problem with the instance itself.\n\t\t// Since both are critical errors, the system will attempt to recover by switching to a backup instance.\n\n\t\t// Basically, the problematic instance should have already been closed at this point.\n\t\t// Therefore, processing with the backup instance is attempted only if the instance has indeed been closed.\n\t\tif instance.closed {\n\t\t\t// Since getInstance() always returns an available instance, it will return the backup instance if the active instance has been closed.\n\t\t\tinstance, err := p.getInstance(ctx)\n\t\t\tif err != nil {\n\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t}\n\t\t\tspan.SetAttributes(trace.StringAttr(\"instance_id\", instance.id))\n\t\t\tretryRet, err := instance.Call(ctx, fn, md, args...)\n\t\t\tif err != nil {\n\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t}\n\t\t\treturn retryRet\n\t\t} else {\n\t\t\treturn types.NewErrFromString(err.Error())\n\t\t}\n\t}\n\treturn ret\n}\n\nfunc (p *CELPlugin) ProgramOptions() []cel.ProgramOption {\n\treturn []cel.ProgramOption{}\n}\n\n// CreateInstance is called when initializing the gRPC Federation service.\n// In addition to calling ValidatePlugin to check the plugin version, it also creates a backupInstance to switch to in case an error occurs in the main instance.\nfunc (p *CELPlugin) CreateInstance(ctx context.Context, celRegistry *types.Registry) (*CELPluginInstance, error) {\n\tp.celRegistry = celRegistry\n\tinstance, err := p.createInstance(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tp.instanceMu.Lock()\n\tp.instance = instance\n\tp.instanceMu.Unlock()\n\n\tp.createBackupInstance(ctx)\n\treturn instance, nil\n}\n\nfunc (p *CELPlugin) Cleanup() {\n\tif instance := p.getCurrentInstance(); instance != nil {\n\t\tinstance.enqueueGC()\n\t}\n}\n\nfunc (p *CELPlugin) createBackupInstance(ctx context.Context) {\n\tgo func() {\n\t\tinstance, err := p.createInstance(ctx)\n\t\tif err != nil {\n\t\t\tp.backupInstance <- nil\n\t\t} else {\n\t\t\tp.backupInstance <- instance\n\t\t}\n\t}()\n}\n\nfunc (p *CELPlugin) getInstance(ctx context.Context) (*CELPluginInstance, error) {\n\tif instance := p.getCurrentInstance(); instance != nil {\n\t\treturn instance, nil\n\t}\n\n\tinstance := <-p.backupInstance\n\tif instance == nil {\n\t\treturn nil, errors.New(\"grpc-federation: failed to get backup cel plugin instance\")\n\t}\n\n\tp.instanceMu.Lock()\n\tp.instance = instance\n\tp.instanceMu.Unlock()\n\n\tp.createBackupInstance(ctx)\n\treturn instance, nil\n}\n\nfunc (p *CELPlugin) getCurrentInstance() *CELPluginInstance {\n\tp.instanceMu.RLock()\n\tdefer p.instanceMu.RUnlock()\n\n\tif p.instance != nil && !p.instance.closed {\n\t\treturn p.instance\n\t}\n\treturn nil\n}\n\nfunc (p *CELPlugin) createInstance(ctx context.Context) (*CELPluginInstance, error) {\n\tenvs := getEnvs()\n\tmodCfg, networkModCfg := addModuleConfigByCapability(\n\t\tp.cfg.Capability,\n\t\twazero.NewModuleConfig().\n\t\t\tWithSysWalltime().\n\t\t\tWithSysNanosleep().\n\t\t\tWithSysNanotime().\n\t\t\tWithStdout(os.Stdout).\n\t\t\tWithStderr(os.Stderr).\n\t\t\tWithArgs(\"plugin\"),\n\t\timports.NewBuilder().\n\t\t\tWithStdio(-1, int(os.Stdout.Fd()), int(os.Stderr.Fd())).\n\t\t\tWithSocketsExtension(\"wasmedgev2\", p.mod),\n\t\tenvs,\n\t)\n\n\tif p.cfg.Capability != nil && p.cfg.Capability.Network != nil {\n\t\tvar err error\n\t\tctx, _, err = networkModCfg.Instantiate(ctx, p.wasmRuntime)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tctx, cancel := context.WithCancel(context.WithoutCancel(ctx))\n\n\tconst gcQueueLength = 1\n\tinstance := &CELPluginInstance{\n\t\tname:        p.cfg.Name,\n\t\tfunctions:   p.cfg.Functions,\n\t\tcelRegistry: p.celRegistry,\n\t\treqCtx:      ctx,\n\t\t// To prevent the write() function from blocking,\n\t\t// a channel with capacity is used instead of an unbuffered channel.\n\t\treqCh:            make(chan []byte, 1),\n\t\tresCh:            make(chan []byte),\n\t\tgcQueue:          make(chan struct{}, gcQueueLength),\n\t\tgcErrCh:          make(chan error, 1),\n\t\tinstanceModErrCh: make(chan error, 1),\n\t\tcancelFn:         cancel,\n\t}\n\tinstance.id = fmt.Sprintf(\"%s-%p\", p.cfg.Name, instance)\n\n\t// setting the buffer size to 1 ensures that the function can exit even if there is no receiver.\n\tgo func() {\n\t\t_, err := p.wasmRuntime.InstantiateModule(withInstance(ctx, instance), p.mod, modCfg)\n\t\tinstance.instanceModErrCh <- err\n\t}()\n\n\t// start GC thread.\n\t// It is enqueued into gcQueue using the `instance.GC()` function.\n\tgo func() {\n\t\tfor range instance.gcQueue {\n\t\t\tif err := instance.startGC(ctx); err != nil {\n\t\t\t\t// If a problem occurs in startGC, the instance is not immediately closed,\n\t\t\t\t// so it is essential to always use break to ensure that startGC is not called.\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}()\n\treturn instance, nil\n}\n\nfunc addModuleConfigByCapability(capability *CELPluginCapability, cfg wazero.ModuleConfig, nwcfg *imports.Builder, envs Envs) (wazero.ModuleConfig, *imports.Builder) {\n\tcfg, nwcfg = addModuleConfigByEnvCapability(capability, cfg, nwcfg, envs)\n\tcfg, nwcfg = addModuleConfigByFileSystemCapability(capability, cfg, nwcfg)\n\treturn cfg, nwcfg\n}\n\nvar ignoreEnvNameMap = map[string]struct{}{\n\t// If a value greater than 1 is passed to GOMAXPROCS, a panic occurs on the plugin side,\n\t// so make sure not to pass it explicitly.\n\t\"GOMAXPROCS\": {},\n\n\t// There is a bug in Go's GC that can cause processing to hang and never return,\n\t// so we always turn off GOGC and disable the automatic GC trigger.\n\t// Instead, we choose a workaround where the host side periodically forces a GC execution,\n\t// and in case of any issues, we recover by switching to a backup instance.\n\t\"GOGC\": {},\n}\n\ntype Envs []*Env\n\nfunc (e Envs) Strings() []string {\n\tret := make([]string, 0, len(e))\n\tfor _, env := range e {\n\t\tret = append(ret, env.String())\n\t}\n\treturn ret\n}\n\ntype Env struct {\n\tkey   string\n\tvalue string\n}\n\nconst pluginEnvPrefix = \"GRPC_FEDERATION_PLUGIN_\"\n\nfunc (e *Env) String() string {\n\treturn e.key + \"=\" + e.value\n}\n\nfunc getEnvs() Envs {\n\tenvs := os.Environ()\n\tenvMap := make(map[string]*Env)\n\tfor _, kv := range envs {\n\t\ti := strings.IndexByte(kv, '=')\n\t\tkey := kv[:i]\n\t\tvalue := kv[i+1:]\n\n\t\t// If the prefix is GRPC_FEDERATION_PLUGIN_, the environment variable will be set for the plugin with that prefix removed.\n\t\t// If an environment variable with the same name is already set, it will be overwritten.\n\t\tif strings.HasPrefix(key, pluginEnvPrefix) {\n\t\t\trenamedKey := strings.TrimPrefix(key, pluginEnvPrefix)\n\t\t\tif _, exists := ignoreEnvNameMap[renamedKey]; exists {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tenvMap[key] = &Env{key: renamedKey, value: value}\n\t\t} else if _, exists := envMap[key]; exists {\n\t\t\tcontinue\n\t\t} else if _, exists := ignoreEnvNameMap[key]; exists {\n\t\t\tcontinue\n\t\t} else {\n\t\t\tenvMap[key] = &Env{key: key, value: value}\n\t\t}\n\t}\n\tenvMap[\"GOGC\"] = &Env{key: \"GOGC\", value: \"off\"}\n\tret := make(Envs, 0, len(envMap))\n\tfor _, env := range envMap {\n\t\tret = append(ret, env)\n\t}\n\treturn ret\n}\n\nfunc addModuleConfigByEnvCapability(capability *CELPluginCapability, cfg wazero.ModuleConfig, nwcfg *imports.Builder, envs Envs) (wazero.ModuleConfig, *imports.Builder) {\n\tif capability == nil || capability.Env == nil {\n\t\treturn cfg.WithEnv(\"GOGC\", \"off\"), nwcfg.WithEnv(\"GOGC=off\")\n\t}\n\n\tenvCfg := capability.Env\n\tenvNameMap := make(map[string]struct{})\n\tfor _, name := range envCfg.Names {\n\t\tenvName := strings.ToUpper(name)\n\t\tenvNameMap[envName] = struct{}{}\n\t}\n\tif envCfg.All {\n\t\tfor _, env := range envs {\n\t\t\tcfg = cfg.WithEnv(env.key, env.value)\n\t\t}\n\t\tnwcfg = nwcfg.WithEnv(envs.Strings()...)\n\t} else {\n\t\tvar filteredEnvs []string\n\t\tfor _, env := range envs {\n\t\t\tif _, exists := envNameMap[env.key]; !exists {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tcfg = cfg.WithEnv(env.key, env.value)\n\t\t\tfilteredEnvs = append(filteredEnvs, env.String())\n\t\t}\n\t\tnwcfg = nwcfg.WithEnv(filteredEnvs...)\n\t}\n\treturn cfg, nwcfg\n}\n\nfunc addModuleConfigByFileSystemCapability(capability *CELPluginCapability, cfg wazero.ModuleConfig, nwcfg *imports.Builder) (wazero.ModuleConfig, *imports.Builder) {\n\tif capability == nil || capability.FileSystem == nil {\n\t\treturn cfg, nwcfg\n\t}\n\tfs := capability.FileSystem\n\tmountPath := \"/\"\n\tif fs.MountPath != \"\" {\n\t\tmountPath = fs.MountPath\n\t}\n\treturn cfg.WithFSConfig(\n\t\twazero.NewFSConfig().WithFSMount(os.DirFS(mountPath), \"\"),\n\t), nwcfg.WithDirs(mountPath)\n}\n\ntype CELPluginInstance struct {\n\tid               string\n\tname             string\n\tfunctions        []*CELFunction\n\tcelRegistry      *types.Registry\n\treqCtx           context.Context\n\treq              []byte\n\treqCh            chan []byte\n\tresCh            chan []byte\n\tinstanceModErrCh chan error\n\tinstanceModErr   error\n\tgcErrCh          chan error\n\tclosed           bool\n\tmu               sync.Mutex\n\tgcQueue          chan struct{}\n\tcancelFn         context.CancelFunc\n}\n\nconst PluginProtocolVersion = 2\n\ntype PluginVersionSchema struct {\n\tProtocolVersion   int      `json:\"protocolVersion\"`\n\tFederationVersion string   `json:\"grpcFederationVersion\"`\n\tFunctions         []string `json:\"functions\"`\n}\n\nconst (\n\tVersionCommand = \"version\"\n\tExitCommand    = \"exit\"\n\tGCCommand      = \"gc\"\n)\n\nfunc (i *CELPluginInstance) ValidatePlugin(ctx context.Context) error {\n\tctx, span := trace.Trace(ctx, \"ValidatePlugin\")\n\tdefer span.End()\n\n\ti.mu.Lock()\n\tdefer i.mu.Unlock()\n\n\tif err := i.write(ctx, []byte(VersionCommand)); err != nil {\n\t\treturn fmt.Errorf(\"failed to send cel protocol version command: %w\", err)\n\t}\n\tcontent, err := i.recv(ctx)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to receive cel protocol version command: %w\", err)\n\t}\n\tvar v PluginVersionSchema\n\tif err := json.Unmarshal(content, &v); err != nil {\n\t\treturn fmt.Errorf(\"failed to decode cel plugin's version schema: %w\", err)\n\t}\n\tif v.ProtocolVersion != PluginProtocolVersion {\n\t\treturn fmt.Errorf(\n\t\t\t\"grpc-federation: cel plugin protocol version mismatch: expected version %d but got %d. plugin's gRPC Federation version is %s\",\n\t\t\tPluginProtocolVersion,\n\t\t\tv.ProtocolVersion,\n\t\t\tv.FederationVersion,\n\t\t)\n\t}\n\timplementedMethodMap := make(map[string]struct{})\n\tfor _, fn := range v.Functions {\n\t\timplementedMethodMap[fn] = struct{}{}\n\t}\n\n\tvar missingFunctions []string\n\tfor _, fn := range i.functions {\n\t\tif _, exists := implementedMethodMap[fn.ID]; !exists {\n\t\t\tmissingFunctions = append(missingFunctions, fn.ID)\n\t\t}\n\t}\n\tif len(missingFunctions) != 0 {\n\t\treturn fmt.Errorf(\"grpc-federation: cel plugin functions are missing: [%v]\", missingFunctions)\n\t}\n\treturn nil\n}\n\nfunc (i *CELPluginInstance) write(ctx context.Context, cmd []byte) error {\n\tctx, span := trace.Trace(ctx, \"write\")\n\tdefer span.End()\n\n\tif i.closed {\n\t\treturn i.instanceModErr\n\t}\n\ti.reqCtx = ctx\n\ti.reqCh <- cmd\n\treturn nil\n}\n\nfunc (i *CELPluginInstance) Close() error {\n\tif i == nil {\n\t\treturn nil\n\t}\n\n\ti.mu.Lock()\n\tdefer i.mu.Unlock()\n\n\treturn i.close()\n}\n\nfunc (i *CELPluginInstance) close() error {\n\tif i.closed {\n\t\treturn i.instanceModErr\n\t}\n\n\tdefer func() { i.closeResources(nil) }()\n\n\t// start termination process.\n\ti.reqCh <- []byte(ExitCommand)\n\tselect {\n\tcase err := <-i.instanceModErrCh:\n\t\treturn err\n\tcase err := <-i.gcErrCh:\n\t\treturn err\n\t}\n}\n\nfunc (i *CELPluginInstance) closeResources(instanceModErr error) {\n\ti.instanceModErr = instanceModErr\n\ti.closed = true\n\tclose(i.gcQueue)\n}\n\nfunc (i *CELPluginInstance) LibraryName() string {\n\treturn i.name\n}\n\nfunc (i *CELPluginInstance) enqueueGC() {\n\tif i.closed {\n\t\treturn\n\t}\n\n\tselect {\n\tcase i.gcQueue <- struct{}{}:\n\tdefault:\n\t\t// If the capacity of gcQueue is exceeded, the trigger event is discarded.\n\t}\n}\n\n// timeout for runtime.GC() to 10 seconds.\nvar gcWaitTimeout = 10 * time.Second\n\nfunc (i *CELPluginInstance) startGC(ctx context.Context) error {\n\tctx, span := trace.Trace(ctx, \"github.com/mercari/grpc-federation.CELPluginInstance.startGC\")\n\tdefer span.End()\n\n\ti.mu.Lock()\n\tdefer i.mu.Unlock()\n\n\tif i.closed {\n\t\treturn nil\n\t}\n\n\tctx, cancel := context.WithTimeout(ctx, gcWaitTimeout)\n\tdefer cancel()\n\n\t_ = i.write(ctx, []byte(GCCommand))\n\n\tselect {\n\tcase <-ctx.Done():\n\t\terr := ErrWasmGCHang\n\n\t\t// To track inexplicable errors, they are output as warnings.\n\t\tlog.Logger(ctx).WarnContext(ctx, err.Error())\n\n\t\t// To forcibly terminate the instance, we will call cancel function.\n\t\t// However, it's unclear whether this will be effective if the process is stuck at runtime.GC().\n\t\t// Therefore, we will use gcErrCh to handle errors appropriately.\n\t\t// If the instance can be shut down properly, we can avoid memory leaks.\n\t\ti.cancelFn()\n\n\t\t// If a value is sent to resCh after a cancel, it cannot be received correctly.\n\t\t// Therefore, to prevent waiting for a value on resCh in the next plugin request,\n\t\t// an error is sent to gcErrCh, and the system prioritizes waiting on gcErrCh over resCh.\n\t\t// This prevents invalid reception from resCh.\n\t\t// Please see recv() method.\n\t\ti.gcErrCh <- err\n\t\treturn err\n\tcase err := <-i.instanceModErrCh:\n\t\treturn err\n\tcase <-i.resCh:\n\t\treturn nil\n\t}\n}\n\nfunc (i *CELPluginInstance) Call(ctx context.Context, fn *CELFunction, md metadata.MD, args ...ref.Val) (ref.Val, error) {\n\tctx, span := trace.Trace(ctx, \"Call\")\n\tdefer span.End()\n\n\ti.mu.Lock()\n\tdefer i.mu.Unlock()\n\n\tif err := i.sendRequest(ctx, fn, md, args...); err != nil {\n\t\treturn nil, err\n\t}\n\treturn i.recvResponse(ctx, fn)\n}\n\nfunc (i *CELPluginInstance) sendRequest(ctx context.Context, fn *CELFunction, md metadata.MD, args ...ref.Val) error {\n\tctx, span := trace.Trace(ctx, \"sendRequest\")\n\tdefer span.End()\n\n\treq := &plugin.CELPluginRequest{Method: fn.ID}\n\tfor key, values := range md {\n\t\treq.Metadata = append(req.Metadata, &plugin.CELPluginGRPCMetadata{\n\t\t\tKey:    key,\n\t\t\tValues: values,\n\t\t})\n\t}\n\tfor idx, arg := range args {\n\t\tpluginArg, err := i.refToCELPluginValue(fn.Args[idx], arg)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treq.Args = append(req.Args, pluginArg)\n\t}\n\n\tencoded, err := protojson.Marshal(req)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := i.write(ctx, append(encoded, '\\n')); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (i *CELPluginInstance) recvResponse(ctx context.Context, fn *CELFunction) (ref.Val, error) {\n\tctx, span := trace.Trace(ctx, \"recvResponse\")\n\tdefer span.End()\n\n\tcontent, err := i.recv(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar res plugin.CELPluginResponse\n\tif err := protojson.Unmarshal(content, &res); err != nil {\n\t\treturn nil, fmt.Errorf(\"grpc-federation: failed to decode response: %w\", err)\n\t}\n\tif res.Error != \"\" {\n\t\treturn types.NewErrFromString(res.Error), nil\n\t}\n\treturn i.celPluginValueToRef(fn, fn.Return, res.Value), nil\n}\n\nfunc (i *CELPluginInstance) recv(ctx context.Context) ([]byte, error) {\n\t_, span := trace.Trace(ctx, \"recv\")\n\tdefer span.End()\n\n\tif i.closed {\n\t\treturn nil, errors.New(\"grpc-federation: plugin has already been closed\")\n\t}\n\n\tselect {\n\tcase err := <-i.instanceModErrCh:\n\t\t// If the module instance is terminated,\n\t\t// it is considered that the termination process has been completed.\n\t\ti.closeResources(err)\n\t\treturn nil, err\n\tcase err := <-i.gcErrCh:\n\t\ti.closeResources(err)\n\t\treturn nil, err\n\tdefault:\n\t\t// We explicitly lower the priority by using \"default\" so that resCh is only awaited when no error has occurred.\n\t\tres := <-i.resCh\n\t\treturn res, nil\n\t}\n}\n\nfunc (i *CELPluginInstance) refToCELPluginValue(typ *cel.Type, v ref.Val) (*plugin.CELPluginValue, error) {\n\tswitch typ.Kind() {\n\tcase types.ListKind:\n\t\telemType := typ.Parameters()[0]\n\t\tslice := reflect.ValueOf(v.Value())\n\t\tlist := &plugin.CELPluginListValue{}\n\t\tfor idx := 0; idx < slice.Len(); idx++ {\n\t\t\tsrc := slice.Index(idx).Interface()\n\t\t\tval := i.celRegistry.NativeToValue(src)\n\t\t\tif types.IsError(val) {\n\t\t\t\treturn nil, fmt.Errorf(\"failed to convert %T to CEL value: %v\", src, val.Value())\n\t\t\t}\n\t\t\tvalue, err := i.refToCELPluginValue(elemType, val)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tlist.Values = append(list.Values, value)\n\t\t}\n\t\treturn &plugin.CELPluginValue{\n\t\t\tValue: &plugin.CELPluginValue_List{\n\t\t\t\tList: list,\n\t\t\t},\n\t\t}, nil\n\tcase types.BoolKind:\n\t\tvv := v.(types.Bool)\n\t\treturn &plugin.CELPluginValue{\n\t\t\tValue: &plugin.CELPluginValue_Bool{\n\t\t\t\tBool: bool(vv),\n\t\t\t},\n\t\t}, nil\n\tcase types.DoubleKind:\n\t\tvv := v.(types.Double)\n\t\treturn &plugin.CELPluginValue{\n\t\t\tValue: &plugin.CELPluginValue_Double{\n\t\t\t\tDouble: float64(vv),\n\t\t\t},\n\t\t}, nil\n\tcase types.IntKind:\n\t\tvv := v.(types.Int)\n\t\treturn &plugin.CELPluginValue{\n\t\t\tValue: &plugin.CELPluginValue_Int64{\n\t\t\t\tInt64: int64(vv),\n\t\t\t},\n\t\t}, nil\n\tcase types.BytesKind:\n\t\tvv := v.(types.Bytes)\n\t\treturn &plugin.CELPluginValue{\n\t\t\tValue: &plugin.CELPluginValue_Bytes{\n\t\t\t\tBytes: []byte(vv),\n\t\t\t},\n\t\t}, nil\n\tcase types.StringKind:\n\t\tvv := v.(types.String)\n\t\treturn &plugin.CELPluginValue{\n\t\t\tValue: &plugin.CELPluginValue_String_{\n\t\t\t\tString_: string(vv),\n\t\t\t},\n\t\t}, nil\n\tcase types.UintKind:\n\t\tvv := v.(types.Uint)\n\t\treturn &plugin.CELPluginValue{\n\t\t\tValue: &plugin.CELPluginValue_Uint64{\n\t\t\t\tUint64: uint64(vv),\n\t\t\t},\n\t\t}, nil\n\tcase types.StructKind:\n\t\tswitch vv := v.Value().(type) {\n\t\tcase proto.Message:\n\t\t\tany, ok := vv.(*anypb.Any)\n\t\t\tif !ok {\n\t\t\t\tanyValue, err := anypb.New(vv)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, fmt.Errorf(\"grpc-federation: failed to create any instance: %w\", err)\n\t\t\t\t}\n\t\t\t\tany = anyValue\n\t\t\t}\n\t\t\treturn &plugin.CELPluginValue{\n\t\t\t\tValue: &plugin.CELPluginValue_Message{\n\t\t\t\t\tMessage: any,\n\t\t\t\t},\n\t\t\t}, nil\n\t\tdefault:\n\t\t\treturn nil, fmt.Errorf(\n\t\t\t\t`grpc-federation: currently unsupported native proto message \"%T\"`,\n\t\t\t\tv.Value(),\n\t\t\t)\n\t\t}\n\t}\n\treturn nil, fmt.Errorf(`grpc-federation: found unexpected cel function's argument type \"%s\"`, typ)\n}\n\nfunc (i *CELPluginInstance) celPluginValueToRef(fn *CELFunction, typ *cel.Type, v *plugin.CELPluginValue) ref.Val {\n\tswitch typ.Kind() {\n\tcase types.ListKind:\n\t\telemType := typ.Parameters()[0]\n\t\tvalues := make([]ref.Val, 0, len(v.GetList().GetValues()))\n\t\tfor _, vv := range v.GetList().GetValues() {\n\t\t\tvalue := i.celPluginValueToRef(fn, elemType, vv)\n\t\t\tif types.IsError(value) {\n\t\t\t\t// return error value\n\t\t\t\treturn value\n\t\t\t}\n\t\t\tvalues = append(values, value)\n\t\t}\n\t\treturn types.NewRefValList(i.celRegistry, values)\n\tcase types.BoolKind:\n\t\treturn types.Bool(v.GetBool())\n\tcase types.BytesKind:\n\t\treturn types.Bytes(v.GetBytes())\n\tcase types.DoubleKind:\n\t\treturn types.Double(v.GetDouble())\n\tcase types.ErrorKind:\n\t\treturn types.NewErrFromString(v.GetString_())\n\tcase types.IntKind:\n\t\treturn types.Int(v.GetInt64())\n\tcase types.StringKind:\n\t\treturn types.String(v.GetString_())\n\tcase types.UintKind:\n\t\treturn types.Uint(v.GetUint64())\n\tcase types.StructKind:\n\t\treturn i.celRegistry.NativeToValue(v.GetMessage())\n\t}\n\treturn types.NewErr(\"grpc-federation: unknown result type %s from %s function\", typ, fn.Name)\n}\n"
  },
  {
    "path": "grpc/federation/cel/plugin_test.go",
    "content": "package cel\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/google/cel-go/common/types\"\n)\n\nfunc TestPlugin(t *testing.T) {\n\tctx := context.Background()\n\tsrcPath := filepath.Join(\"testdata\", \"plugin\", \"main.go\")\n\n\twasmPath := filepath.Join(t.TempDir(), \"test.wasm\")\n\tcmd := exec.CommandContext(ctx, \"go\", \"build\", \"-o\", wasmPath, srcPath)\n\tcmd.Env = append(os.Environ(), \"GOOS=wasip1\", \"GOARCH=wasm\")\n\tif b, err := cmd.CombinedOutput(); err != nil {\n\t\tt.Fatalf(\"failed to build main.go: %q: %v\", b, err)\n\t}\n\tdefer os.Remove(wasmPath)\n\n\tf, err := os.ReadFile(wasmPath)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\thash := sha256.Sum256(f)\n\tfn := &CELFunction{\n\t\tName:   \"foo\",\n\t\tID:     \"foo\",\n\t\tReturn: types.IntType,\n\t}\n\tplugin, err := NewCELPlugin(ctx, CELPluginConfig{\n\t\tName: \"test\",\n\t\tWasm: WasmConfig{\n\t\t\tReader: bytes.NewReader(f),\n\t\t\tSha256: hex.EncodeToString(hash[:]),\n\t\t},\n\t\tFunctions: []*CELFunction{fn},\n\t\tCacheDir:  t.TempDir(),\n\t\tCapability: &CELPluginCapability{\n\t\t\t// enable wasi-go host function.\n\t\t\tNetwork: &CELPluginNetworkCapability{},\n\t\t},\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif _, err := plugin.CreateInstance(ctx, nil); err != nil {\n\t\tt.Fatal(err)\n\t}\n\tv := plugin.Call(ctx, fn)\n\tiv, ok := v.(types.Int)\n\tif !ok {\n\t\tt.Fatalf(\"unexpected return type %T; want types.Int\", v)\n\t}\n\tif int(iv) != 10 {\n\t\tt.Fatalf(\"failed to get response value: %v\", iv)\n\t}\n}\n"
  },
  {
    "path": "grpc/federation/cel/private.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: grpc/federation/private.proto\n\npackage cel\n\nimport (\n\terrdetails \"google.golang.org/genproto/googleapis/rpc/errdetails\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tanypb \"google.golang.org/protobuf/types/known/anypb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// Error type information of the error variable used when evaluating CEL.\ntype Error struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tCode                 int32                             `protobuf:\"varint,1,opt,name=code,proto3\" json:\"code,omitempty\"`\n\tMessage              string                            `protobuf:\"bytes,2,opt,name=message,proto3\" json:\"message,omitempty\"`\n\tDetails              []*anypb.Any                      `protobuf:\"bytes,3,rep,name=details,proto3\" json:\"details,omitempty\"`\n\tCustomMessages       []*anypb.Any                      `protobuf:\"bytes,4,rep,name=custom_messages,json=customMessages,proto3\" json:\"custom_messages,omitempty\"`\n\tErrorInfo            []*errdetails.ErrorInfo           `protobuf:\"bytes,5,rep,name=error_info,json=errorInfo,proto3\" json:\"error_info,omitempty\"`\n\tRetryInfo            []*errdetails.RetryInfo           `protobuf:\"bytes,6,rep,name=retry_info,json=retryInfo,proto3\" json:\"retry_info,omitempty\"`\n\tDebugInfo            []*errdetails.DebugInfo           `protobuf:\"bytes,7,rep,name=debug_info,json=debugInfo,proto3\" json:\"debug_info,omitempty\"`\n\tQuotaFailures        []*errdetails.QuotaFailure        `protobuf:\"bytes,8,rep,name=quota_failures,json=quotaFailures,proto3\" json:\"quota_failures,omitempty\"`\n\tPreconditionFailures []*errdetails.PreconditionFailure `protobuf:\"bytes,9,rep,name=precondition_failures,json=preconditionFailures,proto3\" json:\"precondition_failures,omitempty\"`\n\tBadRequests          []*errdetails.BadRequest          `protobuf:\"bytes,10,rep,name=bad_requests,json=badRequests,proto3\" json:\"bad_requests,omitempty\"`\n\tRequestInfo          []*errdetails.RequestInfo         `protobuf:\"bytes,11,rep,name=request_info,json=requestInfo,proto3\" json:\"request_info,omitempty\"`\n\tResourceInfo         []*errdetails.ResourceInfo        `protobuf:\"bytes,12,rep,name=resource_info,json=resourceInfo,proto3\" json:\"resource_info,omitempty\"`\n\tHelps                []*errdetails.Help                `protobuf:\"bytes,13,rep,name=helps,proto3\" json:\"helps,omitempty\"`\n\tLocalizedMessages    []*errdetails.LocalizedMessage    `protobuf:\"bytes,14,rep,name=localized_messages,json=localizedMessages,proto3\" json:\"localized_messages,omitempty\"`\n}\n\nfunc (x *Error) Reset() {\n\t*x = Error{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_private_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Error) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Error) ProtoMessage() {}\n\nfunc (x *Error) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_private_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Error.ProtoReflect.Descriptor instead.\nfunc (*Error) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_private_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Error) GetCode() int32 {\n\tif x != nil {\n\t\treturn x.Code\n\t}\n\treturn 0\n}\n\nfunc (x *Error) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\nfunc (x *Error) GetDetails() []*anypb.Any {\n\tif x != nil {\n\t\treturn x.Details\n\t}\n\treturn nil\n}\n\nfunc (x *Error) GetCustomMessages() []*anypb.Any {\n\tif x != nil {\n\t\treturn x.CustomMessages\n\t}\n\treturn nil\n}\n\nfunc (x *Error) GetErrorInfo() []*errdetails.ErrorInfo {\n\tif x != nil {\n\t\treturn x.ErrorInfo\n\t}\n\treturn nil\n}\n\nfunc (x *Error) GetRetryInfo() []*errdetails.RetryInfo {\n\tif x != nil {\n\t\treturn x.RetryInfo\n\t}\n\treturn nil\n}\n\nfunc (x *Error) GetDebugInfo() []*errdetails.DebugInfo {\n\tif x != nil {\n\t\treturn x.DebugInfo\n\t}\n\treturn nil\n}\n\nfunc (x *Error) GetQuotaFailures() []*errdetails.QuotaFailure {\n\tif x != nil {\n\t\treturn x.QuotaFailures\n\t}\n\treturn nil\n}\n\nfunc (x *Error) GetPreconditionFailures() []*errdetails.PreconditionFailure {\n\tif x != nil {\n\t\treturn x.PreconditionFailures\n\t}\n\treturn nil\n}\n\nfunc (x *Error) GetBadRequests() []*errdetails.BadRequest {\n\tif x != nil {\n\t\treturn x.BadRequests\n\t}\n\treturn nil\n}\n\nfunc (x *Error) GetRequestInfo() []*errdetails.RequestInfo {\n\tif x != nil {\n\t\treturn x.RequestInfo\n\t}\n\treturn nil\n}\n\nfunc (x *Error) GetResourceInfo() []*errdetails.ResourceInfo {\n\tif x != nil {\n\t\treturn x.ResourceInfo\n\t}\n\treturn nil\n}\n\nfunc (x *Error) GetHelps() []*errdetails.Help {\n\tif x != nil {\n\t\treturn x.Helps\n\t}\n\treturn nil\n}\n\nfunc (x *Error) GetLocalizedMessages() []*errdetails.LocalizedMessage {\n\tif x != nil {\n\t\treturn x.LocalizedMessages\n\t}\n\treturn nil\n}\n\ntype EnumSelector struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tCond bool `protobuf:\"varint,1,opt,name=cond,proto3\" json:\"cond,omitempty\"`\n\t// Types that are assignable to True:\n\t//\n\t//\t*EnumSelector_TrueValue\n\t//\t*EnumSelector_TrueSelector\n\tTrue isEnumSelector_True `protobuf_oneof:\"true\"`\n\t// Types that are assignable to False:\n\t//\n\t//\t*EnumSelector_FalseValue\n\t//\t*EnumSelector_FalseSelector\n\tFalse isEnumSelector_False `protobuf_oneof:\"false\"`\n}\n\nfunc (x *EnumSelector) Reset() {\n\t*x = EnumSelector{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_private_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumSelector) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumSelector) ProtoMessage() {}\n\nfunc (x *EnumSelector) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_private_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumSelector.ProtoReflect.Descriptor instead.\nfunc (*EnumSelector) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_private_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *EnumSelector) GetCond() bool {\n\tif x != nil {\n\t\treturn x.Cond\n\t}\n\treturn false\n}\n\nfunc (m *EnumSelector) GetTrue() isEnumSelector_True {\n\tif m != nil {\n\t\treturn m.True\n\t}\n\treturn nil\n}\n\nfunc (x *EnumSelector) GetTrueValue() int32 {\n\tif x, ok := x.GetTrue().(*EnumSelector_TrueValue); ok {\n\t\treturn x.TrueValue\n\t}\n\treturn 0\n}\n\nfunc (x *EnumSelector) GetTrueSelector() *EnumSelector {\n\tif x, ok := x.GetTrue().(*EnumSelector_TrueSelector); ok {\n\t\treturn x.TrueSelector\n\t}\n\treturn nil\n}\n\nfunc (m *EnumSelector) GetFalse() isEnumSelector_False {\n\tif m != nil {\n\t\treturn m.False\n\t}\n\treturn nil\n}\n\nfunc (x *EnumSelector) GetFalseValue() int32 {\n\tif x, ok := x.GetFalse().(*EnumSelector_FalseValue); ok {\n\t\treturn x.FalseValue\n\t}\n\treturn 0\n}\n\nfunc (x *EnumSelector) GetFalseSelector() *EnumSelector {\n\tif x, ok := x.GetFalse().(*EnumSelector_FalseSelector); ok {\n\t\treturn x.FalseSelector\n\t}\n\treturn nil\n}\n\ntype isEnumSelector_True interface {\n\tisEnumSelector_True()\n}\n\ntype EnumSelector_TrueValue struct {\n\tTrueValue int32 `protobuf:\"varint,2,opt,name=true_value,json=trueValue,proto3,oneof\"`\n}\n\ntype EnumSelector_TrueSelector struct {\n\tTrueSelector *EnumSelector `protobuf:\"bytes,3,opt,name=true_selector,json=trueSelector,proto3,oneof\"`\n}\n\nfunc (*EnumSelector_TrueValue) isEnumSelector_True() {}\n\nfunc (*EnumSelector_TrueSelector) isEnumSelector_True() {}\n\ntype isEnumSelector_False interface {\n\tisEnumSelector_False()\n}\n\ntype EnumSelector_FalseValue struct {\n\tFalseValue int32 `protobuf:\"varint,4,opt,name=false_value,json=falseValue,proto3,oneof\"`\n}\n\ntype EnumSelector_FalseSelector struct {\n\tFalseSelector *EnumSelector `protobuf:\"bytes,5,opt,name=false_selector,json=falseSelector,proto3,oneof\"`\n}\n\nfunc (*EnumSelector_FalseValue) isEnumSelector_False() {}\n\nfunc (*EnumSelector_FalseSelector) isEnumSelector_False() {}\n\nvar File_grpc_federation_private_proto protoreflect.FileDescriptor\n\nvar file_grpc_federation_private_proto_rawDesc = []byte{\n\t0x0a, 0x1d, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,\n\t0x17, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f,\n\t0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x22, 0x88, 0x06, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a,\n\t0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64,\n\t0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x64,\n\t0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41,\n\t0x6e, 0x79, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x3d, 0x0a, 0x0f, 0x63,\n\t0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x04,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x0e, 0x63, 0x75, 0x73, 0x74,\n\t0x6f, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x0a, 0x65, 0x72,\n\t0x72, 0x6f, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x72, 0x72, 0x6f,\n\t0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f,\n\t0x12, 0x34, 0x0a, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x06,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70,\n\t0x63, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x72, 0x65, 0x74,\n\t0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x34, 0x0a, 0x0a, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f,\n\t0x69, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66,\n\t0x6f, 0x52, 0x09, 0x64, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3f, 0x0a, 0x0e,\n\t0x71, 0x75, 0x6f, 0x74, 0x61, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x18, 0x08,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70,\n\t0x63, 0x2e, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x0d,\n\t0x71, 0x75, 0x6f, 0x74, 0x61, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x12, 0x54, 0x0a,\n\t0x15, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61,\n\t0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e,\n\t0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x14, 0x70,\n\t0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75,\n\t0x72, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x0c, 0x62, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65,\n\t0x73, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,\n\t0x74, 0x52, 0x0b, 0x62, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x3a,\n\t0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x0b,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70,\n\t0x63, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x72,\n\t0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3d, 0x0a, 0x0d, 0x72, 0x65,\n\t0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x0c, 0x20, 0x03, 0x28,\n\t0x0b, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52,\n\t0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x65, 0x73,\n\t0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x26, 0x0a, 0x05, 0x68, 0x65, 0x6c,\n\t0x70, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x48, 0x65, 0x6c, 0x70, 0x52, 0x05, 0x68, 0x65, 0x6c, 0x70,\n\t0x73, 0x12, 0x4b, 0x0a, 0x12, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6d,\n\t0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x6c,\n\t0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x11, 0x6c, 0x6f, 0x63,\n\t0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0x95,\n\t0x02, 0x0a, 0x0c, 0x45, 0x6e, 0x75, 0x6d, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12,\n\t0x12, 0x0a, 0x04, 0x63, 0x6f, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x63,\n\t0x6f, 0x6e, 0x64, 0x12, 0x1f, 0x0a, 0x0a, 0x74, 0x72, 0x75, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75,\n\t0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x09, 0x74, 0x72, 0x75, 0x65, 0x56,\n\t0x61, 0x6c, 0x75, 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x74, 0x72, 0x75, 0x65, 0x5f, 0x73, 0x65, 0x6c,\n\t0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72,\n\t0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74,\n\t0x6f, 0x72, 0x48, 0x00, 0x52, 0x0c, 0x74, 0x72, 0x75, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74,\n\t0x6f, 0x72, 0x12, 0x21, 0x0a, 0x0b, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75,\n\t0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x0a, 0x66, 0x61, 0x6c, 0x73, 0x65,\n\t0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x4e, 0x0a, 0x0e, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x5f, 0x73,\n\t0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x53, 0x65, 0x6c, 0x65,\n\t0x63, 0x74, 0x6f, 0x72, 0x48, 0x01, 0x52, 0x0d, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x53, 0x65, 0x6c,\n\t0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x72, 0x75, 0x65, 0x42, 0x07, 0x0a,\n\t0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x42, 0x3c, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,\n\t0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x65, 0x72, 0x63, 0x61, 0x72, 0x69, 0x2f, 0x67, 0x72, 0x70,\n\t0x63, 0x2d, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x67, 0x72, 0x70,\n\t0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x63, 0x65, 0x6c,\n\t0x3b, 0x63, 0x65, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_grpc_federation_private_proto_rawDescOnce sync.Once\n\tfile_grpc_federation_private_proto_rawDescData = file_grpc_federation_private_proto_rawDesc\n)\n\nfunc file_grpc_federation_private_proto_rawDescGZIP() []byte {\n\tfile_grpc_federation_private_proto_rawDescOnce.Do(func() {\n\t\tfile_grpc_federation_private_proto_rawDescData = protoimpl.X.CompressGZIP(file_grpc_federation_private_proto_rawDescData)\n\t})\n\treturn file_grpc_federation_private_proto_rawDescData\n}\n\nvar file_grpc_federation_private_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_grpc_federation_private_proto_goTypes = []interface{}{\n\t(*Error)(nil),                          // 0: grpc.federation.private.Error\n\t(*EnumSelector)(nil),                   // 1: grpc.federation.private.EnumSelector\n\t(*anypb.Any)(nil),                      // 2: google.protobuf.Any\n\t(*errdetails.ErrorInfo)(nil),           // 3: google.rpc.ErrorInfo\n\t(*errdetails.RetryInfo)(nil),           // 4: google.rpc.RetryInfo\n\t(*errdetails.DebugInfo)(nil),           // 5: google.rpc.DebugInfo\n\t(*errdetails.QuotaFailure)(nil),        // 6: google.rpc.QuotaFailure\n\t(*errdetails.PreconditionFailure)(nil), // 7: google.rpc.PreconditionFailure\n\t(*errdetails.BadRequest)(nil),          // 8: google.rpc.BadRequest\n\t(*errdetails.RequestInfo)(nil),         // 9: google.rpc.RequestInfo\n\t(*errdetails.ResourceInfo)(nil),        // 10: google.rpc.ResourceInfo\n\t(*errdetails.Help)(nil),                // 11: google.rpc.Help\n\t(*errdetails.LocalizedMessage)(nil),    // 12: google.rpc.LocalizedMessage\n}\nvar file_grpc_federation_private_proto_depIdxs = []int32{\n\t2,  // 0: grpc.federation.private.Error.details:type_name -> google.protobuf.Any\n\t2,  // 1: grpc.federation.private.Error.custom_messages:type_name -> google.protobuf.Any\n\t3,  // 2: grpc.federation.private.Error.error_info:type_name -> google.rpc.ErrorInfo\n\t4,  // 3: grpc.federation.private.Error.retry_info:type_name -> google.rpc.RetryInfo\n\t5,  // 4: grpc.federation.private.Error.debug_info:type_name -> google.rpc.DebugInfo\n\t6,  // 5: grpc.federation.private.Error.quota_failures:type_name -> google.rpc.QuotaFailure\n\t7,  // 6: grpc.federation.private.Error.precondition_failures:type_name -> google.rpc.PreconditionFailure\n\t8,  // 7: grpc.federation.private.Error.bad_requests:type_name -> google.rpc.BadRequest\n\t9,  // 8: grpc.federation.private.Error.request_info:type_name -> google.rpc.RequestInfo\n\t10, // 9: grpc.federation.private.Error.resource_info:type_name -> google.rpc.ResourceInfo\n\t11, // 10: grpc.federation.private.Error.helps:type_name -> google.rpc.Help\n\t12, // 11: grpc.federation.private.Error.localized_messages:type_name -> google.rpc.LocalizedMessage\n\t1,  // 12: grpc.federation.private.EnumSelector.true_selector:type_name -> grpc.federation.private.EnumSelector\n\t1,  // 13: grpc.federation.private.EnumSelector.false_selector:type_name -> grpc.federation.private.EnumSelector\n\t14, // [14:14] is the sub-list for method output_type\n\t14, // [14:14] is the sub-list for method input_type\n\t14, // [14:14] is the sub-list for extension type_name\n\t14, // [14:14] is the sub-list for extension extendee\n\t0,  // [0:14] is the sub-list for field type_name\n}\n\nfunc init() { file_grpc_federation_private_proto_init() }\nfunc file_grpc_federation_private_proto_init() {\n\tif File_grpc_federation_private_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_grpc_federation_private_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Error); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_private_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumSelector); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\tfile_grpc_federation_private_proto_msgTypes[1].OneofWrappers = []interface{}{\n\t\t(*EnumSelector_TrueValue)(nil),\n\t\t(*EnumSelector_TrueSelector)(nil),\n\t\t(*EnumSelector_FalseValue)(nil),\n\t\t(*EnumSelector_FalseSelector)(nil),\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_grpc_federation_private_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_grpc_federation_private_proto_goTypes,\n\t\tDependencyIndexes: file_grpc_federation_private_proto_depIdxs,\n\t\tMessageInfos:      file_grpc_federation_private_proto_msgTypes,\n\t}.Build()\n\tFile_grpc_federation_private_proto = out.File\n\tfile_grpc_federation_private_proto_rawDesc = nil\n\tfile_grpc_federation_private_proto_goTypes = nil\n\tfile_grpc_federation_private_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "grpc/federation/cel/rand.go",
    "content": "package cel\n\nimport (\n\t\"context\"\n\t\"math/rand\"\n\t\"reflect\"\n\n\t\"github.com/google/cel-go/cel\"\n\t\"github.com/google/cel-go/common/types\"\n\t\"github.com/google/cel-go/common/types/ref\"\n)\n\nconst RandPackageName = \"rand\"\n\nvar (\n\tSourceType = types.NewObjectType(createRandName(\"Source\"))\n\tRandType   = types.NewObjectType(createRandName(\"Rand\"))\n)\n\ntype Source struct {\n\trand.Source\n}\n\nfunc (s *Source) ConvertToNative(typeDesc reflect.Type) (any, error) {\n\treturn s, nil\n}\n\nfunc (s *Source) ConvertToType(typeValue ref.Type) ref.Val {\n\treturn types.NewErrFromString(\"grpc.federation.rand: source type conversion does not support\")\n}\n\nfunc (s *Source) Equal(other ref.Val) ref.Val {\n\tif o, ok := other.(*Source); ok {\n\t\treturn types.Bool(s.Int63() == o.Int63())\n\t}\n\treturn types.False\n}\n\nfunc (s *Source) Type() ref.Type {\n\treturn SourceType\n}\n\nfunc (s *Source) Value() any {\n\treturn s\n}\n\ntype Rand struct {\n\t*rand.Rand\n}\n\nfunc (r *Rand) ConvertToNative(typeDesc reflect.Type) (any, error) {\n\treturn r, nil\n}\n\nfunc (r *Rand) ConvertToType(typeValue ref.Type) ref.Val {\n\treturn types.NewErrFromString(\"grpc.federation.rand: rand type conversion does not support\")\n}\n\nfunc (r *Rand) Equal(other ref.Val) ref.Val {\n\tif o, ok := other.(*Rand); ok {\n\t\treturn types.Bool(r.Int() == o.Int())\n\t}\n\treturn types.False\n}\n\nfunc (r *Rand) Type() ref.Type {\n\treturn RandType\n}\n\nfunc (r *Rand) Value() any {\n\treturn r\n}\n\ntype RandLibrary struct {\n}\n\nfunc (lib *RandLibrary) LibraryName() string {\n\treturn packageName(RandPackageName)\n}\n\nfunc createRandName(name string) string {\n\treturn createName(RandPackageName, name)\n}\n\nfunc createRandID(name string) string {\n\treturn createID(RandPackageName, name)\n}\n\nfunc (lib *RandLibrary) CompileOptions() []cel.EnvOption {\n\tvar opts []cel.EnvOption\n\tfor _, funcOpts := range [][]cel.EnvOption{\n\t\t// Source functions\n\t\tBindFunction(\n\t\t\tcreateRandName(\"newSource\"),\n\t\t\tOverloadFunc(createRandID(\"new_source_int_source\"), []*cel.Type{cel.IntType}, SourceType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn &Source{\n\t\t\t\t\t\tSource: rand.NewSource(int64(args[0].(types.Int))),\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"int63\",\n\t\t\tMemberOverloadFunc(createRandID(\"int63_source_int\"), SourceType, []*cel.Type{}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Int(self.(*Source).Int63())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"seed\",\n\t\t\tMemberOverloadFunc(createRandID(\"seed_source_int\"), SourceType, []*cel.Type{cel.IntType}, cel.BoolType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tself.(*Source).Seed(int64(args[0].(types.Int)))\n\t\t\t\t\treturn types.True\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\n\t\t// Rand functions\n\t\tBindFunction(\n\t\t\tcreateRandName(\"new\"),\n\t\t\tOverloadFunc(createRandID(\"new_source_rand\"), []*cel.Type{SourceType}, RandType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn &Rand{\n\t\t\t\t\t\tRand: rand.New(args[0].(*Source)), //nolint:gosec\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"expFloat64\",\n\t\t\tMemberOverloadFunc(createRandID(\"exp_float64_rand_double\"), RandType, []*cel.Type{}, cel.DoubleType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Double(self.(*Rand).ExpFloat64())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"float32\",\n\t\t\tMemberOverloadFunc(createRandID(\"float32_rand_double\"), RandType, []*cel.Type{}, cel.DoubleType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Double(self.(*Rand).Float32())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"float64\",\n\t\t\tMemberOverloadFunc(createRandID(\"float64_rand_double\"), RandType, []*cel.Type{}, cel.DoubleType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Double(self.(*Rand).Float64())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"int\",\n\t\t\tMemberOverloadFunc(createRandID(\"int_rand_int\"), RandType, []*cel.Type{}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Int(self.(*Rand).Int())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"int31\",\n\t\t\tMemberOverloadFunc(createRandID(\"int31_rand_int\"), RandType, []*cel.Type{}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Int(self.(*Rand).Int31())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"int31n\",\n\t\t\tMemberOverloadFunc(createRandID(\"int31n_rand_int\"), RandType, []*cel.Type{cel.IntType}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Int(self.(*Rand).Int31n(int32(args[0].(types.Int)))) //nolint:gosec\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"int63\",\n\t\t\tMemberOverloadFunc(createRandID(\"int63_rand_int\"), RandType, []*cel.Type{}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Int(self.(*Rand).Int63())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"int63n\",\n\t\t\tMemberOverloadFunc(createRandID(\"int63n_rand_int\"), RandType, []*cel.Type{cel.IntType}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Int(self.(*Rand).Int63n(int64(args[0].(types.Int))))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"intn\",\n\t\t\tMemberOverloadFunc(createRandID(\"intn_rand_int\"), RandType, []*cel.Type{cel.IntType}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Int(self.(*Rand).Intn(int(args[0].(types.Int))))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"normFloat64\",\n\t\t\tMemberOverloadFunc(createRandID(\"norm_float64_rand_double\"), RandType, []*cel.Type{}, cel.DoubleType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Double(self.(*Rand).NormFloat64())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"seed\",\n\t\t\tMemberOverloadFunc(createRandID(\"seed_rand_int_bool\"), RandType, []*cel.Type{cel.IntType}, cel.BoolType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tself.(*Rand).Seed(int64(args[0].(types.Int)))\n\t\t\t\t\treturn types.True\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"uint32\",\n\t\t\tMemberOverloadFunc(createRandID(\"uint32_rand_uint\"), RandType, []*cel.Type{}, cel.UintType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Uint(self.(*Rand).Uint32())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t} {\n\t\topts = append(opts, funcOpts...)\n\t}\n\treturn opts\n}\n\nfunc (lib *RandLibrary) ProgramOptions() []cel.ProgramOption {\n\treturn []cel.ProgramOption{}\n}\n"
  },
  {
    "path": "grpc/federation/cel/rand_test.go",
    "content": "//nolint:gosec\npackage cel_test\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"math/rand\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/google/cel-go/cel\"\n\t\"github.com/google/cel-go/common/types\"\n\t\"github.com/google/go-cmp/cmp\"\n\n\tcellib \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n)\n\nfunc TestRand(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\texpr string\n\t\targs map[string]any\n\t\tcmp  func(any) error\n\t}{\n\t\t// Source functions\n\t\t{\n\t\t\tname: \"newSource\",\n\t\t\texpr: \"grpc.federation.rand.newSource(grpc.federation.time.date(2023, 12, 25, 12, 0, 0, 0, grpc.federation.time.UTC()).unix())\",\n\t\t\tcmp: func(got any) error {\n\t\t\t\tgotV, ok := got.(*cellib.Source)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := rand.NewSource(time.Date(2023, 12, 25, 12, 0, 0, 0, time.UTC).Unix()).Int63()\n\t\t\t\tif diff := cmp.Diff(gotV.Int63(), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"int63\",\n\t\t\texpr: \"grpc.federation.rand.newSource(grpc.federation.time.date(2023, 12, 25, 12, 0, 0, 0, grpc.federation.time.UTC()).unix()).int63()\",\n\t\t\tcmp: func(got any) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := rand.NewSource(time.Date(2023, 12, 25, 12, 0, 0, 0, time.UTC).Unix()).Int63()\n\t\t\t\tif diff := cmp.Diff(int64(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"seed\",\n\t\t\texpr: \"grpc.federation.rand.newSource(grpc.federation.time.date(2023, 12, 25, 12, 0, 0, 0, grpc.federation.time.UTC()).unix()).seed(10)\",\n\t\t\tcmp: func(got any) error {\n\t\t\t\tgotV, ok := got.(types.Bool)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(bool(gotV), true); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\n\t\t// Rand functions\n\t\t{\n\t\t\tname: \"new\",\n\t\t\texpr: \"grpc.federation.rand.new(grpc.federation.rand.newSource(grpc.federation.time.date(2023, 12, 25, 12, 0, 0, 0, grpc.federation.time.UTC()).unix()))\",\n\t\t\tcmp: func(got any) error {\n\t\t\t\tgotV, ok := got.(*cellib.Rand)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := rand.New(rand.NewSource(time.Date(2023, 12, 25, 12, 0, 0, 0, time.UTC).Unix())).Int() //nolint: gosec\n\t\t\t\tif diff := cmp.Diff(gotV.Int(), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"expFloat64\",\n\t\t\texpr: \"grpc.federation.rand.new(grpc.federation.rand.newSource(grpc.federation.time.date(2023, 12, 25, 12, 0, 0, 0, grpc.federation.time.UTC()).unix())).expFloat64()\",\n\t\t\tcmp: func(got any) error {\n\t\t\t\tgotV, ok := got.(types.Double)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := rand.New(rand.NewSource(time.Date(2023, 12, 25, 12, 0, 0, 0, time.UTC).Unix())).ExpFloat64() //nolint: gosec\n\t\t\t\tif diff := cmp.Diff(float64(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"float32\",\n\t\t\texpr: \"grpc.federation.rand.new(grpc.federation.rand.newSource(grpc.federation.time.date(2023, 12, 25, 12, 0, 0, 0, grpc.federation.time.UTC()).unix())).float32()\",\n\t\t\tcmp: func(got any) error {\n\t\t\t\tgotV, ok := got.(types.Double)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := rand.New(rand.NewSource(time.Date(2023, 12, 25, 12, 0, 0, 0, time.UTC).Unix())).Float32() //nolint: gosec\n\t\t\t\tif diff := cmp.Diff(float32(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"float64\",\n\t\t\texpr: \"grpc.federation.rand.new(grpc.federation.rand.newSource(grpc.federation.time.date(2023, 12, 25, 12, 0, 0, 0, grpc.federation.time.UTC()).unix())).float64()\",\n\t\t\tcmp: func(got any) error {\n\t\t\t\tgotV, ok := got.(types.Double)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := rand.New(rand.NewSource(time.Date(2023, 12, 25, 12, 0, 0, 0, time.UTC).Unix())).Float64() //nolint: gosec\n\t\t\t\tif diff := cmp.Diff(float64(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"int\",\n\t\t\texpr: \"grpc.federation.rand.new(grpc.federation.rand.newSource(grpc.federation.time.date(2023, 12, 25, 12, 0, 0, 0, grpc.federation.time.UTC()).unix())).int()\",\n\t\t\tcmp: func(got any) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := rand.New(rand.NewSource(time.Date(2023, 12, 25, 12, 0, 0, 0, time.UTC).Unix())).Int() //nolint: gosec\n\t\t\t\tif diff := cmp.Diff(int(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"int31\",\n\t\t\texpr: \"grpc.federation.rand.new(grpc.federation.rand.newSource(grpc.federation.time.date(2023, 12, 25, 12, 0, 0, 0, grpc.federation.time.UTC()).unix())).int31()\",\n\t\t\tcmp: func(got any) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := rand.New(rand.NewSource(time.Date(2023, 12, 25, 12, 0, 0, 0, time.UTC).Unix())).Int31() //nolint: gosec\n\t\t\t\tif diff := cmp.Diff(int32(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"int31n\",\n\t\t\texpr: \"grpc.federation.rand.new(grpc.federation.rand.newSource(grpc.federation.time.date(2023, 12, 25, 12, 0, 0, 0, grpc.federation.time.UTC()).unix())).int31n(10)\",\n\t\t\tcmp: func(got any) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := rand.New(rand.NewSource(time.Date(2023, 12, 25, 12, 0, 0, 0, time.UTC).Unix())).Int31n(10) //nolint: gosec\n\t\t\t\tif diff := cmp.Diff(int32(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"rand_int63\",\n\t\t\texpr: \"grpc.federation.rand.new(grpc.federation.rand.newSource(grpc.federation.time.date(2023, 12, 25, 12, 0, 0, 0, grpc.federation.time.UTC()).unix())).int63()\",\n\t\t\tcmp: func(got any) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := rand.New(rand.NewSource(time.Date(2023, 12, 25, 12, 0, 0, 0, time.UTC).Unix())).Int63() //nolint: gosec\n\t\t\t\tif diff := cmp.Diff(int64(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"int63n\",\n\t\t\texpr: \"grpc.federation.rand.new(grpc.federation.rand.newSource(grpc.federation.time.date(2023, 12, 25, 12, 0, 0, 0, grpc.federation.time.UTC()).unix())).int63n(10)\",\n\t\t\tcmp: func(got any) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := rand.New(rand.NewSource(time.Date(2023, 12, 25, 12, 0, 0, 0, time.UTC).Unix())).Int63n(10) //nolint: gosec\n\t\t\t\tif diff := cmp.Diff(int64(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"intn\",\n\t\t\texpr: \"grpc.federation.rand.new(grpc.federation.rand.newSource(grpc.federation.time.date(2023, 12, 25, 12, 0, 0, 0, grpc.federation.time.UTC()).unix())).intn(10)\",\n\t\t\tcmp: func(got any) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := rand.New(rand.NewSource(time.Date(2023, 12, 25, 12, 0, 0, 0, time.UTC).Unix())).Intn(10) //nolint: gosec\n\t\t\t\tif diff := cmp.Diff(int(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"normFloat64\",\n\t\t\texpr: \"grpc.federation.rand.new(grpc.federation.rand.newSource(grpc.federation.time.date(2023, 12, 25, 12, 0, 0, 0, grpc.federation.time.UTC()).unix())).normFloat64()\",\n\t\t\tcmp: func(got any) error {\n\t\t\t\tgotV, ok := got.(types.Double)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := rand.New(rand.NewSource(time.Date(2023, 12, 25, 12, 0, 0, 0, time.UTC).Unix())).NormFloat64() //nolint: gosec\n\t\t\t\tif diff := cmp.Diff(float64(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"uint32\",\n\t\t\texpr: \"grpc.federation.rand.new(grpc.federation.rand.newSource(grpc.federation.time.date(2023, 12, 25, 12, 0, 0, 0, grpc.federation.time.UTC()).unix())).uint32()\",\n\t\t\tcmp: func(got any) error {\n\t\t\t\tgotV, ok := got.(types.Uint)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := rand.New(rand.NewSource(time.Date(2023, 12, 25, 12, 0, 0, 0, time.UTC).Unix())).Uint32() //nolint: gosec\n\t\t\t\tif diff := cmp.Diff(uint32(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t}\n\treg, err := types.NewRegistry(new(cellib.Time), new(cellib.Location))\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tenv, err := cel.NewEnv(\n\t\t\t\tcel.Variable(cellib.ContextVariableName, cel.ObjectType(cellib.ContextTypeName)),\n\t\t\t\tcel.Lib(new(cellib.RandLibrary)),\n\t\t\t\tcel.Lib(cellib.NewTimeLibrary(reg)),\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tast, iss := env.Compile(test.expr)\n\t\t\tif iss.Err() != nil {\n\t\t\t\tt.Fatal(iss.Err())\n\t\t\t}\n\t\t\tprogram, err := env.Program(ast)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\targs := map[string]any{cellib.ContextVariableName: cellib.NewContextValue(context.Background())}\n\t\t\tfor k, v := range test.args {\n\t\t\t\targs[k] = v\n\t\t\t}\n\t\t\tout, _, err := program.Eval(args)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tif err := test.cmp(out); err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "grpc/federation/cel/regexp.go",
    "content": "package cel\n\nimport (\n\t\"context\"\n\t\"reflect\"\n\t\"regexp\"\n\n\t\"github.com/google/cel-go/cel\"\n\t\"github.com/google/cel-go/common/types\"\n\t\"github.com/google/cel-go/common/types/ref\"\n)\n\nconst RegexpPackageName = \"regexp\"\n\nvar (\n\tRegexpType = types.NewObjectType(createRegexpName(\"Regexp\"))\n)\n\ntype Regexp struct {\n\tregexp.Regexp\n}\n\nfunc (r *Regexp) ConvertToNative(typeDesc reflect.Type) (any, error) {\n\treturn r, nil\n}\n\nfunc (r *Regexp) ConvertToType(typeValue ref.Type) ref.Val {\n\treturn types.NewErrFromString(\"grpc.federation.regexp: regexp type conversion does not support\")\n}\n\nfunc (r *Regexp) Equal(other ref.Val) ref.Val {\n\tif o, ok := other.(*Regexp); ok {\n\t\treturn types.Bool(r.String() == o.String())\n\t}\n\treturn types.False\n}\n\nfunc (r *Regexp) Type() ref.Type {\n\treturn RegexpType\n}\n\nfunc (r *Regexp) Value() any {\n\treturn r\n}\n\ntype RegexpLibrary struct {\n}\n\nfunc (lib *RegexpLibrary) LibraryName() string {\n\treturn packageName(RegexpPackageName)\n}\n\nfunc createRegexpName(name string) string {\n\treturn createName(RegexpPackageName, name)\n}\n\nfunc createRegexpID(name string) string {\n\treturn createID(RegexpPackageName, name)\n}\n\nfunc (lib *RegexpLibrary) CompileOptions() []cel.EnvOption {\n\tvar opts []cel.EnvOption\n\tfor _, funcOpts := range [][]cel.EnvOption{\n\t\tBindFunction(\n\t\t\tcreateRegexpName(\"compile\"),\n\t\t\tOverloadFunc(createRegexpID(\"compile_string_regexp\"), []*cel.Type{cel.StringType}, RegexpType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\tre, err := regexp.Compile(string(args[0].(types.String)))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn &Regexp{\n\t\t\t\t\t\tRegexp: *re,\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateRegexpName(\"mustCompile\"),\n\t\t\tOverloadFunc(createRegexpID(\"mustCompile_string_regexp\"), []*cel.Type{cel.StringType}, RegexpType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn &Regexp{\n\t\t\t\t\t\tRegexp: *regexp.MustCompile(string(args[0].(types.String))),\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateRegexpName(\"quoteMeta\"),\n\t\t\tOverloadFunc(createRegexpID(\"quoteMeta_string_string\"), []*cel.Type{cel.StringType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(regexp.QuoteMeta(string(args[0].(types.String))))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"findStringSubmatch\",\n\t\t\tMemberOverloadFunc(createRegexpID(\"findStringSubmatch_regexp_string_strings\"), RegexpType, []*cel.Type{cel.StringType}, cel.ListType(cel.StringType),\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.NewStringList(types.DefaultTypeAdapter, self.(*Regexp).FindStringSubmatch(string(args[0].(types.String))))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"matchString\",\n\t\t\tMemberOverloadFunc(createRegexpID(\"match_string_regexp_string\"), RegexpType, []*cel.Type{cel.StringType}, cel.BoolType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Bool(self.(*Regexp).MatchString(string(args[0].(types.String))))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"replaceAllString\",\n\t\t\tMemberOverloadFunc(createRegexpID(\"replaceAllString_regexp_string_string_string\"), RegexpType, []*cel.Type{cel.StringType, cel.StringType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(self.(*Regexp).ReplaceAllString(string(args[0].(types.String)), string(args[1].(types.String))))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"string\",\n\t\t\tMemberOverloadFunc(createRegexpID(\"string_regexp\"), RegexpType, []*cel.Type{}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(self.(*Regexp).String())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t} {\n\t\topts = append(opts, funcOpts...)\n\t}\n\treturn opts\n}\n\nfunc (lib *RegexpLibrary) ProgramOptions() []cel.ProgramOption {\n\treturn []cel.ProgramOption{}\n}\n"
  },
  {
    "path": "grpc/federation/cel/regexp_test.go",
    "content": "package cel_test\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"regexp\"\n\t\"testing\"\n\n\t\"github.com/google/cel-go/cel\"\n\t\"github.com/google/cel-go/common/types\"\n\t\"github.com/google/cel-go/common/types/traits\"\n\t\"github.com/google/go-cmp/cmp\"\n\n\tcellib \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n)\n\nfunc TestRegexp(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\texpr string\n\t\targs map[string]any\n\t\tcmp  func(any) error\n\t}{\n\t\t{\n\t\t\tname: \"compile\",\n\t\t\texpr: \"grpc.federation.regexp.compile('a+b')\",\n\t\t\tcmp: func(got any) error {\n\t\t\t\tgotV, ok := got.(*cellib.Regexp)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := regexp.MustCompile(\"a+b\")\n\t\t\t\tif diff := cmp.Diff(gotV.Regexp.String(), expected.String()); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"mustCompile\",\n\t\t\texpr: \"grpc.federation.regexp.mustCompile('a+b')\",\n\t\t\tcmp: func(got any) error {\n\t\t\t\tgotV, ok := got.(*cellib.Regexp)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := regexp.MustCompile(\"a+b\")\n\t\t\t\tif diff := cmp.Diff(gotV.Regexp.String(), expected.String()); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"quoteMeta\",\n\t\t\texpr: \"grpc.federation.regexp.quoteMeta('[a-z]+\\\\\\\\d')\",\n\t\t\tcmp: func(got any) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := regexp.QuoteMeta(\"[a-z]+\\\\d\")\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"findStringSubmatch\",\n\t\t\texpr: \"grpc.federation.regexp.mustCompile('([a-z]+)\\\\\\\\d(\\\\\\\\d)').findStringSubmatch('abc123')\",\n\t\t\tcmp: func(got any) error {\n\t\t\t\tlister, ok := got.(traits.Lister)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tgotV, err := lister.ConvertToNative(reflect.TypeOf([]string{}))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"failed to convert to native: %w\", err)\n\t\t\t\t}\n\t\t\t\texpected := regexp.MustCompile(`([a-z]+)\\d(\\d)`).FindStringSubmatch(\"abc123\")\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"matchString\",\n\t\t\texpr: \"grpc.federation.regexp.mustCompile('[a-z]+\\\\\\\\d\\\\\\\\d').matchString('abc123')\",\n\t\t\tcmp: func(got any) error {\n\t\t\t\tgotV, ok := got.(types.Bool)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := regexp.MustCompile(`\\w+\\d\\d`).MatchString(\"abc123\")\n\t\t\t\tif diff := cmp.Diff(bool(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"replaceAllString\",\n\t\t\texpr: \"grpc.federation.regexp.mustCompile('mackerel').replaceAllString('mackerel is tasty', 'salmon')\",\n\t\t\tcmp: func(got any) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := regexp.MustCompile(`mackerel`).ReplaceAllString(\"mackerel is tasty\", \"salmon\")\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"string\",\n\t\t\texpr: \"grpc.federation.regexp.mustCompile('[a-z]+\\\\\\\\d\\\\\\\\d').string()\",\n\t\t\tcmp: func(got any) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := regexp.MustCompile(`[a-z]+\\d\\d`).String()\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tenv, err := cel.NewEnv(\n\t\t\t\tcel.Variable(cellib.ContextVariableName, cel.ObjectType(cellib.ContextTypeName)),\n\t\t\t\tcel.Lib(new(cellib.RegexpLibrary)),\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tast, iss := env.Compile(test.expr)\n\t\t\tif iss.Err() != nil {\n\t\t\t\tt.Fatal(iss.Err())\n\t\t\t}\n\t\t\tprogram, err := env.Program(ast)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\targs := map[string]any{cellib.ContextVariableName: cellib.NewContextValue(context.Background())}\n\t\t\tfor k, v := range test.args {\n\t\t\t\targs[k] = v\n\t\t\t}\n\t\t\tout, _, err := program.Eval(args)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tif err := test.cmp(out); err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "grpc/federation/cel/strings.go",
    "content": "package cel\n\nimport (\n\t\"context\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/google/cel-go/cel\"\n\t\"github.com/google/cel-go/common/types\"\n\t\"github.com/google/cel-go/common/types/ref\"\n\t\"github.com/google/cel-go/common/types/traits\"\n\t\"github.com/google/cel-go/ext\"\n\t\"golang.org/x/text/cases\"\n\t\"golang.org/x/text/language\"\n)\n\nconst StringsPackageName = \"strings\"\n\nvar _ cel.SingletonLibrary = new(StringsLibrary)\n\ntype StringsLibrary struct {\n}\n\nfunc NewStringsLibrary() *StringsLibrary {\n\treturn &StringsLibrary{}\n}\n\nfunc (lib *StringsLibrary) LibraryName() string {\n\treturn packageName(StringsPackageName)\n}\n\nfunc createStringsName(name string) string {\n\treturn createName(StringsPackageName, name)\n}\n\nfunc createStringsID(name string) string {\n\treturn createID(StringsPackageName, name)\n}\n\nfunc (lib *StringsLibrary) CompileOptions() []cel.EnvOption {\n\topts := []cel.EnvOption{}\n\n\textLib := ext.Strings()\n\tfor _, funcOpts := range [][]cel.EnvOption{\n\t\t// strings package functions\n\n\t\t// define ext.Strings apis.\n\t\tBindExtMemberFunction(extLib, \"charAt\", \"string_char_at_int\", cel.StringType, []*cel.Type{cel.IntType}, cel.StringType),\n\t\tBindExtMemberFunction(extLib, \"indexOf\", \"string_index_of_string\", cel.StringType, []*cel.Type{cel.StringType}, cel.IntType),\n\t\tBindExtMemberFunction(extLib, \"indexOf\", \"string_index_of_string_int\", cel.StringType, []*cel.Type{cel.StringType, cel.IntType}, cel.IntType),\n\t\tBindExtMemberFunction(extLib, \"lastIndexOf\", \"string_last_index_of_string\", cel.StringType, []*cel.Type{cel.StringType}, cel.IntType),\n\t\tBindExtMemberFunction(extLib, \"lastIndexOf\", \"string_last_index_of_string_int\", cel.StringType, []*cel.Type{cel.StringType, cel.IntType}, cel.IntType),\n\t\tBindExtMemberFunction(extLib, \"lowerAscii\", \"string_lower_ascii\", cel.StringType, []*cel.Type{}, cel.StringType),\n\t\tBindExtMemberFunction(extLib, \"replace\", \"string_replace_string_string\", cel.StringType, []*cel.Type{cel.StringType, cel.StringType}, cel.StringType),\n\t\tBindExtMemberFunction(extLib, \"replace\", \"string_replace_string_string_int\", cel.StringType, []*cel.Type{cel.StringType, cel.StringType, cel.IntType}, cel.StringType),\n\t\tBindExtMemberFunction(extLib, \"split\", \"string_split_string\", cel.StringType, []*cel.Type{cel.StringType}, cel.ListType(cel.StringType)),\n\t\tBindExtMemberFunction(extLib, \"split\", \"string_split_string_int\", cel.StringType, []*cel.Type{cel.StringType, cel.IntType}, cel.ListType(cel.StringType)),\n\t\tBindExtMemberFunction(extLib, \"substring\", \"string_substring_int\", cel.StringType, []*cel.Type{cel.IntType}, cel.StringType),\n\t\tBindExtMemberFunction(extLib, \"substring\", \"string_substring_int_int\", cel.StringType, []*cel.Type{cel.IntType, cel.IntType}, cel.StringType),\n\t\tBindExtMemberFunction(extLib, \"trim\", \"string_trim\", cel.StringType, []*cel.Type{}, cel.StringType),\n\t\tBindExtMemberFunction(extLib, \"upperAscii\", \"string_upper_ascii\", cel.StringType, []*cel.Type{}, cel.StringType),\n\t\tBindExtMemberFunction(extLib, \"format\", \"string_format_list_string\", cel.StringType, []*cel.Type{cel.ListType(cel.DynType)}, cel.StringType),\n\t\tBindExtMemberFunction(extLib, \"join\", \"list_join\", cel.ListType(cel.StringType), []*cel.Type{}, cel.StringType),\n\t\tBindExtMemberFunction(extLib, \"join\", \"list_join_string\", cel.ListType(cel.StringType), []*cel.Type{cel.StringType}, cel.StringType),\n\t\tBindExtMemberFunction(extLib, \"reverse\", \"string_reverse\", cel.StringType, []*cel.Type{}, cel.StringType),\n\t\tBindExtFunction(extLib, \"strings.quote\", \"strings_quote\", []*cel.Type{cel.StringType}, cel.StringType),\n\n\t\t// add gRPC Federation standard apis.\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"clone\"),\n\t\t\tOverloadFunc(createStringsID(\"clone_string_string\"), []*cel.Type{cel.StringType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn args[0].(types.String)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"compare\"),\n\t\t\tOverloadFunc(createStringsID(\"compare_string_string_int\"), []*cel.Type{cel.StringType, cel.StringType}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn args[0].(types.String).Compare(args[1].(types.String))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"contains\"),\n\t\t\tOverloadFunc(createStringsID(\"contains_string_string_bool\"), []*cel.Type{cel.StringType, cel.StringType}, cel.BoolType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Bool(strings.Contains(args[0].(types.String).Value().(string), args[1].(types.String).Value().(string)))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"containsAny\"),\n\t\t\tOverloadFunc(createStringsID(\"containsAny_string_string_bool\"), []*cel.Type{cel.StringType, cel.StringType}, cel.BoolType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Bool(strings.ContainsAny(args[0].(types.String).Value().(string), args[1].(types.String).Value().(string)))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"containsRune\"),\n\t\t\tOverloadFunc(createStringsID(\"containsRune_string_int_bool\"), []*cel.Type{cel.StringType, cel.IntType}, cel.BoolType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\tstr := args[0].(types.String).Value().(string)\n\t\t\t\t\tr := rune(args[1].(types.Int).Value().(int64))\n\t\t\t\t\treturn types.Bool(strings.ContainsRune(str, r))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"count\"),\n\t\t\tOverloadFunc(createStringsID(\"count_string_string_int\"), []*cel.Type{cel.StringType, cel.StringType}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Int(strings.Count(args[0].(types.String).Value().(string), args[1].(types.String).Value().(string)))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"cut\"),\n\t\t\tOverloadFunc(createStringsID(\"cut_string_string_strings\"), []*cel.Type{cel.StringType, cel.StringType}, cel.ListType(cel.StringType),\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\tstr := args[0].(types.String).Value().(string)\n\t\t\t\t\tsep := args[1].(types.String).Value().(string)\n\t\t\t\t\tbefore, after, _ := strings.Cut(str, sep)\n\t\t\t\t\treturn types.NewStringList(types.DefaultTypeAdapter, []string{before, after})\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"cutPrefix\"),\n\t\t\tOverloadFunc(createStringsID(\"cutPrefix_string_string_string\"), []*cel.Type{cel.StringType, cel.StringType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\tstr := args[0].(types.String).Value().(string)\n\t\t\t\t\tprefix := args[1].(types.String).Value().(string)\n\t\t\t\t\tafter, _ := strings.CutPrefix(str, prefix)\n\t\t\t\t\treturn types.String(after)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"cutSuffix\"),\n\t\t\tOverloadFunc(createStringsID(\"cutSuffix_string_string_string\"), []*cel.Type{cel.StringType, cel.StringType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\tstr := args[0].(types.String).Value().(string)\n\t\t\t\t\tsuffix := args[1].(types.String).Value().(string)\n\t\t\t\t\tbefore, _ := strings.CutSuffix(str, suffix)\n\t\t\t\t\treturn types.String(before)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"equalFold\"),\n\t\t\tOverloadFunc(createStringsID(\"equalFold_string_string_bool\"), []*cel.Type{cel.StringType, cel.StringType}, cel.BoolType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Bool(strings.EqualFold(args[0].(types.String).Value().(string), args[1].(types.String).Value().(string)))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"fields\"),\n\t\t\tOverloadFunc(createStringsID(\"fields_string_strings\"), []*cel.Type{cel.StringType}, cel.ListType(cel.StringType),\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\tadapter := types.DefaultTypeAdapter\n\t\t\t\t\treturn types.NewStringList(adapter, strings.Fields(args[0].(types.String).Value().(string)))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\t// func FieldsFunc(s string, f func(rune) bool) []string is not implemented because it has a function argument.\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"hasPrefix\"),\n\t\t\tOverloadFunc(createStringsID(\"hasPrefix_string_string_bool\"), []*cel.Type{cel.StringType, cel.StringType}, cel.BoolType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Bool(strings.HasPrefix(args[0].(types.String).Value().(string), args[1].(types.String).Value().(string)))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"hasSuffix\"),\n\t\t\tOverloadFunc(createStringsID(\"hasSuffix_string_string_bool\"), []*cel.Type{cel.StringType, cel.StringType}, cel.BoolType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Bool(strings.HasSuffix(args[0].(types.String).Value().(string), args[1].(types.String).Value().(string)))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"index\"),\n\t\t\tOverloadFunc(createStringsID(\"index_string_string_int\"), []*cel.Type{cel.StringType, cel.StringType}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Int(strings.Index(args[0].(types.String).Value().(string), args[1].(types.String).Value().(string)))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"indexAny\"),\n\t\t\tOverloadFunc(createStringsID(\"indexAny_string_string_int\"), []*cel.Type{cel.StringType, cel.StringType}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Int(strings.IndexAny(args[0].(types.String).Value().(string), args[1].(types.String).Value().(string)))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"indexByte\"),\n\t\t\tOverloadFunc(createStringsID(\"indexByte_string_byte_int\"), []*cel.Type{cel.StringType, cel.BytesType}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Int(strings.IndexByte(args[0].(types.String).Value().(string), args[1].(types.Bytes).Value().(byte)))\n\t\t\t\t},\n\t\t\t),\n\t\t\tOverloadFunc(createStringsID(\"indexByte_string_string_int\"), []*cel.Type{cel.StringType, cel.StringType}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Int(strings.IndexByte(args[0].(types.String).Value().(string), args[1].(types.String).Value().(string)[0]))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\t// func IndexFunc(s string, f func(rune) bool) int　is not implemented because it has a function argument.\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"indexRune\"),\n\t\t\tOverloadFunc(createStringsID(\"indexRune_string_int_int\"), []*cel.Type{cel.StringType, cel.IntType}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Int(strings.IndexRune(args[0].(types.String).Value().(string), rune(args[1].(types.Int).Value().(int64))))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"join\"),\n\t\t\tOverloadFunc(createStringsID(\"join_strings_string_string\"), []*cel.Type{cel.ListType(cel.StringType), cel.StringType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\telems := args[0].(traits.Lister)\n\t\t\t\t\tstrs := make([]string, elems.Size().(types.Int))\n\t\t\t\t\tfor i := types.IntZero; i < elems.Size().(types.Int); i++ {\n\t\t\t\t\t\tstrs[i] = elems.Get(i).(types.String).Value().(string)\n\t\t\t\t\t}\n\t\t\t\t\treturn types.String(strings.Join(strs, args[1].(types.String).Value().(string)))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"lastIndex\"),\n\t\t\tOverloadFunc(createStringsID(\"lastIndex_string_string_int\"), []*cel.Type{cel.StringType, cel.StringType}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Int(strings.LastIndex(args[0].(types.String).Value().(string), args[1].(types.String).Value().(string)))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"lastIndexAny\"),\n\t\t\tOverloadFunc(createStringsID(\"lastIndexAny_string_string_int\"), []*cel.Type{cel.StringType, cel.StringType}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Int(strings.LastIndexAny(args[0].(types.String).Value().(string), args[1].(types.String).Value().(string)))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"lastIndexByte\"),\n\t\t\tOverloadFunc(createStringsID(\"lastIndexByte_string_byte_int\"), []*cel.Type{cel.StringType, cel.BytesType}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Int(strings.LastIndexByte(args[0].(types.String).Value().(string), args[1].(types.Bytes).Value().(byte)))\n\t\t\t\t},\n\t\t\t),\n\t\t\tOverloadFunc(createStringsID(\"lastIndexByte_string_string_int\"), []*cel.Type{cel.StringType, cel.StringType}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Int(strings.LastIndexByte(args[0].(types.String).Value().(string), args[1].(types.String).Value().(string)[0]))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\t// func LastIndexFunc(s string, f func(rune) bool) int　is not implemented because it has a function argument.\n\t\t// func Map(mapping func(rune) rune, s string) string　is not implemented because it has a function argument.\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"repeat\"),\n\t\t\tOverloadFunc(createStringsID(\"repeat_string_int_string\"), []*cel.Type{cel.StringType, cel.IntType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(strings.Repeat(args[0].(types.String).Value().(string), int(args[1].(types.Int).Value().(int64))))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"replace\"),\n\t\t\tOverloadFunc(createStringsID(\"replace_string_string_string_int_string\"), []*cel.Type{cel.StringType, cel.StringType, cel.StringType, cel.IntType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(strings.Replace(args[0].(types.String).Value().(string), args[1].(types.String).Value().(string), args[2].(types.String).Value().(string), int(args[3].(types.Int).Value().(int64))))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"replaceAll\"),\n\t\t\tOverloadFunc(createStringsID(\"replaceAll_string_string_string_string\"), []*cel.Type{cel.StringType, cel.StringType, cel.StringType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(strings.ReplaceAll(args[0].(types.String).Value().(string), args[1].(types.String).Value().(string), args[2].(types.String).Value().(string)))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"split\"),\n\t\t\tOverloadFunc(createStringsID(\"split_string_string_strings\"), []*cel.Type{cel.StringType, cel.StringType}, cel.ListType(cel.StringType),\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\tadapter := types.DefaultTypeAdapter\n\t\t\t\t\treturn types.NewStringList(adapter, strings.Split(args[0].(types.String).Value().(string), args[1].(types.String).Value().(string)))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"splitAfter\"),\n\t\t\tOverloadFunc(createStringsID(\"splitAfter_string_string_strings\"), []*cel.Type{cel.StringType, cel.StringType}, cel.ListType(cel.StringType),\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\tadapter := types.DefaultTypeAdapter\n\t\t\t\t\treturn types.NewStringList(adapter, strings.SplitAfter(args[0].(types.String).Value().(string), args[1].(types.String).Value().(string)))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"splitAfterN\"),\n\t\t\tOverloadFunc(createStringsID(\"splitAfterN_string_string_int_strings\"), []*cel.Type{cel.StringType, cel.StringType, cel.IntType}, cel.ListType(cel.StringType),\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\tadapter := types.DefaultTypeAdapter\n\t\t\t\t\treturn types.NewStringList(adapter, strings.SplitAfterN(args[0].(types.String).Value().(string), args[1].(types.String).Value().(string), int(args[2].(types.Int).Value().(int64))))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"splitN\"),\n\t\t\tOverloadFunc(createStringsID(\"splitN_string_string_int_strings\"), []*cel.Type{cel.StringType, cel.StringType, cel.IntType}, cel.ListType(cel.StringType),\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\tadapter := types.DefaultTypeAdapter\n\t\t\t\t\treturn types.NewStringList(adapter, strings.SplitN(args[0].(types.String).Value().(string), args[1].(types.String).Value().(string), int(args[2].(types.Int).Value().(int64))))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\t// strings.Title is deprecated. So, we use golang.org/x/text/cases.Title instead.\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"title\"),\n\t\t\tOverloadFunc(createStringsID(\"title_string_string\"), []*cel.Type{cel.StringType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\tc := cases.Title(language.English)\n\t\t\t\t\treturn types.String(c.String(args[0].(types.String).Value().(string)))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"toLower\"),\n\t\t\tOverloadFunc(createStringsID(\"toLower_string_string\"), []*cel.Type{cel.StringType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(strings.ToLower(args[0].(types.String).Value().(string)))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\t// func ToLowerSpecial(c unicode.SpecialCase, s string) string is not implemented because unicode.SpecialCase is not supported.\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"toTitle\"),\n\t\t\tOverloadFunc(createStringsID(\"toTitle_string_string\"), []*cel.Type{cel.StringType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(strings.ToTitle(args[0].(types.String).Value().(string)))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\t// func ToTitleSpecial(c unicode.SpecialCase, s string) string is not implemented because unicode.SpecialCase is not supported.\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"toUpper\"),\n\t\t\tOverloadFunc(createStringsID(\"toUpper_string_string\"), []*cel.Type{cel.StringType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(strings.ToUpper(args[0].(types.String).Value().(string)))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\t// func ToUpperSpecial(c unicode.SpecialCase, s string) string is not implemented because unicode.SpecialCase is not supported.\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"toValidUTF8\"),\n\t\t\tOverloadFunc(createStringsID(\"toValidUTF8_string_string_string\"), []*cel.Type{cel.StringType, cel.StringType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(strings.ToValidUTF8(args[0].(types.String).Value().(string), args[1].(types.String).Value().(string)))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"trim\"),\n\t\t\tOverloadFunc(createStringsID(\"trim_string_string_string\"), []*cel.Type{cel.StringType, cel.StringType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(strings.Trim(args[0].(types.String).Value().(string), args[1].(types.String).Value().(string)))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\t// func TrimFunc(s string, f func(rune) bool) string is not implemented because it has a function argument.\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"trimLeft\"),\n\t\t\tOverloadFunc(createStringsID(\"trimLeft_string_string_string\"), []*cel.Type{cel.StringType, cel.StringType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(strings.TrimLeft(args[0].(types.String).Value().(string), args[1].(types.String).Value().(string)))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\t// func TrimLeftFunc(s string, f func(rune) bool) string is not implemented because it has a function argument.\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"trimPrefix\"),\n\t\t\tOverloadFunc(createStringsID(\"trimPrefix_string_string_string\"), []*cel.Type{cel.StringType, cel.StringType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(strings.TrimPrefix(args[0].(types.String).Value().(string), args[1].(types.String).Value().(string)))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"trimRight\"),\n\t\t\tOverloadFunc(createStringsID(\"trimRight_string_string_string\"), []*cel.Type{cel.StringType, cel.StringType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(strings.TrimRight(args[0].(types.String).Value().(string), args[1].(types.String).Value().(string)))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\t// func TrimRightFunc(s string, f func(rune) bool) string is not implemented because it has a function argument.\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"trimSpace\"),\n\t\t\tOverloadFunc(createStringsID(\"trimSpace_string_string\"), []*cel.Type{cel.StringType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(strings.TrimSpace(args[0].(types.String).Value().(string)))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"trimSuffix\"),\n\t\t\tOverloadFunc(createStringsID(\"trimSuffix_string_string_string\"), []*cel.Type{cel.StringType, cel.StringType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(strings.TrimSuffix(args[0].(types.String).Value().(string), args[1].(types.String).Value().(string)))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\n\t\t// strconv package functions\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"appendBool\"),\n\t\t\tOverloadFunc(createStringsID(\"appendBool_bytes_bool_bytes\"), []*cel.Type{cel.BytesType, cel.BoolType}, cel.BytesType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Bytes(strconv.AppendBool(args[0].(types.Bytes).Value().([]byte), args[1].(types.Bool).Value().(bool)))\n\t\t\t\t},\n\t\t\t),\n\t\t\tOverloadFunc(createStringsID(\"appendBool_string_bool_string\"), []*cel.Type{cel.StringType, cel.BoolType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(strconv.AppendBool([]byte(args[0].(types.String).Value().(string)), args[1].(types.Bool).Value().(bool)))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"appendFloat\"),\n\t\t\tOverloadFunc(createStringsID(\"appendFloat_bytes_float64_string_int_int_bytes\"), []*cel.Type{cel.BytesType, cel.DoubleType, cel.StringType, cel.IntType, cel.IntType}, cel.BytesType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Bytes(strconv.AppendFloat(args[0].(types.Bytes).Value().([]byte), args[1].(types.Double).Value().(float64), args[2].(types.String).Value().(string)[0], int(args[3].(types.Int).Value().(int64)), int(args[4].(types.Int).Value().(int64))))\n\t\t\t\t},\n\t\t\t),\n\t\t\tOverloadFunc(createStringsID(\"appendFloat_string_float64_int_string_int_string\"), []*cel.Type{cel.StringType, cel.DoubleType, cel.StringType, cel.IntType, cel.IntType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(strconv.AppendFloat([]byte(args[0].(types.String).Value().(string)), args[1].(types.Double).Value().(float64), args[2].(types.String).Value().(string)[0], int(args[3].(types.Int).Value().(int64)), int(args[4].(types.Int).Value().(int64))))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"appendInt\"),\n\t\t\tOverloadFunc(createStringsID(\"appendInt_bytes_int_int_bytes\"), []*cel.Type{cel.BytesType, cel.IntType, cel.IntType}, cel.BytesType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Bytes(strconv.AppendInt(args[0].(types.Bytes).Value().([]byte), args[1].(types.Int).Value().(int64), int(args[2].(types.Int).Value().(int64))))\n\t\t\t\t},\n\t\t\t),\n\t\t\tOverloadFunc(createStringsID(\"appendInt_string_int_int_string\"), []*cel.Type{cel.StringType, cel.IntType, cel.IntType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(strconv.AppendInt([]byte(args[0].(types.String).Value().(string)), args[1].(types.Int).Value().(int64), int(args[2].(types.Int).Value().(int64))))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"appendQuote\"),\n\t\t\tOverloadFunc(createStringsID(\"appendQuote_bytes_string_bytes\"), []*cel.Type{cel.BytesType, cel.StringType}, cel.BytesType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Bytes(strconv.AppendQuote(args[0].(types.Bytes).Value().([]byte), args[1].(types.String).Value().(string)))\n\t\t\t\t},\n\t\t\t),\n\t\t\tOverloadFunc(createStringsID(\"appendQuote_string_string_string\"), []*cel.Type{cel.StringType, cel.StringType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(strconv.AppendQuote([]byte(args[0].(types.String).Value().(string)), args[1].(types.String).Value().(string)))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"appendQuoteRune\"),\n\t\t\tOverloadFunc(createStringsID(\"appendQuoteRune_bytes_int_bytes\"), []*cel.Type{cel.BytesType, cel.StringType}, cel.BytesType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Bytes(strconv.AppendQuoteRune(args[0].(types.Bytes).Value().([]byte), rune(args[1].(types.String).Value().(string)[0])))\n\t\t\t\t},\n\t\t\t),\n\t\t\tOverloadFunc(createStringsID(\"appendQuoteRune_string_int_string\"), []*cel.Type{cel.StringType, cel.StringType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(strconv.AppendQuoteRune([]byte(args[0].(types.String).Value().(string)), rune(args[1].(types.String).Value().(string)[0])))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"appendQuoteRuneToASCII\"),\n\t\t\tOverloadFunc(createStringsID(\"appendQuoteRuneToASCII_bytes_string_bytes\"), []*cel.Type{cel.BytesType, cel.StringType}, cel.BytesType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Bytes(strconv.AppendQuoteRuneToASCII(args[0].(types.Bytes).Value().([]byte), rune(args[1].(types.String).Value().(string)[0])))\n\t\t\t\t},\n\t\t\t),\n\t\t\tOverloadFunc(createStringsID(\"appendQuoteRuneToASCII_string_string_string\"), []*cel.Type{cel.StringType, cel.StringType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(strconv.AppendQuoteRuneToASCII([]byte(args[0].(types.String).Value().(string)), rune(args[1].(types.String).Value().(string)[0])))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"appendQuoteRuneToGraphic\"),\n\t\t\tOverloadFunc(createStringsID(\"appendQuoteRuneToGraphic_bytes_string_bytes\"), []*cel.Type{cel.BytesType, cel.StringType}, cel.BytesType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Bytes(strconv.AppendQuoteRuneToGraphic(args[0].(types.Bytes).Value().([]byte), rune(args[1].(types.String).Value().(string)[0])))\n\t\t\t\t},\n\t\t\t),\n\t\t\tOverloadFunc(createStringsID(\"appendQuoteRuneToGraphic_string_string_string\"), []*cel.Type{cel.StringType, cel.StringType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(strconv.AppendQuoteRuneToGraphic([]byte(args[0].(types.String).Value().(string)), rune(args[1].(types.String).Value().(string)[0])))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"appendQuoteToASCII\"),\n\t\t\tOverloadFunc(createStringsID(\"appendQuoteToASCII_bytes_string_bytes\"), []*cel.Type{cel.BytesType, cel.StringType}, cel.BytesType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Bytes(strconv.AppendQuoteToASCII(args[0].(types.Bytes).Value().([]byte), args[1].(types.String).Value().(string)))\n\t\t\t\t},\n\t\t\t),\n\t\t\tOverloadFunc(createStringsID(\"appendQuoteToASCII_string_string_string\"), []*cel.Type{cel.StringType, cel.StringType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(strconv.AppendQuoteToASCII([]byte(args[0].(types.String).Value().(string)), args[1].(types.String).Value().(string)))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"appendQuoteToGraphic\"),\n\t\t\tOverloadFunc(createStringsID(\"appendQuoteToGraphic_bytes_string_bytes\"), []*cel.Type{cel.BytesType, cel.StringType}, cel.BytesType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Bytes(strconv.AppendQuoteToGraphic(args[0].(types.Bytes).Value().([]byte), args[1].(types.String).Value().(string)))\n\t\t\t\t},\n\t\t\t),\n\t\t\tOverloadFunc(createStringsID(\"appendQuoteToGraphic_string_string_string\"), []*cel.Type{cel.StringType, cel.StringType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(strconv.AppendQuoteToGraphic([]byte(args[0].(types.String).Value().(string)), args[1].(types.String).Value().(string)))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"appendUint\"),\n\t\t\tOverloadFunc(createStringsID(\"appendUint_bytes_uint_int_bytes\"), []*cel.Type{cel.BytesType, cel.UintType, cel.IntType}, cel.BytesType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Bytes(strconv.AppendUint(args[0].(types.Bytes).Value().([]byte), args[1].(types.Uint).Value().(uint64), int(args[2].(types.Int).Value().(int64))))\n\t\t\t\t},\n\t\t\t),\n\t\t\tOverloadFunc(createStringsID(\"appendUint_string_uint_int_string\"), []*cel.Type{cel.StringType, cel.UintType, cel.IntType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(strconv.AppendUint([]byte(args[0].(types.String).Value().(string)), args[1].(types.Uint).Value().(uint64), int(args[2].(types.Int).Value().(int64))))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"atoi\"),\n\t\t\tOverloadFunc(createStringsID(\"atoi_string_int\"), []*cel.Type{cel.StringType}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\ti, err := strconv.Atoi(args[0].(types.String).Value().(string))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.Int(i)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"canBackquote\"),\n\t\t\tOverloadFunc(createStringsID(\"canBackquote_string_bool\"), []*cel.Type{cel.StringType}, cel.BoolType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Bool(strconv.CanBackquote(args[0].(types.String).Value().(string)))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"formatBool\"),\n\t\t\tOverloadFunc(createStringsID(\"formatBool_bool_string\"), []*cel.Type{cel.BoolType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(strconv.FormatBool(args[0].(types.Bool).Value().(bool)))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"formatComplex\"),\n\t\t\tOverloadFunc(createStringsID(\"formatComplex_complex128_string_int_int_string\"), []*cel.Type{cel.ListType(cel.DoubleType), cel.StringType, cel.IntType, cel.IntType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\tcList := args[0].(traits.Lister)\n\t\t\t\t\tc := complex(cList.Get(types.IntZero).(types.Double).Value().(float64), cList.Get(types.IntOne).(types.Double).Value().(float64))\n\t\t\t\t\treturn types.String(strconv.FormatComplex(c, args[1].(types.String).Value().(string)[0], int(args[2].(types.Int).Value().(int64)), int(args[3].(types.Int).Value().(int64))))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"formatFloat\"),\n\t\t\tOverloadFunc(createStringsID(\"formatFloat_float64_string_int_int_string\"), []*cel.Type{cel.DoubleType, cel.StringType, cel.IntType, cel.IntType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(strconv.FormatFloat(args[0].(types.Double).Value().(float64), args[1].(types.String).Value().(string)[0], int(args[2].(types.Int).Value().(int64)), int(args[3].(types.Int).Value().(int64))))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"formatInt\"),\n\t\t\tOverloadFunc(createStringsID(\"formatInt_int_int_string\"), []*cel.Type{cel.IntType, cel.IntType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(strconv.FormatInt(args[0].(types.Int).Value().(int64), int(args[1].(types.Int).Value().(int64))))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"formatUint\"),\n\t\t\tOverloadFunc(createStringsID(\"formatUint_uint_int_string\"), []*cel.Type{cel.UintType, cel.IntType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(strconv.FormatUint(args[0].(types.Uint).Value().(uint64), int(args[1].(types.Int).Value().(int64))))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"isGraphic\"),\n\t\t\tOverloadFunc(createStringsID(\"isGraphic_byte_bool\"), []*cel.Type{cel.BytesType}, cel.BoolType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Bool(strconv.IsGraphic(rune(args[0].(types.Bytes).Value().(byte))))\n\t\t\t\t},\n\t\t\t),\n\t\t\tOverloadFunc(createStringsID(\"isGraphic_string_bool\"), []*cel.Type{cel.StringType}, cel.BoolType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Bool(strconv.IsGraphic(rune(args[0].(types.String).Value().(string)[0])))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"isPrint\"),\n\t\t\tOverloadFunc(createStringsID(\"isPrint_byte_bool\"), []*cel.Type{cel.BytesType}, cel.BoolType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Bool(strconv.IsPrint(rune(args[0].(types.Bytes).Value().(byte))))\n\t\t\t\t},\n\t\t\t),\n\t\t\tOverloadFunc(createStringsID(\"isPrint_string_bool\"), []*cel.Type{cel.StringType}, cel.BoolType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Bool(strconv.IsPrint(rune(args[0].(types.String).Value().(string)[0])))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"itoa\"),\n\t\t\tOverloadFunc(createStringsID(\"itoa_int_string\"), []*cel.Type{cel.IntType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(strconv.Itoa(int(args[0].(types.Int).Value().(int64))))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"parseBool\"),\n\t\t\tOverloadFunc(createStringsID(\"parseBool_string_bool\"), []*cel.Type{cel.StringType}, cel.BoolType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\tb, err := strconv.ParseBool(args[0].(types.String).Value().(string))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.Bool(b)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"parseComplex\"),\n\t\t\tOverloadFunc(createStringsID(\"parseComplex_string_int_complex128\"), []*cel.Type{cel.StringType, cel.IntType}, cel.ListType(cel.DoubleType),\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\tc, err := strconv.ParseComplex(args[0].(types.String).Value().(string), int(args[1].(types.Int).Value().(int64)))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.NewDynamicList(types.DefaultTypeAdapter, []ref.Val{types.Double(real(c)), types.Double(imag(c))})\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"parseFloat\"),\n\t\t\tOverloadFunc(createStringsID(\"parseFloat_string_int_float64\"), []*cel.Type{cel.StringType, cel.IntType}, cel.DoubleType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\tf, err := strconv.ParseFloat(args[0].(types.String).Value().(string), int(args[1].(types.Int).Value().(int64)))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.Double(f)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"parseInt\"),\n\t\t\tOverloadFunc(createStringsID(\"parseInt_string_int_int_int\"), []*cel.Type{cel.StringType, cel.IntType, cel.IntType}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\ti, err := strconv.ParseInt(args[0].(types.String).Value().(string), int(args[1].(types.Int).Value().(int64)), int(args[2].(types.Int).Value().(int64)))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.Int(i)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"parseUint\"),\n\t\t\tOverloadFunc(createStringsID(\"parseUint_string_int_int__uint\"), []*cel.Type{cel.StringType, cel.IntType, cel.IntType}, cel.UintType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\tu, err := strconv.ParseUint(args[0].(types.String).Value().(string), int(args[1].(types.Int).Value().(int64)), int(args[2].(types.Int).Value().(int64)))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.Uint(u)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"quote\"),\n\t\t\tOverloadFunc(createStringsID(\"quote_string_string\"), []*cel.Type{cel.StringType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(strconv.Quote(args[0].(types.String).Value().(string)))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"quoteRune\"),\n\t\t\tOverloadFunc(createStringsID(\"quoteRune_string_string\"), []*cel.Type{cel.StringType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(strconv.QuoteRune(rune(args[0].(types.String).Value().(string)[0])))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"quoteRuneToASCII\"),\n\t\t\tOverloadFunc(createStringsID(\"quoteRuneToASCII_string_string\"), []*cel.Type{cel.StringType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(strconv.QuoteRuneToASCII(rune(args[0].(types.String).Value().(string)[0])))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"quoteRuneToGraphic\"),\n\t\t\tOverloadFunc(createStringsID(\"quoteRuneToGraphic_string_string\"), []*cel.Type{cel.StringType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(strconv.QuoteRuneToGraphic(rune(args[0].(types.String).Value().(string)[0])))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"quoteToASCII\"),\n\t\t\tOverloadFunc(createStringsID(\"quoteToASCII_string_string\"), []*cel.Type{cel.StringType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(strconv.QuoteToASCII(args[0].(types.String).Value().(string)))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"quoteToGraphic\"),\n\t\t\tOverloadFunc(createStringsID(\"quoteToGraphic_string_string\"), []*cel.Type{cel.StringType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(strconv.QuoteToGraphic(args[0].(types.String).Value().(string)))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"quotedPrefix\"),\n\t\t\tOverloadFunc(createStringsID(\"quotedPrefix_string_string\"), []*cel.Type{cel.StringType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\ts, err := strconv.QuotedPrefix(args[0].(types.String).Value().(string))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.String(s)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"unquote\"),\n\t\t\tOverloadFunc(createStringsID(\"unquote_string_string\"), []*cel.Type{cel.StringType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\ts, err := strconv.Unquote(args[0].(types.String).Value().(string))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.String(s)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateStringsName(\"unquoteChar\"),\n\t\t\tOverloadFunc(createStringsID(\"unquoteChar_string_byte_string_bool_string\"), []*cel.Type{cel.StringType, cel.StringType}, cel.ListType(cel.AnyType),\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\ts, b, t, err := strconv.UnquoteChar(args[0].(types.String).Value().(string), args[1].(types.String).Value().(string)[0])\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.NewDynamicList(types.DefaultTypeAdapter, []ref.Val{types.String(s), types.Bool(b), types.String(t)})\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t} {\n\t\topts = append(opts, funcOpts...)\n\t}\n\n\treturn opts\n}\n\nfunc (lib *StringsLibrary) ProgramOptions() []cel.ProgramOption {\n\treturn []cel.ProgramOption{}\n}\n"
  },
  {
    "path": "grpc/federation/cel/strings_test.go",
    "content": "package cel_test\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strconv\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/google/cel-go/cel\"\n\t\"github.com/google/cel-go/common/types\"\n\t\"github.com/google/cel-go/common/types/ref\"\n\t\"github.com/google/cel-go/common/types/traits\"\n\t\"github.com/google/go-cmp/cmp\"\n\t\"golang.org/x/text/cases\"\n\t\"golang.org/x/text/language\"\n\n\tcellib \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n)\n\nfunc TestStringsFunctions(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\texpr string\n\t\targs map[string]any\n\t\tcmp  func(ref.Val) error\n\t}{\n\t\t// ext library\n\t\t{\n\t\t\tname: \"charAt\",\n\t\t\texpr: \"'hello'.charAt(4)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotV, types.String(\"o\")); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"indexOf\",\n\t\t\texpr: \"'hello mellow'.indexOf('ello')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotV, types.Int(1)); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"indexOf\",\n\t\t\texpr: \"'hello mellow'.indexOf('ello', 2)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotV, types.Int(7)); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"lastIndexOf\",\n\t\t\texpr: \"'hello mellow'.lastIndexOf('')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotV, types.Int(12)); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"lastIndexOf\",\n\t\t\texpr: \"'hello mellow'.lastIndexOf('ello', 6)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotV, types.Int(1)); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"lowerAscii\",\n\t\t\texpr: \"'TacoCat'.lowerAscii()\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotV, types.String(\"tacocat\")); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"replace\",\n\t\t\texpr: \"'hello hello'.replace('he', 'we')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotV, types.String(\"wello wello\")); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"replace\",\n\t\t\texpr: \"'hello hello'.replace('he', 'we', 1)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotV, types.String(\"wello hello\")); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"split\",\n\t\t\texpr: \"'hello hello hello'.split(' ')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(traits.Lister)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tvar strs []string\n\t\t\t\tfor idx := range gotV.Size().(types.Int) {\n\t\t\t\t\tstrs = append(strs, string(gotV.Get(idx).(types.String)))\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(strs, []string{\"hello\", \"hello\", \"hello\"}); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"split\",\n\t\t\texpr: \"'hello hello hello'.split(' ', 2)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(traits.Lister)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tvar strs []string\n\t\t\t\tfor idx := range gotV.Size().(types.Int) {\n\t\t\t\t\tstrs = append(strs, string(gotV.Get(idx).(types.String)))\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(strs, []string{\"hello\", \"hello hello\"}); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"substring\",\n\t\t\texpr: \"'tacocat'.substring(4)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotV, types.String(\"cat\")); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"substring\",\n\t\t\texpr: \"'tacocat'.substring(0, 4)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotV, types.String(\"taco\")); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"trim\",\n\t\t\texpr: `'  \\ttrim\\n    '.trim()`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotV, types.String(\"trim\")); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"upperAscii\",\n\t\t\texpr: `'TacoCat'.upperAscii()`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotV, types.String(\"TACOCAT\")); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"format\",\n\t\t\texpr: `\"this is a string: %s\\nand an integer: %d\".format([\"str\", 42])`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotV, types.String(\"this is a string: str\\nand an integer: 42\")); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"join\",\n\t\t\texpr: \"['hello', 'mellow'].join()\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotV, types.String(\"hellomellow\")); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"join\",\n\t\t\texpr: \"['hello', 'mellow'].join(' ')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotV, types.String(\"hello mellow\")); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"reverse\",\n\t\t\texpr: `'gums'.reverse()`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotV, types.String(\"smug\")); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"quote\",\n\t\t\texpr: `strings.quote('single-quote with \"double quote\"')`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotV, types.String(`\"single-quote with \\\"double quote\\\"\"`)); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\n\t\t// strings package\n\t\t{\n\t\t\tname: \"clone\",\n\t\t\texpr: \"grpc.federation.strings.clone('abc')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.String(\"abc\")\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"compare\",\n\t\t\texpr: \"grpc.federation.strings.compare('abc', 'abd')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.Int(strings.Compare(\"abc\", \"abd\"))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"contains\",\n\t\t\texpr: \"grpc.federation.strings.contains('abc', 'a')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Bool)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := strings.Contains(\"abc\", \"a\")\n\t\t\t\tif diff := cmp.Diff(bool(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"containsAny\",\n\t\t\texpr: \"grpc.federation.strings.containsAny('fail', 'ui')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Bool)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := strings.ContainsAny(\"fail\", \"ui\")\n\t\t\t\tif diff := cmp.Diff(bool(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"containsRune\",\n\t\t\texpr: \"grpc.federation.strings.containsRune('aardvark', 97)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Bool)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := strings.ContainsRune(\"aardvark\", 97)\n\t\t\t\tif diff := cmp.Diff(bool(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"count\",\n\t\t\texpr: \"grpc.federation.strings.count('cheese', 'e')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.Int(strings.Count(\"cheese\", \"e\"))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"cut\",\n\t\t\texpr: \"grpc.federation.strings.cut('abc', 'b')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(traits.Lister)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tstrs := make([]string, gotV.Size().(types.Int))\n\t\t\t\tfor i := 0; i < int(gotV.Size().(types.Int)); i++ {\n\t\t\t\t\tstrs[i] = gotV.Get(types.Int(i)).(types.String).Value().(string)\n\t\t\t\t}\n\t\t\t\tbefore, after, _ := strings.Cut(\"abc\", \"b\")\n\t\t\t\texpected := []string{before, after}\n\t\t\t\tif diff := cmp.Diff(strs, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"cutPrefix\",\n\t\t\texpr: \"grpc.federation.strings.cutPrefix('abc', 'a')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tc, _ := strings.CutPrefix(\"abc\", \"a\")\n\t\t\t\texpected := types.String(c)\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"cutSuffix\",\n\t\t\texpr: \"grpc.federation.strings.cutSuffix('abc', 'c')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tc, _ := strings.CutSuffix(\"abc\", \"c\")\n\t\t\t\texpected := types.String(c)\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"equalFold\",\n\t\t\texpr: \"grpc.federation.strings.equalFold('Go', 'go')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Bool)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.Bool(strings.EqualFold(\"Go\", \"go\"))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"fields\",\n\t\t\texpr: \"grpc.federation.strings.fields('a b c')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(traits.Lister)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tstrs := make([]string, gotV.Size().(types.Int))\n\t\t\t\tfor i := 0; i < int(gotV.Size().(types.Int)); i++ {\n\t\t\t\t\tstrs[i] = gotV.Get(types.Int(i)).(types.String).Value().(string)\n\t\t\t\t}\n\t\t\t\texpected := strings.Fields(\"a b c\")\n\t\t\t\tif diff := cmp.Diff(strs, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"hasPrefix\",\n\t\t\texpr: \"grpc.federation.strings.hasPrefix('abc', 'a')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Bool)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.Bool(strings.HasPrefix(\"abc\", \"a\"))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"hasSuffix\",\n\t\t\texpr: \"grpc.federation.strings.hasSuffix('abc', 'c')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Bool)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.Bool(strings.HasSuffix(\"abc\", \"c\"))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"index\",\n\t\t\texpr: \"grpc.federation.strings.index('chicken', 'ken')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.Int(strings.Index(\"chicken\", \"ken\"))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"indexAny\",\n\t\t\texpr: \"grpc.federation.strings.indexAny('chicken', 'aeiou')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.Int(strings.IndexAny(\"chicken\", \"aeiou\"))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"indexByte\",\n\t\t\texpr: \"grpc.federation.strings.indexByte('golang', 'g')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.Int(strings.IndexByte(\"golang\", 'g'))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"indexRune\",\n\t\t\texpr: \"grpc.federation.strings.indexRune('golang', 111)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.Int(strings.IndexRune(\"golang\", 111))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"join\",\n\t\t\texpr: \"grpc.federation.strings.join(['a', 'b', 'c'], ',')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.String(strings.Join([]string{\"a\", \"b\", \"c\"}, \",\"))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"lastIndex\",\n\t\t\texpr: \"grpc.federation.strings.lastIndex('go gopher', 'go')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.Int(strings.LastIndex(\"go gopher\", \"go\"))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"lastIndexAny\",\n\t\t\texpr: \"grpc.federation.strings.lastIndexAny('go gopher', 'go')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.Int(strings.LastIndexAny(\"go gopher\", \"go\"))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"lastIndexByte\",\n\t\t\texpr: \"grpc.federation.strings.lastIndexByte('golang', 'g')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.Int(strings.LastIndexByte(\"golang\", 'g'))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"repeat\",\n\t\t\texpr: \"grpc.federation.strings.repeat('a', 5)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.String(strings.Repeat(\"a\", 5))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"replace\",\n\t\t\texpr: \"grpc.federation.strings.replace('oink oink oink', 'k', 'ky', 2)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.String(strings.Replace(\"oink oink oink\", \"k\", \"ky\", 2))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"replaceAll\",\n\t\t\texpr: \"grpc.federation.strings.replaceAll('oink oink oink', 'k', 'ky')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.String(strings.ReplaceAll(\"oink oink oink\", \"k\", \"ky\"))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"split\",\n\t\t\texpr: \"grpc.federation.strings.split('a,b,c', ',')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(traits.Lister)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tstrs := make([]string, gotV.Size().(types.Int))\n\t\t\t\tfor i := 0; i < int(gotV.Size().(types.Int)); i++ {\n\t\t\t\t\tstrs[i] = gotV.Get(types.Int(i)).(types.String).Value().(string)\n\t\t\t\t}\n\t\t\t\texpected := strings.Split(\"a,b,c\", \",\")\n\t\t\t\tif diff := cmp.Diff(strs, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"splitAfter\",\n\t\t\texpr: \"grpc.federation.strings.splitAfter('a,b,c', ',')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(traits.Lister)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tstrs := make([]string, gotV.Size().(types.Int))\n\t\t\t\tfor i := 0; i < int(gotV.Size().(types.Int)); i++ {\n\t\t\t\t\tstrs[i] = gotV.Get(types.Int(i)).(types.String).Value().(string)\n\t\t\t\t}\n\t\t\t\texpected := strings.SplitAfter(\"a,b,c\", \",\")\n\t\t\t\tif diff := cmp.Diff(strs, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"splitAfterN\",\n\t\t\texpr: \"grpc.federation.strings.splitAfterN('a,b,c', ',', 2)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(traits.Lister)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tstrs := make([]string, gotV.Size().(types.Int))\n\t\t\t\tfor i := 0; i < int(gotV.Size().(types.Int)); i++ {\n\t\t\t\t\tstrs[i] = gotV.Get(types.Int(i)).(types.String).Value().(string)\n\t\t\t\t}\n\t\t\t\texpected := strings.SplitAfterN(\"a,b,c\", \",\", 2)\n\t\t\t\tif diff := cmp.Diff(strs, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"splitN\",\n\t\t\texpr: \"grpc.federation.strings.splitN('a,b,c', ',', 2)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(traits.Lister)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tstrs := make([]string, gotV.Size().(types.Int))\n\t\t\t\tfor i := 0; i < int(gotV.Size().(types.Int)); i++ {\n\t\t\t\t\tstrs[i] = gotV.Get(types.Int(i)).(types.String).Value().(string)\n\t\t\t\t}\n\t\t\t\texpected := strings.SplitN(\"a,b,c\", \",\", 2)\n\t\t\t\tif diff := cmp.Diff(strs, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"title\",\n\t\t\texpr: \"grpc.federation.strings.title('her royal highness')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tc := cases.Title(language.English)\n\t\t\t\texpected := types.String(c.String(\"her royal highness\"))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"toLower\",\n\t\t\texpr: \"grpc.federation.strings.toLower('Gopher')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.String(strings.ToLower(\"Gopher\"))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"toTitle\",\n\t\t\texpr: \"grpc.federation.strings.toTitle('loud noises')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.String(strings.ToTitle(\"loud noises\"))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"toUpper\",\n\t\t\texpr: \"grpc.federation.strings.toUpper('loud noises')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.String(strings.ToUpper(\"loud noises\"))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"toValidUTF8\",\n\t\t\texpr: \"grpc.federation.strings.toValidUTF8('abc', '\\uFFFD')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.String(strings.ToValidUTF8(\"abc\", \"\\uFFFD\"))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"trim\",\n\t\t\texpr: \"grpc.federation.strings.trim('¡¡¡Hello, Gophers!!!', '¡')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.String(strings.Trim(\"¡¡¡Hello, Gophers!!!\", \"¡\"))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"trimLeft\",\n\t\t\texpr: \"grpc.federation.strings.trimLeft('¡¡¡Hello, Gophers!!!', '¡')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.String(strings.TrimLeft(\"¡¡¡Hello, Gophers!!!\", \"¡\"))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"trimPrefix\",\n\t\t\texpr: \"grpc.federation.strings.trimPrefix('¡¡¡Hello, Gophers!!!', '¡¡¡')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.String(strings.TrimPrefix(\"¡¡¡Hello, Gophers!!!\", \"¡¡¡\"))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"trimRight\",\n\t\t\texpr: \"grpc.federation.strings.trimRight('¡¡¡Hello, Gophers!!!', '¡')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.String(strings.TrimRight(\"¡¡¡Hello, Gophers!!!\", \"¡\"))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"trimSpace\",\n\t\t\texpr: \"grpc.federation.strings.trimSpace(' \\t Hello, Gophers \\t\\t ')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.String(strings.TrimSpace(\" \\t Hello, Gophers \\t\\t \"))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"trimSuffix\",\n\t\t\texpr: \"grpc.federation.strings.trimSuffix('¡¡¡Hello, Gophers!!!', '!!!')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.String(strings.TrimSuffix(\"¡¡¡Hello, Gophers!!!\", \"!!!\"))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\n\t\t// strconv package\n\t\t{\n\t\t\tname: \"appendBool(bytes)\",\n\t\t\texpr: \"grpc.federation.strings.appendBool(b\\\"abc\\\", true)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\t_, ok := got.(types.Bytes)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\n\t\t\t\texpected := types.Bytes(strconv.AppendBool([]byte(\"abc\"), true))\n\t\t\t\tif diff := cmp.Diff(got, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"appendBool(string)\",\n\t\t\texpr: \"grpc.federation.strings.appendBool('ab', true)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.String(strconv.AppendBool([]byte(\"ab\"), true))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"appendFloat(bytes)\",\n\t\t\texpr: \"grpc.federation.strings.appendFloat(b\\\"abc\\\", 1.23, 'f', 2, 64)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\t_, ok := got.(types.Bytes)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\n\t\t\t\texpected := types.Bytes(strconv.AppendFloat([]byte(\"abc\"), 1.23, 'f', 2, 64))\n\t\t\t\tif diff := cmp.Diff(got, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"appendFloat(string)\",\n\t\t\texpr: \"grpc.federation.strings.appendFloat('ab', 1.23, 'f', 2, 64)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.String(strconv.AppendFloat([]byte(\"ab\"), 1.23, 'f', 2, 64))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"appendInt(bytes)\",\n\t\t\texpr: \"grpc.federation.strings.appendInt(b\\\"abc\\\", 123, 10)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\t_, ok := got.(types.Bytes)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\n\t\t\t\texpected := types.Bytes(strconv.AppendInt([]byte(\"abc\"), 123, 10))\n\t\t\t\tif diff := cmp.Diff(got, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"appendInt(string)\",\n\t\t\texpr: \"grpc.federation.strings.appendInt('ab', 123, 10)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.String(strconv.AppendInt([]byte(\"ab\"), 123, 10))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"appendQuote(bytes)\",\n\t\t\texpr: \"grpc.federation.strings.appendQuote(b\\\"abc\\\", 'a')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\t_, ok := got.(types.Bytes)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\n\t\t\t\texpected := types.Bytes(strconv.AppendQuote([]byte(\"abc\"), \"a\"))\n\t\t\t\tif diff := cmp.Diff(got, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"appendQuote(string)\",\n\t\t\texpr: \"grpc.federation.strings.appendQuote('ab', 'a')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.String(strconv.AppendQuote([]byte(\"ab\"), \"a\"))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"appendQuoteRune(bytes)\",\n\t\t\texpr: \"grpc.federation.strings.appendQuoteRune(b\\\"abc\\\", 'a')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\t_, ok := got.(types.Bytes)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\n\t\t\t\texpected := types.Bytes(strconv.AppendQuoteRune([]byte(\"abc\"), 'a'))\n\t\t\t\tif diff := cmp.Diff(got, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"appendQuoteRune(string)\",\n\t\t\texpr: \"grpc.federation.strings.appendQuoteRune('ab', 'a')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.String(strconv.AppendQuoteRune([]byte(\"ab\"), 'a'))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"appendQuoteRuneToASCII(bytes)\",\n\t\t\texpr: \"grpc.federation.strings.appendQuoteRuneToASCII(b\\\"abc\\\", 'a')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\t_, ok := got.(types.Bytes)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\n\t\t\t\texpected := types.Bytes(strconv.AppendQuoteRuneToASCII([]byte(\"abc\"), 'a'))\n\t\t\t\tif diff := cmp.Diff(got, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"appendQuoteRuneToASCII(string)\",\n\t\t\texpr: \"grpc.federation.strings.appendQuoteRuneToASCII('ab', 'a')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.String(strconv.AppendQuoteRuneToASCII([]byte(\"ab\"), 'a'))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"appendQuoteRuneToGraphic(bytes)\",\n\t\t\texpr: \"grpc.federation.strings.appendQuoteRuneToGraphic(b\\\"abc\\\", 'a')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\t_, ok := got.(types.Bytes)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\n\t\t\t\texpected := types.Bytes(strconv.AppendQuoteRuneToGraphic([]byte(\"abc\"), 'a'))\n\t\t\t\tif diff := cmp.Diff(got, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"appendQuoteRuneToGraphic(string)\",\n\t\t\texpr: \"grpc.federation.strings.appendQuoteRuneToGraphic('ab', 'a')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.String(strconv.AppendQuoteRuneToGraphic([]byte(\"ab\"), 'a'))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"appendQuoteToASCII(bytes)\",\n\t\t\texpr: \"grpc.federation.strings.appendQuoteToASCII(b\\\"abc\\\", 'a')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\t_, ok := got.(types.Bytes)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\n\t\t\t\texpected := types.Bytes(strconv.AppendQuoteToASCII([]byte(\"abc\"), \"a\"))\n\t\t\t\tif diff := cmp.Diff(got, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"appendQuoteToASCII(string)\",\n\t\t\texpr: \"grpc.federation.strings.appendQuoteToASCII('ab', 'a')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.String(strconv.AppendQuoteToASCII([]byte(\"ab\"), \"a\"))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"appendQuoteToGraphic(bytes)\",\n\t\t\texpr: \"grpc.federation.strings.appendQuoteToGraphic(b\\\"abc\\\", 'a')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\t_, ok := got.(types.Bytes)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\n\t\t\t\texpected := types.Bytes(strconv.AppendQuoteToGraphic([]byte(\"abc\"), \"a\"))\n\t\t\t\tif diff := cmp.Diff(got, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"appendQuoteToGraphic(string)\",\n\t\t\texpr: \"grpc.federation.strings.appendQuoteToGraphic('ab', 'a')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.String(strconv.AppendQuoteToGraphic([]byte(\"ab\"), \"a\"))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"appendUint(bytes)\",\n\t\t\texpr: \"grpc.federation.strings.appendUint(b\\\"abc\\\", uint(123), 10)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\t_, ok := got.(types.Bytes)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\n\t\t\t\texpected := types.Bytes(strconv.AppendUint([]byte(\"abc\"), 123, 10))\n\t\t\t\tif diff := cmp.Diff(got, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"appendUint(string)\",\n\t\t\texpr: \"grpc.federation.strings.appendUint('ab', uint(123), 10)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.String(strconv.AppendUint([]byte(\"ab\"), 123, 10))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"atoi\",\n\t\t\texpr: \"grpc.federation.strings.atoi('123')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\ti, err := strconv.Atoi(\"123\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := types.Int(i)\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"canBackquote\",\n\t\t\texpr: \"grpc.federation.strings.canBackquote('abc')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Bool)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.Bool(strconv.CanBackquote(\"abc\"))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"formatBool\",\n\t\t\texpr: \"grpc.federation.strings.formatBool(true)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.String(strconv.FormatBool(true))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"formatComplex\",\n\t\t\texpr: \"grpc.federation.strings.formatComplex([1.23, 4.56], 'f', 2, 64)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\n\t\t\t\texpected := types.String(strconv.FormatComplex(1.23+4.56i, 'f', 2, 64))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"formatFloat\",\n\t\t\texpr: \"grpc.federation.strings.formatFloat(1.23, 'f', 2, 64)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\n\t\t\t\texpected := types.String(strconv.FormatFloat(1.23, 'f', 2, 64))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"formatInt\",\n\t\t\texpr: \"grpc.federation.strings.formatInt(123, 10)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\n\t\t\t\texpected := types.String(strconv.FormatInt(123, 10))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"formatUint\",\n\t\t\texpr: \"grpc.federation.strings.formatUint(uint(123), 10)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\n\t\t\t\texpected := types.String(strconv.FormatUint(123, 10))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"isGraphic\",\n\t\t\texpr: \"grpc.federation.strings.isGraphic('a')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Bool)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\n\t\t\t\texpected := types.Bool(strconv.IsGraphic('a'))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"isPrint\",\n\t\t\texpr: \"grpc.federation.strings.isPrint('a')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Bool)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\n\t\t\t\texpected := types.Bool(strconv.IsPrint('a'))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"itoa\",\n\t\t\texpr: \"grpc.federation.strings.itoa(123)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\n\t\t\t\texpected := types.String(strconv.Itoa(123))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"parseBool\",\n\t\t\texpr: \"grpc.federation.strings.parseBool('true')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Bool)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\n\t\t\t\texpected, err := strconv.ParseBool(\"true\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotV, types.Bool(expected)); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"parseComplex\",\n\t\t\texpr: \"grpc.federation.strings.parseComplex('1.23', 64)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(traits.Lister)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\n\t\t\t\tc, err := strconv.ParseComplex(\"1.23\", 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tre, im := real(c), imag(c)\n\t\t\t\texpected := []ref.Val{types.Double(re), types.Double(im)}\n\t\t\t\tif diff := cmp.Diff(gotV.Get(types.Int(0)), expected[0]); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotV.Get(types.Int(1)), expected[1]); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"parseFloat\",\n\t\t\texpr: \"grpc.federation.strings.parseFloat('1.23', 64)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Double)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\n\t\t\t\texpected, err := strconv.ParseFloat(\"1.23\", 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotV, types.Double(expected)); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"parseInt\",\n\t\t\texpr: \"grpc.federation.strings.parseInt('123', 10, 64)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\n\t\t\t\texpected, err := strconv.ParseInt(\"123\", 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotV, types.Int(expected)); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"parseUint\",\n\t\t\texpr: \"grpc.federation.strings.parseUint('123', 10, 64)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Uint)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\n\t\t\t\texpected, err := strconv.ParseUint(\"123\", 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotV, types.Uint(expected)); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"quote\",\n\t\t\texpr: \"grpc.federation.strings.quote('abc')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\n\t\t\t\texpected := types.String(strconv.Quote(\"abc\"))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"quoteRune\",\n\t\t\texpr: \"grpc.federation.strings.quoteRune('a')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\n\t\t\t\texpected := types.String(strconv.QuoteRune('a'))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"quoteRuneToASCII\",\n\t\t\texpr: \"grpc.federation.strings.quoteRuneToASCII('a')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\n\t\t\t\texpected := types.String(strconv.QuoteRuneToASCII('a'))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"quoteRuneToGraphic\",\n\t\t\texpr: \"grpc.federation.strings.quoteRuneToGraphic('a')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\n\t\t\t\texpected := types.String(strconv.QuoteRuneToGraphic('a'))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"quoteToASCII\",\n\t\t\texpr: \"grpc.federation.strings.quoteToASCII('abc')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\n\t\t\t\texpected := types.String(strconv.QuoteToASCII(\"abc\"))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"quoteToGraphic\",\n\t\t\texpr: \"grpc.federation.strings.quoteToGraphic('abc')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\n\t\t\t\texpected := types.String(strconv.QuoteToGraphic(\"abc\"))\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"quotedPrefix\",\n\t\t\texpr: \"grpc.federation.strings.quotedPrefix('`or backquoted` with more trailing text')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\n\t\t\t\texpected, err := strconv.QuotedPrefix(\"`or backquoted` with more trailing text\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\n\t\t\t\tif diff := cmp.Diff(gotV.Value(), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"unquote\",\n\t\t\texpr: \"grpc.federation.strings.unquote('\\\"abc\\\"')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\n\t\t\t\texpected, err := strconv.Unquote(\"\\\"abc\\\"\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotV, types.String(expected)); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"unquoteChar\",\n\t\t\texpr: \"grpc.federation.strings.unquoteChar('`a`', 'a')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(traits.Lister)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\ts := rune(gotV.Get(types.Int(0)).Value().(string)[0])\n\t\t\t\tb := gotV.Get(types.Int(1)).Value().(bool)\n\t\t\t\tt2 := gotV.Get(types.Int(2)).Value().(string)\n\t\t\t\tes, eb, et, err := strconv.UnquoteChar(\"`a`\", 'a')\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(s, es); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(b, eb); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(t2, et); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tenv, err := cel.NewEnv(\n\t\t\t\tcel.Variable(cellib.ContextVariableName, cel.ObjectType(cellib.ContextTypeName)),\n\t\t\t\tcel.Lib(cellib.NewStringsLibrary()),\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tast, iss := env.Compile(test.expr)\n\t\t\tif iss.Err() != nil {\n\t\t\t\tt.Fatal(iss.Err())\n\t\t\t}\n\t\t\tprogram, err := env.Program(ast)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\targs := map[string]any{cellib.ContextVariableName: cellib.NewContextValue(context.Background())}\n\t\t\tfor k, v := range test.args {\n\t\t\t\targs[k] = v\n\t\t\t}\n\t\t\tout, _, err := program.Eval(args)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tif err := test.cmp(out); err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "grpc/federation/cel/testdata/Makefile",
    "content": "generate:\n\tprotoc --go_out=./testpb --go_opt=paths=source_relative ./test.proto\n"
  },
  {
    "path": "grpc/federation/cel/testdata/plugin/main.go",
    "content": "package main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n)\n\nfunc main() {\n\tgrpcfed.PluginMainLoop(\n\t\tgrpcfed.CELPluginVersionSchema{},\n\t\tfunc(ctx context.Context, req *grpcfed.CELPluginRequest) (*grpcfed.CELPluginResponse, error) {\n\t\t\tswitch req.GetMethod() {\n\t\t\tcase \"foo\":\n\t\t\t\tif len(req.GetArgs()) != 0 {\n\t\t\t\t\treturn nil, fmt.Errorf(\"%s: invalid argument number: %d. expected number is %d\", req.GetMethod(), len(req.GetArgs()), 0)\n\t\t\t\t}\n\t\t\t\tret, err := foo(ctx)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn grpcfed.ToInt64CELPluginResponse(ret)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"unexpected method name: %s\", req.GetMethod())\n\t\t},\n\t)\n}\n\nfunc foo(ctx context.Context) (int64, error) {\n\treturn 10, nil\n}\n"
  },
  {
    "path": "grpc/federation/cel/testdata/test.proto",
    "content": "syntax = \"proto3\";\n\npackage grpc.federation.cel.test;\n\noption go_package = \"github.com/mercari/grpc-federation/grpc/federation/cel/testdata/testpb\";\n\nmessage Message {\n  string id  = 1;\n  int32 num = 2;\n  InnerMessage inner = 3;\n}\n\nmessage InnerMessage {\n  string id = 1;\n}\n"
  },
  {
    "path": "grpc/federation/cel/testdata/testpb/test.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.30.0\n// \tprotoc        v3.21.9\n// source: test.proto\n\npackage testpb\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Message struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId    string        `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tNum   int32         `protobuf:\"varint,2,opt,name=num,proto3\" json:\"num,omitempty\"`\n\tInner *InnerMessage `protobuf:\"bytes,3,opt,name=inner,proto3\" json:\"inner,omitempty\"`\n}\n\nfunc (x *Message) Reset() {\n\t*x = Message{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_test_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Message) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Message) ProtoMessage() {}\n\nfunc (x *Message) ProtoReflect() protoreflect.Message {\n\tmi := &file_test_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Message.ProtoReflect.Descriptor instead.\nfunc (*Message) Descriptor() ([]byte, []int) {\n\treturn file_test_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Message) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *Message) GetNum() int32 {\n\tif x != nil {\n\t\treturn x.Num\n\t}\n\treturn 0\n}\n\nfunc (x *Message) GetInner() *InnerMessage {\n\tif x != nil {\n\t\treturn x.Inner\n\t}\n\treturn nil\n}\n\ntype InnerMessage struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n}\n\nfunc (x *InnerMessage) Reset() {\n\t*x = InnerMessage{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_test_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *InnerMessage) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*InnerMessage) ProtoMessage() {}\n\nfunc (x *InnerMessage) ProtoReflect() protoreflect.Message {\n\tmi := &file_test_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use InnerMessage.ProtoReflect.Descriptor instead.\nfunc (*InnerMessage) Descriptor() ([]byte, []int) {\n\treturn file_test_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *InnerMessage) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nvar File_test_proto protoreflect.FileDescriptor\n\nvar file_test_proto_rawDesc = []byte{\n\t0x0a, 0x0a, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x18, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x63, 0x65,\n\t0x6c, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x22, 0x69, 0x0a, 0x07, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67,\n\t0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,\n\t0x64, 0x12, 0x10, 0x0a, 0x03, 0x6e, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03,\n\t0x6e, 0x75, 0x6d, 0x12, 0x3c, 0x0a, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e,\n\t0x6e, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x69, 0x6e, 0x6e, 0x65,\n\t0x72, 0x22, 0x1e, 0x0a, 0x0c, 0x49, 0x6e, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67,\n\t0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,\n\t0x64, 0x42, 0x48, 0x5a, 0x46, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x6d, 0x65, 0x72, 0x63, 0x61, 0x72, 0x69, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x63, 0x65, 0x6c, 0x2f, 0x74, 0x65, 0x73, 0x74,\n\t0x64, 0x61, 0x74, 0x61, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_test_proto_rawDescOnce sync.Once\n\tfile_test_proto_rawDescData = file_test_proto_rawDesc\n)\n\nfunc file_test_proto_rawDescGZIP() []byte {\n\tfile_test_proto_rawDescOnce.Do(func() {\n\t\tfile_test_proto_rawDescData = protoimpl.X.CompressGZIP(file_test_proto_rawDescData)\n\t})\n\treturn file_test_proto_rawDescData\n}\n\nvar file_test_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_test_proto_goTypes = []interface{}{\n\t(*Message)(nil),      // 0: grpc.federation.cel.test.Message\n\t(*InnerMessage)(nil), // 1: grpc.federation.cel.test.InnerMessage\n}\nvar file_test_proto_depIdxs = []int32{\n\t1, // 0: grpc.federation.cel.test.Message.inner:type_name -> grpc.federation.cel.test.InnerMessage\n\t1, // [1:1] is the sub-list for method output_type\n\t1, // [1:1] is the sub-list for method input_type\n\t1, // [1:1] is the sub-list for extension type_name\n\t1, // [1:1] is the sub-list for extension extendee\n\t0, // [0:1] is the sub-list for field type_name\n}\n\nfunc init() { file_test_proto_init() }\nfunc file_test_proto_init() {\n\tif File_test_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_test_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Message); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_test_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*InnerMessage); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_test_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_test_proto_goTypes,\n\t\tDependencyIndexes: file_test_proto_depIdxs,\n\t\tMessageInfos:      file_test_proto_msgTypes,\n\t}.Build()\n\tFile_test_proto = out.File\n\tfile_test_proto_rawDesc = nil\n\tfile_test_proto_goTypes = nil\n\tfile_test_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "grpc/federation/cel/time.go",
    "content": "package cel\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"github.com/google/cel-go/cel\"\n\t\"github.com/google/cel-go/common/types\"\n\t\"github.com/google/cel-go/common/types/ref\"\n\t\"google.golang.org/protobuf/types/known/timestamppb\"\n)\n\nconst TimePackageName = \"time\"\n\nvar (\n\tTimeType     = cel.ObjectType(\"grpc.federation.time.Time\")\n\tLocationType = cel.ObjectType(\"grpc.federation.time.Location\")\n)\n\nfunc (x *Time) GoTime() (time.Time, error) {\n\tloc, err := x.GetLoc().GoLocation()\n\tif err != nil {\n\t\treturn time.Time{}, err\n\t}\n\treturn x.GetTimestamp().AsTime().In(loc), nil\n}\n\nfunc (x *Location) GoLocation() (*time.Location, error) {\n\tif x.GetOffset() != 0 {\n\t\treturn time.FixedZone(x.GetName(), int(x.GetOffset())), nil\n\t}\n\tloc, err := time.LoadLocation(x.GetName())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn loc, nil\n}\n\nvar _ cel.SingletonLibrary = new(TimeLibrary)\n\ntype TimeLibrary struct {\n\ttypeAdapter types.Adapter\n}\n\nfunc NewTimeLibrary(typeAdapter types.Adapter) *TimeLibrary {\n\treturn &TimeLibrary{\n\t\ttypeAdapter: typeAdapter,\n\t}\n}\n\nfunc (lib *TimeLibrary) LibraryName() string {\n\treturn packageName(TimePackageName)\n}\n\nfunc createTimeName(name string) string {\n\treturn createName(TimePackageName, name)\n}\n\nfunc createTimeID(name string) string {\n\treturn createID(TimePackageName, name)\n}\n\nfunc (lib *TimeLibrary) refToGoTimeValue(v ref.Val) (time.Time, error) {\n\treturn v.Value().(*Time).GoTime()\n}\n\nfunc (lib *TimeLibrary) toTimeValue(v time.Time) ref.Val {\n\tname, offset := v.Zone()\n\treturn lib.typeAdapter.NativeToValue(&Time{\n\t\tTimestamp: timestamppb.New(v),\n\t\tLoc: &Location{\n\t\t\tName:   name,\n\t\t\tOffset: int64(offset),\n\t\t},\n\t})\n}\n\nfunc (lib *TimeLibrary) toLocationValue(name string, offset int) ref.Val {\n\treturn lib.typeAdapter.NativeToValue(&Location{Name: name, Offset: int64(offset)})\n}\n\nfunc (lib *TimeLibrary) CompileOptions() []cel.EnvOption {\n\topts := []cel.EnvOption{\n\t\t// Constant variables\n\t\tcel.Constant(\n\t\t\tcreateTimeName(\"LAYOUT\"),\n\t\t\ttypes.StringType,\n\t\t\ttypes.String(time.Layout),\n\t\t),\n\t\tcel.Constant(\n\t\t\tcreateTimeName(\"ANSIC\"),\n\t\t\ttypes.StringType,\n\t\t\ttypes.String(time.ANSIC),\n\t\t),\n\t\tcel.Constant(\n\t\t\tcreateTimeName(\"UNIX_DATE\"),\n\t\t\ttypes.StringType,\n\t\t\ttypes.String(time.UnixDate),\n\t\t),\n\t\tcel.Constant(\n\t\t\tcreateTimeName(\"RUBY_DATE\"),\n\t\t\ttypes.StringType,\n\t\t\ttypes.String(time.RubyDate),\n\t\t),\n\t\tcel.Constant(\n\t\t\tcreateTimeName(\"RFC822\"),\n\t\t\ttypes.StringType,\n\t\t\ttypes.String(time.RFC822),\n\t\t),\n\t\tcel.Constant(\n\t\t\tcreateTimeName(\"RFC822Z\"),\n\t\t\ttypes.StringType,\n\t\t\ttypes.String(time.RFC822Z),\n\t\t),\n\t\tcel.Constant(\n\t\t\tcreateTimeName(\"RFC850\"),\n\t\t\ttypes.StringType,\n\t\t\ttypes.String(time.RFC850),\n\t\t),\n\t\tcel.Constant(\n\t\t\tcreateTimeName(\"RFC1123\"),\n\t\t\ttypes.StringType,\n\t\t\ttypes.String(time.RFC1123),\n\t\t),\n\t\tcel.Constant(\n\t\t\tcreateTimeName(\"RFC1123Z\"),\n\t\t\ttypes.StringType,\n\t\t\ttypes.String(time.RFC1123Z),\n\t\t),\n\t\tcel.Constant(\n\t\t\tcreateTimeName(\"RFC3339\"),\n\t\t\ttypes.StringType,\n\t\t\ttypes.String(time.RFC3339),\n\t\t),\n\t\tcel.Constant(\n\t\t\tcreateTimeName(\"RFC3339NANO\"),\n\t\t\ttypes.StringType,\n\t\t\ttypes.String(time.RFC3339Nano),\n\t\t),\n\t\tcel.Constant(\n\t\t\tcreateTimeName(\"KITCHEN\"),\n\t\t\ttypes.StringType,\n\t\t\ttypes.String(time.Kitchen),\n\t\t),\n\t\tcel.Constant(\n\t\t\tcreateTimeName(\"STAMP\"),\n\t\t\ttypes.StringType,\n\t\t\ttypes.String(time.Stamp),\n\t\t),\n\t\tcel.Constant(\n\t\t\tcreateTimeName(\"STAMP_MILLI\"),\n\t\t\ttypes.StringType,\n\t\t\ttypes.String(time.StampMilli),\n\t\t),\n\t\tcel.Constant(\n\t\t\tcreateTimeName(\"STAMP_MICRO\"),\n\t\t\ttypes.StringType,\n\t\t\ttypes.String(time.StampMicro),\n\t\t),\n\t\tcel.Constant(\n\t\t\tcreateTimeName(\"STAMP_NANO\"),\n\t\t\ttypes.StringType,\n\t\t\ttypes.String(time.StampNano),\n\t\t),\n\t\tcel.Constant(\n\t\t\tcreateTimeName(\"DATETIME\"),\n\t\t\ttypes.StringType,\n\t\t\ttypes.String(time.DateTime),\n\t\t),\n\t\tcel.Constant(\n\t\t\tcreateTimeName(\"DATE_ONLY\"),\n\t\t\ttypes.StringType,\n\t\t\ttypes.String(time.DateOnly),\n\t\t),\n\t\tcel.Constant(\n\t\t\tcreateTimeName(\"TIME_ONLY\"),\n\t\t\ttypes.StringType,\n\t\t\ttypes.String(time.TimeOnly),\n\t\t),\n\t\tcel.Constant(\n\t\t\tcreateTimeName(\"NANOSECOND\"),\n\t\t\ttypes.IntType,\n\t\t\ttypes.Int(time.Nanosecond),\n\t\t),\n\t\tcel.Constant(\n\t\t\tcreateTimeName(\"MICROSECOND\"),\n\t\t\ttypes.IntType,\n\t\t\ttypes.Int(time.Microsecond),\n\t\t),\n\t\tcel.Constant(\n\t\t\tcreateTimeName(\"MILLISECOND\"),\n\t\t\ttypes.IntType,\n\t\t\ttypes.Int(time.Millisecond),\n\t\t),\n\t\tcel.Constant(\n\t\t\tcreateTimeName(\"SECOND\"),\n\t\t\ttypes.IntType,\n\t\t\ttypes.Int(time.Second),\n\t\t),\n\t\tcel.Constant(\n\t\t\tcreateTimeName(\"MINUTE\"),\n\t\t\ttypes.IntType,\n\t\t\ttypes.Int(time.Minute),\n\t\t),\n\t\tcel.Constant(\n\t\t\tcreateTimeName(\"HOUR\"),\n\t\t\ttypes.IntType,\n\t\t\ttypes.Int(time.Hour),\n\t\t),\n\t}\n\tfor _, funcOpts := range [][]cel.EnvOption{\n\t\tBindFunction(\n\t\t\tcreateTimeName(\"LOCAL\"),\n\t\t\tOverloadFunc(createTimeID(\"local_location\"), []*cel.Type{}, LocationType,\n\t\t\t\tfunc(_ context.Context, _ ...ref.Val) ref.Val {\n\t\t\t\t\treturn lib.toLocationValue(time.Local.String(), 0)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateTimeName(\"UTC\"),\n\t\t\tOverloadFunc(createTimeID(\"utc_location\"), []*cel.Type{}, LocationType,\n\t\t\t\tfunc(_ context.Context, _ ...ref.Val) ref.Val {\n\t\t\t\t\treturn lib.toLocationValue(time.UTC.String(), 0)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\n\t\t// Duration functions\n\t\tBindFunction(\n\t\t\tcreateTimeName(\"toDuration\"),\n\t\t\tOverloadFunc(createTimeID(\"to_duration_int_duration\"), []*cel.Type{cel.IntType}, cel.DurationType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Duration{Duration: time.Duration(args[0].(types.Int))}\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateTimeName(\"parseDuration\"),\n\t\t\tOverloadFunc(createTimeID(\"parse_duration_string_duration\"), []*cel.Type{cel.StringType}, cel.DurationType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\td, err := time.ParseDuration(string(args[0].(types.String)))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.Duration{Duration: d}\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateTimeName(\"since\"),\n\t\t\tOverloadFunc(createTimeID(\"since_timestamp_duration\"), []*cel.Type{TimeType}, cel.DurationType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := lib.refToGoTimeValue(args[0])\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.Duration{\n\t\t\t\t\t\tDuration: time.Since(v),\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateTimeName(\"until\"),\n\t\t\tOverloadFunc(createTimeID(\"until_timestamp_duration\"), []*cel.Type{TimeType}, cel.DurationType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := lib.refToGoTimeValue(args[0])\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.Duration{\n\t\t\t\t\t\tDuration: time.Until(v),\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"abs\",\n\t\t\tMemberOverloadFunc(createTimeID(\"abs_duration_duration\"), cel.DurationType, []*cel.Type{}, cel.DurationType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Duration{\n\t\t\t\t\t\tDuration: self.(types.Duration).Duration.Abs(),\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"hours\",\n\t\t\tMemberOverloadFunc(createTimeID(\"hours_duration_double\"), cel.DurationType, []*cel.Type{}, cel.DoubleType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Double(self.(types.Duration).Duration.Hours())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"microseconds\",\n\t\t\tMemberOverloadFunc(createTimeID(\"microseconds_duration_int\"), cel.DurationType, []*cel.Type{}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Int(self.(types.Duration).Duration.Microseconds())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"milliseconds\",\n\t\t\tMemberOverloadFunc(createTimeID(\"milliseconds_duration_int\"), cel.DurationType, []*cel.Type{}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Int(self.(types.Duration).Duration.Milliseconds())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"minutes\",\n\t\t\tMemberOverloadFunc(createTimeID(\"minutes_duration_int\"), cel.DurationType, []*cel.Type{}, cel.DoubleType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Double(self.(types.Duration).Duration.Minutes())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"nanoseconds\",\n\t\t\tMemberOverloadFunc(createTimeID(\"nanoseconds_duration_int\"), cel.DurationType, []*cel.Type{}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Int(self.(types.Duration).Duration.Nanoseconds())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"round\",\n\t\t\tMemberOverloadFunc(createTimeID(\"round_duration_int_duration\"), cel.DurationType, []*cel.Type{cel.IntType}, cel.DurationType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Duration{\n\t\t\t\t\t\tDuration: self.(types.Duration).Duration.Round(time.Duration(args[0].(types.Int))),\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t),\n\t\t\tMemberOverloadFunc(createTimeID(\"round_duration_duration_duration\"), cel.DurationType, []*cel.Type{cel.DurationType}, cel.DurationType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Duration{\n\t\t\t\t\t\tDuration: self.(types.Duration).Duration.Round(args[0].(types.Duration).Duration),\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"seconds\",\n\t\t\tMemberOverloadFunc(createTimeID(\"seconds_duration_int\"), cel.DurationType, []*cel.Type{}, cel.DoubleType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Double(self.(types.Duration).Duration.Seconds())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"string\",\n\t\t\tMemberOverloadFunc(createTimeID(\"string_duration_string\"), cel.DurationType, []*cel.Type{}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(self.(types.Duration).Duration.String())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"truncate\",\n\t\t\tMemberOverloadFunc(createTimeID(\"truncate_duration_int_duration\"), cel.DurationType, []*cel.Type{cel.IntType}, cel.DurationType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Duration{\n\t\t\t\t\t\tDuration: self.(types.Duration).Duration.Truncate(time.Duration(args[0].(types.Int))),\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t),\n\t\t\tMemberOverloadFunc(createTimeID(\"truncate_duration_duration_duration\"), cel.DurationType, []*cel.Type{cel.DurationType}, cel.DurationType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Duration{\n\t\t\t\t\t\tDuration: self.(types.Duration).Duration.Truncate(args[0].(types.Duration).Duration),\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\n\t\t// Location functions\n\t\tBindFunction(\n\t\t\tcreateTimeName(\"fixedZone\"),\n\t\t\tOverloadFunc(createTimeID(\"fixed_zone_string_int_location\"), []*cel.Type{cel.StringType, cel.IntType}, LocationType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn lib.toLocationValue(string(args[0].(types.String)), int(args[1].(types.Int)))\n\t\t\t\t},\n\t\t\t),\n\t\t\tOverloadFunc(createTimeID(\"fixed_zone_string_double_location\"), []*cel.Type{cel.StringType, cel.DoubleType}, LocationType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn lib.toLocationValue(string(args[0].(types.String)), int(args[1].(types.Double)))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateTimeName(\"loadLocation\"),\n\t\t\tOverloadFunc(createTimeID(\"load_location_string_location\"), []*cel.Type{cel.StringType}, LocationType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\tloc, err := time.LoadLocation(string(args[0].(types.String)))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn lib.toLocationValue(loc.String(), 0)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateTimeName(\"loadLocationFromTZData\"),\n\t\t\tOverloadFunc(createTimeID(\"load_location_from_tz_data_string_bytes_location\"), []*cel.Type{cel.StringType, cel.BytesType}, LocationType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\tloc, err := time.LoadLocationFromTZData(string(args[0].(types.String)), []byte(args[1].(types.Bytes)))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn lib.toLocationValue(loc.String(), 0)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"string\",\n\t\t\tMemberOverloadFunc(createTimeID(\"string_location_string\"), LocationType, []*cel.Type{}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tloc, err := self.Value().(*Location).GoLocation()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.String(loc.String())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\n\t\t// Timestamp functions\n\t\tBindMemberFunction(\n\t\t\t\"asTime\",\n\t\t\tMemberOverloadFunc(createTimeID(\"asTime_timestamp_int_time\"), cel.TimestampType, []*cel.Type{}, TimeType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn lib.toTimeValue(self.(types.Timestamp).Time)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\n\t\t// Time functions\n\t\tBindFunction(\n\t\t\tcreateTimeName(\"date\"),\n\t\t\tOverloadFunc(\n\t\t\t\tcreateTimeID(\"date_int_int_int_int_int_int_int_location_time\"),\n\t\t\t\t[]*cel.Type{cel.IntType, cel.IntType, cel.IntType, cel.IntType, cel.IntType, cel.IntType, cel.IntType, LocationType},\n\t\t\t\tTimeType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\tloc, err := args[7].Value().(*Location).GoLocation()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn lib.toTimeValue(\n\t\t\t\t\t\ttime.Date(\n\t\t\t\t\t\t\tint(args[0].(types.Int)),\n\t\t\t\t\t\t\ttime.Month(args[1].(types.Int)),\n\t\t\t\t\t\t\tint(args[2].(types.Int)),\n\t\t\t\t\t\t\tint(args[3].(types.Int)),\n\t\t\t\t\t\t\tint(args[4].(types.Int)),\n\t\t\t\t\t\t\tint(args[5].(types.Int)),\n\t\t\t\t\t\t\tint(args[6].(types.Int)),\n\t\t\t\t\t\t\tloc,\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateTimeName(\"now\"),\n\t\t\tOverloadFunc(createTimeID(\"now_time\"), nil, TimeType,\n\t\t\t\tfunc(_ context.Context, _ ...ref.Val) ref.Val {\n\t\t\t\t\treturn lib.toTimeValue(time.Now())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateTimeName(\"parse\"),\n\t\t\tOverloadFunc(createTimeID(\"parse_string_string_time\"), []*cel.Type{cel.StringType, cel.StringType}, TimeType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\tt, err := time.Parse(string(args[0].(types.String)), string(args[1].(types.String)))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn lib.toTimeValue(t)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateTimeName(\"parseInLocation\"),\n\t\t\tOverloadFunc(createTimeID(\"parse_in_location_string_string_location_time\"), []*cel.Type{cel.StringType, cel.StringType, LocationType}, TimeType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\tloc, err := args[2].Value().(*Location).GoLocation()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\tt, err := time.ParseInLocation(string(args[0].(types.String)), string(args[1].(types.String)), loc)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn lib.toTimeValue(t)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateTimeName(\"unix\"),\n\t\t\tOverloadFunc(createTimeID(\"unix_int_int_time\"), []*cel.Type{cel.IntType, cel.IntType}, TimeType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn lib.toTimeValue(time.Unix(int64(args[0].(types.Int)), int64(args[1].(types.Int))))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateTimeName(\"unixMicro\"),\n\t\t\tOverloadFunc(createTimeID(\"unix_micro_int_time\"), []*cel.Type{cel.IntType}, TimeType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn lib.toTimeValue(time.UnixMicro(int64(args[0].(types.Int))))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateTimeName(\"unixMilli\"),\n\t\t\tOverloadFunc(createTimeID(\"unix_milli_int_time\"), []*cel.Type{cel.IntType}, TimeType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn lib.toTimeValue(time.UnixMilli(int64(args[0].(types.Int))))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"add\",\n\t\t\tMemberOverloadFunc(createTimeID(\"add_time_int_time\"), TimeType, []*cel.Type{cel.IntType}, TimeType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := lib.refToGoTimeValue(self)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn lib.toTimeValue(\n\t\t\t\t\t\tv.Add(time.Duration(args[0].(types.Int))),\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t),\n\t\t\tMemberOverloadFunc(createTimeID(\"add_time_duration_time\"), TimeType, []*cel.Type{cel.DurationType}, TimeType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := lib.refToGoTimeValue(self)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn lib.toTimeValue(\n\t\t\t\t\t\tv.Add(args[0].(types.Duration).Duration),\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"addDate\",\n\t\t\tMemberOverloadFunc(createTimeID(\"add_date_time_int_int_int_time\"), TimeType, []*cel.Type{cel.IntType, cel.IntType, cel.IntType}, TimeType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := lib.refToGoTimeValue(self)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn lib.toTimeValue(\n\t\t\t\t\t\tv.AddDate(int(args[0].(types.Int)), int(args[1].(types.Int)), int(args[2].(types.Int))),\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"after\",\n\t\t\tMemberOverloadFunc(createTimeID(\"after_time_time_bool\"), TimeType, []*cel.Type{TimeType}, cel.BoolType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := lib.refToGoTimeValue(self)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\ta0, err := lib.refToGoTimeValue(args[0])\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.Bool(v.After(a0))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"appendFormat\",\n\t\t\tMemberOverloadFunc(createTimeID(\"append_format_time_string_string_bytes\"), TimeType, []*cel.Type{cel.StringType, cel.StringType}, cel.BytesType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := lib.refToGoTimeValue(self)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.Bytes(\n\t\t\t\t\t\tv.AppendFormat(\n\t\t\t\t\t\t\t[]byte(args[0].(types.String)),\n\t\t\t\t\t\t\tstring(args[1].(types.String)),\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t),\n\t\t\tMemberOverloadFunc(createTimeID(\"append_format_time_bytes_string_bytes\"), TimeType, []*cel.Type{cel.BytesType, cel.StringType}, cel.BytesType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := lib.refToGoTimeValue(self)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.Bytes(\n\t\t\t\t\t\tv.AppendFormat(\n\t\t\t\t\t\t\t[]byte(args[0].(types.Bytes)),\n\t\t\t\t\t\t\tstring(args[1].(types.String)),\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"before\",\n\t\t\tMemberOverloadFunc(createTimeID(\"before_time_time_bool\"), TimeType, []*cel.Type{TimeType}, cel.BoolType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := lib.refToGoTimeValue(self)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\ta0, err := lib.refToGoTimeValue(args[0])\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.Bool(v.Before(a0))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"compare\",\n\t\t\tMemberOverloadFunc(createTimeID(\"compare_time_time_int\"), TimeType, []*cel.Type{TimeType}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := lib.refToGoTimeValue(self)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\ta0, err := lib.refToGoTimeValue(args[0])\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.Int(v.Compare(a0))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"day\",\n\t\t\tMemberOverloadFunc(createTimeID(\"day_time_int\"), TimeType, []*cel.Type{}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := lib.refToGoTimeValue(self)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.Int(v.Day())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"equal\",\n\t\t\tMemberOverloadFunc(createTimeID(\"equal_time_time_bool\"), TimeType, []*cel.Type{TimeType}, cel.BoolType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := lib.refToGoTimeValue(self)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\ta0, err := lib.refToGoTimeValue(args[0])\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.Bool(v.Equal(a0))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"format\",\n\t\t\tMemberOverloadFunc(createTimeID(\"format_time_string_string\"), TimeType, []*cel.Type{cel.StringType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := lib.refToGoTimeValue(self)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.String(v.Format(string(args[0].(types.String))))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"hour\",\n\t\t\tMemberOverloadFunc(createTimeID(\"hour_time_int\"), TimeType, []*cel.Type{}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := lib.refToGoTimeValue(self)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.Int(v.Hour())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"withLocation\",\n\t\t\tMemberOverloadFunc(createTimeID(\"with_location_time_location_time\"), TimeType, []*cel.Type{LocationType}, TimeType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tloc, err := args[0].Value().(*Location).GoLocation()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\tv, err := lib.refToGoTimeValue(self)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn lib.toTimeValue(v.In(loc))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"isDST\",\n\t\t\tMemberOverloadFunc(createTimeID(\"is_dst_time_bool\"), TimeType, []*cel.Type{}, cel.BoolType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := lib.refToGoTimeValue(self)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.Bool(v.IsDST())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"isZero\",\n\t\t\tMemberOverloadFunc(createTimeID(\"is_zero_time_bool\"), TimeType, []*cel.Type{}, cel.BoolType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := lib.refToGoTimeValue(self)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.Bool(v.IsZero())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"local\",\n\t\t\tMemberOverloadFunc(createTimeID(\"local_time_time\"), TimeType, []*cel.Type{}, TimeType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := lib.refToGoTimeValue(self)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn lib.toTimeValue(v.Local())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"location\",\n\t\t\tMemberOverloadFunc(createTimeID(\"location_time_location\"), TimeType, []*cel.Type{}, LocationType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := lib.refToGoTimeValue(self)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\tname, offset := v.Zone()\n\t\t\t\t\treturn lib.toLocationValue(name, offset)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"minute\",\n\t\t\tMemberOverloadFunc(createTimeID(\"minute_time_int\"), TimeType, []*cel.Type{}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := lib.refToGoTimeValue(self)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.Int(v.Minute())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"month\",\n\t\t\tMemberOverloadFunc(createTimeID(\"month_time_int\"), TimeType, []*cel.Type{}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := lib.refToGoTimeValue(self)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.Int(v.Month())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"nanosecond\",\n\t\t\tMemberOverloadFunc(createTimeID(\"nanosecond_time_int\"), TimeType, []*cel.Type{}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := lib.refToGoTimeValue(self)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.Int(v.Nanosecond())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"round\",\n\t\t\tMemberOverloadFunc(createTimeID(\"round_time_int_time\"), TimeType, []*cel.Type{cel.IntType}, TimeType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := lib.refToGoTimeValue(self)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn lib.toTimeValue(v.Round(time.Duration(args[0].(types.Int))))\n\t\t\t\t},\n\t\t\t),\n\t\t\tMemberOverloadFunc(createTimeID(\"round_time_duration_time\"), TimeType, []*cel.Type{cel.DurationType}, TimeType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := lib.refToGoTimeValue(self)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn lib.toTimeValue(v.Round(args[0].(types.Duration).Duration))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"second\",\n\t\t\tMemberOverloadFunc(createTimeID(\"second_time_int\"), TimeType, []*cel.Type{}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := lib.refToGoTimeValue(self)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.Int(v.Second())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"string\",\n\t\t\tMemberOverloadFunc(createTimeID(\"string_time_string\"), TimeType, []*cel.Type{}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := lib.refToGoTimeValue(self)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.String(v.String())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"sub\",\n\t\t\tMemberOverloadFunc(createTimeID(\"sub_time_time_duration\"), TimeType, []*cel.Type{TimeType}, cel.DurationType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := lib.refToGoTimeValue(self)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\ta0, err := lib.refToGoTimeValue(args[0])\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.Duration{\n\t\t\t\t\t\tDuration: v.Sub(a0),\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"truncate\",\n\t\t\tMemberOverloadFunc(createTimeID(\"truncate_time_int_time\"), TimeType, []*cel.Type{cel.IntType}, TimeType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := lib.refToGoTimeValue(self)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn lib.toTimeValue(v.Truncate(time.Duration(args[0].(types.Int))))\n\t\t\t\t},\n\t\t\t),\n\t\t\tMemberOverloadFunc(createTimeID(\"truncate_time_duration_time\"), TimeType, []*cel.Type{cel.DurationType}, TimeType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := lib.refToGoTimeValue(self)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn lib.toTimeValue(v.Truncate(args[0].(types.Duration).Duration))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"utc\",\n\t\t\tMemberOverloadFunc(createTimeID(\"utc_time_time\"), TimeType, []*cel.Type{}, TimeType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := lib.refToGoTimeValue(self)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn lib.toTimeValue(v.UTC())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"unix\",\n\t\t\tMemberOverloadFunc(createTimeID(\"unix_time_int\"), TimeType, []*cel.Type{}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := lib.refToGoTimeValue(self)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.Int(v.Unix())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"unixMicro\",\n\t\t\tMemberOverloadFunc(createTimeID(\"unix_micro_time_int\"), TimeType, []*cel.Type{}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := lib.refToGoTimeValue(self)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.Int(v.UnixMicro())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"unixMilli\",\n\t\t\tMemberOverloadFunc(createTimeID(\"unix_milli_time_int\"), TimeType, []*cel.Type{}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := lib.refToGoTimeValue(self)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.Int(v.UnixMilli())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"unixNano\",\n\t\t\tMemberOverloadFunc(createTimeID(\"unix_nano_time_int\"), TimeType, []*cel.Type{}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := lib.refToGoTimeValue(self)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.Int(v.UnixNano())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"weekday\",\n\t\t\tMemberOverloadFunc(createTimeID(\"weekday_time_int\"), TimeType, []*cel.Type{}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := lib.refToGoTimeValue(self)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.Int(v.Weekday())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"year\",\n\t\t\tMemberOverloadFunc(createTimeID(\"year_time_int\"), TimeType, []*cel.Type{}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := lib.refToGoTimeValue(self)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.Int(v.Year())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"yearDay\",\n\t\t\tMemberOverloadFunc(createTimeID(\"year_day_time_int\"), TimeType, []*cel.Type{}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := lib.refToGoTimeValue(self)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.Int(v.YearDay())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t} {\n\t\topts = append(opts, funcOpts...)\n\t}\n\treturn opts\n}\n\nfunc (lib *TimeLibrary) ProgramOptions() []cel.ProgramOption {\n\treturn []cel.ProgramOption{}\n}\n"
  },
  {
    "path": "grpc/federation/cel/time.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: grpc/federation/time.proto\n\npackage cel\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\ttimestamppb \"google.golang.org/protobuf/types/known/timestamppb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// Time represents google.protobuf.Timestamp with time zone.\ntype Time struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// timestamp is the timestamp.\n\tTimestamp *timestamppb.Timestamp `protobuf:\"bytes,1,opt,name=timestamp,proto3\" json:\"timestamp,omitempty\"`\n\t// loc is the location.\n\tLoc *Location `protobuf:\"bytes,2,opt,name=loc,proto3\" json:\"loc,omitempty\"`\n}\n\nfunc (x *Time) Reset() {\n\t*x = Time{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_time_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Time) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Time) ProtoMessage() {}\n\nfunc (x *Time) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_time_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Time.ProtoReflect.Descriptor instead.\nfunc (*Time) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_time_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Time) GetTimestamp() *timestamppb.Timestamp {\n\tif x != nil {\n\t\treturn x.Timestamp\n\t}\n\treturn nil\n}\n\nfunc (x *Time) GetLoc() *Location {\n\tif x != nil {\n\t\treturn x.Loc\n\t}\n\treturn nil\n}\n\n// Location represents time zone.\n// See https://pkg.go.dev/time#Location.\ntype Location struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the time zone name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// offset is the offset (seconds east of UTC).\n\tOffset int64 `protobuf:\"varint,2,opt,name=offset,proto3\" json:\"offset,omitempty\"`\n}\n\nfunc (x *Location) Reset() {\n\t*x = Location{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_time_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Location) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Location) ProtoMessage() {}\n\nfunc (x *Location) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_time_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Location.ProtoReflect.Descriptor instead.\nfunc (*Location) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_time_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Location) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Location) GetOffset() int64 {\n\tif x != nil {\n\t\treturn x.Offset\n\t}\n\treturn 0\n}\n\nvar File_grpc_federation_time_proto protoreflect.FileDescriptor\n\nvar file_grpc_federation_time_proto_rawDesc = []byte{\n\t0x0a, 0x1a, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x74, 0x69,\n\t0x6d, 0x65, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x22, 0x72, 0x0a, 0x04, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x74,\n\t0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,\n\t0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65,\n\t0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x30, 0x0a, 0x03, 0x6c, 0x6f, 0x63, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x52, 0x03, 0x6c, 0x6f, 0x63, 0x22, 0x36, 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65,\n\t0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x42,\n\t0x3c, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x65,\n\t0x72, 0x63, 0x61, 0x72, 0x69, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x63, 0x65, 0x6c, 0x3b, 0x63, 0x65, 0x6c, 0x62, 0x06, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_grpc_federation_time_proto_rawDescOnce sync.Once\n\tfile_grpc_federation_time_proto_rawDescData = file_grpc_federation_time_proto_rawDesc\n)\n\nfunc file_grpc_federation_time_proto_rawDescGZIP() []byte {\n\tfile_grpc_federation_time_proto_rawDescOnce.Do(func() {\n\t\tfile_grpc_federation_time_proto_rawDescData = protoimpl.X.CompressGZIP(file_grpc_federation_time_proto_rawDescData)\n\t})\n\treturn file_grpc_federation_time_proto_rawDescData\n}\n\nvar file_grpc_federation_time_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_grpc_federation_time_proto_goTypes = []interface{}{\n\t(*Time)(nil),                  // 0: grpc.federation.time.Time\n\t(*Location)(nil),              // 1: grpc.federation.time.Location\n\t(*timestamppb.Timestamp)(nil), // 2: google.protobuf.Timestamp\n}\nvar file_grpc_federation_time_proto_depIdxs = []int32{\n\t2, // 0: grpc.federation.time.Time.timestamp:type_name -> google.protobuf.Timestamp\n\t1, // 1: grpc.federation.time.Time.loc:type_name -> grpc.federation.time.Location\n\t2, // [2:2] is the sub-list for method output_type\n\t2, // [2:2] is the sub-list for method input_type\n\t2, // [2:2] is the sub-list for extension type_name\n\t2, // [2:2] is the sub-list for extension extendee\n\t0, // [0:2] is the sub-list for field type_name\n}\n\nfunc init() { file_grpc_federation_time_proto_init() }\nfunc file_grpc_federation_time_proto_init() {\n\tif File_grpc_federation_time_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_grpc_federation_time_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Time); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_time_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Location); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_grpc_federation_time_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_grpc_federation_time_proto_goTypes,\n\t\tDependencyIndexes: file_grpc_federation_time_proto_depIdxs,\n\t\tMessageInfos:      file_grpc_federation_time_proto_msgTypes,\n\t}.Build()\n\tFile_grpc_federation_time_proto = out.File\n\tfile_grpc_federation_time_proto_rawDesc = nil\n\tfile_grpc_federation_time_proto_goTypes = nil\n\tfile_grpc_federation_time_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "grpc/federation/cel/time_test.go",
    "content": "package cel_test\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/google/cel-go/cel\"\n\t\"github.com/google/cel-go/common/types\"\n\t\"github.com/google/cel-go/common/types/ref\"\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\n\tcellib \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n)\n\nfunc TestTime(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\texpr string\n\t\targs map[string]any\n\t\tcmp  func(ref.Val) error\n\t}{\n\t\t// constants\n\t\t{\n\t\t\tname: \"constant_layout\",\n\t\t\texpr: \"grpc.federation.time.LAYOUT\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.Layout\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"constant_ansic\",\n\t\t\texpr: \"grpc.federation.time.ANSIC\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.ANSIC\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"constant_unix_date\",\n\t\t\texpr: \"grpc.federation.time.UNIX_DATE\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.UnixDate\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"constant_ruby_date\",\n\t\t\texpr: \"grpc.federation.time.RUBY_DATE\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.RubyDate\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"constant_rfc822\",\n\t\t\texpr: \"grpc.federation.time.RFC822\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.RFC822\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"constant_rfc822z\",\n\t\t\texpr: \"grpc.federation.time.RFC822Z\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.RFC822Z\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"constant_rfc850\",\n\t\t\texpr: \"grpc.federation.time.RFC850\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.RFC850\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"constant_rfc1123\",\n\t\t\texpr: \"grpc.federation.time.RFC1123\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.RFC1123\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"constant_rfc1123z\",\n\t\t\texpr: \"grpc.federation.time.RFC1123Z\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.RFC1123Z\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"constant_rfc3339\",\n\t\t\texpr: \"grpc.federation.time.RFC3339\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.RFC3339\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"constant_rfc3339nano\",\n\t\t\texpr: \"grpc.federation.time.RFC3339NANO\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.RFC3339Nano\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"constant_kitchen\",\n\t\t\texpr: \"grpc.federation.time.KITCHEN\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.Kitchen\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"constant_stamp\",\n\t\t\texpr: \"grpc.federation.time.STAMP\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.Stamp\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"constant_stamp_milli\",\n\t\t\texpr: \"grpc.federation.time.STAMP_MILLI\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.StampMilli\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"constant_stamp_micro\",\n\t\t\texpr: \"grpc.federation.time.STAMP_MICRO\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.StampMicro\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"constant_stamp_nano\",\n\t\t\texpr: \"grpc.federation.time.STAMP_NANO\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.StampNano\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"constant_datetime\",\n\t\t\texpr: \"grpc.federation.time.DATETIME\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.DateTime\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"constant_date_only\",\n\t\t\texpr: \"grpc.federation.time.DATE_ONLY\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.DateOnly\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"constant_time_only\",\n\t\t\texpr: \"grpc.federation.time.TIME_ONLY\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.TimeOnly\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"constant_nanosecond\",\n\t\t\texpr: \"grpc.federation.time.NANOSECOND\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.Nanosecond\n\t\t\t\tif diff := cmp.Diff(time.Duration(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"constant_microsecond\",\n\t\t\texpr: \"grpc.federation.time.MICROSECOND\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.Microsecond\n\t\t\t\tif diff := cmp.Diff(time.Duration(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"constant_millisecond\",\n\t\t\texpr: \"grpc.federation.time.MILLISECOND\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.Millisecond\n\t\t\t\tif diff := cmp.Diff(time.Duration(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"constant_second\",\n\t\t\texpr: \"grpc.federation.time.SECOND\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.Second\n\t\t\t\tif diff := cmp.Diff(time.Duration(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"constant_minute\",\n\t\t\texpr: \"grpc.federation.time.MINUTE\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.Minute\n\t\t\t\tif diff := cmp.Diff(time.Duration(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"constant_hour\",\n\t\t\texpr: \"grpc.federation.time.HOUR\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.Hour\n\t\t\t\tif diff := cmp.Diff(time.Duration(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"constant_local\",\n\t\t\texpr: \"grpc.federation.time.LOCAL()\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.Value().(*cellib.Location)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tgoLoc, err := gotV.GoLocation()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := time.Local.String()\n\t\t\t\tif diff := cmp.Diff(goLoc.String(), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"constant_utc\",\n\t\t\texpr: \"grpc.federation.time.UTC()\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.Value().(*cellib.Location)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tgoLoc, err := gotV.GoLocation()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := time.UTC.String()\n\t\t\t\tif diff := cmp.Diff(goLoc.String(), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\n\t\t// duration functions\n\t\t{\n\t\t\tname: \"parseDuration\",\n\t\t\texpr: \"grpc.federation.time.parseDuration('10h')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Duration)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected, err := time.ParseDuration(\"10h\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotV.Duration.String(), expected.String()); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"since\",\n\t\t\texpr: \"grpc.federation.time.since(grpc.federation.time.now())\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Duration)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tif !strings.Contains(gotV.Duration.String(), \"s\") {\n\t\t\t\t\treturn fmt.Errorf(\"failed to evaluate time.since: %v\", gotV)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"until\",\n\t\t\texpr: \"grpc.federation.time.until(grpc.federation.time.now())\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Duration)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tif !strings.Contains(gotV.Duration.String(), \"s\") {\n\t\t\t\t\treturn fmt.Errorf(\"failed to evaluate time.until: %v\", gotV)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"abs\",\n\t\t\texpr: \"grpc.federation.time.parseDuration('4h30m').abs()\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Duration)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\td, err := time.ParseDuration(\"4h30m\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := d.Abs()\n\t\t\t\tif diff := cmp.Diff(gotV.Duration.String(), expected.String()); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"hours\",\n\t\t\texpr: \"grpc.federation.time.parseDuration('4h30m').hours()\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Double)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\td, err := time.ParseDuration(\"4h30m\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := d.Hours()\n\t\t\t\tif diff := cmp.Diff(float64(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"microseconds\",\n\t\t\texpr: \"grpc.federation.time.parseDuration('1s').microseconds()\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\td, err := time.ParseDuration(\"1s\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := d.Microseconds()\n\t\t\t\tif diff := cmp.Diff(int64(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"milliseconds\",\n\t\t\texpr: \"grpc.federation.time.parseDuration('1s').milliseconds()\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\td, err := time.ParseDuration(\"1s\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := d.Milliseconds()\n\t\t\t\tif diff := cmp.Diff(int64(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"minutes\",\n\t\t\texpr: \"grpc.federation.time.parseDuration('1h30m').minutes()\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Double)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\td, err := time.ParseDuration(\"1h30m\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := d.Minutes()\n\t\t\t\tif diff := cmp.Diff(float64(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"nanoseconds\",\n\t\t\texpr: \"grpc.federation.time.parseDuration('1µs').nanoseconds()\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\td, err := time.ParseDuration(\"1µs\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := d.Nanoseconds()\n\t\t\t\tif diff := cmp.Diff(int64(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"round\",\n\t\t\texpr: \"grpc.federation.time.parseDuration('1h15m30.918273645s').round(grpc.federation.time.MICROSECOND)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Duration)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\td, err := time.ParseDuration(\"1h15m30.918273645s\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := d.Round(time.Microsecond)\n\t\t\t\tif diff := cmp.Diff(gotV.Duration, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"seconds\",\n\t\t\texpr: \"grpc.federation.time.parseDuration('1m30s').seconds()\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Double)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\td, err := time.ParseDuration(\"1m30s\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := d.Seconds()\n\t\t\t\tif diff := cmp.Diff(float64(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"duration_string\",\n\t\t\texpr: \"grpc.federation.time.parseDuration('1m30s').string()\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\td, err := time.ParseDuration(\"1m30s\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := d.String()\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"truncate\",\n\t\t\texpr: \"grpc.federation.time.parseDuration('1h15m30.918273645s').truncate(grpc.federation.time.MICROSECOND)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Duration)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\td, err := time.ParseDuration(\"1h15m30.918273645s\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := d.Truncate(time.Microsecond)\n\t\t\t\tif diff := cmp.Diff(gotV.Duration, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\n\t\t// location functions\n\t\t{\n\t\t\tname: \"fixedZone\",\n\t\t\texpr: \"grpc.federation.time.fixedZone('UTC-8', -8*60*60)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.Value().(*cellib.Location)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tgoLoc, err := gotV.GoLocation()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := time.FixedZone(\"UTC-8\", -8*60*60).String()\n\t\t\t\tif diff := cmp.Diff(goLoc.String(), expected, cmpopts.EquateApproxTime(1*time.Second)); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"loadLocation\",\n\t\t\texpr: \"grpc.federation.time.loadLocation('America/Los_Angeles')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.Value().(*cellib.Location)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tgoLoc, err := gotV.GoLocation()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected, err := time.LoadLocation(\"America/Los_Angeles\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(goLoc.String(), expected.String(), cmpopts.EquateApproxTime(1*time.Second)); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"location_string\",\n\t\t\texpr: \"grpc.federation.time.loadLocation('America/Los_Angeles').string()\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected, err := time.LoadLocation(\"America/Los_Angeles\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected.String(), cmpopts.EquateApproxTime(1*time.Second)); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\n\t\t// time functions\n\t\t{\n\t\t\tname: \"date\",\n\t\t\texpr: \"grpc.federation.time.date(2009, 11, 10, 23, 0, 0, 0, grpc.federation.time.UTC())\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.Value().(*cellib.Time)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tgotTime, err := gotV.GoTime()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := time.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC)\n\t\t\t\tif diff := cmp.Diff(gotTime, expected, cmpopts.EquateApproxTime(1*time.Second)); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"now\",\n\t\t\texpr: \"grpc.federation.time.now()\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.Value().(*cellib.Time)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tgotTime, err := gotV.GoTime()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := time.Now()\n\t\t\t\tif diff := cmp.Diff(gotTime, expected, cmpopts.EquateApproxTime(1*time.Second)); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"parse\",\n\t\t\texpr: \"grpc.federation.time.parse(grpc.federation.time.RFC3339, '2006-01-02T15:04:05Z')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.Value().(*cellib.Time)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tgotTime, err := gotV.GoTime()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected, err := time.Parse(time.RFC3339, \"2006-01-02T15:04:05Z\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotTime, expected, cmpopts.EquateApproxTime(1*time.Second)); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"parse_in_location\",\n\t\t\texpr: \"grpc.federation.time.parseInLocation('Jan 2, 2006 at 3:04pm (MST)', 'Jul 9, 2012 at 5:02am (CEST)', grpc.federation.time.loadLocation('Europe/Berlin'))\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.Value().(*cellib.Time)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tgotTime, err := gotV.GoTime()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tloc, err := time.LoadLocation(\"Europe/Berlin\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected, err := time.ParseInLocation(\"Jan 2, 2006 at 3:04pm (MST)\", \"Jul 9, 2012 at 5:02am (CEST)\", loc)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotTime, expected, cmpopts.EquateApproxTime(1*time.Second)); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"unix\",\n\t\t\texpr: \"grpc.federation.time.unix(1257894000, 0)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.Value().(*cellib.Time)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tgotTime, err := gotV.GoTime()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := time.Unix(1257894000, 0)\n\t\t\t\tif diff := cmp.Diff(gotTime, expected, cmpopts.EquateApproxTime(1*time.Second)); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"unix_micro\",\n\t\t\texpr: \"grpc.federation.time.unixMicro(1257894000000000)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.Value().(*cellib.Time)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tgotTime, err := gotV.GoTime()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := time.UnixMicro(1257894000000000)\n\t\t\t\tif diff := cmp.Diff(gotTime, expected, cmpopts.EquateApproxTime(1*time.Second)); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"unix_milli\",\n\t\t\texpr: \"grpc.federation.time.unixMilli(1257894000000)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.Value().(*cellib.Time)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tgotTime, err := gotV.GoTime()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := time.UnixMilli(1257894000000)\n\t\t\t\tif diff := cmp.Diff(gotTime, expected, cmpopts.EquateApproxTime(1*time.Second)); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"add\",\n\t\t\texpr: \"grpc.federation.time.now().add(10 * grpc.federation.time.HOUR)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.Value().(*cellib.Time)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tgotTime, err := gotV.GoTime()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := time.Now().Add(10 * time.Hour)\n\t\t\t\tif diff := cmp.Diff(gotTime, expected, cmpopts.EquateApproxTime(1*time.Second)); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"addDate\",\n\t\t\texpr: \"grpc.federation.time.now().addDate(1, 1, 1)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.Value().(*cellib.Time)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tgotTime, err := gotV.GoTime()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := time.Now().AddDate(1, 1, 1)\n\t\t\t\tif diff := cmp.Diff(gotTime, expected, cmpopts.EquateApproxTime(1*time.Second)); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"after\",\n\t\t\texpr: \"grpc.federation.time.date(3000, 1, 1, 0, 0, 0, 0, grpc.federation.time.UTC()).after(grpc.federation.time.date(2000, 1, 1, 0, 0, 0, 0, grpc.federation.time.UTC()))\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Bool)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.Date(3000, 1, 1, 0, 0, 0, 0, time.UTC).After(time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC))\n\t\t\t\tif diff := cmp.Diff(bool(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"appendFormat\",\n\t\t\texpr: \"grpc.federation.time.date(2017, 11, 4, 11, 0, 0, 0, grpc.federation.time.UTC()).appendFormat('Time: ', grpc.federation.time.KITCHEN)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Bytes)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.Date(2017, time.November, 4, 11, 0, 0, 0, time.UTC).AppendFormat([]byte(\"Time: \"), time.Kitchen)\n\t\t\t\tif diff := cmp.Diff([]byte(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"before\",\n\t\t\texpr: \"grpc.federation.time.date(2000, 1, 1, 0, 0, 0, 0, grpc.federation.time.UTC()).before(grpc.federation.time.date(3000, 1, 1, 0, 0, 0, 0, grpc.federation.time.UTC()))\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Bool)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC).Before(time.Date(3000, 1, 1, 0, 0, 0, 0, time.UTC))\n\t\t\t\tif diff := cmp.Diff(bool(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"compare\",\n\t\t\texpr: \"grpc.federation.time.date(2000, 1, 1, 0, 0, 0, 0, grpc.federation.time.UTC()).compare(grpc.federation.time.date(3000, 1, 1, 0, 0, 0, 0, grpc.federation.time.UTC()))\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC).Compare(time.Date(3000, 1, 1, 0, 0, 0, 0, time.UTC))\n\t\t\t\tif diff := cmp.Diff(int(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"day\",\n\t\t\texpr: \"grpc.federation.time.now().day()\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.Now().Day()\n\t\t\t\tif diff := cmp.Diff(int(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"equal\",\n\t\t\texpr: \"grpc.federation.time.date(2000, 2, 1, 12, 30, 0, 0, grpc.federation.time.UTC()).equal(grpc.federation.time.date(2000, 2, 1, 20, 30, 0, 0, grpc.federation.time.fixedZone('Beijing Time', grpc.federation.time.toDuration(8 * grpc.federation.time.HOUR).seconds())))\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Bool)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.Date(2000, 2, 1, 12, 30, 0, 0, time.UTC).Equal(\n\t\t\t\t\ttime.Date(2000, 2, 1, 20, 30, 0, 0, time.FixedZone(\"Beijing Time\", int((8*time.Hour).Seconds()))),\n\t\t\t\t)\n\t\t\t\tif diff := cmp.Diff(bool(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"hour\",\n\t\t\texpr: \"grpc.federation.time.now().hour()\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.Now().Hour()\n\t\t\t\tif diff := cmp.Diff(int(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"withLocation\",\n\t\t\texpr: \"grpc.federation.time.now().withLocation(grpc.federation.time.UTC())\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.Value().(*cellib.Time)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tgotTime, err := gotV.GoTime()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := time.Now().In(time.UTC)\n\t\t\t\tif diff := cmp.Diff(gotTime, expected, cmpopts.EquateApproxTime(1*time.Second)); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"isDST\",\n\t\t\texpr: \"grpc.federation.time.now().isDST()\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Bool)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.Now().IsDST()\n\t\t\t\tif diff := cmp.Diff(bool(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"isZero\",\n\t\t\texpr: \"grpc.federation.time.now().isDST()\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Bool)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.Now().IsZero()\n\t\t\t\tif diff := cmp.Diff(bool(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"local\",\n\t\t\texpr: \"grpc.federation.time.now().local()\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.Value().(*cellib.Time)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tgotTime, err := gotV.GoTime()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := time.Now().Local()\n\t\t\t\tif diff := cmp.Diff(gotTime, expected, cmpopts.EquateApproxTime(1*time.Second)); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"location\",\n\t\t\texpr: \"grpc.federation.time.now().location()\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.Value().(*cellib.Location)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tgoLoc, err := gotV.GoLocation()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tname, offset := time.Now().Zone()\n\t\t\t\texpected := time.FixedZone(name, offset)\n\t\t\t\tif diff := cmp.Diff(goLoc.String(), expected.String()); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"minute\",\n\t\t\texpr: \"grpc.federation.time.now().minute()\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.Now().Minute()\n\t\t\t\tif diff := cmp.Diff(int(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"month\",\n\t\t\texpr: \"grpc.federation.time.now().month()\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.Now().Month()\n\t\t\t\tif diff := cmp.Diff(time.Month(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"nanosecond\",\n\t\t\texpr: \"grpc.federation.time.now().nanosecond()\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tif gotV <= 0 {\n\t\t\t\t\treturn fmt.Errorf(\"failed to get nanosecond: %v\", got)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"round\",\n\t\t\texpr: \"grpc.federation.time.date(0, 0, 0, 12, 15, 30, 918273645, grpc.federation.time.UTC()).round(grpc.federation.time.MILLISECOND)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.Value().(*cellib.Time)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.Date(0, 0, 0, 12, 15, 30, 918273645, time.UTC).Round(time.Millisecond)\n\t\t\t\tgotTime, err := gotV.GoTime()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotTime, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"second\",\n\t\t\texpr: \"grpc.federation.time.date(0, 0, 0, 12, 15, 30, 10, grpc.federation.time.UTC()).second()\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.Date(0, 0, 0, 12, 15, 30, 10, time.UTC).Second()\n\t\t\t\tif diff := cmp.Diff(int(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"string\",\n\t\t\texpr: \"grpc.federation.time.date(2000, 11, 12, 12, 15, 30, 10, grpc.federation.time.UTC()).string()\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.Date(2000, 11, 12, 12, 15, 30, 10, time.UTC).String()\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"sub\",\n\t\t\texpr: \"grpc.federation.time.date(2000, 1, 1, 0, 0, 0, 0, grpc.federation.time.UTC()).sub(grpc.federation.time.date(2000, 1, 1, 12, 0, 0, 0, grpc.federation.time.UTC()))\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Duration)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC).Sub(time.Date(2000, 1, 1, 12, 0, 0, 0, time.UTC))\n\t\t\t\tif diff := cmp.Diff(gotV.Duration, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"truncate\",\n\t\t\texpr: \"grpc.federation.time.date(2012, 12, 7, 12, 15, 30, 918273645, grpc.federation.time.UTC()).truncate(grpc.federation.time.MILLISECOND)\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.Value().(*cellib.Time)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tgotTime, err := gotV.GoTime()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := time.Date(2012, 12, 7, 12, 15, 30, 918273645, time.UTC).Truncate(time.Millisecond)\n\t\t\t\tif diff := cmp.Diff(gotTime, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"utc\",\n\t\t\texpr: \"grpc.federation.time.now().utc()\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.Value().(*cellib.Time)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tgotTime, err := gotV.GoTime()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := time.Now().UTC()\n\t\t\t\tif diff := cmp.Diff(gotTime, expected, cmpopts.EquateApproxTime(1*time.Second)); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"time_unix\",\n\t\t\texpr: \"grpc.federation.time.date(2012, 12, 7, 12, 15, 30, 0, grpc.federation.time.UTC()).unix()\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.Date(2012, 12, 7, 12, 15, 30, 0, time.UTC).Unix()\n\t\t\t\tif diff := cmp.Diff(int64(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"time_unixMilli\",\n\t\t\texpr: \"grpc.federation.time.date(2012, 12, 7, 12, 15, 30, 0, grpc.federation.time.UTC()).unixMilli()\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.Date(2012, 12, 7, 12, 15, 30, 0, time.UTC).UnixMilli()\n\t\t\t\tif diff := cmp.Diff(int64(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"time_unixMicro\",\n\t\t\texpr: \"grpc.federation.time.date(2012, 12, 7, 12, 15, 30, 0, grpc.federation.time.UTC()).unixMicro()\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.Date(2012, 12, 7, 12, 15, 30, 0, time.UTC).UnixMicro()\n\t\t\t\tif diff := cmp.Diff(int64(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"time_unixNano\",\n\t\t\texpr: \"grpc.federation.time.date(2012, 12, 7, 12, 15, 30, 0, grpc.federation.time.UTC()).unixNano()\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.Date(2012, 12, 7, 12, 15, 30, 0, time.UTC).UnixNano()\n\t\t\t\tif diff := cmp.Diff(int64(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"weekday\",\n\t\t\texpr: \"grpc.federation.time.now().weekday()\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.Now().Weekday()\n\t\t\t\tif diff := cmp.Diff(time.Weekday(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"year\",\n\t\t\texpr: \"grpc.federation.time.now().year()\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.Now().Year()\n\t\t\t\tif diff := cmp.Diff(int(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"yearDay\",\n\t\t\texpr: \"grpc.federation.time.now().yearDay()\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := time.Now().YearDay()\n\t\t\t\tif diff := cmp.Diff(int(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"asTime\",\n\t\t\texpr: \"google.protobuf.Timestamp{seconds: 1560000000}.asTime()\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.Value().(*cellib.Time)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tgotSecond := gotV.GetTimestamp().GetSeconds()\n\t\t\t\texpected := 1560000000\n\t\t\t\tif diff := cmp.Diff(int(gotSecond), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t}\n\treg, err := types.NewRegistry(new(cellib.Time), new(cellib.Location))\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tenv, err := cel.NewEnv(\n\t\t\t\tcel.Variable(cellib.ContextVariableName, cel.ObjectType(cellib.ContextTypeName)),\n\t\t\t\tcel.Lib(cellib.NewTimeLibrary(reg)),\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tast, iss := env.Compile(test.expr)\n\t\t\tif iss.Err() != nil {\n\t\t\t\tt.Fatal(iss.Err())\n\t\t\t}\n\t\t\tprogram, err := env.Program(ast)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\targs := map[string]any{cellib.ContextVariableName: cellib.NewContextValue(context.Background())}\n\t\t\tfor k, v := range test.args {\n\t\t\t\targs[k] = v\n\t\t\t}\n\t\t\tout, _, err := program.Eval(args)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tif err := test.cmp(out); err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "grpc/federation/cel/url.go",
    "content": "package cel\n\nimport (\n\t\"context\"\n\t\"net/url\"\n\n\t\"github.com/google/cel-go/cel\"\n\t\"github.com/google/cel-go/common/types\"\n\t\"github.com/google/cel-go/common/types/ref\"\n\t\"github.com/google/cel-go/common/types/traits\"\n)\n\nconst URLPackageName = \"url\"\n\nvar (\n\tURLType      = cel.ObjectType(\"grpc.federation.url.URL\")\n\tUserinfoType = cel.ObjectType(\"grpc.federation.url.Userinfo\")\n)\n\nfunc (x *URL) GoURL() url.URL {\n\treturn url.URL{\n\t\tScheme:      x.GetScheme(),\n\t\tOpaque:      x.GetOpaque(),\n\t\tUser:        x.GetUser().GoUserinfo(),\n\t\tHost:        x.GetHost(),\n\t\tPath:        x.GetPath(),\n\t\tRawPath:     x.GetRawPath(),\n\t\tOmitHost:    x.GetOmitHost(),\n\t\tForceQuery:  x.GetForceQuery(),\n\t\tRawQuery:    x.GetRawQuery(),\n\t\tFragment:    x.GetFragment(),\n\t\tRawFragment: x.GetRawFragment(),\n\t}\n}\n\nfunc (x *Userinfo) GoUserinfo() *url.Userinfo {\n\tif x == nil {\n\t\treturn nil\n\t}\n\tif x.GetPasswordSet() {\n\t\treturn url.UserPassword(x.GetUsername(), x.GetPassword())\n\t}\n\treturn url.User(x.GetUsername())\n}\n\nvar _ cel.SingletonLibrary = new(URLLibrary)\n\ntype URLLibrary struct {\n\ttypeAdapter types.Adapter\n}\n\nfunc NewURLLibrary(typeAdapter types.Adapter) *URLLibrary {\n\treturn &URLLibrary{\n\t\ttypeAdapter: typeAdapter,\n\t}\n}\n\nfunc (lib *URLLibrary) LibraryName() string {\n\treturn packageName(URLPackageName)\n}\n\nfunc createURLName(name string) string {\n\treturn createName(URLPackageName, name)\n}\n\nfunc createURLID(name string) string {\n\treturn createID(URLPackageName, name)\n}\n\nfunc (lib *URLLibrary) refToGoURLValue(v ref.Val) url.URL {\n\treturn v.Value().(*URL).GoURL()\n}\n\nfunc (lib *URLLibrary) refToGoUserinfoValue(v ref.Val) *url.Userinfo {\n\treturn v.Value().(*Userinfo).GoUserinfo()\n}\n\nfunc (lib *URLLibrary) toURLValue(v url.URL) ref.Val {\n\tvar userinfo *Userinfo\n\tif v.User != nil {\n\t\tpassword, hasPassword := v.User.Password()\n\t\tuserinfo = &Userinfo{\n\t\t\tUsername:    v.User.Username(),\n\t\t\tPassword:    password,\n\t\t\tPasswordSet: hasPassword,\n\t\t}\n\t}\n\n\treturn lib.typeAdapter.NativeToValue(&URL{\n\t\tScheme:      v.Scheme,\n\t\tOpaque:      v.Opaque,\n\t\tUser:        userinfo,\n\t\tHost:        v.Host,\n\t\tPath:        v.Path,\n\t\tRawPath:     v.RawPath,\n\t\tOmitHost:    v.OmitHost,\n\t\tForceQuery:  v.ForceQuery,\n\t\tRawQuery:    v.RawQuery,\n\t\tFragment:    v.Fragment,\n\t\tRawFragment: v.RawFragment,\n\t})\n}\n\nfunc (lib *URLLibrary) toUserinfoValue(username, password string, passwordSet bool) ref.Val {\n\treturn lib.typeAdapter.NativeToValue(&Userinfo{Username: username, Password: password, PasswordSet: passwordSet})\n}\n\nfunc (lib *URLLibrary) CompileOptions() []cel.EnvOption {\n\topts := []cel.EnvOption{}\n\n\tfor _, funcOpts := range [][]cel.EnvOption{\n\t\tBindFunction(\n\t\t\tcreateURLName(\"joinPath\"),\n\t\t\tOverloadFunc(createURLID(\"joinPath_string_strings_string\"), []*cel.Type{cel.StringType, cel.ListType(cel.StringType)}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\tbase := string(args[0].(types.String))\n\t\t\t\t\telems := args[1].(traits.Lister)\n\t\t\t\t\tvar paths []string\n\t\t\t\t\tfor i := types.Int(0); i < elems.Size().(types.Int); i++ {\n\t\t\t\t\t\tpathElem := elems.Get(i)\n\t\t\t\t\t\tpaths = append(paths, string(pathElem.(types.String)))\n\t\t\t\t\t}\n\n\t\t\t\t\tresult, err := url.JoinPath(base, paths...)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.String(result)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateURLName(\"pathEscape\"),\n\t\t\tOverloadFunc(createURLID(\"pathEscape_string_string\"), []*cel.Type{cel.StringType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(url.PathEscape(string(args[0].(types.String))))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateURLName(\"pathUnescape\"),\n\t\t\tOverloadFunc(createURLID(\"pathUnescape_string_string\"), []*cel.Type{cel.StringType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\tresult, err := url.PathUnescape(string(args[0].(types.String)))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.String(result)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateURLName(\"queryEscape\"),\n\t\t\tOverloadFunc(createURLID(\"queryEscape_string_string\"), []*cel.Type{cel.StringType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(url.QueryEscape(string(args[0].(types.String))))\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateURLName(\"queryUnescape\"),\n\t\t\tOverloadFunc(createURLID(\"queryUnescape_string_string\"), []*cel.Type{cel.StringType}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\tresult, err := url.QueryUnescape(string(args[0].(types.String)))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn types.String(result)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\n\t\t// URL functions\n\t\tBindFunction(\n\t\t\tcreateURLName(\"parse\"),\n\t\t\tOverloadFunc(createURLID(\"parse_string_url\"), []*cel.Type{cel.StringType}, URLType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := url.Parse(string(args[0].(types.String)))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn lib.toURLValue(*v)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateURLName(\"parseRequestURI\"),\n\t\t\tOverloadFunc(createURLID(\"parseRequestURI_string_url\"), []*cel.Type{cel.StringType}, URLType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\tv, err := url.ParseRequestURI(string(args[0].(types.String)))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn lib.toURLValue(*v)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"scheme\",\n\t\t\tMemberOverloadFunc(createURLID(\"scheme_url_string\"), URLType, []*cel.Type{}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv := lib.refToGoURLValue(self)\n\t\t\t\t\treturn types.String(v.Scheme)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"opaque\",\n\t\t\tMemberOverloadFunc(createURLID(\"opaque_url_string\"), URLType, []*cel.Type{}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv := lib.refToGoURLValue(self)\n\t\t\t\t\treturn types.String(v.Opaque)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"userinfo\", // user is not a valid field name\n\t\t\tMemberOverloadFunc(createURLID(\"user_url_userinfo\"), URLType, []*cel.Type{}, UserinfoType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv := lib.refToGoURLValue(self)\n\t\t\t\t\tpassword, hasPassword := v.User.Password()\n\t\t\t\t\treturn lib.toUserinfoValue(v.User.Username(), password, hasPassword)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"host\",\n\t\t\tMemberOverloadFunc(createURLID(\"host_url_string\"), URLType, []*cel.Type{}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv := lib.refToGoURLValue(self)\n\t\t\t\t\treturn types.String(v.Host)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"path\",\n\t\t\tMemberOverloadFunc(createURLID(\"path_url_string\"), URLType, []*cel.Type{}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv := lib.refToGoURLValue(self)\n\t\t\t\t\treturn types.String(v.Path)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"rawPath\",\n\t\t\tMemberOverloadFunc(createURLID(\"rawPath_url_string\"), URLType, []*cel.Type{}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv := lib.refToGoURLValue(self)\n\t\t\t\t\treturn types.String(v.RawPath)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"omitHost\",\n\t\t\tMemberOverloadFunc(createURLID(\"omitHost_url_bool\"), URLType, []*cel.Type{}, cel.BoolType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv := lib.refToGoURLValue(self)\n\t\t\t\t\treturn types.Bool(v.OmitHost)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"forceQuery\",\n\t\t\tMemberOverloadFunc(createURLID(\"forceQuery_url_bool\"), URLType, []*cel.Type{}, cel.BoolType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv := lib.refToGoURLValue(self)\n\t\t\t\t\treturn types.Bool(v.ForceQuery)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"rawQuery\",\n\t\t\tMemberOverloadFunc(createURLID(\"rawQuery_url_string\"), URLType, []*cel.Type{}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv := lib.refToGoURLValue(self)\n\t\t\t\t\treturn types.String(v.RawQuery)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"fragment\",\n\t\t\tMemberOverloadFunc(createURLID(\"fragment_url_string\"), URLType, []*cel.Type{}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv := lib.refToGoURLValue(self)\n\t\t\t\t\treturn types.String(v.Fragment)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"rawFragment\",\n\t\t\tMemberOverloadFunc(createURLID(\"rawFragment_url_string\"), URLType, []*cel.Type{}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv := lib.refToGoURLValue(self)\n\t\t\t\t\treturn types.String(v.RawFragment)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"escapedFragment\",\n\t\t\tMemberOverloadFunc(createURLID(\"escapedFragment_url_string\"), URLType, []*cel.Type{}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv := lib.refToGoURLValue(self)\n\t\t\t\t\treturn types.String(v.EscapedFragment())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"escapedPath\",\n\t\t\tMemberOverloadFunc(createURLID(\"escapedPath_url_string\"), URLType, []*cel.Type{}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv := lib.refToGoURLValue(self)\n\t\t\t\t\treturn types.String(v.EscapedPath())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"hostname\",\n\t\t\tMemberOverloadFunc(createURLID(\"hostname_url_string\"), URLType, []*cel.Type{}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv := lib.refToGoURLValue(self)\n\t\t\t\t\treturn types.String(v.Hostname())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"isAbs\",\n\t\t\tMemberOverloadFunc(createURLID(\"isAbs_url_bool\"), URLType, []*cel.Type{}, cel.BoolType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv := lib.refToGoURLValue(self)\n\t\t\t\t\treturn types.Bool(v.IsAbs())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"joinPath\",\n\t\t\tMemberOverloadFunc(createURLID(\"joinPath_url_strings_url\"), URLType, []*cel.Type{cel.ListType(cel.StringType)}, URLType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv := lib.refToGoURLValue(self)\n\n\t\t\t\t\telems := args[0].(traits.Lister)\n\t\t\t\t\tvar paths []string\n\t\t\t\t\tfor i := types.Int(0); i < elems.Size().(types.Int); i++ {\n\t\t\t\t\t\tpathElem := elems.Get(i)\n\t\t\t\t\t\tpaths = append(paths, string(pathElem.(types.String)))\n\t\t\t\t\t}\n\n\t\t\t\t\tvar err error\n\t\t\t\t\tv.Path, err = url.JoinPath(v.Path, paths...)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\n\t\t\t\t\treturn lib.toURLValue(v)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"marshalBinary\",\n\t\t\tMemberOverloadFunc(createURLID(\"MarshalBinary_url_bytes\"), URLType, []*cel.Type{}, cel.BytesType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv := lib.refToGoURLValue(self)\n\n\t\t\t\t\tb, err := v.MarshalBinary()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\n\t\t\t\t\treturn types.Bytes(b)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"parse\",\n\t\t\tMemberOverloadFunc(createURLID(\"parse_url_string_url\"), URLType, []*cel.Type{cel.StringType}, URLType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv := lib.refToGoURLValue(self)\n\n\t\t\t\t\tu, err := v.Parse(string(args[0].(types.String)))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\n\t\t\t\t\treturn lib.toURLValue(*u)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"port\",\n\t\t\tMemberOverloadFunc(createURLID(\"port_url_string\"), URLType, []*cel.Type{}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv := lib.refToGoURLValue(self)\n\t\t\t\t\treturn types.String(v.Port())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\t// func (u *URL) Query() Values : returns map[string][]string\n\t\tBindMemberFunction(\n\t\t\t\"query\",\n\t\t\tMemberOverloadFunc(createURLID(\"query_url_map\"), URLType, []*cel.Type{}, cel.MapType(cel.StringType, cel.ListType(cel.StringType)),\n\t\t\t\tfunc(ctx context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv := lib.refToGoURLValue(self)\n\n\t\t\t\t\tadapter := types.DefaultTypeAdapter\n\t\t\t\t\tqueryParams := v.Query()\n\t\t\t\t\tqueryMap := map[ref.Val]ref.Val{}\n\t\t\t\t\tfor key, values := range queryParams {\n\t\t\t\t\t\tqueryMap[types.String(key)] = types.NewStringList(adapter, values)\n\t\t\t\t\t}\n\n\t\t\t\t\treturn types.NewRefValMap(adapter, queryMap)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"redacted\",\n\t\t\tMemberOverloadFunc(createURLID(\"redacted_url_string\"), URLType, []*cel.Type{}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv := lib.refToGoURLValue(self)\n\t\t\t\t\treturn types.String(v.Redacted())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"requestURI\",\n\t\t\tMemberOverloadFunc(createURLID(\"requestURI_url_string\"), URLType, []*cel.Type{}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv := lib.refToGoURLValue(self)\n\t\t\t\t\treturn types.String(v.RequestURI())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"resolveReference\",\n\t\t\tMemberOverloadFunc(createURLID(\"resolveReference_url_url_url\"), URLType, []*cel.Type{URLType}, URLType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv := lib.refToGoURLValue(self)\n\n\t\t\t\t\tr := args[0].Value().(*URL).GoURL()\n\t\t\t\t\tu := v.ResolveReference(&r)\n\n\t\t\t\t\treturn lib.toURLValue(*u)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"string\",\n\t\t\tMemberOverloadFunc(createURLID(\"string_url_string\"), URLType, []*cel.Type{}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv := lib.refToGoURLValue(self)\n\t\t\t\t\treturn types.String(v.String())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"unmarshalBinary\",\n\t\t\tMemberOverloadFunc(createURLID(\"unmarshalBinary_url_bytes_url\"), URLType, []*cel.Type{cel.BytesType}, URLType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tvar u url.URL\n\t\t\t\t\terr := u.UnmarshalBinary(args[0].(types.Bytes))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn lib.toURLValue(u)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\n\t\t// Userinfo functions\n\t\tBindFunction(\n\t\t\tcreateURLName(\"user\"),\n\t\t\tOverloadFunc(createURLID(\"user_string_userinfo\"), []*cel.Type{cel.StringType}, UserinfoType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn lib.toUserinfoValue(string(args[0].(types.String)), \"\", false)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateURLName(\"userPassword\"),\n\t\t\tOverloadFunc(createURLID(\"userPassword_string_string_userinfo\"), []*cel.Type{cel.StringType, cel.StringType}, UserinfoType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn lib.toUserinfoValue(string(args[0].(types.String)), string(args[1].(types.String)), true)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"username\",\n\t\t\tMemberOverloadFunc(createURLID(\"username_userinfo_string\"), UserinfoType, []*cel.Type{}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv := lib.refToGoUserinfoValue(self)\n\t\t\t\t\treturn types.String(v.Username())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"password\",\n\t\t\tMemberOverloadFunc(createURLID(\"password_userinfo_string\"), UserinfoType, []*cel.Type{}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv := lib.refToGoUserinfoValue(self)\n\t\t\t\t\tpassword, _ := v.Password()\n\t\t\t\t\treturn types.String(password)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"passwordSet\",\n\t\t\tMemberOverloadFunc(createURLID(\"passwordSet_userinfo_bool\"), UserinfoType, []*cel.Type{}, cel.BoolType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv := lib.refToGoUserinfoValue(self)\n\t\t\t\t\t_, hasPassword := v.Password()\n\t\t\t\t\treturn types.Bool(hasPassword)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"string\",\n\t\t\tMemberOverloadFunc(createURLID(\"string_userinfo_string\"), UserinfoType, []*cel.Type{}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\tv := lib.refToGoUserinfoValue(self)\n\t\t\t\t\treturn types.String(v.String())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t} {\n\t\topts = append(opts, funcOpts...)\n\t}\n\n\treturn opts\n}\n\nfunc (lib *URLLibrary) ProgramOptions() []cel.ProgramOption {\n\treturn []cel.ProgramOption{}\n}\n"
  },
  {
    "path": "grpc/federation/cel/url.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: grpc/federation/url.proto\n\npackage cel\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// URL represents the structure of the URL in net/url package.\ntype URL struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tScheme      string    `protobuf:\"bytes,1,opt,name=scheme,proto3\" json:\"scheme,omitempty\"`\n\tOpaque      string    `protobuf:\"bytes,2,opt,name=opaque,proto3\" json:\"opaque,omitempty\"`\n\tUser        *Userinfo `protobuf:\"bytes,3,opt,name=user,proto3\" json:\"user,omitempty\"`\n\tHost        string    `protobuf:\"bytes,4,opt,name=host,proto3\" json:\"host,omitempty\"`\n\tPath        string    `protobuf:\"bytes,5,opt,name=path,proto3\" json:\"path,omitempty\"`\n\tRawPath     string    `protobuf:\"bytes,6,opt,name=raw_path,json=rawPath,proto3\" json:\"raw_path,omitempty\"`\n\tOmitHost    bool      `protobuf:\"varint,7,opt,name=omit_host,json=omitHost,proto3\" json:\"omit_host,omitempty\"`\n\tForceQuery  bool      `protobuf:\"varint,8,opt,name=force_query,json=forceQuery,proto3\" json:\"force_query,omitempty\"`\n\tRawQuery    string    `protobuf:\"bytes,9,opt,name=raw_query,json=rawQuery,proto3\" json:\"raw_query,omitempty\"`\n\tFragment    string    `protobuf:\"bytes,10,opt,name=fragment,proto3\" json:\"fragment,omitempty\"`\n\tRawFragment string    `protobuf:\"bytes,11,opt,name=raw_fragment,json=rawFragment,proto3\" json:\"raw_fragment,omitempty\"`\n}\n\nfunc (x *URL) Reset() {\n\t*x = URL{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_url_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *URL) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*URL) ProtoMessage() {}\n\nfunc (x *URL) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_url_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use URL.ProtoReflect.Descriptor instead.\nfunc (*URL) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_url_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *URL) GetScheme() string {\n\tif x != nil {\n\t\treturn x.Scheme\n\t}\n\treturn \"\"\n}\n\nfunc (x *URL) GetOpaque() string {\n\tif x != nil {\n\t\treturn x.Opaque\n\t}\n\treturn \"\"\n}\n\nfunc (x *URL) GetUser() *Userinfo {\n\tif x != nil {\n\t\treturn x.User\n\t}\n\treturn nil\n}\n\nfunc (x *URL) GetHost() string {\n\tif x != nil {\n\t\treturn x.Host\n\t}\n\treturn \"\"\n}\n\nfunc (x *URL) GetPath() string {\n\tif x != nil {\n\t\treturn x.Path\n\t}\n\treturn \"\"\n}\n\nfunc (x *URL) GetRawPath() string {\n\tif x != nil {\n\t\treturn x.RawPath\n\t}\n\treturn \"\"\n}\n\nfunc (x *URL) GetOmitHost() bool {\n\tif x != nil {\n\t\treturn x.OmitHost\n\t}\n\treturn false\n}\n\nfunc (x *URL) GetForceQuery() bool {\n\tif x != nil {\n\t\treturn x.ForceQuery\n\t}\n\treturn false\n}\n\nfunc (x *URL) GetRawQuery() string {\n\tif x != nil {\n\t\treturn x.RawQuery\n\t}\n\treturn \"\"\n}\n\nfunc (x *URL) GetFragment() string {\n\tif x != nil {\n\t\treturn x.Fragment\n\t}\n\treturn \"\"\n}\n\nfunc (x *URL) GetRawFragment() string {\n\tif x != nil {\n\t\treturn x.RawFragment\n\t}\n\treturn \"\"\n}\n\n// Userinfo represents username and password information.\ntype Userinfo struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tUsername    string `protobuf:\"bytes,1,opt,name=username,proto3\" json:\"username,omitempty\"`\n\tPassword    string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\"`\n\tPasswordSet bool   `protobuf:\"varint,3,opt,name=password_set,json=passwordSet,proto3\" json:\"password_set,omitempty\"`\n}\n\nfunc (x *Userinfo) Reset() {\n\t*x = Userinfo{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_url_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Userinfo) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Userinfo) ProtoMessage() {}\n\nfunc (x *Userinfo) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_url_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Userinfo.ProtoReflect.Descriptor instead.\nfunc (*Userinfo) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_url_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Userinfo) GetUsername() string {\n\tif x != nil {\n\t\treturn x.Username\n\t}\n\treturn \"\"\n}\n\nfunc (x *Userinfo) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\nfunc (x *Userinfo) GetPasswordSet() bool {\n\tif x != nil {\n\t\treturn x.PasswordSet\n\t}\n\treturn false\n}\n\nvar File_grpc_federation_url_proto protoreflect.FileDescriptor\n\nvar file_grpc_federation_url_proto_rawDesc = []byte{\n\t0x0a, 0x19, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2f, 0x75, 0x72, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x13, 0x67, 0x72, 0x70,\n\t0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x75, 0x72, 0x6c,\n\t0x22, 0xc5, 0x02, 0x0a, 0x03, 0x55, 0x52, 0x4c, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65,\n\t0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65,\n\t0x12, 0x16, 0x0a, 0x06, 0x6f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x06, 0x6f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x12, 0x31, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x75, 0x72, 0x6c, 0x2e, 0x55, 0x73, 0x65,\n\t0x72, 0x69, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x68,\n\t0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12,\n\t0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70,\n\t0x61, 0x74, 0x68, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x61, 0x77, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18,\n\t0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x61, 0x77, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1b,\n\t0x0a, 0x09, 0x6f, 0x6d, 0x69, 0x74, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28,\n\t0x08, 0x52, 0x08, 0x6f, 0x6d, 0x69, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x66,\n\t0x6f, 0x72, 0x63, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08,\n\t0x52, 0x0a, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1b, 0x0a, 0x09,\n\t0x72, 0x61, 0x77, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x08, 0x72, 0x61, 0x77, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x72, 0x61,\n\t0x67, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x72, 0x61,\n\t0x67, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x61, 0x77, 0x5f, 0x66, 0x72, 0x61,\n\t0x67, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x61, 0x77,\n\t0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x65, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72,\n\t0x69, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65,\n\t0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x21, 0x0a, 0x0c,\n\t0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x08, 0x52, 0x0b, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x53, 0x65, 0x74, 0x42,\n\t0x3c, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x65,\n\t0x72, 0x63, 0x61, 0x72, 0x69, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x63, 0x65, 0x6c, 0x3b, 0x63, 0x65, 0x6c, 0x62, 0x06, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_grpc_federation_url_proto_rawDescOnce sync.Once\n\tfile_grpc_federation_url_proto_rawDescData = file_grpc_federation_url_proto_rawDesc\n)\n\nfunc file_grpc_federation_url_proto_rawDescGZIP() []byte {\n\tfile_grpc_federation_url_proto_rawDescOnce.Do(func() {\n\t\tfile_grpc_federation_url_proto_rawDescData = protoimpl.X.CompressGZIP(file_grpc_federation_url_proto_rawDescData)\n\t})\n\treturn file_grpc_federation_url_proto_rawDescData\n}\n\nvar file_grpc_federation_url_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_grpc_federation_url_proto_goTypes = []interface{}{\n\t(*URL)(nil),      // 0: grpc.federation.url.URL\n\t(*Userinfo)(nil), // 1: grpc.federation.url.Userinfo\n}\nvar file_grpc_federation_url_proto_depIdxs = []int32{\n\t1, // 0: grpc.federation.url.URL.user:type_name -> grpc.federation.url.Userinfo\n\t1, // [1:1] is the sub-list for method output_type\n\t1, // [1:1] is the sub-list for method input_type\n\t1, // [1:1] is the sub-list for extension type_name\n\t1, // [1:1] is the sub-list for extension extendee\n\t0, // [0:1] is the sub-list for field type_name\n}\n\nfunc init() { file_grpc_federation_url_proto_init() }\nfunc file_grpc_federation_url_proto_init() {\n\tif File_grpc_federation_url_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_grpc_federation_url_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*URL); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_url_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Userinfo); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_grpc_federation_url_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_grpc_federation_url_proto_goTypes,\n\t\tDependencyIndexes: file_grpc_federation_url_proto_depIdxs,\n\t\tMessageInfos:      file_grpc_federation_url_proto_msgTypes,\n\t}.Build()\n\tFile_grpc_federation_url_proto = out.File\n\tfile_grpc_federation_url_proto_rawDesc = nil\n\tfile_grpc_federation_url_proto_goTypes = nil\n\tfile_grpc_federation_url_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "grpc/federation/cel/url_test.go",
    "content": "package cel_test\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"net/url\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/google/cel-go/cel\"\n\t\"github.com/google/cel-go/common/types\"\n\t\"github.com/google/cel-go/common/types/ref\"\n\t\"github.com/google/cel-go/common/types/traits\"\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\n\tcellib \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n)\n\nfunc TestURLFunctions(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\texpr string\n\t\targs map[string]any\n\t\tcmp  func(ref.Val) error\n\t}{\n\t\t{\n\t\t\tname: \"join path\",\n\t\t\texpr: `grpc.federation.url.joinPath('https://example.com/path?query=1#fragment', ['/new'])`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected, err := url.JoinPath(\"https://example.com/path?query=1#fragment\", \"/new\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"path escape\",\n\t\t\texpr: `grpc.federation.url.pathEscape('あ /')`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := url.PathEscape(\"あ /\")\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"path unescape\",\n\t\t\texpr: `grpc.federation.url.pathUnescape('%E3%81%82%20%2F')`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected, err := url.PathUnescape(\"%E3%81%82%20%2F\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"query escape\",\n\t\t\texpr: `grpc.federation.url.queryEscape('あ /')`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := url.QueryEscape(\"あ /\")\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"query unescape\",\n\t\t\texpr: `grpc.federation.url.queryUnescape('%E3%81%82%20%2F')`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected, err := url.QueryUnescape(\"%E3%81%82%20%2F\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\n\t\t// url functions\n\t\t{\n\t\t\tname: \"parse\",\n\t\t\texpr: \"grpc.federation.url.parse('https://example.com/path?query=1#fragment')\",\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.Value().(*cellib.URL)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tgotURL := gotV.GoURL()\n\t\t\t\texpected, err := url.Parse(\"https://example.com/path?query=1#fragment\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotURL, *expected, cmpopts.IgnoreUnexported(url.URL{})); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"parse request uri\",\n\t\t\texpr: `grpc.federation.url.parseRequestURI('https://example.com/path?query=1#fragment')`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.Value().(*cellib.URL)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tgotURL := gotV.GoURL()\n\t\t\t\texpected, err := url.ParseRequestURI(\"https://example.com/path?query=1#fragment\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotURL, *expected, cmpopts.IgnoreUnexported(url.URL{})); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"parse scheme\",\n\t\t\texpr: `grpc.federation.url.parse('https://example.com/path?query=1#fragment').scheme()`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tparse, err := url.Parse(\"https://example.com/path?query=1#fragment\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := parse.Scheme\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"parse opaque\",\n\t\t\texpr: `grpc.federation.url.parse('https://example.com/path?query=1#fragment').opaque()`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tparse, err := url.Parse(\"https://example.com/path?query=1#fragment\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := parse.Opaque\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"parse user\",\n\t\t\texpr: `grpc.federation.url.parse('https://example.com/path?query=1#fragment').userinfo()`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.Value().(*cellib.Userinfo)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tgotUser := gotV.GoUserinfo()\n\t\t\t\tparse, err := url.Parse(\"https://example.com/path?query=1#fragment\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := parse.User\n\t\t\t\tif diff := userinfoDiff(gotUser, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"parse host\",\n\t\t\texpr: `grpc.federation.url.parse('https://example.com/path?query=1#fragment').host()`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tparse, err := url.Parse(\"https://example.com/path?query=1#fragment\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := parse.Host\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"parse path\",\n\t\t\texpr: `grpc.federation.url.parse('https://example.com/path?query=1#fragment').path()`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tparse, err := url.Parse(\"https://example.com/path?query=1#fragment\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := parse.Path\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"parse raw path\",\n\t\t\texpr: `grpc.federation.url.parse('https://example.com/%E3%81%82%20%2Fpath?query=1#fragment').rawPath()`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tparse, err := url.Parse(\"https://example.com/%E3%81%82%20%2Fpath?query=1#fragment\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := parse.RawPath\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"parse force query\",\n\t\t\texpr: `grpc.federation.url.parse('https://example.com/path?').forceQuery()`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV := got.(types.Bool)\n\t\t\t\tparse, err := url.Parse(\"https://example.com/path?\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := parse.ForceQuery\n\t\t\t\tif diff := cmp.Diff(bool(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"parse raw query\",\n\t\t\texpr: `grpc.federation.url.parse('https://example.com/path?query=1#fragment').rawQuery()`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tparse, err := url.Parse(\"https://example.com/path?query=1#fragment\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := parse.RawQuery\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"parse fragment\",\n\t\t\texpr: `grpc.federation.url.parse('https://example.com/path?query=1#fragment').fragment()`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tparse, err := url.Parse(\"https://example.com/path?query=1#fragment\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := parse.Fragment\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"parse raw fragment\",\n\t\t\texpr: `grpc.federation.url.parse('https://example.com/path?query=1#frag%20ment').rawFragment()`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tparse, err := url.Parse(\"https://example.com/path?query=1#frag%20ment\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := parse.RawFragment\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"parse escaped fragment\",\n\t\t\texpr: `grpc.federation.url.parse('https://example.com/path?query=1#fragment').escapedFragment()`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tparse, err := url.Parse(\"https://example.com/path?query=1#fragment\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := parse.EscapedFragment()\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"parse escaped path\",\n\t\t\texpr: `grpc.federation.url.parse('https://example.com/pa th?query=1#fragment').escapedPath()`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tparse, err := url.Parse(\"https://example.com/pa th?query=1#fragment\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := parse.EscapedPath()\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"parse hostname\",\n\t\t\texpr: `grpc.federation.url.parse('https://example.com/path?query=1#fragment').hostname()`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tparse, err := url.Parse(\"https://example.com/path?query=1#fragment\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := parse.Hostname()\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"is abs\",\n\t\t\texpr: `grpc.federation.url.parse('https://example.com/path?query=1#fragment').isAbs()`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Bool)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tparse, err := url.Parse(\"https://example.com/path?query=1#fragment\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := parse.IsAbs()\n\t\t\t\tif diff := cmp.Diff(bool(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"url join path\",\n\t\t\texpr: `grpc.federation.url.parse('https://example.com/path?query=1#fragment').joinPath(['/new'])`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.Value().(*cellib.URL)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tgotURL := gotV.GoURL()\n\t\t\t\tparse, err := url.Parse(\"https://example.com/path?query=1#fragment\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := parse.JoinPath(\"/new\")\n\t\t\t\tif diff := cmp.Diff(gotURL, *expected, cmpopts.IgnoreUnexported(url.URL{})); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"marshal binary\",\n\t\t\texpr: `grpc.federation.url.parse('https://example.com/path?query=1#fragment').marshalBinary()`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Bytes)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tparse, err := url.Parse(\"https://example.com/path?query=1#fragment\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected, err := parse.MarshalBinary()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotV.Value(), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"url parse\",\n\t\t\texpr: `grpc.federation.url.parse('https://example.com/path?query=1#fragment').parse('/relativePath')`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.Value().(*cellib.URL)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tgotURL := gotV.GoURL()\n\t\t\t\tparse, err := url.Parse(\"https://example.com/path?query=1#fragment\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected, err := parse.Parse(\"/relativePath\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif diff := cmp.Diff(gotURL, *expected, cmpopts.IgnoreUnexported(url.URL{})); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"port\",\n\t\t\texpr: `grpc.federation.url.parse('https://example.com/path?query=1#fragment').port()`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tparse, err := url.Parse(\"https://example.com/path?query=1#fragment\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := parse.Port()\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"query\",\n\t\t\texpr: `grpc.federation.url.parse('https://example.com/path?query=1#fragment').query()`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(traits.Mapper)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tgotQueryMap := make(map[string][]string)\n\t\t\t\tit := gotV.Iterator()\n\t\t\t\tfor it.HasNext() == types.True {\n\t\t\t\t\tkey := it.Next()\n\t\t\t\t\tkeyStr := string(key.(types.String))\n\t\t\t\t\tvalueList := gotV.Get(key).(traits.Lister)\n\n\t\t\t\t\tvar values []string\n\t\t\t\t\tfor i := int64(0); i < int64(valueList.Size().(types.Int)); i++ {\n\t\t\t\t\t\tvalues = append(values, string(valueList.Get(types.Int(i)).(types.String)))\n\t\t\t\t\t}\n\t\t\t\t\tgotQueryMap[keyStr] = values\n\t\t\t\t}\n\n\t\t\t\tparse, err := url.Parse(\"https://example.com/path?query=1#fragment\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := map[string][]string(parse.Query())\n\n\t\t\t\tif diff := cmp.Diff(gotQueryMap, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"redacted\",\n\t\t\texpr: `grpc.federation.url.parse('https://example.com/path?query=1#fragment').redacted()`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tparse, err := url.Parse(\"https://example.com/path?query=1#fragment\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := parse.Redacted()\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"request uri\",\n\t\t\texpr: `grpc.federation.url.parse('https://example.com/path?query=1#fragment').requestURI()`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tparse, err := url.Parse(\"https://example.com/path?query=1#fragment\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := parse.RequestURI()\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"resolve reference\",\n\t\t\texpr: `grpc.federation.url.parse('https://example.com/path?query=1#fragment').resolveReference(grpc.federation.url.parse('/relativePath'))`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.Value().(*cellib.URL)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tgotURL := gotV.GoURL()\n\t\t\t\tparse, err := url.Parse(\"https://example.com/path?query=1#fragment\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tref, err := url.Parse(\"/relativePath\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := parse.ResolveReference(ref)\n\t\t\t\tif diff := cmp.Diff(gotURL, *expected, cmpopts.IgnoreUnexported(url.URL{})); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"string\",\n\t\t\texpr: `grpc.federation.url.parse('https://example.com/path?query=1#fragment').string()`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tparse, err := url.Parse(\"https://example.com/path?query=1#fragment\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := parse.String()\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"unmarshal binary\",\n\t\t\texpr: `grpc.federation.url.parse('https://example.com/path?query=1#fragment').unmarshalBinary(grpc.federation.url.parse('https://example.com/path?query=1#fragment').marshalBinary())`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.Value().(*cellib.URL)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tgotURL := gotV.GoURL()\n\t\t\t\tparse, err := url.Parse(\"https://example.com/path?query=1#fragment\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := parse\n\t\t\t\tif diff := cmp.Diff(gotURL, *expected, cmpopts.IgnoreUnexported(url.URL{})); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\n\t\t// userinfo tests\n\t\t{\n\t\t\tname: \"user\",\n\t\t\texpr: `grpc.federation.url.user('username')`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.Value().(*cellib.Userinfo)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tgotUser := gotV.GoUserinfo()\n\t\t\t\texpected := url.User(\"username\")\n\t\t\t\tif diff := userinfoDiff(gotUser, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"user password to user info\",\n\t\t\texpr: `grpc.federation.url.userPassword('username', 'password')`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.Value().(*cellib.Userinfo)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tgotUser := gotV.GoUserinfo()\n\t\t\t\texpected := url.UserPassword(\"username\", \"password\")\n\t\t\t\tif diff := userinfoDiff(gotUser, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"user username\",\n\t\t\texpr: `grpc.federation.url.parse('https://username:password@example.com/path?query=1#fragment').userinfo().username()`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tuser, err := url.Parse(\"https://username:password@example.com/path?query=1#fragment\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := user.User.Username()\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"user password\",\n\t\t\texpr: `grpc.federation.url.parse('https://username:password@example.com/path?query=1#fragment').userinfo().password()`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tuser, err := url.Parse(\"https://username:password@example.com/path?query=1#fragment\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected, _ := user.User.Password()\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"user password set\",\n\t\t\texpr: `grpc.federation.url.parse('https://username:password@example.com/path?query=1#fragment').userinfo().passwordSet()`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.Bool)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tuser, err := url.Parse(\"https://username:password@example.com/path?query=1#fragment\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\t_, expected := user.User.Password()\n\t\t\t\tif diff := cmp.Diff(bool(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"user string\",\n\t\t\texpr: `grpc.federation.url.parse('https://username:password@example.com/path?query=1#fragment').userinfo().string()`,\n\t\t\tcmp: func(got ref.Val) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tuser, err := url.Parse(\"https://username:password@example.com/path?query=1#fragment\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := user.User.String()\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t}\n\n\treg, err := types.NewRegistry(new(cellib.URL), new(cellib.Userinfo))\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tenv, err := cel.NewEnv(\n\t\t\t\tcel.Variable(cellib.ContextVariableName, cel.ObjectType(cellib.ContextTypeName)),\n\t\t\t\tcel.Lib(cellib.NewURLLibrary(reg)),\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tast, iss := env.Compile(test.expr)\n\t\t\tif iss.Err() != nil {\n\t\t\t\tt.Fatal(iss.Err())\n\t\t\t}\n\t\t\tprogram, err := env.Program(ast)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\targs := map[string]any{cellib.ContextVariableName: cellib.NewContextValue(context.Background())}\n\t\t\tfor k, v := range test.args {\n\t\t\t\targs[k] = v\n\t\t\t}\n\t\t\tout, _, err := program.Eval(args)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tif err := test.cmp(out); err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t})\n\t}\n}\n\n// UserinfoDiff compares two Userinfo structs and returns a diff string similar to cmp.Diff.\nfunc userinfoDiff(got, expected *url.Userinfo) string {\n\tvar diffs []string\n\n\tif got.Username() != expected.Username() {\n\t\tdiffs = append(diffs, fmt.Sprintf(\"username: got %q, want %q\", got.Username(), expected.Username()))\n\t}\n\n\tgotPassword, gotPasswordSet := got.Password()\n\texpectedPassword, expectedPasswordSet := expected.Password()\n\tif gotPasswordSet != expectedPasswordSet {\n\t\tdiffs = append(diffs, fmt.Sprintf(\"password set: got %t, want %t\", gotPasswordSet, expectedPasswordSet))\n\t}\n\tif gotPassword != expectedPassword {\n\t\tdiffs = append(diffs, fmt.Sprintf(\"password: got %q, want %q\", gotPassword, expectedPassword))\n\t}\n\n\tif len(diffs) == 0 {\n\t\treturn \"\"\n\t}\n\n\treturn \"(-got, +want)\\n\" + strings.Join(diffs, \"\\n\")\n}\n"
  },
  {
    "path": "grpc/federation/cel/uuid.go",
    "content": "package cel\n\nimport (\n\t\"context\"\n\t\"reflect\"\n\n\t\"github.com/google/cel-go/cel\"\n\t\"github.com/google/cel-go/common/types\"\n\t\"github.com/google/cel-go/common/types/ref\"\n\t\"github.com/google/uuid\"\n)\n\nconst UUIDPackageName = \"uuid\"\n\nvar (\n\tUUIDType = types.NewObjectType(createUUIDName(\"UUID\"))\n)\n\ntype UUID struct {\n\tuuid.UUID\n}\n\nfunc (u *UUID) ConvertToNative(typeDesc reflect.Type) (any, error) {\n\treturn u, nil\n}\n\nfunc (u *UUID) ConvertToType(typeValue ref.Type) ref.Val {\n\treturn types.NewErrFromString(\"grpc.federation.uuid: uuid type conversion does not support\")\n}\n\nfunc (u *UUID) Equal(other ref.Val) ref.Val {\n\tif o, ok := other.(*UUID); ok {\n\t\treturn types.Bool(u.String() == o.String())\n\t}\n\treturn types.False\n}\n\nfunc (u *UUID) Type() ref.Type {\n\treturn UUIDType\n}\n\nfunc (u *UUID) Value() any {\n\treturn u\n}\n\ntype UUIDLibrary struct {\n}\n\nfunc (lib *UUIDLibrary) LibraryName() string {\n\treturn packageName(UUIDPackageName)\n}\n\nfunc createUUIDName(name string) string {\n\treturn createName(UUIDPackageName, name)\n}\n\nfunc createUUIDID(name string) string {\n\treturn createID(UUIDPackageName, name)\n}\n\nfunc (lib *UUIDLibrary) CompileOptions() []cel.EnvOption {\n\tvar opts []cel.EnvOption\n\tfor _, funcOpts := range [][]cel.EnvOption{\n\t\t// UUID functions\n\t\tBindFunction(\n\t\t\tcreateUUIDName(\"new\"),\n\t\t\tOverloadFunc(createUUIDID(\"new_uuid\"), []*cel.Type{}, UUIDType,\n\t\t\t\tfunc(_ context.Context, _ ...ref.Val) ref.Val {\n\t\t\t\t\treturn &UUID{\n\t\t\t\t\t\tUUID: uuid.New(),\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateUUIDName(\"newRandom\"),\n\t\t\tOverloadFunc(createUUIDID(\"new_random_uuid\"), []*cel.Type{}, UUIDType,\n\t\t\t\tfunc(_ context.Context, _ ...ref.Val) ref.Val {\n\t\t\t\t\tid, err := uuid.NewRandom()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn &UUID{UUID: id}\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateUUIDName(\"newRandomFromRand\"),\n\t\t\tOverloadFunc(createUUIDID(\"new_random_from_rand_uuid\"), []*cel.Type{RandType}, UUIDType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\tid, err := uuid.NewRandomFromReader(args[0].(*Rand))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn &UUID{UUID: id}\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateUUIDName(\"parse\"),\n\t\t\tOverloadFunc(createUUIDID(\"parse\"), []*cel.Type{cel.StringType}, UUIDType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\tid, err := uuid.Parse(string(args[0].(types.String)))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn types.NewErrFromString(err.Error())\n\t\t\t\t\t}\n\t\t\t\t\treturn &UUID{UUID: id}\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindFunction(\n\t\t\tcreateUUIDName(\"validate\"),\n\t\t\tOverloadFunc(createUUIDID(\"validate\"), []*cel.Type{cel.StringType}, cel.BoolType,\n\t\t\t\tfunc(_ context.Context, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Bool(uuid.Validate(string(args[0].(types.String))) == nil)\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"domain\",\n\t\t\tMemberOverloadFunc(createRandID(\"domain_uuid_string\"), UUIDType, []*cel.Type{}, cel.UintType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Uint(self.(*UUID).Domain())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"id\",\n\t\t\tMemberOverloadFunc(createRandID(\"id_uuid_string\"), UUIDType, []*cel.Type{}, cel.UintType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Uint(self.(*UUID).ID())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"time\",\n\t\t\tMemberOverloadFunc(createRandID(\"time_uuid_int\"), UUIDType, []*cel.Type{}, cel.IntType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Int(self.(*UUID).Time())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"urn\",\n\t\t\tMemberOverloadFunc(createRandID(\"urn_uuid_string\"), UUIDType, []*cel.Type{}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(self.(*UUID).URN())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"string\",\n\t\t\tMemberOverloadFunc(createRandID(\"string_uuid_string\"), UUIDType, []*cel.Type{}, cel.StringType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.String(self.(*UUID).String())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t\tBindMemberFunction(\n\t\t\t\"version\",\n\t\t\tMemberOverloadFunc(createRandID(\"version_uuid_uint\"), UUIDType, []*cel.Type{}, cel.UintType,\n\t\t\t\tfunc(_ context.Context, self ref.Val, args ...ref.Val) ref.Val {\n\t\t\t\t\treturn types.Uint(self.(*UUID).Version())\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t} {\n\t\topts = append(opts, funcOpts...)\n\t}\n\treturn opts\n}\n\nfunc (lib *UUIDLibrary) ProgramOptions() []cel.ProgramOption {\n\treturn []cel.ProgramOption{}\n}\n"
  },
  {
    "path": "grpc/federation/cel/uuid_test.go",
    "content": "//nolint:gosec\npackage cel_test\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"math/rand\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/google/cel-go/cel\"\n\t\"github.com/google/cel-go/common/types\"\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/uuid\"\n\n\tcellib \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n)\n\nfunc TestUUID(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\texpr string\n\t\targs map[string]any\n\t\tcmp  func(any) error\n\t}{\n\t\t// UUID functions\n\t\t{\n\t\t\tname: \"new\",\n\t\t\texpr: \"grpc.federation.uuid.new()\",\n\t\t\tcmp: func(got any) error {\n\t\t\t\tgotV, ok := got.(*cellib.UUID) //nolint: staticcheck\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tif len(gotV.UUID) == 0 {\n\t\t\t\t\treturn fmt.Errorf(\"failed to get uuid\")\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"newRandom\",\n\t\t\texpr: \"grpc.federation.uuid.newRandom()\",\n\t\t\tcmp: func(got any) error {\n\t\t\t\tgotV, ok := got.(*cellib.UUID) //nolint: staticcheck\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tif len(gotV.UUID) == 0 {\n\t\t\t\t\treturn fmt.Errorf(\"failed to get uuid\")\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"newRandomFromRand\",\n\t\t\texpr: \"grpc.federation.uuid.newRandomFromRand(grpc.federation.rand.new(grpc.federation.rand.newSource(grpc.federation.time.date(2023, 12, 25, 12, 0, 0, 0, grpc.federation.time.UTC()).unix())))\",\n\t\t\tcmp: func(got any) error {\n\t\t\t\tgotV, ok := got.(*cellib.UUID)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tr := rand.New(rand.NewSource(time.Date(2023, 12, 25, 12, 0, 0, 0, time.UTC).Unix())) //nolint: gosec\n\t\t\t\tid, err := uuid.NewRandomFromReader(r)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := id.String()\n\t\t\t\tif diff := cmp.Diff(gotV.UUID.String(), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"parse\",\n\t\t\texpr: `grpc.federation.uuid.parse('823dd8a3-0b49-4438-9917-2da83105bcb2')`,\n\t\t\tcmp: func(got any) error {\n\t\t\t\tgotV, ok := got.(*cellib.UUID)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := \"823dd8a3-0b49-4438-9917-2da83105bcb2\"\n\t\t\t\tif diff := cmp.Diff(gotV.UUID.String(), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"validate\",\n\t\t\texpr: `grpc.federation.uuid.validate('823dd8a3-0b49-4438-9917-2da83105bcb2')`,\n\t\t\tcmp: func(got any) error {\n\t\t\t\tgotV, ok := got.(types.Bool)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := types.Bool(true)\n\t\t\t\tif diff := cmp.Diff(gotV, expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"domain\",\n\t\t\texpr: \"grpc.federation.uuid.newRandomFromRand(grpc.federation.rand.new(grpc.federation.rand.newSource(grpc.federation.time.date(2023, 12, 25, 12, 0, 0, 0, grpc.federation.time.UTC()).unix()))).domain()\",\n\t\t\tcmp: func(got any) error {\n\t\t\t\tgotV, ok := got.(types.Uint)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tr := rand.New(rand.NewSource(time.Date(2023, 12, 25, 12, 0, 0, 0, time.UTC).Unix())) //nolint: gosec\n\t\t\t\tid, err := uuid.NewRandomFromReader(r)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := id.Domain()\n\t\t\t\tif diff := cmp.Diff(uuid.Domain(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"id\",\n\t\t\texpr: \"grpc.federation.uuid.newRandomFromRand(grpc.federation.rand.new(grpc.federation.rand.newSource(grpc.federation.time.date(2023, 12, 25, 12, 0, 0, 0, grpc.federation.time.UTC()).unix()))).id()\",\n\t\t\tcmp: func(got any) error {\n\t\t\t\tgotV, ok := got.(types.Uint)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tr := rand.New(rand.NewSource(time.Date(2023, 12, 25, 12, 0, 0, 0, time.UTC).Unix())) //nolint: gosec\n\t\t\t\tid, err := uuid.NewRandomFromReader(r)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := id.ID()\n\t\t\t\tif diff := cmp.Diff(uint32(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"time\",\n\t\t\texpr: \"grpc.federation.uuid.newRandomFromRand(grpc.federation.rand.new(grpc.federation.rand.newSource(grpc.federation.time.date(2023, 12, 25, 12, 0, 0, 0, grpc.federation.time.UTC()).unix()))).time()\",\n\t\t\tcmp: func(got any) error {\n\t\t\t\tgotV, ok := got.(types.Int)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tr := rand.New(rand.NewSource(time.Date(2023, 12, 25, 12, 0, 0, 0, time.UTC).Unix())) //nolint: gosec\n\t\t\t\tid, err := uuid.NewRandomFromReader(r)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := id.Time()\n\t\t\t\tif diff := cmp.Diff(uuid.Time(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"urn\",\n\t\t\texpr: \"grpc.federation.uuid.newRandomFromRand(grpc.federation.rand.new(grpc.federation.rand.newSource(grpc.federation.time.date(2023, 12, 25, 12, 0, 0, 0, grpc.federation.time.UTC()).unix()))).urn()\",\n\t\t\tcmp: func(got any) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tr := rand.New(rand.NewSource(time.Date(2023, 12, 25, 12, 0, 0, 0, time.UTC).Unix())) //nolint: gosec\n\t\t\t\tid, err := uuid.NewRandomFromReader(r)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := id.URN()\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"string\",\n\t\t\texpr: \"grpc.federation.uuid.newRandomFromRand(grpc.federation.rand.new(grpc.federation.rand.newSource(grpc.federation.time.date(2023, 12, 25, 12, 0, 0, 0, grpc.federation.time.UTC()).unix()))).string()\",\n\t\t\tcmp: func(got any) error {\n\t\t\t\tgotV, ok := got.(types.String)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\tr := rand.New(rand.NewSource(time.Date(2023, 12, 25, 12, 0, 0, 0, time.UTC).Unix())) //nolint: gosec\n\t\t\t\tid, err := uuid.NewRandomFromReader(r)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texpected := id.String()\n\t\t\t\tif diff := cmp.Diff(string(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"version\",\n\t\t\texpr: \"grpc.federation.uuid.new().version()\",\n\t\t\tcmp: func(got any) error {\n\t\t\t\tgotV, ok := got.(types.Uint)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"invalid result type: %T\", got)\n\t\t\t\t}\n\t\t\t\texpected := uuid.New().Version()\n\t\t\t\tif diff := cmp.Diff(uuid.Version(gotV), expected); diff != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t}\n\treg, err := types.NewRegistry(new(cellib.Time), new(cellib.Location))\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tenv, err := cel.NewEnv(\n\t\t\t\tcel.Variable(cellib.ContextVariableName, cel.ObjectType(cellib.ContextTypeName)),\n\t\t\t\tcel.Lib(new(cellib.UUIDLibrary)),\n\t\t\t\tcel.Lib(new(cellib.RandLibrary)),\n\t\t\t\tcel.Lib(cellib.NewTimeLibrary(reg)),\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tast, iss := env.Compile(test.expr)\n\t\t\tif iss.Err() != nil {\n\t\t\t\tt.Fatal(iss.Err())\n\t\t\t}\n\t\t\tprogram, err := env.Program(ast)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\targs := map[string]any{cellib.ContextVariableName: cellib.NewContextValue(context.Background())}\n\t\t\tfor k, v := range test.args {\n\t\t\t\targs[k] = v\n\t\t\t}\n\t\t\tout, _, err := program.Eval(args)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tif err := test.cmp(out); err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "grpc/federation/cel.go",
    "content": "package federation\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"reflect\"\n\t\"sort\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/google/cel-go/cel\"\n\tcelast \"github.com/google/cel-go/common/ast\"\n\t\"github.com/google/cel-go/common/operators\"\n\tceltypes \"github.com/google/cel-go/common/types\"\n\t\"github.com/google/cel-go/common/types/ref\"\n\t\"github.com/google/cel-go/ext\"\n\t\"github.com/google/cel-go/parser\"\n\t\"golang.org/x/sync/singleflight\"\n\texprpb \"google.golang.org/genproto/googleapis/api/expr/v1alpha1\"\n\t\"google.golang.org/genproto/googleapis/rpc/code\"\n\t\"google.golang.org/genproto/googleapis/rpc/errdetails\"\n\tgrpccodes \"google.golang.org/grpc/codes\"\n\tgrpcstatus \"google.golang.org/grpc/status\"\n\t\"google.golang.org/protobuf/proto\"\n\t\"google.golang.org/protobuf/reflect/protoreflect\"\n\t\"google.golang.org/protobuf/reflect/protoregistry\"\n\t\"google.golang.org/protobuf/types/known/anypb\"\n\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n)\n\n// CELTypeHelper provides the cel.Registry needed to build a cel environment.\ntype CELTypeHelper struct {\n\t*celtypes.Registry\n\tstructFieldMap map[string]map[string]*celtypes.FieldType\n\tpkgName        string\n\tmapMu          sync.RWMutex\n\tmu             sync.Mutex\n}\n\nfunc (h *CELTypeHelper) RegisterType(types ...ref.Type) error {\n\th.mu.Lock()\n\terr := h.Registry.RegisterType(types...)\n\th.mu.Unlock()\n\treturn err\n}\n\nfunc (h *CELTypeHelper) CELRegistry() *celtypes.Registry {\n\treturn h.Registry\n}\n\nfunc (h *CELTypeHelper) TypeProvider() celtypes.Provider {\n\treturn h\n}\n\nfunc (h *CELTypeHelper) TypeAdapter() celtypes.Adapter {\n\treturn h.Registry\n}\n\nfunc (h *CELTypeHelper) EnumValue(enumName string) ref.Val {\n\treturn h.Registry.EnumValue(enumName)\n}\n\nfunc (h *CELTypeHelper) FindIdent(identName string) (ref.Val, bool) {\n\treturn h.Registry.FindIdent(identName)\n}\n\nfunc (h *CELTypeHelper) FindStructType(structType string) (*celtypes.Type, bool) {\n\tif st, found := h.Registry.FindStructType(structType); found {\n\t\treturn st, found\n\t}\n\th.mapMu.RLock()\n\tdefer h.mapMu.RUnlock()\n\tif _, exists := h.structFieldMap[structType]; exists {\n\t\treturn celtypes.NewObjectType(structType), true\n\t}\n\treturn nil, false\n}\n\nfunc (h *CELTypeHelper) FindStructFieldNames(structType string) ([]string, bool) {\n\tif names, found := h.Registry.FindStructFieldNames(structType); found {\n\t\treturn names, found\n\t}\n\n\th.mapMu.RLock()\n\tdefer h.mapMu.RUnlock()\n\tfieldMap, exists := h.structFieldMap[structType]\n\tif !exists {\n\t\treturn nil, false\n\t}\n\tfieldNames := make([]string, 0, len(fieldMap))\n\tfor fieldName := range fieldMap {\n\t\tfieldNames = append(fieldNames, fieldName)\n\t}\n\tsort.Strings(fieldNames)\n\treturn fieldNames, true\n}\n\nfunc (h *CELTypeHelper) FindStructFieldType(structType, fieldName string) (*celtypes.FieldType, bool) {\n\tif field, found := h.Registry.FindStructFieldType(structType, fieldName); found {\n\t\treturn field, found\n\t}\n\n\th.mapMu.RLock()\n\tdefer h.mapMu.RUnlock()\n\tfieldMap, exists := h.structFieldMap[structType]\n\tif !exists {\n\t\treturn nil, false\n\t}\n\tfield, found := fieldMap[fieldName]\n\treturn field, found\n}\n\nfunc (h *CELTypeHelper) NewValue(structType string, fields map[string]ref.Val) ref.Val {\n\treturn h.Registry.NewValue(structType, fields)\n}\n\nfunc NewCELFieldType(typ *celtypes.Type, fieldName string) *celtypes.FieldType {\n\tisSet := func(v any, fieldName string) bool {\n\t\trv := reflect.ValueOf(v)\n\t\tif rv.Kind() == reflect.Pointer {\n\t\t\trv = rv.Elem()\n\t\t}\n\t\tif rv.Kind() != reflect.Struct {\n\t\t\treturn false\n\t\t}\n\t\treturn !rv.FieldByName(fieldName).IsZero()\n\t}\n\tgetFrom := func(v any, fieldName string) (any, error) {\n\t\trv := reflect.ValueOf(v)\n\t\tif rv.Kind() == reflect.Pointer {\n\t\t\trv = rv.Elem()\n\t\t}\n\t\tif rv.Kind() != reflect.Struct {\n\t\t\treturn nil, fmt.Errorf(\"%T is not struct type\", v)\n\t\t}\n\t\tvalue := rv.FieldByName(fieldName)\n\t\treturn value.Interface(), nil\n\t}\n\treturn &celtypes.FieldType{\n\t\tType: typ,\n\t\tIsSet: func(v any) bool {\n\t\t\treturn isSet(v, fieldName)\n\t\t},\n\t\tGetFrom: func(v any) (any, error) {\n\t\t\treturn getFrom(v, fieldName)\n\t\t},\n\t}\n}\n\nfunc NewOneofSelectorFieldType(typ *celtypes.Type, fieldName string, oneofTypes []reflect.Type, getterNames []string, zeroValue reflect.Value) *celtypes.FieldType {\n\tisSet := func(_ any) bool {\n\t\treturn false\n\t}\n\tgetFrom := func(v any) (any, error) {\n\t\trv := reflect.ValueOf(v)\n\t\tif rv.Kind() == reflect.Pointer {\n\t\t\trv = rv.Elem()\n\t\t}\n\t\tif rv.Kind() != reflect.Struct {\n\t\t\treturn nil, fmt.Errorf(\"%T is not struct type\", v)\n\t\t}\n\t\tfield := rv.FieldByName(fieldName)\n\t\tfieldImpl := reflect.ValueOf(field.Interface())\n\t\tif !fieldImpl.IsValid() {\n\t\t\t// prevent panic if no value assigned\n\t\t\treturn nil, fmt.Errorf(\"%s is invalid field\", fieldName)\n\t\t}\n\t\tfor idx, oneofType := range oneofTypes {\n\t\t\tif fieldImpl.Type() != oneofType {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tmethod := reflect.ValueOf(v).MethodByName(getterNames[idx])\n\t\t\tretValues := method.Call(nil)\n\t\t\tif len(retValues) != 1 {\n\t\t\t\treturn nil, fmt.Errorf(\"failed to call %s for %T\", \"\", v)\n\t\t\t}\n\t\t\tretValue := retValues[0]\n\t\t\treturn retValue.Interface(), nil\n\t\t}\n\t\treturn zeroValue.Interface(), nil\n\t}\n\treturn &celtypes.FieldType{\n\t\tType: typ,\n\t\tIsSet: func(v any) bool {\n\t\t\treturn isSet(v)\n\t\t},\n\t\tGetFrom: func(v any) (any, error) {\n\t\t\treturn getFrom(v)\n\t\t},\n\t}\n}\n\ntype CELTypeHelperFieldMap map[string]map[string]*celtypes.FieldType\n\nfunc NewCELTypeHelper(pkgName string, structFieldMap CELTypeHelperFieldMap) *CELTypeHelper {\n\tcelRegistry := celtypes.NewEmptyRegistry()\n\tprotoregistry.GlobalFiles.RangeFiles(func(f protoreflect.FileDescriptor) bool {\n\t\tif err := celRegistry.RegisterDescriptor(f); err != nil {\n\t\t\treturn false\n\t\t}\n\t\treturn true\n\t})\n\treturn &CELTypeHelper{\n\t\tRegistry:       celRegistry,\n\t\tstructFieldMap: structFieldMap,\n\t\tpkgName:        pkgName,\n\t}\n}\n\nfunc EnumAccessorOptions(enumName string, nameToValue map[string]int32, valueToName map[int32]string) []cel.EnvOption {\n\treturn []cel.EnvOption{\n\t\tcel.Function(\n\t\t\tfmt.Sprintf(\"%s.name\", enumName),\n\t\t\tcel.Overload(fmt.Sprintf(\"%s_name_int_string\", enumName), []*cel.Type{cel.IntType}, cel.StringType,\n\t\t\t\tcel.UnaryBinding(func(self ref.Val) ref.Val {\n\t\t\t\t\treturn celtypes.String(valueToName[int32(self.(celtypes.Int))]) //nolint:gosec\n\t\t\t\t}),\n\t\t\t),\n\t\t),\n\t\tcel.Function(\n\t\t\tfmt.Sprintf(\"%s.value\", enumName),\n\t\t\tcel.Overload(fmt.Sprintf(\"%s_value_string_int\", enumName), []*cel.Type{cel.StringType}, cel.IntType,\n\t\t\t\tcel.UnaryBinding(func(self ref.Val) ref.Val {\n\t\t\t\t\treturn celtypes.Int(nameToValue[string(self.(celtypes.String))])\n\t\t\t\t}),\n\t\t\t),\n\t\t),\n\t\tcel.Function(\n\t\t\tfmt.Sprintf(\"%s.from\", enumName),\n\t\t\tcel.Overload(fmt.Sprintf(\"%s_from_int_int\", enumName), []*cel.Type{cel.IntType}, cel.IntType,\n\t\t\t\tcel.UnaryBinding(func(self ref.Val) ref.Val {\n\t\t\t\t\treturn self\n\t\t\t\t}),\n\t\t\t),\n\t\t),\n\t}\n}\n\nfunc GRPCErrorAccessorOptions(adapter celtypes.Adapter, protoName string) []cel.EnvOption {\n\tvar opts []cel.EnvOption\n\topts = append(opts,\n\t\tgrpcfedcel.BindMemberFunction(\n\t\t\t\"hasIgnoredError\",\n\t\t\tgrpcfedcel.MemberOverloadFunc(fmt.Sprintf(\"%s_has_ignored_error\", protoName), cel.ObjectType(protoName), []*cel.Type{}, cel.BoolType,\n\t\t\t\tfunc(ctx context.Context, self ref.Val, _ ...ref.Val) ref.Val {\n\t\t\t\t\tv := self.Value()\n\t\t\t\t\tvalue := localValueFromContext(ctx)\n\t\t\t\t\tif value == nil {\n\t\t\t\t\t\treturn celtypes.Bool(false)\n\t\t\t\t\t}\n\t\t\t\t\treturn celtypes.Bool(value.grpcError(v) != nil)\n\t\t\t\t},\n\t\t\t),\n\t\t)...,\n\t)\n\topts = append(opts,\n\t\tgrpcfedcel.BindMemberFunction(\n\t\t\t\"ignoredError\",\n\t\t\tgrpcfedcel.MemberOverloadFunc(\n\t\t\t\tfmt.Sprintf(\"%s_ignored_error\", protoName), cel.ObjectType(protoName), []*cel.Type{}, cel.ObjectType(\"grpc.federation.private.Error\"),\n\t\t\t\tfunc(ctx context.Context, self ref.Val, _ ...ref.Val) ref.Val {\n\t\t\t\t\tv := self.Value()\n\t\t\t\t\tvalue := localValueFromContext(ctx)\n\t\t\t\t\tif value == nil {\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t}\n\t\t\t\t\treturn adapter.NativeToValue(value.grpcError(v))\n\t\t\t\t},\n\t\t\t),\n\t\t)...,\n\t)\n\treturn opts\n}\n\ntype EnumAttributeMap[T ~int32] map[T]EnumValueAttributeMap\n\ntype EnumValueAttributeMap map[string]string\n\nfunc EnumAttrOption[T ~int32](enumName string, enumAttrMap EnumAttributeMap[T]) cel.EnvOption {\n\treturn cel.Function(\n\t\tfmt.Sprintf(\"%s.attr\", enumName),\n\t\tcel.Overload(fmt.Sprintf(\"%s_attr\", enumName), []*cel.Type{cel.IntType, cel.StringType}, cel.StringType,\n\t\t\tcel.BinaryBinding(func(enumValue, key ref.Val) ref.Val {\n\t\t\t\tenumValueAttrMap := enumAttrMap[T(enumValue.(celtypes.Int))]\n\t\t\t\tif enumValueAttrMap == nil {\n\t\t\t\t\treturn celtypes.NewErr(`could not find enum value attribute map from %q`, enumName)\n\t\t\t\t}\n\t\t\t\treturn celtypes.String(enumValueAttrMap[string(key.(celtypes.String))])\n\t\t\t}),\n\t\t),\n\t)\n}\n\nfunc NewDefaultEnvOptions(celHelper *CELTypeHelper) []cel.EnvOption {\n\topts := []cel.EnvOption{\n\t\tcel.StdLib(),\n\t\text.TwoVarComprehensions(),\n\t\tcel.Lib(grpcfedcel.NewLibrary(celHelper)),\n\t\tcel.CrossTypeNumericComparisons(true),\n\t\tcel.CustomTypeAdapter(celHelper.TypeAdapter()),\n\t\tcel.CustomTypeProvider(celHelper.TypeProvider()),\n\t\tcel.Variable(\"error\", cel.ObjectType(\"grpc.federation.private.Error\")),\n\t\tcel.Variable(ContextVariableName, cel.ObjectType(ContextTypeName)),\n\t\tcel.Container(celHelper.pkgName),\n\t}\n\topts = append(opts, EnumAccessorOptions(\"google.rpc.Code\", code.Code_value, code.Code_name)...)\n\treturn opts\n}\n\n// CELCache used to speed up CEL evaluation from the second time onward.\n// cel.Program cannot be reused to evaluate contextual libraries or plugins, so cel.Ast is reused to speed up the process.\ntype CELCache struct {\n\tprogram cel.Program // cache for simple expressions.\n}\n\n// CELCacheMap service-wide in-memory cache store for CEL evaluation.\n// The cache key is a constant value created by code-generation.\ntype CELCacheMap struct {\n\tmu       sync.RWMutex\n\tcacheMap map[int]*CELCache\n}\n\n// NewCELCacheMap creates CELCacheMap instance.\nfunc NewCELCacheMap() *CELCacheMap {\n\treturn &CELCacheMap{\n\t\tcacheMap: make(map[int]*CELCache),\n\t}\n}\n\nfunc (m *CELCacheMap) get(index int) *CELCache {\n\tm.mu.RLock()\n\tcache := m.cacheMap[index]\n\tm.mu.RUnlock()\n\treturn cache\n}\n\nfunc (m *CELCacheMap) set(index int, cache *CELCache) {\n\tm.mu.Lock()\n\tm.cacheMap[index] = cache\n\tm.mu.Unlock()\n}\n\ntype LocalValue struct {\n\tsg         singleflight.Group\n\tsgCache    *singleflightCache\n\tmu         sync.RWMutex\n\tenvOpts    []cel.EnvOption\n\tevalValues map[string]any\n\tgrpcErrMap map[any]*grpcfedcel.Error\n}\n\ntype singleflightCache struct {\n\tmu        sync.RWMutex\n\tresultMap map[string]*singleflightCacheResult\n}\n\ntype singleflightCacheResult struct {\n\tresult any\n\terr    error\n}\n\nfunc NewLocalValue(ctx context.Context, envOpts []cel.EnvOption, argName string, arg any) *LocalValue {\n\tvar newEnvOpts []cel.EnvOption\n\tnewEnvOpts = append(\n\t\tappend(newEnvOpts, envOpts...),\n\t\tcel.Variable(MessageArgumentVariableName, cel.ObjectType(argName)),\n\t)\n\treturn &LocalValue{\n\t\tsgCache: &singleflightCache{\n\t\t\tresultMap: make(map[string]*singleflightCacheResult),\n\t\t},\n\t\tenvOpts:    newEnvOpts,\n\t\tevalValues: map[string]any{MessageArgumentVariableName: arg},\n\t\tgrpcErrMap: make(map[any]*grpcfedcel.Error),\n\t}\n}\n\nfunc NewServiceVariableLocalValue(envOpts []cel.EnvOption) *LocalValue {\n\tnewEnvOpts := append([]cel.EnvOption{}, envOpts...)\n\treturn &LocalValue{\n\t\tsgCache: &singleflightCache{\n\t\t\tresultMap: make(map[string]*singleflightCacheResult),\n\t\t},\n\t\tenvOpts:    newEnvOpts,\n\t\tevalValues: make(map[string]any),\n\t}\n}\n\nfunc (v *LocalValue) AddEnv(env any) {\n\tv.setEvalValue(\"grpc.federation.env\", env)\n}\n\nfunc (v *LocalValue) AddServiceVariable(env any) {\n\tv.setEvalValue(\"grpc.federation.var\", env)\n}\n\nfunc (v *LocalValue) SetGRPCError(retVal any, err *grpcfedcel.Error) {\n\tv.lock()\n\tv.grpcErrMap[retVal] = err\n\tv.unlock()\n}\n\nfunc (v *LocalValue) grpcError(retVal any) *grpcfedcel.Error {\n\tv.rlock()\n\terr := v.grpcErrMap[retVal]\n\tv.runlock()\n\treturn err\n}\n\ntype localValue interface {\n\tdo(string, func() (any, error)) (any, error)\n\trlock()\n\trunlock()\n\tlock()\n\tunlock()\n\tgetEnvOpts() []cel.EnvOption\n\tgetEvalValues(context.Context) map[string]any\n\tsetEnvOptValue(string, *cel.Type)\n\tsetEvalValue(string, any)\n}\n\nfunc (v *LocalValue) getSingleflightCache(name string) (*singleflightCacheResult, bool) {\n\tv.sgCache.mu.RLock()\n\tdefer v.sgCache.mu.RUnlock()\n\n\tcache, exists := v.sgCache.resultMap[name]\n\treturn cache, exists\n}\n\nfunc (v *LocalValue) setSingleflightCache(name string, result *singleflightCacheResult) {\n\tv.sgCache.mu.Lock()\n\tv.sgCache.resultMap[name] = result\n\tv.sgCache.mu.Unlock()\n}\n\nfunc (v *LocalValue) do(name string, cb func() (any, error)) (any, error) {\n\tif cache, exists := v.getSingleflightCache(name); exists {\n\t\treturn cache.result, cache.err\n\t}\n\tret, err, _ := v.sg.Do(name, func() (any, error) {\n\t\tret, err := cb()\n\t\tv.setSingleflightCache(name, &singleflightCacheResult{\n\t\t\tresult: ret,\n\t\t\terr:    err,\n\t\t})\n\t\treturn ret, err\n\t})\n\treturn ret, err\n}\n\nfunc (v *LocalValue) WithLock(fn func()) {\n\tv.mu.Lock()\n\tdefer v.mu.Unlock()\n\tfn()\n}\n\nfunc (v *LocalValue) rlock() {\n\tv.mu.RLock()\n}\n\nfunc (v *LocalValue) runlock() {\n\tv.mu.RUnlock()\n}\n\nfunc (v *LocalValue) lock() {\n\tv.mu.Lock()\n}\n\nfunc (v *LocalValue) unlock() {\n\tv.mu.Unlock()\n}\n\nfunc (v *LocalValue) getEnvOpts() []cel.EnvOption {\n\treturn v.envOpts\n}\n\nfunc (v *LocalValue) getEvalValues(ctx context.Context) map[string]any {\n\tret := map[string]any{ContextVariableName: grpcfedcel.NewContextValue(ctx)}\n\tif grpcErr := getGRPCErrorValue(ctx); grpcErr != nil {\n\t\tret[\"error\"] = grpcErr\n\t}\n\tfor k, v := range v.evalValues {\n\t\tret[k] = v\n\t}\n\treturn ret\n}\n\nfunc (v *LocalValue) setEnvOptValue(name string, typ *cel.Type) {\n\tv.envOpts = append(\n\t\tv.envOpts,\n\t\tcel.Variable(name, typ),\n\t)\n}\n\nfunc (v *LocalValue) setEvalValue(name string, value any) {\n\tv.evalValues[name] = value\n}\n\ntype MapIteratorValue struct {\n\tlocalValue localValue\n\tenvOpts    []cel.EnvOption\n\tevalValues map[string]any\n}\n\nfunc (v *MapIteratorValue) do(name string, cb func() (any, error)) (any, error) {\n\treturn v.localValue.do(name, cb)\n}\n\nfunc (v *MapIteratorValue) rlock() {\n\tv.localValue.rlock()\n}\n\nfunc (v *MapIteratorValue) runlock() {\n\tv.localValue.runlock()\n}\n\nfunc (v *MapIteratorValue) lock() {\n\tv.localValue.lock()\n}\n\nfunc (v *MapIteratorValue) unlock() {\n\tv.localValue.unlock()\n}\n\nfunc (v *MapIteratorValue) getEnvOpts() []cel.EnvOption {\n\treturn v.envOpts\n}\n\nfunc (v *MapIteratorValue) getEvalValues(ctx context.Context) map[string]any {\n\tret := map[string]any{ContextVariableName: grpcfedcel.NewContextValue(ctx)}\n\tfor k, v := range v.evalValues {\n\t\tret[k] = v\n\t}\n\treturn ret\n}\n\nfunc (v *MapIteratorValue) setEnvOptValue(name string, typ *cel.Type) {\n\tv.envOpts = append(\n\t\tv.envOpts,\n\t\tcel.Variable(name, typ),\n\t)\n}\n\nfunc (v *MapIteratorValue) setEvalValue(name string, value any) {\n\tv.evalValues[name] = value\n}\n\ntype Def[T any, U localValue] struct {\n\tIf           string\n\tName         string\n\tType         *cel.Type\n\tSetter       func(U, T) error\n\tBy           string\n\tIfCacheIndex int\n\tByCacheIndex int\n\tMessage      func(context.Context, U) (any, error)\n\tEnum         func(context.Context, U) (T, error)\n\tSwitch       func(context.Context, U) (any, error)\n\tValidation   func(context.Context, U) error\n}\n\ntype DefMap[T any, U any, V localValue] struct {\n\tIf             string\n\tIfCacheIndex   int\n\tName           string\n\tType           *cel.Type\n\tSetter         func(V, T) error\n\tIteratorName   string\n\tIteratorType   *cel.Type\n\tIteratorSource func(V) []U\n\tIterator       func(context.Context, *MapIteratorValue) (any, error)\n\toutType        T\n}\n\nfunc EvalDef[T any, U localValue](ctx context.Context, value U, def Def[T, U]) error {\n\t_, err := value.do(def.Name, func() (any, error) {\n\t\treturn nil, evalDef(ctx, value, def)\n\t})\n\treturn err\n}\n\nfunc IgnoreAndResponse[T any, U localValue](ctx context.Context, value U, def Def[T, U]) error {\n\t// doesn't use cache to create response variable by same name key.\n\treturn evalDef(ctx, value, def)\n}\n\nfunc evalDef[T any, U localValue](ctx context.Context, value U, def Def[T, U]) error {\n\tvar (\n\t\tv    T\n\t\terrs []error\n\t\tcond = true\n\t\tname = def.Name\n\t)\n\tif def.If != \"\" {\n\t\tc, err := EvalCEL(ctx, &EvalCELRequest{\n\t\t\tValue:      value,\n\t\t\tExpr:       def.If,\n\t\t\tOutType:    reflect.TypeOf(false),\n\t\t\tCacheIndex: def.IfCacheIndex,\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif !c.(bool) {\n\t\t\tcond = false\n\t\t}\n\t}\n\n\tif cond {\n\t\tret, runErr := func() (any, error) {\n\t\t\tswitch {\n\t\t\tcase def.By != \"\":\n\t\t\t\treturn EvalCEL(ctx, &EvalCELRequest{\n\t\t\t\t\tValue:      value,\n\t\t\t\t\tExpr:       def.By,\n\t\t\t\t\tOutType:    reflect.TypeOf(v),\n\t\t\t\t\tCacheIndex: def.ByCacheIndex,\n\t\t\t\t})\n\t\t\tcase def.Message != nil:\n\t\t\t\treturn def.Message(ctx, value)\n\t\t\tcase def.Enum != nil:\n\t\t\t\treturn def.Enum(ctx, value)\n\t\t\tcase def.Switch != nil:\n\t\t\t\treturn def.Switch(ctx, value)\n\t\t\tcase def.Validation != nil:\n\t\t\t\tif err := def.Validation(ctx, value); err != nil {\n\t\t\t\t\tif _, ok := grpcstatus.FromError(err); ok {\n\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t}\n\t\t\t\t\tLogger(ctx).ErrorContext(ctx, \"failed running validations\", slog.String(\"error\", err.Error()))\n\t\t\t\t\treturn nil, grpcstatus.Errorf(grpccodes.Internal, \"failed running validations: %s\", err)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn nil, nil\n\t\t}()\n\t\tif ret != nil {\n\t\t\tv = ret.(T)\n\t\t}\n\t\tif runErr != nil {\n\t\t\terrs = append(errs, runErr)\n\t\t}\n\t}\n\n\tvalue.lock()\n\tif err := def.Setter(value, v); err != nil {\n\t\terrs = append(errs, err)\n\t}\n\tvalue.setEnvOptValue(name, def.Type)\n\tvalue.setEvalValue(name, v)\n\tvalue.unlock()\n\n\tif len(errs) == 1 {\n\t\treturn errs[0]\n\t} else if len(errs) > 1 {\n\t\treturn errors.Join(errs...)\n\t}\n\treturn nil\n}\n\nfunc EvalDefMap[T any, U any, V localValue](ctx context.Context, value V, def DefMap[T, U, V]) error {\n\t_, err := value.do(def.Name, func() (any, error) {\n\t\terr := evalDefMap(ctx, value, def)\n\t\treturn nil, err\n\t})\n\treturn err\n}\n\nfunc evalDefMap[T any, U any, V localValue](ctx context.Context, value V, def DefMap[T, U, V]) error {\n\tvar (\n\t\tv    T\n\t\terrs []error\n\t\tcond = true\n\t\tname = def.Name\n\t)\n\tif def.If != \"\" {\n\t\tc, err := EvalCEL(ctx, &EvalCELRequest{\n\t\t\tValue:      value,\n\t\t\tExpr:       def.If,\n\t\t\tOutType:    reflect.TypeOf(false),\n\t\t\tCacheIndex: def.IfCacheIndex,\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif !c.(bool) {\n\t\t\tcond = false\n\t\t}\n\t}\n\n\tif cond {\n\t\tret, runErr := evalMap(\n\t\t\tctx,\n\t\t\tvalue,\n\t\t\tdef.IteratorName,\n\t\t\tdef.IteratorType,\n\t\t\tdef.IteratorSource,\n\t\t\treflect.TypeOf(def.outType),\n\t\t\tdef.Iterator,\n\t\t)\n\t\tif ret != nil {\n\t\t\tv = ret.(T)\n\t\t}\n\t\tif runErr != nil {\n\t\t\terrs = append(errs, runErr)\n\t\t}\n\t}\n\n\tvalue.lock()\n\tif err := def.Setter(value, v); err != nil {\n\t\terrs = append(errs, err)\n\t}\n\tvalue.setEnvOptValue(name, def.Type)\n\tvalue.setEvalValue(name, v)\n\tvalue.unlock()\n\n\tif len(errs) == 1 {\n\t\treturn errs[0]\n\t} else if len(errs) > 1 {\n\t\treturn errors.Join(errs...)\n\t}\n\treturn nil\n}\n\nfunc evalMap[T localValue, U any](\n\tctx context.Context,\n\tvalue T,\n\tname string,\n\ttyp *cel.Type,\n\tsrcFunc func(T) []U,\n\titerOutType reflect.Type,\n\tcb func(context.Context, *MapIteratorValue) (any, error)) (any, error) {\n\tvalue.rlock()\n\titerValue := &MapIteratorValue{\n\t\tlocalValue: value,\n\t\tevalValues: make(map[string]any),\n\t}\n\tenvOpts := value.getEnvOpts()\n\tfor k, v := range value.getEvalValues(ctx) {\n\t\titerValue.evalValues[k] = v\n\t}\n\tsrc := srcFunc(value)\n\tvalue.runlock()\n\n\tret := reflect.MakeSlice(iterOutType, 0, len(src))\n\tfor _, iter := range src {\n\t\titerValue.envOpts = append(append([]cel.EnvOption{}, envOpts...), cel.Variable(name, typ))\n\t\titerValue.evalValues[name] = iter\n\t\tv, err := cb(ctx, iterValue)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret = reflect.Append(ret, reflect.ValueOf(v))\n\t}\n\treturn ret.Interface(), nil\n}\n\ntype IfParam[T localValue] struct {\n\tValue      T\n\tExpr       string\n\tCacheIndex int\n\tBody       func(T) error\n}\n\nfunc If[T localValue](ctx context.Context, param *IfParam[T]) error {\n\tcond, err := EvalCEL(ctx, &EvalCELRequest{\n\t\tValue:      param.Value,\n\t\tExpr:       param.Expr,\n\t\tOutType:    reflect.TypeOf(false),\n\t\tCacheIndex: param.CacheIndex,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif cond.(bool) {\n\t\treturn param.Body(param.Value)\n\t}\n\treturn nil\n}\n\ntype EvalSwitchCase[T localValue] struct {\n\tDefs         func(ctx context.Context, value T) (any, error)\n\tIf           string // CEL expression\n\tIfCacheIndex int\n\tBy           string // CEL expression\n\tByCacheIndex int\n}\n\ntype EvalSwitchDefault[T localValue] struct {\n\tDefs         func(ctx context.Context, value T) (any, error)\n\tBy           string // CEL expression\n\tByCacheIndex int\n}\n\nfunc EvalSwitch[T any, V localValue](ctx context.Context, value V, cases []*EvalSwitchCase[V], defaultCase *EvalSwitchDefault[V]) (any, error) {\n\tvar v T\n\tfor _, c := range cases {\n\t\tcond, err := EvalCEL(ctx, &EvalCELRequest{\n\t\t\tValue:      value,\n\t\t\tExpr:       c.If,\n\t\t\tOutType:    reflect.TypeOf(false),\n\t\t\tCacheIndex: c.IfCacheIndex,\n\t\t})\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif cond.(bool) {\n\t\t\tif c.Defs != nil {\n\t\t\t\tif _, err := c.Defs(ctx, value); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t}\n\t\t\tby, err := EvalCEL(ctx, &EvalCELRequest{\n\t\t\t\tValue:      value,\n\t\t\t\tExpr:       c.By,\n\t\t\t\tOutType:    reflect.TypeOf(v),\n\t\t\t\tCacheIndex: c.ByCacheIndex,\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn by.(T), nil\n\t\t}\n\t}\n\tif defaultCase.Defs != nil {\n\t\tif _, err := defaultCase.Defs(ctx, value); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\tby, err := EvalCEL(ctx, &EvalCELRequest{\n\t\tValue:      value,\n\t\tExpr:       defaultCase.By,\n\t\tOutType:    reflect.TypeOf(v),\n\t\tCacheIndex: defaultCase.ByCacheIndex,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn by.(T), nil\n}\n\ntype EvalCELRequest struct {\n\tValue      localValue\n\tExpr       string\n\tOutType    reflect.Type\n\tCacheIndex int\n}\n\nfunc EvalCEL(ctx context.Context, req *EvalCELRequest) (any, error) {\n\tif celCacheMap := getCELCacheMap(ctx); celCacheMap == nil {\n\t\treturn nil, ErrCELCacheMap\n\t}\n\tif req.CacheIndex == 0 {\n\t\treturn nil, ErrCELCacheIndex\n\t}\n\n\treq.Value.rlock()\n\tenvOpts := req.Value.getEnvOpts()\n\tevalValues := req.Value.getEvalValues(ctx)\n\treq.Value.runlock()\n\n\tprogram, err := createCELProgram(ctx, req.Expr, req.CacheIndex, envOpts)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tout, _, err := program.ContextEval(ctx, evalValues)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\topt, ok := out.(*celtypes.Optional)\n\tif ok {\n\t\tif opt == celtypes.OptionalNone {\n\t\t\treturn reflect.Zero(req.OutType).Interface(), nil\n\t\t}\n\t\tout = opt.GetValue()\n\t}\n\tif _, ok := out.(celtypes.Null); ok {\n\t\tif req.OutType == nil {\n\t\t\treturn nil, nil\n\t\t}\n\t\treturn reflect.Zero(req.OutType).Interface(), nil\n\t}\n\tif req.OutType != nil {\n\t\treturn out.ConvertToNative(req.OutType)\n\t}\n\treturn out.Value(), nil\n}\n\nfunc createCELProgram(ctx context.Context, expr string, cacheIndex int, envOpts []cel.EnvOption) (cel.Program, error) {\n\tif program := getCELProgramCache(ctx, cacheIndex); program != nil {\n\t\treturn program, nil\n\t}\n\n\tenv, err := NewCELEnv(envOpts...)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to create cel env: %w\", err)\n\t}\n\tast, err := createCELAst(expr, env)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tprogram, err := env.Program(ast)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tsetCELProgramCache(ctx, cacheIndex, program)\n\treturn program, nil\n}\n\nfunc createCELAst(expr string, env *cel.Env) (*cel.Ast, error) {\n\treplacedExpr := strings.Replace(expr, \"$\", MessageArgumentVariableName, -1)\n\tast, iss := env.Compile(replacedExpr)\n\tif iss.Err() != nil {\n\t\treturn nil, iss.Err()\n\t}\n\n\tcheckedExpr, err := cel.AstToCheckedExpr(ast)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif newComparingNullResolver().Resolve(checkedExpr) {\n\t\tca, err := celast.ToAST(checkedExpr)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\texpr, err := parser.Unparse(ca.Expr(), ca.SourceInfo())\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tast, iss = env.Compile(expr)\n\t\tif iss.Err() != nil {\n\t\t\treturn nil, iss.Err()\n\t\t}\n\t}\n\treturn ast, nil\n}\n\nfunc getCELProgramCache(ctx context.Context, cacheIndex int) cel.Program {\n\tcache := getCELCacheMap(ctx).get(cacheIndex)\n\tif cache == nil {\n\t\treturn nil\n\t}\n\treturn cache.program\n}\n\nfunc setCELProgramCache(ctx context.Context, cacheIndex int, program cel.Program) {\n\tgetCELCacheMap(ctx).set(cacheIndex, &CELCache{program: program})\n}\n\nfunc ToGRPCError(ctx context.Context, err error) *grpcfedcel.Error {\n\tstat, ok := grpcstatus.FromError(err)\n\tif !ok {\n\t\treturn nil\n\t}\n\tgrpcErr := &grpcfedcel.Error{\n\t\tCode:    int32(stat.Code()), //nolint:gosec\n\t\tMessage: stat.Message(),\n\t}\n\tfor _, detail := range stat.Details() {\n\t\tprotoMsg, ok := detail.(proto.Message)\n\t\tif !ok {\n\t\t\tLogger(ctx).ErrorContext(\n\t\t\t\tctx,\n\t\t\t\t\"failed to convert error detail to proto message\",\n\t\t\t\tslog.String(\"detail\", fmt.Sprintf(\"%T\", detail)),\n\t\t\t)\n\t\t\tcontinue\n\t\t}\n\t\tanyValue, err := anypb.New(protoMsg)\n\t\tif err != nil {\n\t\t\tLogger(ctx).ErrorContext(\n\t\t\t\tctx,\n\t\t\t\t\"failed to create proto.Any instance from proto message\",\n\t\t\t\tslog.String(\"proto\", fmt.Sprintf(\"%T\", protoMsg)),\n\t\t\t)\n\t\t\tcontinue\n\t\t}\n\t\tgrpcErr.Details = append(grpcErr.Details, anyValue)\n\t\tswitch m := protoMsg.(type) {\n\t\tcase *errdetails.ErrorInfo:\n\t\t\tgrpcErr.ErrorInfo = append(grpcErr.ErrorInfo, m)\n\t\tcase *errdetails.RetryInfo:\n\t\t\tgrpcErr.RetryInfo = append(grpcErr.RetryInfo, m)\n\t\tcase *errdetails.DebugInfo:\n\t\t\tgrpcErr.DebugInfo = append(grpcErr.DebugInfo, m)\n\t\tcase *errdetails.QuotaFailure:\n\t\t\tgrpcErr.QuotaFailures = append(grpcErr.QuotaFailures, m)\n\t\tcase *errdetails.PreconditionFailure:\n\t\t\tgrpcErr.PreconditionFailures = append(grpcErr.PreconditionFailures, m)\n\t\tcase *errdetails.BadRequest:\n\t\t\tgrpcErr.BadRequests = append(grpcErr.BadRequests, m)\n\t\tcase *errdetails.RequestInfo:\n\t\t\tgrpcErr.RequestInfo = append(grpcErr.RequestInfo, m)\n\t\tcase *errdetails.ResourceInfo:\n\t\t\tgrpcErr.ResourceInfo = append(grpcErr.ResourceInfo, m)\n\t\tcase *errdetails.Help:\n\t\t\tgrpcErr.Helps = append(grpcErr.Helps, m)\n\t\tcase *errdetails.LocalizedMessage:\n\t\t\tgrpcErr.LocalizedMessages = append(grpcErr.LocalizedMessages, m)\n\t\tdefault:\n\t\t\tgrpcErr.CustomMessages = append(grpcErr.CustomMessages, anyValue)\n\t\t}\n\t}\n\treturn grpcErr\n}\n\ntype SetCELValueParam[T any] struct {\n\tValue      localValue\n\tExpr       string\n\tCacheIndex int\n\tSetter     func(T) error\n}\n\nfunc SetCELValue[T any](ctx context.Context, param *SetCELValueParam[T]) error {\n\tvar typ T\n\tout, err := EvalCEL(ctx, &EvalCELRequest{\n\t\tValue:      param.Value,\n\t\tExpr:       param.Expr,\n\t\tOutType:    reflect.TypeOf(typ),\n\t\tCacheIndex: param.CacheIndex,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tparam.Value.lock()\n\tdefer param.Value.unlock()\n\n\tif err := param.Setter(out.(T)); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// comparingNullResolver is a feature that allows to compare typed null and null value correctly.\n// It parses the expression and wraps the message with grpc.federation.cast.null_value if the message is compared to null.\ntype comparingNullResolver struct {\n\tcheckedExpr *exprpb.CheckedExpr\n\tlastID      int64\n\tresolved    bool\n}\n\nfunc newComparingNullResolver() *comparingNullResolver {\n\treturn &comparingNullResolver{}\n}\n\nfunc (r *comparingNullResolver) init(checkedExpr *exprpb.CheckedExpr) {\n\tvar lastID int64\n\tfor k := range checkedExpr.GetReferenceMap() {\n\t\tif lastID < k {\n\t\t\tlastID = k\n\t\t}\n\t}\n\tfor k := range checkedExpr.GetTypeMap() {\n\t\tif lastID < k {\n\t\t\tlastID = k\n\t\t}\n\t}\n\tr.checkedExpr = checkedExpr\n\tr.lastID = lastID\n\tr.resolved = false\n}\n\nfunc (r *comparingNullResolver) nextID() int64 {\n\tr.lastID++\n\treturn r.lastID\n}\n\nfunc (r *comparingNullResolver) Resolve(checkedExpr *exprpb.CheckedExpr) bool {\n\tr.init(checkedExpr)\n\tnewExprVisitor().Visit(checkedExpr.GetExpr(), func(e *exprpb.Expr) {\n\t\tswitch e.GetExprKind().(type) {\n\t\tcase *exprpb.Expr_CallExpr:\n\t\t\tr.resolveCallExpr(e)\n\t\t}\n\t})\n\treturn r.resolved\n}\n\nfunc (r *comparingNullResolver) resolveCallExpr(e *exprpb.Expr) {\n\ttarget := r.lookupComparingNullCallExpr(e)\n\tif target == nil {\n\t\treturn\n\t}\n\tnewID := r.nextID()\n\tnewExprKind := &exprpb.Expr_CallExpr{\n\t\tCallExpr: &exprpb.Expr_Call{\n\t\t\tFunction: grpcfedcel.CastNullValueFunc,\n\t\t\tArgs: []*exprpb.Expr{\n\t\t\t\t{\n\t\t\t\t\tId:       target.GetId(),\n\t\t\t\t\tExprKind: target.GetExprKind(),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\ttarget.Id = newID\n\ttarget.ExprKind = newExprKind\n\tr.checkedExpr.GetReferenceMap()[newID] = &exprpb.Reference{\n\t\tOverloadId: []string{grpcfedcel.CastNullValueFunc},\n\t}\n\tr.checkedExpr.GetTypeMap()[newID] = &exprpb.Type{\n\t\tTypeKind: &exprpb.Type_Dyn{},\n\t}\n\tr.resolved = true\n}\n\nfunc (r *comparingNullResolver) lookupComparingNullCallExpr(e *exprpb.Expr) *exprpb.Expr {\n\tcall := e.GetCallExpr()\n\tfnName := call.GetFunction()\n\tif fnName == operators.Equals || fnName == operators.NotEquals {\n\t\tlhs := call.GetArgs()[0]\n\t\trhs := call.GetArgs()[1]\n\t\tvar target *exprpb.Expr\n\t\tif _, ok := lhs.GetConstExpr().GetConstantKind().(*exprpb.Constant_NullValue); ok {\n\t\t\ttarget = rhs\n\t\t}\n\t\tif _, ok := rhs.GetConstExpr().GetConstantKind().(*exprpb.Constant_NullValue); ok {\n\t\t\tif target != nil {\n\t\t\t\t// maybe null == null\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\ttarget = lhs\n\t\t}\n\t\tif target == nil {\n\t\t\treturn nil\n\t\t}\n\t\tif target.GetCallExpr() != nil && target.GetCallExpr().GetFunction() == grpcfedcel.CastNullValueFunc {\n\t\t\treturn nil\n\t\t}\n\t\treturn target\n\t}\n\treturn nil\n}\n\ntype exprVisitor struct {\n\tcallback func(e *exprpb.Expr)\n}\n\nfunc newExprVisitor() *exprVisitor {\n\treturn &exprVisitor{}\n}\n\nfunc (v *exprVisitor) Visit(e *exprpb.Expr, cb func(e *exprpb.Expr)) {\n\tv.callback = cb\n\tv.visit(e)\n}\n\nfunc (v *exprVisitor) visit(e *exprpb.Expr) {\n\tif e == nil {\n\t\treturn\n\t}\n\tv.callback(e)\n\n\tswitch e.GetExprKind().(type) {\n\tcase *exprpb.Expr_SelectExpr:\n\t\tv.visitSelect(e)\n\tcase *exprpb.Expr_CallExpr:\n\t\tv.visitCall(e)\n\tcase *exprpb.Expr_ListExpr:\n\t\tv.visitList(e)\n\tcase *exprpb.Expr_StructExpr:\n\t\tv.visitStruct(e)\n\tcase *exprpb.Expr_ComprehensionExpr:\n\t\tv.visitComprehension(e)\n\t}\n}\n\nfunc (v *exprVisitor) visitSelect(e *exprpb.Expr) {\n\tsel := e.GetSelectExpr()\n\tv.visit(sel.GetOperand())\n}\n\nfunc (v *exprVisitor) visitCall(e *exprpb.Expr) {\n\tcall := e.GetCallExpr()\n\tfor _, arg := range call.GetArgs() {\n\t\tv.visit(arg)\n\t}\n\tv.visit(call.GetTarget())\n}\n\nfunc (v *exprVisitor) visitList(e *exprpb.Expr) {\n\tl := e.GetListExpr()\n\tfor _, elem := range l.GetElements() {\n\t\tv.visit(elem)\n\t}\n}\n\nfunc (v *exprVisitor) visitStruct(e *exprpb.Expr) {\n\tmsg := e.GetStructExpr()\n\tfor _, ent := range msg.GetEntries() {\n\t\tv.visit(ent.GetValue())\n\t}\n}\n\nfunc (v *exprVisitor) visitComprehension(e *exprpb.Expr) {\n\tcomp := e.GetComprehensionExpr()\n\tv.visit(comp.GetIterRange())\n\tv.visit(comp.GetAccuInit())\n\tv.visit(comp.GetLoopCondition())\n\tv.visit(comp.GetLoopStep())\n\tv.visit(comp.GetResult())\n}\n"
  },
  {
    "path": "grpc/federation/cel_plugin.go",
    "content": "package federation\n\nimport (\n\t\"encoding/json\"\n\n\t\"google.golang.org/protobuf/encoding/protojson\"\n\t\"google.golang.org/protobuf/proto\"\n\t\"google.golang.org/protobuf/types/known/anypb\"\n\n\tcelplugin \"github.com/mercari/grpc-federation/grpc/federation/cel/plugin\"\n)\n\ntype (\n\tCELPluginRequest  = celplugin.CELPluginRequest\n\tCELPluginResponse = celplugin.CELPluginResponse\n)\n\nfunc DecodeCELPluginRequest(v []byte) (*celplugin.CELPluginRequest, error) {\n\tvar req celplugin.CELPluginRequest\n\tif err := protojson.Unmarshal(v, &req); err != nil {\n\t\treturn nil, err\n\t}\n\treturn &req, nil\n}\n\nfunc EncodeCELPluginVersion(v CELPluginVersionSchema) ([]byte, error) {\n\treturn json.Marshal(v)\n}\n\nfunc EncodeCELPluginResponse(v *celplugin.CELPluginResponse) ([]byte, error) {\n\tencoded, err := protojson.Marshal(v)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn encoded, nil\n}\n\nfunc ToFloat32(v *celplugin.CELPluginValue) (float32, error) {\n\treturn float32(v.GetDouble()), nil\n}\n\nfunc ToFloat32List(v *celplugin.CELPluginValue) ([]float32, error) {\n\tret := make([]float32, 0, len(v.GetList().GetValues()))\n\tfor _, vv := range v.GetList().GetValues() {\n\t\tret = append(ret, float32(vv.GetDouble()))\n\t}\n\treturn ret, nil\n}\n\nfunc ToFloat64(v *celplugin.CELPluginValue) (float64, error) {\n\treturn v.GetDouble(), nil\n}\n\nfunc ToFloat64List(v *celplugin.CELPluginValue) ([]float64, error) {\n\tret := make([]float64, 0, len(v.GetList().GetValues()))\n\tfor _, vv := range v.GetList().GetValues() {\n\t\tret = append(ret, vv.GetDouble())\n\t}\n\treturn ret, nil\n}\n\nfunc ToInt32(v *celplugin.CELPluginValue) (int32, error) {\n\treturn int32(v.GetInt64()), nil //nolint:gosec\n}\n\nfunc ToInt32List(v *celplugin.CELPluginValue) ([]int32, error) {\n\tret := make([]int32, 0, len(v.GetList().GetValues()))\n\tfor _, vv := range v.GetList().GetValues() {\n\t\tret = append(ret, int32(vv.GetInt64())) //nolint:gosec\n\t}\n\treturn ret, nil\n}\n\nfunc ToInt64(v *celplugin.CELPluginValue) (int64, error) {\n\treturn v.GetInt64(), nil\n}\n\nfunc ToInt64List(v *celplugin.CELPluginValue) ([]int64, error) {\n\tret := make([]int64, 0, len(v.GetList().GetValues()))\n\tfor _, vv := range v.GetList().GetValues() {\n\t\tret = append(ret, vv.GetInt64())\n\t}\n\treturn ret, nil\n}\n\nfunc ToUint32(v *celplugin.CELPluginValue) (uint32, error) {\n\treturn uint32(v.GetUint64()), nil //nolint:gosec\n}\n\nfunc ToUint32List(v *celplugin.CELPluginValue) ([]uint32, error) {\n\tret := make([]uint32, 0, len(v.GetList().GetValues()))\n\tfor _, vv := range v.GetList().GetValues() {\n\t\tret = append(ret, uint32(vv.GetUint64())) //nolint:gosec\n\t}\n\treturn ret, nil\n}\n\nfunc ToUint64(v *celplugin.CELPluginValue) (uint64, error) {\n\treturn v.GetUint64(), nil\n}\n\nfunc ToUint64List(v *celplugin.CELPluginValue) ([]uint64, error) {\n\tret := make([]uint64, 0, len(v.GetList().GetValues()))\n\tfor _, vv := range v.GetList().GetValues() {\n\t\tret = append(ret, vv.GetUint64())\n\t}\n\treturn ret, nil\n}\n\nfunc ToString(v *celplugin.CELPluginValue) (string, error) {\n\treturn v.GetString_(), nil\n}\n\nfunc ToStringList(v *celplugin.CELPluginValue) ([]string, error) {\n\tret := make([]string, 0, len(v.GetList().GetValues()))\n\tfor _, vv := range v.GetList().GetValues() {\n\t\tret = append(ret, vv.GetString_())\n\t}\n\treturn ret, nil\n}\n\nfunc ToBytes(v *celplugin.CELPluginValue) ([]byte, error) {\n\treturn v.GetBytes(), nil\n}\n\nfunc ToBytesList(v *celplugin.CELPluginValue) ([][]byte, error) {\n\tret := make([][]byte, 0, len(v.GetList().GetValues()))\n\tfor _, vv := range v.GetList().GetValues() {\n\t\tret = append(ret, vv.GetBytes())\n\t}\n\treturn ret, nil\n}\n\nfunc ToBool(v *celplugin.CELPluginValue) (bool, error) {\n\treturn v.GetBool(), nil\n}\n\nfunc ToBoolList(v *celplugin.CELPluginValue) ([]bool, error) {\n\tret := make([]bool, 0, len(v.GetList().GetValues()))\n\tfor _, vv := range v.GetList().GetValues() {\n\t\tret = append(ret, vv.GetBool())\n\t}\n\treturn ret, nil\n}\n\nfunc ToEnum[T ~int32](v *celplugin.CELPluginValue) (T, error) {\n\treturn T(v.GetInt64()), nil\n}\n\nfunc ToEnumList[T ~int32](v *celplugin.CELPluginValue) ([]T, error) {\n\tret := make([]T, 0, len(v.GetList().GetValues()))\n\tfor _, vv := range v.GetList().GetValues() {\n\t\tret = append(ret, T(vv.GetInt64()))\n\t}\n\treturn ret, nil\n}\n\nfunc ToMessage[T proto.Message](v *celplugin.CELPluginValue) (T, error) {\n\tmsg, err := v.GetMessage().UnmarshalNew()\n\tif err != nil {\n\t\tvar ret T\n\t\treturn ret, err\n\t}\n\treturn msg.(T), nil\n}\n\nfunc ToMessageList[T proto.Message](v *celplugin.CELPluginValue) ([]T, error) {\n\tret := make([]T, 0, len(v.GetList().GetValues()))\n\tfor _, vv := range v.GetList().GetValues() {\n\t\tmsg, err := vv.GetMessage().UnmarshalNew()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret = append(ret, msg.(T))\n\t}\n\treturn ret, nil\n}\n\nfunc ToErrorCELPluginResponse(v error) *celplugin.CELPluginResponse {\n\treturn &celplugin.CELPluginResponse{Error: v.Error()}\n}\n\nfunc ToMessageCELPluginResponse[T proto.Message](v T) (*celplugin.CELPluginResponse, error) {\n\tvalue, err := toMessageCELPluginValue(v)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &celplugin.CELPluginResponse{Value: value}, nil\n}\n\nfunc ToMessageListCELPluginResponse[T proto.Message](v []T) (*celplugin.CELPluginResponse, error) {\n\tret := make([]*celplugin.CELPluginValue, 0, len(v))\n\tfor _, vv := range v {\n\t\tvalue, err := toMessageCELPluginValue(vv)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret = append(ret, value)\n\t}\n\treturn toListResponse(ret), nil\n}\n\nfunc toMessageCELPluginValue[T proto.Message](v T) (*celplugin.CELPluginValue, error) {\n\tanyValue, err := anypb.New(v)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &celplugin.CELPluginValue{Value: &celplugin.CELPluginValue_Message{Message: anyValue}}, nil\n}\n\nfunc ToStringCELPluginResponse(v string) (*celplugin.CELPluginResponse, error) {\n\treturn &celplugin.CELPluginResponse{Value: toStringCELPluginValue(v)}, nil\n}\n\nfunc ToStringListCELPluginResponse(v []string) (*celplugin.CELPluginResponse, error) {\n\tret := make([]*celplugin.CELPluginValue, 0, len(v))\n\tfor _, vv := range v {\n\t\tret = append(ret, toStringCELPluginValue(vv))\n\t}\n\treturn toListResponse(ret), nil\n}\n\nfunc toStringCELPluginValue(v string) *celplugin.CELPluginValue {\n\treturn &celplugin.CELPluginValue{Value: &celplugin.CELPluginValue_String_{String_: v}}\n}\n\nfunc ToBytesCELPluginResponse(v []byte) (*celplugin.CELPluginResponse, error) {\n\treturn &celplugin.CELPluginResponse{Value: toBytesCELPluginValue(v)}, nil\n}\n\nfunc ToBytesListCELPluginResponse(v [][]byte) (*celplugin.CELPluginResponse, error) {\n\tret := make([]*celplugin.CELPluginValue, 0, len(v))\n\tfor _, vv := range v {\n\t\tret = append(ret, toBytesCELPluginValue(vv))\n\t}\n\treturn toListResponse(ret), nil\n}\n\nfunc toBytesCELPluginValue(v []byte) *celplugin.CELPluginValue {\n\treturn &celplugin.CELPluginValue{Value: &celplugin.CELPluginValue_Bytes{Bytes: v}}\n}\n\nfunc ToInt32CELPluginResponse(v int32) (*celplugin.CELPluginResponse, error) {\n\treturn ToInt64CELPluginResponse(int64(v))\n}\n\nfunc ToInt32ListCELPluginResponse(v []int32) (*celplugin.CELPluginResponse, error) {\n\ti64 := make([]int64, 0, len(v))\n\tfor _, vv := range v {\n\t\ti64 = append(i64, int64(vv))\n\t}\n\treturn ToInt64ListCELPluginResponse(i64)\n}\n\nfunc ToInt64CELPluginResponse(v int64) (*celplugin.CELPluginResponse, error) {\n\treturn &celplugin.CELPluginResponse{Value: toInt64CELPluginValue(v)}, nil\n}\n\nfunc ToInt64ListCELPluginResponse(v []int64) (*celplugin.CELPluginResponse, error) {\n\tret := make([]*celplugin.CELPluginValue, 0, len(v))\n\tfor _, vv := range v {\n\t\tret = append(ret, toInt64CELPluginValue(vv))\n\t}\n\treturn toListResponse(ret), nil\n}\n\nfunc toInt64CELPluginValue(v int64) *celplugin.CELPluginValue {\n\treturn &celplugin.CELPluginValue{Value: &celplugin.CELPluginValue_Int64{Int64: v}}\n}\n\nfunc ToUint32CELPluginResponse(v uint32) (*celplugin.CELPluginResponse, error) {\n\treturn ToUint64CELPluginResponse(uint64(v))\n}\n\nfunc ToUint32ListCELPluginResponse(v []uint32) (*celplugin.CELPluginResponse, error) {\n\tu64 := make([]uint64, 0, len(v))\n\tfor _, vv := range v {\n\t\tu64 = append(u64, uint64(vv))\n\t}\n\treturn ToUint64ListCELPluginResponse(u64)\n}\n\nfunc ToUint64CELPluginResponse(v uint64) (*celplugin.CELPluginResponse, error) {\n\treturn &celplugin.CELPluginResponse{Value: toUint64CELPluginValue(v)}, nil\n}\n\nfunc ToUint64ListCELPluginResponse(v []uint64) (*celplugin.CELPluginResponse, error) {\n\tret := make([]*celplugin.CELPluginValue, 0, len(v))\n\tfor _, vv := range v {\n\t\tret = append(ret, toUint64CELPluginValue(vv))\n\t}\n\treturn toListResponse(ret), nil\n}\n\nfunc toUint64CELPluginValue(v uint64) *celplugin.CELPluginValue {\n\treturn &celplugin.CELPluginValue{Value: &celplugin.CELPluginValue_Uint64{Uint64: v}}\n}\n\nfunc ToFloat32CELPluginResponse(v float32) (*celplugin.CELPluginResponse, error) {\n\treturn ToFloat64CELPluginResponse(float64(v))\n}\n\nfunc ToFloat32ListCELPluginResponse(v []float32) (*celplugin.CELPluginResponse, error) {\n\tf64 := make([]float64, 0, len(v))\n\tfor _, vv := range v {\n\t\tf64 = append(f64, float64(vv))\n\t}\n\treturn ToFloat64ListCELPluginResponse(f64)\n}\n\nfunc ToFloat64CELPluginResponse(v float64) (*celplugin.CELPluginResponse, error) {\n\treturn &celplugin.CELPluginResponse{Value: toFloat64CELPluginValue(v)}, nil\n}\n\nfunc ToFloat64ListCELPluginResponse(v []float64) (*celplugin.CELPluginResponse, error) {\n\tret := make([]*celplugin.CELPluginValue, 0, len(v))\n\tfor _, vv := range v {\n\t\tret = append(ret, toFloat64CELPluginValue(vv))\n\t}\n\treturn toListResponse(ret), nil\n}\n\nfunc toFloat64CELPluginValue(v float64) *celplugin.CELPluginValue {\n\treturn &celplugin.CELPluginValue{Value: &celplugin.CELPluginValue_Double{Double: v}}\n}\n\nfunc ToBoolCELPluginResponse(v bool) (*celplugin.CELPluginResponse, error) {\n\treturn &celplugin.CELPluginResponse{Value: toBoolCELPluginValue(v)}, nil\n}\n\nfunc ToBoolListCELPluginResponse(v []bool) (*celplugin.CELPluginResponse, error) {\n\tret := make([]*celplugin.CELPluginValue, 0, len(v))\n\tfor _, vv := range v {\n\t\tret = append(ret, toBoolCELPluginValue(vv))\n\t}\n\treturn toListResponse(ret), nil\n}\n\nfunc toBoolCELPluginValue(v bool) *celplugin.CELPluginValue {\n\treturn &celplugin.CELPluginValue{Value: &celplugin.CELPluginValue_Bool{Bool: v}}\n}\n\nfunc toListResponse(v []*celplugin.CELPluginValue) *celplugin.CELPluginResponse {\n\treturn &celplugin.CELPluginResponse{\n\t\tValue: &celplugin.CELPluginValue{\n\t\t\tValue: &celplugin.CELPluginValue_List{List: &celplugin.CELPluginListValue{Values: v}},\n\t\t},\n\t}\n}\n"
  },
  {
    "path": "grpc/federation/const.go",
    "content": "package federation\n\nimport (\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n)\n\nconst (\n\tPrivatePackageName          = \"grpc.federation.private\"\n\tMessageArgumentVariableName = \"__ARG__\"\n\tContextVariableName         = grpcfedcel.ContextVariableName\n\tContextTypeName             = grpcfedcel.ContextTypeName\n)\n"
  },
  {
    "path": "grpc/federation/context.go",
    "content": "package federation\n\nimport (\n\t\"context\"\n\t\"log/slog\"\n\n\toteltrace \"go.opentelemetry.io/otel/trace\"\n\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"github.com/mercari/grpc-federation/grpc/federation/log\"\n\t\"github.com/mercari/grpc-federation/grpc/federation/trace\"\n)\n\ntype (\n\tcelCacheMapKey    struct{}\n\tgrpcErrorValueKey struct{}\n\tlocalValueKey     struct{}\n)\n\nfunc WithLogger(ctx context.Context, logger *slog.Logger, attrs ...slog.Attr) context.Context {\n\treturn log.WithLogger(ctx, logger, attrs...)\n}\n\nfunc Logger(ctx context.Context) *slog.Logger {\n\treturn log.Logger(ctx)\n}\n\nfunc WithTracer(ctx context.Context, tracer oteltrace.Tracer) context.Context {\n\treturn trace.WithTracer(ctx, tracer)\n}\n\nfunc Tracer(ctx context.Context) oteltrace.Tracer {\n\treturn trace.Tracer(ctx)\n}\n\nfunc LogAttrs(ctx context.Context) []slog.Attr {\n\treturn log.Attrs(ctx)\n}\n\nfunc SetLogger(ctx context.Context, logger *slog.Logger) {\n\tlog.SetLogger(ctx, logger)\n}\n\nfunc WithCELCacheMap(ctx context.Context, celCacheMap *CELCacheMap) context.Context {\n\treturn context.WithValue(ctx, celCacheMapKey{}, celCacheMap)\n}\n\nfunc getCELCacheMap(ctx context.Context) *CELCacheMap {\n\tvalue := ctx.Value(celCacheMapKey{})\n\tif value == nil {\n\t\treturn nil\n\t}\n\treturn value.(*CELCacheMap)\n}\n\nfunc WithGRPCError(ctx context.Context, err *grpcfedcel.Error) context.Context {\n\treturn context.WithValue(ctx, grpcErrorValueKey{}, err)\n}\n\nfunc getGRPCErrorValue(ctx context.Context) *grpcfedcel.Error {\n\tvalue := ctx.Value(grpcErrorValueKey{})\n\tif value == nil {\n\t\treturn nil\n\t}\n\treturn value.(*grpcfedcel.Error)\n}\n\nfunc WithLocalValue(ctx context.Context, v *LocalValue) context.Context {\n\treturn context.WithValue(ctx, localValueKey{}, v)\n}\n\nfunc localValueFromContext(ctx context.Context) *LocalValue {\n\tvalue := ctx.Value(localValueKey{})\n\tif value == nil {\n\t\treturn nil\n\t}\n\treturn value.(*LocalValue)\n}\n"
  },
  {
    "path": "grpc/federation/custom_resolver.go",
    "content": "package federation\n\nimport \"context\"\n\ntype CustomResolverInitializer interface {\n\tInit(ctx context.Context) error\n}\n"
  },
  {
    "path": "grpc/federation/error.go",
    "content": "package federation\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"runtime/debug\"\n\t\"strings\"\n\n\t\"golang.org/x/sync/errgroup\"\n\tgrpcstatus \"google.golang.org/grpc/status\"\n)\n\n// ErrorHandler Federation Service often needs to convert errors received from downstream services.\n// If an error occurs during method execution in the Federation Service, this error handler is called and the returned error is treated as a final error.\ntype ErrorHandler func(ctx context.Context, methodName string, err error) error\n\n// RecoveredError represents recovered error.\ntype RecoveredError struct {\n\tMessage string\n\tStack   []string\n}\n\nfunc (e *RecoveredError) Error() string {\n\treturn fmt.Sprintf(\"recovered error: %s\", e.Message)\n}\n\nfunc GoWithRecover(eg *errgroup.Group, fn func() (any, error)) {\n\teg.Go(func() (e error) {\n\t\tdefer func() {\n\t\t\tif r := recover(); r != nil {\n\t\t\t\te = RecoverError(r, debug.Stack())\n\t\t\t}\n\t\t}()\n\t\t_, err := fn()\n\t\treturn err\n\t})\n}\n\ntype ErrorWithLogAttrs struct {\n\terr   error\n\tlevel slog.Level\n\tattrs []slog.Attr\n}\n\nfunc (e *ErrorWithLogAttrs) Error() string {\n\treturn e.err.Error()\n}\n\nfunc (e *ErrorWithLogAttrs) Unwrap() error {\n\treturn e.err\n}\n\nfunc (e *ErrorWithLogAttrs) GRPCStatus() *grpcstatus.Status {\n\treturn grpcstatus.Convert(e.err)\n}\n\nfunc NewErrorWithLogAttrs(err error, level slog.Level, attrs []slog.Attr) error {\n\tif err == nil {\n\t\treturn nil\n\t}\n\treturn &ErrorWithLogAttrs{\n\t\terr:   err,\n\t\tlevel: level,\n\t\tattrs: attrs,\n\t}\n}\n\nfunc OutputErrorLog(ctx context.Context, err error) {\n\tif err == nil {\n\t\treturn\n\t}\n\tlogger := Logger(ctx)\n\n\tlogLevel := slog.LevelError\n\tvar logArgs []slog.Attr\n\tvar errWithAttrs *ErrorWithLogAttrs\n\tif errors.As(err, &errWithAttrs) {\n\t\tlogLevel = errWithAttrs.level\n\t\tlogArgs = errWithAttrs.attrs\n\t}\n\tif status, ok := grpcstatus.FromError(err); ok {\n\t\tlogArgs = append(logArgs, slog.Group(\"grpc_status\",\n\t\t\tslog.String(\"code\", status.Code().String()),\n\t\t\tslog.Any(\"details\", status.Details()),\n\t\t))\n\t\tlogger.LogAttrs(ctx, logLevel, status.Message(), logArgs...)\n\t\treturn\n\t}\n\tvar recoveredErr *RecoveredError\n\tif errors.As(err, &recoveredErr) {\n\t\ttrace := make([]interface{}, 0, len(recoveredErr.Stack))\n\t\tfor idx, stack := range recoveredErr.Stack {\n\t\t\ttrace = append(trace, slog.String(fmt.Sprint(idx+1), stack))\n\t\t}\n\t\tlogger.ErrorContext(ctx, recoveredErr.Message, slog.Group(\"stack_trace\", trace...))\n\t\treturn\n\t}\n\tlogger.ErrorContext(ctx, err.Error())\n}\n\nfunc RecoverError(v interface{}, rawStack []byte) *RecoveredError {\n\tmsg := fmt.Sprint(v)\n\tmsgLines := strings.Split(msg, \"\\n\")\n\tif len(msgLines) <= 1 {\n\t\tlines := strings.Split(string(rawStack), \"\\n\")\n\t\tstack := make([]string, 0, len(lines))\n\t\tfor _, line := range lines {\n\t\t\tif line == \"\" {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tstack = append(stack, strings.TrimPrefix(line, \"\\t\"))\n\t\t}\n\t\treturn &RecoveredError{\n\t\t\tMessage: msg,\n\t\t\tStack:   stack,\n\t\t}\n\t}\n\t// If panic occurs under singleflight, singleflight's recover catches the error and gives a stack trace.\n\t// Therefore, once the stack trace is removed.\n\tstack := make([]string, 0, len(msgLines))\n\tfor _, line := range msgLines[1:] {\n\t\tif line == \"\" {\n\t\t\tcontinue\n\t\t}\n\t\tstack = append(stack, strings.TrimPrefix(line, \"\\t\"))\n\t}\n\treturn &RecoveredError{\n\t\tMessage: msgLines[0],\n\t\tStack:   stack,\n\t}\n}\n\nvar (\n\tErrClientConfig           = errors.New(\"grpc-federation: Client field is not set. this field must be set\")\n\tErrResolverConfig         = errors.New(\"grpc-federation: Resolver field is not set. this field must be set\")\n\tErrCELPluginConfig        = errors.New(\"grpc-federation: CELPlugin field is not set. this field must be set\")\n\tErrCELCacheMap            = errors.New(\"grpc-federation: CELCacheMap is not found\")\n\tErrCELCacheIndex          = errors.New(\"grpc-federation: CELCacheIndex is not set\")\n\tErrOverflowTypeConversion = errors.New(\"grpc-federation: overflow type conversion was detected\")\n)\n"
  },
  {
    "path": "grpc/federation/federation.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: grpc/federation/federation.proto\n\npackage federation\n\nimport (\n\t_ \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\tcode \"google.golang.org/genproto/googleapis/rpc/code\"\n\terrdetails \"google.golang.org/genproto/googleapis/rpc/errdetails\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tdescriptorpb \"google.golang.org/protobuf/types/descriptorpb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// TypeKind is primitive kind list.\ntype TypeKind int32\n\nconst (\n\t// UNKNOWN represents unexpected value.\n\tTypeKind_UNKNOWN TypeKind = 0\n\t// STRING is used to convert the input value to `string` type.\n\tTypeKind_STRING TypeKind = 1\n\t// BOOL is used to convert the input value to `bool` type.\n\tTypeKind_BOOL TypeKind = 2\n\t// INT64 is used to convert the input value to `int64` type.\n\tTypeKind_INT64 TypeKind = 3\n\t// UINT64 is used to convert the input value to `uint64` type.\n\tTypeKind_UINT64 TypeKind = 4\n\t// DOUBLE is used to convert the input value to `double` type.\n\tTypeKind_DOUBLE TypeKind = 5\n\t// DURATION is used to convert the input value to the `google.protobuf.Duration` type.\n\tTypeKind_DURATION TypeKind = 6\n)\n\n// Enum value maps for TypeKind.\nvar (\n\tTypeKind_name = map[int32]string{\n\t\t0: \"UNKNOWN\",\n\t\t1: \"STRING\",\n\t\t2: \"BOOL\",\n\t\t3: \"INT64\",\n\t\t4: \"UINT64\",\n\t\t5: \"DOUBLE\",\n\t\t6: \"DURATION\",\n\t}\n\tTypeKind_value = map[string]int32{\n\t\t\"UNKNOWN\":  0,\n\t\t\"STRING\":   1,\n\t\t\"BOOL\":     2,\n\t\t\"INT64\":    3,\n\t\t\"UINT64\":   4,\n\t\t\"DOUBLE\":   5,\n\t\t\"DURATION\": 6,\n\t}\n)\n\nfunc (x TypeKind) Enum() *TypeKind {\n\tp := new(TypeKind)\n\t*p = x\n\treturn p\n}\n\nfunc (x TypeKind) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (TypeKind) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_grpc_federation_federation_proto_enumTypes[0].Descriptor()\n}\n\nfunc (TypeKind) Type() protoreflect.EnumType {\n\treturn &file_grpc_federation_federation_proto_enumTypes[0]\n}\n\nfunc (x TypeKind) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use TypeKind.Descriptor instead.\nfunc (TypeKind) EnumDescriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\n// LogLevel is the importance or severity of a log event.\ntype GRPCError_LogLevel int32\n\nconst (\n\t// UNKNOWN represents unexpected value.\n\tGRPCError_UNKNOWN GRPCError_LogLevel = 0\n\t// DEBUG is used for detailed information that is useful during development and debugging.\n\tGRPCError_DEBUG GRPCError_LogLevel = 1\n\t// INFO logs are used to provide information about the normal functioning of the application.\n\tGRPCError_INFO GRPCError_LogLevel = 2\n\t// WARN signifies a potential problem or warning that does not necessarily stop the program from working but may lead to issues in the future.\n\tGRPCError_WARN GRPCError_LogLevel = 3\n\t// ERROR indicates a serious issue that has caused a failure in the application.\n\tGRPCError_ERROR GRPCError_LogLevel = 4\n)\n\n// Enum value maps for GRPCError_LogLevel.\nvar (\n\tGRPCError_LogLevel_name = map[int32]string{\n\t\t0: \"UNKNOWN\",\n\t\t1: \"DEBUG\",\n\t\t2: \"INFO\",\n\t\t3: \"WARN\",\n\t\t4: \"ERROR\",\n\t}\n\tGRPCError_LogLevel_value = map[string]int32{\n\t\t\"UNKNOWN\": 0,\n\t\t\"DEBUG\":   1,\n\t\t\"INFO\":    2,\n\t\t\"WARN\":    3,\n\t\t\"ERROR\":   4,\n\t}\n)\n\nfunc (x GRPCError_LogLevel) Enum() *GRPCError_LogLevel {\n\tp := new(GRPCError_LogLevel)\n\t*p = x\n\treturn p\n}\n\nfunc (x GRPCError_LogLevel) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (GRPCError_LogLevel) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_grpc_federation_federation_proto_enumTypes[1].Descriptor()\n}\n\nfunc (GRPCError_LogLevel) Type() protoreflect.EnumType {\n\treturn &file_grpc_federation_federation_proto_enumTypes[1]\n}\n\nfunc (x GRPCError_LogLevel) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use GRPCError_LogLevel.Descriptor instead.\nfunc (GRPCError_LogLevel) EnumDescriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{24, 0}\n}\n\ntype FileRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPlugin *CELPlugin `protobuf:\"bytes,1,opt,name=plugin,proto3\" json:\"plugin,omitempty\"`\n\t// import can be used to resolve methods, messages, etc. that are referenced in gRPC Federation rules.\n\tImport []string `protobuf:\"bytes,2,rep,name=import,proto3\" json:\"import,omitempty\"`\n}\n\nfunc (x *FileRule) Reset() {\n\t*x = FileRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *FileRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*FileRule) ProtoMessage() {}\n\nfunc (x *FileRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use FileRule.ProtoReflect.Descriptor instead.\nfunc (*FileRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *FileRule) GetPlugin() *CELPlugin {\n\tif x != nil {\n\t\treturn x.Plugin\n\t}\n\treturn nil\n}\n\nfunc (x *FileRule) GetImport() []string {\n\tif x != nil {\n\t\treturn x.Import\n\t}\n\treturn nil\n}\n\ntype EnumRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// alias mapping between enums defined in other packages and enums defined on the federation service side.\n\t// The alias is the FQDN ( <package-name>.<enum-name> ) to the enum.\n\t// If this definition exists, type conversion is automatically performed before the enum value assignment operation.\n\t// If a enum with this option has a value that is not present in the enum specified by alias, and the alias option is not specified for that value, an error is occurred.\n\t// You can specify multiple aliases. In that case, only values common to all aliases will be considered.\n\t// Specifying a value that is not included in either alias will result in an error.\n\tAlias []string `protobuf:\"bytes,1,rep,name=alias,proto3\" json:\"alias,omitempty\"`\n}\n\nfunc (x *EnumRule) Reset() {\n\t*x = EnumRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumRule) ProtoMessage() {}\n\nfunc (x *EnumRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumRule.ProtoReflect.Descriptor instead.\nfunc (*EnumRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *EnumRule) GetAlias() []string {\n\tif x != nil {\n\t\treturn x.Alias\n\t}\n\treturn nil\n}\n\ntype EnumValueRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// specifies the default value of the enum.\n\t// All values other than those specified in alias will be default values.\n\tDefault *bool `protobuf:\"varint,1,opt,name=default,proto3,oneof\" json:\"default,omitempty\"`\n\t// alias can be used when alias is specified in grpc.federation.enum option,\n\t// and specifies the value name to be referenced among the enums specified in alias of enum option.\n\t// multiple value names can be specified for alias.\n\tAlias []string `protobuf:\"bytes,2,rep,name=alias,proto3\" json:\"alias,omitempty\"`\n\t// attr is used to hold multiple name-value pairs corresponding to an enum value.\n\t// The values specified by the name must be consistently specified for all enum values.\n\t// The values stored using this feature can be retrieved using the `attr()` method of the enum API.\n\tAttr []*EnumValueAttribute `protobuf:\"bytes,3,rep,name=attr,proto3\" json:\"attr,omitempty\"`\n\t// noalias exclude from the target of alias.\n\t// This option cannot be specified simultaneously with `default` or `alias`.\n\tNoalias *bool `protobuf:\"varint,4,opt,name=noalias,proto3,oneof\" json:\"noalias,omitempty\"`\n}\n\nfunc (x *EnumValueRule) Reset() {\n\t*x = EnumValueRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumValueRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumValueRule) ProtoMessage() {}\n\nfunc (x *EnumValueRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumValueRule.ProtoReflect.Descriptor instead.\nfunc (*EnumValueRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *EnumValueRule) GetDefault() bool {\n\tif x != nil && x.Default != nil {\n\t\treturn *x.Default\n\t}\n\treturn false\n}\n\nfunc (x *EnumValueRule) GetAlias() []string {\n\tif x != nil {\n\t\treturn x.Alias\n\t}\n\treturn nil\n}\n\nfunc (x *EnumValueRule) GetAttr() []*EnumValueAttribute {\n\tif x != nil {\n\t\treturn x.Attr\n\t}\n\treturn nil\n}\n\nfunc (x *EnumValueRule) GetNoalias() bool {\n\tif x != nil && x.Noalias != nil {\n\t\treturn *x.Noalias\n\t}\n\treturn false\n}\n\ntype EnumValueAttribute struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the attribute key.\n\t// This value is used to search for values using the `attr(<name>)` method.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// value represents the value corresponding to `name`.\n\tValue string `protobuf:\"bytes,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *EnumValueAttribute) Reset() {\n\t*x = EnumValueAttribute{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumValueAttribute) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumValueAttribute) ProtoMessage() {}\n\nfunc (x *EnumValueAttribute) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumValueAttribute.ProtoReflect.Descriptor instead.\nfunc (*EnumValueAttribute) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *EnumValueAttribute) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnumValueAttribute) GetValue() string {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn \"\"\n}\n\ntype OneofRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *OneofRule) Reset() {\n\t*x = OneofRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *OneofRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*OneofRule) ProtoMessage() {}\n\nfunc (x *OneofRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use OneofRule.ProtoReflect.Descriptor instead.\nfunc (*OneofRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{4}\n}\n\n// ServiceRule define gRPC Federation rules for the service.\ntype ServiceRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// env defines the environment variable.\n\tEnv *Env `protobuf:\"bytes,1,opt,name=env,proto3\" json:\"env,omitempty\"`\n\t// var defines the service-level variables.\n\tVar []*ServiceVariable `protobuf:\"bytes,2,rep,name=var,proto3\" json:\"var,omitempty\"`\n}\n\nfunc (x *ServiceRule) Reset() {\n\t*x = ServiceRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceRule) ProtoMessage() {}\n\nfunc (x *ServiceRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceRule.ProtoReflect.Descriptor instead.\nfunc (*ServiceRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *ServiceRule) GetEnv() *Env {\n\tif x != nil {\n\t\treturn x.Env\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceRule) GetVar() []*ServiceVariable {\n\tif x != nil {\n\t\treturn x.Var\n\t}\n\treturn nil\n}\n\n// Env is used when setting environment variables.\n// There are two ways to configure it.\ntype Env struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// var is used to directly list environment variables.\n\tVar []*EnvVar `protobuf:\"bytes,1,rep,name=var,proto3\" json:\"var,omitempty\"`\n\t// message is used to reference an already defined Protocol Buffers' message for defining environment variables.\n\t// If you want to set detailed options for the fields of the message, use the `env` option in FieldRule.\n\tMessage string `protobuf:\"bytes,2,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *Env) Reset() {\n\t*x = Env{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Env) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Env) ProtoMessage() {}\n\nfunc (x *Env) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Env.ProtoReflect.Descriptor instead.\nfunc (*Env) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *Env) GetVar() []*EnvVar {\n\tif x != nil {\n\t\treturn x.Var\n\t}\n\treturn nil\n}\n\nfunc (x *Env) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\n// ServiceVariable define variables at the service level.\n// This definition is executed at server startup, after the initialization of Env.\n// The defined variables can be used across all messages that the service depends on.\ntype ServiceVariable struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is a variable name.\n\t// This name can be referenced in all CELs related to the service by using `grpc.federation.var.` prefix.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// if specify the condition for evaluating expr.\n\t// this value evaluated by CEL and it must return a boolean value.\n\t// If the result of evaluation is `false`, the value assigned to name is the default value of the result of evaluation of `expr`.\n\tIf *string `protobuf:\"bytes,2,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n\t// expr specify the value to be assigned to name.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*ServiceVariable_By\n\t//\t*ServiceVariable_Map\n\t//\t*ServiceVariable_Message\n\t//\t*ServiceVariable_Validation\n\t//\t*ServiceVariable_Enum\n\t//\t*ServiceVariable_Switch\n\tExpr isServiceVariable_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *ServiceVariable) Reset() {\n\t*x = ServiceVariable{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceVariable) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceVariable) ProtoMessage() {}\n\nfunc (x *ServiceVariable) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceVariable.ProtoReflect.Descriptor instead.\nfunc (*ServiceVariable) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{7}\n}\n\nfunc (x *ServiceVariable) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *ServiceVariable) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\nfunc (m *ServiceVariable) GetExpr() isServiceVariable_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetBy() string {\n\tif x, ok := x.GetExpr().(*ServiceVariable_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *ServiceVariable) GetMap() *MapExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetMessage() *MessageExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetValidation() *ServiceVariableValidationExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Validation); ok {\n\t\treturn x.Validation\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetEnum() *EnumExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetSwitch() *SwitchExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariable_Switch); ok {\n\t\treturn x.Switch\n\t}\n\treturn nil\n}\n\ntype isServiceVariable_Expr interface {\n\tisServiceVariable_Expr()\n}\n\ntype ServiceVariable_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\ntype ServiceVariable_Map struct {\n\t// map apply map operation for the specified repeated type.\n\tMap *MapExpr `protobuf:\"bytes,12,opt,name=map,proto3,oneof\"`\n}\n\ntype ServiceVariable_Message struct {\n\t// message gets with message arguments.\n\tMessage *MessageExpr `protobuf:\"bytes,13,opt,name=message,proto3,oneof\"`\n}\n\ntype ServiceVariable_Validation struct {\n\t// validation defines the validation rule and message.\n\tValidation *ServiceVariableValidationExpr `protobuf:\"bytes,14,opt,name=validation,proto3,oneof\"`\n}\n\ntype ServiceVariable_Enum struct {\n\t// enum gets with cel value.\n\tEnum *EnumExpr `protobuf:\"bytes,15,opt,name=enum,proto3,oneof\"`\n}\n\ntype ServiceVariable_Switch struct {\n\t// switch provides conditional evaluation with multiple branches.\n\tSwitch *SwitchExpr `protobuf:\"bytes,16,opt,name=switch,proto3,oneof\"`\n}\n\nfunc (*ServiceVariable_By) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Map) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Message) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Validation) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Enum) isServiceVariable_Expr() {}\n\nfunc (*ServiceVariable_Switch) isServiceVariable_Expr() {}\n\n// ServiceVariableValidationExpr represents validation rule and error message.\ntype ServiceVariableValidationExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// if specifies condition in CEL. If the condition is true, it returns error.\n\t// The return value must always be of type boolean.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3\" json:\"if,omitempty\"`\n\t// message is a error message in CEL.\n\tMessage string `protobuf:\"bytes,2,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *ServiceVariableValidationExpr) Reset() {\n\t*x = ServiceVariableValidationExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceVariableValidationExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceVariableValidationExpr) ProtoMessage() {}\n\nfunc (x *ServiceVariableValidationExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceVariableValidationExpr.ProtoReflect.Descriptor instead.\nfunc (*ServiceVariableValidationExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{8}\n}\n\nfunc (x *ServiceVariableValidationExpr) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *ServiceVariableValidationExpr) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\n// EnvVar represents an environment variable.\ntype EnvVar struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is an environment variable name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// type is an environment variable type.\n\tType *EnvType `protobuf:\"bytes,2,opt,name=type,proto3\" json:\"type,omitempty\"`\n\t// option is an additional option for parsing environment variable.\n\tOption *EnvVarOption `protobuf:\"bytes,3,opt,name=option,proto3,oneof\" json:\"option,omitempty\"`\n}\n\nfunc (x *EnvVar) Reset() {\n\t*x = EnvVar{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvVar) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvVar) ProtoMessage() {}\n\nfunc (x *EnvVar) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvVar.ProtoReflect.Descriptor instead.\nfunc (*EnvVar) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{9}\n}\n\nfunc (x *EnvVar) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnvVar) GetType() *EnvType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nfunc (x *EnvVar) GetOption() *EnvVarOption {\n\tif x != nil {\n\t\treturn x.Option\n\t}\n\treturn nil\n}\n\n// EnvType represents type information for environment variable.\ntype EnvType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to Type:\n\t//\n\t//\t*EnvType_Kind\n\t//\t*EnvType_Repeated\n\t//\t*EnvType_Map\n\tType isEnvType_Type `protobuf_oneof:\"type\"`\n}\n\nfunc (x *EnvType) Reset() {\n\t*x = EnvType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[10]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvType) ProtoMessage() {}\n\nfunc (x *EnvType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[10]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvType.ProtoReflect.Descriptor instead.\nfunc (*EnvType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{10}\n}\n\nfunc (m *EnvType) GetType() isEnvType_Type {\n\tif m != nil {\n\t\treturn m.Type\n\t}\n\treturn nil\n}\n\nfunc (x *EnvType) GetKind() TypeKind {\n\tif x, ok := x.GetType().(*EnvType_Kind); ok {\n\t\treturn x.Kind\n\t}\n\treturn TypeKind_UNKNOWN\n}\n\nfunc (x *EnvType) GetRepeated() *EnvType {\n\tif x, ok := x.GetType().(*EnvType_Repeated); ok {\n\t\treturn x.Repeated\n\t}\n\treturn nil\n}\n\nfunc (x *EnvType) GetMap() *EnvMapType {\n\tif x, ok := x.GetType().(*EnvType_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\ntype isEnvType_Type interface {\n\tisEnvType_Type()\n}\n\ntype EnvType_Kind struct {\n\t// kind is used when the type is a primitive type.\n\tKind TypeKind `protobuf:\"varint,1,opt,name=kind,proto3,enum=grpc.federation.TypeKind,oneof\"`\n}\n\ntype EnvType_Repeated struct {\n\t// repeated is used when the type is a repeated type.\n\tRepeated *EnvType `protobuf:\"bytes,2,opt,name=repeated,proto3,oneof\"`\n}\n\ntype EnvType_Map struct {\n\t// map is used when the type is a map type.\n\tMap *EnvMapType `protobuf:\"bytes,3,opt,name=map,proto3,oneof\"`\n}\n\nfunc (*EnvType_Kind) isEnvType_Type() {}\n\nfunc (*EnvType_Repeated) isEnvType_Type() {}\n\nfunc (*EnvType_Map) isEnvType_Type() {}\n\n// EnvMapType represents map type.\ntype EnvMapType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// key represents map's key type.\n\tKey *EnvType `protobuf:\"bytes,1,opt,name=key,proto3\" json:\"key,omitempty\"`\n\t// value represents map's value type.\n\tValue *EnvType `protobuf:\"bytes,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *EnvMapType) Reset() {\n\t*x = EnvMapType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[11]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvMapType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvMapType) ProtoMessage() {}\n\nfunc (x *EnvMapType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[11]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvMapType.ProtoReflect.Descriptor instead.\nfunc (*EnvMapType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{11}\n}\n\nfunc (x *EnvMapType) GetKey() *EnvType {\n\tif x != nil {\n\t\treturn x.Key\n\t}\n\treturn nil\n}\n\nfunc (x *EnvMapType) GetValue() *EnvType {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn nil\n}\n\n// EnvVarOption represents additional option for environment variable.\n// The option work with the `envconfig` library in Go language.\n// For detailed specifications, please refer to the library's documentation ( https://pkg.go.dev/github.com/kelseyhightower/envconfig#section-readme ).\ntype EnvVarOption struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// alternate use this option if you want to use an environment variable with a different name than the value specified in `EnvVar.name`.\n\tAlternate *string `protobuf:\"bytes,1,opt,name=alternate,proto3,oneof\" json:\"alternate,omitempty\"`\n\t// default specify the value to use as a fallback if the specified environment variable is not found.\n\tDefault *string `protobuf:\"bytes,2,opt,name=default,proto3,oneof\" json:\"default,omitempty\"`\n\t// required require the environment variable to exist.\n\t// If it does not exist, an error will occur at startup.\n\tRequired *bool `protobuf:\"varint,3,opt,name=required,proto3,oneof\" json:\"required,omitempty\"`\n\t// ignored if ignored is true, it does nothing even if the environment variable exists.\n\tIgnored *bool `protobuf:\"varint,4,opt,name=ignored,proto3,oneof\" json:\"ignored,omitempty\"`\n}\n\nfunc (x *EnvVarOption) Reset() {\n\t*x = EnvVarOption{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[12]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvVarOption) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvVarOption) ProtoMessage() {}\n\nfunc (x *EnvVarOption) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[12]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvVarOption.ProtoReflect.Descriptor instead.\nfunc (*EnvVarOption) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{12}\n}\n\nfunc (x *EnvVarOption) GetAlternate() string {\n\tif x != nil && x.Alternate != nil {\n\t\treturn *x.Alternate\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnvVarOption) GetDefault() string {\n\tif x != nil && x.Default != nil {\n\t\treturn *x.Default\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnvVarOption) GetRequired() bool {\n\tif x != nil && x.Required != nil {\n\t\treturn *x.Required\n\t}\n\treturn false\n}\n\nfunc (x *EnvVarOption) GetIgnored() bool {\n\tif x != nil && x.Ignored != nil {\n\t\treturn *x.Ignored\n\t}\n\treturn false\n}\n\ntype MethodRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// the time to timeout. If the specified time period elapses, DEADLINE_EXCEEDED status is returned.\n\t// If you want to handle this error, you need to implement a custom error handler in Go.\n\t// The format is the same as Go's time.Duration format. See https://pkg.go.dev/time#ParseDuration.\n\tTimeout *string `protobuf:\"bytes,1,opt,name=timeout,proto3,oneof\" json:\"timeout,omitempty\"`\n\t// response specify the name of the message you want to use to create the response value.\n\t// If you specify a reserved type like `google.protobuf.Empty` as the response, you cannot define gRPC Federation options.\n\t// In such cases, you can specify a separate message to create the response value.\n\t// The specified response message must contain fields with the same names and types as all the fields in the original response.\n\tResponse *string `protobuf:\"bytes,2,opt,name=response,proto3,oneof\" json:\"response,omitempty\"`\n}\n\nfunc (x *MethodRule) Reset() {\n\t*x = MethodRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[13]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MethodRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MethodRule) ProtoMessage() {}\n\nfunc (x *MethodRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[13]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MethodRule.ProtoReflect.Descriptor instead.\nfunc (*MethodRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{13}\n}\n\nfunc (x *MethodRule) GetTimeout() string {\n\tif x != nil && x.Timeout != nil {\n\t\treturn *x.Timeout\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodRule) GetResponse() string {\n\tif x != nil && x.Response != nil {\n\t\treturn *x.Response\n\t}\n\treturn \"\"\n}\n\n// MessageRule define gRPC Federation rules for the message.\ntype MessageRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// def specify variables to be used in field binding by `grpc.federation.field` option.\n\tDef []*VariableDefinition `protobuf:\"bytes,1,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// if custom_resolver is true, the resolver for this message is implemented by Go.\n\t// If there are any values retrieved by resolver or messages, they are passed as arguments for custom resolver.\n\t// Each field of the message returned by the custom resolver is automatically bound.\n\t// If you want to change the binding process for a particular field, set `custom_resolver=true` option for that field.\n\tCustomResolver *bool `protobuf:\"varint,2,opt,name=custom_resolver,json=customResolver,proto3,oneof\" json:\"custom_resolver,omitempty\"`\n\t// alias mapping between messages defined in other packages and messages defined on the federation service side.\n\t// The alias is the FQDN ( <package-name>.<message-name> ) to the message.\n\t// If this definition exists, type conversion is automatically performed before the field assignment operation.\n\t// If a message with this option has a field that is not present in the message specified by alias, and the alias option is not specified for that field, an error is occurred.\n\t// You can specify multiple aliases. In that case, only fields common to all aliases will be considered.\n\t// Specifying a field that is not included in either alias will result in an error.\n\tAlias []string `protobuf:\"bytes,3,rep,name=alias,proto3\" json:\"alias,omitempty\"`\n}\n\nfunc (x *MessageRule) Reset() {\n\t*x = MessageRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[14]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MessageRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MessageRule) ProtoMessage() {}\n\nfunc (x *MessageRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[14]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MessageRule.ProtoReflect.Descriptor instead.\nfunc (*MessageRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{14}\n}\n\nfunc (x *MessageRule) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *MessageRule) GetCustomResolver() bool {\n\tif x != nil && x.CustomResolver != nil {\n\t\treturn *x.CustomResolver\n\t}\n\treturn false\n}\n\nfunc (x *MessageRule) GetAlias() []string {\n\tif x != nil {\n\t\treturn x.Alias\n\t}\n\treturn nil\n}\n\n// VariableDefinition represents variable definition.\ntype VariableDefinition struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is a variable name.\n\t// This name can be referenced in all CELs defined after itself in the same message.\n\t// It can also be referenced in `grpc.federation.field` option.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// if specify the condition for evaluating expr.\n\t// this value evaluated by CEL and it must return a boolean value.\n\t// If the result of evaluation is `false`, the value assigned to name is the default value of the result of evaluation of `expr`.\n\tIf *string `protobuf:\"bytes,2,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n\t// autobind if the result value of `expr` is a message type,\n\t// the value of a field with the same name and type as the field name of its own message is automatically assigned to the value of the field in the message.\n\t// If multiple autobinds are used at the same message,\n\t// you must explicitly use the `grpc.federation.field` option to do the binding yourself, since duplicate field names cannot be correctly determined as one.\n\tAutobind *bool `protobuf:\"varint,3,opt,name=autobind,proto3,oneof\" json:\"autobind,omitempty\"`\n\t// expr specify the value to be assigned to name.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*VariableDefinition_By\n\t//\t*VariableDefinition_Map\n\t//\t*VariableDefinition_Message\n\t//\t*VariableDefinition_Call\n\t//\t*VariableDefinition_Validation\n\t//\t*VariableDefinition_Enum\n\t//\t*VariableDefinition_Switch\n\tExpr isVariableDefinition_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *VariableDefinition) Reset() {\n\t*x = VariableDefinition{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[15]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *VariableDefinition) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*VariableDefinition) ProtoMessage() {}\n\nfunc (x *VariableDefinition) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[15]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use VariableDefinition.ProtoReflect.Descriptor instead.\nfunc (*VariableDefinition) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{15}\n}\n\nfunc (x *VariableDefinition) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *VariableDefinition) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *VariableDefinition) GetAutobind() bool {\n\tif x != nil && x.Autobind != nil {\n\t\treturn *x.Autobind\n\t}\n\treturn false\n}\n\nfunc (m *VariableDefinition) GetExpr() isVariableDefinition_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetBy() string {\n\tif x, ok := x.GetExpr().(*VariableDefinition_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *VariableDefinition) GetMap() *MapExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetMessage() *MessageExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetCall() *CallExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Call); ok {\n\t\treturn x.Call\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetValidation() *ValidationExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Validation); ok {\n\t\treturn x.Validation\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetEnum() *EnumExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetSwitch() *SwitchExpr {\n\tif x, ok := x.GetExpr().(*VariableDefinition_Switch); ok {\n\t\treturn x.Switch\n\t}\n\treturn nil\n}\n\ntype isVariableDefinition_Expr interface {\n\tisVariableDefinition_Expr()\n}\n\ntype VariableDefinition_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\ntype VariableDefinition_Map struct {\n\t// map apply map operation for the specified repeated type.\n\tMap *MapExpr `protobuf:\"bytes,12,opt,name=map,proto3,oneof\"`\n}\n\ntype VariableDefinition_Message struct {\n\t// message gets with message arguments.\n\tMessage *MessageExpr `protobuf:\"bytes,13,opt,name=message,proto3,oneof\"`\n}\n\ntype VariableDefinition_Call struct {\n\t// call specifies how to call gRPC method.\n\tCall *CallExpr `protobuf:\"bytes,14,opt,name=call,proto3,oneof\"`\n}\n\ntype VariableDefinition_Validation struct {\n\t// validation defines the validation rule and error.\n\tValidation *ValidationExpr `protobuf:\"bytes,15,opt,name=validation,proto3,oneof\"`\n}\n\ntype VariableDefinition_Enum struct {\n\t// enum gets with cel value.\n\tEnum *EnumExpr `protobuf:\"bytes,16,opt,name=enum,proto3,oneof\"`\n}\n\ntype VariableDefinition_Switch struct {\n\t// switch provides conditional evaluation with multiple branches.\n\tSwitch *SwitchExpr `protobuf:\"bytes,17,opt,name=switch,proto3,oneof\"`\n}\n\nfunc (*VariableDefinition_By) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Map) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Message) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Call) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Validation) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Enum) isVariableDefinition_Expr() {}\n\nfunc (*VariableDefinition_Switch) isVariableDefinition_Expr() {}\n\n// MapExpr apply map operation for the specified repeated type.\ntype MapExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// iterator define iterator variable.\n\t// When evaluating CEL in `expr`, we can refer to the name defined in iterator.\n\tIterator *Iterator `protobuf:\"bytes,1,opt,name=iterator,proto3\" json:\"iterator,omitempty\"`\n\t// expr creates map elements using iterator variable.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*MapExpr_By\n\t//\t*MapExpr_Message\n\t//\t*MapExpr_Enum\n\tExpr isMapExpr_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *MapExpr) Reset() {\n\t*x = MapExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[16]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MapExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MapExpr) ProtoMessage() {}\n\nfunc (x *MapExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[16]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MapExpr.ProtoReflect.Descriptor instead.\nfunc (*MapExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{16}\n}\n\nfunc (x *MapExpr) GetIterator() *Iterator {\n\tif x != nil {\n\t\treturn x.Iterator\n\t}\n\treturn nil\n}\n\nfunc (m *MapExpr) GetExpr() isMapExpr_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *MapExpr) GetBy() string {\n\tif x, ok := x.GetExpr().(*MapExpr_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *MapExpr) GetMessage() *MessageExpr {\n\tif x, ok := x.GetExpr().(*MapExpr_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *MapExpr) GetEnum() *EnumExpr {\n\tif x, ok := x.GetExpr().(*MapExpr_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn nil\n}\n\ntype isMapExpr_Expr interface {\n\tisMapExpr_Expr()\n}\n\ntype MapExpr_By struct {\n\t// `by` evaluates with CEL.\n\t// this can refer to the variable declared by `iterator`.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\ntype MapExpr_Message struct {\n\t// message gets with message arguments, and it is made an element of the map.\n\t// The result type of MapExpr is the repeated type of the specified message.\n\tMessage *MessageExpr `protobuf:\"bytes,12,opt,name=message,proto3,oneof\"`\n}\n\ntype MapExpr_Enum struct {\n\t// enum creates enum value for each element of the map.\n\t// The result type of MapExpr is the repeated type of the specified enum.\n\tEnum *EnumExpr `protobuf:\"bytes,13,opt,name=enum,proto3,oneof\"`\n}\n\nfunc (*MapExpr_By) isMapExpr_Expr() {}\n\nfunc (*MapExpr_Message) isMapExpr_Expr() {}\n\nfunc (*MapExpr_Enum) isMapExpr_Expr() {}\n\n// Iterator represents iterator variable.\ntype Iterator struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// variable name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// src the value that will be the source for creating the iterator.\n\t// src must be a repeated type.\n\tSrc string `protobuf:\"bytes,2,opt,name=src,proto3\" json:\"src,omitempty\"`\n}\n\nfunc (x *Iterator) Reset() {\n\t*x = Iterator{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[17]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Iterator) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Iterator) ProtoMessage() {}\n\nfunc (x *Iterator) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[17]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Iterator.ProtoReflect.Descriptor instead.\nfunc (*Iterator) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{17}\n}\n\nfunc (x *Iterator) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Iterator) GetSrc() string {\n\tif x != nil {\n\t\treturn x.Src\n\t}\n\treturn \"\"\n}\n\n// MessageExpr represents dependent message.\ntype MessageExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name specify the message name by FQDN. format is `<package-name>.<message-name>`.\n\t// <package-name> can be omitted when referring to messages in the same package.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// args specify the parameters needed to get the message. This is called the \"message arguments\".\n\tArgs []*Argument `protobuf:\"bytes,2,rep,name=args,proto3\" json:\"args,omitempty\"`\n}\n\nfunc (x *MessageExpr) Reset() {\n\t*x = MessageExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[18]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MessageExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MessageExpr) ProtoMessage() {}\n\nfunc (x *MessageExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[18]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MessageExpr.ProtoReflect.Descriptor instead.\nfunc (*MessageExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{18}\n}\n\nfunc (x *MessageExpr) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *MessageExpr) GetArgs() []*Argument {\n\tif x != nil {\n\t\treturn x.Args\n\t}\n\treturn nil\n}\n\n// EnumExpr represents dependent enum.\ntype EnumExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name specify the enum name by FQDN. format is `<package-name>.<enum-name>`.\n\t// <package-name> can be omitted when referring to enum in the same package.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,2,opt,name=by,proto3\" json:\"by,omitempty\"`\n}\n\nfunc (x *EnumExpr) Reset() {\n\t*x = EnumExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[19]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumExpr) ProtoMessage() {}\n\nfunc (x *EnumExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[19]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumExpr.ProtoReflect.Descriptor instead.\nfunc (*EnumExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{19}\n}\n\nfunc (x *EnumExpr) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnumExpr) GetBy() string {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\n// CallExpr represents how to call gRPC method.\ntype CallExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// method specify the FQDN for the gRPC method. format is `<package-name>.<service-name>/<method-name>`.\n\tMethod string `protobuf:\"bytes,1,opt,name=method,proto3\" json:\"method,omitempty\"`\n\t// request specify request parameters for the gRPC method.\n\tRequest []*MethodRequest `protobuf:\"bytes,2,rep,name=request,proto3\" json:\"request,omitempty\"`\n\t// the time to timeout. If the specified time period elapses, DEADLINE_EXCEEDED status is returned.\n\t// If you want to handle this error, you need to implement a custom error handler in Go.\n\t// The format is the same as Go's time.Duration format. See https://pkg.go.dev/time#ParseDuration.\n\tTimeout *string `protobuf:\"bytes,3,opt,name=timeout,proto3,oneof\" json:\"timeout,omitempty\"`\n\t// retry specifies the retry policy if the method call fails.\n\tRetry *RetryPolicy `protobuf:\"bytes,4,opt,name=retry,proto3,oneof\" json:\"retry,omitempty\"`\n\t// error evaluated when an error occurs during a method call.\n\t// Multiple errors can be defined and are evaluated in the order in which they are described.\n\t// If an error occurs while creating an gRPC status error, original error will be returned.\n\tError []*GRPCError `protobuf:\"bytes,5,rep,name=error,proto3\" json:\"error,omitempty\"`\n\t// option is the gRPC's call option (https://pkg.go.dev/google.golang.org/grpc#CallOption).\n\tOption *GRPCCallOption `protobuf:\"bytes,6,opt,name=option,proto3,oneof\" json:\"option,omitempty\"`\n\t// metadata specify outgoing metadata with CEL value.\n\t// The specified type must always be of type map<string, repeated string>.\n\tMetadata *string `protobuf:\"bytes,7,opt,name=metadata,proto3,oneof\" json:\"metadata,omitempty\"`\n}\n\nfunc (x *CallExpr) Reset() {\n\t*x = CallExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[20]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CallExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CallExpr) ProtoMessage() {}\n\nfunc (x *CallExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[20]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CallExpr.ProtoReflect.Descriptor instead.\nfunc (*CallExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{20}\n}\n\nfunc (x *CallExpr) GetMethod() string {\n\tif x != nil {\n\t\treturn x.Method\n\t}\n\treturn \"\"\n}\n\nfunc (x *CallExpr) GetRequest() []*MethodRequest {\n\tif x != nil {\n\t\treturn x.Request\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetTimeout() string {\n\tif x != nil && x.Timeout != nil {\n\t\treturn *x.Timeout\n\t}\n\treturn \"\"\n}\n\nfunc (x *CallExpr) GetRetry() *RetryPolicy {\n\tif x != nil {\n\t\treturn x.Retry\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetError() []*GRPCError {\n\tif x != nil {\n\t\treturn x.Error\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetOption() *GRPCCallOption {\n\tif x != nil {\n\t\treturn x.Option\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetMetadata() string {\n\tif x != nil && x.Metadata != nil {\n\t\treturn *x.Metadata\n\t}\n\treturn \"\"\n}\n\n// SwitchExpr represents a switch statement. At least one \"case\", and \"default\", must be defined. All\n// case.if expressions must evaluate to a boolean value. All case.by expressions, and default.by, must\n// evaluate to the same type (the return type of the switch).\n//\n// When executed, the case.if expressions are evaluated in order, and, for the first case whose\n// case.if expression evaluates to true, its case.by is evaluated to make the return value of the\n// SwitchExpr.\n// If no case.if evaluates to true, default.by is evaluated to make the return value.\ntype SwitchExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Cases for the switch expression.\n\tCase []*SwitchCaseExpr `protobuf:\"bytes,1,rep,name=case,proto3\" json:\"case,omitempty\"`\n\t// The default case, if none of the \"case.if\" expressions evaluate to true.\n\tDefault *SwitchDefaultExpr `protobuf:\"bytes,2,opt,name=default,proto3\" json:\"default,omitempty\"`\n}\n\nfunc (x *SwitchExpr) Reset() {\n\t*x = SwitchExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[21]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SwitchExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SwitchExpr) ProtoMessage() {}\n\nfunc (x *SwitchExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[21]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SwitchExpr.ProtoReflect.Descriptor instead.\nfunc (*SwitchExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{21}\n}\n\nfunc (x *SwitchExpr) GetCase() []*SwitchCaseExpr {\n\tif x != nil {\n\t\treturn x.Case\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchExpr) GetDefault() *SwitchDefaultExpr {\n\tif x != nil {\n\t\treturn x.Default\n\t}\n\treturn nil\n}\n\n// SwitchCaseExpr represents a single case for a switch expression.\ntype SwitchCaseExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// if specify the condition for evaluating expr.\n\t// this value evaluated by CEL and it must return a boolean value.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3\" json:\"if,omitempty\"`\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,2,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// expr specify the value to return for the case.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*SwitchCaseExpr_By\n\tExpr isSwitchCaseExpr_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *SwitchCaseExpr) Reset() {\n\t*x = SwitchCaseExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[22]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SwitchCaseExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SwitchCaseExpr) ProtoMessage() {}\n\nfunc (x *SwitchCaseExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[22]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SwitchCaseExpr.ProtoReflect.Descriptor instead.\nfunc (*SwitchCaseExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{22}\n}\n\nfunc (x *SwitchCaseExpr) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *SwitchCaseExpr) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (m *SwitchCaseExpr) GetExpr() isSwitchCaseExpr_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchCaseExpr) GetBy() string {\n\tif x, ok := x.GetExpr().(*SwitchCaseExpr_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\ntype isSwitchCaseExpr_Expr interface {\n\tisSwitchCaseExpr_Expr()\n}\n\ntype SwitchCaseExpr_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\nfunc (*SwitchCaseExpr_By) isSwitchCaseExpr_Expr() {}\n\n// SwitchDefaultExpr represents the default case for a switch expression.\ntype SwitchDefaultExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,1,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// expr specify the value to return for the default case.\n\t//\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*SwitchDefaultExpr_By\n\tExpr isSwitchDefaultExpr_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *SwitchDefaultExpr) Reset() {\n\t*x = SwitchDefaultExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[23]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SwitchDefaultExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SwitchDefaultExpr) ProtoMessage() {}\n\nfunc (x *SwitchDefaultExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[23]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SwitchDefaultExpr.ProtoReflect.Descriptor instead.\nfunc (*SwitchDefaultExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{23}\n}\n\nfunc (x *SwitchDefaultExpr) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (m *SwitchDefaultExpr) GetExpr() isSwitchDefaultExpr_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchDefaultExpr) GetBy() string {\n\tif x, ok := x.GetExpr().(*SwitchDefaultExpr_By); ok {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\ntype isSwitchDefaultExpr_Expr interface {\n\tisSwitchDefaultExpr_Expr()\n}\n\ntype SwitchDefaultExpr_By struct {\n\t// `by` evaluates with CEL.\n\tBy string `protobuf:\"bytes,11,opt,name=by,proto3,oneof\"`\n}\n\nfunc (*SwitchDefaultExpr_By) isSwitchDefaultExpr_Expr() {}\n\n// GRPCError create gRPC status value.\ntype GRPCError struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,1,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// if specifies condition in CEL. If the condition is true, it returns defined error information.\n\t// If this field is omitted, it is always treated as 'true' and returns defined error information.\n\t// The return value must always be of type boolean.\n\tIf *string `protobuf:\"bytes,2,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n\t// code is a gRPC status code.\n\tCode *code.Code `protobuf:\"varint,3,opt,name=code,proto3,enum=google.rpc.Code,oneof\" json:\"code,omitempty\"`\n\t// message is a gRPC status message.\n\t// If omitted, the message will be auto-generated from the configurations.\n\tMessage *string `protobuf:\"bytes,4,opt,name=message,proto3,oneof\" json:\"message,omitempty\"`\n\t// details is a list of error details.\n\t// If returns error, the corresponding error details are set.\n\tDetails []*GRPCErrorDetail `protobuf:\"bytes,5,rep,name=details,proto3\" json:\"details,omitempty\"`\n\t// ignore ignore the error if the condition in the \"if\" field is true and \"ignore\" field is set to true.\n\t// When an error is ignored, the returned response is always null value.\n\t// If you want to return a response that is not null, please use `ignore_and_response` feature.\n\t// Therefore, `ignore` and `ignore_and_response` cannot be specified same.\n\tIgnore *bool `protobuf:\"varint,6,opt,name=ignore,proto3,oneof\" json:\"ignore,omitempty\"`\n\t// ignore_and_response ignore the error if the condition in the \"if\" field is true and it returns response specified in CEL.\n\t// The evaluation value of CEL must always be the same as the response message type.\n\t// `ignore` and `ignore_and_response` cannot be specified same.\n\tIgnoreAndResponse *string `protobuf:\"bytes,7,opt,name=ignore_and_response,json=ignoreAndResponse,proto3,oneof\" json:\"ignore_and_response,omitempty\"`\n\t// log_level can be configured to output logs as any log level.\n\t// If DEBUG is specified for the log_level, logs are output as debug logs.\n\t// default value is ERROR.\n\tLogLevel *GRPCError_LogLevel `protobuf:\"varint,8,opt,name=log_level,json=logLevel,proto3,enum=grpc.federation.GRPCError_LogLevel,oneof\" json:\"log_level,omitempty\"`\n}\n\nfunc (x *GRPCError) Reset() {\n\t*x = GRPCError{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[24]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GRPCError) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GRPCError) ProtoMessage() {}\n\nfunc (x *GRPCError) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[24]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GRPCError.ProtoReflect.Descriptor instead.\nfunc (*GRPCError) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{24}\n}\n\nfunc (x *GRPCError) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCError) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCError) GetCode() code.Code {\n\tif x != nil && x.Code != nil {\n\t\treturn *x.Code\n\t}\n\treturn code.Code(0)\n}\n\nfunc (x *GRPCError) GetMessage() string {\n\tif x != nil && x.Message != nil {\n\t\treturn *x.Message\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCError) GetDetails() []*GRPCErrorDetail {\n\tif x != nil {\n\t\treturn x.Details\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCError) GetIgnore() bool {\n\tif x != nil && x.Ignore != nil {\n\t\treturn *x.Ignore\n\t}\n\treturn false\n}\n\nfunc (x *GRPCError) GetIgnoreAndResponse() string {\n\tif x != nil && x.IgnoreAndResponse != nil {\n\t\treturn *x.IgnoreAndResponse\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCError) GetLogLevel() GRPCError_LogLevel {\n\tif x != nil && x.LogLevel != nil {\n\t\treturn *x.LogLevel\n\t}\n\treturn GRPCError_UNKNOWN\n}\n\ntype GRPCErrorDetail struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// if specifies condition rule in CEL. If the condition is true, gRPC error detail is added to the error.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3\" json:\"if,omitempty\"`\n\t// def define variables in current scope.\n\tDef []*VariableDefinition `protobuf:\"bytes,2,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// message represents arbitrary messages to describe the detail of the error.\n\tMessage []*MessageExpr `protobuf:\"bytes,3,rep,name=message,proto3\" json:\"message,omitempty\"`\n\t// error_info describes the cause of the error with structured details.\n\tErrorInfo []*errdetails.ErrorInfo `protobuf:\"bytes,4,rep,name=error_info,json=errorInfo,proto3\" json:\"error_info,omitempty\"`\n\t// retry_info describes when the clients can retry a failed request.\n\tRetryInfo []*errdetails.RetryInfo `protobuf:\"bytes,5,rep,name=retry_info,json=retryInfo,proto3\" json:\"retry_info,omitempty\"`\n\t// debug_info describes additional debugging info.\n\tDebugInfo []*errdetails.DebugInfo `protobuf:\"bytes,6,rep,name=debug_info,json=debugInfo,proto3\" json:\"debug_info,omitempty\"`\n\t// quota_failure describes how a quota check failed.\n\tQuotaFailure []*errdetails.QuotaFailure `protobuf:\"bytes,7,rep,name=quota_failure,json=quotaFailure,proto3\" json:\"quota_failure,omitempty\"`\n\t// precondition_failure describes what preconditions have failed.\n\tPreconditionFailure []*errdetails.PreconditionFailure `protobuf:\"bytes,8,rep,name=precondition_failure,json=preconditionFailure,proto3\" json:\"precondition_failure,omitempty\"`\n\t// bad_request describes violations in a client request.\n\tBadRequest []*errdetails.BadRequest `protobuf:\"bytes,9,rep,name=bad_request,json=badRequest,proto3\" json:\"bad_request,omitempty\"`\n\t// request_info contains metadata about the request that clients can attach.\n\tRequestInfo []*errdetails.RequestInfo `protobuf:\"bytes,10,rep,name=request_info,json=requestInfo,proto3\" json:\"request_info,omitempty\"`\n\t// resource_info describes the resource that is being accessed.\n\tResourceInfo []*errdetails.ResourceInfo `protobuf:\"bytes,11,rep,name=resource_info,json=resourceInfo,proto3\" json:\"resource_info,omitempty\"`\n\t// help provides links to documentation or for performing an out of band action.\n\tHelp []*errdetails.Help `protobuf:\"bytes,12,rep,name=help,proto3\" json:\"help,omitempty\"`\n\t// localized_message provides a localized error message that is safe to return to the user.\n\tLocalizedMessage []*errdetails.LocalizedMessage `protobuf:\"bytes,13,rep,name=localized_message,json=localizedMessage,proto3\" json:\"localized_message,omitempty\"`\n\t// by specify a message in CEL to express the details of the error.\n\tBy []string `protobuf:\"bytes,14,rep,name=by,proto3\" json:\"by,omitempty\"`\n}\n\nfunc (x *GRPCErrorDetail) Reset() {\n\t*x = GRPCErrorDetail{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[25]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GRPCErrorDetail) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GRPCErrorDetail) ProtoMessage() {}\n\nfunc (x *GRPCErrorDetail) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[25]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GRPCErrorDetail.ProtoReflect.Descriptor instead.\nfunc (*GRPCErrorDetail) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{25}\n}\n\nfunc (x *GRPCErrorDetail) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCErrorDetail) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetMessage() []*MessageExpr {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetErrorInfo() []*errdetails.ErrorInfo {\n\tif x != nil {\n\t\treturn x.ErrorInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetRetryInfo() []*errdetails.RetryInfo {\n\tif x != nil {\n\t\treturn x.RetryInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetDebugInfo() []*errdetails.DebugInfo {\n\tif x != nil {\n\t\treturn x.DebugInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetQuotaFailure() []*errdetails.QuotaFailure {\n\tif x != nil {\n\t\treturn x.QuotaFailure\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetPreconditionFailure() []*errdetails.PreconditionFailure {\n\tif x != nil {\n\t\treturn x.PreconditionFailure\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetBadRequest() []*errdetails.BadRequest {\n\tif x != nil {\n\t\treturn x.BadRequest\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetRequestInfo() []*errdetails.RequestInfo {\n\tif x != nil {\n\t\treturn x.RequestInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetResourceInfo() []*errdetails.ResourceInfo {\n\tif x != nil {\n\t\treturn x.ResourceInfo\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetHelp() []*errdetails.Help {\n\tif x != nil {\n\t\treturn x.Help\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetLocalizedMessage() []*errdetails.LocalizedMessage {\n\tif x != nil {\n\t\treturn x.LocalizedMessage\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetBy() []string {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn nil\n}\n\n// GRPCCallOption configures a gRPC Call before it starts or extracts information from a gRPC Call after it completes.\ntype GRPCCallOption struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// set the content-subtype. For example, if content-subtype is \"json\", the Content-Type over the wire will be \"application/grpc+json\".\n\t// The content-subtype is converted to lowercase before being included in Content-Type.\n\t// See Content-Type on https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests for more details.\n\t// If no such codec is found, the call will result in an error with code INTERNAL.\n\tContentSubtype *string `protobuf:\"bytes,1,opt,name=content_subtype,json=contentSubtype,proto3,oneof\" json:\"content_subtype,omitempty\"`\n\t// header retrieves the header metadata for a unary RPC.\n\t// In order to obtain the metadata, you must specify a variable of type map<string, repeated string> in the header.\n\t// e.g.)\n\t// def [\n\t//\n\t//\t{ name: \"hdr\" by: \"grpc.federation.metadata.new()\" }\n\t//\t{ call { method: \"pkg.Method\" option { header: \"hdr\" } } }\n\t//\n\t// ]\n\tHeader *string `protobuf:\"bytes,2,opt,name=header,proto3,oneof\" json:\"header,omitempty\"`\n\t// max_call_recv_msg_size sets the maximum message size in bytes the client can receive.\n\t// If this is not set, gRPC uses the default 4MB.\n\tMaxCallRecvMsgSize *int64 `protobuf:\"varint,3,opt,name=max_call_recv_msg_size,json=maxCallRecvMsgSize,proto3,oneof\" json:\"max_call_recv_msg_size,omitempty\"`\n\t// max_call_send_msg_size sets the maximum message size in bytes the client can send.\n\t// If this is not set, gRPC uses the default maximum number of int32 range.\n\tMaxCallSendMsgSize *int64 `protobuf:\"varint,4,opt,name=max_call_send_msg_size,json=maxCallSendMsgSize,proto3,oneof\" json:\"max_call_send_msg_size,omitempty\"`\n\t// static_method specifies that a call is being made to a method that is static,\n\t// which means the method is known at compile time and doesn't change at runtime.\n\t// This can be used as a signal to stats plugins that this method is safe to include as a key to a measurement.\n\tStaticMethod *bool `protobuf:\"varint,5,opt,name=static_method,json=staticMethod,proto3,oneof\" json:\"static_method,omitempty\"`\n\t// trailer retrieves the trailer metadata for a unary RPC.\n\t// In order to obtain the metadata, you must specify a variable of type map<string, repeated string> in the trailer.\n\t// e.g.)\n\t// def [\n\t//\n\t//\t{ name: \"trl\" by: \"grpc.federation.metadata.new()\" }\n\t//\t{ call { method: \"pkg.Method\" option { trailer: \"trl\" } } }\n\t//\n\t// ]\n\tTrailer *string `protobuf:\"bytes,6,opt,name=trailer,proto3,oneof\" json:\"trailer,omitempty\"`\n\t// wait_for_ready configures the RPC's behavior when the client is in TRANSIENT_FAILURE,\n\t// which occurs when all addresses fail to connect.\n\t// If wait_for_ready is false, the RPC will fail immediately.\n\t// Otherwise, the client will wait until a connection becomes available or the RPC's deadline is reached.\n\t// By default, RPCs do not \"wait for ready\".\n\tWaitForReady *bool `protobuf:\"varint,7,opt,name=wait_for_ready,json=waitForReady,proto3,oneof\" json:\"wait_for_ready,omitempty\"`\n}\n\nfunc (x *GRPCCallOption) Reset() {\n\t*x = GRPCCallOption{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[26]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GRPCCallOption) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GRPCCallOption) ProtoMessage() {}\n\nfunc (x *GRPCCallOption) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[26]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GRPCCallOption.ProtoReflect.Descriptor instead.\nfunc (*GRPCCallOption) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{26}\n}\n\nfunc (x *GRPCCallOption) GetContentSubtype() string {\n\tif x != nil && x.ContentSubtype != nil {\n\t\treturn *x.ContentSubtype\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCCallOption) GetHeader() string {\n\tif x != nil && x.Header != nil {\n\t\treturn *x.Header\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCCallOption) GetMaxCallRecvMsgSize() int64 {\n\tif x != nil && x.MaxCallRecvMsgSize != nil {\n\t\treturn *x.MaxCallRecvMsgSize\n\t}\n\treturn 0\n}\n\nfunc (x *GRPCCallOption) GetMaxCallSendMsgSize() int64 {\n\tif x != nil && x.MaxCallSendMsgSize != nil {\n\t\treturn *x.MaxCallSendMsgSize\n\t}\n\treturn 0\n}\n\nfunc (x *GRPCCallOption) GetStaticMethod() bool {\n\tif x != nil && x.StaticMethod != nil {\n\t\treturn *x.StaticMethod\n\t}\n\treturn false\n}\n\nfunc (x *GRPCCallOption) GetTrailer() string {\n\tif x != nil && x.Trailer != nil {\n\t\treturn *x.Trailer\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCCallOption) GetWaitForReady() bool {\n\tif x != nil && x.WaitForReady != nil {\n\t\treturn *x.WaitForReady\n\t}\n\treturn false\n}\n\n// Validation represents a validation rule against variables defined within the current scope.\ntype ValidationExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is a unique name for the validation.\n\t// If set, the validation error type will be <message-name><name>Error.\n\t// If omitted, the validation error type will be ValidationError.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// error defines the actual validation rules and an error to returned if the validation fails.\n\tError *GRPCError `protobuf:\"bytes,2,opt,name=error,proto3\" json:\"error,omitempty\"`\n}\n\nfunc (x *ValidationExpr) Reset() {\n\t*x = ValidationExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[27]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ValidationExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ValidationExpr) ProtoMessage() {}\n\nfunc (x *ValidationExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[27]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ValidationExpr.ProtoReflect.Descriptor instead.\nfunc (*ValidationExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{27}\n}\n\nfunc (x *ValidationExpr) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *ValidationExpr) GetError() *GRPCError {\n\tif x != nil {\n\t\treturn x.Error\n\t}\n\treturn nil\n}\n\n// RetryPolicy define the retry policy if the method call fails.\ntype RetryPolicy struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to Policy:\n\t//\n\t//\t*RetryPolicy_Constant\n\t//\t*RetryPolicy_Exponential\n\tPolicy isRetryPolicy_Policy `protobuf_oneof:\"policy\"`\n\t// if specifies condition in CEL. If the condition is true, run the retry process according to the policy.\n\t// If this field is omitted, it is always treated as 'true' and run the retry process.\n\t// The return value must always be of type boolean.\n\tIf string `protobuf:\"bytes,3,opt,name=if,proto3\" json:\"if,omitempty\"`\n}\n\nfunc (x *RetryPolicy) Reset() {\n\t*x = RetryPolicy{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[28]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RetryPolicy) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RetryPolicy) ProtoMessage() {}\n\nfunc (x *RetryPolicy) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[28]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RetryPolicy.ProtoReflect.Descriptor instead.\nfunc (*RetryPolicy) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{28}\n}\n\nfunc (m *RetryPolicy) GetPolicy() isRetryPolicy_Policy {\n\tif m != nil {\n\t\treturn m.Policy\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicy) GetConstant() *RetryPolicyConstant {\n\tif x, ok := x.GetPolicy().(*RetryPolicy_Constant); ok {\n\t\treturn x.Constant\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicy) GetExponential() *RetryPolicyExponential {\n\tif x, ok := x.GetPolicy().(*RetryPolicy_Exponential); ok {\n\t\treturn x.Exponential\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicy) GetIf() string {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\ntype isRetryPolicy_Policy interface {\n\tisRetryPolicy_Policy()\n}\n\ntype RetryPolicy_Constant struct {\n\t// retry according to the \"constant\" policy.\n\tConstant *RetryPolicyConstant `protobuf:\"bytes,1,opt,name=constant,proto3,oneof\"`\n}\n\ntype RetryPolicy_Exponential struct {\n\t// retry according to the \"exponential backoff\" policy.\n\t// The following Go library is used in the implementation,\n\t// so please refer to the library documentation for how to specify each parameter.\n\t// https://pkg.go.dev/github.com/cenkalti/backoff/v4#section-readme.\n\tExponential *RetryPolicyExponential `protobuf:\"bytes,2,opt,name=exponential,proto3,oneof\"`\n}\n\nfunc (*RetryPolicy_Constant) isRetryPolicy_Policy() {}\n\nfunc (*RetryPolicy_Exponential) isRetryPolicy_Policy() {}\n\n// RetryPolicyConstant define \"constant\" based retry policy.\ntype RetryPolicyConstant struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// interval value. ( default value is 1s ).\n\tInterval *string `protobuf:\"bytes,1,opt,name=interval,proto3,oneof\" json:\"interval,omitempty\"`\n\t// max retry count. ( default value is 5. If zero is specified, it never stops )\n\tMaxRetries *uint64 `protobuf:\"varint,2,opt,name=max_retries,json=maxRetries,proto3,oneof\" json:\"max_retries,omitempty\"`\n}\n\nfunc (x *RetryPolicyConstant) Reset() {\n\t*x = RetryPolicyConstant{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[29]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RetryPolicyConstant) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RetryPolicyConstant) ProtoMessage() {}\n\nfunc (x *RetryPolicyConstant) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[29]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RetryPolicyConstant.ProtoReflect.Descriptor instead.\nfunc (*RetryPolicyConstant) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{29}\n}\n\nfunc (x *RetryPolicyConstant) GetInterval() string {\n\tif x != nil && x.Interval != nil {\n\t\treturn *x.Interval\n\t}\n\treturn \"\"\n}\n\nfunc (x *RetryPolicyConstant) GetMaxRetries() uint64 {\n\tif x != nil && x.MaxRetries != nil {\n\t\treturn *x.MaxRetries\n\t}\n\treturn 0\n}\n\n// RetryPolicyExponential define \"exponential backoff\" based retry policy.\ntype RetryPolicyExponential struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// initial interval value. ( default value is \"500ms\" ).\n\tInitialInterval *string `protobuf:\"bytes,1,opt,name=initial_interval,json=initialInterval,proto3,oneof\" json:\"initial_interval,omitempty\"`\n\t// randomization factor value. ( default value is 0.5 ).\n\tRandomizationFactor *float64 `protobuf:\"fixed64,2,opt,name=randomization_factor,json=randomizationFactor,proto3,oneof\" json:\"randomization_factor,omitempty\"`\n\t// multiplier. ( default value is 1.5 ).\n\tMultiplier *float64 `protobuf:\"fixed64,3,opt,name=multiplier,proto3,oneof\" json:\"multiplier,omitempty\"`\n\t// max interval value. ( default value is \"60s\" ).\n\tMaxInterval *string `protobuf:\"bytes,4,opt,name=max_interval,json=maxInterval,proto3,oneof\" json:\"max_interval,omitempty\"`\n\t// max retry count. ( default value is 5. If zero is specified, it never stops ).\n\tMaxRetries *uint64 `protobuf:\"varint,5,opt,name=max_retries,json=maxRetries,proto3,oneof\" json:\"max_retries,omitempty\"`\n}\n\nfunc (x *RetryPolicyExponential) Reset() {\n\t*x = RetryPolicyExponential{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[30]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RetryPolicyExponential) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RetryPolicyExponential) ProtoMessage() {}\n\nfunc (x *RetryPolicyExponential) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[30]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RetryPolicyExponential.ProtoReflect.Descriptor instead.\nfunc (*RetryPolicyExponential) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{30}\n}\n\nfunc (x *RetryPolicyExponential) GetInitialInterval() string {\n\tif x != nil && x.InitialInterval != nil {\n\t\treturn *x.InitialInterval\n\t}\n\treturn \"\"\n}\n\nfunc (x *RetryPolicyExponential) GetRandomizationFactor() float64 {\n\tif x != nil && x.RandomizationFactor != nil {\n\t\treturn *x.RandomizationFactor\n\t}\n\treturn 0\n}\n\nfunc (x *RetryPolicyExponential) GetMultiplier() float64 {\n\tif x != nil && x.Multiplier != nil {\n\t\treturn *x.Multiplier\n\t}\n\treturn 0\n}\n\nfunc (x *RetryPolicyExponential) GetMaxInterval() string {\n\tif x != nil && x.MaxInterval != nil {\n\t\treturn *x.MaxInterval\n\t}\n\treturn \"\"\n}\n\nfunc (x *RetryPolicyExponential) GetMaxRetries() uint64 {\n\tif x != nil && x.MaxRetries != nil {\n\t\treturn *x.MaxRetries\n\t}\n\treturn 0\n}\n\n// MethodRequest define parameters to be used for gRPC method request.\ntype MethodRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// field name of the request message.\n\tField string `protobuf:\"bytes,1,opt,name=field,proto3\" json:\"field,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tBy *string `protobuf:\"bytes,2,opt,name=by,proto3,oneof\" json:\"by,omitempty\"`\n\t// if describes the condition to be assigned to field.\n\t// The return value must be of type bool.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\t// If the field is a 'oneof' field, it must be specified.\n\tIf *string `protobuf:\"bytes,3,opt,name=if,proto3,oneof\" json:\"if,omitempty\"`\n}\n\nfunc (x *MethodRequest) Reset() {\n\t*x = MethodRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[31]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MethodRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MethodRequest) ProtoMessage() {}\n\nfunc (x *MethodRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[31]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MethodRequest.ProtoReflect.Descriptor instead.\nfunc (*MethodRequest) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{31}\n}\n\nfunc (x *MethodRequest) GetField() string {\n\tif x != nil {\n\t\treturn x.Field\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodRequest) GetBy() string {\n\tif x != nil && x.By != nil {\n\t\treturn *x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodRequest) GetIf() string {\n\tif x != nil && x.If != nil {\n\t\treturn *x.If\n\t}\n\treturn \"\"\n}\n\n// MethodResponse define which value of the method response is referenced.\ntype MethodResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name specify the unique name that can be used in a `MessageRule` / `FieldRule` for the same message for a specific field in the response.\n\tName *string `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\t// field name in response message.\n\tField *string `protobuf:\"bytes,2,opt,name=field,proto3,oneof\" json:\"field,omitempty\"`\n\t// autobind if the value referenced by `field` is a message type,\n\t// the value of a field with the same name and type as the field name of its own message is automatically assigned to the value of the field in the message.\n\t// If multiple autobinds are used at the same message,\n\t// you must explicitly use the `grpc.federation.field` option to do the binding yourself, since duplicate field names cannot be correctly determined as one.\n\tAutobind *bool `protobuf:\"varint,3,opt,name=autobind,proto3,oneof\" json:\"autobind,omitempty\"`\n}\n\nfunc (x *MethodResponse) Reset() {\n\t*x = MethodResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[32]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MethodResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MethodResponse) ProtoMessage() {}\n\nfunc (x *MethodResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[32]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MethodResponse.ProtoReflect.Descriptor instead.\nfunc (*MethodResponse) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{32}\n}\n\nfunc (x *MethodResponse) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodResponse) GetField() string {\n\tif x != nil && x.Field != nil {\n\t\treturn *x.Field\n\t}\n\treturn \"\"\n}\n\nfunc (x *MethodResponse) GetAutobind() bool {\n\tif x != nil && x.Autobind != nil {\n\t\treturn *x.Autobind\n\t}\n\treturn false\n}\n\n// Argument define message argument.\ntype Argument struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name of the message argument.\n\t// Use this name to refer to the message argument.\n\t// For example, if `foo` is specified as the name, it is referenced by `$.foo`.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tBy *string `protobuf:\"bytes,2,opt,name=by,proto3,oneof\" json:\"by,omitempty\"`\n\t// inline like by, it refers to the specified value and expands all fields beyond it.\n\t// For this reason, the referenced value must always be of message type.\n\tInline *string `protobuf:\"bytes,3,opt,name=inline,proto3,oneof\" json:\"inline,omitempty\"`\n}\n\nfunc (x *Argument) Reset() {\n\t*x = Argument{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[33]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Argument) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Argument) ProtoMessage() {}\n\nfunc (x *Argument) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[33]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Argument.ProtoReflect.Descriptor instead.\nfunc (*Argument) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{33}\n}\n\nfunc (x *Argument) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Argument) GetBy() string {\n\tif x != nil && x.By != nil {\n\t\treturn *x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *Argument) GetInline() string {\n\tif x != nil && x.Inline != nil {\n\t\treturn *x.Inline\n\t}\n\treturn \"\"\n}\n\n// FieldRule define gRPC Federation rules for the field of message.\ntype FieldRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// If custom_resolver is true, the field binding process is to be implemented in Go.\n\t// If there are any values retrieved by grpc.federation.message option, they are passed as arguments for custom resolver.\n\tCustomResolver *bool `protobuf:\"varint,1,opt,name=custom_resolver,json=customResolver,proto3,oneof\" json:\"custom_resolver,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tBy *string `protobuf:\"bytes,2,opt,name=by,proto3,oneof\" json:\"by,omitempty\"`\n\t// alias can be used when alias is specified in grpc.federation.message option,\n\t// and specifies the field name to be referenced among the messages specified in alias of message option.\n\t// If the specified field has the same type or can be converted automatically, its value is assigned.\n\tAlias *string `protobuf:\"bytes,3,opt,name=alias,proto3,oneof\" json:\"alias,omitempty\"`\n\t// use to evaluate any one of fields. this field only available in oneof.\n\tOneof *FieldOneof `protobuf:\"bytes,4,opt,name=oneof,proto3\" json:\"oneof,omitempty\"`\n\t// when defining an environment variable, use it for fields where you want to set additional options.\n\tEnv *EnvVarOption `protobuf:\"bytes,5,opt,name=env,proto3\" json:\"env,omitempty\"`\n}\n\nfunc (x *FieldRule) Reset() {\n\t*x = FieldRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[34]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *FieldRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*FieldRule) ProtoMessage() {}\n\nfunc (x *FieldRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[34]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use FieldRule.ProtoReflect.Descriptor instead.\nfunc (*FieldRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{34}\n}\n\nfunc (x *FieldRule) GetCustomResolver() bool {\n\tif x != nil && x.CustomResolver != nil {\n\t\treturn *x.CustomResolver\n\t}\n\treturn false\n}\n\nfunc (x *FieldRule) GetBy() string {\n\tif x != nil && x.By != nil {\n\t\treturn *x.By\n\t}\n\treturn \"\"\n}\n\nfunc (x *FieldRule) GetAlias() string {\n\tif x != nil && x.Alias != nil {\n\t\treturn *x.Alias\n\t}\n\treturn \"\"\n}\n\nfunc (x *FieldRule) GetOneof() *FieldOneof {\n\tif x != nil {\n\t\treturn x.Oneof\n\t}\n\treturn nil\n}\n\nfunc (x *FieldRule) GetEnv() *EnvVarOption {\n\tif x != nil {\n\t\treturn x.Env\n\t}\n\treturn nil\n}\n\n// FieldOneof evaluate \"messages\" or other field only if expr is true and assign to the oneof field.\n// This feature only available in oneof.\ntype FieldOneof struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// cond specify either `expr` or `default`. Only one `default` can be set per oneof.\n\t//\n\t// Types that are assignable to Cond:\n\t//\n\t//\t*FieldOneof_If\n\t//\t*FieldOneof_Default\n\tCond isFieldOneof_Cond `protobuf_oneof:\"cond\"`\n\t// def specify variables to be used in current oneof field's scope for field binding.\n\tDef []*VariableDefinition `protobuf:\"bytes,3,rep,name=def,proto3\" json:\"def,omitempty\"`\n\t// by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule and FieldOneOf can be used.\n\tBy string `protobuf:\"bytes,4,opt,name=by,proto3\" json:\"by,omitempty\"`\n}\n\nfunc (x *FieldOneof) Reset() {\n\t*x = FieldOneof{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[35]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *FieldOneof) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*FieldOneof) ProtoMessage() {}\n\nfunc (x *FieldOneof) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[35]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use FieldOneof.ProtoReflect.Descriptor instead.\nfunc (*FieldOneof) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{35}\n}\n\nfunc (m *FieldOneof) GetCond() isFieldOneof_Cond {\n\tif m != nil {\n\t\treturn m.Cond\n\t}\n\treturn nil\n}\n\nfunc (x *FieldOneof) GetIf() string {\n\tif x, ok := x.GetCond().(*FieldOneof_If); ok {\n\t\treturn x.If\n\t}\n\treturn \"\"\n}\n\nfunc (x *FieldOneof) GetDefault() bool {\n\tif x, ok := x.GetCond().(*FieldOneof_Default); ok {\n\t\treturn x.Default\n\t}\n\treturn false\n}\n\nfunc (x *FieldOneof) GetDef() []*VariableDefinition {\n\tif x != nil {\n\t\treturn x.Def\n\t}\n\treturn nil\n}\n\nfunc (x *FieldOneof) GetBy() string {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn \"\"\n}\n\ntype isFieldOneof_Cond interface {\n\tisFieldOneof_Cond()\n}\n\ntype FieldOneof_If struct {\n\t// if describes the condition to be assigned to field.\n\t// The return value must be of type bool.\n\t// Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n\t// Variables are already defined in MessageRule can be used.\n\tIf string `protobuf:\"bytes,1,opt,name=if,proto3,oneof\"`\n}\n\ntype FieldOneof_Default struct {\n\t// default used to assign a value when none of the other fields match any of the specified expressions.\n\t// Only one value can be defined per oneof.\n\tDefault bool `protobuf:\"varint,2,opt,name=default,proto3,oneof\"`\n}\n\nfunc (*FieldOneof_If) isFieldOneof_Cond() {}\n\nfunc (*FieldOneof_Default) isFieldOneof_Cond() {}\n\n// CELPlugin define schema of CEL plugin.\ntype CELPlugin struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tExport []*CELPluginExport `protobuf:\"bytes,1,rep,name=export,proto3\" json:\"export,omitempty\"`\n}\n\nfunc (x *CELPlugin) Reset() {\n\t*x = CELPlugin{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[36]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPlugin) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPlugin) ProtoMessage() {}\n\nfunc (x *CELPlugin) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[36]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPlugin.ProtoReflect.Descriptor instead.\nfunc (*CELPlugin) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{36}\n}\n\nfunc (x *CELPlugin) GetExport() []*CELPluginExport {\n\tif x != nil {\n\t\treturn x.Export\n\t}\n\treturn nil\n}\n\n// CELPluginExport describe the schema to be exposed as a CEL plugin.\ntype CELPluginExport struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the plugin name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// types describe the message type you want to expose.\n\tTypes []*CELReceiverType `protobuf:\"bytes,3,rep,name=types,proto3\" json:\"types,omitempty\"`\n\t// functions describe the definition of the function you want to expose.\n\tFunctions []*CELFunction `protobuf:\"bytes,4,rep,name=functions,proto3\" json:\"functions,omitempty\"`\n\t// variables describe the definition of the variable you want to expose.\n\tVariables  []*CELVariable       `protobuf:\"bytes,5,rep,name=variables,proto3\" json:\"variables,omitempty\"`\n\tCapability *CELPluginCapability `protobuf:\"bytes,6,opt,name=capability,proto3\" json:\"capability,omitempty\"`\n}\n\nfunc (x *CELPluginExport) Reset() {\n\t*x = CELPluginExport{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[37]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginExport) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginExport) ProtoMessage() {}\n\nfunc (x *CELPluginExport) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[37]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginExport.ProtoReflect.Descriptor instead.\nfunc (*CELPluginExport) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{37}\n}\n\nfunc (x *CELPluginExport) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELPluginExport) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELPluginExport) GetTypes() []*CELReceiverType {\n\tif x != nil {\n\t\treturn x.Types\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginExport) GetFunctions() []*CELFunction {\n\tif x != nil {\n\t\treturn x.Functions\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginExport) GetVariables() []*CELVariable {\n\tif x != nil {\n\t\treturn x.Variables\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginExport) GetCapability() *CELPluginCapability {\n\tif x != nil {\n\t\treturn x.Capability\n\t}\n\treturn nil\n}\n\n// CELPluginCapability controls the permissions granted to the WebAssembly plugin.\ntype CELPluginCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// env is the capability for environment variable.\n\tEnv *CELPluginEnvCapability `protobuf:\"bytes,1,opt,name=env,proto3,oneof\" json:\"env,omitempty\"`\n\t// file_system is the capability for file system.\n\tFileSystem *CELPluginFileSystemCapability `protobuf:\"bytes,2,opt,name=file_system,json=fileSystem,proto3,oneof\" json:\"file_system,omitempty\"`\n\t// network is the capability for network.\n\tNetwork *CELPluginNetworkCapability `protobuf:\"bytes,3,opt,name=network,proto3,oneof\" json:\"network,omitempty\"`\n}\n\nfunc (x *CELPluginCapability) Reset() {\n\t*x = CELPluginCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[38]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginCapability) ProtoMessage() {}\n\nfunc (x *CELPluginCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[38]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{38}\n}\n\nfunc (x *CELPluginCapability) GetEnv() *CELPluginEnvCapability {\n\tif x != nil {\n\t\treturn x.Env\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginCapability) GetFileSystem() *CELPluginFileSystemCapability {\n\tif x != nil {\n\t\treturn x.FileSystem\n\t}\n\treturn nil\n}\n\nfunc (x *CELPluginCapability) GetNetwork() *CELPluginNetworkCapability {\n\tif x != nil {\n\t\treturn x.Network\n\t}\n\treturn nil\n}\n\n// CELPluginEnvCapability controls access to the environment variable.\ntype CELPluginEnvCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// all allows access to all environment variables.\n\tAll bool `protobuf:\"varint,1,opt,name=all,proto3\" json:\"all,omitempty\"`\n\t// specifies accessible names. If \"all\" is true, it takes precedence.\n\tNames []string `protobuf:\"bytes,2,rep,name=names,proto3\" json:\"names,omitempty\"`\n}\n\nfunc (x *CELPluginEnvCapability) Reset() {\n\t*x = CELPluginEnvCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[39]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginEnvCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginEnvCapability) ProtoMessage() {}\n\nfunc (x *CELPluginEnvCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[39]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginEnvCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginEnvCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{39}\n}\n\nfunc (x *CELPluginEnvCapability) GetAll() bool {\n\tif x != nil {\n\t\treturn x.All\n\t}\n\treturn false\n}\n\nfunc (x *CELPluginEnvCapability) GetNames() []string {\n\tif x != nil {\n\t\treturn x.Names\n\t}\n\treturn nil\n}\n\n// CELPluginFileSystemCapability controls access to the file system.\ntype CELPluginFileSystemCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// mount_path specifies the file path of the host to mount.\n\t// If not specified, the root directory will be used.\n\tMountPath string `protobuf:\"bytes,1,opt,name=mount_path,json=mountPath,proto3\" json:\"mount_path,omitempty\"`\n}\n\nfunc (x *CELPluginFileSystemCapability) Reset() {\n\t*x = CELPluginFileSystemCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[40]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginFileSystemCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginFileSystemCapability) ProtoMessage() {}\n\nfunc (x *CELPluginFileSystemCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[40]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginFileSystemCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginFileSystemCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{40}\n}\n\nfunc (x *CELPluginFileSystemCapability) GetMountPath() string {\n\tif x != nil {\n\t\treturn x.MountPath\n\t}\n\treturn \"\"\n}\n\n// CELPluginNetworkCapability sets permissions related to network access.\n// This is an experimental feature.\ntype CELPluginNetworkCapability struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *CELPluginNetworkCapability) Reset() {\n\t*x = CELPluginNetworkCapability{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[41]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPluginNetworkCapability) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPluginNetworkCapability) ProtoMessage() {}\n\nfunc (x *CELPluginNetworkCapability) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[41]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPluginNetworkCapability.ProtoReflect.Descriptor instead.\nfunc (*CELPluginNetworkCapability) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{41}\n}\n\n// CELFunction represents the CEL function definition.\ntype CELFunction struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the function name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of function.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// args describe the definition of the function argument.\n\tArgs []*CELFunctionArgument `protobuf:\"bytes,3,rep,name=args,proto3\" json:\"args,omitempty\"`\n\t// return describe the definition of return type of function.\n\tReturn *CELType `protobuf:\"bytes,4,opt,name=return,proto3\" json:\"return,omitempty\"`\n}\n\nfunc (x *CELFunction) Reset() {\n\t*x = CELFunction{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[42]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELFunction) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELFunction) ProtoMessage() {}\n\nfunc (x *CELFunction) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[42]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELFunction.ProtoReflect.Descriptor instead.\nfunc (*CELFunction) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{42}\n}\n\nfunc (x *CELFunction) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunction) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunction) GetArgs() []*CELFunctionArgument {\n\tif x != nil {\n\t\treturn x.Args\n\t}\n\treturn nil\n}\n\nfunc (x *CELFunction) GetReturn() *CELType {\n\tif x != nil {\n\t\treturn x.Return\n\t}\n\treturn nil\n}\n\n// CELReceiverType represents methods tied to the message.\ntype CELReceiverType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the message name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// methods describe the definition of the method for the message.\n\tMethods []*CELFunction `protobuf:\"bytes,3,rep,name=methods,proto3\" json:\"methods,omitempty\"`\n}\n\nfunc (x *CELReceiverType) Reset() {\n\t*x = CELReceiverType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[43]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELReceiverType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELReceiverType) ProtoMessage() {}\n\nfunc (x *CELReceiverType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[43]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELReceiverType.ProtoReflect.Descriptor instead.\nfunc (*CELReceiverType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{43}\n}\n\nfunc (x *CELReceiverType) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELReceiverType) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELReceiverType) GetMethods() []*CELFunction {\n\tif x != nil {\n\t\treturn x.Methods\n\t}\n\treturn nil\n}\n\n// CELFunctionArgument represents the function argument.\ntype CELFunctionArgument struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the argument value name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// type is the argument type.\n\tType *CELType `protobuf:\"bytes,3,opt,name=type,proto3\" json:\"type,omitempty\"`\n}\n\nfunc (x *CELFunctionArgument) Reset() {\n\t*x = CELFunctionArgument{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[44]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELFunctionArgument) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELFunctionArgument) ProtoMessage() {}\n\nfunc (x *CELFunctionArgument) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[44]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELFunctionArgument.ProtoReflect.Descriptor instead.\nfunc (*CELFunctionArgument) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{44}\n}\n\nfunc (x *CELFunctionArgument) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunctionArgument) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunctionArgument) GetType() *CELType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\n// CELType represents type information for CEL plugin interface.\ntype CELType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to Type:\n\t//\n\t//\t*CELType_Kind\n\t//\t*CELType_Repeated\n\t//\t*CELType_Map\n\t//\t*CELType_Message\n\t//\t*CELType_Enum\n\tType isCELType_Type `protobuf_oneof:\"type\"`\n}\n\nfunc (x *CELType) Reset() {\n\t*x = CELType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[45]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELType) ProtoMessage() {}\n\nfunc (x *CELType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[45]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELType.ProtoReflect.Descriptor instead.\nfunc (*CELType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{45}\n}\n\nfunc (m *CELType) GetType() isCELType_Type {\n\tif m != nil {\n\t\treturn m.Type\n\t}\n\treturn nil\n}\n\nfunc (x *CELType) GetKind() TypeKind {\n\tif x, ok := x.GetType().(*CELType_Kind); ok {\n\t\treturn x.Kind\n\t}\n\treturn TypeKind_UNKNOWN\n}\n\nfunc (x *CELType) GetRepeated() *CELType {\n\tif x, ok := x.GetType().(*CELType_Repeated); ok {\n\t\treturn x.Repeated\n\t}\n\treturn nil\n}\n\nfunc (x *CELType) GetMap() *CELMapType {\n\tif x, ok := x.GetType().(*CELType_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\nfunc (x *CELType) GetMessage() string {\n\tif x, ok := x.GetType().(*CELType_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELType) GetEnum() string {\n\tif x, ok := x.GetType().(*CELType_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn \"\"\n}\n\ntype isCELType_Type interface {\n\tisCELType_Type()\n}\n\ntype CELType_Kind struct {\n\t// kind is used when the type is a primitive type.\n\tKind TypeKind `protobuf:\"varint,1,opt,name=kind,proto3,enum=grpc.federation.TypeKind,oneof\"`\n}\n\ntype CELType_Repeated struct {\n\t// repeated is used when the type is a repeated type.\n\tRepeated *CELType `protobuf:\"bytes,2,opt,name=repeated,proto3,oneof\"`\n}\n\ntype CELType_Map struct {\n\t// map is used when the type is a map type.\n\tMap *CELMapType `protobuf:\"bytes,3,opt,name=map,proto3,oneof\"`\n}\n\ntype CELType_Message struct {\n\t// message is a fqdn to the message type.\n\tMessage string `protobuf:\"bytes,4,opt,name=message,proto3,oneof\"`\n}\n\ntype CELType_Enum struct {\n\t// enum is a fqdn to the enum type.\n\tEnum string `protobuf:\"bytes,5,opt,name=enum,proto3,oneof\"`\n}\n\nfunc (*CELType_Kind) isCELType_Type() {}\n\nfunc (*CELType_Repeated) isCELType_Type() {}\n\nfunc (*CELType_Map) isCELType_Type() {}\n\nfunc (*CELType_Message) isCELType_Type() {}\n\nfunc (*CELType_Enum) isCELType_Type() {}\n\n// CELMapType represents map type.\ntype CELMapType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// key represents map's key type.\n\tKey *CELType `protobuf:\"bytes,1,opt,name=key,proto3\" json:\"key,omitempty\"`\n\t// value represents map's value type.\n\tValue *CELType `protobuf:\"bytes,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *CELMapType) Reset() {\n\t*x = CELMapType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[46]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELMapType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELMapType) ProtoMessage() {}\n\nfunc (x *CELMapType) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[46]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELMapType.ProtoReflect.Descriptor instead.\nfunc (*CELMapType) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{46}\n}\n\nfunc (x *CELMapType) GetKey() *CELType {\n\tif x != nil {\n\t\treturn x.Key\n\t}\n\treturn nil\n}\n\nfunc (x *CELMapType) GetValue() *CELType {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn nil\n}\n\n// CELVariable represents CEL variable.\ntype CELVariable struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// name is the variable name.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// desc is the description of plugin.\n\t// This description is used as documentation at code generation.\n\tDesc string `protobuf:\"bytes,2,opt,name=desc,proto3\" json:\"desc,omitempty\"`\n\t// type is the variable type.\n\tType *CELType `protobuf:\"bytes,3,opt,name=type,proto3\" json:\"type,omitempty\"`\n}\n\nfunc (x *CELVariable) Reset() {\n\t*x = CELVariable{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_federation_proto_msgTypes[47]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELVariable) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELVariable) ProtoMessage() {}\n\nfunc (x *CELVariable) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_federation_proto_msgTypes[47]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELVariable.ProtoReflect.Descriptor instead.\nfunc (*CELVariable) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_federation_proto_rawDescGZIP(), []int{47}\n}\n\nfunc (x *CELVariable) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELVariable) GetDesc() string {\n\tif x != nil {\n\t\treturn x.Desc\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELVariable) GetType() *CELType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nvar file_grpc_federation_federation_proto_extTypes = []protoimpl.ExtensionInfo{\n\t{\n\t\tExtendedType:  (*descriptorpb.FileOptions)(nil),\n\t\tExtensionType: (*FileRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.file\",\n\t\tTag:           \"bytes,1187,opt,name=file\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.ServiceOptions)(nil),\n\t\tExtensionType: (*ServiceRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.service\",\n\t\tTag:           \"bytes,1187,opt,name=service\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MethodOptions)(nil),\n\t\tExtensionType: (*MethodRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.method\",\n\t\tTag:           \"bytes,1187,opt,name=method\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.MessageOptions)(nil),\n\t\tExtensionType: (*MessageRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.message\",\n\t\tTag:           \"bytes,1187,opt,name=message\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.FieldOptions)(nil),\n\t\tExtensionType: (*FieldRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.field\",\n\t\tTag:           \"bytes,1187,opt,name=field\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.EnumOptions)(nil),\n\t\tExtensionType: (*EnumRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.enum\",\n\t\tTag:           \"bytes,1187,opt,name=enum\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.EnumValueOptions)(nil),\n\t\tExtensionType: (*EnumValueRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.enum_value\",\n\t\tTag:           \"bytes,1187,opt,name=enum_value\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n\t{\n\t\tExtendedType:  (*descriptorpb.OneofOptions)(nil),\n\t\tExtensionType: (*OneofRule)(nil),\n\t\tField:         1187,\n\t\tName:          \"grpc.federation.oneof\",\n\t\tTag:           \"bytes,1187,opt,name=oneof\",\n\t\tFilename:      \"grpc/federation/federation.proto\",\n\t},\n}\n\n// Extension fields to descriptorpb.FileOptions.\nvar (\n\t// optional grpc.federation.FileRule file = 1187;\n\tE_File = &file_grpc_federation_federation_proto_extTypes[0]\n)\n\n// Extension fields to descriptorpb.ServiceOptions.\nvar (\n\t// optional grpc.federation.ServiceRule service = 1187;\n\tE_Service = &file_grpc_federation_federation_proto_extTypes[1]\n)\n\n// Extension fields to descriptorpb.MethodOptions.\nvar (\n\t// optional grpc.federation.MethodRule method = 1187;\n\tE_Method = &file_grpc_federation_federation_proto_extTypes[2]\n)\n\n// Extension fields to descriptorpb.MessageOptions.\nvar (\n\t// optional grpc.federation.MessageRule message = 1187;\n\tE_Message = &file_grpc_federation_federation_proto_extTypes[3]\n)\n\n// Extension fields to descriptorpb.FieldOptions.\nvar (\n\t// optional grpc.federation.FieldRule field = 1187;\n\tE_Field = &file_grpc_federation_federation_proto_extTypes[4]\n)\n\n// Extension fields to descriptorpb.EnumOptions.\nvar (\n\t// optional grpc.federation.EnumRule enum = 1187;\n\tE_Enum = &file_grpc_federation_federation_proto_extTypes[5]\n)\n\n// Extension fields to descriptorpb.EnumValueOptions.\nvar (\n\t// optional grpc.federation.EnumValueRule enum_value = 1187;\n\tE_EnumValue = &file_grpc_federation_federation_proto_extTypes[6]\n)\n\n// Extension fields to descriptorpb.OneofOptions.\nvar (\n\t// optional grpc.federation.OneofRule oneof = 1187;\n\tE_Oneof = &file_grpc_federation_federation_proto_extTypes[7]\n)\n\nvar File_grpc_federation_federation_proto protoreflect.FileDescriptor\n\nvar file_grpc_federation_federation_proto_rawDesc = []byte{\n\t0x0a, 0x20, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x12, 0x0f, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70,\n\t0x63, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x64,\n\t0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x67, 0x72,\n\t0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x70, 0x72,\n\t0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x67, 0x72, 0x70,\n\t0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x74, 0x69, 0x6d,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x56, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x52,\n\t0x75, 0x6c, 0x65, 0x12, 0x32, 0x0a, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52,\n\t0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6d, 0x70, 0x6f, 0x72,\n\t0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x22,\n\t0x20, 0x0a, 0x08, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61,\n\t0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61,\n\t0x73, 0x22, 0xb4, 0x01, 0x0a, 0x0d, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52,\n\t0x75, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x88,\n\t0x01, 0x01, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,\n\t0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x37, 0x0a, 0x04, 0x61, 0x74, 0x74, 0x72,\n\t0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c,\n\t0x75, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, 0x04, 0x61, 0x74, 0x74,\n\t0x72, 0x12, 0x1d, 0x0a, 0x07, 0x6e, 0x6f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x04, 0x20, 0x01,\n\t0x28, 0x08, 0x48, 0x01, 0x52, 0x07, 0x6e, 0x6f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x88, 0x01, 0x01,\n\t0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x42, 0x0a, 0x0a, 0x08,\n\t0x5f, 0x6e, 0x6f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x3e, 0x0a, 0x12, 0x45, 0x6e, 0x75, 0x6d,\n\t0x56, 0x61, 0x6c, 0x75, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x12, 0x12,\n\t0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x0b, 0x0a, 0x09, 0x4f, 0x6e, 0x65, 0x6f,\n\t0x66, 0x52, 0x75, 0x6c, 0x65, 0x22, 0x69, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n\t0x52, 0x75, 0x6c, 0x65, 0x12, 0x26, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x14, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x32, 0x0a, 0x03,\n\t0x76, 0x61, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x03, 0x76, 0x61, 0x72,\n\t0x22, 0x4a, 0x0a, 0x03, 0x45, 0x6e, 0x76, 0x12, 0x29, 0x0a, 0x03, 0x76, 0x61, 0x72, 0x18, 0x01,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x52, 0x03, 0x76,\n\t0x61, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x8b, 0x03, 0x0a,\n\t0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65,\n\t0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01,\n\t0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x66, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x02, 0x69, 0x66, 0x88, 0x01, 0x01, 0x12, 0x10,\n\t0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x62, 0x79,\n\t0x12, 0x2c, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x4d, 0x61, 0x70, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x70, 0x12, 0x38,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52,\n\t0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x50, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x69,\n\t0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x61,\n\t0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x0a,\n\t0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x04, 0x65, 0x6e,\n\t0x75, 0x6d, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x45,\n\t0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x35, 0x0a, 0x06, 0x73,\n\t0x77, 0x69, 0x74, 0x63, 0x68, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x77,\n\t0x69, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x06, 0x73, 0x77, 0x69, 0x74,\n\t0x63, 0x68, 0x42, 0x06, 0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e,\n\t0x61, 0x6d, 0x65, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x66, 0x22, 0x49, 0x0a, 0x1d, 0x53, 0x65,\n\t0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c,\n\t0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69,\n\t0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x66, 0x12, 0x18, 0x0a, 0x07, 0x6d,\n\t0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65,\n\t0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x06, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72,\n\t0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79,\n\t0x70, 0x65, 0x12, 0x3a, 0x0a, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x48, 0x00, 0x52, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x09,\n\t0x0a, 0x07, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xab, 0x01, 0x0a, 0x07, 0x45, 0x6e,\n\t0x76, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2f, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x00,\n\t0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x36, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74,\n\t0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79,\n\t0x70, 0x65, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2f,\n\t0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e,\n\t0x76, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x70, 0x42,\n\t0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x68, 0x0a, 0x0a, 0x45, 0x6e, 0x76, 0x4d, 0x61,\n\t0x70, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2a, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79, 0x70, 0x65, 0x52, 0x03, 0x6b, 0x65,\n\t0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,\n\t0x65, 0x22, 0xc3, 0x01, 0x0a, 0x0c, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x09, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61,\n\t0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c,\n\t0x74, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72,\n\t0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64,\n\t0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x07, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65,\n\t0x64, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61,\n\t0x74, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x42, 0x0b,\n\t0x0a, 0x09, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x5f,\n\t0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x22, 0x65, 0x0a, 0x0a, 0x4d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75,\n\t0x74, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e,\n\t0x73, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75,\n\t0x74, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9c,\n\t0x01, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x35,\n\t0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61,\n\t0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e,\n\t0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f,\n\t0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00,\n\t0x52, 0x0e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72,\n\t0x88, 0x01, 0x01, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x03, 0x20, 0x03,\n\t0x28, 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x75,\n\t0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x22, 0xde, 0x03,\n\t0x0a, 0x12, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69,\n\t0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x48, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x13, 0x0a,\n\t0x02, 0x69, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x02, 0x69, 0x66, 0x88,\n\t0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x18, 0x03,\n\t0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64,\n\t0x88, 0x01, 0x01, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48,\n\t0x00, 0x52, 0x02, 0x62, 0x79, 0x12, 0x2c, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x0c, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x61, 0x70, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x03,\n\t0x6d, 0x61, 0x70, 0x12, 0x38, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0d,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78,\n\t0x70, 0x72, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2f, 0x0a,\n\t0x04, 0x63, 0x61, 0x6c, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x61,\n\t0x6c, 0x6c, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x63, 0x61, 0x6c, 0x6c, 0x12, 0x41,\n\t0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45,\n\t0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x12, 0x2f, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e,\n\t0x75, 0x6d, 0x12, 0x35, 0x0a, 0x06, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x18, 0x11, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x48,\n\t0x00, 0x52, 0x06, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x42, 0x06, 0x0a, 0x04, 0x65, 0x78, 0x70,\n\t0x72, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69,\n\t0x66, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x22, 0xc5,\n\t0x01, 0x0a, 0x07, 0x4d, 0x61, 0x70, 0x45, 0x78, 0x70, 0x72, 0x12, 0x35, 0x0a, 0x08, 0x69, 0x74,\n\t0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49,\n\t0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f,\n\t0x72, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,\n\t0x02, 0x62, 0x79, 0x12, 0x38, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0c,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78,\n\t0x70, 0x72, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2f, 0x0a,\n\t0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e,\n\t0x75, 0x6d, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x42, 0x06,\n\t0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x22, 0x30, 0x0a, 0x08, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74,\n\t0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x72, 0x63, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x72, 0x63, 0x22, 0x50, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x45, 0x78, 0x70, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x04, 0x61,\n\t0x72, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x41, 0x72, 0x67, 0x75,\n\t0x6d, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x22, 0x2e, 0x0a, 0x08, 0x45, 0x6e,\n\t0x75, 0x6d, 0x45, 0x78, 0x70, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x62, 0x79,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x62, 0x79, 0x22, 0xf3, 0x02, 0x0a, 0x08, 0x43,\n\t0x61, 0x6c, 0x6c, 0x45, 0x78, 0x70, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12,\n\t0x38, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x07, 0x74, 0x69, 0x6d,\n\t0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x74, 0x69,\n\t0x6d, 0x65, 0x6f, 0x75, 0x74, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x05, 0x72, 0x65, 0x74, 0x72,\n\t0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50,\n\t0x6f, 0x6c, 0x69, 0x63, 0x79, 0x48, 0x01, 0x52, 0x05, 0x72, 0x65, 0x74, 0x72, 0x79, 0x88, 0x01,\n\t0x01, 0x12, 0x30, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72,\n\t0x72, 0x6f, 0x72, 0x12, 0x3c, 0x0a, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x43, 0x61, 0x6c, 0x6c, 0x4f, 0x70,\n\t0x74, 0x69, 0x6f, 0x6e, 0x48, 0x02, 0x52, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01,\n\t0x01, 0x12, 0x1f, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20,\n\t0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x88,\n\t0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x42, 0x08,\n\t0x0a, 0x06, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x79, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,\n\t0x22, 0x7f, 0x0a, 0x0a, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x12, 0x33,\n\t0x0a, 0x04, 0x63, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53,\n\t0x77, 0x69, 0x74, 0x63, 0x68, 0x43, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x72, 0x52, 0x04, 0x63,\n\t0x61, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x44, 0x65, 0x66,\n\t0x61, 0x75, 0x6c, 0x74, 0x45, 0x78, 0x70, 0x72, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c,\n\t0x74, 0x22, 0x71, 0x0a, 0x0e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x43, 0x61, 0x73, 0x65, 0x45,\n\t0x78, 0x70, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x02, 0x69, 0x66, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e,\n\t0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x79,\n\t0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x62, 0x79, 0x42, 0x06, 0x0a, 0x04,\n\t0x65, 0x78, 0x70, 0x72, 0x22, 0x64, 0x0a, 0x11, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x44, 0x65,\n\t0x66, 0x61, 0x75, 0x6c, 0x74, 0x45, 0x78, 0x70, 0x72, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66,\n\t0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c,\n\t0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66,\n\t0x12, 0x10, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02,\n\t0x62, 0x79, 0x42, 0x06, 0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x22, 0x86, 0x04, 0x0a, 0x09, 0x47,\n\t0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18,\n\t0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65,\n\t0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12,\n\t0x13, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x69,\n\t0x66, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x0e, 0x32, 0x10, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e,\n\t0x43, 0x6f, 0x64, 0x65, 0x48, 0x01, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12,\n\t0x1d, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,\n\t0x48, 0x02, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a,\n\t0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x20, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69,\n\t0x6c, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x69, 0x67,\n\t0x6e, 0x6f, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x06, 0x69, 0x67,\n\t0x6e, 0x6f, 0x72, 0x65, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x67, 0x6e, 0x6f, 0x72,\n\t0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x07,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x11, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x41, 0x6e,\n\t0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x88, 0x01, 0x01, 0x12, 0x45, 0x0a, 0x09,\n\t0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32,\n\t0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x4c, 0x6f, 0x67, 0x4c,\n\t0x65, 0x76, 0x65, 0x6c, 0x48, 0x05, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c,\n\t0x88, 0x01, 0x01, 0x22, 0x41, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12,\n\t0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05,\n\t0x44, 0x45, 0x42, 0x55, 0x47, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x4e, 0x46, 0x4f, 0x10,\n\t0x02, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x41, 0x52, 0x4e, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x45,\n\t0x52, 0x52, 0x4f, 0x52, 0x10, 0x04, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x66, 0x42, 0x07, 0x0a,\n\t0x05, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61,\n\t0x67, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x42, 0x16, 0x0a,\n\t0x14, 0x5f, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x72, 0x65, 0x73,\n\t0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65,\n\t0x76, 0x65, 0x6c, 0x22, 0xfa, 0x05, 0x0a, 0x0f, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f,\n\t0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x66, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x02,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44,\n\t0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x36,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78, 0x70, 0x72, 0x52, 0x07, 0x6d,\n\t0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f,\n\t0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66,\n\t0x6f, 0x52, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x34, 0x0a, 0x0a,\n\t0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65,\n\t0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x72, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e,\n\t0x66, 0x6f, 0x12, 0x34, 0x0a, 0x0a, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x69, 0x6e, 0x66, 0x6f,\n\t0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x64,\n\t0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3d, 0x0a, 0x0d, 0x71, 0x75, 0x6f, 0x74,\n\t0x61, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x6f,\n\t0x74, 0x61, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x0c, 0x71, 0x75, 0x6f, 0x74, 0x61,\n\t0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x52, 0x0a, 0x14, 0x70, 0x72, 0x65, 0x63, 0x6f,\n\t0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18,\n\t0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72,\n\t0x70, 0x63, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x46,\n\t0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x13, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69,\n\t0x74, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x62,\n\t0x61, 0x64, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61,\n\t0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x62, 0x61, 0x64, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f,\n\t0x69, 0x6e, 0x66, 0x6f, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49,\n\t0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f,\n\t0x12, 0x3d, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66,\n\t0x6f, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66,\n\t0x6f, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12,\n\t0x24, 0x0a, 0x04, 0x68, 0x65, 0x6c, 0x70, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x48, 0x65, 0x6c, 0x70, 0x52,\n\t0x04, 0x68, 0x65, 0x6c, 0x70, 0x12, 0x49, 0x0a, 0x11, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a,\n\t0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f,\n\t0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x10,\n\t0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,\n\t0x12, 0x0e, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x02, 0x62, 0x79,\n\t0x22, 0xc7, 0x03, 0x0a, 0x0e, 0x47, 0x52, 0x50, 0x43, 0x43, 0x61, 0x6c, 0x6c, 0x4f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x73,\n\t0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0e,\n\t0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x88, 0x01,\n\t0x01, 0x12, 0x1b, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x48, 0x01, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x37,\n\t0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x72, 0x65, 0x63, 0x76, 0x5f,\n\t0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02,\n\t0x52, 0x12, 0x6d, 0x61, 0x78, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x63, 0x76, 0x4d, 0x73, 0x67,\n\t0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x63,\n\t0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a,\n\t0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x43, 0x61,\n\t0x6c, 0x6c, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01,\n\t0x12, 0x28, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f,\n\t0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x48, 0x04, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x69,\n\t0x63, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x74, 0x72,\n\t0x61, 0x69, 0x6c, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x07, 0x74,\n\t0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x0e, 0x77, 0x61, 0x69,\n\t0x74, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28,\n\t0x08, 0x48, 0x06, 0x52, 0x0c, 0x77, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x52, 0x65, 0x61, 0x64,\n\t0x79, 0x88, 0x01, 0x01, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,\n\t0x5f, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x68, 0x65, 0x61,\n\t0x64, 0x65, 0x72, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c,\n\t0x5f, 0x72, 0x65, 0x63, 0x76, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x19,\n\t0x0a, 0x17, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x65, 0x6e, 0x64,\n\t0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x74,\n\t0x61, 0x74, 0x69, 0x63, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x5f,\n\t0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x77, 0x61, 0x69, 0x74,\n\t0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x22, 0x64, 0x0a, 0x0e, 0x56, 0x61,\n\t0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72, 0x12, 0x17, 0x0a, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72,\n\t0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65,\n\t0x22, 0xb8, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,\n\t0x12, 0x42, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,\n\t0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x73,\n\t0x74, 0x61, 0x6e, 0x74, 0x12, 0x4b, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74,\n\t0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x72,\n\t0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x69,\n\t0x61, 0x6c, 0x48, 0x00, 0x52, 0x0b, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x69, 0x61,\n\t0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,\n\t0x66, 0x42, 0x08, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x79, 0x0a, 0x13, 0x52,\n\t0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61,\n\t0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c,\n\t0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69,\n\t0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, 0x01, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x52,\n\t0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x69, 0x6e,\n\t0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x72,\n\t0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0xd1, 0x02, 0x0a, 0x16, 0x52, 0x65, 0x74, 0x72, 0x79,\n\t0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x69, 0x61,\n\t0x6c, 0x12, 0x2e, 0x0a, 0x10, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x74,\n\t0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0f, 0x69,\n\t0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x88, 0x01,\n\t0x01, 0x12, 0x36, 0x0a, 0x14, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x48,\n\t0x01, 0x52, 0x13, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0a, 0x6d, 0x75, 0x6c,\n\t0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x48, 0x02, 0x52,\n\t0x0a, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x26,\n\t0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x04,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x49, 0x6e, 0x74, 0x65, 0x72,\n\t0x76, 0x61, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65,\n\t0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x48, 0x04, 0x52, 0x0a, 0x6d,\n\t0x61, 0x78, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x42, 0x13, 0x0a, 0x11,\n\t0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61,\n\t0x6c, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x6d,\n\t0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6d, 0x61,\n\t0x78, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d,\n\t0x61, 0x78, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x5d, 0x0a, 0x0d, 0x4d, 0x65,\n\t0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x66,\n\t0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c,\n\t0x64, 0x12, 0x13, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,\n\t0x02, 0x62, 0x79, 0x88, 0x01, 0x01, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x48, 0x01, 0x52, 0x02, 0x69, 0x66, 0x88, 0x01, 0x01, 0x42, 0x05, 0x0a, 0x03, 0x5f,\n\t0x62, 0x79, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x66, 0x22, 0x85, 0x01, 0x0a, 0x0e, 0x4d, 0x65,\n\t0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x17, 0x0a, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x88, 0x01, 0x01,\n\t0x12, 0x1f, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x08, 0x48, 0x02, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e, 0x64, 0x88, 0x01,\n\t0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x66,\n\t0x69, 0x65, 0x6c, 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x62, 0x69, 0x6e,\n\t0x64, 0x22, 0x62, 0x0a, 0x08, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x12, 0x13, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,\n\t0x02, 0x62, 0x79, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x06, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65,\n\t0x88, 0x01, 0x01, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x62, 0x79, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x69,\n\t0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0xf2, 0x01, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52,\n\t0x75, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65,\n\t0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0e,\n\t0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x88, 0x01,\n\t0x01, 0x12, 0x13, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52,\n\t0x02, 0x62, 0x79, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x88, 0x01,\n\t0x01, 0x12, 0x31, 0x0a, 0x05, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x52, 0x05, 0x6f,\n\t0x6e, 0x65, 0x6f, 0x66, 0x12, 0x2f, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x05, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x52, 0x03, 0x65, 0x6e, 0x76, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d,\n\t0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x62, 0x79,\n\t0x42, 0x08, 0x0a, 0x06, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x89, 0x01, 0x0a, 0x0a, 0x46,\n\t0x69, 0x65, 0x6c, 0x64, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x12, 0x10, 0x0a, 0x02, 0x69, 0x66, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x69, 0x66, 0x12, 0x1a, 0x0a, 0x07, 0x64,\n\t0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x07,\n\t0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x35, 0x0a, 0x03, 0x64, 0x65, 0x66, 0x18, 0x03,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44,\n\t0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x64, 0x65, 0x66, 0x12, 0x0e,\n\t0x0a, 0x02, 0x62, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x62, 0x79, 0x42, 0x06,\n\t0x0a, 0x04, 0x63, 0x6f, 0x6e, 0x64, 0x22, 0x45, 0x0a, 0x09, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75,\n\t0x67, 0x69, 0x6e, 0x12, 0x38, 0x0a, 0x06, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20,\n\t0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x45,\n\t0x78, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x06, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x22, 0xaf, 0x02,\n\t0x0a, 0x0f, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x45, 0x78, 0x70, 0x6f, 0x72,\n\t0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x36, 0x0a, 0x05, 0x74, 0x79, 0x70,\n\t0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x52, 0x65,\n\t0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x74, 0x79, 0x70, 0x65,\n\t0x73, 0x12, 0x3a, 0x0a, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69,\n\t0x6f, 0x6e, 0x52, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3a, 0x0a,\n\t0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x09,\n\t0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x44, 0x0a, 0x0a, 0x63, 0x61, 0x70,\n\t0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c,\n\t0x69, 0x74, 0x79, 0x52, 0x0a, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22,\n\t0x9b, 0x02, 0x0a, 0x13, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x70,\n\t0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x3e, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e,\n\t0x45, 0x6e, 0x76, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x48, 0x00, 0x52,\n\t0x03, 0x65, 0x6e, 0x76, 0x88, 0x01, 0x01, 0x12, 0x54, 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x65, 0x5f,\n\t0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43,\n\t0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x73, 0x74,\n\t0x65, 0x6d, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x48, 0x01, 0x52, 0x0a,\n\t0x66, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x4a, 0x0a,\n\t0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b,\n\t0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72,\n\t0x6b, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x48, 0x02, 0x52, 0x07, 0x6e,\n\t0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x88, 0x01, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x65, 0x6e,\n\t0x76, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65,\n\t0x6d, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x40, 0x0a,\n\t0x16, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x45, 0x6e, 0x76, 0x43, 0x61, 0x70,\n\t0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d,\n\t0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22,\n\t0x3e, 0x0a, 0x1d, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65,\n\t0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79,\n\t0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 0x74, 0x68, 0x22,\n\t0x1c, 0x0a, 0x1a, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x4e, 0x65, 0x74, 0x77,\n\t0x6f, 0x72, 0x6b, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22, 0xa1, 0x01,\n\t0x0a, 0x0b, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x38, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x03, 0x20,\n\t0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,\n\t0x6e, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12,\n\t0x30, 0x0a, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72,\n\t0x6e, 0x22, 0x71, 0x0a, 0x0f, 0x43, 0x45, 0x4c, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72,\n\t0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x36, 0x0a, 0x07,\n\t0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x6d, 0x65, 0x74,\n\t0x68, 0x6f, 0x64, 0x73, 0x22, 0x6b, 0x0a, 0x13, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74,\n\t0x69, 0x6f, 0x6e, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,\n\t0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64,\n\t0x65, 0x73, 0x63, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70,\n\t0x65, 0x22, 0xdd, 0x01, 0x0a, 0x07, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2f, 0x0a,\n\t0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x79,\n\t0x70, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x36,\n\t0x0a, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65,\n\t0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2f, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65,\n\t0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x70, 0x12, 0x1a, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61,\n\t0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28,\n\t0x09, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70,\n\t0x65, 0x22, 0x68, 0x0a, 0x0a, 0x43, 0x45, 0x4c, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65, 0x12,\n\t0x2a, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43,\n\t0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76,\n\t0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70,\n\t0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c,\n\t0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x63, 0x0a, 0x0b, 0x43,\n\t0x45, 0x4c, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12,\n\t0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65,\n\t0x73, 0x63, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65,\n\t0x2a, 0x5e, 0x0a, 0x08, 0x54, 0x79, 0x70, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x0b, 0x0a, 0x07,\n\t0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52,\n\t0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x4f, 0x4f, 0x4c, 0x10, 0x02, 0x12,\n\t0x09, 0x0a, 0x05, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x49,\n\t0x4e, 0x54, 0x36, 0x34, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45,\n\t0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x06,\n\t0x3a, 0x4c, 0x0a, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x46, 0x69, 0x6c, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x3a, 0x58,\n\t0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52,\n\t0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x3a, 0x54, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a, 0x58,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52,\n\t0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x50, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c,\n\t0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52,\n\t0x75, 0x6c, 0x65, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x3a, 0x4c, 0x0a, 0x04, 0x65, 0x6e,\n\t0x75, 0x6d, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x75,\n\t0x6c, 0x65, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x3a, 0x61, 0x0a, 0x0a, 0x65, 0x6e, 0x75, 0x6d,\n\t0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c,\n\t0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x1e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x75, 0x6c, 0x65,\n\t0x52, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x50, 0x0a, 0x05, 0x6f,\n\t0x6e, 0x65, 0x6f, 0x66, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70,\n\t0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x6e, 0x65,\n\t0x6f, 0x66, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x42, 0x3f, 0x5a,\n\t0x3d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x65, 0x72, 0x63,\n\t0x61, 0x72, 0x69, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x3b, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x06,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_grpc_federation_federation_proto_rawDescOnce sync.Once\n\tfile_grpc_federation_federation_proto_rawDescData = file_grpc_federation_federation_proto_rawDesc\n)\n\nfunc file_grpc_federation_federation_proto_rawDescGZIP() []byte {\n\tfile_grpc_federation_federation_proto_rawDescOnce.Do(func() {\n\t\tfile_grpc_federation_federation_proto_rawDescData = protoimpl.X.CompressGZIP(file_grpc_federation_federation_proto_rawDescData)\n\t})\n\treturn file_grpc_federation_federation_proto_rawDescData\n}\n\nvar file_grpc_federation_federation_proto_enumTypes = make([]protoimpl.EnumInfo, 2)\nvar file_grpc_federation_federation_proto_msgTypes = make([]protoimpl.MessageInfo, 48)\nvar file_grpc_federation_federation_proto_goTypes = []interface{}{\n\t(TypeKind)(0),                          // 0: grpc.federation.TypeKind\n\t(GRPCError_LogLevel)(0),                // 1: grpc.federation.GRPCError.LogLevel\n\t(*FileRule)(nil),                       // 2: grpc.federation.FileRule\n\t(*EnumRule)(nil),                       // 3: grpc.federation.EnumRule\n\t(*EnumValueRule)(nil),                  // 4: grpc.federation.EnumValueRule\n\t(*EnumValueAttribute)(nil),             // 5: grpc.federation.EnumValueAttribute\n\t(*OneofRule)(nil),                      // 6: grpc.federation.OneofRule\n\t(*ServiceRule)(nil),                    // 7: grpc.federation.ServiceRule\n\t(*Env)(nil),                            // 8: grpc.federation.Env\n\t(*ServiceVariable)(nil),                // 9: grpc.federation.ServiceVariable\n\t(*ServiceVariableValidationExpr)(nil),  // 10: grpc.federation.ServiceVariableValidationExpr\n\t(*EnvVar)(nil),                         // 11: grpc.federation.EnvVar\n\t(*EnvType)(nil),                        // 12: grpc.federation.EnvType\n\t(*EnvMapType)(nil),                     // 13: grpc.federation.EnvMapType\n\t(*EnvVarOption)(nil),                   // 14: grpc.federation.EnvVarOption\n\t(*MethodRule)(nil),                     // 15: grpc.federation.MethodRule\n\t(*MessageRule)(nil),                    // 16: grpc.federation.MessageRule\n\t(*VariableDefinition)(nil),             // 17: grpc.federation.VariableDefinition\n\t(*MapExpr)(nil),                        // 18: grpc.federation.MapExpr\n\t(*Iterator)(nil),                       // 19: grpc.federation.Iterator\n\t(*MessageExpr)(nil),                    // 20: grpc.federation.MessageExpr\n\t(*EnumExpr)(nil),                       // 21: grpc.federation.EnumExpr\n\t(*CallExpr)(nil),                       // 22: grpc.federation.CallExpr\n\t(*SwitchExpr)(nil),                     // 23: grpc.federation.SwitchExpr\n\t(*SwitchCaseExpr)(nil),                 // 24: grpc.federation.SwitchCaseExpr\n\t(*SwitchDefaultExpr)(nil),              // 25: grpc.federation.SwitchDefaultExpr\n\t(*GRPCError)(nil),                      // 26: grpc.federation.GRPCError\n\t(*GRPCErrorDetail)(nil),                // 27: grpc.federation.GRPCErrorDetail\n\t(*GRPCCallOption)(nil),                 // 28: grpc.federation.GRPCCallOption\n\t(*ValidationExpr)(nil),                 // 29: grpc.federation.ValidationExpr\n\t(*RetryPolicy)(nil),                    // 30: grpc.federation.RetryPolicy\n\t(*RetryPolicyConstant)(nil),            // 31: grpc.federation.RetryPolicyConstant\n\t(*RetryPolicyExponential)(nil),         // 32: grpc.federation.RetryPolicyExponential\n\t(*MethodRequest)(nil),                  // 33: grpc.federation.MethodRequest\n\t(*MethodResponse)(nil),                 // 34: grpc.federation.MethodResponse\n\t(*Argument)(nil),                       // 35: grpc.federation.Argument\n\t(*FieldRule)(nil),                      // 36: grpc.federation.FieldRule\n\t(*FieldOneof)(nil),                     // 37: grpc.federation.FieldOneof\n\t(*CELPlugin)(nil),                      // 38: grpc.federation.CELPlugin\n\t(*CELPluginExport)(nil),                // 39: grpc.federation.CELPluginExport\n\t(*CELPluginCapability)(nil),            // 40: grpc.federation.CELPluginCapability\n\t(*CELPluginEnvCapability)(nil),         // 41: grpc.federation.CELPluginEnvCapability\n\t(*CELPluginFileSystemCapability)(nil),  // 42: grpc.federation.CELPluginFileSystemCapability\n\t(*CELPluginNetworkCapability)(nil),     // 43: grpc.federation.CELPluginNetworkCapability\n\t(*CELFunction)(nil),                    // 44: grpc.federation.CELFunction\n\t(*CELReceiverType)(nil),                // 45: grpc.federation.CELReceiverType\n\t(*CELFunctionArgument)(nil),            // 46: grpc.federation.CELFunctionArgument\n\t(*CELType)(nil),                        // 47: grpc.federation.CELType\n\t(*CELMapType)(nil),                     // 48: grpc.federation.CELMapType\n\t(*CELVariable)(nil),                    // 49: grpc.federation.CELVariable\n\t(code.Code)(0),                         // 50: google.rpc.Code\n\t(*errdetails.ErrorInfo)(nil),           // 51: google.rpc.ErrorInfo\n\t(*errdetails.RetryInfo)(nil),           // 52: google.rpc.RetryInfo\n\t(*errdetails.DebugInfo)(nil),           // 53: google.rpc.DebugInfo\n\t(*errdetails.QuotaFailure)(nil),        // 54: google.rpc.QuotaFailure\n\t(*errdetails.PreconditionFailure)(nil), // 55: google.rpc.PreconditionFailure\n\t(*errdetails.BadRequest)(nil),          // 56: google.rpc.BadRequest\n\t(*errdetails.RequestInfo)(nil),         // 57: google.rpc.RequestInfo\n\t(*errdetails.ResourceInfo)(nil),        // 58: google.rpc.ResourceInfo\n\t(*errdetails.Help)(nil),                // 59: google.rpc.Help\n\t(*errdetails.LocalizedMessage)(nil),    // 60: google.rpc.LocalizedMessage\n\t(*descriptorpb.FileOptions)(nil),       // 61: google.protobuf.FileOptions\n\t(*descriptorpb.ServiceOptions)(nil),    // 62: google.protobuf.ServiceOptions\n\t(*descriptorpb.MethodOptions)(nil),     // 63: google.protobuf.MethodOptions\n\t(*descriptorpb.MessageOptions)(nil),    // 64: google.protobuf.MessageOptions\n\t(*descriptorpb.FieldOptions)(nil),      // 65: google.protobuf.FieldOptions\n\t(*descriptorpb.EnumOptions)(nil),       // 66: google.protobuf.EnumOptions\n\t(*descriptorpb.EnumValueOptions)(nil),  // 67: google.protobuf.EnumValueOptions\n\t(*descriptorpb.OneofOptions)(nil),      // 68: google.protobuf.OneofOptions\n}\nvar file_grpc_federation_federation_proto_depIdxs = []int32{\n\t38, // 0: grpc.federation.FileRule.plugin:type_name -> grpc.federation.CELPlugin\n\t5,  // 1: grpc.federation.EnumValueRule.attr:type_name -> grpc.federation.EnumValueAttribute\n\t8,  // 2: grpc.federation.ServiceRule.env:type_name -> grpc.federation.Env\n\t9,  // 3: grpc.federation.ServiceRule.var:type_name -> grpc.federation.ServiceVariable\n\t11, // 4: grpc.federation.Env.var:type_name -> grpc.federation.EnvVar\n\t18, // 5: grpc.federation.ServiceVariable.map:type_name -> grpc.federation.MapExpr\n\t20, // 6: grpc.federation.ServiceVariable.message:type_name -> grpc.federation.MessageExpr\n\t10, // 7: grpc.federation.ServiceVariable.validation:type_name -> grpc.federation.ServiceVariableValidationExpr\n\t21, // 8: grpc.federation.ServiceVariable.enum:type_name -> grpc.federation.EnumExpr\n\t23, // 9: grpc.federation.ServiceVariable.switch:type_name -> grpc.federation.SwitchExpr\n\t12, // 10: grpc.federation.EnvVar.type:type_name -> grpc.federation.EnvType\n\t14, // 11: grpc.federation.EnvVar.option:type_name -> grpc.federation.EnvVarOption\n\t0,  // 12: grpc.federation.EnvType.kind:type_name -> grpc.federation.TypeKind\n\t12, // 13: grpc.federation.EnvType.repeated:type_name -> grpc.federation.EnvType\n\t13, // 14: grpc.federation.EnvType.map:type_name -> grpc.federation.EnvMapType\n\t12, // 15: grpc.federation.EnvMapType.key:type_name -> grpc.federation.EnvType\n\t12, // 16: grpc.federation.EnvMapType.value:type_name -> grpc.federation.EnvType\n\t17, // 17: grpc.federation.MessageRule.def:type_name -> grpc.federation.VariableDefinition\n\t18, // 18: grpc.federation.VariableDefinition.map:type_name -> grpc.federation.MapExpr\n\t20, // 19: grpc.federation.VariableDefinition.message:type_name -> grpc.federation.MessageExpr\n\t22, // 20: grpc.federation.VariableDefinition.call:type_name -> grpc.federation.CallExpr\n\t29, // 21: grpc.federation.VariableDefinition.validation:type_name -> grpc.federation.ValidationExpr\n\t21, // 22: grpc.federation.VariableDefinition.enum:type_name -> grpc.federation.EnumExpr\n\t23, // 23: grpc.federation.VariableDefinition.switch:type_name -> grpc.federation.SwitchExpr\n\t19, // 24: grpc.federation.MapExpr.iterator:type_name -> grpc.federation.Iterator\n\t20, // 25: grpc.federation.MapExpr.message:type_name -> grpc.federation.MessageExpr\n\t21, // 26: grpc.federation.MapExpr.enum:type_name -> grpc.federation.EnumExpr\n\t35, // 27: grpc.federation.MessageExpr.args:type_name -> grpc.federation.Argument\n\t33, // 28: grpc.federation.CallExpr.request:type_name -> grpc.federation.MethodRequest\n\t30, // 29: grpc.federation.CallExpr.retry:type_name -> grpc.federation.RetryPolicy\n\t26, // 30: grpc.federation.CallExpr.error:type_name -> grpc.federation.GRPCError\n\t28, // 31: grpc.federation.CallExpr.option:type_name -> grpc.federation.GRPCCallOption\n\t24, // 32: grpc.federation.SwitchExpr.case:type_name -> grpc.federation.SwitchCaseExpr\n\t25, // 33: grpc.federation.SwitchExpr.default:type_name -> grpc.federation.SwitchDefaultExpr\n\t17, // 34: grpc.federation.SwitchCaseExpr.def:type_name -> grpc.federation.VariableDefinition\n\t17, // 35: grpc.federation.SwitchDefaultExpr.def:type_name -> grpc.federation.VariableDefinition\n\t17, // 36: grpc.federation.GRPCError.def:type_name -> grpc.federation.VariableDefinition\n\t50, // 37: grpc.federation.GRPCError.code:type_name -> google.rpc.Code\n\t27, // 38: grpc.federation.GRPCError.details:type_name -> grpc.federation.GRPCErrorDetail\n\t1,  // 39: grpc.federation.GRPCError.log_level:type_name -> grpc.federation.GRPCError.LogLevel\n\t17, // 40: grpc.federation.GRPCErrorDetail.def:type_name -> grpc.federation.VariableDefinition\n\t20, // 41: grpc.federation.GRPCErrorDetail.message:type_name -> grpc.federation.MessageExpr\n\t51, // 42: grpc.federation.GRPCErrorDetail.error_info:type_name -> google.rpc.ErrorInfo\n\t52, // 43: grpc.federation.GRPCErrorDetail.retry_info:type_name -> google.rpc.RetryInfo\n\t53, // 44: grpc.federation.GRPCErrorDetail.debug_info:type_name -> google.rpc.DebugInfo\n\t54, // 45: grpc.federation.GRPCErrorDetail.quota_failure:type_name -> google.rpc.QuotaFailure\n\t55, // 46: grpc.federation.GRPCErrorDetail.precondition_failure:type_name -> google.rpc.PreconditionFailure\n\t56, // 47: grpc.federation.GRPCErrorDetail.bad_request:type_name -> google.rpc.BadRequest\n\t57, // 48: grpc.federation.GRPCErrorDetail.request_info:type_name -> google.rpc.RequestInfo\n\t58, // 49: grpc.federation.GRPCErrorDetail.resource_info:type_name -> google.rpc.ResourceInfo\n\t59, // 50: grpc.federation.GRPCErrorDetail.help:type_name -> google.rpc.Help\n\t60, // 51: grpc.federation.GRPCErrorDetail.localized_message:type_name -> google.rpc.LocalizedMessage\n\t26, // 52: grpc.federation.ValidationExpr.error:type_name -> grpc.federation.GRPCError\n\t31, // 53: grpc.federation.RetryPolicy.constant:type_name -> grpc.federation.RetryPolicyConstant\n\t32, // 54: grpc.federation.RetryPolicy.exponential:type_name -> grpc.federation.RetryPolicyExponential\n\t37, // 55: grpc.federation.FieldRule.oneof:type_name -> grpc.federation.FieldOneof\n\t14, // 56: grpc.federation.FieldRule.env:type_name -> grpc.federation.EnvVarOption\n\t17, // 57: grpc.federation.FieldOneof.def:type_name -> grpc.federation.VariableDefinition\n\t39, // 58: grpc.federation.CELPlugin.export:type_name -> grpc.federation.CELPluginExport\n\t45, // 59: grpc.federation.CELPluginExport.types:type_name -> grpc.federation.CELReceiverType\n\t44, // 60: grpc.federation.CELPluginExport.functions:type_name -> grpc.federation.CELFunction\n\t49, // 61: grpc.federation.CELPluginExport.variables:type_name -> grpc.federation.CELVariable\n\t40, // 62: grpc.federation.CELPluginExport.capability:type_name -> grpc.federation.CELPluginCapability\n\t41, // 63: grpc.federation.CELPluginCapability.env:type_name -> grpc.federation.CELPluginEnvCapability\n\t42, // 64: grpc.federation.CELPluginCapability.file_system:type_name -> grpc.federation.CELPluginFileSystemCapability\n\t43, // 65: grpc.federation.CELPluginCapability.network:type_name -> grpc.federation.CELPluginNetworkCapability\n\t46, // 66: grpc.federation.CELFunction.args:type_name -> grpc.federation.CELFunctionArgument\n\t47, // 67: grpc.federation.CELFunction.return:type_name -> grpc.federation.CELType\n\t44, // 68: grpc.federation.CELReceiverType.methods:type_name -> grpc.federation.CELFunction\n\t47, // 69: grpc.federation.CELFunctionArgument.type:type_name -> grpc.federation.CELType\n\t0,  // 70: grpc.federation.CELType.kind:type_name -> grpc.federation.TypeKind\n\t47, // 71: grpc.federation.CELType.repeated:type_name -> grpc.federation.CELType\n\t48, // 72: grpc.federation.CELType.map:type_name -> grpc.federation.CELMapType\n\t47, // 73: grpc.federation.CELMapType.key:type_name -> grpc.federation.CELType\n\t47, // 74: grpc.federation.CELMapType.value:type_name -> grpc.federation.CELType\n\t47, // 75: grpc.federation.CELVariable.type:type_name -> grpc.federation.CELType\n\t61, // 76: grpc.federation.file:extendee -> google.protobuf.FileOptions\n\t62, // 77: grpc.federation.service:extendee -> google.protobuf.ServiceOptions\n\t63, // 78: grpc.federation.method:extendee -> google.protobuf.MethodOptions\n\t64, // 79: grpc.federation.message:extendee -> google.protobuf.MessageOptions\n\t65, // 80: grpc.federation.field:extendee -> google.protobuf.FieldOptions\n\t66, // 81: grpc.federation.enum:extendee -> google.protobuf.EnumOptions\n\t67, // 82: grpc.federation.enum_value:extendee -> google.protobuf.EnumValueOptions\n\t68, // 83: grpc.federation.oneof:extendee -> google.protobuf.OneofOptions\n\t2,  // 84: grpc.federation.file:type_name -> grpc.federation.FileRule\n\t7,  // 85: grpc.federation.service:type_name -> grpc.federation.ServiceRule\n\t15, // 86: grpc.federation.method:type_name -> grpc.federation.MethodRule\n\t16, // 87: grpc.federation.message:type_name -> grpc.federation.MessageRule\n\t36, // 88: grpc.federation.field:type_name -> grpc.federation.FieldRule\n\t3,  // 89: grpc.federation.enum:type_name -> grpc.federation.EnumRule\n\t4,  // 90: grpc.federation.enum_value:type_name -> grpc.federation.EnumValueRule\n\t6,  // 91: grpc.federation.oneof:type_name -> grpc.federation.OneofRule\n\t92, // [92:92] is the sub-list for method output_type\n\t92, // [92:92] is the sub-list for method input_type\n\t84, // [84:92] is the sub-list for extension type_name\n\t76, // [76:84] is the sub-list for extension extendee\n\t0,  // [0:76] is the sub-list for field type_name\n}\n\nfunc init() { file_grpc_federation_federation_proto_init() }\nfunc file_grpc_federation_federation_proto_init() {\n\tif File_grpc_federation_federation_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_grpc_federation_federation_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*FileRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumValueRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumValueAttribute); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*OneofRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Env); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceVariable); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceVariableValidationExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvVar); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvMapType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvVarOption); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MethodRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MessageRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*VariableDefinition); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MapExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Iterator); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MessageExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CallExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SwitchExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SwitchCaseExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SwitchDefaultExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GRPCError); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GRPCErrorDetail); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GRPCCallOption); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ValidationExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RetryPolicy); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RetryPolicyConstant); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RetryPolicyExponential); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MethodRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MethodResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Argument); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*FieldRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*FieldOneof); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPlugin); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginExport); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginEnvCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginFileSystemCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPluginNetworkCapability); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELFunction); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELReceiverType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELFunctionArgument); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELMapType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_federation_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELVariable); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[2].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[7].OneofWrappers = []interface{}{\n\t\t(*ServiceVariable_By)(nil),\n\t\t(*ServiceVariable_Map)(nil),\n\t\t(*ServiceVariable_Message)(nil),\n\t\t(*ServiceVariable_Validation)(nil),\n\t\t(*ServiceVariable_Enum)(nil),\n\t\t(*ServiceVariable_Switch)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[9].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[10].OneofWrappers = []interface{}{\n\t\t(*EnvType_Kind)(nil),\n\t\t(*EnvType_Repeated)(nil),\n\t\t(*EnvType_Map)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[12].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[13].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[14].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[15].OneofWrappers = []interface{}{\n\t\t(*VariableDefinition_By)(nil),\n\t\t(*VariableDefinition_Map)(nil),\n\t\t(*VariableDefinition_Message)(nil),\n\t\t(*VariableDefinition_Call)(nil),\n\t\t(*VariableDefinition_Validation)(nil),\n\t\t(*VariableDefinition_Enum)(nil),\n\t\t(*VariableDefinition_Switch)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[16].OneofWrappers = []interface{}{\n\t\t(*MapExpr_By)(nil),\n\t\t(*MapExpr_Message)(nil),\n\t\t(*MapExpr_Enum)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[20].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[22].OneofWrappers = []interface{}{\n\t\t(*SwitchCaseExpr_By)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[23].OneofWrappers = []interface{}{\n\t\t(*SwitchDefaultExpr_By)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[24].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[26].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[27].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[28].OneofWrappers = []interface{}{\n\t\t(*RetryPolicy_Constant)(nil),\n\t\t(*RetryPolicy_Exponential)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[29].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[30].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[31].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[32].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[33].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[34].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[35].OneofWrappers = []interface{}{\n\t\t(*FieldOneof_If)(nil),\n\t\t(*FieldOneof_Default)(nil),\n\t}\n\tfile_grpc_federation_federation_proto_msgTypes[38].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_federation_proto_msgTypes[45].OneofWrappers = []interface{}{\n\t\t(*CELType_Kind)(nil),\n\t\t(*CELType_Repeated)(nil),\n\t\t(*CELType_Map)(nil),\n\t\t(*CELType_Message)(nil),\n\t\t(*CELType_Enum)(nil),\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_grpc_federation_federation_proto_rawDesc,\n\t\t\tNumEnums:      2,\n\t\t\tNumMessages:   48,\n\t\t\tNumExtensions: 8,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_grpc_federation_federation_proto_goTypes,\n\t\tDependencyIndexes: file_grpc_federation_federation_proto_depIdxs,\n\t\tEnumInfos:         file_grpc_federation_federation_proto_enumTypes,\n\t\tMessageInfos:      file_grpc_federation_federation_proto_msgTypes,\n\t\tExtensionInfos:    file_grpc_federation_federation_proto_extTypes,\n\t}.Build()\n\tFile_grpc_federation_federation_proto = out.File\n\tfile_grpc_federation_federation_proto_rawDesc = nil\n\tfile_grpc_federation_federation_proto_goTypes = nil\n\tfile_grpc_federation_federation_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "grpc/federation/generator/decode.go",
    "content": "package generator\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\n\t\"google.golang.org/protobuf/proto\"\n\n\t\"github.com/mercari/grpc-federation/grpc/federation/generator/plugin\"\n\t\"github.com/mercari/grpc-federation/resolver\"\n\t\"github.com/mercari/grpc-federation/types\"\n)\n\nfunc ToCodeGeneratorRequest(r io.Reader) (*CodeGeneratorRequest, error) {\n\tb, err := io.ReadAll(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvar v plugin.CodeGeneratorRequest\n\tif err := proto.Unmarshal(b, &v); err != nil {\n\t\treturn nil, err\n\t}\n\treturn newDecoder(v.GetReference()).toCodeGeneratorRequest(&v)\n}\n\ntype decoder struct {\n\tref            *plugin.Reference\n\tfileMap        map[string]*resolver.File\n\tpkgMap         map[string]*resolver.Package\n\tenumMap        map[string]*resolver.Enum\n\tenumValueMap   map[string]*resolver.EnumValue\n\tmsgMap         map[string]*resolver.Message\n\tfieldMap       map[string]*resolver.Field\n\toneofMap       map[string]*resolver.Oneof\n\tsvcMap         map[string]*resolver.Service\n\tmtdMap         map[string]*resolver.Method\n\tcelPluginMap   map[string]*resolver.CELPlugin\n\tgraphMap       map[string]*resolver.MessageDependencyGraph\n\tgraphNodeMap   map[string]*resolver.MessageDependencyGraphNode\n\tvarDefMap      map[string]*resolver.VariableDefinition\n\tvarDefGroupMap map[string]resolver.VariableDefinitionGroup\n}\n\nfunc newDecoder(ref *plugin.Reference) *decoder {\n\treturn &decoder{\n\t\tref:            ref,\n\t\tfileMap:        make(map[string]*resolver.File),\n\t\tpkgMap:         make(map[string]*resolver.Package),\n\t\tenumMap:        make(map[string]*resolver.Enum),\n\t\tenumValueMap:   make(map[string]*resolver.EnumValue),\n\t\tmsgMap:         make(map[string]*resolver.Message),\n\t\tfieldMap:       make(map[string]*resolver.Field),\n\t\toneofMap:       make(map[string]*resolver.Oneof),\n\t\tsvcMap:         make(map[string]*resolver.Service),\n\t\tmtdMap:         make(map[string]*resolver.Method),\n\t\tcelPluginMap:   make(map[string]*resolver.CELPlugin),\n\t\tgraphMap:       make(map[string]*resolver.MessageDependencyGraph),\n\t\tgraphNodeMap:   make(map[string]*resolver.MessageDependencyGraphNode),\n\t\tvarDefMap:      make(map[string]*resolver.VariableDefinition),\n\t\tvarDefGroupMap: make(map[string]resolver.VariableDefinitionGroup),\n\t}\n}\n\nfunc (d *decoder) toCodeGeneratorRequest(req *plugin.CodeGeneratorRequest) (*CodeGeneratorRequest, error) {\n\tgrpcFederationFiles, err := d.toFiles(req.GetGrpcFederationFileIds())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &CodeGeneratorRequest{\n\t\tProtoPath:            req.GetProtoPath(),\n\t\tOutputFilePathConfig: d.toOutputFilePathConfig(req.GetOutputFilePathConfig()),\n\t\tFiles:                req.GetFiles(),\n\t\tGRPCFederationFiles:  grpcFederationFiles,\n\t}, nil\n}\n\nfunc (d *decoder) toOutputFilePathConfig(cfg *plugin.OutputFilePathConfig) resolver.OutputFilePathConfig {\n\tvar mode resolver.OutputFilePathMode\n\tswitch cfg.GetMode() {\n\tcase plugin.OutputFilePathMode_OUTPUT_FILE_PATH_MODE_IMPORT:\n\t\tmode = resolver.ImportMode\n\tcase plugin.OutputFilePathMode_OUTPUT_FILE_PATH_MODE_MODULE_PREFIX:\n\t\tmode = resolver.ModulePrefixMode\n\tcase plugin.OutputFilePathMode_OUTPUT_FILE_PATH_MODE_SOURCE_RELATIVE:\n\t\tmode = resolver.SourceRelativeMode\n\t}\n\treturn resolver.OutputFilePathConfig{\n\t\tMode:        mode,\n\t\tPrefix:      cfg.GetPrefix(),\n\t\tFilePath:    cfg.GetFilePath(),\n\t\tImportPaths: cfg.GetImportPaths(),\n\t}\n}\n\nfunc (d *decoder) toFiles(ids []string) ([]*resolver.File, error) {\n\tif ids == nil {\n\t\treturn nil, nil\n\t}\n\tret := make([]*resolver.File, 0, len(ids))\n\tfor _, id := range ids {\n\t\tfile, err := d.toFile(id)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret = append(ret, file)\n\t}\n\treturn ret, nil\n}\n\nfunc (d *decoder) toFile(id string) (*resolver.File, error) {\n\tif id == \"\" {\n\t\treturn nil, nil\n\t}\n\tif file, exists := d.fileMap[id]; exists {\n\t\treturn file, nil\n\t}\n\tret := &resolver.File{}\n\td.fileMap[id] = ret\n\n\tfile, exists := d.ref.FileMap[id]\n\tif !exists {\n\t\treturn nil, fmt.Errorf(\"failed to find file reference: %s\", id)\n\t}\n\tpkg, err := d.toPackage(file.GetPackage())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tsvcs, err := d.toServices(file.GetServiceIds())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tmsgs, err := d.toMessages(file.GetMessageIds())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tenums, err := d.toEnums(file.GetEnumIds())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcelPlugins, err := d.toCELPlugins(file.GetCelPluginIds())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\timportFiles, err := d.toFiles(file.GetImportFileIds())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret.Name = file.GetName()\n\tret.Package = pkg\n\tret.GoPackage = d.toGoPackage(file.GetGoPackage())\n\tret.Services = svcs\n\tret.Messages = msgs\n\tret.Enums = enums\n\tret.CELPlugins = celPlugins\n\tret.ImportFiles = importFiles\n\treturn ret, nil\n}\n\nfunc (d *decoder) toPackage(pkg *plugin.Package) (*resolver.Package, error) {\n\tif pkg == nil {\n\t\treturn nil, nil\n\t}\n\tfiles, err := d.toFiles(pkg.GetFileIds())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &resolver.Package{\n\t\tName:  pkg.GetName(),\n\t\tFiles: files,\n\t}, nil\n}\n\nfunc (d *decoder) toGoPackage(pkg *plugin.GoPackage) *resolver.GoPackage {\n\tif pkg == nil {\n\t\treturn nil\n\t}\n\treturn &resolver.GoPackage{\n\t\tName:       pkg.GetName(),\n\t\tImportPath: pkg.GetImportPath(),\n\t\tAliasName:  pkg.GetAliasName(),\n\t}\n}\n\nfunc (d *decoder) toServices(ids []string) ([]*resolver.Service, error) {\n\tif ids == nil {\n\t\treturn nil, nil\n\t}\n\tret := make([]*resolver.Service, 0, len(ids))\n\tfor _, id := range ids {\n\t\tsvc, err := d.toService(id)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif svc == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, svc)\n\t}\n\treturn ret, nil\n}\n\nfunc (d *decoder) toService(id string) (*resolver.Service, error) {\n\tif id == \"\" {\n\t\treturn nil, nil\n\t}\n\tif svc, exists := d.svcMap[id]; exists {\n\t\treturn svc, nil\n\t}\n\tsvc, exists := d.ref.ServiceMap[id]\n\tif !exists {\n\t\treturn nil, fmt.Errorf(\"failed to find service reference: %s\", id)\n\t}\n\tret := &resolver.Service{Name: svc.GetName()}\n\td.svcMap[id] = ret\n\n\tmethods, err := d.toMethods(svc.GetMethodIds())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tfile, err := d.toFile(svc.GetFileId())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tmsgs, err := d.toMessages(svc.GetMessageIds())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tmsgArgs, err := d.toMessages(svc.GetMessageArgIds())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcelPlugins, err := d.toCELPlugins(svc.GetCelPluginIds())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\trule, err := d.toServiceRule(svc.GetRule())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret.Methods = methods\n\tret.File = file\n\tret.Messages = msgs\n\tret.MessageArgs = msgArgs\n\tret.CELPlugins = celPlugins\n\tret.Rule = rule\n\treturn ret, nil\n}\n\nfunc (d *decoder) toServiceRule(rule *plugin.ServiceRule) (*resolver.ServiceRule, error) {\n\tif rule == nil {\n\t\treturn nil, nil\n\t}\n\tenv, err := d.toEnv(rule.GetEnv())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvars, err := d.toServiceVariables(rule.GetVars())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &resolver.ServiceRule{\n\t\tEnv:  env,\n\t\tVars: vars,\n\t}, nil\n}\n\nfunc (d *decoder) toEnv(env *plugin.Env) (*resolver.Env, error) {\n\tif env == nil {\n\t\treturn nil, nil\n\t}\n\tvars, err := d.toEnvVars(env.GetVars())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &resolver.Env{\n\t\tVars: vars,\n\t}, nil\n}\n\nfunc (d *decoder) toEnvVars(vars []*plugin.EnvVar) ([]*resolver.EnvVar, error) {\n\tif len(vars) == 0 {\n\t\treturn nil, nil\n\t}\n\tret := make([]*resolver.EnvVar, 0, len(vars))\n\tfor _, envVar := range vars {\n\t\tv, err := d.toEnvVar(envVar)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif v == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, v)\n\t}\n\treturn ret, nil\n}\n\nfunc (d *decoder) toEnvVar(v *plugin.EnvVar) (*resolver.EnvVar, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\ttyp, err := d.toType(v.GetType())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &resolver.EnvVar{\n\t\tName:   v.GetName(),\n\t\tType:   typ,\n\t\tOption: d.toEnvVarOption(v.GetOption()),\n\t}, nil\n}\n\nfunc (d *decoder) toEnvVarOption(opt *plugin.EnvVarOption) *resolver.EnvVarOption {\n\tif opt == nil {\n\t\treturn nil\n\t}\n\treturn &resolver.EnvVarOption{\n\t\tAlternate: opt.GetAlternate(),\n\t\tDefault:   opt.GetDefault(),\n\t\tRequired:  opt.GetRequired(),\n\t\tIgnored:   opt.GetIgnored(),\n\t}\n}\n\nfunc (d *decoder) toServiceVariables(vars []*plugin.ServiceVariable) ([]*resolver.ServiceVariable, error) {\n\tif len(vars) == 0 {\n\t\treturn nil, nil\n\t}\n\tret := make([]*resolver.ServiceVariable, 0, len(vars))\n\tfor _, svcVar := range vars {\n\t\tv, err := d.toServiceVariable(svcVar)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif v == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, v)\n\t}\n\treturn ret, nil\n}\n\nfunc (d *decoder) toServiceVariable(v *plugin.ServiceVariable) (*resolver.ServiceVariable, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tret := &resolver.ServiceVariable{\n\t\tName: v.GetName(),\n\t}\n\tifValue, err := d.toCELValue(v.GetIf())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\texpr, err := d.toServiceVariableExpr(v.GetExpr())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret.If = ifValue\n\tret.Expr = expr\n\treturn ret, nil\n}\n\nfunc (d *decoder) toServiceVariableExpr(expr *plugin.ServiceVariableExpr) (*resolver.ServiceVariableExpr, error) {\n\tif expr == nil {\n\t\treturn nil, nil\n\t}\n\tret := &resolver.ServiceVariableExpr{}\n\ttyp, err := d.toType(expr.GetType())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tby, err := d.toCELValue(expr.GetBy())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tmapExpr, err := d.toMapExpr(expr.GetMap())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tmsgExpr, err := d.toMessageExpr(expr.GetMessage())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tenumExpr, err := d.toEnumExpr(expr.GetEnum())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tswitchExpr, err := d.toSwitchExpr(expr.GetSwitch())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvalidationExpr, err := d.toServiceVariableValidationExpr(expr.GetValidation())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tret.Type = typ\n\tret.By = by\n\tret.Map = mapExpr\n\tret.Message = msgExpr\n\tret.Enum = enumExpr\n\tret.Switch = switchExpr\n\tret.Validation = validationExpr\n\treturn ret, nil\n}\n\nfunc (d *decoder) toServiceVariableValidationExpr(expr *plugin.ServiceVariableValidationExpr) (*resolver.ServiceVariableValidationExpr, error) {\n\tif expr == nil {\n\t\treturn nil, nil\n\t}\n\tret := &resolver.ServiceVariableValidationExpr{}\n\tifValue, err := d.toCELValue(expr.GetIf())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tmsg, err := d.toCELValue(expr.GetMessage())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret.If = ifValue\n\tret.Message = msg\n\treturn ret, nil\n}\n\nfunc (d *decoder) toMessages(ids []string) ([]*resolver.Message, error) {\n\tif ids == nil {\n\t\treturn nil, nil\n\t}\n\tret := make([]*resolver.Message, 0, len(ids))\n\tfor _, id := range ids {\n\t\tmsg, err := d.toMessage(id)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif msg == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, msg)\n\t}\n\treturn ret, nil\n}\n\nfunc (d *decoder) toMessage(id string) (*resolver.Message, error) {\n\tif id == \"\" {\n\t\treturn nil, nil\n\t}\n\tif msg, exists := d.msgMap[id]; exists {\n\t\treturn msg, nil\n\t}\n\tmsg, exists := d.ref.MessageMap[id]\n\tif !exists {\n\t\treturn nil, fmt.Errorf(\"failed to find message reference: %s\", id)\n\t}\n\tret := &resolver.Message{\n\t\tName:       msg.GetName(),\n\t\tIsMapEntry: msg.GetIsMapEntry(),\n\t}\n\td.msgMap[id] = ret\n\n\tfile, err := d.toFile(msg.GetFileId())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tparent, err := d.toMessage(msg.GetParentMessageId())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tnestedMsgs, err := d.toMessages(msg.GetNestedMessageIds())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tenums, err := d.toEnums(msg.GetEnumIds())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tfields, err := d.toFields(msg.GetFieldIds())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\toneofs, err := d.toOneofs(msg.GetOneofIds())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\trule, err := d.toMessageRule(msg.GetRule())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret.File = file\n\tret.ParentMessage = parent\n\tret.NestedMessages = nestedMsgs\n\tret.Enums = enums\n\tret.Fields = fields\n\tret.Oneofs = oneofs\n\tret.Rule = rule\n\treturn ret, nil\n}\n\nfunc (d *decoder) toFields(ids []string) ([]*resolver.Field, error) {\n\tif ids == nil {\n\t\treturn nil, nil\n\t}\n\tret := make([]*resolver.Field, 0, len(ids))\n\tfor _, id := range ids {\n\t\tfield, err := d.toField(id)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif field == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, field)\n\t}\n\treturn ret, nil\n}\n\nfunc (d *decoder) toField(id string) (*resolver.Field, error) {\n\tif id == \"\" {\n\t\treturn nil, nil\n\t}\n\tif field, exists := d.fieldMap[id]; exists {\n\t\treturn field, nil\n\t}\n\tfield, exists := d.ref.FieldMap[id]\n\tif !exists {\n\t\treturn nil, fmt.Errorf(\"failed to find field reference: %s\", id)\n\t}\n\tret := &resolver.Field{Name: field.GetName()}\n\td.fieldMap[id] = ret\n\ttyp, err := d.toType(field.GetType())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\toneof, err := d.toOneof(field.GetOneofId())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tmsg, err := d.toMessage(field.GetMessageId())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\trule, err := d.toFieldRule(field.GetRule())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret.Type = typ\n\tret.Oneof = oneof\n\tret.Message = msg\n\tret.Rule = rule\n\treturn ret, nil\n}\n\nfunc (d *decoder) toFieldRule(rule *plugin.FieldRule) (*resolver.FieldRule, error) {\n\tif rule == nil {\n\t\treturn nil, nil\n\t}\n\tret := &resolver.FieldRule{\n\t\tCustomResolver:        rule.GetCustomResolver(),\n\t\tMessageCustomResolver: rule.GetMessageCustomResolver(),\n\t}\n\tvalue, err := d.toValue(rule.GetValue())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\taliases, err := d.toFields(rule.GetAliasIds())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tautoBindField, err := d.toAutoBindField(rule.GetAutoBindField())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tfieldOneofRule, err := d.toFieldOneofRule(rule.GetOneofRule())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret.Value = value\n\tret.Aliases = aliases\n\tret.AutoBindField = autoBindField\n\tret.Oneof = fieldOneofRule\n\treturn ret, nil\n}\n\nfunc (d *decoder) toValue(value *plugin.Value) (*resolver.Value, error) {\n\tif value == nil {\n\t\treturn nil, nil\n\t}\n\tret := &resolver.Value{Inline: value.GetInline()}\n\tcel, err := d.toCELValue(value.GetCel())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif cel == nil {\n\t\treturn nil, fmt.Errorf(\"failed to convert cel to value: %s\", value.GetCel())\n\t}\n\tret.CEL = cel\n\treturn ret, nil\n}\n\nfunc (d *decoder) toCELValues(values []*plugin.CELValue) ([]*resolver.CELValue, error) {\n\tif values == nil {\n\t\treturn nil, nil\n\t}\n\tret := make([]*resolver.CELValue, 0, len(values))\n\tfor _, value := range values {\n\t\tv, err := d.toCELValue(value)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif v == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, v)\n\t}\n\treturn ret, nil\n}\n\nfunc (d *decoder) toCELValue(value *plugin.CELValue) (*resolver.CELValue, error) {\n\tif value == nil {\n\t\treturn nil, nil\n\t}\n\tret := &resolver.CELValue{\n\t\tExpr: value.GetExpr(),\n\t}\n\tout, err := d.toType(value.GetOut())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret.Out = out\n\treturn ret, nil\n}\n\nfunc (d *decoder) toAutoBindField(field *plugin.AutoBindField) (*resolver.AutoBindField, error) {\n\tif field == nil {\n\t\treturn nil, nil\n\t}\n\tret := &resolver.AutoBindField{}\n\tdef, err := d.toVariableDefinition(field.GetVariableDefinitionId())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tf, err := d.toField(field.GetFieldId())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret.VariableDefinition = def\n\tret.Field = f\n\treturn ret, nil\n}\n\nfunc (d *decoder) toVariableDefinitionSet(set *plugin.VariableDefinitionSet) (*resolver.VariableDefinitionSet, error) {\n\tif set == nil {\n\t\treturn &resolver.VariableDefinitionSet{}, nil\n\t}\n\tdefs, err := d.toVariableDefinitions(set.GetVariableDefinitionIds())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tgroups, err := d.toVariableDefinitionGroups(set.GetVariableDefinitionGroupIds())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tgraph, err := d.toMessageDependencyGraph(set.GetDependencyGraphId())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &resolver.VariableDefinitionSet{\n\t\tDefs:   defs,\n\t\tGroups: groups,\n\t\tGraph:  graph,\n\t}, nil\n}\n\nfunc (d *decoder) toFieldOneofRule(rule *plugin.FieldOneofRule) (*resolver.FieldOneofRule, error) {\n\tif rule == nil {\n\t\treturn nil, nil\n\t}\n\tret := &resolver.FieldOneofRule{Default: rule.GetDefault()}\n\tifValue, err := d.toCELValue(rule.GetIf())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tby, err := d.toCELValue(rule.GetBy())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefSet, err := d.toVariableDefinitionSet(rule.GetDefSet())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret.If = ifValue\n\tret.By = by\n\tret.DefSet = defSet\n\treturn ret, nil\n}\n\nfunc (d *decoder) toOneofs(ids []string) ([]*resolver.Oneof, error) {\n\tif ids == nil {\n\t\treturn nil, nil\n\t}\n\tret := make([]*resolver.Oneof, 0, len(ids))\n\tfor _, id := range ids {\n\t\toneof, err := d.toOneof(id)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif oneof == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, oneof)\n\t}\n\treturn ret, nil\n}\n\nfunc (d *decoder) toOneof(id string) (*resolver.Oneof, error) {\n\tif id == \"\" {\n\t\treturn nil, nil\n\t}\n\tif oneof, exists := d.oneofMap[id]; exists {\n\t\treturn oneof, nil\n\t}\n\toneof, exists := d.ref.OneofMap[id]\n\tif !exists {\n\t\treturn nil, fmt.Errorf(\"failed to find oneof reference %s\", id)\n\t}\n\tret := &resolver.Oneof{Name: oneof.GetName()}\n\td.oneofMap[id] = ret\n\n\tmsg, err := d.toMessage(oneof.GetMessageId())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tfields, err := d.toFields(oneof.GetFieldIds())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret.Message = msg\n\tret.Fields = fields\n\treturn ret, nil\n}\n\nfunc (d *decoder) toMessageRule(rule *plugin.MessageRule) (*resolver.MessageRule, error) {\n\tif rule == nil {\n\t\treturn nil, nil\n\t}\n\tmsgArg, err := d.toMessage(rule.GetMessageArgumentId())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\taliases, err := d.toMessages(rule.GetAliasIds())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefSet, err := d.toVariableDefinitionSet(rule.GetDefSet())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &resolver.MessageRule{\n\t\tCustomResolver:  rule.GetCustomResolver(),\n\t\tMessageArgument: msgArg,\n\t\tAliases:         aliases,\n\t\tDefSet:          defSet,\n\t}, nil\n}\n\nfunc (d *decoder) toMessageDependencyGraph(id string) (*resolver.MessageDependencyGraph, error) {\n\tif id == \"\" {\n\t\treturn nil, nil\n\t}\n\tif graph, exists := d.graphMap[id]; exists {\n\t\treturn graph, nil\n\t}\n\tgraph, exists := d.ref.GraphMap[id]\n\tif !exists {\n\t\treturn nil, fmt.Errorf(\"failed to find message dependency graph reference: %s\", id)\n\t}\n\tret := &resolver.MessageDependencyGraph{}\n\td.graphMap[id] = ret\n\n\troots, err := d.toMessageDependencyGraphNodes(graph.GetRootNodeIds())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret.Roots = roots\n\treturn ret, nil\n}\n\nfunc (d *decoder) toMessageDependencyGraphNodes(ids []string) ([]*resolver.MessageDependencyGraphNode, error) {\n\tif len(ids) == 0 {\n\t\treturn nil, nil\n\t}\n\tret := make([]*resolver.MessageDependencyGraphNode, 0, len(ids))\n\tfor _, id := range ids {\n\t\tn, err := d.toMessageDependencyGraphNode(id)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif n == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, n)\n\t}\n\treturn ret, nil\n}\n\nfunc (d *decoder) toMessageDependencyGraphNode(id string) (*resolver.MessageDependencyGraphNode, error) {\n\tif id == \"\" {\n\t\treturn nil, nil\n\t}\n\tif node, exists := d.graphNodeMap[id]; exists {\n\t\treturn node, nil\n\t}\n\tnode, exists := d.ref.GraphNodeMap[id]\n\tif !exists {\n\t\treturn nil, fmt.Errorf(\"failed to find graph node reference: %s\", id)\n\t}\n\n\tret := &resolver.MessageDependencyGraphNode{\n\t\tParentMap:   make(map[*resolver.MessageDependencyGraphNode]struct{}),\n\t\tChildrenMap: make(map[*resolver.MessageDependencyGraphNode]struct{}),\n\t}\n\td.graphNodeMap[id] = ret\n\n\tchildren, err := d.toMessageDependencyGraphNodes(node.GetChildIds())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tbaseMsg, err := d.toMessage(node.GetBaseMessageId())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdef, err := d.toVariableDefinition(node.GetVariableDefinitionId())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tfor _, child := range children {\n\t\tchild.Parent = append(child.Parent, ret)\n\t\tchild.ParentMap[ret] = struct{}{}\n\t\tret.ChildrenMap[child] = struct{}{}\n\t}\n\tret.Children = children\n\tret.BaseMessage = baseMsg\n\tret.VariableDefinition = def\n\treturn ret, nil\n}\n\nfunc (d *decoder) toVariableDefinitions(ids []string) ([]*resolver.VariableDefinition, error) {\n\tif ids == nil {\n\t\treturn nil, nil\n\t}\n\tret := make([]*resolver.VariableDefinition, 0, len(ids))\n\tfor _, id := range ids {\n\t\tdef, err := d.toVariableDefinition(id)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif def == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, def)\n\t}\n\treturn ret, nil\n}\n\nfunc (d *decoder) toVariableDefinition(id string) (*resolver.VariableDefinition, error) {\n\tif id == \"\" {\n\t\treturn nil, nil\n\t}\n\tif def, exists := d.varDefMap[id]; exists {\n\t\treturn def, nil\n\t}\n\tdef, exists := d.ref.VariableDefinitionMap[id]\n\tif !exists {\n\t\treturn nil, fmt.Errorf(\"failed to find variable definition reference: %s\", id)\n\t}\n\tret := &resolver.VariableDefinition{\n\t\tIdx:      int(def.GetIndex()),\n\t\tName:     def.GetName(),\n\t\tAutoBind: def.GetAutoBind(),\n\t\tUsed:     def.GetUsed(),\n\t}\n\td.varDefMap[id] = ret\n\n\tifValue, err := d.toCELValue(def.GetIf())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\texpr, err := d.toVariableExpr(def.GetExpr())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tret.If = ifValue\n\tret.Expr = expr\n\treturn ret, nil\n}\n\nfunc (d *decoder) toVariableDefinitionGroups(ids []string) ([]resolver.VariableDefinitionGroup, error) {\n\tif ids == nil {\n\t\treturn nil, nil\n\t}\n\tret := make([]resolver.VariableDefinitionGroup, 0, len(ids))\n\tfor _, id := range ids {\n\t\tgroup, err := d.toVariableDefinitionGroup(id)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif group == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, group)\n\t}\n\treturn ret, nil\n}\n\nfunc (d *decoder) toVariableDefinitionGroup(id string) (resolver.VariableDefinitionGroup, error) {\n\tif id == \"\" {\n\t\treturn nil, nil\n\t}\n\tif group, exists := d.varDefGroupMap[id]; exists {\n\t\treturn group, nil\n\t}\n\tgroup, exists := d.ref.VariableDefinitionGroupMap[id]\n\tif !exists {\n\t\treturn nil, fmt.Errorf(\"failed to find variable definition group reference: %s\", id)\n\t}\n\tswitch {\n\tcase group.GetSequential() != nil:\n\t\tret := &resolver.SequentialVariableDefinitionGroup{}\n\t\td.varDefGroupMap[id] = ret\n\n\t\tseq := group.GetSequential()\n\t\tstart, err := d.toVariableDefinitionGroup(seq.GetStart())\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tend, err := d.toVariableDefinition(seq.GetEnd())\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret.Start = start\n\t\tret.End = end\n\t\treturn ret, nil\n\n\tcase group.GetConcurrent() != nil:\n\t\tret := &resolver.ConcurrentVariableDefinitionGroup{}\n\t\td.varDefGroupMap[id] = ret\n\n\t\tconc := group.GetConcurrent()\n\t\tstarts, err := d.toVariableDefinitionGroups(conc.GetStarts())\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tend, err := d.toVariableDefinition(conc.GetEnd())\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret.Starts = starts\n\t\tret.End = end\n\n\t\treturn ret, nil\n\t}\n\treturn nil, fmt.Errorf(\"unexpected variable definition group type\")\n}\n\nfunc (d *decoder) toVariableExpr(expr *plugin.VariableExpr) (*resolver.VariableExpr, error) {\n\tif expr == nil {\n\t\treturn nil, nil\n\t}\n\tret := &resolver.VariableExpr{}\n\ttyp, err := d.toType(expr.GetType())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tby, err := d.toCELValue(expr.GetBy())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tmapExpr, err := d.toMapExpr(expr.GetMap())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcallExpr, err := d.toCallExpr(expr.GetCall())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tmsgExpr, err := d.toMessageExpr(expr.GetMessage())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tenumExpr, err := d.toEnumExpr(expr.GetEnum())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tswitchExpr, err := d.toSwitchExpr(expr.GetSwitch())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvalidationExpr, err := d.toValidationExpr(expr.GetValidation())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tret.Type = typ\n\tret.By = by\n\tret.Map = mapExpr\n\tret.Call = callExpr\n\tret.Message = msgExpr\n\tret.Enum = enumExpr\n\tret.Switch = switchExpr\n\tret.Validation = validationExpr\n\treturn ret, nil\n}\n\nfunc (d *decoder) toMapExpr(expr *plugin.MapExpr) (*resolver.MapExpr, error) {\n\tif expr == nil {\n\t\treturn nil, nil\n\t}\n\tret := &resolver.MapExpr{}\n\n\titer, err := d.toIterator(expr.GetIterator())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\titerExpr, err := d.toMapIteratorExpr(expr.GetExpr())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret.Iterator = iter\n\tret.Expr = iterExpr\n\treturn ret, nil\n}\n\nfunc (d *decoder) toIterator(iter *plugin.Iterator) (*resolver.Iterator, error) {\n\tif iter == nil {\n\t\treturn nil, nil\n\t}\n\tret := &resolver.Iterator{Name: iter.GetName()}\n\n\tsrc, err := d.toVariableDefinition(iter.GetSourceId())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tret.Source = src\n\treturn ret, nil\n}\n\nfunc (d *decoder) toMapIteratorExpr(expr *plugin.MapIteratorExpr) (*resolver.MapIteratorExpr, error) {\n\tif expr == nil {\n\t\treturn nil, nil\n\t}\n\tret := &resolver.MapIteratorExpr{}\n\n\ttyp, err := d.toType(expr.GetType())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tby, err := d.toCELValue(expr.GetBy())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tmsg, err := d.toMessageExpr(expr.GetMessage())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tenum, err := d.toEnumExpr(expr.GetEnum())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tret.Type = typ\n\tret.By = by\n\tret.Message = msg\n\tret.Enum = enum\n\treturn ret, nil\n}\n\nfunc (d *decoder) toCallExpr(expr *plugin.CallExpr) (*resolver.CallExpr, error) {\n\tif expr == nil {\n\t\treturn nil, nil\n\t}\n\tret := &resolver.CallExpr{}\n\n\tmtd, err := d.toMethod(expr.GetMethodId())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := d.toRequest(expr.GetRequest())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tretry, err := d.toRetryPolicy(expr.GetRetry())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif expr.Timeout != nil {\n\t\ttimeout := expr.GetTimeout().AsDuration()\n\t\tret.Timeout = &timeout\n\t}\n\terrs, err := d.toGRPCErrors(expr.GetErrors())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tmd, err := d.toCELValue(expr.Metadata)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\topt, err := d.toGRPCCallOption(expr.Option)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret.Method = mtd\n\tret.Request = req\n\tret.Retry = retry\n\tret.Errors = errs\n\tret.Metadata = md\n\tret.Option = opt\n\treturn ret, nil\n}\n\nfunc (d *decoder) toRequest(req *plugin.Request) (*resolver.Request, error) {\n\tif req == nil {\n\t\treturn nil, nil\n\t}\n\tret := &resolver.Request{}\n\n\targs, err := d.toArgs(req.GetArgs())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\ttyp, err := d.toMessage(req.GetTypeId())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret.Args = args\n\tret.Type = typ\n\treturn ret, nil\n}\n\nfunc (d *decoder) toArgs(args []*plugin.Argument) ([]*resolver.Argument, error) {\n\tret := make([]*resolver.Argument, 0, len(args))\n\tfor _, arg := range args {\n\t\ta, err := d.toArg(arg)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif a == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, a)\n\t}\n\treturn ret, nil\n}\n\nfunc (d *decoder) toArg(arg *plugin.Argument) (*resolver.Argument, error) {\n\tif arg == nil {\n\t\treturn nil, nil\n\t}\n\tret := &resolver.Argument{\n\t\tName: arg.GetName(),\n\t}\n\n\ttyp, err := d.toType(arg.GetType())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvalue, err := d.toValue(arg.GetValue())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tifValue, err := d.toCELValue(arg.GetIf())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tret.Type = typ\n\tret.Value = value\n\tret.If = ifValue\n\treturn ret, nil\n}\n\nfunc (d *decoder) toRetryPolicy(retry *plugin.RetryPolicy) (*resolver.RetryPolicy, error) {\n\tif retry == nil {\n\t\treturn nil, nil\n\t}\n\tret := &resolver.RetryPolicy{}\n\tifValue, err := d.toCELValue(retry.GetIf())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret.If = ifValue\n\tswitch {\n\tcase retry.GetConstant() != nil:\n\t\tcons := retry.GetConstant()\n\t\tinterval := cons.GetInterval().AsDuration()\n\t\tret.Constant = &resolver.RetryPolicyConstant{\n\t\t\tInterval:   interval,\n\t\t\tMaxRetries: cons.GetMaxRetries(),\n\t\t}\n\t\treturn ret, nil\n\tcase retry.GetExponential() != nil:\n\t\texp := retry.GetExponential()\n\t\tinitialInterval := exp.GetInitialInterval().AsDuration()\n\t\tmaxInterval := exp.GetMaxInterval().AsDuration()\n\t\tmaxElapsedTime := exp.GetMaxElapsedTime().AsDuration()\n\t\tret.Exponential = &resolver.RetryPolicyExponential{\n\t\t\tInitialInterval:     initialInterval,\n\t\t\tRandomizationFactor: exp.GetRandomizationFactor(),\n\t\t\tMultiplier:          exp.GetMultiplier(),\n\t\t\tMaxInterval:         maxInterval,\n\t\t\tMaxRetries:          exp.GetMaxRetries(),\n\t\t\tMaxElapsedTime:      maxElapsedTime,\n\t\t}\n\t\treturn ret, nil\n\t}\n\treturn nil, fmt.Errorf(\"unexpected retry policy\")\n}\n\nfunc (d *decoder) toMessageExpr(expr *plugin.MessageExpr) (*resolver.MessageExpr, error) {\n\tif expr == nil {\n\t\treturn nil, nil\n\t}\n\tret := &resolver.MessageExpr{}\n\n\tmsg, err := d.toMessage(expr.GetMessageId())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs, err := d.toArgs(expr.GetArgs())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tret.Message = msg\n\tret.Args = args\n\treturn ret, nil\n}\n\nfunc (d *decoder) toEnumExpr(expr *plugin.EnumExpr) (*resolver.EnumExpr, error) {\n\tif expr == nil {\n\t\treturn nil, nil\n\t}\n\tret := &resolver.EnumExpr{}\n\n\tenum, err := d.toEnum(expr.GetEnumId())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tby, err := d.toCELValue(expr.GetBy())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret.Enum = enum\n\tret.By = by\n\treturn ret, nil\n}\n\nfunc (d *decoder) toSwitchExpr(expr *plugin.SwitchExpr) (*resolver.SwitchExpr, error) {\n\tif expr == nil {\n\t\treturn nil, nil\n\t}\n\ttyp, err := d.toType(expr.GetType())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcases, err := d.toSwitchCases(expr.GetCases())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdeflt, err := d.toSwitchDefault(expr.GetDefault())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &resolver.SwitchExpr{\n\t\tType:    typ,\n\t\tCases:   cases,\n\t\tDefault: deflt,\n\t}, nil\n}\n\nfunc (d *decoder) toSwitchCases(cases []*plugin.SwitchCase) ([]*resolver.SwitchCaseExpr, error) {\n\tif cases == nil {\n\t\treturn nil, nil\n\t}\n\tret := make([]*resolver.SwitchCaseExpr, 0, len(cases))\n\tfor _, cse := range cases {\n\t\tcse, err := d.toSwitchCase(cse)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif cse == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, cse)\n\t}\n\treturn ret, nil\n}\n\nfunc (d *decoder) toSwitchCase(cse *plugin.SwitchCase) (*resolver.SwitchCaseExpr, error) {\n\tif cse == nil {\n\t\treturn nil, nil\n\t}\n\tdefSet, err := d.toVariableDefinitionSet(cse.GetDefSet())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tifValue, err := d.toCELValue(cse.GetIf())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tby, err := d.toCELValue(cse.GetBy())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &resolver.SwitchCaseExpr{\n\t\tDefSet: defSet,\n\t\tIf:     ifValue,\n\t\tBy:     by,\n\t}, nil\n}\n\nfunc (d *decoder) toSwitchDefault(def *plugin.SwitchDefault) (*resolver.SwitchDefaultExpr, error) {\n\tif def == nil {\n\t\treturn nil, nil\n\t}\n\tdefSet, err := d.toVariableDefinitionSet(def.GetDefSet())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tby, err := d.toCELValue(def.GetBy())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &resolver.SwitchDefaultExpr{\n\t\tDefSet: defSet,\n\t\tBy:     by,\n\t}, nil\n}\n\nfunc (d *decoder) toValidationExpr(expr *plugin.ValidationExpr) (*resolver.ValidationExpr, error) {\n\tif expr == nil {\n\t\treturn nil, nil\n\t}\n\tret := &resolver.ValidationExpr{}\n\n\tgrpcErr, err := d.toGRPCError(expr.GetError())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret.Error = grpcErr\n\treturn ret, nil\n}\n\nfunc (d *decoder) toGRPCErrors(errs []*plugin.GRPCError) ([]*resolver.GRPCError, error) {\n\tif errs == nil {\n\t\treturn nil, nil\n\t}\n\tret := make([]*resolver.GRPCError, 0, len(errs))\n\tfor _, grpcErr := range errs {\n\t\tv, err := d.toGRPCError(grpcErr)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif v == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, v)\n\t}\n\treturn ret, nil\n}\n\nfunc (d *decoder) toGRPCError(e *plugin.GRPCError) (*resolver.GRPCError, error) {\n\tif e == nil {\n\t\treturn nil, nil\n\t}\n\tret := &resolver.GRPCError{\n\t\tCode:     e.Code,\n\t\tIgnore:   e.GetIgnore(),\n\t\tLogLevel: slog.Level(e.GetLogLevel()),\n\t}\n\n\tdefSet, err := d.toVariableDefinitionSet(e.GetDefSet())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tifValue, err := d.toCELValue(e.GetIf())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tmsgValue, err := d.toCELValue(e.GetMessage())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdetails, err := d.toGRPCErrorDetails(e.GetDetails())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tignoreAndResponse, err := d.toCELValue(e.GetIgnoreAndResponse())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret.DefSet = defSet\n\tret.If = ifValue\n\tret.Message = msgValue\n\tret.Details = details\n\tret.IgnoreAndResponse = ignoreAndResponse\n\treturn ret, nil\n}\n\nfunc (d *decoder) toGRPCErrorDetails(details []*plugin.GRPCErrorDetail) ([]*resolver.GRPCErrorDetail, error) {\n\tif details == nil {\n\t\treturn nil, nil\n\t}\n\tret := make([]*resolver.GRPCErrorDetail, 0, len(details))\n\tfor _, detail := range details {\n\t\tv, err := d.toGRPCErrorDetail(detail)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif v == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, v)\n\t}\n\treturn ret, nil\n}\n\nfunc (d *decoder) toGRPCErrorDetail(detail *plugin.GRPCErrorDetail) (*resolver.GRPCErrorDetail, error) {\n\tret := &resolver.GRPCErrorDetail{}\n\n\tdefSet, err := d.toVariableDefinitionSet(detail.GetDefSet())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tifValue, err := d.toCELValue(detail.GetIf())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tby, err := d.toCELValues(detail.GetBy())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tmsgs, err := d.toVariableDefinitionSet(detail.GetMessages())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tpreconditionFailures, err := d.toPreconditionFailures(detail.GetPreconditionFailures())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tbadRequests, err := d.toBadRequests(detail.GetBadRequests())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tlocalizedMsgs, err := d.toLocalizedMessages(detail.GetLocalizedMessages())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret.DefSet = defSet\n\tret.If = ifValue\n\tret.By = by\n\tret.Messages = msgs\n\tret.PreconditionFailures = preconditionFailures\n\tret.BadRequests = badRequests\n\tret.LocalizedMessages = localizedMsgs\n\treturn ret, nil\n}\n\nfunc (d *decoder) toPreconditionFailures(v []*plugin.PreconditionFailure) ([]*resolver.PreconditionFailure, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tret := make([]*resolver.PreconditionFailure, 0, len(v))\n\tfor _, vv := range v {\n\t\tpreconditionFailure, err := d.toPreconditionFailure(vv)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif preconditionFailure == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, preconditionFailure)\n\t}\n\treturn ret, nil\n}\n\nfunc (d *decoder) toPreconditionFailure(v *plugin.PreconditionFailure) (*resolver.PreconditionFailure, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tret := &resolver.PreconditionFailure{}\n\tviolations, err := d.toPreconditionFailureViolations(v.GetViolations())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret.Violations = violations\n\treturn ret, nil\n}\n\nfunc (d *decoder) toPreconditionFailureViolations(v []*plugin.PreconditionFailureViolation) ([]*resolver.PreconditionFailureViolation, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tret := make([]*resolver.PreconditionFailureViolation, 0, len(v))\n\tfor _, vv := range v {\n\t\tviolation, err := d.toPreconditionFailureViolation(vv)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif violation == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, violation)\n\t}\n\treturn ret, nil\n}\n\nfunc (d *decoder) toPreconditionFailureViolation(v *plugin.PreconditionFailureViolation) (*resolver.PreconditionFailureViolation, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tret := &resolver.PreconditionFailureViolation{}\n\n\ttyp, err := d.toCELValue(v.GetType())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tsubject, err := d.toCELValue(v.GetSubject())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdesc, err := d.toCELValue(v.GetDescription())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tret.Type = typ\n\tret.Subject = subject\n\tret.Description = desc\n\treturn ret, nil\n}\n\nfunc (d *decoder) toBadRequests(v []*plugin.BadRequest) ([]*resolver.BadRequest, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tret := make([]*resolver.BadRequest, 0, len(v))\n\tfor _, vv := range v {\n\t\treq, err := d.toBadRequest(vv)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif req == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, req)\n\t}\n\treturn ret, nil\n}\n\nfunc (d *decoder) toBadRequest(req *plugin.BadRequest) (*resolver.BadRequest, error) {\n\tif req == nil {\n\t\treturn nil, nil\n\t}\n\tret := &resolver.BadRequest{}\n\n\tviolations, err := d.toBadRequestFieldViolations(req.GetFieldViolations())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tret.FieldViolations = violations\n\treturn ret, nil\n}\n\nfunc (d *decoder) toBadRequestFieldViolations(v []*plugin.BadRequestFieldViolation) ([]*resolver.BadRequestFieldViolation, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tret := make([]*resolver.BadRequestFieldViolation, 0, len(v))\n\tfor _, vv := range v {\n\t\tviolation, err := d.toBadRequestFieldViolation(vv)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif violation == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, violation)\n\t}\n\treturn ret, nil\n}\n\nfunc (d *decoder) toBadRequestFieldViolation(v *plugin.BadRequestFieldViolation) (*resolver.BadRequestFieldViolation, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tret := &resolver.BadRequestFieldViolation{}\n\n\tfield, err := d.toCELValue(v.GetField())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdesc, err := d.toCELValue(v.GetDescription())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tret.Field = field\n\tret.Description = desc\n\treturn ret, nil\n}\n\nfunc (d *decoder) toLocalizedMessages(v []*plugin.LocalizedMessage) ([]*resolver.LocalizedMessage, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tret := make([]*resolver.LocalizedMessage, 0, len(v))\n\tfor _, vv := range v {\n\t\tmsg, err := d.toLocalizedMessage(vv)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif msg == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, msg)\n\t}\n\treturn ret, nil\n}\n\nfunc (d *decoder) toLocalizedMessage(v *plugin.LocalizedMessage) (*resolver.LocalizedMessage, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tret := &resolver.LocalizedMessage{Locale: v.GetLocale()}\n\tmsg, err := d.toCELValue(v.GetMessage())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret.Message = msg\n\treturn ret, nil\n}\n\nfunc (d *decoder) toGRPCCallOption(v *plugin.GRPCCallOption) (*resolver.GRPCCallOption, error) {\n\tif v == nil {\n\t\treturn nil, nil\n\t}\n\tret := &resolver.GRPCCallOption{\n\t\tContentSubtype:     v.ContentSubtype,\n\t\tMaxCallRecvMsgSize: v.MaxCallRecvMsgSize,\n\t\tMaxCallSendMsgSize: v.MaxCallSendMsgSize,\n\t\tStaticMethod:       v.StaticMethod,\n\t\tWaitForReady:       v.WaitForReady,\n\t}\n\tif v.HeaderId != nil {\n\t\theader, err := d.toVariableDefinition(v.GetHeaderId())\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret.Header = header\n\t}\n\tif v.TrailerId != nil {\n\t\ttrailer, err := d.toVariableDefinition(v.GetTrailerId())\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret.Trailer = trailer\n\t}\n\treturn ret, nil\n}\n\nfunc (d *decoder) toMethods(ids []string) ([]*resolver.Method, error) {\n\tif ids == nil {\n\t\treturn nil, nil\n\t}\n\tret := make([]*resolver.Method, 0, len(ids))\n\tfor _, id := range ids {\n\t\tmtd, err := d.toMethod(id)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif mtd == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, mtd)\n\t}\n\treturn ret, nil\n}\n\nfunc (d *decoder) toMethod(id string) (*resolver.Method, error) {\n\tif id == \"\" {\n\t\treturn nil, nil\n\t}\n\tif mtd, exists := d.mtdMap[id]; exists {\n\t\treturn mtd, nil\n\t}\n\tmtd, exists := d.ref.MethodMap[id]\n\tif !exists {\n\t\treturn nil, fmt.Errorf(\"failed to find method reference: %s\", id)\n\t}\n\tret := &resolver.Method{Name: mtd.GetName()}\n\td.mtdMap[id] = ret\n\n\trequest, err := d.toMessage(mtd.GetRequestId())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresponse, err := d.toMessage(mtd.GetResponseId())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tsvc, err := d.toService(mtd.GetServiceId())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\trule, err := d.toMethodRule(mtd.GetRule())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret.Request = request\n\tret.Response = response\n\tret.Service = svc\n\tret.Rule = rule\n\treturn ret, nil\n}\n\nfunc (d *decoder) toMethodRule(rule *plugin.MethodRule) (*resolver.MethodRule, error) {\n\tif rule == nil {\n\t\treturn nil, nil\n\t}\n\tret := &resolver.MethodRule{}\n\tif rule.Timeout != nil {\n\t\ttimeout := rule.GetTimeout().AsDuration()\n\t\tret.Timeout = &timeout\n\t}\n\tif rule.GetResponseId() != \"\" {\n\t\tresponse, err := d.toMessage(rule.GetResponseId())\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret.Response = response\n\t}\n\treturn ret, nil\n}\n\nfunc (d *decoder) toEnums(ids []string) ([]*resolver.Enum, error) {\n\tif ids == nil {\n\t\treturn nil, nil\n\t}\n\tret := make([]*resolver.Enum, 0, len(ids))\n\tfor _, id := range ids {\n\t\tenum, err := d.toEnum(id)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif enum == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, enum)\n\t}\n\treturn ret, nil\n}\n\nfunc (d *decoder) toEnum(id string) (*resolver.Enum, error) {\n\tif id == \"\" {\n\t\treturn nil, nil\n\t}\n\tif enum, exists := d.enumMap[id]; exists {\n\t\treturn enum, nil\n\t}\n\tenum, exists := d.ref.EnumMap[id]\n\tif !exists {\n\t\treturn nil, fmt.Errorf(\"failed to find enum reference: %s\", id)\n\t}\n\tret := &resolver.Enum{Name: enum.GetName()}\n\td.enumMap[id] = ret\n\n\tvalues, err := d.toEnumValues(enum.GetValueIds())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tmsg, err := d.toMessage(enum.GetMessageId())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tfile, err := d.toFile(enum.GetFileId())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\trule, err := d.toEnumRule(enum.GetRule())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret.Values = values\n\tret.Message = msg\n\tret.File = file\n\tret.Rule = rule\n\treturn ret, nil\n}\n\nfunc (d *decoder) toEnumRule(rule *plugin.EnumRule) (*resolver.EnumRule, error) {\n\tif rule == nil {\n\t\treturn nil, nil\n\t}\n\taliases, err := d.toEnums(rule.GetAliasIds())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &resolver.EnumRule{\n\t\tAliases: aliases,\n\t}, nil\n}\n\nfunc (d *decoder) toEnumValueAliases(aliases []*plugin.EnumValueAlias) ([]*resolver.EnumValueAlias, error) {\n\tret := make([]*resolver.EnumValueAlias, 0, len(aliases))\n\tfor _, alias := range aliases {\n\t\tv, err := d.toEnumValueAlias(alias)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif v == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, v)\n\t}\n\treturn ret, nil\n}\n\nfunc (d *decoder) toEnumValueAttributes(attrs []*plugin.EnumValueAttribute) []*resolver.EnumValueAttribute {\n\tif len(attrs) == 0 {\n\t\treturn nil\n\t}\n\tret := make([]*resolver.EnumValueAttribute, 0, len(attrs))\n\tfor _, attr := range attrs {\n\t\tv := d.toEnumValueAttribute(attr)\n\t\tif v == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, v)\n\t}\n\treturn ret\n}\n\nfunc (d *decoder) toEnumValues(ids []string) ([]*resolver.EnumValue, error) {\n\tret := make([]*resolver.EnumValue, 0, len(ids))\n\tfor _, id := range ids {\n\t\tev, err := d.toEnumValue(id)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif ev == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, ev)\n\t}\n\treturn ret, nil\n}\n\nfunc (d *decoder) toEnumValueAlias(alias *plugin.EnumValueAlias) (*resolver.EnumValueAlias, error) {\n\tif alias == nil {\n\t\treturn nil, nil\n\t}\n\tenumAlias, err := d.toEnum(alias.GetEnumAliasId())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tenumValues, err := d.toEnumValues(alias.GetAliasIds())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &resolver.EnumValueAlias{\n\t\tEnumAlias: enumAlias,\n\t\tAliases:   enumValues,\n\t}, nil\n}\n\nfunc (d *decoder) toEnumValueAttribute(attr *plugin.EnumValueAttribute) *resolver.EnumValueAttribute {\n\tif attr == nil {\n\t\treturn nil\n\t}\n\treturn &resolver.EnumValueAttribute{\n\t\tName:  attr.GetName(),\n\t\tValue: attr.GetValue(),\n\t}\n}\n\nfunc (d *decoder) toEnumValue(id string) (*resolver.EnumValue, error) {\n\tif id == \"\" {\n\t\treturn nil, nil\n\t}\n\tif value, exists := d.enumValueMap[id]; exists {\n\t\treturn value, nil\n\t}\n\tvalue, exists := d.ref.EnumValueMap[id]\n\tif !exists {\n\t\treturn nil, fmt.Errorf(\"failed to find enum value reference: %s\", id)\n\t}\n\tret := &resolver.EnumValue{Value: value.GetValue()}\n\td.enumValueMap[id] = ret\n\n\tenum, err := d.toEnum(value.GetEnumId())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\trule, err := d.toEnumValueRule(value.GetRule())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret.Enum = enum\n\tret.Rule = rule\n\treturn ret, nil\n}\n\nfunc (d *decoder) toEnumValueRule(rule *plugin.EnumValueRule) (*resolver.EnumValueRule, error) {\n\tif rule == nil {\n\t\treturn nil, nil\n\t}\n\taliases, err := d.toEnumValueAliases(rule.GetAliases())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tattrs := d.toEnumValueAttributes(rule.GetAttrs())\n\treturn &resolver.EnumValueRule{\n\t\tDefault: rule.GetDefault(),\n\t\tNoAlias: rule.GetNoalias(),\n\t\tAliases: aliases,\n\t\tAttrs:   attrs,\n\t}, nil\n}\n\nfunc (d *decoder) toCELPlugins(ids []string) ([]*resolver.CELPlugin, error) {\n\tif ids == nil {\n\t\treturn nil, nil\n\t}\n\tret := make([]*resolver.CELPlugin, 0, len(ids))\n\tfor _, id := range ids {\n\t\tp, err := d.toCELPlugin(id)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif p == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, p)\n\t}\n\treturn ret, nil\n}\n\nfunc (d *decoder) toCELPlugin(id string) (*resolver.CELPlugin, error) {\n\tif id == \"\" {\n\t\treturn nil, nil\n\t}\n\tif p, exists := d.celPluginMap[id]; exists {\n\t\treturn p, nil\n\t}\n\tp, exists := d.ref.CelPluginMap[id]\n\tif !exists {\n\t\treturn nil, fmt.Errorf(\"failed to find cel plugin reference: %s\", id)\n\t}\n\tret := &resolver.CELPlugin{\n\t\tName: p.GetName(),\n\t\tDesc: p.GetDescription(),\n\t}\n\td.celPluginMap[id] = ret\n\n\tfuncs, err := d.toCELFunctions(p.GetFunctions())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret.Functions = funcs\n\treturn ret, nil\n}\n\nfunc (d *decoder) toCELFunctions(funcs []*plugin.CELFunction) ([]*resolver.CELFunction, error) {\n\tret := make([]*resolver.CELFunction, 0, len(funcs))\n\tfor _, fn := range funcs {\n\t\tf, err := d.toCELFunction(fn)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif f == nil {\n\t\t\treturn nil, nil\n\t\t}\n\t\tret = append(ret, f)\n\t}\n\treturn ret, nil\n}\n\nfunc (d *decoder) toCELFunction(fn *plugin.CELFunction) (*resolver.CELFunction, error) {\n\targs, err := d.toTypes(fn.GetArgs())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret, err := d.toType(fn.GetReturn())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treceiver, err := d.toMessage(fn.GetReceiverId())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &resolver.CELFunction{\n\t\tName:     fn.GetName(),\n\t\tID:       fn.GetId(),\n\t\tArgs:     args,\n\t\tReturn:   ret,\n\t\tReceiver: receiver,\n\t}, nil\n}\n\nfunc (d *decoder) toTypes(t []*plugin.Type) ([]*resolver.Type, error) {\n\tif t == nil {\n\t\treturn nil, nil\n\t}\n\tret := make([]*resolver.Type, 0, len(t))\n\tfor _, tt := range t {\n\t\ttyp, err := d.toType(tt)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif typ == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, typ)\n\t}\n\treturn ret, nil\n}\n\nfunc (d *decoder) toType(t *plugin.Type) (*resolver.Type, error) {\n\tif t == nil {\n\t\treturn nil, nil\n\t}\n\tmsg, err := d.toMessage(t.GetMessageId())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tenum, err := d.toEnum(t.GetEnumId())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\toneofField, err := d.toOneofField(t.GetOneofFieldId())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &resolver.Type{\n\t\tKind:       d.toTypeKind(t.GetKind()),\n\t\tRepeated:   t.GetRepeated(),\n\t\tIsNull:     t.GetIsNull(),\n\t\tMessage:    msg,\n\t\tEnum:       enum,\n\t\tOneofField: oneofField,\n\t}, nil\n}\n\nfunc (d *decoder) toTypeKind(kind plugin.TypeKind) types.Kind {\n\tswitch kind {\n\tcase plugin.TypeKind_DOUBLE_TYPE:\n\t\treturn types.Double\n\tcase plugin.TypeKind_FLOAT_TYPE:\n\t\treturn types.Float\n\tcase plugin.TypeKind_INT64_TYPE:\n\t\treturn types.Int64\n\tcase plugin.TypeKind_UINT64_TYPE:\n\t\treturn types.Uint64\n\tcase plugin.TypeKind_INT32_TYPE:\n\t\treturn types.Int32\n\tcase plugin.TypeKind_FIXED64_TYPE:\n\t\treturn types.Fixed64\n\tcase plugin.TypeKind_FIXED32_TYPE:\n\t\treturn types.Fixed32\n\tcase plugin.TypeKind_BOOL_TYPE:\n\t\treturn types.Bool\n\tcase plugin.TypeKind_STRING_TYPE:\n\t\treturn types.String\n\tcase plugin.TypeKind_GROUP_TYPE:\n\t\treturn types.Group\n\tcase plugin.TypeKind_MESSAGE_TYPE:\n\t\treturn types.Message\n\tcase plugin.TypeKind_BYTES_TYPE:\n\t\treturn types.Bytes\n\tcase plugin.TypeKind_UINT32_TYPE:\n\t\treturn types.Uint32\n\tcase plugin.TypeKind_ENUM_TYPE:\n\t\treturn types.Enum\n\tcase plugin.TypeKind_SFIXED32_TYPE:\n\t\treturn types.Sfixed32\n\tcase plugin.TypeKind_SFIXED64_TYPE:\n\t\treturn types.Sfixed64\n\tcase plugin.TypeKind_SINT32_TYPE:\n\t\treturn types.Sint32\n\tcase plugin.TypeKind_SINT64_TYPE:\n\t\treturn types.Sint64\n\t}\n\treturn types.Unknown\n}\n\nfunc (d *decoder) toOneofField(id string) (*resolver.OneofField, error) {\n\tfield, err := d.toField(id)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif field == nil {\n\t\treturn nil, nil\n\t}\n\treturn &resolver.OneofField{Field: field}, nil\n}\n"
  },
  {
    "path": "grpc/federation/generator/encode.go",
    "content": "package generator\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\t\"google.golang.org/protobuf/types/known/durationpb\"\n\n\t\"github.com/mercari/grpc-federation/grpc/federation/generator/plugin\"\n\t\"github.com/mercari/grpc-federation/resolver\"\n\t\"github.com/mercari/grpc-federation/types\"\n)\n\ntype encoder struct {\n\tref *plugin.Reference\n}\n\nfunc newEncoder() *encoder {\n\treturn &encoder{\n\t\tref: &plugin.Reference{\n\t\t\tFileMap:                    make(map[string]*plugin.File),\n\t\t\tEnumMap:                    make(map[string]*plugin.Enum),\n\t\t\tEnumValueMap:               make(map[string]*plugin.EnumValue),\n\t\t\tMessageMap:                 make(map[string]*plugin.Message),\n\t\t\tFieldMap:                   make(map[string]*plugin.Field),\n\t\t\tOneofMap:                   make(map[string]*plugin.Oneof),\n\t\t\tServiceMap:                 make(map[string]*plugin.Service),\n\t\t\tMethodMap:                  make(map[string]*plugin.Method),\n\t\t\tCelPluginMap:               make(map[string]*plugin.CELPlugin),\n\t\t\tGraphMap:                   make(map[string]*plugin.MessageDependencyGraph),\n\t\t\tGraphNodeMap:               make(map[string]*plugin.MessageDependencyGraphNode),\n\t\t\tVariableDefinitionMap:      make(map[string]*plugin.VariableDefinition),\n\t\t\tVariableDefinitionGroupMap: make(map[string]*plugin.VariableDefinitionGroup),\n\t\t},\n\t}\n}\n\nfunc CreateCodeGeneratorRequest(cfg *CodeGeneratorRequestConfig) *plugin.CodeGeneratorRequest {\n\treturn newEncoder().toCodeGeneratorRequest(cfg)\n}\n\nfunc (e *encoder) toCodeGeneratorRequest(cfg *CodeGeneratorRequestConfig) *plugin.CodeGeneratorRequest {\n\tret := &plugin.CodeGeneratorRequest{\n\t\tProtoPath:            cfg.ProtoPath,\n\t\tReference:            e.ref,\n\t\tOutputFilePathConfig: e.toOutputFilePathConfig(cfg.OutputFilePathConfig),\n\t}\n\tfor _, file := range e.toFiles(cfg.GRPCFederationFiles) {\n\t\tret.GrpcFederationFileIds = append(ret.GrpcFederationFileIds, file.GetId())\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toOutputFilePathConfig(cfg resolver.OutputFilePathConfig) *plugin.OutputFilePathConfig {\n\tvar mode plugin.OutputFilePathMode\n\tswitch cfg.Mode {\n\tcase resolver.ImportMode:\n\t\tmode = plugin.OutputFilePathMode_OUTPUT_FILE_PATH_MODE_IMPORT\n\tcase resolver.ModulePrefixMode:\n\t\tmode = plugin.OutputFilePathMode_OUTPUT_FILE_PATH_MODE_MODULE_PREFIX\n\tcase resolver.SourceRelativeMode:\n\t\tmode = plugin.OutputFilePathMode_OUTPUT_FILE_PATH_MODE_SOURCE_RELATIVE\n\t}\n\treturn &plugin.OutputFilePathConfig{\n\t\tMode:        mode,\n\t\tPrefix:      cfg.Prefix,\n\t\tFilePath:    cfg.FilePath,\n\t\tImportPaths: cfg.ImportPaths,\n\t}\n}\n\nfunc (e *encoder) toFile(file *resolver.File) *plugin.File {\n\tif file == nil {\n\t\treturn nil\n\t}\n\tid := e.toFileID(file)\n\tif file, exists := e.ref.FileMap[id]; exists {\n\t\treturn file\n\t}\n\tret := &plugin.File{\n\t\tId:        id,\n\t\tName:      file.Name,\n\t\tGoPackage: e.toGoPackage(file.GoPackage),\n\t}\n\te.ref.FileMap[id] = ret\n\n\tret.Package = e.toPackage(file.Package)\n\tfor _, svc := range e.toServices(file.Services) {\n\t\tret.ServiceIds = append(ret.ServiceIds, svc.GetId())\n\t}\n\tfor _, msg := range e.toMessages(file.Messages) {\n\t\tret.MessageIds = append(ret.MessageIds, msg.GetId())\n\t}\n\tfor _, enum := range e.toEnums(file.Enums) {\n\t\tret.EnumIds = append(ret.EnumIds, enum.GetId())\n\t}\n\tfor _, p := range e.toCELPlugins(file.CELPlugins) {\n\t\tret.CelPluginIds = append(ret.CelPluginIds, p.GetId())\n\t}\n\tfor _, file := range e.toFiles(file.ImportFiles) {\n\t\tret.ImportFileIds = append(ret.ImportFileIds, file.GetId())\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toPackage(pkg *resolver.Package) *plugin.Package {\n\tret := &plugin.Package{Name: pkg.Name}\n\n\tfor _, file := range e.toFiles(pkg.Files) {\n\t\tret.FileIds = append(ret.FileIds, file.GetId())\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toGoPackage(pkg *resolver.GoPackage) *plugin.GoPackage {\n\treturn &plugin.GoPackage{\n\t\tName:       pkg.Name,\n\t\tImportPath: pkg.ImportPath,\n\t\tAliasName:  pkg.AliasName,\n\t}\n}\n\nfunc (e *encoder) toFiles(files []*resolver.File) []*plugin.File {\n\tret := make([]*plugin.File, 0, len(files))\n\tfor _, file := range files {\n\t\tf := e.toFile(file)\n\t\tif f == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, f)\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toServices(svcs []*resolver.Service) []*plugin.Service {\n\tret := make([]*plugin.Service, 0, len(svcs))\n\tfor _, svc := range svcs {\n\t\ts := e.toService(svc)\n\t\tif s == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, s)\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toService(svc *resolver.Service) *plugin.Service {\n\tif svc == nil {\n\t\treturn nil\n\t}\n\tid := e.toServiceID(svc)\n\tif svc, exists := e.ref.ServiceMap[id]; exists {\n\t\treturn svc\n\t}\n\tret := &plugin.Service{Id: id, Name: svc.Name}\n\te.ref.ServiceMap[id] = ret\n\n\tfor _, mtd := range e.toMethods(svc.Methods) {\n\t\tret.MethodIds = append(ret.MethodIds, mtd.GetId())\n\t}\n\tfor _, msg := range e.toMessages(svc.Messages) {\n\t\tret.MessageIds = append(ret.MessageIds, msg.GetId())\n\t}\n\tfor _, msg := range e.toMessages(svc.MessageArgs) {\n\t\tret.MessageArgIds = append(ret.MessageArgIds, msg.GetId())\n\t}\n\tfor _, p := range e.toCELPlugins(svc.CELPlugins) {\n\t\tret.CelPluginIds = append(ret.CelPluginIds, p.GetId())\n\t}\n\tret.FileId = e.toFile(svc.File).GetId()\n\tret.Rule = e.toServiceRule(id, svc.Rule)\n\treturn ret\n}\n\nfunc (e *encoder) toServiceRule(fqdn string, rule *resolver.ServiceRule) *plugin.ServiceRule {\n\tif rule == nil {\n\t\treturn nil\n\t}\n\tenv := e.toEnv(rule.Env)\n\tvars := e.toServiceVariables(fqdn, rule.Vars)\n\treturn &plugin.ServiceRule{\n\t\tEnv:  env,\n\t\tVars: vars,\n\t}\n}\n\nfunc (e *encoder) toServiceVariables(fqdn string, vars []*resolver.ServiceVariable) []*plugin.ServiceVariable {\n\tret := make([]*plugin.ServiceVariable, 0, len(vars))\n\tfor _, svcVar := range vars {\n\t\tv := e.toServiceVariable(fqdn, svcVar)\n\t\tif v == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, v)\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toServiceVariable(fqdn string, v *resolver.ServiceVariable) *plugin.ServiceVariable {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tret := &plugin.ServiceVariable{\n\t\tName: v.Name,\n\t}\n\tret.If = e.toCELValue(v.If)\n\tret.Expr = e.toServiceVariableExpr(fqdn, v.Expr)\n\treturn ret\n}\n\nfunc (e *encoder) toServiceVariableExpr(fqdn string, expr *resolver.ServiceVariableExpr) *plugin.ServiceVariableExpr {\n\tif expr == nil {\n\t\treturn nil\n\t}\n\tret := &plugin.ServiceVariableExpr{\n\t\tType: e.toType(expr.Type),\n\t}\n\tswitch {\n\tcase expr.By != nil:\n\t\tret.Expr = &plugin.ServiceVariableExpr_By{\n\t\t\tBy: e.toCELValue(expr.By),\n\t\t}\n\tcase expr.Map != nil:\n\t\tret.Expr = &plugin.ServiceVariableExpr_Map{\n\t\t\tMap: e.toMapExpr(fqdn, expr.Map),\n\t\t}\n\tcase expr.Message != nil:\n\t\tret.Expr = &plugin.ServiceVariableExpr_Message{\n\t\t\tMessage: e.toMessageExpr(expr.Message),\n\t\t}\n\tcase expr.Enum != nil:\n\t\tret.Expr = &plugin.ServiceVariableExpr_Enum{\n\t\t\tEnum: e.toEnumExpr(expr.Enum),\n\t\t}\n\tcase expr.Switch != nil:\n\t\tret.Expr = &plugin.ServiceVariableExpr_Switch{\n\t\t\tSwitch: e.toSwitchExpr(fqdn, expr.Switch),\n\t\t}\n\tcase expr.Validation != nil:\n\t\tret.Expr = &plugin.ServiceVariableExpr_Validation{\n\t\t\tValidation: e.toServiceVariableValidationExpr(expr.Validation),\n\t\t}\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toServiceVariableValidationExpr(expr *resolver.ServiceVariableValidationExpr) *plugin.ServiceVariableValidationExpr {\n\tif expr == nil {\n\t\treturn nil\n\t}\n\treturn &plugin.ServiceVariableValidationExpr{\n\t\tIf:      e.toCELValue(expr.If),\n\t\tMessage: e.toCELValue(expr.Message),\n\t}\n}\n\nfunc (e *encoder) toEnv(env *resolver.Env) *plugin.Env {\n\tif env == nil {\n\t\treturn nil\n\t}\n\treturn &plugin.Env{\n\t\tVars: e.toEnvVars(env.Vars),\n\t}\n}\n\nfunc (e *encoder) toEnvVars(vars []*resolver.EnvVar) []*plugin.EnvVar {\n\tret := make([]*plugin.EnvVar, 0, len(vars))\n\tfor _, envVar := range vars {\n\t\tv := e.toEnvVar(envVar)\n\t\tif v == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, v)\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toEnvVar(v *resolver.EnvVar) *plugin.EnvVar {\n\tif v == nil {\n\t\treturn nil\n\t}\n\treturn &plugin.EnvVar{\n\t\tName:   v.Name,\n\t\tType:   e.toType(v.Type),\n\t\tOption: e.toEnvVarOption(v.Option),\n\t}\n}\n\nfunc (e *encoder) toEnvVarOption(opt *resolver.EnvVarOption) *plugin.EnvVarOption {\n\tif opt == nil {\n\t\treturn nil\n\t}\n\treturn &plugin.EnvVarOption{\n\t\tAlternate: opt.Alternate,\n\t\tDefault:   opt.Default,\n\t\tRequired:  opt.Required,\n\t\tIgnored:   opt.Ignored,\n\t}\n}\n\nfunc (e *encoder) toMessages(msgs []*resolver.Message) []*plugin.Message {\n\tret := make([]*plugin.Message, 0, len(msgs))\n\tfor _, msg := range msgs {\n\t\tm := e.toMessage(msg)\n\t\tif m == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, m)\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toMessage(msg *resolver.Message) *plugin.Message {\n\tif msg == nil {\n\t\treturn nil\n\t}\n\tid := e.toMessageID(msg)\n\tif msg, exists := e.ref.MessageMap[id]; exists {\n\t\treturn msg\n\t}\n\tret := &plugin.Message{\n\t\tId:         id,\n\t\tName:       msg.Name,\n\t\tIsMapEntry: msg.IsMapEntry,\n\t}\n\te.ref.MessageMap[id] = ret\n\n\tret.FileId = e.toFile(msg.File).GetId()\n\tret.ParentMessageId = e.toMessage(msg.ParentMessage).GetId()\n\tfor _, msg := range e.toMessages(msg.NestedMessages) {\n\t\tret.NestedMessageIds = append(ret.NestedMessageIds, msg.GetId())\n\t}\n\tfor _, enum := range e.toEnums(msg.Enums) {\n\t\tret.EnumIds = append(ret.EnumIds, enum.GetId())\n\t}\n\tfor _, field := range e.toFields(msg.Fields) {\n\t\tret.FieldIds = append(ret.FieldIds, field.GetId())\n\t}\n\tfor _, oneof := range e.toOneofs(msg.Oneofs) {\n\t\tret.OneofIds = append(ret.OneofIds, oneof.GetId())\n\t}\n\tret.Rule = e.toMessageRule(msg.Rule)\n\treturn ret\n}\n\nfunc (e *encoder) toMessageRule(rule *resolver.MessageRule) *plugin.MessageRule {\n\tif rule == nil {\n\t\treturn nil\n\t}\n\tret := &plugin.MessageRule{\n\t\tCustomResolver: rule.CustomResolver,\n\t}\n\tvar aliasIDs []string\n\tfor _, msg := range e.toMessages(rule.Aliases) {\n\t\taliasIDs = append(aliasIDs, msg.GetId())\n\t}\n\tret.MessageArgumentId = e.toMessage(rule.MessageArgument).GetId()\n\tret.AliasIds = aliasIDs\n\tret.DefSet = e.toVariableDefinitionSet(rule.MessageArgument.FQDN(), rule.DefSet)\n\treturn ret\n}\n\nfunc (e *encoder) toVariableDefinitionSet(fqdn string, set *resolver.VariableDefinitionSet) *plugin.VariableDefinitionSet {\n\tret := &plugin.VariableDefinitionSet{}\n\tret.DependencyGraphId = e.toMessageDependencyGraph(set.DependencyGraph()).GetId()\n\tfor _, def := range e.toVariableDefinitions(fqdn, set.Definitions()) {\n\t\tret.VariableDefinitionIds = append(ret.VariableDefinitionIds, def.GetId())\n\t}\n\tfor _, group := range e.toVariableDefinitionGroups(fqdn, set.DefinitionGroups()) {\n\t\tret.VariableDefinitionGroupIds = append(ret.VariableDefinitionGroupIds, group.GetId())\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toEnums(enums []*resolver.Enum) []*plugin.Enum {\n\tret := make([]*plugin.Enum, 0, len(enums))\n\tfor _, enum := range enums {\n\t\tev := e.toEnum(enum)\n\t\tif ev == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, ev)\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toEnum(enum *resolver.Enum) *plugin.Enum {\n\tif enum == nil {\n\t\treturn nil\n\t}\n\tid := e.toEnumID(enum)\n\tif enum, exists := e.ref.EnumMap[id]; exists {\n\t\treturn enum\n\t}\n\tret := &plugin.Enum{Id: id, Name: enum.Name}\n\te.ref.EnumMap[id] = ret\n\n\tfor _, value := range e.toEnumValues(enum.Values) {\n\t\tret.ValueIds = append(ret.ValueIds, value.GetId())\n\t}\n\tret.MessageId = e.toMessage(enum.Message).GetId()\n\tret.FileId = e.toFile(enum.File).GetId()\n\tret.Rule = e.toEnumRule(enum.Rule)\n\treturn ret\n}\n\nfunc (e *encoder) toEnumRule(rule *resolver.EnumRule) *plugin.EnumRule {\n\tif rule == nil {\n\t\treturn nil\n\t}\n\tvar aliasIDs []string\n\tfor _, alias := range rule.Aliases {\n\t\taliasIDs = append(aliasIDs, e.toEnumID(alias))\n\t}\n\treturn &plugin.EnumRule{\n\t\tAliasIds: aliasIDs,\n\t}\n}\n\nfunc (e *encoder) toEnumValueAliases(aliases []*resolver.EnumValueAlias) []*plugin.EnumValueAlias {\n\tret := make([]*plugin.EnumValueAlias, 0, len(aliases))\n\tfor _, alias := range aliases {\n\t\tv := e.toEnumValueAlias(alias)\n\t\tif v == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, v)\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toEnumValueAttributes(attrs []*resolver.EnumValueAttribute) []*plugin.EnumValueAttribute {\n\tret := make([]*plugin.EnumValueAttribute, 0, len(attrs))\n\tfor _, attr := range attrs {\n\t\tv := e.toEnumValueAttribute(attr)\n\t\tif v == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, v)\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toEnumValues(values []*resolver.EnumValue) []*plugin.EnumValue {\n\tret := make([]*plugin.EnumValue, 0, len(values))\n\tfor _, value := range values {\n\t\tenumValue := e.toEnumValue(value)\n\t\tif enumValue == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, enumValue)\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toEnumValueAlias(alias *resolver.EnumValueAlias) *plugin.EnumValueAlias {\n\tif alias == nil {\n\t\treturn nil\n\t}\n\tvar valueIDs []string\n\tfor _, valueAlias := range alias.Aliases {\n\t\tvalueIDs = append(valueIDs, e.toEnumValueID(valueAlias))\n\t}\n\treturn &plugin.EnumValueAlias{\n\t\tEnumAliasId: e.toEnumID(alias.EnumAlias),\n\t\tAliasIds:    valueIDs,\n\t}\n}\n\nfunc (e *encoder) toEnumValueAttribute(attr *resolver.EnumValueAttribute) *plugin.EnumValueAttribute {\n\tif attr == nil {\n\t\treturn nil\n\t}\n\treturn &plugin.EnumValueAttribute{\n\t\tName:  attr.Name,\n\t\tValue: attr.Value,\n\t}\n}\n\nfunc (e *encoder) toEnumValue(value *resolver.EnumValue) *plugin.EnumValue {\n\tif value == nil {\n\t\treturn nil\n\t}\n\tid := e.toEnumValueID(value)\n\tif value, exists := e.ref.EnumValueMap[id]; exists {\n\t\treturn value\n\t}\n\tret := &plugin.EnumValue{Id: id, Value: value.Value}\n\te.ref.EnumValueMap[id] = ret\n\n\tret.EnumId = e.toEnum(value.Enum).GetId()\n\tret.Rule = e.toEnumValueRule(value.Rule)\n\treturn ret\n}\n\nfunc (e *encoder) toEnumValueRule(rule *resolver.EnumValueRule) *plugin.EnumValueRule {\n\tif rule == nil {\n\t\treturn nil\n\t}\n\tret := &plugin.EnumValueRule{\n\t\tDefault: rule.Default,\n\t\tNoalias: rule.NoAlias,\n\t\tAliases: e.toEnumValueAliases(rule.Aliases),\n\t\tAttrs:   e.toEnumValueAttributes(rule.Attrs),\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toFields(fields []*resolver.Field) []*plugin.Field {\n\tret := make([]*plugin.Field, 0, len(fields))\n\tfor _, field := range fields {\n\t\tf := e.toField(field)\n\t\tif f == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, f)\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toField(field *resolver.Field) *plugin.Field {\n\tif field == nil {\n\t\treturn nil\n\t}\n\tid := e.toFieldID(field)\n\tif field, exists := e.ref.FieldMap[id]; exists {\n\t\treturn field\n\t}\n\tret := &plugin.Field{Id: id, Name: field.Name}\n\te.ref.FieldMap[id] = ret\n\n\tret.Type = e.toType(field.Type)\n\tret.OneofId = e.toOneof(field.Oneof).GetId()\n\tret.Rule = e.toFieldRule(field, field.Rule)\n\tret.MessageId = e.toMessage(field.Message).GetId()\n\treturn ret\n}\n\nfunc (e *encoder) toFieldRule(field *resolver.Field, rule *resolver.FieldRule) *plugin.FieldRule {\n\tif rule == nil {\n\t\treturn nil\n\t}\n\tvar aliasIds []string\n\tfor _, field := range e.toFields(rule.Aliases) {\n\t\taliasIds = append(aliasIds, field.GetId())\n\t}\n\treturn &plugin.FieldRule{\n\t\tValue:                 e.toValue(rule.Value),\n\t\tCustomResolver:        rule.CustomResolver,\n\t\tMessageCustomResolver: rule.MessageCustomResolver,\n\t\tAliasIds:              aliasIds,\n\t\tAutoBindField:         e.toAutoBindField(rule.AutoBindField),\n\t\tOneofRule:             e.toFieldOneofRule(field, rule.Oneof),\n\t}\n}\n\nfunc (e *encoder) toAutoBindField(field *resolver.AutoBindField) *plugin.AutoBindField {\n\tif field == nil {\n\t\treturn nil\n\t}\n\treturn &plugin.AutoBindField{\n\t\tVariableDefinitionId: e.toVariableDefinition(field.Field.FQDN(), field.VariableDefinition).GetId(),\n\t\tFieldId:              e.toField(field.Field).GetId(),\n\t}\n}\n\nfunc (e *encoder) toFieldOneofRule(field *resolver.Field, rule *resolver.FieldOneofRule) *plugin.FieldOneofRule {\n\tif rule == nil {\n\t\treturn nil\n\t}\n\tret := &plugin.FieldOneofRule{Default: rule.Default}\n\tret.If = e.toCELValue(rule.If)\n\tret.By = e.toCELValue(rule.By)\n\tret.DefSet = e.toVariableDefinitionSet(field.FQDN()+\"/oneof\", rule.DefSet)\n\treturn ret\n}\n\nfunc (e *encoder) toOneofs(oneofs []*resolver.Oneof) []*plugin.Oneof {\n\tret := make([]*plugin.Oneof, 0, len(oneofs))\n\tfor _, oneof := range oneofs {\n\t\to := e.toOneof(oneof)\n\t\tif o == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, o)\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toOneof(oneof *resolver.Oneof) *plugin.Oneof {\n\tif oneof == nil {\n\t\treturn nil\n\t}\n\tid := e.toOneofID(oneof)\n\tif oneof, exists := e.ref.OneofMap[id]; exists {\n\t\treturn oneof\n\t}\n\tret := &plugin.Oneof{Id: id, Name: oneof.Name}\n\te.ref.OneofMap[id] = ret\n\n\tret.MessageId = e.toMessage(oneof.Message).GetId()\n\tfor _, field := range e.toFields(oneof.Fields) {\n\t\tret.FieldIds = append(ret.FieldIds, field.GetId())\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toMethods(mtds []*resolver.Method) []*plugin.Method {\n\tret := make([]*plugin.Method, 0, len(mtds))\n\tfor _, mtd := range mtds {\n\t\tm := e.toMethod(mtd)\n\t\tif m == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, m)\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toMethod(mtd *resolver.Method) *plugin.Method {\n\tif mtd == nil {\n\t\treturn nil\n\t}\n\tid := e.toMethodID(mtd)\n\tif mtd, exists := e.ref.MethodMap[id]; exists {\n\t\treturn mtd\n\t}\n\tret := &plugin.Method{Id: id, Name: mtd.Name}\n\te.ref.MethodMap[id] = ret\n\n\tret.RequestId = e.toMessage(mtd.Request).GetId()\n\tret.ResponseId = e.toMessage(mtd.Response).GetId()\n\tret.ServiceId = e.toService(mtd.Service).GetId()\n\tret.Rule = e.toMethodRule(mtd.Rule)\n\treturn ret\n}\n\nfunc (e *encoder) toMethodRule(rule *resolver.MethodRule) *plugin.MethodRule {\n\tif rule == nil {\n\t\treturn nil\n\t}\n\tvar timeout *durationpb.Duration\n\tif rule.Timeout != nil {\n\t\ttimeout = durationpb.New(*rule.Timeout)\n\t}\n\tvar response string\n\tif rule.Response != nil {\n\t\tresponse = e.toMessage(rule.Response).GetId()\n\t}\n\treturn &plugin.MethodRule{\n\t\tTimeout:    timeout,\n\t\tResponseId: response,\n\t}\n}\n\nfunc (e *encoder) toCELPlugins(plugins []*resolver.CELPlugin) []*plugin.CELPlugin {\n\tret := make([]*plugin.CELPlugin, 0, len(plugins))\n\tfor _, plugin := range plugins {\n\t\tp := e.toCELPlugin(plugin)\n\t\tif p == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, p)\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toCELPlugin(p *resolver.CELPlugin) *plugin.CELPlugin {\n\tif p == nil {\n\t\treturn nil\n\t}\n\tid := e.toCELPluginID(p)\n\tif plug, exists := e.ref.CelPluginMap[id]; exists {\n\t\treturn plug\n\t}\n\tret := &plugin.CELPlugin{\n\t\tId:          id,\n\t\tName:        p.Name,\n\t\tDescription: p.Desc,\n\t\tFunctions:   e.toCELFunctions(p.Functions),\n\t}\n\te.ref.CelPluginMap[id] = ret\n\treturn ret\n}\n\nfunc (e *encoder) toCELFunctions(fns []*resolver.CELFunction) []*plugin.CELFunction {\n\tret := make([]*plugin.CELFunction, 0, len(fns))\n\tfor _, fn := range fns {\n\t\tf := e.toCELFunction(fn)\n\t\tif f == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, f)\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toCELFunction(fn *resolver.CELFunction) *plugin.CELFunction {\n\tif fn == nil {\n\t\treturn nil\n\t}\n\treturn &plugin.CELFunction{\n\t\tName:       fn.Name,\n\t\tId:         fn.ID,\n\t\tArgs:       e.toTypes(fn.Args),\n\t\tReturn:     e.toType(fn.Return),\n\t\tReceiverId: e.toMessage(fn.Receiver).GetId(),\n\t}\n}\n\nfunc (e *encoder) toTypes(t []*resolver.Type) []*plugin.Type {\n\tret := make([]*plugin.Type, 0, len(t))\n\tfor _, tt := range t {\n\t\tret = append(ret, e.toType(tt))\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toType(t *resolver.Type) *plugin.Type {\n\tif t == nil {\n\t\treturn nil\n\t}\n\tret := &plugin.Type{\n\t\tKind:     e.toTypeKind(t.Kind),\n\t\tRepeated: t.Repeated,\n\t\tIsNull:   t.IsNull,\n\t}\n\tswitch {\n\tcase t.Message != nil:\n\t\tret.Ref = &plugin.Type_MessageId{\n\t\t\tMessageId: e.toMessage(t.Message).GetId(),\n\t\t}\n\tcase t.Enum != nil:\n\t\tret.Ref = &plugin.Type_EnumId{\n\t\t\tEnumId: e.toEnum(t.Enum).GetId(),\n\t\t}\n\tcase t.OneofField != nil:\n\t\tret.Ref = &plugin.Type_OneofFieldId{\n\t\t\tOneofFieldId: e.toField(t.OneofField.Field).GetId(),\n\t\t}\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toTypeKind(kind types.Kind) plugin.TypeKind {\n\tswitch kind {\n\tcase types.Double:\n\t\treturn plugin.TypeKind_DOUBLE_TYPE\n\tcase types.Float:\n\t\treturn plugin.TypeKind_FLOAT_TYPE\n\tcase types.Int64:\n\t\treturn plugin.TypeKind_INT64_TYPE\n\tcase types.Uint64:\n\t\treturn plugin.TypeKind_UINT64_TYPE\n\tcase types.Int32:\n\t\treturn plugin.TypeKind_INT32_TYPE\n\tcase types.Fixed64:\n\t\treturn plugin.TypeKind_FIXED64_TYPE\n\tcase types.Fixed32:\n\t\treturn plugin.TypeKind_FIXED32_TYPE\n\tcase types.Bool:\n\t\treturn plugin.TypeKind_BOOL_TYPE\n\tcase types.String:\n\t\treturn plugin.TypeKind_STRING_TYPE\n\tcase types.Group:\n\t\treturn plugin.TypeKind_GROUP_TYPE\n\tcase types.Message:\n\t\treturn plugin.TypeKind_MESSAGE_TYPE\n\tcase types.Bytes:\n\t\treturn plugin.TypeKind_BYTES_TYPE\n\tcase types.Uint32:\n\t\treturn plugin.TypeKind_UINT32_TYPE\n\tcase types.Enum:\n\t\treturn plugin.TypeKind_ENUM_TYPE\n\tcase types.Sfixed32:\n\t\treturn plugin.TypeKind_SFIXED32_TYPE\n\tcase types.Sfixed64:\n\t\treturn plugin.TypeKind_SFIXED64_TYPE\n\tcase types.Sint32:\n\t\treturn plugin.TypeKind_SINT32_TYPE\n\tcase types.Sint64:\n\t\treturn plugin.TypeKind_SINT64_TYPE\n\t}\n\treturn plugin.TypeKind_UNKNOWN_TYPE\n}\n\nfunc (e *encoder) toMessageDependencyGraph(graph *resolver.MessageDependencyGraph) *plugin.MessageDependencyGraph {\n\tif graph == nil {\n\t\treturn nil\n\t}\n\tid := e.toDependencyGraphID(graph)\n\tif g, exists := e.ref.GraphMap[id]; exists {\n\t\treturn g\n\t}\n\tret := &plugin.MessageDependencyGraph{Id: id}\n\te.ref.GraphMap[id] = ret\n\n\trootIDs := make([]string, 0, len(graph.Roots))\n\tfor _, node := range e.toMessageDependencyGraphNodes(graph.Roots) {\n\t\trootIDs = append(rootIDs, node.Id)\n\t}\n\tret.RootNodeIds = rootIDs\n\treturn ret\n}\n\nfunc (e *encoder) toMessageDependencyGraphNodes(nodes []*resolver.MessageDependencyGraphNode) []*plugin.MessageDependencyGraphNode {\n\tret := make([]*plugin.MessageDependencyGraphNode, 0, len(nodes))\n\tfor _, node := range nodes {\n\t\tret = append(ret, e.toMessageDependencyGraphNode(node))\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toMessageDependencyGraphNode(n *resolver.MessageDependencyGraphNode) *plugin.MessageDependencyGraphNode {\n\tif n == nil {\n\t\treturn nil\n\t}\n\t// Since a node corresponds one-to-one with a variable definition, the variable definition ID can be used as-is.\n\tnodeID := e.toVariableDefinitionID(n.BaseMessage.FQDN(), n.VariableDefinition)\n\tif node, exists := e.ref.GraphNodeMap[nodeID]; exists {\n\t\treturn node\n\t}\n\tret := &plugin.MessageDependencyGraphNode{\n\t\tId:                   nodeID,\n\t\tBaseMessageId:        e.toMessage(n.BaseMessage).GetId(),\n\t\tVariableDefinitionId: e.toVariableDefinition(n.BaseMessage.FQDN(), n.VariableDefinition).GetId(),\n\t}\n\te.ref.GraphNodeMap[nodeID] = ret\n\tchildIDs := make([]string, 0, len(n.Children))\n\tfor _, node := range e.toMessageDependencyGraphNodes(n.Children) {\n\t\tchildIDs = append(childIDs, node.Id)\n\t}\n\tret.ChildIds = childIDs\n\treturn ret\n}\n\nfunc (e *encoder) toVariableDefinitions(fqdn string, defs []*resolver.VariableDefinition) []*plugin.VariableDefinition {\n\tret := make([]*plugin.VariableDefinition, 0, len(defs))\n\tfor _, def := range defs {\n\t\td := e.toVariableDefinition(fqdn, def)\n\t\tif d == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, d)\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toVariableDefinitionGroups(fqdn string, groups []resolver.VariableDefinitionGroup) []*plugin.VariableDefinitionGroup {\n\tret := make([]*plugin.VariableDefinitionGroup, 0, len(groups))\n\tfor _, group := range groups {\n\t\tg := e.toVariableDefinitionGroup(fqdn, group)\n\t\tif g == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, g)\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toVariableDefinition(fqdn string, def *resolver.VariableDefinition) *plugin.VariableDefinition {\n\tif def == nil {\n\t\treturn nil\n\t}\n\tid := e.toVariableDefinitionID(fqdn, def)\n\tif def, exists := e.ref.VariableDefinitionMap[id]; exists {\n\t\treturn def\n\t}\n\tret := &plugin.VariableDefinition{\n\t\tId:       id,\n\t\tIndex:    int64(def.Idx),\n\t\tName:     def.Name,\n\t\tAutoBind: def.AutoBind,\n\t\tUsed:     def.Used,\n\t}\n\te.ref.VariableDefinitionMap[id] = ret\n\n\tret.If = e.toCELValue(def.If)\n\tret.Expr = e.toVariableExpr(id, def.Expr)\n\treturn ret\n}\n\nfunc (e *encoder) toVariableDefinitionGroup(fqdn string, group resolver.VariableDefinitionGroup) *plugin.VariableDefinitionGroup {\n\tif group == nil {\n\t\treturn nil\n\t}\n\tid := e.toVariableDefinitionGroupID(fqdn, group)\n\tif g, exists := e.ref.VariableDefinitionGroupMap[id]; exists {\n\t\treturn g\n\t}\n\tret := &plugin.VariableDefinitionGroup{Id: id}\n\te.ref.VariableDefinitionGroupMap[id] = ret\n\n\tswitch group.Type() {\n\tcase resolver.SequentialVariableDefinitionGroupType:\n\t\tret.Group = &plugin.VariableDefinitionGroup_Sequential{\n\t\t\tSequential: e.toSequentialVariableDefinitionGroup(fqdn, group.(*resolver.SequentialVariableDefinitionGroup)),\n\t\t}\n\tcase resolver.ConcurrentVariableDefinitionGroupType:\n\t\tret.Group = &plugin.VariableDefinitionGroup_Concurrent{\n\t\t\tConcurrent: e.toConcurrentVariableDefinitionGroup(fqdn, group.(*resolver.ConcurrentVariableDefinitionGroup)),\n\t\t}\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toSequentialVariableDefinitionGroup(fqdn string, g *resolver.SequentialVariableDefinitionGroup) *plugin.SequentialVariableDefinitionGroup {\n\treturn &plugin.SequentialVariableDefinitionGroup{\n\t\tStart: e.toVariableDefinitionGroup(fqdn, g.Start).GetId(),\n\t\tEnd:   e.toVariableDefinition(fqdn, g.End).GetId(),\n\t}\n}\n\nfunc (e *encoder) toConcurrentVariableDefinitionGroup(fqdn string, g *resolver.ConcurrentVariableDefinitionGroup) *plugin.ConcurrentVariableDefinitionGroup {\n\tret := &plugin.ConcurrentVariableDefinitionGroup{}\n\n\tfor _, group := range e.toVariableDefinitionGroups(fqdn, g.Starts) {\n\t\tret.Starts = append(ret.Starts, group.GetId())\n\t}\n\tret.End = e.toVariableDefinition(fqdn, g.End).GetId()\n\treturn ret\n}\n\nfunc (e *encoder) toCELValues(v []*resolver.CELValue) []*plugin.CELValue {\n\tret := make([]*plugin.CELValue, 0, len(v))\n\tfor _, vv := range v {\n\t\tret = append(ret, e.toCELValue(vv))\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toCELValue(v *resolver.CELValue) *plugin.CELValue {\n\tif v == nil {\n\t\treturn nil\n\t}\n\treturn &plugin.CELValue{\n\t\tExpr: v.Expr,\n\t\tOut:  e.toType(v.Out),\n\t}\n}\n\nfunc (e *encoder) toVariableExpr(fqdn string, expr *resolver.VariableExpr) *plugin.VariableExpr {\n\tif expr == nil {\n\t\treturn nil\n\t}\n\tret := &plugin.VariableExpr{\n\t\tType: e.toType(expr.Type),\n\t}\n\tswitch {\n\tcase expr.By != nil:\n\t\tret.Expr = &plugin.VariableExpr_By{\n\t\t\tBy: e.toCELValue(expr.By),\n\t\t}\n\tcase expr.Map != nil:\n\t\tret.Expr = &plugin.VariableExpr_Map{\n\t\t\tMap: e.toMapExpr(fqdn, expr.Map),\n\t\t}\n\tcase expr.Call != nil:\n\t\tret.Expr = &plugin.VariableExpr_Call{\n\t\t\tCall: e.toCallExpr(fqdn, expr.Call),\n\t\t}\n\tcase expr.Message != nil:\n\t\tret.Expr = &plugin.VariableExpr_Message{\n\t\t\tMessage: e.toMessageExpr(expr.Message),\n\t\t}\n\tcase expr.Enum != nil:\n\t\tret.Expr = &plugin.VariableExpr_Enum{\n\t\t\tEnum: e.toEnumExpr(expr.Enum),\n\t\t}\n\tcase expr.Switch != nil:\n\t\tret.Expr = &plugin.VariableExpr_Switch{\n\t\t\tSwitch: e.toSwitchExpr(fqdn, expr.Switch),\n\t\t}\n\tcase expr.Validation != nil:\n\t\tret.Expr = &plugin.VariableExpr_Validation{\n\t\t\tValidation: e.toValidationExpr(fqdn, expr.Validation),\n\t\t}\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toMapExpr(fqdn string, expr *resolver.MapExpr) *plugin.MapExpr {\n\tif expr == nil {\n\t\treturn nil\n\t}\n\treturn &plugin.MapExpr{\n\t\tIterator: e.toIterator(fqdn, expr.Iterator),\n\t\tExpr:     e.toMapIteratorExpr(expr.Expr),\n\t}\n}\n\nfunc (e *encoder) toIterator(fqdn string, iter *resolver.Iterator) *plugin.Iterator {\n\tif iter == nil {\n\t\treturn nil\n\t}\n\treturn &plugin.Iterator{\n\t\tName:     iter.Name,\n\t\tSourceId: e.toVariableDefinition(fqdn, iter.Source).Id,\n\t}\n}\n\nfunc (e *encoder) toMapIteratorExpr(expr *resolver.MapIteratorExpr) *plugin.MapIteratorExpr {\n\tif expr == nil {\n\t\treturn nil\n\t}\n\tret := &plugin.MapIteratorExpr{\n\t\tType: e.toType(expr.Type),\n\t}\n\tswitch {\n\tcase expr.By != nil:\n\t\tret.Expr = &plugin.MapIteratorExpr_By{\n\t\t\tBy: e.toCELValue(expr.By),\n\t\t}\n\tcase expr.Message != nil:\n\t\tret.Expr = &plugin.MapIteratorExpr_Message{\n\t\t\tMessage: e.toMessageExpr(expr.Message),\n\t\t}\n\tcase expr.Enum != nil:\n\t\tret.Expr = &plugin.MapIteratorExpr_Enum{\n\t\t\tEnum: e.toEnumExpr(expr.Enum),\n\t\t}\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toCallExpr(fqdn string, expr *resolver.CallExpr) *plugin.CallExpr {\n\tif expr == nil {\n\t\treturn nil\n\t}\n\tvar timeout *durationpb.Duration\n\tif expr.Timeout != nil {\n\t\ttimeout = durationpb.New(*expr.Timeout)\n\t}\n\treturn &plugin.CallExpr{\n\t\tMethodId: e.toMethod(expr.Method).GetId(),\n\t\tRequest:  e.toRequest(expr.Request),\n\t\tTimeout:  timeout,\n\t\tRetry:    e.toRetryPolicy(expr.Retry),\n\t\tErrors:   e.toGRPCErrors(fqdn, expr.Errors),\n\t\tMetadata: e.toCELValue(expr.Metadata),\n\t\tOption:   e.toGRPCCallOption(fqdn, expr.Option),\n\t}\n}\n\nfunc (e *encoder) toRequest(req *resolver.Request) *plugin.Request {\n\tif req == nil {\n\t\treturn nil\n\t}\n\treturn &plugin.Request{\n\t\tArgs:   e.toArgs(req.Args),\n\t\tTypeId: e.toMessage(req.Type).GetId(),\n\t}\n}\n\nfunc (e *encoder) toRetryPolicy(policy *resolver.RetryPolicy) *plugin.RetryPolicy {\n\tif policy == nil {\n\t\treturn nil\n\t}\n\tret := &plugin.RetryPolicy{\n\t\tIf: e.toCELValue(policy.If),\n\t}\n\tswitch {\n\tcase policy.Constant != nil:\n\t\tret.Policy = &plugin.RetryPolicy_Constant{\n\t\t\tConstant: e.toRetryConstant(policy.Constant),\n\t\t}\n\tcase policy.Exponential != nil:\n\t\tret.Policy = &plugin.RetryPolicy_Exponential{\n\t\t\tExponential: e.toRetryExponential(policy.Exponential),\n\t\t}\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toRetryConstant(cons *resolver.RetryPolicyConstant) *plugin.RetryPolicyConstant {\n\tif cons == nil {\n\t\treturn nil\n\t}\n\treturn &plugin.RetryPolicyConstant{\n\t\tInterval:   durationpb.New(cons.Interval),\n\t\tMaxRetries: cons.MaxRetries,\n\t}\n}\n\nfunc (e *encoder) toRetryExponential(exp *resolver.RetryPolicyExponential) *plugin.RetryPolicyExponential {\n\tif exp == nil {\n\t\treturn nil\n\t}\n\treturn &plugin.RetryPolicyExponential{\n\t\tInitialInterval:     durationpb.New(exp.InitialInterval),\n\t\tRandomizationFactor: exp.RandomizationFactor,\n\t\tMultiplier:          exp.Multiplier,\n\t\tMaxInterval:         durationpb.New(exp.MaxInterval),\n\t\tMaxRetries:          exp.MaxRetries,\n\t\tMaxElapsedTime:      durationpb.New(exp.MaxElapsedTime),\n\t}\n}\n\nfunc (e *encoder) toMessageExpr(expr *resolver.MessageExpr) *plugin.MessageExpr {\n\tif expr == nil {\n\t\treturn nil\n\t}\n\treturn &plugin.MessageExpr{\n\t\tMessageId: e.toMessage(expr.Message).GetId(),\n\t\tArgs:      e.toArgs(expr.Args),\n\t}\n}\n\nfunc (e *encoder) toArgs(args []*resolver.Argument) []*plugin.Argument {\n\tret := make([]*plugin.Argument, 0, len(args))\n\tfor _, arg := range args {\n\t\tret = append(ret, e.toArg(arg))\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toArg(arg *resolver.Argument) *plugin.Argument {\n\treturn &plugin.Argument{\n\t\tName:  arg.Name,\n\t\tType:  e.toType(arg.Type),\n\t\tValue: e.toValue(arg.Value),\n\t\tIf:    e.toCELValue(arg.If),\n\t}\n}\n\nfunc (e *encoder) toValue(value *resolver.Value) *plugin.Value {\n\tif value == nil {\n\t\treturn nil\n\t}\n\treturn &plugin.Value{\n\t\tInline: value.Inline,\n\t\tCel:    e.toCELValue(value.CEL),\n\t}\n}\n\nfunc (e *encoder) toEnumExpr(expr *resolver.EnumExpr) *plugin.EnumExpr {\n\tif expr == nil {\n\t\treturn nil\n\t}\n\treturn &plugin.EnumExpr{\n\t\tEnumId: e.toEnum(expr.Enum).GetId(),\n\t\tBy:     e.toCELValue(expr.By),\n\t}\n}\n\nfunc (e *encoder) toSwitchExpr(fqdn string, expr *resolver.SwitchExpr) *plugin.SwitchExpr {\n\tif expr == nil {\n\t\treturn nil\n\t}\n\treturn &plugin.SwitchExpr{\n\t\tType:    e.toType(expr.Type),\n\t\tCases:   e.toSwitchCases(fqdn, expr.Cases),\n\t\tDefault: e.toSwitchDefault(fqdn, expr.Default),\n\t}\n}\n\nfunc (e *encoder) toSwitchCases(fdqn string, cases []*resolver.SwitchCaseExpr) []*plugin.SwitchCase {\n\tret := make([]*plugin.SwitchCase, 0, len(cases))\n\tfor _, cse := range cases {\n\t\tret = append(ret, e.toSwitchCase(fdqn, cse))\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toSwitchCase(fqdn string, cse *resolver.SwitchCaseExpr) *plugin.SwitchCase {\n\tif cse == nil {\n\t\treturn nil\n\t}\n\treturn &plugin.SwitchCase{\n\t\tDefSet: e.toVariableDefinitionSet(fqdn, cse.DefSet),\n\t\tIf:     e.toCELValue(cse.If),\n\t\tBy:     e.toCELValue(cse.By),\n\t}\n}\n\nfunc (e *encoder) toSwitchDefault(fqdn string, def *resolver.SwitchDefaultExpr) *plugin.SwitchDefault {\n\tif def == nil {\n\t\treturn nil\n\t}\n\treturn &plugin.SwitchDefault{\n\t\tDefSet: e.toVariableDefinitionSet(fqdn, def.DefSet),\n\t\tBy:     e.toCELValue(def.By),\n\t}\n}\n\nfunc (e *encoder) toValidationExpr(fqdn string, expr *resolver.ValidationExpr) *plugin.ValidationExpr {\n\tif expr == nil {\n\t\treturn nil\n\t}\n\treturn &plugin.ValidationExpr{\n\t\tError: e.toGRPCError(fmt.Sprintf(\"%s/err\", fqdn), expr.Error),\n\t}\n}\n\nfunc (e *encoder) toGRPCErrors(fqdn string, grpcErrs []*resolver.GRPCError) []*plugin.GRPCError {\n\tret := make([]*plugin.GRPCError, 0, len(grpcErrs))\n\tfor idx, grpcErr := range grpcErrs {\n\t\tret = append(ret, e.toGRPCError(fmt.Sprintf(\"%s/err%d\", fqdn, idx), grpcErr))\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toGRPCError(fqdn string, err *resolver.GRPCError) *plugin.GRPCError {\n\tif err == nil {\n\t\treturn nil\n\t}\n\treturn &plugin.GRPCError{\n\t\tCode:              err.Code,\n\t\tIf:                e.toCELValue(err.If),\n\t\tMessage:           e.toCELValue(err.Message),\n\t\tDetails:           e.toGRPCErrorDetails(fqdn, err.Details),\n\t\tIgnore:            err.Ignore,\n\t\tIgnoreAndResponse: e.toCELValue(err.IgnoreAndResponse),\n\t\tLogLevel:          int32(err.LogLevel), //nolint:gosec\n\t}\n}\n\nfunc (e *encoder) toGRPCErrorDetails(fqdn string, details []*resolver.GRPCErrorDetail) []*plugin.GRPCErrorDetail {\n\tret := make([]*plugin.GRPCErrorDetail, 0, len(details))\n\tfor idx, detail := range details {\n\t\tret = append(ret, e.toGRPCErrorDetail(fmt.Sprintf(\"%s/errdetail%d\", fqdn, idx), detail))\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toGRPCErrorDetail(fqdn string, detail *resolver.GRPCErrorDetail) *plugin.GRPCErrorDetail {\n\tif detail == nil {\n\t\treturn nil\n\t}\n\tret := &plugin.GRPCErrorDetail{}\n\tret.DefSet = e.toVariableDefinitionSet(fqdn, detail.DefSet)\n\tret.If = e.toCELValue(detail.If)\n\tret.By = e.toCELValues(detail.By)\n\tret.PreconditionFailures = e.toPreconditionFailures(detail.PreconditionFailures)\n\tret.BadRequests = e.toBadRequests(detail.BadRequests)\n\tret.LocalizedMessages = e.toLocalizedMessages(detail.LocalizedMessages)\n\tret.Messages = e.toVariableDefinitionSet(fmt.Sprintf(\"%s/msg\", fqdn), detail.Messages)\n\treturn ret\n}\n\nfunc (e *encoder) toPreconditionFailures(failures []*resolver.PreconditionFailure) []*plugin.PreconditionFailure {\n\tret := make([]*plugin.PreconditionFailure, 0, len(failures))\n\tfor _, failure := range failures {\n\t\tret = append(ret, e.toPreconditionFailure(failure))\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toPreconditionFailure(failure *resolver.PreconditionFailure) *plugin.PreconditionFailure {\n\tif failure == nil {\n\t\treturn nil\n\t}\n\treturn &plugin.PreconditionFailure{\n\t\tViolations: e.toPreconditionFailureViolations(failure.Violations),\n\t}\n}\n\nfunc (e *encoder) toPreconditionFailureViolations(v []*resolver.PreconditionFailureViolation) []*plugin.PreconditionFailureViolation {\n\tret := make([]*plugin.PreconditionFailureViolation, 0, len(v))\n\tfor _, vv := range v {\n\t\tret = append(ret, e.toPreconditionFailureViolation(vv))\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toPreconditionFailureViolation(v *resolver.PreconditionFailureViolation) *plugin.PreconditionFailureViolation {\n\tif v == nil {\n\t\treturn nil\n\t}\n\treturn &plugin.PreconditionFailureViolation{\n\t\tType:        e.toCELValue(v.Type),\n\t\tSubject:     e.toCELValue(v.Subject),\n\t\tDescription: e.toCELValue(v.Description),\n\t}\n}\n\nfunc (e *encoder) toBadRequests(reqs []*resolver.BadRequest) []*plugin.BadRequest {\n\tret := make([]*plugin.BadRequest, 0, len(reqs))\n\tfor _, req := range reqs {\n\t\tret = append(ret, e.toBadRequest(req))\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toBadRequest(req *resolver.BadRequest) *plugin.BadRequest {\n\tif req == nil {\n\t\treturn nil\n\t}\n\treturn &plugin.BadRequest{\n\t\tFieldViolations: e.toBadRequestFieldViolations(req.FieldViolations),\n\t}\n}\n\nfunc (e *encoder) toBadRequestFieldViolations(v []*resolver.BadRequestFieldViolation) []*plugin.BadRequestFieldViolation {\n\tret := make([]*plugin.BadRequestFieldViolation, 0, len(v))\n\tfor _, vv := range v {\n\t\tret = append(ret, e.toBadRequestFieldViolation(vv))\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toBadRequestFieldViolation(v *resolver.BadRequestFieldViolation) *plugin.BadRequestFieldViolation {\n\tif v == nil {\n\t\treturn nil\n\t}\n\treturn &plugin.BadRequestFieldViolation{\n\t\tField:       e.toCELValue(v.Field),\n\t\tDescription: e.toCELValue(v.Description),\n\t}\n}\n\nfunc (e *encoder) toLocalizedMessages(msgs []*resolver.LocalizedMessage) []*plugin.LocalizedMessage {\n\tret := make([]*plugin.LocalizedMessage, 0, len(msgs))\n\tfor _, msg := range msgs {\n\t\tret = append(ret, e.toLocalizedMessage(msg))\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toLocalizedMessage(msg *resolver.LocalizedMessage) *plugin.LocalizedMessage {\n\tif msg == nil {\n\t\treturn nil\n\t}\n\treturn &plugin.LocalizedMessage{\n\t\tLocale:  msg.Locale,\n\t\tMessage: e.toCELValue(msg.Message),\n\t}\n}\n\nfunc (e *encoder) toGRPCCallOption(fqdn string, v *resolver.GRPCCallOption) *plugin.GRPCCallOption {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tret := &plugin.GRPCCallOption{\n\t\tContentSubtype:     v.ContentSubtype,\n\t\tMaxCallRecvMsgSize: v.MaxCallRecvMsgSize,\n\t\tMaxCallSendMsgSize: v.MaxCallSendMsgSize,\n\t\tStaticMethod:       v.StaticMethod,\n\t\tWaitForReady:       v.WaitForReady,\n\t}\n\tif v.Header != nil {\n\t\tid := e.toVariableDefinition(fqdn, v.Header).Id\n\t\tret.HeaderId = &id\n\t}\n\tif v.Trailer != nil {\n\t\tid := e.toVariableDefinition(fqdn, v.Trailer).Id\n\t\tret.TrailerId = &id\n\t}\n\treturn ret\n}\n\nfunc (e *encoder) toFileID(file *resolver.File) string {\n\tif file == nil {\n\t\treturn \"\"\n\t}\n\treturn file.Package.Name + \":\" + file.Name\n}\n\nfunc (e *encoder) toServiceID(svc *resolver.Service) string {\n\tif svc == nil {\n\t\treturn \"\"\n\t}\n\treturn svc.FQDN()\n}\n\nfunc (e *encoder) toMethodID(mtd *resolver.Method) string {\n\tif mtd == nil {\n\t\treturn \"\"\n\t}\n\treturn mtd.FQDN()\n}\n\nfunc (e *encoder) toMessageID(msg *resolver.Message) string {\n\tif msg == nil {\n\t\treturn \"\"\n\t}\n\treturn msg.FQDN()\n}\n\nfunc (e *encoder) toFieldID(field *resolver.Field) string {\n\tif field == nil {\n\t\treturn \"\"\n\t}\n\treturn field.FQDN()\n}\n\nfunc (e *encoder) toOneofID(oneof *resolver.Oneof) string {\n\tif oneof == nil {\n\t\treturn \"\"\n\t}\n\treturn fmt.Sprintf(\"%s.%s\", oneof.Message.FQDN(), oneof.Name)\n}\n\nfunc (e *encoder) toEnumID(enum *resolver.Enum) string {\n\tif enum == nil {\n\t\treturn \"\"\n\t}\n\treturn enum.FQDN()\n}\n\nfunc (e *encoder) toEnumValueID(value *resolver.EnumValue) string {\n\tif value == nil {\n\t\treturn \"\"\n\t}\n\treturn fmt.Sprintf(\"%s.%s\", value.Enum.FQDN(), value.Value)\n}\n\nfunc (e *encoder) toCELPluginID(celPlugin *resolver.CELPlugin) string {\n\tif celPlugin == nil {\n\t\treturn \"\"\n\t}\n\treturn celPlugin.Name\n}\n\nfunc (e *encoder) toDependencyGraphID(graph *resolver.MessageDependencyGraph) string {\n\tif graph == nil {\n\t\treturn \"\"\n\t}\n\troots := make([]string, 0, len(graph.Roots))\n\tfor _, root := range graph.Roots {\n\t\troots = append(roots, root.FQDN())\n\t}\n\treturn strings.Join(roots, \":\")\n}\n\nfunc (e *encoder) toVariableDefinitionID(fqdn string, def *resolver.VariableDefinition) string {\n\tif def == nil {\n\t\treturn \"\"\n\t}\n\treturn fqdn + \"/\" + def.Name\n}\n\nfunc (e *encoder) toVariableDefinitionGroupID(fqdn string, group resolver.VariableDefinitionGroup) string {\n\tif group == nil {\n\t\treturn \"\"\n\t}\n\tvar defIDs []string\n\tfor _, def := range group.VariableDefinitions() {\n\t\tdefIDs = append(defIDs, e.toVariableDefinitionID(fqdn, def))\n\t}\n\treturn fmt.Sprintf(\"%s/%s\", group.Type(), strings.Join(defIDs, \":\"))\n}\n"
  },
  {
    "path": "grpc/federation/generator/generator_test.go",
    "content": "package generator_test\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"google.golang.org/protobuf/proto\"\n\n\t\"github.com/mercari/grpc-federation/grpc/federation/generator\"\n\t\"github.com/mercari/grpc-federation/internal/testutil\"\n\t\"github.com/mercari/grpc-federation/resolver\"\n)\n\nfunc TestRoundTrip(t *testing.T) {\n\tt.Parallel()\n\ttests := []string{\n\t\t\"simple_aggregation\",\n\t\t\"minimum\",\n\t\t\"create_post\",\n\t\t\"custom_resolver\",\n\t\t\"async\",\n\t\t\"alias\",\n\t\t\"autobind\",\n\t\t\"multi_user\",\n\t\t\"resolver_overlaps\",\n\t\t\"oneof\",\n\t\t\"validation\",\n\t\t\"map\",\n\t\t\"condition\",\n\t\t\"switch\",\n\t}\n\tfor _, test := range tests {\n\t\ttest := test\n\t\tt.Run(test, func(t *testing.T) {\n\t\t\tt.Parallel()\n\t\t\ttestdataDir := filepath.Join(testutil.RepoRoot(), \"testdata\")\n\t\t\tfiles := testutil.Compile(t, filepath.Join(testdataDir, fmt.Sprintf(\"%s.proto\", test)))\n\t\t\tr := resolver.New(files, resolver.ImportPathOption(testdataDir))\n\t\t\tresult, err := r.Resolve()\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tsvcToDepNum := make(map[string]int)\n\t\t\tfor _, file := range result.Files {\n\t\t\t\tfor _, svc := range file.Services {\n\t\t\t\t\tsvcToDepNum[svc.Name] = len(svc.ServiceDependencies())\n\t\t\t\t}\n\t\t\t}\n\t\t\tgenReq := generator.CreateCodeGeneratorRequest(&generator.CodeGeneratorRequestConfig{\n\t\t\t\tGRPCFederationFiles: result.Files,\n\t\t\t})\n\t\t\tgenReqBytes, err := proto.Marshal(genReq)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tdecoded, err := generator.ToCodeGeneratorRequest(bytes.NewBuffer(genReqBytes))\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tgotSvcToDepNum := make(map[string]int)\n\t\t\tfor _, file := range decoded.GRPCFederationFiles {\n\t\t\t\tfor _, svc := range file.Services {\n\t\t\t\t\tgotSvcToDepNum[svc.Name] = len(svc.ServiceDependencies())\n\t\t\t\t}\n\t\t\t}\n\t\t\tif diff := cmp.Diff(svcToDepNum, gotSvcToDepNum); diff != \"\" {\n\t\t\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t}\n\t\t\tif diff := cmp.Diff(\n\t\t\t\tdecoded.GRPCFederationFiles,\n\t\t\t\tresult.Files,\n\t\t\t\ttestutil.ResolverCmpOpts()...,\n\t\t\t); diff != \"\" {\n\t\t\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "grpc/federation/generator/plugin/generator.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.33.0\n// \tprotoc        (unknown)\n// source: grpc/federation/generator.proto\n\npackage plugin\n\nimport (\n\tcode \"google.golang.org/genproto/googleapis/rpc/code\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tdurationpb \"google.golang.org/protobuf/types/known/durationpb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype ActionType int32\n\nconst (\n\tActionType_GENERATE_ACTION ActionType = 0\n\tActionType_KEEP_ACTION     ActionType = 1\n\tActionType_CREATE_ACTION   ActionType = 2\n\tActionType_DELETE_ACTION   ActionType = 3\n\tActionType_UPDATE_ACTION   ActionType = 4\n)\n\n// Enum value maps for ActionType.\nvar (\n\tActionType_name = map[int32]string{\n\t\t0: \"GENERATE_ACTION\",\n\t\t1: \"KEEP_ACTION\",\n\t\t2: \"CREATE_ACTION\",\n\t\t3: \"DELETE_ACTION\",\n\t\t4: \"UPDATE_ACTION\",\n\t}\n\tActionType_value = map[string]int32{\n\t\t\"GENERATE_ACTION\": 0,\n\t\t\"KEEP_ACTION\":     1,\n\t\t\"CREATE_ACTION\":   2,\n\t\t\"DELETE_ACTION\":   3,\n\t\t\"UPDATE_ACTION\":   4,\n\t}\n)\n\nfunc (x ActionType) Enum() *ActionType {\n\tp := new(ActionType)\n\t*p = x\n\treturn p\n}\n\nfunc (x ActionType) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (ActionType) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_grpc_federation_generator_proto_enumTypes[0].Descriptor()\n}\n\nfunc (ActionType) Type() protoreflect.EnumType {\n\treturn &file_grpc_federation_generator_proto_enumTypes[0]\n}\n\nfunc (x ActionType) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use ActionType.Descriptor instead.\nfunc (ActionType) EnumDescriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{0}\n}\n\ntype OutputFilePathMode int32\n\nconst (\n\tOutputFilePathMode_OUTPUT_FILE_PATH_MODE_UNSPECIFIED     OutputFilePathMode = 0\n\tOutputFilePathMode_OUTPUT_FILE_PATH_MODE_IMPORT          OutputFilePathMode = 1\n\tOutputFilePathMode_OUTPUT_FILE_PATH_MODE_MODULE_PREFIX   OutputFilePathMode = 2\n\tOutputFilePathMode_OUTPUT_FILE_PATH_MODE_SOURCE_RELATIVE OutputFilePathMode = 3\n)\n\n// Enum value maps for OutputFilePathMode.\nvar (\n\tOutputFilePathMode_name = map[int32]string{\n\t\t0: \"OUTPUT_FILE_PATH_MODE_UNSPECIFIED\",\n\t\t1: \"OUTPUT_FILE_PATH_MODE_IMPORT\",\n\t\t2: \"OUTPUT_FILE_PATH_MODE_MODULE_PREFIX\",\n\t\t3: \"OUTPUT_FILE_PATH_MODE_SOURCE_RELATIVE\",\n\t}\n\tOutputFilePathMode_value = map[string]int32{\n\t\t\"OUTPUT_FILE_PATH_MODE_UNSPECIFIED\":     0,\n\t\t\"OUTPUT_FILE_PATH_MODE_IMPORT\":          1,\n\t\t\"OUTPUT_FILE_PATH_MODE_MODULE_PREFIX\":   2,\n\t\t\"OUTPUT_FILE_PATH_MODE_SOURCE_RELATIVE\": 3,\n\t}\n)\n\nfunc (x OutputFilePathMode) Enum() *OutputFilePathMode {\n\tp := new(OutputFilePathMode)\n\t*p = x\n\treturn p\n}\n\nfunc (x OutputFilePathMode) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (OutputFilePathMode) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_grpc_federation_generator_proto_enumTypes[1].Descriptor()\n}\n\nfunc (OutputFilePathMode) Type() protoreflect.EnumType {\n\treturn &file_grpc_federation_generator_proto_enumTypes[1]\n}\n\nfunc (x OutputFilePathMode) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use OutputFilePathMode.Descriptor instead.\nfunc (OutputFilePathMode) EnumDescriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{1}\n}\n\ntype TypeKind int32\n\nconst (\n\tTypeKind_UNKNOWN_TYPE  TypeKind = 0\n\tTypeKind_DOUBLE_TYPE   TypeKind = 1\n\tTypeKind_FLOAT_TYPE    TypeKind = 2\n\tTypeKind_INT64_TYPE    TypeKind = 3\n\tTypeKind_UINT64_TYPE   TypeKind = 4\n\tTypeKind_INT32_TYPE    TypeKind = 5\n\tTypeKind_FIXED64_TYPE  TypeKind = 6\n\tTypeKind_FIXED32_TYPE  TypeKind = 7\n\tTypeKind_BOOL_TYPE     TypeKind = 8\n\tTypeKind_STRING_TYPE   TypeKind = 9\n\tTypeKind_GROUP_TYPE    TypeKind = 10\n\tTypeKind_MESSAGE_TYPE  TypeKind = 11\n\tTypeKind_BYTES_TYPE    TypeKind = 12\n\tTypeKind_UINT32_TYPE   TypeKind = 13\n\tTypeKind_ENUM_TYPE     TypeKind = 14\n\tTypeKind_SFIXED32_TYPE TypeKind = 15\n\tTypeKind_SFIXED64_TYPE TypeKind = 16\n\tTypeKind_SINT32_TYPE   TypeKind = 17\n\tTypeKind_SINT64_TYPE   TypeKind = 18\n)\n\n// Enum value maps for TypeKind.\nvar (\n\tTypeKind_name = map[int32]string{\n\t\t0:  \"UNKNOWN_TYPE\",\n\t\t1:  \"DOUBLE_TYPE\",\n\t\t2:  \"FLOAT_TYPE\",\n\t\t3:  \"INT64_TYPE\",\n\t\t4:  \"UINT64_TYPE\",\n\t\t5:  \"INT32_TYPE\",\n\t\t6:  \"FIXED64_TYPE\",\n\t\t7:  \"FIXED32_TYPE\",\n\t\t8:  \"BOOL_TYPE\",\n\t\t9:  \"STRING_TYPE\",\n\t\t10: \"GROUP_TYPE\",\n\t\t11: \"MESSAGE_TYPE\",\n\t\t12: \"BYTES_TYPE\",\n\t\t13: \"UINT32_TYPE\",\n\t\t14: \"ENUM_TYPE\",\n\t\t15: \"SFIXED32_TYPE\",\n\t\t16: \"SFIXED64_TYPE\",\n\t\t17: \"SINT32_TYPE\",\n\t\t18: \"SINT64_TYPE\",\n\t}\n\tTypeKind_value = map[string]int32{\n\t\t\"UNKNOWN_TYPE\":  0,\n\t\t\"DOUBLE_TYPE\":   1,\n\t\t\"FLOAT_TYPE\":    2,\n\t\t\"INT64_TYPE\":    3,\n\t\t\"UINT64_TYPE\":   4,\n\t\t\"INT32_TYPE\":    5,\n\t\t\"FIXED64_TYPE\":  6,\n\t\t\"FIXED32_TYPE\":  7,\n\t\t\"BOOL_TYPE\":     8,\n\t\t\"STRING_TYPE\":   9,\n\t\t\"GROUP_TYPE\":    10,\n\t\t\"MESSAGE_TYPE\":  11,\n\t\t\"BYTES_TYPE\":    12,\n\t\t\"UINT32_TYPE\":   13,\n\t\t\"ENUM_TYPE\":     14,\n\t\t\"SFIXED32_TYPE\": 15,\n\t\t\"SFIXED64_TYPE\": 16,\n\t\t\"SINT32_TYPE\":   17,\n\t\t\"SINT64_TYPE\":   18,\n\t}\n)\n\nfunc (x TypeKind) Enum() *TypeKind {\n\tp := new(TypeKind)\n\t*p = x\n\treturn p\n}\n\nfunc (x TypeKind) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (TypeKind) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_grpc_federation_generator_proto_enumTypes[2].Descriptor()\n}\n\nfunc (TypeKind) Type() protoreflect.EnumType {\n\treturn &file_grpc_federation_generator_proto_enumTypes[2]\n}\n\nfunc (x TypeKind) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use TypeKind.Descriptor instead.\nfunc (TypeKind) EnumDescriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{2}\n}\n\ntype ProtoCodeGeneratorResponse_Feature int32\n\nconst (\n\tProtoCodeGeneratorResponse_FEATURE_NONE              ProtoCodeGeneratorResponse_Feature = 0\n\tProtoCodeGeneratorResponse_FEATURE_PROTO3_OPTIONAL   ProtoCodeGeneratorResponse_Feature = 1\n\tProtoCodeGeneratorResponse_FEATURE_SUPPORTS_EDITIONS ProtoCodeGeneratorResponse_Feature = 2\n)\n\n// Enum value maps for ProtoCodeGeneratorResponse_Feature.\nvar (\n\tProtoCodeGeneratorResponse_Feature_name = map[int32]string{\n\t\t0: \"FEATURE_NONE\",\n\t\t1: \"FEATURE_PROTO3_OPTIONAL\",\n\t\t2: \"FEATURE_SUPPORTS_EDITIONS\",\n\t}\n\tProtoCodeGeneratorResponse_Feature_value = map[string]int32{\n\t\t\"FEATURE_NONE\":              0,\n\t\t\"FEATURE_PROTO3_OPTIONAL\":   1,\n\t\t\"FEATURE_SUPPORTS_EDITIONS\": 2,\n\t}\n)\n\nfunc (x ProtoCodeGeneratorResponse_Feature) Enum() *ProtoCodeGeneratorResponse_Feature {\n\tp := new(ProtoCodeGeneratorResponse_Feature)\n\t*p = x\n\treturn p\n}\n\nfunc (x ProtoCodeGeneratorResponse_Feature) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (ProtoCodeGeneratorResponse_Feature) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_grpc_federation_generator_proto_enumTypes[3].Descriptor()\n}\n\nfunc (ProtoCodeGeneratorResponse_Feature) Type() protoreflect.EnumType {\n\treturn &file_grpc_federation_generator_proto_enumTypes[3]\n}\n\nfunc (x ProtoCodeGeneratorResponse_Feature) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use ProtoCodeGeneratorResponse_Feature.Descriptor instead.\nfunc (ProtoCodeGeneratorResponse_Feature) EnumDescriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{0, 0}\n}\n\ntype ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic int32\n\nconst (\n\tProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_NONE  ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic = 0\n\tProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_SET   ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic = 1\n\tProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_ALIAS ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic = 2\n)\n\n// Enum value maps for ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic.\nvar (\n\tProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic_name = map[int32]string{\n\t\t0: \"NONE\",\n\t\t1: \"SET\",\n\t\t2: \"ALIAS\",\n\t}\n\tProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic_value = map[string]int32{\n\t\t\"NONE\":  0,\n\t\t\"SET\":   1,\n\t\t\"ALIAS\": 2,\n\t}\n)\n\nfunc (x ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic) Enum() *ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic {\n\tp := new(ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic)\n\t*p = x\n\treturn p\n}\n\nfunc (x ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_grpc_federation_generator_proto_enumTypes[4].Descriptor()\n}\n\nfunc (ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic) Type() protoreflect.EnumType {\n\treturn &file_grpc_federation_generator_proto_enumTypes[4]\n}\n\nfunc (x ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic.Descriptor instead.\nfunc (ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic) EnumDescriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{0, 0, 0, 0}\n}\n\ntype ProtoCodeGeneratorResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tError             *string                            `protobuf:\"bytes,1,opt,name=error,proto3,oneof\" json:\"error,omitempty\"`\n\tSupportedFeatures *uint64                            `protobuf:\"varint,2,opt,name=supported_features,json=supportedFeatures,proto3,oneof\" json:\"supported_features,omitempty\"`\n\tMinimumEdition    *int32                             `protobuf:\"varint,3,opt,name=minimum_edition,json=minimumEdition,proto3,oneof\" json:\"minimum_edition,omitempty\"`\n\tMaximumEdition    *int32                             `protobuf:\"varint,4,opt,name=maximum_edition,json=maximumEdition,proto3,oneof\" json:\"maximum_edition,omitempty\"`\n\tFile              []*ProtoCodeGeneratorResponse_File `protobuf:\"bytes,15,rep,name=file,proto3\" json:\"file,omitempty\"`\n}\n\nfunc (x *ProtoCodeGeneratorResponse) Reset() {\n\t*x = ProtoCodeGeneratorResponse{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ProtoCodeGeneratorResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ProtoCodeGeneratorResponse) ProtoMessage() {}\n\nfunc (x *ProtoCodeGeneratorResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ProtoCodeGeneratorResponse.ProtoReflect.Descriptor instead.\nfunc (*ProtoCodeGeneratorResponse) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *ProtoCodeGeneratorResponse) GetError() string {\n\tif x != nil && x.Error != nil {\n\t\treturn *x.Error\n\t}\n\treturn \"\"\n}\n\nfunc (x *ProtoCodeGeneratorResponse) GetSupportedFeatures() uint64 {\n\tif x != nil && x.SupportedFeatures != nil {\n\t\treturn *x.SupportedFeatures\n\t}\n\treturn 0\n}\n\nfunc (x *ProtoCodeGeneratorResponse) GetMinimumEdition() int32 {\n\tif x != nil && x.MinimumEdition != nil {\n\t\treturn *x.MinimumEdition\n\t}\n\treturn 0\n}\n\nfunc (x *ProtoCodeGeneratorResponse) GetMaximumEdition() int32 {\n\tif x != nil && x.MaximumEdition != nil {\n\t\treturn *x.MaximumEdition\n\t}\n\treturn 0\n}\n\nfunc (x *ProtoCodeGeneratorResponse) GetFile() []*ProtoCodeGeneratorResponse_File {\n\tif x != nil {\n\t\treturn x.File\n\t}\n\treturn nil\n}\n\n// CodeGeneratorRequest.\ntype CodeGeneratorRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tType      ActionType `protobuf:\"varint,1,opt,name=type,proto3,enum=grpc.federation.generator.plugin.ActionType\" json:\"type,omitempty\"`\n\tProtoPath string     `protobuf:\"bytes,2,opt,name=proto_path,json=protoPath,proto3\" json:\"proto_path,omitempty\"`\n\t// Deprecated: Marked as deprecated in grpc/federation/generator.proto.\n\tOutDir                string                             `protobuf:\"bytes,3,opt,name=out_dir,json=outDir,proto3\" json:\"out_dir,omitempty\"`\n\tFiles                 []*ProtoCodeGeneratorResponse_File `protobuf:\"bytes,4,rep,name=files,proto3\" json:\"files,omitempty\"`\n\tGrpcFederationFileIds []string                           `protobuf:\"bytes,5,rep,name=grpc_federation_file_ids,json=grpcFederationFileIds,proto3\" json:\"grpc_federation_file_ids,omitempty\"`\n\tReference             *Reference                         `protobuf:\"bytes,6,opt,name=reference,proto3\" json:\"reference,omitempty\"`\n\tOutputFilePathConfig  *OutputFilePathConfig              `protobuf:\"bytes,7,opt,name=output_file_path_config,json=outputFilePathConfig,proto3\" json:\"output_file_path_config,omitempty\"`\n}\n\nfunc (x *CodeGeneratorRequest) Reset() {\n\t*x = CodeGeneratorRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CodeGeneratorRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CodeGeneratorRequest) ProtoMessage() {}\n\nfunc (x *CodeGeneratorRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CodeGeneratorRequest.ProtoReflect.Descriptor instead.\nfunc (*CodeGeneratorRequest) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *CodeGeneratorRequest) GetType() ActionType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn ActionType_GENERATE_ACTION\n}\n\nfunc (x *CodeGeneratorRequest) GetProtoPath() string {\n\tif x != nil {\n\t\treturn x.ProtoPath\n\t}\n\treturn \"\"\n}\n\n// Deprecated: Marked as deprecated in grpc/federation/generator.proto.\nfunc (x *CodeGeneratorRequest) GetOutDir() string {\n\tif x != nil {\n\t\treturn x.OutDir\n\t}\n\treturn \"\"\n}\n\nfunc (x *CodeGeneratorRequest) GetFiles() []*ProtoCodeGeneratorResponse_File {\n\tif x != nil {\n\t\treturn x.Files\n\t}\n\treturn nil\n}\n\nfunc (x *CodeGeneratorRequest) GetGrpcFederationFileIds() []string {\n\tif x != nil {\n\t\treturn x.GrpcFederationFileIds\n\t}\n\treturn nil\n}\n\nfunc (x *CodeGeneratorRequest) GetReference() *Reference {\n\tif x != nil {\n\t\treturn x.Reference\n\t}\n\treturn nil\n}\n\nfunc (x *CodeGeneratorRequest) GetOutputFilePathConfig() *OutputFilePathConfig {\n\tif x != nil {\n\t\treturn x.OutputFilePathConfig\n\t}\n\treturn nil\n}\n\ntype OutputFilePathConfig struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMode        OutputFilePathMode `protobuf:\"varint,1,opt,name=mode,proto3,enum=grpc.federation.generator.plugin.OutputFilePathMode\" json:\"mode,omitempty\"`\n\tPrefix      string             `protobuf:\"bytes,2,opt,name=prefix,proto3\" json:\"prefix,omitempty\"`\n\tFilePath    string             `protobuf:\"bytes,3,opt,name=file_path,json=filePath,proto3\" json:\"file_path,omitempty\"`\n\tImportPaths []string           `protobuf:\"bytes,4,rep,name=import_paths,json=importPaths,proto3\" json:\"import_paths,omitempty\"`\n}\n\nfunc (x *OutputFilePathConfig) Reset() {\n\t*x = OutputFilePathConfig{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *OutputFilePathConfig) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*OutputFilePathConfig) ProtoMessage() {}\n\nfunc (x *OutputFilePathConfig) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use OutputFilePathConfig.ProtoReflect.Descriptor instead.\nfunc (*OutputFilePathConfig) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *OutputFilePathConfig) GetMode() OutputFilePathMode {\n\tif x != nil {\n\t\treturn x.Mode\n\t}\n\treturn OutputFilePathMode_OUTPUT_FILE_PATH_MODE_UNSPECIFIED\n}\n\nfunc (x *OutputFilePathConfig) GetPrefix() string {\n\tif x != nil {\n\t\treturn x.Prefix\n\t}\n\treturn \"\"\n}\n\nfunc (x *OutputFilePathConfig) GetFilePath() string {\n\tif x != nil {\n\t\treturn x.FilePath\n\t}\n\treturn \"\"\n}\n\nfunc (x *OutputFilePathConfig) GetImportPaths() []string {\n\tif x != nil {\n\t\treturn x.ImportPaths\n\t}\n\treturn nil\n}\n\ntype Reference struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tFileMap                    map[string]*File                       `protobuf:\"bytes,1,rep,name=file_map,json=fileMap,proto3\" json:\"file_map,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\tServiceMap                 map[string]*Service                    `protobuf:\"bytes,2,rep,name=service_map,json=serviceMap,proto3\" json:\"service_map,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\tMethodMap                  map[string]*Method                     `protobuf:\"bytes,3,rep,name=method_map,json=methodMap,proto3\" json:\"method_map,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\tMessageMap                 map[string]*Message                    `protobuf:\"bytes,4,rep,name=message_map,json=messageMap,proto3\" json:\"message_map,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\tFieldMap                   map[string]*Field                      `protobuf:\"bytes,5,rep,name=field_map,json=fieldMap,proto3\" json:\"field_map,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\tEnumMap                    map[string]*Enum                       `protobuf:\"bytes,6,rep,name=enum_map,json=enumMap,proto3\" json:\"enum_map,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\tEnumValueMap               map[string]*EnumValue                  `protobuf:\"bytes,7,rep,name=enum_value_map,json=enumValueMap,proto3\" json:\"enum_value_map,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\tOneofMap                   map[string]*Oneof                      `protobuf:\"bytes,8,rep,name=oneof_map,json=oneofMap,proto3\" json:\"oneof_map,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\tCelPluginMap               map[string]*CELPlugin                  `protobuf:\"bytes,9,rep,name=cel_plugin_map,json=celPluginMap,proto3\" json:\"cel_plugin_map,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\tGraphMap                   map[string]*MessageDependencyGraph     `protobuf:\"bytes,10,rep,name=graph_map,json=graphMap,proto3\" json:\"graph_map,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\tVariableDefinitionMap      map[string]*VariableDefinition         `protobuf:\"bytes,11,rep,name=variable_definition_map,json=variableDefinitionMap,proto3\" json:\"variable_definition_map,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\tVariableDefinitionGroupMap map[string]*VariableDefinitionGroup    `protobuf:\"bytes,12,rep,name=variable_definition_group_map,json=variableDefinitionGroupMap,proto3\" json:\"variable_definition_group_map,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\tGraphNodeMap               map[string]*MessageDependencyGraphNode `protobuf:\"bytes,13,rep,name=graph_node_map,json=graphNodeMap,proto3\" json:\"graph_node_map,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n}\n\nfunc (x *Reference) Reset() {\n\t*x = Reference{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Reference) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Reference) ProtoMessage() {}\n\nfunc (x *Reference) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Reference.ProtoReflect.Descriptor instead.\nfunc (*Reference) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *Reference) GetFileMap() map[string]*File {\n\tif x != nil {\n\t\treturn x.FileMap\n\t}\n\treturn nil\n}\n\nfunc (x *Reference) GetServiceMap() map[string]*Service {\n\tif x != nil {\n\t\treturn x.ServiceMap\n\t}\n\treturn nil\n}\n\nfunc (x *Reference) GetMethodMap() map[string]*Method {\n\tif x != nil {\n\t\treturn x.MethodMap\n\t}\n\treturn nil\n}\n\nfunc (x *Reference) GetMessageMap() map[string]*Message {\n\tif x != nil {\n\t\treturn x.MessageMap\n\t}\n\treturn nil\n}\n\nfunc (x *Reference) GetFieldMap() map[string]*Field {\n\tif x != nil {\n\t\treturn x.FieldMap\n\t}\n\treturn nil\n}\n\nfunc (x *Reference) GetEnumMap() map[string]*Enum {\n\tif x != nil {\n\t\treturn x.EnumMap\n\t}\n\treturn nil\n}\n\nfunc (x *Reference) GetEnumValueMap() map[string]*EnumValue {\n\tif x != nil {\n\t\treturn x.EnumValueMap\n\t}\n\treturn nil\n}\n\nfunc (x *Reference) GetOneofMap() map[string]*Oneof {\n\tif x != nil {\n\t\treturn x.OneofMap\n\t}\n\treturn nil\n}\n\nfunc (x *Reference) GetCelPluginMap() map[string]*CELPlugin {\n\tif x != nil {\n\t\treturn x.CelPluginMap\n\t}\n\treturn nil\n}\n\nfunc (x *Reference) GetGraphMap() map[string]*MessageDependencyGraph {\n\tif x != nil {\n\t\treturn x.GraphMap\n\t}\n\treturn nil\n}\n\nfunc (x *Reference) GetVariableDefinitionMap() map[string]*VariableDefinition {\n\tif x != nil {\n\t\treturn x.VariableDefinitionMap\n\t}\n\treturn nil\n}\n\nfunc (x *Reference) GetVariableDefinitionGroupMap() map[string]*VariableDefinitionGroup {\n\tif x != nil {\n\t\treturn x.VariableDefinitionGroupMap\n\t}\n\treturn nil\n}\n\nfunc (x *Reference) GetGraphNodeMap() map[string]*MessageDependencyGraphNode {\n\tif x != nil {\n\t\treturn x.GraphNodeMap\n\t}\n\treturn nil\n}\n\ntype File struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId            string     `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tPackage       *Package   `protobuf:\"bytes,2,opt,name=package,proto3\" json:\"package,omitempty\"`\n\tGoPackage     *GoPackage `protobuf:\"bytes,3,opt,name=go_package,json=goPackage,proto3\" json:\"go_package,omitempty\"`\n\tName          string     `protobuf:\"bytes,4,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tServiceIds    []string   `protobuf:\"bytes,5,rep,name=service_ids,json=serviceIds,proto3\" json:\"service_ids,omitempty\"`\n\tMessageIds    []string   `protobuf:\"bytes,6,rep,name=message_ids,json=messageIds,proto3\" json:\"message_ids,omitempty\"`\n\tEnumIds       []string   `protobuf:\"bytes,7,rep,name=enum_ids,json=enumIds,proto3\" json:\"enum_ids,omitempty\"`\n\tCelPluginIds  []string   `protobuf:\"bytes,8,rep,name=cel_plugin_ids,json=celPluginIds,proto3\" json:\"cel_plugin_ids,omitempty\"`\n\tImportFileIds []string   `protobuf:\"bytes,9,rep,name=import_file_ids,json=importFileIds,proto3\" json:\"import_file_ids,omitempty\"`\n}\n\nfunc (x *File) Reset() {\n\t*x = File{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *File) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*File) ProtoMessage() {}\n\nfunc (x *File) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use File.ProtoReflect.Descriptor instead.\nfunc (*File) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *File) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *File) GetPackage() *Package {\n\tif x != nil {\n\t\treturn x.Package\n\t}\n\treturn nil\n}\n\nfunc (x *File) GetGoPackage() *GoPackage {\n\tif x != nil {\n\t\treturn x.GoPackage\n\t}\n\treturn nil\n}\n\nfunc (x *File) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *File) GetServiceIds() []string {\n\tif x != nil {\n\t\treturn x.ServiceIds\n\t}\n\treturn nil\n}\n\nfunc (x *File) GetMessageIds() []string {\n\tif x != nil {\n\t\treturn x.MessageIds\n\t}\n\treturn nil\n}\n\nfunc (x *File) GetEnumIds() []string {\n\tif x != nil {\n\t\treturn x.EnumIds\n\t}\n\treturn nil\n}\n\nfunc (x *File) GetCelPluginIds() []string {\n\tif x != nil {\n\t\treturn x.CelPluginIds\n\t}\n\treturn nil\n}\n\nfunc (x *File) GetImportFileIds() []string {\n\tif x != nil {\n\t\treturn x.ImportFileIds\n\t}\n\treturn nil\n}\n\ntype Package struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName    string   `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tFileIds []string `protobuf:\"bytes,2,rep,name=file_ids,json=fileIds,proto3\" json:\"file_ids,omitempty\"`\n}\n\nfunc (x *Package) Reset() {\n\t*x = Package{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Package) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Package) ProtoMessage() {}\n\nfunc (x *Package) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Package.ProtoReflect.Descriptor instead.\nfunc (*Package) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *Package) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Package) GetFileIds() []string {\n\tif x != nil {\n\t\treturn x.FileIds\n\t}\n\treturn nil\n}\n\ntype GoPackage struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName       string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tImportPath string `protobuf:\"bytes,2,opt,name=import_path,json=importPath,proto3\" json:\"import_path,omitempty\"`\n\tAliasName  string `protobuf:\"bytes,3,opt,name=alias_name,json=aliasName,proto3\" json:\"alias_name,omitempty\"`\n}\n\nfunc (x *GoPackage) Reset() {\n\t*x = GoPackage{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GoPackage) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GoPackage) ProtoMessage() {}\n\nfunc (x *GoPackage) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GoPackage.ProtoReflect.Descriptor instead.\nfunc (*GoPackage) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *GoPackage) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *GoPackage) GetImportPath() string {\n\tif x != nil {\n\t\treturn x.ImportPath\n\t}\n\treturn \"\"\n}\n\nfunc (x *GoPackage) GetAliasName() string {\n\tif x != nil {\n\t\treturn x.AliasName\n\t}\n\treturn \"\"\n}\n\ntype Service struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId            string       `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName          string       `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tMethodIds     []string     `protobuf:\"bytes,3,rep,name=method_ids,json=methodIds,proto3\" json:\"method_ids,omitempty\"`\n\tFileId        string       `protobuf:\"bytes,4,opt,name=file_id,json=fileId,proto3\" json:\"file_id,omitempty\"`\n\tMessageIds    []string     `protobuf:\"bytes,5,rep,name=message_ids,json=messageIds,proto3\" json:\"message_ids,omitempty\"`\n\tMessageArgIds []string     `protobuf:\"bytes,6,rep,name=message_arg_ids,json=messageArgIds,proto3\" json:\"message_arg_ids,omitempty\"`\n\tCelPluginIds  []string     `protobuf:\"bytes,7,rep,name=cel_plugin_ids,json=celPluginIds,proto3\" json:\"cel_plugin_ids,omitempty\"`\n\tRule          *ServiceRule `protobuf:\"bytes,8,opt,name=rule,proto3\" json:\"rule,omitempty\"`\n}\n\nfunc (x *Service) Reset() {\n\t*x = Service{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Service) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Service) ProtoMessage() {}\n\nfunc (x *Service) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Service.ProtoReflect.Descriptor instead.\nfunc (*Service) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{7}\n}\n\nfunc (x *Service) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *Service) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Service) GetMethodIds() []string {\n\tif x != nil {\n\t\treturn x.MethodIds\n\t}\n\treturn nil\n}\n\nfunc (x *Service) GetFileId() string {\n\tif x != nil {\n\t\treturn x.FileId\n\t}\n\treturn \"\"\n}\n\nfunc (x *Service) GetMessageIds() []string {\n\tif x != nil {\n\t\treturn x.MessageIds\n\t}\n\treturn nil\n}\n\nfunc (x *Service) GetMessageArgIds() []string {\n\tif x != nil {\n\t\treturn x.MessageArgIds\n\t}\n\treturn nil\n}\n\nfunc (x *Service) GetCelPluginIds() []string {\n\tif x != nil {\n\t\treturn x.CelPluginIds\n\t}\n\treturn nil\n}\n\nfunc (x *Service) GetRule() *ServiceRule {\n\tif x != nil {\n\t\treturn x.Rule\n\t}\n\treturn nil\n}\n\ntype ServiceRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEnv  *Env               `protobuf:\"bytes,1,opt,name=env,proto3\" json:\"env,omitempty\"`\n\tVars []*ServiceVariable `protobuf:\"bytes,2,rep,name=vars,proto3\" json:\"vars,omitempty\"`\n}\n\nfunc (x *ServiceRule) Reset() {\n\t*x = ServiceRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceRule) ProtoMessage() {}\n\nfunc (x *ServiceRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceRule.ProtoReflect.Descriptor instead.\nfunc (*ServiceRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{8}\n}\n\nfunc (x *ServiceRule) GetEnv() *Env {\n\tif x != nil {\n\t\treturn x.Env\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceRule) GetVars() []*ServiceVariable {\n\tif x != nil {\n\t\treturn x.Vars\n\t}\n\treturn nil\n}\n\ntype Env struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tVars []*EnvVar `protobuf:\"bytes,1,rep,name=vars,proto3\" json:\"vars,omitempty\"`\n}\n\nfunc (x *Env) Reset() {\n\t*x = Env{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Env) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Env) ProtoMessage() {}\n\nfunc (x *Env) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Env.ProtoReflect.Descriptor instead.\nfunc (*Env) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{9}\n}\n\nfunc (x *Env) GetVars() []*EnvVar {\n\tif x != nil {\n\t\treturn x.Vars\n\t}\n\treturn nil\n}\n\ntype EnvVar struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName   string        `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tType   *Type         `protobuf:\"bytes,2,opt,name=type,proto3\" json:\"type,omitempty\"`\n\tOption *EnvVarOption `protobuf:\"bytes,3,opt,name=option,proto3\" json:\"option,omitempty\"`\n}\n\nfunc (x *EnvVar) Reset() {\n\t*x = EnvVar{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[10]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvVar) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvVar) ProtoMessage() {}\n\nfunc (x *EnvVar) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[10]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvVar.ProtoReflect.Descriptor instead.\nfunc (*EnvVar) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{10}\n}\n\nfunc (x *EnvVar) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnvVar) GetType() *Type {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nfunc (x *EnvVar) GetOption() *EnvVarOption {\n\tif x != nil {\n\t\treturn x.Option\n\t}\n\treturn nil\n}\n\ntype EnvVarOption struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tAlternate string `protobuf:\"bytes,1,opt,name=alternate,proto3\" json:\"alternate,omitempty\"`\n\tDefault   string `protobuf:\"bytes,2,opt,name=default,proto3\" json:\"default,omitempty\"`\n\tRequired  bool   `protobuf:\"varint,3,opt,name=required,proto3\" json:\"required,omitempty\"`\n\tIgnored   bool   `protobuf:\"varint,4,opt,name=ignored,proto3\" json:\"ignored,omitempty\"`\n}\n\nfunc (x *EnvVarOption) Reset() {\n\t*x = EnvVarOption{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[11]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnvVarOption) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnvVarOption) ProtoMessage() {}\n\nfunc (x *EnvVarOption) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[11]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnvVarOption.ProtoReflect.Descriptor instead.\nfunc (*EnvVarOption) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{11}\n}\n\nfunc (x *EnvVarOption) GetAlternate() string {\n\tif x != nil {\n\t\treturn x.Alternate\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnvVarOption) GetDefault() string {\n\tif x != nil {\n\t\treturn x.Default\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnvVarOption) GetRequired() bool {\n\tif x != nil {\n\t\treturn x.Required\n\t}\n\treturn false\n}\n\nfunc (x *EnvVarOption) GetIgnored() bool {\n\tif x != nil {\n\t\treturn x.Ignored\n\t}\n\treturn false\n}\n\ntype ServiceVariable struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName string               `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tIf   *CELValue            `protobuf:\"bytes,2,opt,name=if,proto3\" json:\"if,omitempty\"`\n\tExpr *ServiceVariableExpr `protobuf:\"bytes,3,opt,name=expr,proto3\" json:\"expr,omitempty\"`\n}\n\nfunc (x *ServiceVariable) Reset() {\n\t*x = ServiceVariable{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[12]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceVariable) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceVariable) ProtoMessage() {}\n\nfunc (x *ServiceVariable) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[12]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceVariable.ProtoReflect.Descriptor instead.\nfunc (*ServiceVariable) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{12}\n}\n\nfunc (x *ServiceVariable) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *ServiceVariable) GetIf() *CELValue {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariable) GetExpr() *ServiceVariableExpr {\n\tif x != nil {\n\t\treturn x.Expr\n\t}\n\treturn nil\n}\n\ntype ServiceVariableExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tType *Type `protobuf:\"bytes,1,opt,name=type,proto3\" json:\"type,omitempty\"`\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*ServiceVariableExpr_By\n\t//\t*ServiceVariableExpr_Map\n\t//\t*ServiceVariableExpr_Message\n\t//\t*ServiceVariableExpr_Validation\n\t//\t*ServiceVariableExpr_Enum\n\t//\t*ServiceVariableExpr_Switch\n\tExpr isServiceVariableExpr_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *ServiceVariableExpr) Reset() {\n\t*x = ServiceVariableExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[13]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceVariableExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceVariableExpr) ProtoMessage() {}\n\nfunc (x *ServiceVariableExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[13]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceVariableExpr.ProtoReflect.Descriptor instead.\nfunc (*ServiceVariableExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{13}\n}\n\nfunc (x *ServiceVariableExpr) GetType() *Type {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nfunc (m *ServiceVariableExpr) GetExpr() isServiceVariableExpr_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariableExpr) GetBy() *CELValue {\n\tif x, ok := x.GetExpr().(*ServiceVariableExpr_By); ok {\n\t\treturn x.By\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariableExpr) GetMap() *MapExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariableExpr_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariableExpr) GetMessage() *MessageExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariableExpr_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariableExpr) GetValidation() *ServiceVariableValidationExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariableExpr_Validation); ok {\n\t\treturn x.Validation\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariableExpr) GetEnum() *EnumExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariableExpr_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariableExpr) GetSwitch() *SwitchExpr {\n\tif x, ok := x.GetExpr().(*ServiceVariableExpr_Switch); ok {\n\t\treturn x.Switch\n\t}\n\treturn nil\n}\n\ntype isServiceVariableExpr_Expr interface {\n\tisServiceVariableExpr_Expr()\n}\n\ntype ServiceVariableExpr_By struct {\n\tBy *CELValue `protobuf:\"bytes,2,opt,name=by,proto3,oneof\"`\n}\n\ntype ServiceVariableExpr_Map struct {\n\tMap *MapExpr `protobuf:\"bytes,3,opt,name=map,proto3,oneof\"`\n}\n\ntype ServiceVariableExpr_Message struct {\n\tMessage *MessageExpr `protobuf:\"bytes,4,opt,name=message,proto3,oneof\"`\n}\n\ntype ServiceVariableExpr_Validation struct {\n\tValidation *ServiceVariableValidationExpr `protobuf:\"bytes,5,opt,name=validation,proto3,oneof\"`\n}\n\ntype ServiceVariableExpr_Enum struct {\n\tEnum *EnumExpr `protobuf:\"bytes,6,opt,name=enum,proto3,oneof\"`\n}\n\ntype ServiceVariableExpr_Switch struct {\n\tSwitch *SwitchExpr `protobuf:\"bytes,7,opt,name=switch,proto3,oneof\"`\n}\n\nfunc (*ServiceVariableExpr_By) isServiceVariableExpr_Expr() {}\n\nfunc (*ServiceVariableExpr_Map) isServiceVariableExpr_Expr() {}\n\nfunc (*ServiceVariableExpr_Message) isServiceVariableExpr_Expr() {}\n\nfunc (*ServiceVariableExpr_Validation) isServiceVariableExpr_Expr() {}\n\nfunc (*ServiceVariableExpr_Enum) isServiceVariableExpr_Expr() {}\n\nfunc (*ServiceVariableExpr_Switch) isServiceVariableExpr_Expr() {}\n\ntype ServiceVariableValidationExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tIf      *CELValue `protobuf:\"bytes,1,opt,name=if,proto3\" json:\"if,omitempty\"`\n\tMessage *CELValue `protobuf:\"bytes,2,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *ServiceVariableValidationExpr) Reset() {\n\t*x = ServiceVariableValidationExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[14]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ServiceVariableValidationExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceVariableValidationExpr) ProtoMessage() {}\n\nfunc (x *ServiceVariableValidationExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[14]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceVariableValidationExpr.ProtoReflect.Descriptor instead.\nfunc (*ServiceVariableValidationExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{14}\n}\n\nfunc (x *ServiceVariableValidationExpr) GetIf() *CELValue {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceVariableValidationExpr) GetMessage() *CELValue {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\ntype Method struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId         string      `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName       string      `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tRequestId  string      `protobuf:\"bytes,3,opt,name=request_id,json=requestId,proto3\" json:\"request_id,omitempty\"`\n\tResponseId string      `protobuf:\"bytes,4,opt,name=response_id,json=responseId,proto3\" json:\"response_id,omitempty\"`\n\tServiceId  string      `protobuf:\"bytes,5,opt,name=service_id,json=serviceId,proto3\" json:\"service_id,omitempty\"`\n\tRule       *MethodRule `protobuf:\"bytes,6,opt,name=rule,proto3\" json:\"rule,omitempty\"`\n}\n\nfunc (x *Method) Reset() {\n\t*x = Method{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[15]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Method) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Method) ProtoMessage() {}\n\nfunc (x *Method) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[15]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Method.ProtoReflect.Descriptor instead.\nfunc (*Method) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{15}\n}\n\nfunc (x *Method) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *Method) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Method) GetRequestId() string {\n\tif x != nil {\n\t\treturn x.RequestId\n\t}\n\treturn \"\"\n}\n\nfunc (x *Method) GetResponseId() string {\n\tif x != nil {\n\t\treturn x.ResponseId\n\t}\n\treturn \"\"\n}\n\nfunc (x *Method) GetServiceId() string {\n\tif x != nil {\n\t\treturn x.ServiceId\n\t}\n\treturn \"\"\n}\n\nfunc (x *Method) GetRule() *MethodRule {\n\tif x != nil {\n\t\treturn x.Rule\n\t}\n\treturn nil\n}\n\ntype MethodRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tTimeout    *durationpb.Duration `protobuf:\"bytes,1,opt,name=timeout,proto3\" json:\"timeout,omitempty\"`\n\tResponseId string               `protobuf:\"bytes,2,opt,name=response_id,json=responseId,proto3\" json:\"response_id,omitempty\"`\n}\n\nfunc (x *MethodRule) Reset() {\n\t*x = MethodRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[16]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MethodRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MethodRule) ProtoMessage() {}\n\nfunc (x *MethodRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[16]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MethodRule.ProtoReflect.Descriptor instead.\nfunc (*MethodRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{16}\n}\n\nfunc (x *MethodRule) GetTimeout() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.Timeout\n\t}\n\treturn nil\n}\n\nfunc (x *MethodRule) GetResponseId() string {\n\tif x != nil {\n\t\treturn x.ResponseId\n\t}\n\treturn \"\"\n}\n\ntype Message struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId               string       `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName             string       `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tIsMapEntry       bool         `protobuf:\"varint,3,opt,name=is_map_entry,json=isMapEntry,proto3\" json:\"is_map_entry,omitempty\"`\n\tFileId           string       `protobuf:\"bytes,4,opt,name=file_id,json=fileId,proto3\" json:\"file_id,omitempty\"`\n\tParentMessageId  string       `protobuf:\"bytes,5,opt,name=parent_message_id,json=parentMessageId,proto3\" json:\"parent_message_id,omitempty\"`\n\tNestedMessageIds []string     `protobuf:\"bytes,6,rep,name=nested_message_ids,json=nestedMessageIds,proto3\" json:\"nested_message_ids,omitempty\"`\n\tEnumIds          []string     `protobuf:\"bytes,7,rep,name=enum_ids,json=enumIds,proto3\" json:\"enum_ids,omitempty\"`\n\tFieldIds         []string     `protobuf:\"bytes,8,rep,name=field_ids,json=fieldIds,proto3\" json:\"field_ids,omitempty\"`\n\tOneofIds         []string     `protobuf:\"bytes,9,rep,name=oneof_ids,json=oneofIds,proto3\" json:\"oneof_ids,omitempty\"`\n\tRule             *MessageRule `protobuf:\"bytes,10,opt,name=rule,proto3\" json:\"rule,omitempty\"`\n}\n\nfunc (x *Message) Reset() {\n\t*x = Message{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[17]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Message) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Message) ProtoMessage() {}\n\nfunc (x *Message) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[17]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Message.ProtoReflect.Descriptor instead.\nfunc (*Message) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{17}\n}\n\nfunc (x *Message) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *Message) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Message) GetIsMapEntry() bool {\n\tif x != nil {\n\t\treturn x.IsMapEntry\n\t}\n\treturn false\n}\n\nfunc (x *Message) GetFileId() string {\n\tif x != nil {\n\t\treturn x.FileId\n\t}\n\treturn \"\"\n}\n\nfunc (x *Message) GetParentMessageId() string {\n\tif x != nil {\n\t\treturn x.ParentMessageId\n\t}\n\treturn \"\"\n}\n\nfunc (x *Message) GetNestedMessageIds() []string {\n\tif x != nil {\n\t\treturn x.NestedMessageIds\n\t}\n\treturn nil\n}\n\nfunc (x *Message) GetEnumIds() []string {\n\tif x != nil {\n\t\treturn x.EnumIds\n\t}\n\treturn nil\n}\n\nfunc (x *Message) GetFieldIds() []string {\n\tif x != nil {\n\t\treturn x.FieldIds\n\t}\n\treturn nil\n}\n\nfunc (x *Message) GetOneofIds() []string {\n\tif x != nil {\n\t\treturn x.OneofIds\n\t}\n\treturn nil\n}\n\nfunc (x *Message) GetRule() *MessageRule {\n\tif x != nil {\n\t\treturn x.Rule\n\t}\n\treturn nil\n}\n\ntype MessageRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessageArgumentId string                 `protobuf:\"bytes,1,opt,name=message_argument_id,json=messageArgumentId,proto3\" json:\"message_argument_id,omitempty\"`\n\tCustomResolver    bool                   `protobuf:\"varint,2,opt,name=custom_resolver,json=customResolver,proto3\" json:\"custom_resolver,omitempty\"`\n\tAliasIds          []string               `protobuf:\"bytes,3,rep,name=alias_ids,json=aliasIds,proto3\" json:\"alias_ids,omitempty\"`\n\tDefSet            *VariableDefinitionSet `protobuf:\"bytes,4,opt,name=def_set,json=defSet,proto3\" json:\"def_set,omitempty\"`\n}\n\nfunc (x *MessageRule) Reset() {\n\t*x = MessageRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[18]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MessageRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MessageRule) ProtoMessage() {}\n\nfunc (x *MessageRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[18]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MessageRule.ProtoReflect.Descriptor instead.\nfunc (*MessageRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{18}\n}\n\nfunc (x *MessageRule) GetMessageArgumentId() string {\n\tif x != nil {\n\t\treturn x.MessageArgumentId\n\t}\n\treturn \"\"\n}\n\nfunc (x *MessageRule) GetCustomResolver() bool {\n\tif x != nil {\n\t\treturn x.CustomResolver\n\t}\n\treturn false\n}\n\nfunc (x *MessageRule) GetAliasIds() []string {\n\tif x != nil {\n\t\treturn x.AliasIds\n\t}\n\treturn nil\n}\n\nfunc (x *MessageRule) GetDefSet() *VariableDefinitionSet {\n\tif x != nil {\n\t\treturn x.DefSet\n\t}\n\treturn nil\n}\n\ntype VariableDefinitionSet struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tVariableDefinitionIds      []string `protobuf:\"bytes,1,rep,name=variable_definition_ids,json=variableDefinitionIds,proto3\" json:\"variable_definition_ids,omitempty\"`\n\tVariableDefinitionGroupIds []string `protobuf:\"bytes,2,rep,name=variable_definition_group_ids,json=variableDefinitionGroupIds,proto3\" json:\"variable_definition_group_ids,omitempty\"`\n\tDependencyGraphId          string   `protobuf:\"bytes,3,opt,name=dependency_graph_id,json=dependencyGraphId,proto3\" json:\"dependency_graph_id,omitempty\"`\n}\n\nfunc (x *VariableDefinitionSet) Reset() {\n\t*x = VariableDefinitionSet{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[19]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *VariableDefinitionSet) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*VariableDefinitionSet) ProtoMessage() {}\n\nfunc (x *VariableDefinitionSet) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[19]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use VariableDefinitionSet.ProtoReflect.Descriptor instead.\nfunc (*VariableDefinitionSet) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{19}\n}\n\nfunc (x *VariableDefinitionSet) GetVariableDefinitionIds() []string {\n\tif x != nil {\n\t\treturn x.VariableDefinitionIds\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinitionSet) GetVariableDefinitionGroupIds() []string {\n\tif x != nil {\n\t\treturn x.VariableDefinitionGroupIds\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinitionSet) GetDependencyGraphId() string {\n\tif x != nil {\n\t\treturn x.DependencyGraphId\n\t}\n\treturn \"\"\n}\n\ntype VariableDefinition struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId       string        `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tIndex    int64         `protobuf:\"varint,2,opt,name=index,proto3\" json:\"index,omitempty\"`\n\tName     string        `protobuf:\"bytes,3,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tIf       *CELValue     `protobuf:\"bytes,4,opt,name=if,proto3\" json:\"if,omitempty\"`\n\tAutoBind bool          `protobuf:\"varint,5,opt,name=auto_bind,json=autoBind,proto3\" json:\"auto_bind,omitempty\"`\n\tUsed     bool          `protobuf:\"varint,6,opt,name=used,proto3\" json:\"used,omitempty\"`\n\tExpr     *VariableExpr `protobuf:\"bytes,7,opt,name=expr,proto3\" json:\"expr,omitempty\"`\n}\n\nfunc (x *VariableDefinition) Reset() {\n\t*x = VariableDefinition{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[20]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *VariableDefinition) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*VariableDefinition) ProtoMessage() {}\n\nfunc (x *VariableDefinition) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[20]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use VariableDefinition.ProtoReflect.Descriptor instead.\nfunc (*VariableDefinition) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{20}\n}\n\nfunc (x *VariableDefinition) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *VariableDefinition) GetIndex() int64 {\n\tif x != nil {\n\t\treturn x.Index\n\t}\n\treturn 0\n}\n\nfunc (x *VariableDefinition) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *VariableDefinition) GetIf() *CELValue {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinition) GetAutoBind() bool {\n\tif x != nil {\n\t\treturn x.AutoBind\n\t}\n\treturn false\n}\n\nfunc (x *VariableDefinition) GetUsed() bool {\n\tif x != nil {\n\t\treturn x.Used\n\t}\n\treturn false\n}\n\nfunc (x *VariableDefinition) GetExpr() *VariableExpr {\n\tif x != nil {\n\t\treturn x.Expr\n\t}\n\treturn nil\n}\n\ntype Field struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId        string     `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName      string     `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tType      *Type      `protobuf:\"bytes,3,opt,name=type,proto3\" json:\"type,omitempty\"`\n\tOneofId   string     `protobuf:\"bytes,4,opt,name=oneof_id,json=oneofId,proto3\" json:\"oneof_id,omitempty\"`\n\tRule      *FieldRule `protobuf:\"bytes,5,opt,name=rule,proto3\" json:\"rule,omitempty\"`\n\tMessageId string     `protobuf:\"bytes,6,opt,name=message_id,json=messageId,proto3\" json:\"message_id,omitempty\"`\n}\n\nfunc (x *Field) Reset() {\n\t*x = Field{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[21]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Field) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Field) ProtoMessage() {}\n\nfunc (x *Field) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[21]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Field.ProtoReflect.Descriptor instead.\nfunc (*Field) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{21}\n}\n\nfunc (x *Field) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *Field) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Field) GetType() *Type {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nfunc (x *Field) GetOneofId() string {\n\tif x != nil {\n\t\treturn x.OneofId\n\t}\n\treturn \"\"\n}\n\nfunc (x *Field) GetRule() *FieldRule {\n\tif x != nil {\n\t\treturn x.Rule\n\t}\n\treturn nil\n}\n\nfunc (x *Field) GetMessageId() string {\n\tif x != nil {\n\t\treturn x.MessageId\n\t}\n\treturn \"\"\n}\n\ntype FieldRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tValue                 *Value          `protobuf:\"bytes,1,opt,name=value,proto3\" json:\"value,omitempty\"`\n\tCustomResolver        bool            `protobuf:\"varint,2,opt,name=custom_resolver,json=customResolver,proto3\" json:\"custom_resolver,omitempty\"`\n\tMessageCustomResolver bool            `protobuf:\"varint,3,opt,name=message_custom_resolver,json=messageCustomResolver,proto3\" json:\"message_custom_resolver,omitempty\"`\n\tAliasIds              []string        `protobuf:\"bytes,4,rep,name=alias_ids,json=aliasIds,proto3\" json:\"alias_ids,omitempty\"`\n\tAutoBindField         *AutoBindField  `protobuf:\"bytes,5,opt,name=auto_bind_field,json=autoBindField,proto3\" json:\"auto_bind_field,omitempty\"`\n\tOneofRule             *FieldOneofRule `protobuf:\"bytes,6,opt,name=oneof_rule,json=oneofRule,proto3\" json:\"oneof_rule,omitempty\"`\n}\n\nfunc (x *FieldRule) Reset() {\n\t*x = FieldRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[22]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *FieldRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*FieldRule) ProtoMessage() {}\n\nfunc (x *FieldRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[22]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use FieldRule.ProtoReflect.Descriptor instead.\nfunc (*FieldRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{22}\n}\n\nfunc (x *FieldRule) GetValue() *Value {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn nil\n}\n\nfunc (x *FieldRule) GetCustomResolver() bool {\n\tif x != nil {\n\t\treturn x.CustomResolver\n\t}\n\treturn false\n}\n\nfunc (x *FieldRule) GetMessageCustomResolver() bool {\n\tif x != nil {\n\t\treturn x.MessageCustomResolver\n\t}\n\treturn false\n}\n\nfunc (x *FieldRule) GetAliasIds() []string {\n\tif x != nil {\n\t\treturn x.AliasIds\n\t}\n\treturn nil\n}\n\nfunc (x *FieldRule) GetAutoBindField() *AutoBindField {\n\tif x != nil {\n\t\treturn x.AutoBindField\n\t}\n\treturn nil\n}\n\nfunc (x *FieldRule) GetOneofRule() *FieldOneofRule {\n\tif x != nil {\n\t\treturn x.OneofRule\n\t}\n\treturn nil\n}\n\ntype AutoBindField struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tVariableDefinitionId string `protobuf:\"bytes,1,opt,name=variable_definition_id,json=variableDefinitionId,proto3\" json:\"variable_definition_id,omitempty\"`\n\tFieldId              string `protobuf:\"bytes,2,opt,name=field_id,json=fieldId,proto3\" json:\"field_id,omitempty\"`\n}\n\nfunc (x *AutoBindField) Reset() {\n\t*x = AutoBindField{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[23]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *AutoBindField) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AutoBindField) ProtoMessage() {}\n\nfunc (x *AutoBindField) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[23]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AutoBindField.ProtoReflect.Descriptor instead.\nfunc (*AutoBindField) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{23}\n}\n\nfunc (x *AutoBindField) GetVariableDefinitionId() string {\n\tif x != nil {\n\t\treturn x.VariableDefinitionId\n\t}\n\treturn \"\"\n}\n\nfunc (x *AutoBindField) GetFieldId() string {\n\tif x != nil {\n\t\treturn x.FieldId\n\t}\n\treturn \"\"\n}\n\ntype FieldOneofRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tIf      *CELValue              `protobuf:\"bytes,1,opt,name=if,proto3\" json:\"if,omitempty\"`\n\tDefault bool                   `protobuf:\"varint,2,opt,name=default,proto3\" json:\"default,omitempty\"`\n\tBy      *CELValue              `protobuf:\"bytes,3,opt,name=by,proto3\" json:\"by,omitempty\"`\n\tDefSet  *VariableDefinitionSet `protobuf:\"bytes,4,opt,name=def_set,json=defSet,proto3\" json:\"def_set,omitempty\"`\n}\n\nfunc (x *FieldOneofRule) Reset() {\n\t*x = FieldOneofRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[24]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *FieldOneofRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*FieldOneofRule) ProtoMessage() {}\n\nfunc (x *FieldOneofRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[24]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use FieldOneofRule.ProtoReflect.Descriptor instead.\nfunc (*FieldOneofRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{24}\n}\n\nfunc (x *FieldOneofRule) GetIf() *CELValue {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn nil\n}\n\nfunc (x *FieldOneofRule) GetDefault() bool {\n\tif x != nil {\n\t\treturn x.Default\n\t}\n\treturn false\n}\n\nfunc (x *FieldOneofRule) GetBy() *CELValue {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn nil\n}\n\nfunc (x *FieldOneofRule) GetDefSet() *VariableDefinitionSet {\n\tif x != nil {\n\t\treturn x.DefSet\n\t}\n\treturn nil\n}\n\ntype VariableDefinitionGroup struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId string `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\t// Types that are assignable to Group:\n\t//\n\t//\t*VariableDefinitionGroup_Sequential\n\t//\t*VariableDefinitionGroup_Concurrent\n\tGroup isVariableDefinitionGroup_Group `protobuf_oneof:\"group\"`\n}\n\nfunc (x *VariableDefinitionGroup) Reset() {\n\t*x = VariableDefinitionGroup{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[25]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *VariableDefinitionGroup) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*VariableDefinitionGroup) ProtoMessage() {}\n\nfunc (x *VariableDefinitionGroup) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[25]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use VariableDefinitionGroup.ProtoReflect.Descriptor instead.\nfunc (*VariableDefinitionGroup) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{25}\n}\n\nfunc (x *VariableDefinitionGroup) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (m *VariableDefinitionGroup) GetGroup() isVariableDefinitionGroup_Group {\n\tif m != nil {\n\t\treturn m.Group\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinitionGroup) GetSequential() *SequentialVariableDefinitionGroup {\n\tif x, ok := x.GetGroup().(*VariableDefinitionGroup_Sequential); ok {\n\t\treturn x.Sequential\n\t}\n\treturn nil\n}\n\nfunc (x *VariableDefinitionGroup) GetConcurrent() *ConcurrentVariableDefinitionGroup {\n\tif x, ok := x.GetGroup().(*VariableDefinitionGroup_Concurrent); ok {\n\t\treturn x.Concurrent\n\t}\n\treturn nil\n}\n\ntype isVariableDefinitionGroup_Group interface {\n\tisVariableDefinitionGroup_Group()\n}\n\ntype VariableDefinitionGroup_Sequential struct {\n\tSequential *SequentialVariableDefinitionGroup `protobuf:\"bytes,2,opt,name=sequential,proto3,oneof\"`\n}\n\ntype VariableDefinitionGroup_Concurrent struct {\n\tConcurrent *ConcurrentVariableDefinitionGroup `protobuf:\"bytes,3,opt,name=concurrent,proto3,oneof\"`\n}\n\nfunc (*VariableDefinitionGroup_Sequential) isVariableDefinitionGroup_Group() {}\n\nfunc (*VariableDefinitionGroup_Concurrent) isVariableDefinitionGroup_Group() {}\n\ntype SequentialVariableDefinitionGroup struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tStart string `protobuf:\"bytes,1,opt,name=start,proto3\" json:\"start,omitempty\"`\n\tEnd   string `protobuf:\"bytes,2,opt,name=end,proto3\" json:\"end,omitempty\"`\n}\n\nfunc (x *SequentialVariableDefinitionGroup) Reset() {\n\t*x = SequentialVariableDefinitionGroup{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[26]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SequentialVariableDefinitionGroup) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SequentialVariableDefinitionGroup) ProtoMessage() {}\n\nfunc (x *SequentialVariableDefinitionGroup) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[26]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SequentialVariableDefinitionGroup.ProtoReflect.Descriptor instead.\nfunc (*SequentialVariableDefinitionGroup) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{26}\n}\n\nfunc (x *SequentialVariableDefinitionGroup) GetStart() string {\n\tif x != nil {\n\t\treturn x.Start\n\t}\n\treturn \"\"\n}\n\nfunc (x *SequentialVariableDefinitionGroup) GetEnd() string {\n\tif x != nil {\n\t\treturn x.End\n\t}\n\treturn \"\"\n}\n\ntype ConcurrentVariableDefinitionGroup struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tStarts []string `protobuf:\"bytes,1,rep,name=starts,proto3\" json:\"starts,omitempty\"`\n\tEnd    string   `protobuf:\"bytes,2,opt,name=end,proto3\" json:\"end,omitempty\"`\n}\n\nfunc (x *ConcurrentVariableDefinitionGroup) Reset() {\n\t*x = ConcurrentVariableDefinitionGroup{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[27]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ConcurrentVariableDefinitionGroup) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ConcurrentVariableDefinitionGroup) ProtoMessage() {}\n\nfunc (x *ConcurrentVariableDefinitionGroup) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[27]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ConcurrentVariableDefinitionGroup.ProtoReflect.Descriptor instead.\nfunc (*ConcurrentVariableDefinitionGroup) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{27}\n}\n\nfunc (x *ConcurrentVariableDefinitionGroup) GetStarts() []string {\n\tif x != nil {\n\t\treturn x.Starts\n\t}\n\treturn nil\n}\n\nfunc (x *ConcurrentVariableDefinitionGroup) GetEnd() string {\n\tif x != nil {\n\t\treturn x.End\n\t}\n\treturn \"\"\n}\n\ntype MessageDependencyGraph struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId          string   `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tRootNodeIds []string `protobuf:\"bytes,2,rep,name=root_node_ids,json=rootNodeIds,proto3\" json:\"root_node_ids,omitempty\"`\n}\n\nfunc (x *MessageDependencyGraph) Reset() {\n\t*x = MessageDependencyGraph{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[28]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MessageDependencyGraph) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MessageDependencyGraph) ProtoMessage() {}\n\nfunc (x *MessageDependencyGraph) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[28]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MessageDependencyGraph.ProtoReflect.Descriptor instead.\nfunc (*MessageDependencyGraph) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{28}\n}\n\nfunc (x *MessageDependencyGraph) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *MessageDependencyGraph) GetRootNodeIds() []string {\n\tif x != nil {\n\t\treturn x.RootNodeIds\n\t}\n\treturn nil\n}\n\ntype MessageDependencyGraphNode struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId                   string   `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tChildIds             []string `protobuf:\"bytes,2,rep,name=child_ids,json=childIds,proto3\" json:\"child_ids,omitempty\"`\n\tBaseMessageId        string   `protobuf:\"bytes,3,opt,name=base_message_id,json=baseMessageId,proto3\" json:\"base_message_id,omitempty\"`\n\tVariableDefinitionId string   `protobuf:\"bytes,4,opt,name=variable_definition_id,json=variableDefinitionId,proto3\" json:\"variable_definition_id,omitempty\"`\n}\n\nfunc (x *MessageDependencyGraphNode) Reset() {\n\t*x = MessageDependencyGraphNode{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[29]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MessageDependencyGraphNode) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MessageDependencyGraphNode) ProtoMessage() {}\n\nfunc (x *MessageDependencyGraphNode) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[29]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MessageDependencyGraphNode.ProtoReflect.Descriptor instead.\nfunc (*MessageDependencyGraphNode) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{29}\n}\n\nfunc (x *MessageDependencyGraphNode) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *MessageDependencyGraphNode) GetChildIds() []string {\n\tif x != nil {\n\t\treturn x.ChildIds\n\t}\n\treturn nil\n}\n\nfunc (x *MessageDependencyGraphNode) GetBaseMessageId() string {\n\tif x != nil {\n\t\treturn x.BaseMessageId\n\t}\n\treturn \"\"\n}\n\nfunc (x *MessageDependencyGraphNode) GetVariableDefinitionId() string {\n\tif x != nil {\n\t\treturn x.VariableDefinitionId\n\t}\n\treturn \"\"\n}\n\ntype VariableExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tType *Type `protobuf:\"bytes,1,opt,name=type,proto3\" json:\"type,omitempty\"`\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*VariableExpr_By\n\t//\t*VariableExpr_Map\n\t//\t*VariableExpr_Call\n\t//\t*VariableExpr_Message\n\t//\t*VariableExpr_Validation\n\t//\t*VariableExpr_Enum\n\t//\t*VariableExpr_Switch\n\tExpr isVariableExpr_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *VariableExpr) Reset() {\n\t*x = VariableExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[30]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *VariableExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*VariableExpr) ProtoMessage() {}\n\nfunc (x *VariableExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[30]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use VariableExpr.ProtoReflect.Descriptor instead.\nfunc (*VariableExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{30}\n}\n\nfunc (x *VariableExpr) GetType() *Type {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nfunc (m *VariableExpr) GetExpr() isVariableExpr_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *VariableExpr) GetBy() *CELValue {\n\tif x, ok := x.GetExpr().(*VariableExpr_By); ok {\n\t\treturn x.By\n\t}\n\treturn nil\n}\n\nfunc (x *VariableExpr) GetMap() *MapExpr {\n\tif x, ok := x.GetExpr().(*VariableExpr_Map); ok {\n\t\treturn x.Map\n\t}\n\treturn nil\n}\n\nfunc (x *VariableExpr) GetCall() *CallExpr {\n\tif x, ok := x.GetExpr().(*VariableExpr_Call); ok {\n\t\treturn x.Call\n\t}\n\treturn nil\n}\n\nfunc (x *VariableExpr) GetMessage() *MessageExpr {\n\tif x, ok := x.GetExpr().(*VariableExpr_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *VariableExpr) GetValidation() *ValidationExpr {\n\tif x, ok := x.GetExpr().(*VariableExpr_Validation); ok {\n\t\treturn x.Validation\n\t}\n\treturn nil\n}\n\nfunc (x *VariableExpr) GetEnum() *EnumExpr {\n\tif x, ok := x.GetExpr().(*VariableExpr_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn nil\n}\n\nfunc (x *VariableExpr) GetSwitch() *SwitchExpr {\n\tif x, ok := x.GetExpr().(*VariableExpr_Switch); ok {\n\t\treturn x.Switch\n\t}\n\treturn nil\n}\n\ntype isVariableExpr_Expr interface {\n\tisVariableExpr_Expr()\n}\n\ntype VariableExpr_By struct {\n\tBy *CELValue `protobuf:\"bytes,2,opt,name=by,proto3,oneof\"`\n}\n\ntype VariableExpr_Map struct {\n\tMap *MapExpr `protobuf:\"bytes,3,opt,name=map,proto3,oneof\"`\n}\n\ntype VariableExpr_Call struct {\n\tCall *CallExpr `protobuf:\"bytes,4,opt,name=call,proto3,oneof\"`\n}\n\ntype VariableExpr_Message struct {\n\tMessage *MessageExpr `protobuf:\"bytes,5,opt,name=message,proto3,oneof\"`\n}\n\ntype VariableExpr_Validation struct {\n\tValidation *ValidationExpr `protobuf:\"bytes,6,opt,name=validation,proto3,oneof\"`\n}\n\ntype VariableExpr_Enum struct {\n\tEnum *EnumExpr `protobuf:\"bytes,7,opt,name=enum,proto3,oneof\"`\n}\n\ntype VariableExpr_Switch struct {\n\tSwitch *SwitchExpr `protobuf:\"bytes,8,opt,name=switch,proto3,oneof\"`\n}\n\nfunc (*VariableExpr_By) isVariableExpr_Expr() {}\n\nfunc (*VariableExpr_Map) isVariableExpr_Expr() {}\n\nfunc (*VariableExpr_Call) isVariableExpr_Expr() {}\n\nfunc (*VariableExpr_Message) isVariableExpr_Expr() {}\n\nfunc (*VariableExpr_Validation) isVariableExpr_Expr() {}\n\nfunc (*VariableExpr_Enum) isVariableExpr_Expr() {}\n\nfunc (*VariableExpr_Switch) isVariableExpr_Expr() {}\n\ntype Type struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tKind     TypeKind `protobuf:\"varint,1,opt,name=kind,proto3,enum=grpc.federation.generator.plugin.TypeKind\" json:\"kind,omitempty\"`\n\tRepeated bool     `protobuf:\"varint,2,opt,name=repeated,proto3\" json:\"repeated,omitempty\"`\n\tIsNull   bool     `protobuf:\"varint,3,opt,name=is_null,json=isNull,proto3\" json:\"is_null,omitempty\"`\n\t// Types that are assignable to Ref:\n\t//\n\t//\t*Type_MessageId\n\t//\t*Type_EnumId\n\t//\t*Type_OneofFieldId\n\tRef isType_Ref `protobuf_oneof:\"ref\"`\n}\n\nfunc (x *Type) Reset() {\n\t*x = Type{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[31]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Type) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Type) ProtoMessage() {}\n\nfunc (x *Type) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[31]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Type.ProtoReflect.Descriptor instead.\nfunc (*Type) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{31}\n}\n\nfunc (x *Type) GetKind() TypeKind {\n\tif x != nil {\n\t\treturn x.Kind\n\t}\n\treturn TypeKind_UNKNOWN_TYPE\n}\n\nfunc (x *Type) GetRepeated() bool {\n\tif x != nil {\n\t\treturn x.Repeated\n\t}\n\treturn false\n}\n\nfunc (x *Type) GetIsNull() bool {\n\tif x != nil {\n\t\treturn x.IsNull\n\t}\n\treturn false\n}\n\nfunc (m *Type) GetRef() isType_Ref {\n\tif m != nil {\n\t\treturn m.Ref\n\t}\n\treturn nil\n}\n\nfunc (x *Type) GetMessageId() string {\n\tif x, ok := x.GetRef().(*Type_MessageId); ok {\n\t\treturn x.MessageId\n\t}\n\treturn \"\"\n}\n\nfunc (x *Type) GetEnumId() string {\n\tif x, ok := x.GetRef().(*Type_EnumId); ok {\n\t\treturn x.EnumId\n\t}\n\treturn \"\"\n}\n\nfunc (x *Type) GetOneofFieldId() string {\n\tif x, ok := x.GetRef().(*Type_OneofFieldId); ok {\n\t\treturn x.OneofFieldId\n\t}\n\treturn \"\"\n}\n\ntype isType_Ref interface {\n\tisType_Ref()\n}\n\ntype Type_MessageId struct {\n\tMessageId string `protobuf:\"bytes,4,opt,name=message_id,json=messageId,proto3,oneof\"`\n}\n\ntype Type_EnumId struct {\n\tEnumId string `protobuf:\"bytes,5,opt,name=enum_id,json=enumId,proto3,oneof\"`\n}\n\ntype Type_OneofFieldId struct {\n\tOneofFieldId string `protobuf:\"bytes,6,opt,name=oneof_field_id,json=oneofFieldId,proto3,oneof\"`\n}\n\nfunc (*Type_MessageId) isType_Ref() {}\n\nfunc (*Type_EnumId) isType_Ref() {}\n\nfunc (*Type_OneofFieldId) isType_Ref() {}\n\ntype CELValue struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tExpr string `protobuf:\"bytes,1,opt,name=expr,proto3\" json:\"expr,omitempty\"`\n\tOut  *Type  `protobuf:\"bytes,2,opt,name=out,proto3\" json:\"out,omitempty\"`\n}\n\nfunc (x *CELValue) Reset() {\n\t*x = CELValue{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[32]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELValue) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELValue) ProtoMessage() {}\n\nfunc (x *CELValue) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[32]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELValue.ProtoReflect.Descriptor instead.\nfunc (*CELValue) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{32}\n}\n\nfunc (x *CELValue) GetExpr() string {\n\tif x != nil {\n\t\treturn x.Expr\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELValue) GetOut() *Type {\n\tif x != nil {\n\t\treturn x.Out\n\t}\n\treturn nil\n}\n\ntype MapExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tIterator *Iterator        `protobuf:\"bytes,1,opt,name=iterator,proto3\" json:\"iterator,omitempty\"`\n\tExpr     *MapIteratorExpr `protobuf:\"bytes,2,opt,name=expr,proto3\" json:\"expr,omitempty\"`\n}\n\nfunc (x *MapExpr) Reset() {\n\t*x = MapExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[33]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MapExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MapExpr) ProtoMessage() {}\n\nfunc (x *MapExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[33]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MapExpr.ProtoReflect.Descriptor instead.\nfunc (*MapExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{33}\n}\n\nfunc (x *MapExpr) GetIterator() *Iterator {\n\tif x != nil {\n\t\treturn x.Iterator\n\t}\n\treturn nil\n}\n\nfunc (x *MapExpr) GetExpr() *MapIteratorExpr {\n\tif x != nil {\n\t\treturn x.Expr\n\t}\n\treturn nil\n}\n\ntype Iterator struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName     string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tSourceId string `protobuf:\"bytes,2,opt,name=source_id,json=sourceId,proto3\" json:\"source_id,omitempty\"`\n}\n\nfunc (x *Iterator) Reset() {\n\t*x = Iterator{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[34]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Iterator) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Iterator) ProtoMessage() {}\n\nfunc (x *Iterator) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[34]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Iterator.ProtoReflect.Descriptor instead.\nfunc (*Iterator) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{34}\n}\n\nfunc (x *Iterator) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Iterator) GetSourceId() string {\n\tif x != nil {\n\t\treturn x.SourceId\n\t}\n\treturn \"\"\n}\n\ntype MapIteratorExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tType *Type `protobuf:\"bytes,1,opt,name=type,proto3\" json:\"type,omitempty\"`\n\t// Types that are assignable to Expr:\n\t//\n\t//\t*MapIteratorExpr_By\n\t//\t*MapIteratorExpr_Message\n\t//\t*MapIteratorExpr_Enum\n\tExpr isMapIteratorExpr_Expr `protobuf_oneof:\"expr\"`\n}\n\nfunc (x *MapIteratorExpr) Reset() {\n\t*x = MapIteratorExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[35]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MapIteratorExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MapIteratorExpr) ProtoMessage() {}\n\nfunc (x *MapIteratorExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[35]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MapIteratorExpr.ProtoReflect.Descriptor instead.\nfunc (*MapIteratorExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{35}\n}\n\nfunc (x *MapIteratorExpr) GetType() *Type {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nfunc (m *MapIteratorExpr) GetExpr() isMapIteratorExpr_Expr {\n\tif m != nil {\n\t\treturn m.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *MapIteratorExpr) GetBy() *CELValue {\n\tif x, ok := x.GetExpr().(*MapIteratorExpr_By); ok {\n\t\treturn x.By\n\t}\n\treturn nil\n}\n\nfunc (x *MapIteratorExpr) GetMessage() *MessageExpr {\n\tif x, ok := x.GetExpr().(*MapIteratorExpr_Message); ok {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *MapIteratorExpr) GetEnum() *EnumExpr {\n\tif x, ok := x.GetExpr().(*MapIteratorExpr_Enum); ok {\n\t\treturn x.Enum\n\t}\n\treturn nil\n}\n\ntype isMapIteratorExpr_Expr interface {\n\tisMapIteratorExpr_Expr()\n}\n\ntype MapIteratorExpr_By struct {\n\tBy *CELValue `protobuf:\"bytes,2,opt,name=by,proto3,oneof\"`\n}\n\ntype MapIteratorExpr_Message struct {\n\tMessage *MessageExpr `protobuf:\"bytes,3,opt,name=message,proto3,oneof\"`\n}\n\ntype MapIteratorExpr_Enum struct {\n\tEnum *EnumExpr `protobuf:\"bytes,4,opt,name=enum,proto3,oneof\"`\n}\n\nfunc (*MapIteratorExpr_By) isMapIteratorExpr_Expr() {}\n\nfunc (*MapIteratorExpr_Message) isMapIteratorExpr_Expr() {}\n\nfunc (*MapIteratorExpr_Enum) isMapIteratorExpr_Expr() {}\n\ntype CallExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMethodId string               `protobuf:\"bytes,1,opt,name=method_id,json=methodId,proto3\" json:\"method_id,omitempty\"`\n\tRequest  *Request             `protobuf:\"bytes,2,opt,name=request,proto3\" json:\"request,omitempty\"`\n\tTimeout  *durationpb.Duration `protobuf:\"bytes,3,opt,name=timeout,proto3\" json:\"timeout,omitempty\"`\n\tRetry    *RetryPolicy         `protobuf:\"bytes,4,opt,name=retry,proto3\" json:\"retry,omitempty\"`\n\tErrors   []*GRPCError         `protobuf:\"bytes,5,rep,name=errors,proto3\" json:\"errors,omitempty\"`\n\tOption   *GRPCCallOption      `protobuf:\"bytes,6,opt,name=option,proto3\" json:\"option,omitempty\"`\n\tMetadata *CELValue            `protobuf:\"bytes,7,opt,name=metadata,proto3\" json:\"metadata,omitempty\"`\n}\n\nfunc (x *CallExpr) Reset() {\n\t*x = CallExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[36]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CallExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CallExpr) ProtoMessage() {}\n\nfunc (x *CallExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[36]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CallExpr.ProtoReflect.Descriptor instead.\nfunc (*CallExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{36}\n}\n\nfunc (x *CallExpr) GetMethodId() string {\n\tif x != nil {\n\t\treturn x.MethodId\n\t}\n\treturn \"\"\n}\n\nfunc (x *CallExpr) GetRequest() *Request {\n\tif x != nil {\n\t\treturn x.Request\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetTimeout() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.Timeout\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetRetry() *RetryPolicy {\n\tif x != nil {\n\t\treturn x.Retry\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetErrors() []*GRPCError {\n\tif x != nil {\n\t\treturn x.Errors\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetOption() *GRPCCallOption {\n\tif x != nil {\n\t\treturn x.Option\n\t}\n\treturn nil\n}\n\nfunc (x *CallExpr) GetMetadata() *CELValue {\n\tif x != nil {\n\t\treturn x.Metadata\n\t}\n\treturn nil\n}\n\ntype RetryPolicy struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to Policy:\n\t//\n\t//\t*RetryPolicy_Constant\n\t//\t*RetryPolicy_Exponential\n\tPolicy isRetryPolicy_Policy `protobuf_oneof:\"policy\"`\n\tIf     *CELValue            `protobuf:\"bytes,3,opt,name=if,proto3\" json:\"if,omitempty\"`\n}\n\nfunc (x *RetryPolicy) Reset() {\n\t*x = RetryPolicy{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[37]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RetryPolicy) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RetryPolicy) ProtoMessage() {}\n\nfunc (x *RetryPolicy) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[37]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RetryPolicy.ProtoReflect.Descriptor instead.\nfunc (*RetryPolicy) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{37}\n}\n\nfunc (m *RetryPolicy) GetPolicy() isRetryPolicy_Policy {\n\tif m != nil {\n\t\treturn m.Policy\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicy) GetConstant() *RetryPolicyConstant {\n\tif x, ok := x.GetPolicy().(*RetryPolicy_Constant); ok {\n\t\treturn x.Constant\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicy) GetExponential() *RetryPolicyExponential {\n\tif x, ok := x.GetPolicy().(*RetryPolicy_Exponential); ok {\n\t\treturn x.Exponential\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicy) GetIf() *CELValue {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn nil\n}\n\ntype isRetryPolicy_Policy interface {\n\tisRetryPolicy_Policy()\n}\n\ntype RetryPolicy_Constant struct {\n\tConstant *RetryPolicyConstant `protobuf:\"bytes,1,opt,name=constant,proto3,oneof\"`\n}\n\ntype RetryPolicy_Exponential struct {\n\tExponential *RetryPolicyExponential `protobuf:\"bytes,2,opt,name=exponential,proto3,oneof\"`\n}\n\nfunc (*RetryPolicy_Constant) isRetryPolicy_Policy() {}\n\nfunc (*RetryPolicy_Exponential) isRetryPolicy_Policy() {}\n\ntype RetryPolicyConstant struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tInterval   *durationpb.Duration `protobuf:\"bytes,1,opt,name=interval,proto3\" json:\"interval,omitempty\"`\n\tMaxRetries uint64               `protobuf:\"varint,2,opt,name=max_retries,json=maxRetries,proto3\" json:\"max_retries,omitempty\"`\n}\n\nfunc (x *RetryPolicyConstant) Reset() {\n\t*x = RetryPolicyConstant{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[38]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RetryPolicyConstant) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RetryPolicyConstant) ProtoMessage() {}\n\nfunc (x *RetryPolicyConstant) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[38]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RetryPolicyConstant.ProtoReflect.Descriptor instead.\nfunc (*RetryPolicyConstant) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{38}\n}\n\nfunc (x *RetryPolicyConstant) GetInterval() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.Interval\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicyConstant) GetMaxRetries() uint64 {\n\tif x != nil {\n\t\treturn x.MaxRetries\n\t}\n\treturn 0\n}\n\ntype RetryPolicyExponential struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tInitialInterval     *durationpb.Duration `protobuf:\"bytes,1,opt,name=initial_interval,json=initialInterval,proto3\" json:\"initial_interval,omitempty\"`\n\tRandomizationFactor float64              `protobuf:\"fixed64,2,opt,name=randomization_factor,json=randomizationFactor,proto3\" json:\"randomization_factor,omitempty\"`\n\tMultiplier          float64              `protobuf:\"fixed64,3,opt,name=multiplier,proto3\" json:\"multiplier,omitempty\"`\n\tMaxInterval         *durationpb.Duration `protobuf:\"bytes,4,opt,name=max_interval,json=maxInterval,proto3\" json:\"max_interval,omitempty\"`\n\tMaxRetries          uint64               `protobuf:\"varint,5,opt,name=max_retries,json=maxRetries,proto3\" json:\"max_retries,omitempty\"`\n\tMaxElapsedTime      *durationpb.Duration `protobuf:\"bytes,6,opt,name=max_elapsed_time,json=maxElapsedTime,proto3\" json:\"max_elapsed_time,omitempty\"`\n}\n\nfunc (x *RetryPolicyExponential) Reset() {\n\t*x = RetryPolicyExponential{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[39]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *RetryPolicyExponential) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RetryPolicyExponential) ProtoMessage() {}\n\nfunc (x *RetryPolicyExponential) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[39]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RetryPolicyExponential.ProtoReflect.Descriptor instead.\nfunc (*RetryPolicyExponential) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{39}\n}\n\nfunc (x *RetryPolicyExponential) GetInitialInterval() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.InitialInterval\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicyExponential) GetRandomizationFactor() float64 {\n\tif x != nil {\n\t\treturn x.RandomizationFactor\n\t}\n\treturn 0\n}\n\nfunc (x *RetryPolicyExponential) GetMultiplier() float64 {\n\tif x != nil {\n\t\treturn x.Multiplier\n\t}\n\treturn 0\n}\n\nfunc (x *RetryPolicyExponential) GetMaxInterval() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.MaxInterval\n\t}\n\treturn nil\n}\n\nfunc (x *RetryPolicyExponential) GetMaxRetries() uint64 {\n\tif x != nil {\n\t\treturn x.MaxRetries\n\t}\n\treturn 0\n}\n\nfunc (x *RetryPolicyExponential) GetMaxElapsedTime() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.MaxElapsedTime\n\t}\n\treturn nil\n}\n\ntype Request struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tArgs   []*Argument `protobuf:\"bytes,1,rep,name=args,proto3\" json:\"args,omitempty\"`\n\tTypeId string      `protobuf:\"bytes,2,opt,name=type_id,json=typeId,proto3\" json:\"type_id,omitempty\"`\n}\n\nfunc (x *Request) Reset() {\n\t*x = Request{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[40]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Request) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Request) ProtoMessage() {}\n\nfunc (x *Request) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[40]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Request.ProtoReflect.Descriptor instead.\nfunc (*Request) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{40}\n}\n\nfunc (x *Request) GetArgs() []*Argument {\n\tif x != nil {\n\t\treturn x.Args\n\t}\n\treturn nil\n}\n\nfunc (x *Request) GetTypeId() string {\n\tif x != nil {\n\t\treturn x.TypeId\n\t}\n\treturn \"\"\n}\n\ntype MessageExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessageId string      `protobuf:\"bytes,1,opt,name=message_id,json=messageId,proto3\" json:\"message_id,omitempty\"`\n\tArgs      []*Argument `protobuf:\"bytes,2,rep,name=args,proto3\" json:\"args,omitempty\"`\n}\n\nfunc (x *MessageExpr) Reset() {\n\t*x = MessageExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[41]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MessageExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MessageExpr) ProtoMessage() {}\n\nfunc (x *MessageExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[41]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MessageExpr.ProtoReflect.Descriptor instead.\nfunc (*MessageExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{41}\n}\n\nfunc (x *MessageExpr) GetMessageId() string {\n\tif x != nil {\n\t\treturn x.MessageId\n\t}\n\treturn \"\"\n}\n\nfunc (x *MessageExpr) GetArgs() []*Argument {\n\tif x != nil {\n\t\treturn x.Args\n\t}\n\treturn nil\n}\n\ntype EnumExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEnumId string    `protobuf:\"bytes,1,opt,name=enum_id,json=enumId,proto3\" json:\"enum_id,omitempty\"`\n\tBy     *CELValue `protobuf:\"bytes,2,opt,name=by,proto3\" json:\"by,omitempty\"`\n}\n\nfunc (x *EnumExpr) Reset() {\n\t*x = EnumExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[42]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumExpr) ProtoMessage() {}\n\nfunc (x *EnumExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[42]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumExpr.ProtoReflect.Descriptor instead.\nfunc (*EnumExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{42}\n}\n\nfunc (x *EnumExpr) GetEnumId() string {\n\tif x != nil {\n\t\treturn x.EnumId\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnumExpr) GetBy() *CELValue {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn nil\n}\n\ntype Argument struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName  string    `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tType  *Type     `protobuf:\"bytes,2,opt,name=type,proto3\" json:\"type,omitempty\"`\n\tValue *Value    `protobuf:\"bytes,3,opt,name=value,proto3\" json:\"value,omitempty\"`\n\tIf    *CELValue `protobuf:\"bytes,4,opt,name=if,proto3\" json:\"if,omitempty\"`\n}\n\nfunc (x *Argument) Reset() {\n\t*x = Argument{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[43]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Argument) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Argument) ProtoMessage() {}\n\nfunc (x *Argument) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[43]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Argument.ProtoReflect.Descriptor instead.\nfunc (*Argument) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{43}\n}\n\nfunc (x *Argument) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Argument) GetType() *Type {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nfunc (x *Argument) GetValue() *Value {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn nil\n}\n\nfunc (x *Argument) GetIf() *CELValue {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn nil\n}\n\ntype Value struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tInline bool      `protobuf:\"varint,1,opt,name=inline,proto3\" json:\"inline,omitempty\"`\n\tCel    *CELValue `protobuf:\"bytes,2,opt,name=cel,proto3\" json:\"cel,omitempty\"`\n}\n\nfunc (x *Value) Reset() {\n\t*x = Value{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[44]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Value) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Value) ProtoMessage() {}\n\nfunc (x *Value) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[44]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Value.ProtoReflect.Descriptor instead.\nfunc (*Value) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{44}\n}\n\nfunc (x *Value) GetInline() bool {\n\tif x != nil {\n\t\treturn x.Inline\n\t}\n\treturn false\n}\n\nfunc (x *Value) GetCel() *CELValue {\n\tif x != nil {\n\t\treturn x.Cel\n\t}\n\treturn nil\n}\n\ntype SwitchExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tType    *Type          `protobuf:\"bytes,1,opt,name=type,proto3\" json:\"type,omitempty\"`\n\tCases   []*SwitchCase  `protobuf:\"bytes,2,rep,name=cases,proto3\" json:\"cases,omitempty\"`\n\tDefault *SwitchDefault `protobuf:\"bytes,3,opt,name=default,proto3\" json:\"default,omitempty\"`\n}\n\nfunc (x *SwitchExpr) Reset() {\n\t*x = SwitchExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[45]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SwitchExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SwitchExpr) ProtoMessage() {}\n\nfunc (x *SwitchExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[45]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SwitchExpr.ProtoReflect.Descriptor instead.\nfunc (*SwitchExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{45}\n}\n\nfunc (x *SwitchExpr) GetType() *Type {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchExpr) GetCases() []*SwitchCase {\n\tif x != nil {\n\t\treturn x.Cases\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchExpr) GetDefault() *SwitchDefault {\n\tif x != nil {\n\t\treturn x.Default\n\t}\n\treturn nil\n}\n\ntype SwitchCase struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tIf     *CELValue              `protobuf:\"bytes,1,opt,name=if,proto3\" json:\"if,omitempty\"`\n\tBy     *CELValue              `protobuf:\"bytes,2,opt,name=by,proto3\" json:\"by,omitempty\"`\n\tDefSet *VariableDefinitionSet `protobuf:\"bytes,3,opt,name=def_set,json=defSet,proto3\" json:\"def_set,omitempty\"`\n}\n\nfunc (x *SwitchCase) Reset() {\n\t*x = SwitchCase{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[46]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SwitchCase) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SwitchCase) ProtoMessage() {}\n\nfunc (x *SwitchCase) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[46]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SwitchCase.ProtoReflect.Descriptor instead.\nfunc (*SwitchCase) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{46}\n}\n\nfunc (x *SwitchCase) GetIf() *CELValue {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchCase) GetBy() *CELValue {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchCase) GetDefSet() *VariableDefinitionSet {\n\tif x != nil {\n\t\treturn x.DefSet\n\t}\n\treturn nil\n}\n\ntype SwitchDefault struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tBy     *CELValue              `protobuf:\"bytes,1,opt,name=by,proto3\" json:\"by,omitempty\"`\n\tDefSet *VariableDefinitionSet `protobuf:\"bytes,2,opt,name=def_set,json=defSet,proto3\" json:\"def_set,omitempty\"`\n}\n\nfunc (x *SwitchDefault) Reset() {\n\t*x = SwitchDefault{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[47]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SwitchDefault) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SwitchDefault) ProtoMessage() {}\n\nfunc (x *SwitchDefault) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[47]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SwitchDefault.ProtoReflect.Descriptor instead.\nfunc (*SwitchDefault) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{47}\n}\n\nfunc (x *SwitchDefault) GetBy() *CELValue {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn nil\n}\n\nfunc (x *SwitchDefault) GetDefSet() *VariableDefinitionSet {\n\tif x != nil {\n\t\treturn x.DefSet\n\t}\n\treturn nil\n}\n\ntype ValidationExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName  string     `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tError *GRPCError `protobuf:\"bytes,2,opt,name=error,proto3\" json:\"error,omitempty\"`\n}\n\nfunc (x *ValidationExpr) Reset() {\n\t*x = ValidationExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[48]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ValidationExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ValidationExpr) ProtoMessage() {}\n\nfunc (x *ValidationExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[48]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ValidationExpr.ProtoReflect.Descriptor instead.\nfunc (*ValidationExpr) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{48}\n}\n\nfunc (x *ValidationExpr) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *ValidationExpr) GetError() *GRPCError {\n\tif x != nil {\n\t\treturn x.Error\n\t}\n\treturn nil\n}\n\ntype GRPCError struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tDefSet            *VariableDefinitionSet `protobuf:\"bytes,1,opt,name=def_set,json=defSet,proto3\" json:\"def_set,omitempty\"`\n\tIf                *CELValue              `protobuf:\"bytes,2,opt,name=if,proto3\" json:\"if,omitempty\"`\n\tCode              *code.Code             `protobuf:\"varint,3,opt,name=code,proto3,enum=google.rpc.Code,oneof\" json:\"code,omitempty\"`\n\tMessage           *CELValue              `protobuf:\"bytes,4,opt,name=message,proto3\" json:\"message,omitempty\"`\n\tDetails           []*GRPCErrorDetail     `protobuf:\"bytes,5,rep,name=details,proto3\" json:\"details,omitempty\"`\n\tIgnore            bool                   `protobuf:\"varint,6,opt,name=ignore,proto3\" json:\"ignore,omitempty\"`\n\tIgnoreAndResponse *CELValue              `protobuf:\"bytes,7,opt,name=ignore_and_response,json=ignoreAndResponse,proto3\" json:\"ignore_and_response,omitempty\"`\n\tLogLevel          int32                  `protobuf:\"varint,8,opt,name=log_level,json=logLevel,proto3\" json:\"log_level,omitempty\"`\n}\n\nfunc (x *GRPCError) Reset() {\n\t*x = GRPCError{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[49]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GRPCError) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GRPCError) ProtoMessage() {}\n\nfunc (x *GRPCError) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[49]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GRPCError.ProtoReflect.Descriptor instead.\nfunc (*GRPCError) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{49}\n}\n\nfunc (x *GRPCError) GetDefSet() *VariableDefinitionSet {\n\tif x != nil {\n\t\treturn x.DefSet\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCError) GetIf() *CELValue {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCError) GetCode() code.Code {\n\tif x != nil && x.Code != nil {\n\t\treturn *x.Code\n\t}\n\treturn code.Code(0)\n}\n\nfunc (x *GRPCError) GetMessage() *CELValue {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCError) GetDetails() []*GRPCErrorDetail {\n\tif x != nil {\n\t\treturn x.Details\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCError) GetIgnore() bool {\n\tif x != nil {\n\t\treturn x.Ignore\n\t}\n\treturn false\n}\n\nfunc (x *GRPCError) GetIgnoreAndResponse() *CELValue {\n\tif x != nil {\n\t\treturn x.IgnoreAndResponse\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCError) GetLogLevel() int32 {\n\tif x != nil {\n\t\treturn x.LogLevel\n\t}\n\treturn 0\n}\n\ntype GRPCErrorDetail struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tDefSet               *VariableDefinitionSet `protobuf:\"bytes,1,opt,name=def_set,json=defSet,proto3\" json:\"def_set,omitempty\"`\n\tIf                   *CELValue              `protobuf:\"bytes,2,opt,name=if,proto3\" json:\"if,omitempty\"`\n\tMessages             *VariableDefinitionSet `protobuf:\"bytes,3,opt,name=messages,proto3\" json:\"messages,omitempty\"`\n\tPreconditionFailures []*PreconditionFailure `protobuf:\"bytes,4,rep,name=precondition_failures,json=preconditionFailures,proto3\" json:\"precondition_failures,omitempty\"`\n\tBadRequests          []*BadRequest          `protobuf:\"bytes,5,rep,name=bad_requests,json=badRequests,proto3\" json:\"bad_requests,omitempty\"`\n\tLocalizedMessages    []*LocalizedMessage    `protobuf:\"bytes,6,rep,name=localized_messages,json=localizedMessages,proto3\" json:\"localized_messages,omitempty\"`\n\tBy                   []*CELValue            `protobuf:\"bytes,7,rep,name=by,proto3\" json:\"by,omitempty\"`\n}\n\nfunc (x *GRPCErrorDetail) Reset() {\n\t*x = GRPCErrorDetail{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[50]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GRPCErrorDetail) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GRPCErrorDetail) ProtoMessage() {}\n\nfunc (x *GRPCErrorDetail) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[50]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GRPCErrorDetail.ProtoReflect.Descriptor instead.\nfunc (*GRPCErrorDetail) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{50}\n}\n\nfunc (x *GRPCErrorDetail) GetDefSet() *VariableDefinitionSet {\n\tif x != nil {\n\t\treturn x.DefSet\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetIf() *CELValue {\n\tif x != nil {\n\t\treturn x.If\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetMessages() *VariableDefinitionSet {\n\tif x != nil {\n\t\treturn x.Messages\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetPreconditionFailures() []*PreconditionFailure {\n\tif x != nil {\n\t\treturn x.PreconditionFailures\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetBadRequests() []*BadRequest {\n\tif x != nil {\n\t\treturn x.BadRequests\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetLocalizedMessages() []*LocalizedMessage {\n\tif x != nil {\n\t\treturn x.LocalizedMessages\n\t}\n\treturn nil\n}\n\nfunc (x *GRPCErrorDetail) GetBy() []*CELValue {\n\tif x != nil {\n\t\treturn x.By\n\t}\n\treturn nil\n}\n\ntype PreconditionFailure struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tViolations []*PreconditionFailureViolation `protobuf:\"bytes,1,rep,name=violations,proto3\" json:\"violations,omitempty\"`\n}\n\nfunc (x *PreconditionFailure) Reset() {\n\t*x = PreconditionFailure{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[51]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *PreconditionFailure) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*PreconditionFailure) ProtoMessage() {}\n\nfunc (x *PreconditionFailure) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[51]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use PreconditionFailure.ProtoReflect.Descriptor instead.\nfunc (*PreconditionFailure) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{51}\n}\n\nfunc (x *PreconditionFailure) GetViolations() []*PreconditionFailureViolation {\n\tif x != nil {\n\t\treturn x.Violations\n\t}\n\treturn nil\n}\n\ntype PreconditionFailureViolation struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tType        *CELValue `protobuf:\"bytes,1,opt,name=type,proto3\" json:\"type,omitempty\"`\n\tSubject     *CELValue `protobuf:\"bytes,2,opt,name=subject,proto3\" json:\"subject,omitempty\"`\n\tDescription *CELValue `protobuf:\"bytes,3,opt,name=description,proto3\" json:\"description,omitempty\"`\n}\n\nfunc (x *PreconditionFailureViolation) Reset() {\n\t*x = PreconditionFailureViolation{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[52]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *PreconditionFailureViolation) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*PreconditionFailureViolation) ProtoMessage() {}\n\nfunc (x *PreconditionFailureViolation) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[52]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use PreconditionFailureViolation.ProtoReflect.Descriptor instead.\nfunc (*PreconditionFailureViolation) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{52}\n}\n\nfunc (x *PreconditionFailureViolation) GetType() *CELValue {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nfunc (x *PreconditionFailureViolation) GetSubject() *CELValue {\n\tif x != nil {\n\t\treturn x.Subject\n\t}\n\treturn nil\n}\n\nfunc (x *PreconditionFailureViolation) GetDescription() *CELValue {\n\tif x != nil {\n\t\treturn x.Description\n\t}\n\treturn nil\n}\n\ntype BadRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tFieldViolations []*BadRequestFieldViolation `protobuf:\"bytes,1,rep,name=field_violations,json=fieldViolations,proto3\" json:\"field_violations,omitempty\"`\n}\n\nfunc (x *BadRequest) Reset() {\n\t*x = BadRequest{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[53]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *BadRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*BadRequest) ProtoMessage() {}\n\nfunc (x *BadRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[53]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use BadRequest.ProtoReflect.Descriptor instead.\nfunc (*BadRequest) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{53}\n}\n\nfunc (x *BadRequest) GetFieldViolations() []*BadRequestFieldViolation {\n\tif x != nil {\n\t\treturn x.FieldViolations\n\t}\n\treturn nil\n}\n\ntype BadRequestFieldViolation struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tField       *CELValue `protobuf:\"bytes,1,opt,name=field,proto3\" json:\"field,omitempty\"`\n\tDescription *CELValue `protobuf:\"bytes,2,opt,name=description,proto3\" json:\"description,omitempty\"`\n}\n\nfunc (x *BadRequestFieldViolation) Reset() {\n\t*x = BadRequestFieldViolation{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[54]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *BadRequestFieldViolation) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*BadRequestFieldViolation) ProtoMessage() {}\n\nfunc (x *BadRequestFieldViolation) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[54]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use BadRequestFieldViolation.ProtoReflect.Descriptor instead.\nfunc (*BadRequestFieldViolation) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{54}\n}\n\nfunc (x *BadRequestFieldViolation) GetField() *CELValue {\n\tif x != nil {\n\t\treturn x.Field\n\t}\n\treturn nil\n}\n\nfunc (x *BadRequestFieldViolation) GetDescription() *CELValue {\n\tif x != nil {\n\t\treturn x.Description\n\t}\n\treturn nil\n}\n\ntype LocalizedMessage struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tLocale  string    `protobuf:\"bytes,1,opt,name=locale,proto3\" json:\"locale,omitempty\"`\n\tMessage *CELValue `protobuf:\"bytes,2,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *LocalizedMessage) Reset() {\n\t*x = LocalizedMessage{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[55]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *LocalizedMessage) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*LocalizedMessage) ProtoMessage() {}\n\nfunc (x *LocalizedMessage) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[55]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use LocalizedMessage.ProtoReflect.Descriptor instead.\nfunc (*LocalizedMessage) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{55}\n}\n\nfunc (x *LocalizedMessage) GetLocale() string {\n\tif x != nil {\n\t\treturn x.Locale\n\t}\n\treturn \"\"\n}\n\nfunc (x *LocalizedMessage) GetMessage() *CELValue {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn nil\n}\n\ntype GRPCCallOption struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tContentSubtype     *string `protobuf:\"bytes,1,opt,name=content_subtype,json=contentSubtype,proto3,oneof\" json:\"content_subtype,omitempty\"`\n\tHeaderId           *string `protobuf:\"bytes,2,opt,name=header_id,json=headerId,proto3,oneof\" json:\"header_id,omitempty\"`\n\tMaxCallRecvMsgSize *int64  `protobuf:\"varint,3,opt,name=max_call_recv_msg_size,json=maxCallRecvMsgSize,proto3,oneof\" json:\"max_call_recv_msg_size,omitempty\"`\n\tMaxCallSendMsgSize *int64  `protobuf:\"varint,4,opt,name=max_call_send_msg_size,json=maxCallSendMsgSize,proto3,oneof\" json:\"max_call_send_msg_size,omitempty\"`\n\tStaticMethod       *bool   `protobuf:\"varint,5,opt,name=static_method,json=staticMethod,proto3,oneof\" json:\"static_method,omitempty\"`\n\tTrailerId          *string `protobuf:\"bytes,6,opt,name=trailer_id,json=trailerId,proto3,oneof\" json:\"trailer_id,omitempty\"`\n\tWaitForReady       *bool   `protobuf:\"varint,7,opt,name=wait_for_ready,json=waitForReady,proto3,oneof\" json:\"wait_for_ready,omitempty\"`\n}\n\nfunc (x *GRPCCallOption) Reset() {\n\t*x = GRPCCallOption{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[56]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *GRPCCallOption) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GRPCCallOption) ProtoMessage() {}\n\nfunc (x *GRPCCallOption) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[56]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GRPCCallOption.ProtoReflect.Descriptor instead.\nfunc (*GRPCCallOption) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{56}\n}\n\nfunc (x *GRPCCallOption) GetContentSubtype() string {\n\tif x != nil && x.ContentSubtype != nil {\n\t\treturn *x.ContentSubtype\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCCallOption) GetHeaderId() string {\n\tif x != nil && x.HeaderId != nil {\n\t\treturn *x.HeaderId\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCCallOption) GetMaxCallRecvMsgSize() int64 {\n\tif x != nil && x.MaxCallRecvMsgSize != nil {\n\t\treturn *x.MaxCallRecvMsgSize\n\t}\n\treturn 0\n}\n\nfunc (x *GRPCCallOption) GetMaxCallSendMsgSize() int64 {\n\tif x != nil && x.MaxCallSendMsgSize != nil {\n\t\treturn *x.MaxCallSendMsgSize\n\t}\n\treturn 0\n}\n\nfunc (x *GRPCCallOption) GetStaticMethod() bool {\n\tif x != nil && x.StaticMethod != nil {\n\t\treturn *x.StaticMethod\n\t}\n\treturn false\n}\n\nfunc (x *GRPCCallOption) GetTrailerId() string {\n\tif x != nil && x.TrailerId != nil {\n\t\treturn *x.TrailerId\n\t}\n\treturn \"\"\n}\n\nfunc (x *GRPCCallOption) GetWaitForReady() bool {\n\tif x != nil && x.WaitForReady != nil {\n\t\treturn *x.WaitForReady\n\t}\n\treturn false\n}\n\ntype Oneof struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId        string   `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName      string   `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tMessageId string   `protobuf:\"bytes,3,opt,name=message_id,json=messageId,proto3\" json:\"message_id,omitempty\"`\n\tFieldIds  []string `protobuf:\"bytes,4,rep,name=field_ids,json=fieldIds,proto3\" json:\"field_ids,omitempty\"`\n}\n\nfunc (x *Oneof) Reset() {\n\t*x = Oneof{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[57]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Oneof) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Oneof) ProtoMessage() {}\n\nfunc (x *Oneof) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[57]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Oneof.ProtoReflect.Descriptor instead.\nfunc (*Oneof) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{57}\n}\n\nfunc (x *Oneof) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *Oneof) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Oneof) GetMessageId() string {\n\tif x != nil {\n\t\treturn x.MessageId\n\t}\n\treturn \"\"\n}\n\nfunc (x *Oneof) GetFieldIds() []string {\n\tif x != nil {\n\t\treturn x.FieldIds\n\t}\n\treturn nil\n}\n\ntype Enum struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId        string    `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName      string    `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tValueIds  []string  `protobuf:\"bytes,3,rep,name=value_ids,json=valueIds,proto3\" json:\"value_ids,omitempty\"`\n\tMessageId string    `protobuf:\"bytes,4,opt,name=message_id,json=messageId,proto3\" json:\"message_id,omitempty\"`\n\tFileId    string    `protobuf:\"bytes,5,opt,name=file_id,json=fileId,proto3\" json:\"file_id,omitempty\"`\n\tRule      *EnumRule `protobuf:\"bytes,6,opt,name=rule,proto3\" json:\"rule,omitempty\"`\n}\n\nfunc (x *Enum) Reset() {\n\t*x = Enum{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[58]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Enum) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Enum) ProtoMessage() {}\n\nfunc (x *Enum) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[58]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Enum.ProtoReflect.Descriptor instead.\nfunc (*Enum) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{58}\n}\n\nfunc (x *Enum) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *Enum) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Enum) GetValueIds() []string {\n\tif x != nil {\n\t\treturn x.ValueIds\n\t}\n\treturn nil\n}\n\nfunc (x *Enum) GetMessageId() string {\n\tif x != nil {\n\t\treturn x.MessageId\n\t}\n\treturn \"\"\n}\n\nfunc (x *Enum) GetFileId() string {\n\tif x != nil {\n\t\treturn x.FileId\n\t}\n\treturn \"\"\n}\n\nfunc (x *Enum) GetRule() *EnumRule {\n\tif x != nil {\n\t\treturn x.Rule\n\t}\n\treturn nil\n}\n\ntype EnumValue struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId     string         `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tValue  string         `protobuf:\"bytes,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n\tEnumId string         `protobuf:\"bytes,3,opt,name=enum_id,json=enumId,proto3\" json:\"enum_id,omitempty\"`\n\tRule   *EnumValueRule `protobuf:\"bytes,4,opt,name=rule,proto3\" json:\"rule,omitempty\"`\n}\n\nfunc (x *EnumValue) Reset() {\n\t*x = EnumValue{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[59]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumValue) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumValue) ProtoMessage() {}\n\nfunc (x *EnumValue) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[59]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumValue.ProtoReflect.Descriptor instead.\nfunc (*EnumValue) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{59}\n}\n\nfunc (x *EnumValue) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnumValue) GetValue() string {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnumValue) GetEnumId() string {\n\tif x != nil {\n\t\treturn x.EnumId\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnumValue) GetRule() *EnumValueRule {\n\tif x != nil {\n\t\treturn x.Rule\n\t}\n\treturn nil\n}\n\ntype EnumRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tAliasIds []string `protobuf:\"bytes,1,rep,name=alias_ids,json=aliasIds,proto3\" json:\"alias_ids,omitempty\"`\n}\n\nfunc (x *EnumRule) Reset() {\n\t*x = EnumRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[60]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumRule) ProtoMessage() {}\n\nfunc (x *EnumRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[60]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumRule.ProtoReflect.Descriptor instead.\nfunc (*EnumRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{60}\n}\n\nfunc (x *EnumRule) GetAliasIds() []string {\n\tif x != nil {\n\t\treturn x.AliasIds\n\t}\n\treturn nil\n}\n\ntype EnumValueRule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tDefault bool                  `protobuf:\"varint,1,opt,name=default,proto3\" json:\"default,omitempty\"`\n\tAliases []*EnumValueAlias     `protobuf:\"bytes,2,rep,name=aliases,proto3\" json:\"aliases,omitempty\"`\n\tAttrs   []*EnumValueAttribute `protobuf:\"bytes,3,rep,name=attrs,proto3\" json:\"attrs,omitempty\"`\n\tNoalias bool                  `protobuf:\"varint,4,opt,name=noalias,proto3\" json:\"noalias,omitempty\"`\n}\n\nfunc (x *EnumValueRule) Reset() {\n\t*x = EnumValueRule{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[61]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumValueRule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumValueRule) ProtoMessage() {}\n\nfunc (x *EnumValueRule) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[61]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumValueRule.ProtoReflect.Descriptor instead.\nfunc (*EnumValueRule) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{61}\n}\n\nfunc (x *EnumValueRule) GetDefault() bool {\n\tif x != nil {\n\t\treturn x.Default\n\t}\n\treturn false\n}\n\nfunc (x *EnumValueRule) GetAliases() []*EnumValueAlias {\n\tif x != nil {\n\t\treturn x.Aliases\n\t}\n\treturn nil\n}\n\nfunc (x *EnumValueRule) GetAttrs() []*EnumValueAttribute {\n\tif x != nil {\n\t\treturn x.Attrs\n\t}\n\treturn nil\n}\n\nfunc (x *EnumValueRule) GetNoalias() bool {\n\tif x != nil {\n\t\treturn x.Noalias\n\t}\n\treturn false\n}\n\ntype EnumValueAlias struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEnumAliasId string   `protobuf:\"bytes,1,opt,name=enum_alias_id,json=enumAliasId,proto3\" json:\"enum_alias_id,omitempty\"`\n\tAliasIds    []string `protobuf:\"bytes,2,rep,name=alias_ids,json=aliasIds,proto3\" json:\"alias_ids,omitempty\"`\n}\n\nfunc (x *EnumValueAlias) Reset() {\n\t*x = EnumValueAlias{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[62]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumValueAlias) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumValueAlias) ProtoMessage() {}\n\nfunc (x *EnumValueAlias) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[62]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumValueAlias.ProtoReflect.Descriptor instead.\nfunc (*EnumValueAlias) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{62}\n}\n\nfunc (x *EnumValueAlias) GetEnumAliasId() string {\n\tif x != nil {\n\t\treturn x.EnumAliasId\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnumValueAlias) GetAliasIds() []string {\n\tif x != nil {\n\t\treturn x.AliasIds\n\t}\n\treturn nil\n}\n\ntype EnumValueAttribute struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName  string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tValue string `protobuf:\"bytes,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *EnumValueAttribute) Reset() {\n\t*x = EnumValueAttribute{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[63]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumValueAttribute) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumValueAttribute) ProtoMessage() {}\n\nfunc (x *EnumValueAttribute) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[63]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumValueAttribute.ProtoReflect.Descriptor instead.\nfunc (*EnumValueAttribute) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{63}\n}\n\nfunc (x *EnumValueAttribute) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnumValueAttribute) GetValue() string {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn \"\"\n}\n\ntype CELPlugin struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId          string         `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tName        string         `protobuf:\"bytes,2,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tDescription string         `protobuf:\"bytes,3,opt,name=description,proto3\" json:\"description,omitempty\"`\n\tFunctions   []*CELFunction `protobuf:\"bytes,4,rep,name=functions,proto3\" json:\"functions,omitempty\"`\n}\n\nfunc (x *CELPlugin) Reset() {\n\t*x = CELPlugin{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[64]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELPlugin) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELPlugin) ProtoMessage() {}\n\nfunc (x *CELPlugin) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[64]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELPlugin.ProtoReflect.Descriptor instead.\nfunc (*CELPlugin) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{64}\n}\n\nfunc (x *CELPlugin) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELPlugin) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELPlugin) GetDescription() string {\n\tif x != nil {\n\t\treturn x.Description\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELPlugin) GetFunctions() []*CELFunction {\n\tif x != nil {\n\t\treturn x.Functions\n\t}\n\treturn nil\n}\n\ntype CELFunction struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName       string  `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tId         string  `protobuf:\"bytes,2,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tArgs       []*Type `protobuf:\"bytes,3,rep,name=args,proto3\" json:\"args,omitempty\"`\n\tReturn     *Type   `protobuf:\"bytes,4,opt,name=return,proto3\" json:\"return,omitempty\"`\n\tReceiverId string  `protobuf:\"bytes,5,opt,name=receiver_id,json=receiverId,proto3\" json:\"receiver_id,omitempty\"`\n}\n\nfunc (x *CELFunction) Reset() {\n\t*x = CELFunction{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[65]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CELFunction) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CELFunction) ProtoMessage() {}\n\nfunc (x *CELFunction) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[65]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CELFunction.ProtoReflect.Descriptor instead.\nfunc (*CELFunction) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{65}\n}\n\nfunc (x *CELFunction) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunction) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *CELFunction) GetArgs() []*Type {\n\tif x != nil {\n\t\treturn x.Args\n\t}\n\treturn nil\n}\n\nfunc (x *CELFunction) GetReturn() *Type {\n\tif x != nil {\n\t\treturn x.Return\n\t}\n\treturn nil\n}\n\nfunc (x *CELFunction) GetReceiverId() string {\n\tif x != nil {\n\t\treturn x.ReceiverId\n\t}\n\treturn \"\"\n}\n\ntype ProtoCodeGeneratorResponse_GeneratedCodeInfo struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tAnnotation []*ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation `protobuf:\"bytes,1,rep,name=annotation,proto3\" json:\"annotation,omitempty\"`\n}\n\nfunc (x *ProtoCodeGeneratorResponse_GeneratedCodeInfo) Reset() {\n\t*x = ProtoCodeGeneratorResponse_GeneratedCodeInfo{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[66]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ProtoCodeGeneratorResponse_GeneratedCodeInfo) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ProtoCodeGeneratorResponse_GeneratedCodeInfo) ProtoMessage() {}\n\nfunc (x *ProtoCodeGeneratorResponse_GeneratedCodeInfo) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[66]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ProtoCodeGeneratorResponse_GeneratedCodeInfo.ProtoReflect.Descriptor instead.\nfunc (*ProtoCodeGeneratorResponse_GeneratedCodeInfo) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{0, 0}\n}\n\nfunc (x *ProtoCodeGeneratorResponse_GeneratedCodeInfo) GetAnnotation() []*ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation {\n\tif x != nil {\n\t\treturn x.Annotation\n\t}\n\treturn nil\n}\n\ntype ProtoCodeGeneratorResponse_File struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName              *string                                       `protobuf:\"bytes,1,opt,name=name,proto3,oneof\" json:\"name,omitempty\"`\n\tInsertionPoint    *string                                       `protobuf:\"bytes,2,opt,name=insertion_point,json=insertionPoint,proto3,oneof\" json:\"insertion_point,omitempty\"`\n\tContent           *string                                       `protobuf:\"bytes,15,opt,name=content,proto3,oneof\" json:\"content,omitempty\"`\n\tGeneratedCodeInfo *ProtoCodeGeneratorResponse_GeneratedCodeInfo `protobuf:\"bytes,16,opt,name=generated_code_info,json=generatedCodeInfo,proto3,oneof\" json:\"generated_code_info,omitempty\"`\n}\n\nfunc (x *ProtoCodeGeneratorResponse_File) Reset() {\n\t*x = ProtoCodeGeneratorResponse_File{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[67]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ProtoCodeGeneratorResponse_File) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ProtoCodeGeneratorResponse_File) ProtoMessage() {}\n\nfunc (x *ProtoCodeGeneratorResponse_File) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[67]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ProtoCodeGeneratorResponse_File.ProtoReflect.Descriptor instead.\nfunc (*ProtoCodeGeneratorResponse_File) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{0, 1}\n}\n\nfunc (x *ProtoCodeGeneratorResponse_File) GetName() string {\n\tif x != nil && x.Name != nil {\n\t\treturn *x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *ProtoCodeGeneratorResponse_File) GetInsertionPoint() string {\n\tif x != nil && x.InsertionPoint != nil {\n\t\treturn *x.InsertionPoint\n\t}\n\treturn \"\"\n}\n\nfunc (x *ProtoCodeGeneratorResponse_File) GetContent() string {\n\tif x != nil && x.Content != nil {\n\t\treturn *x.Content\n\t}\n\treturn \"\"\n}\n\nfunc (x *ProtoCodeGeneratorResponse_File) GetGeneratedCodeInfo() *ProtoCodeGeneratorResponse_GeneratedCodeInfo {\n\tif x != nil {\n\t\treturn x.GeneratedCodeInfo\n\t}\n\treturn nil\n}\n\ntype ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tPath       []int32                                                           `protobuf:\"varint,1,rep,packed,name=path,proto3\" json:\"path,omitempty\"`\n\tSourceFile *string                                                           `protobuf:\"bytes,2,opt,name=source_file,json=sourceFile,proto3,oneof\" json:\"source_file,omitempty\"`\n\tBegin      *int32                                                            `protobuf:\"varint,3,opt,name=begin,proto3,oneof\" json:\"begin,omitempty\"`\n\tEnd        *int32                                                            `protobuf:\"varint,4,opt,name=end,proto3,oneof\" json:\"end,omitempty\"`\n\tSemantic   *ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic `protobuf:\"varint,5,opt,name=semantic,proto3,enum=grpc.federation.generator.plugin.ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic,oneof\" json:\"semantic,omitempty\"`\n}\n\nfunc (x *ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation) Reset() {\n\t*x = ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_grpc_federation_generator_proto_msgTypes[68]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation) ProtoMessage() {}\n\nfunc (x *ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation) ProtoReflect() protoreflect.Message {\n\tmi := &file_grpc_federation_generator_proto_msgTypes[68]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation.ProtoReflect.Descriptor instead.\nfunc (*ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation) Descriptor() ([]byte, []int) {\n\treturn file_grpc_federation_generator_proto_rawDescGZIP(), []int{0, 0, 0}\n}\n\nfunc (x *ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation) GetPath() []int32 {\n\tif x != nil {\n\t\treturn x.Path\n\t}\n\treturn nil\n}\n\nfunc (x *ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation) GetSourceFile() string {\n\tif x != nil && x.SourceFile != nil {\n\t\treturn *x.SourceFile\n\t}\n\treturn \"\"\n}\n\nfunc (x *ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation) GetBegin() int32 {\n\tif x != nil && x.Begin != nil {\n\t\treturn *x.Begin\n\t}\n\treturn 0\n}\n\nfunc (x *ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation) GetEnd() int32 {\n\tif x != nil && x.End != nil {\n\t\treturn *x.End\n\t}\n\treturn 0\n}\n\nfunc (x *ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation) GetSemantic() ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic {\n\tif x != nil && x.Semantic != nil {\n\t\treturn *x.Semantic\n\t}\n\treturn ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_NONE\n}\n\nvar File_grpc_federation_generator_proto protoreflect.FileDescriptor\n\nvar file_grpc_federation_generator_proto_rawDesc = []byte{\n\t0x0a, 0x1f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x20, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75,\n\t0x67, 0x69, 0x6e, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f,\n\t0x63, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe5, 0x09, 0x0a, 0x1a, 0x50,\n\t0x72, 0x6f, 0x74, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f,\n\t0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19, 0x0a, 0x05, 0x65, 0x72, 0x72,\n\t0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f,\n\t0x72, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x12, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65,\n\t0x64, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04,\n\t0x48, 0x01, 0x52, 0x11, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x46, 0x65, 0x61,\n\t0x74, 0x75, 0x72, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x69,\n\t0x6d, 0x75, 0x6d, 0x5f, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x05, 0x48, 0x02, 0x52, 0x0e, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x45, 0x64, 0x69, 0x74,\n\t0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75,\n\t0x6d, 0x5f, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48,\n\t0x03, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x45, 0x64, 0x69, 0x74, 0x69, 0x6f,\n\t0x6e, 0x88, 0x01, 0x01, 0x12, 0x55, 0x0a, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x0f, 0x20, 0x03,\n\t0x28, 0x0b, 0x32, 0x41, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70,\n\t0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x47,\n\t0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x1a, 0xec, 0x03, 0x0a, 0x11,\n\t0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66,\n\t0x6f, 0x12, 0x79, 0x0a, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18,\n\t0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x59, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f,\n\t0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x43, 0x6f,\n\t0x64, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f,\n\t0x6e, 0x73, 0x65, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x64,\n\t0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x52, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xdb, 0x02, 0x0a,\n\t0x0a, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x04, 0x70,\n\t0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x42, 0x02, 0x10, 0x01, 0x52, 0x04, 0x70,\n\t0x61, 0x74, 0x68, 0x12, 0x24, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x66, 0x69,\n\t0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72,\n\t0x63, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x62, 0x65, 0x67,\n\t0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x05, 0x62, 0x65, 0x67, 0x69,\n\t0x6e, 0x88, 0x01, 0x01, 0x12, 0x15, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28,\n\t0x05, 0x48, 0x02, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12, 0x83, 0x01, 0x0a, 0x08,\n\t0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x62,\n\t0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69,\n\t0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x47, 0x65, 0x6e,\n\t0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x41,\n\t0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x6d, 0x61, 0x6e, 0x74,\n\t0x69, 0x63, 0x48, 0x03, 0x52, 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x88, 0x01,\n\t0x01, 0x22, 0x28, 0x0a, 0x08, 0x53, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x12, 0x08, 0x0a,\n\t0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x45, 0x54, 0x10, 0x01,\n\t0x12, 0x09, 0x0a, 0x05, 0x41, 0x4c, 0x49, 0x41, 0x53, 0x10, 0x02, 0x42, 0x0e, 0x0a, 0x0c, 0x5f,\n\t0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x5f,\n\t0x62, 0x65, 0x67, 0x69, 0x6e, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x65, 0x6e, 0x64, 0x42, 0x0b, 0x0a,\n\t0x09, 0x5f, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x1a, 0xb3, 0x02, 0x0a, 0x04, 0x46,\n\t0x69, 0x6c, 0x65, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x0f,\n\t0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x69,\n\t0x6f, 0x6e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x63, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x07, 0x63,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x83, 0x01, 0x0a, 0x13, 0x67, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x6e, 0x66,\n\t0x6f, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,\n\t0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f,\n\t0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73,\n\t0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x43,\n\t0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x03, 0x52, 0x11, 0x67, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x88, 0x01, 0x01, 0x42,\n\t0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x69, 0x6e, 0x73,\n\t0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x42, 0x0a, 0x0a, 0x08,\n\t0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x67, 0x65, 0x6e,\n\t0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f,\n\t0x22, 0x57, 0x0a, 0x07, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x46,\n\t0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x1b, 0x0a,\n\t0x17, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x33, 0x5f,\n\t0x4f, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x1d, 0x0a, 0x19, 0x46, 0x45,\n\t0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x53, 0x55, 0x50, 0x50, 0x4f, 0x52, 0x54, 0x53, 0x5f, 0x45,\n\t0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x10, 0x02, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x65, 0x72,\n\t0x72, 0x6f, 0x72, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65,\n\t0x64, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x6d,\n\t0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x12,\n\t0x0a, 0x10, 0x5f, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x65, 0x64, 0x69, 0x74, 0x69,\n\t0x6f, 0x6e, 0x22, 0xe0, 0x03, 0x0a, 0x14, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x04, 0x74,\n\t0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65,\n\t0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x41, 0x63, 0x74,\n\t0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a,\n\t0x0a, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1b, 0x0a, 0x07,\n\t0x6f, 0x75, 0x74, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18,\n\t0x01, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x44, 0x69, 0x72, 0x12, 0x57, 0x0a, 0x05, 0x66, 0x69, 0x6c,\n\t0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x74,\n\t0x6f, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65,\n\t0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x66, 0x69, 0x6c,\n\t0x65, 0x73, 0x12, 0x37, 0x0a, 0x18, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x05,\n\t0x20, 0x03, 0x28, 0x09, 0x52, 0x15, 0x67, 0x72, 0x70, 0x63, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x73, 0x12, 0x49, 0x0a, 0x09, 0x72,\n\t0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b,\n\t0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69,\n\t0x6e, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x09, 0x72, 0x65, 0x66,\n\t0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x6d, 0x0a, 0x17, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74,\n\t0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69,\n\t0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,\n\t0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75,\n\t0x74, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52,\n\t0x14, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x43,\n\t0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xb8, 0x01, 0x0a, 0x14, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74,\n\t0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x48,\n\t0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x34, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67,\n\t0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e,\n\t0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x6f,\n\t0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66,\n\t0x69, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,\n\t0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x21, 0x0a,\n\t0x0c, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x04, 0x20,\n\t0x03, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x61, 0x74, 0x68, 0x73,\n\t0x22, 0xc1, 0x15, 0x0a, 0x09, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x53,\n\t0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x38, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75,\n\t0x67, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x46, 0x69,\n\t0x6c, 0x65, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x65,\n\t0x4d, 0x61, 0x70, 0x12, 0x5c, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6d,\n\t0x61, 0x70, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x66, 0x65,\n\t0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x70,\n\t0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x61,\n\t0x70, 0x12, 0x59, 0x0a, 0x0a, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x6d, 0x61, 0x70, 0x18,\n\t0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f,\n\t0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e,\n\t0x63, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72,\n\t0x79, 0x52, 0x09, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4d, 0x61, 0x70, 0x12, 0x5c, 0x0a, 0x0b,\n\t0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28,\n\t0x0b, 0x32, 0x3b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c,\n\t0x75, 0x67, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x4d,\n\t0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a,\n\t0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4d, 0x61, 0x70, 0x12, 0x56, 0x0a, 0x09, 0x66, 0x69,\n\t0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e,\n\t0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4d,\n\t0x61, 0x70, 0x12, 0x53, 0x0a, 0x08, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x06,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72,\n\t0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,\n\t0x65, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07,\n\t0x65, 0x6e, 0x75, 0x6d, 0x4d, 0x61, 0x70, 0x12, 0x63, 0x0a, 0x0e, 0x65, 0x6e, 0x75, 0x6d, 0x5f,\n\t0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x3d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67,\n\t0x69, 0x6e, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x45, 0x6e, 0x75,\n\t0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c,\n\t0x65, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x61, 0x70, 0x12, 0x56, 0x0a, 0x09,\n\t0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x39, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67,\n\t0x69, 0x6e, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x4f, 0x6e, 0x65,\n\t0x6f, 0x66, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6f, 0x6e, 0x65, 0x6f,\n\t0x66, 0x4d, 0x61, 0x70, 0x12, 0x63, 0x0a, 0x0e, 0x63, 0x65, 0x6c, 0x5f, 0x70, 0x6c, 0x75, 0x67,\n\t0x69, 0x6e, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67,\n\t0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e,\n\t0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x43, 0x65, 0x6c, 0x50, 0x6c, 0x75,\n\t0x67, 0x69, 0x6e, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x65, 0x6c,\n\t0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x4d, 0x61, 0x70, 0x12, 0x56, 0x0a, 0x09, 0x67, 0x72, 0x61,\n\t0x70, 0x68, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67,\n\t0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e,\n\t0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x4d,\n\t0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x67, 0x72, 0x61, 0x70, 0x68, 0x4d, 0x61,\n\t0x70, 0x12, 0x7e, 0x0a, 0x17, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x64, 0x65,\n\t0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x0b, 0x20, 0x03,\n\t0x28, 0x0b, 0x32, 0x46, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70,\n\t0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e,\n\t0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69,\n\t0x6f, 0x6e, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x15, 0x76, 0x61, 0x72, 0x69,\n\t0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61,\n\t0x70, 0x12, 0x8e, 0x01, 0x0a, 0x1d, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x64,\n\t0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f,\n\t0x6d, 0x61, 0x70, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4b, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65,\n\t0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x66,\n\t0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44,\n\t0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x61,\n\t0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x1a, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65,\n\t0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d,\n\t0x61, 0x70, 0x12, 0x63, 0x0a, 0x0e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x5f, 0x6e, 0x6f, 0x64, 0x65,\n\t0x5f, 0x6d, 0x61, 0x70, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x67, 0x72, 0x70,\n\t0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e,\n\t0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x52, 0x65,\n\t0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x4e, 0x6f, 0x64,\n\t0x65, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x67, 0x72, 0x61, 0x70, 0x68,\n\t0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x61, 0x70, 0x1a, 0x62, 0x0a, 0x0c, 0x46, 0x69, 0x6c, 0x65, 0x4d,\n\t0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3c, 0x0a, 0x05, 0x76, 0x61, 0x6c,\n\t0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x46, 0x69, 0x6c, 0x65,\n\t0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x68, 0x0a, 0x0f, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10,\n\t0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79,\n\t0x12, 0x3f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x29, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67,\n\t0x69, 0x6e, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,\n\t0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x66, 0x0a, 0x0e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4d,\n\t0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3e, 0x0a, 0x05, 0x76, 0x61, 0x6c,\n\t0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x68, 0x0a,\n\t0x0f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79,\n\t0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b,\n\t0x65, 0x79, 0x12, 0x3f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x29, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c,\n\t0x75, 0x67, 0x69, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61,\n\t0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x64, 0x0a, 0x0d, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3d, 0x0a, 0x05, 0x76, 0x61,\n\t0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65,\n\t0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x46, 0x69, 0x65,\n\t0x6c, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x62, 0x0a,\n\t0x0c, 0x45, 0x6e, 0x75, 0x6d, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a,\n\t0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12,\n\t0x3c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26,\n\t0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69,\n\t0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38,\n\t0x01, 0x1a, 0x6c, 0x0a, 0x11, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x61,\n\t0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x41, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75,\n\t0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,\n\t0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56,\n\t0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a,\n\t0x64, 0x0a, 0x0d, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79,\n\t0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b,\n\t0x65, 0x79, 0x12, 0x3d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x27, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c,\n\t0x75, 0x67, 0x69, 0x6e, 0x2e, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,\n\t0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x6c, 0x0a, 0x11, 0x43, 0x65, 0x6c, 0x50, 0x6c, 0x75, 0x67,\n\t0x69, 0x6e, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65,\n\t0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x41, 0x0a, 0x05,\n\t0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43,\n\t0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a,\n\t0x02, 0x38, 0x01, 0x1a, 0x75, 0x0a, 0x0d, 0x47, 0x72, 0x61, 0x70, 0x68, 0x4d, 0x61, 0x70, 0x45,\n\t0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f,\n\t0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,\n\t0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52,\n\t0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x7e, 0x0a, 0x1a, 0x56, 0x61,\n\t0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e,\n\t0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4a, 0x0a, 0x05, 0x76, 0x61,\n\t0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65,\n\t0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x56, 0x61, 0x72,\n\t0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52,\n\t0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x88, 0x01, 0x0a, 0x1f, 0x56,\n\t0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f,\n\t0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10,\n\t0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79,\n\t0x12, 0x4f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x39, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67,\n\t0x69, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e,\n\t0x69, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,\n\t0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x7d, 0x0a, 0x11, 0x47, 0x72, 0x61, 0x70, 0x68, 0x4e, 0x6f,\n\t0x64, 0x65, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65,\n\t0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x52, 0x0a, 0x05,\n\t0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x4d,\n\t0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79,\n\t0x47, 0x72, 0x61, 0x70, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,\n\t0x3a, 0x02, 0x38, 0x01, 0x22, 0xe6, 0x02, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x0e, 0x0a,\n\t0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x43, 0x0a,\n\t0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29,\n\t0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69,\n\t0x6e, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61,\n\t0x67, 0x65, 0x12, 0x4a, 0x0a, 0x0a, 0x67, 0x6f, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,\n\t0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x47, 0x6f, 0x50, 0x61, 0x63, 0x6b,\n\t0x61, 0x67, 0x65, 0x52, 0x09, 0x67, 0x6f, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x12,\n\t0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64,\n\t0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n\t0x49, 0x64, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69,\n\t0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,\n\t0x65, 0x49, 0x64, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x69, 0x64, 0x73,\n\t0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x65, 0x6e, 0x75, 0x6d, 0x49, 0x64, 0x73, 0x12,\n\t0x24, 0x0a, 0x0e, 0x63, 0x65, 0x6c, 0x5f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x69, 0x64,\n\t0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x65, 0x6c, 0x50, 0x6c, 0x75, 0x67,\n\t0x69, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f,\n\t0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d,\n\t0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x73, 0x22, 0x38, 0x0a,\n\t0x07, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08,\n\t0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07,\n\t0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x73, 0x22, 0x5f, 0x0a, 0x09, 0x47, 0x6f, 0x50, 0x61, 0x63,\n\t0x6b, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6d, 0x70, 0x6f,\n\t0x72, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69,\n\t0x6d, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x6c, 0x69,\n\t0x61, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61,\n\t0x6c, 0x69, 0x61, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x97, 0x02, 0x0a, 0x07, 0x53, 0x65, 0x72,\n\t0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x65,\n\t0x74, 0x68, 0x6f, 0x64, 0x49, 0x64, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x5f,\n\t0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64,\n\t0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18,\n\t0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64,\n\t0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x61, 0x72, 0x67,\n\t0x5f, 0x69, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x6d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x41, 0x72, 0x67, 0x49, 0x64, 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x63, 0x65, 0x6c,\n\t0x5f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28,\n\t0x09, 0x52, 0x0c, 0x63, 0x65, 0x6c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x49, 0x64, 0x73, 0x12,\n\t0x41, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e,\n\t0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x75,\n\t0x6c, 0x65, 0x22, 0x8d, 0x01, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x75,\n\t0x6c, 0x65, 0x12, 0x37, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x25, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67,\n\t0x69, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x45, 0x0a, 0x04, 0x76,\n\t0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65,\n\t0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x53, 0x65, 0x72,\n\t0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x04, 0x76, 0x61,\n\t0x72, 0x73, 0x22, 0x43, 0x0a, 0x03, 0x45, 0x6e, 0x76, 0x12, 0x3c, 0x0a, 0x04, 0x76, 0x61, 0x72,\n\t0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,\n\t0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x56, 0x61,\n\t0x72, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x22, 0xa0, 0x01, 0x0a, 0x06, 0x45, 0x6e, 0x76, 0x56,\n\t0x61, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72,\n\t0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79,\n\t0x70, 0x65, 0x12, 0x46, 0x0a, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70,\n\t0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x52, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x7c, 0x0a, 0x0c, 0x45, 0x6e,\n\t0x76, 0x56, 0x61, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x6c,\n\t0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61,\n\t0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61,\n\t0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75,\n\t0x6c, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x03,\n\t0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x18,\n\t0x0a, 0x07, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52,\n\t0x07, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x22, 0xac, 0x01, 0x0a, 0x0f, 0x53, 0x65, 0x72,\n\t0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,\n\t0x12, 0x3a, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67,\n\t0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e,\n\t0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x02, 0x69, 0x66, 0x12, 0x49, 0x0a, 0x04,\n\t0x65, 0x78, 0x70, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x67, 0x72, 0x70,\n\t0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e,\n\t0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x53, 0x65,\n\t0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x78, 0x70,\n\t0x72, 0x52, 0x04, 0x65, 0x78, 0x70, 0x72, 0x22, 0x8e, 0x04, 0x0a, 0x13, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x78, 0x70, 0x72, 0x12,\n\t0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e,\n\t0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x3c, 0x0a, 0x02, 0x62,\n\t0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,\n\t0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61,\n\t0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x02, 0x62, 0x79, 0x12, 0x3d, 0x0a, 0x03, 0x6d, 0x61, 0x70,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,\n\t0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x4d, 0x61, 0x70, 0x45, 0x78, 0x70,\n\t0x72, 0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x70, 0x12, 0x49, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65,\n\t0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x4d, 0x65, 0x73,\n\t0x73, 0x61, 0x67, 0x65, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x12, 0x61, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,\n\t0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69,\n\t0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x69,\n\t0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x06,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72,\n\t0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x45, 0x78, 0x70, 0x72,\n\t0x48, 0x00, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x46, 0x0a, 0x06, 0x73, 0x77, 0x69, 0x74,\n\t0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x53, 0x77, 0x69, 0x74,\n\t0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x06, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68,\n\t0x42, 0x06, 0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x22, 0xa1, 0x01, 0x0a, 0x1d, 0x53, 0x65, 0x72,\n\t0x76, 0x69, 0x63, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x69,\n\t0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72, 0x12, 0x3a, 0x0a, 0x02, 0x69, 0x66,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,\n\t0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c,\n\t0x75, 0x65, 0x52, 0x02, 0x69, 0x66, 0x12, 0x44, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,\n\t0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,\n\t0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61,\n\t0x6c, 0x75, 0x65, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xcd, 0x01, 0x0a,\n\t0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x72,\n\t0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65,\n\t0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x0a, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x40, 0x0a, 0x04, 0x72, 0x75,\n\t0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x68,\n\t0x6f, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x22, 0x62, 0x0a, 0x0a,\n\t0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69,\n\t0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12,\n\t0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x49, 0x64,\n\t0x22, 0xda, 0x02, 0x0a, 0x07, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02,\n\t0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,\n\t0x12, 0x20, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x6d, 0x61, 0x70, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74,\n\t0x72, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x70,\n\t0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64,\n\t0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65,\n\t0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x12, 0x6e, 0x65, 0x73, 0x74, 0x65,\n\t0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x06, 0x20,\n\t0x03, 0x28, 0x09, 0x52, 0x10, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61,\n\t0x67, 0x65, 0x49, 0x64, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x69, 0x64,\n\t0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x65, 0x6e, 0x75, 0x6d, 0x49, 0x64, 0x73,\n\t0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x08, 0x20,\n\t0x03, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x49, 0x64, 0x73, 0x12, 0x1b, 0x0a,\n\t0x09, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09,\n\t0x52, 0x08, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x49, 0x64, 0x73, 0x12, 0x41, 0x0a, 0x04, 0x72, 0x75,\n\t0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x22, 0xd5, 0x01,\n\t0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x2e, 0x0a,\n\t0x13, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e,\n\t0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x27, 0x0a,\n\t0x0f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65,\n\t0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x5f,\n\t0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x61, 0x6c, 0x69, 0x61, 0x73,\n\t0x49, 0x64, 0x73, 0x12, 0x50, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x04,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72,\n\t0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65,\n\t0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x52, 0x06, 0x64,\n\t0x65, 0x66, 0x53, 0x65, 0x74, 0x22, 0xc2, 0x01, 0x0a, 0x15, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,\n\t0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x12,\n\t0x36, 0x0a, 0x17, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x69,\n\t0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09,\n\t0x52, 0x15, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69,\n\t0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x41, 0x0a, 0x1d, 0x76, 0x61, 0x72, 0x69, 0x61,\n\t0x62, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x67,\n\t0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x1a,\n\t0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69,\n\t0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x64, 0x65,\n\t0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x5f, 0x69,\n\t0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65,\n\t0x6e, 0x63, 0x79, 0x47, 0x72, 0x61, 0x70, 0x68, 0x49, 0x64, 0x22, 0xff, 0x01, 0x0a, 0x12, 0x56,\n\t0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f,\n\t0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,\n\t0x64, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03,\n\t0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x02, 0x69,\n\t0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,\n\t0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61,\n\t0x6c, 0x75, 0x65, 0x52, 0x02, 0x69, 0x66, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x5f,\n\t0x62, 0x69, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f,\n\t0x42, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01,\n\t0x28, 0x08, 0x52, 0x04, 0x75, 0x73, 0x65, 0x64, 0x12, 0x42, 0x0a, 0x04, 0x65, 0x78, 0x70, 0x72,\n\t0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,\n\t0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,\n\t0x6c, 0x65, 0x45, 0x78, 0x70, 0x72, 0x52, 0x04, 0x65, 0x78, 0x70, 0x72, 0x22, 0xe2, 0x01, 0x0a,\n\t0x05, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79,\n\t0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65,\n\t0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x5f,\n\t0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x49,\n\t0x64, 0x12, 0x3f, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x2b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67,\n\t0x69, 0x6e, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x75,\n\t0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64,\n\t0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49,\n\t0x64, 0x22, 0xf2, 0x02, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x12,\n\t0x3d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27,\n\t0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69,\n\t0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x27,\n\t0x0a, 0x0f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65,\n\t0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52,\n\t0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x17, 0x6d, 0x65, 0x73, 0x73, 0x61,\n\t0x67, 0x65, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76,\n\t0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,\n\t0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x12,\n\t0x1b, 0x0a, 0x09, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03,\n\t0x28, 0x09, 0x52, 0x08, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x49, 0x64, 0x73, 0x12, 0x57, 0x0a, 0x0f,\n\t0x61, 0x75, 0x74, 0x6f, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18,\n\t0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f,\n\t0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x42, 0x69, 0x6e,\n\t0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x0d, 0x61, 0x75, 0x74, 0x6f, 0x42, 0x69, 0x6e, 0x64,\n\t0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x4f, 0x0a, 0x0a, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x5f, 0x72,\n\t0x75, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65,\n\t0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x46, 0x69, 0x65,\n\t0x6c, 0x64, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x09, 0x6f, 0x6e, 0x65,\n\t0x6f, 0x66, 0x52, 0x75, 0x6c, 0x65, 0x22, 0x60, 0x0a, 0x0d, 0x41, 0x75, 0x74, 0x6f, 0x42, 0x69,\n\t0x6e, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x76, 0x61, 0x72, 0x69, 0x61,\n\t0x62, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69,\n\t0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c,\n\t0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x19, 0x0a,\n\t0x08, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x07, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x49, 0x64, 0x22, 0xf4, 0x01, 0x0a, 0x0e, 0x46, 0x69, 0x65,\n\t0x6c, 0x64, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x3a, 0x0a, 0x02, 0x69,\n\t0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,\n\t0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61,\n\t0x6c, 0x75, 0x65, 0x52, 0x02, 0x69, 0x66, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75,\n\t0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c,\n\t0x74, 0x12, 0x3a, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e,\n\t0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x02, 0x62, 0x79, 0x12, 0x50, 0x0a,\n\t0x07, 0x64, 0x65, 0x66, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37,\n\t0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69,\n\t0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69,\n\t0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x52, 0x06, 0x64, 0x65, 0x66, 0x53, 0x65, 0x74, 0x22,\n\t0x80, 0x02, 0x0a, 0x17, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69,\n\t0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69,\n\t0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x65, 0x0a, 0x0a, 0x73,\n\t0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x43, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67,\n\t0x69, 0x6e, 0x2e, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x56, 0x61, 0x72,\n\t0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x47,\n\t0x72, 0x6f, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0a, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69,\n\t0x61, 0x6c, 0x12, 0x65, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,\n\t0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72,\n\t0x72, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69,\n\t0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0a, 0x63,\n\t0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x07, 0x0a, 0x05, 0x67, 0x72, 0x6f,\n\t0x75, 0x70, 0x22, 0x4b, 0x0a, 0x21, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c,\n\t0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69,\n\t0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a,\n\t0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22,\n\t0x4d, 0x0a, 0x21, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x72,\n\t0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x47,\n\t0x72, 0x6f, 0x75, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x18, 0x01,\n\t0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x12, 0x10, 0x0a, 0x03,\n\t0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0x4c,\n\t0x0a, 0x16, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65,\n\t0x6e, 0x63, 0x79, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x72, 0x6f, 0x6f, 0x74,\n\t0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52,\n\t0x0b, 0x72, 0x6f, 0x6f, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x73, 0x22, 0xa7, 0x01, 0x0a,\n\t0x1a, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e,\n\t0x63, 0x79, 0x47, 0x72, 0x61, 0x70, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69,\n\t0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x63,\n\t0x68, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08,\n\t0x63, 0x68, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x62, 0x61, 0x73, 0x65,\n\t0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x0d, 0x62, 0x61, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64,\n\t0x12, 0x34, 0x0a, 0x16, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x66,\n\t0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x14, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69,\n\t0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xba, 0x04, 0x0a, 0x0c, 0x56, 0x61, 0x72, 0x69, 0x61,\n\t0x62, 0x6c, 0x65, 0x45, 0x78, 0x70, 0x72, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f,\n\t0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74,\n\t0x79, 0x70, 0x65, 0x12, 0x3c, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67,\n\t0x69, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x02, 0x62,\n\t0x79, 0x12, 0x3d, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29,\n\t0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69,\n\t0x6e, 0x2e, 0x4d, 0x61, 0x70, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x70,\n\t0x12, 0x40, 0x0a, 0x04, 0x63, 0x61, 0x6c, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a,\n\t0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69,\n\t0x6e, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x63, 0x61,\n\t0x6c, 0x6c, 0x12, 0x49, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e,\n\t0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78,\n\t0x70, 0x72, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x52, 0x0a,\n\t0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x30, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c,\n\t0x75, 0x67, 0x69, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45,\n\t0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x12, 0x40, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67,\n\t0x69, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x04, 0x65,\n\t0x6e, 0x75, 0x6d, 0x12, 0x46, 0x0a, 0x06, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x18, 0x08, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e,\n\t0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70,\n\t0x72, 0x48, 0x00, 0x52, 0x06, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x42, 0x06, 0x0a, 0x04, 0x65,\n\t0x78, 0x70, 0x72, 0x22, 0xe6, 0x01, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x3e, 0x0a, 0x04,\n\t0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70,\n\t0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e,\n\t0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x54, 0x79,\n\t0x70, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x1a, 0x0a, 0x08,\n\t0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08,\n\t0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x6e,\n\t0x75, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x73, 0x4e, 0x75, 0x6c,\n\t0x6c, 0x12, 0x1f, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18,\n\t0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,\n\t0x49, 0x64, 0x12, 0x19, 0x0a, 0x07, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20,\n\t0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, 0x75, 0x6d, 0x49, 0x64, 0x12, 0x26, 0x0a,\n\t0x0e, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18,\n\t0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x46, 0x69,\n\t0x65, 0x6c, 0x64, 0x49, 0x64, 0x42, 0x05, 0x0a, 0x03, 0x72, 0x65, 0x66, 0x22, 0x58, 0x0a, 0x08,\n\t0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x78, 0x70, 0x72,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x78, 0x70, 0x72, 0x12, 0x38, 0x0a, 0x03,\n\t0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65,\n\t0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x54, 0x79, 0x70,\n\t0x65, 0x52, 0x03, 0x6f, 0x75, 0x74, 0x22, 0x98, 0x01, 0x0a, 0x07, 0x4d, 0x61, 0x70, 0x45, 0x78,\n\t0x70, 0x72, 0x12, 0x46, 0x0a, 0x08, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72,\n\t0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72,\n\t0x52, 0x08, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x45, 0x0a, 0x04, 0x65, 0x78,\n\t0x70, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x4d, 0x61, 0x70, 0x49,\n\t0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x45, 0x78, 0x70, 0x72, 0x52, 0x04, 0x65, 0x78, 0x70,\n\t0x72, 0x22, 0x3b, 0x0a, 0x08, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x12, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x22, 0xa0,\n\t0x02, 0x0a, 0x0f, 0x4d, 0x61, 0x70, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x45, 0x78,\n\t0x70, 0x72, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x26, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75,\n\t0x67, 0x69, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x3c,\n\t0x0a, 0x02, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70,\n\t0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e,\n\t0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43, 0x45,\n\t0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x02, 0x62, 0x79, 0x12, 0x49, 0x0a, 0x07,\n\t0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e,\n\t0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x07,\n\t0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x40, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18,\n\t0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f,\n\t0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x45, 0x78, 0x70,\n\t0x72, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x42, 0x06, 0x0a, 0x04, 0x65, 0x78, 0x70,\n\t0x72, 0x22, 0xbd, 0x03, 0x0a, 0x08, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x70, 0x72, 0x12, 0x1b,\n\t0x0a, 0x09, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x07, 0x72,\n\t0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67,\n\t0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e,\n\t0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69,\n\t0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x43, 0x0a, 0x05, 0x72, 0x65, 0x74, 0x72, 0x79, 0x18, 0x04,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72,\n\t0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c,\n\t0x69, 0x63, 0x79, 0x52, 0x05, 0x72, 0x65, 0x74, 0x72, 0x79, 0x12, 0x43, 0x0a, 0x06, 0x65, 0x72,\n\t0x72, 0x6f, 0x72, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x72, 0x70,\n\t0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e,\n\t0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x47, 0x52,\n\t0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12,\n\t0x48, 0x0a, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x30, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67,\n\t0x69, 0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x43, 0x61, 0x6c, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x52, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x08, 0x6d, 0x65, 0x74,\n\t0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43,\n\t0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,\n\t0x61, 0x22, 0x86, 0x02, 0x0a, 0x0b, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63,\n\t0x79, 0x12, 0x53, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e,\n\t0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69,\n\t0x63, 0x79, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x08, 0x63, 0x6f,\n\t0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x12, 0x5c, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65,\n\t0x6e, 0x74, 0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x52,\n\t0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65,\n\t0x6e, 0x74, 0x69, 0x61, 0x6c, 0x48, 0x00, 0x52, 0x0b, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e,\n\t0x74, 0x69, 0x61, 0x6c, 0x12, 0x3a, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75,\n\t0x67, 0x69, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x02, 0x69, 0x66,\n\t0x42, 0x08, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x6d, 0x0a, 0x13, 0x52, 0x65,\n\t0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e,\n\t0x74, 0x12, 0x35, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08,\n\t0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f,\n\t0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x6d,\n\t0x61, 0x78, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0xd5, 0x02, 0x0a, 0x16, 0x52, 0x65,\n\t0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e,\n\t0x74, 0x69, 0x61, 0x6c, 0x12, 0x44, 0x0a, 0x10, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f,\n\t0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,\n\t0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x69, 0x6e, 0x69, 0x74, 0x69,\n\t0x61, 0x6c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x31, 0x0a, 0x14, 0x72, 0x61,\n\t0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74,\n\t0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x13, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d,\n\t0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x1e, 0x0a,\n\t0x0a, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x01, 0x52, 0x0a, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x12, 0x3c, 0x0a,\n\t0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x04, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b,\n\t0x6d, 0x61, 0x78, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x6d,\n\t0x61, 0x78, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04,\n\t0x52, 0x0a, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x43, 0x0a, 0x10,\n\t0x6d, 0x61, 0x78, 0x5f, 0x65, 0x6c, 0x61, 0x70, 0x73, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65,\n\t0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x45, 0x6c, 0x61, 0x70, 0x73, 0x65, 0x64, 0x54, 0x69, 0x6d,\n\t0x65, 0x22, 0x62, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x04,\n\t0x61, 0x72, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70,\n\t0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e,\n\t0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x41, 0x72,\n\t0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12, 0x17, 0x0a, 0x07,\n\t0x74, 0x79, 0x70, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74,\n\t0x79, 0x70, 0x65, 0x49, 0x64, 0x22, 0x6c, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,\n\t0x45, 0x78, 0x70, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f,\n\t0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,\n\t0x65, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,\n\t0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c,\n\t0x75, 0x67, 0x69, 0x6e, 0x2e, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x61,\n\t0x72, 0x67, 0x73, 0x22, 0x5f, 0x0a, 0x08, 0x45, 0x6e, 0x75, 0x6d, 0x45, 0x78, 0x70, 0x72, 0x12,\n\t0x17, 0x0a, 0x07, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x06, 0x65, 0x6e, 0x75, 0x6d, 0x49, 0x64, 0x12, 0x3a, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72,\n\t0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65,\n\t0x52, 0x02, 0x62, 0x79, 0x22, 0xd5, 0x01, 0x0a, 0x08, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e,\n\t0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e,\n\t0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70,\n\t0x65, 0x12, 0x3d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x27, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75,\n\t0x67, 0x69, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,\n\t0x12, 0x3a, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67,\n\t0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e,\n\t0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x02, 0x69, 0x66, 0x22, 0x5d, 0x0a, 0x05,\n\t0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x3c, 0x0a,\n\t0x03, 0x63, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70,\n\t0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e,\n\t0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43, 0x45,\n\t0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x03, 0x63, 0x65, 0x6c, 0x22, 0xd7, 0x01, 0x0a, 0x0a,\n\t0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79,\n\t0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,\n\t0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65,\n\t0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x42, 0x0a, 0x05, 0x63, 0x61, 0x73, 0x65, 0x73, 0x18,\n\t0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f,\n\t0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x43,\n\t0x61, 0x73, 0x65, 0x52, 0x05, 0x63, 0x61, 0x73, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x07, 0x64, 0x65,\n\t0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x53,\n\t0x77, 0x69, 0x74, 0x63, 0x68, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x64, 0x65,\n\t0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0xd6, 0x01, 0x0a, 0x0a, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68,\n\t0x43, 0x61, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75,\n\t0x67, 0x69, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x02, 0x69, 0x66,\n\t0x12, 0x3a, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67,\n\t0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e,\n\t0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x02, 0x62, 0x79, 0x12, 0x50, 0x0a, 0x07,\n\t0x64, 0x65, 0x66, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e,\n\t0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74,\n\t0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x52, 0x06, 0x64, 0x65, 0x66, 0x53, 0x65, 0x74, 0x22, 0x9d,\n\t0x01, 0x0a, 0x0d, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74,\n\t0x12, 0x3a, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67,\n\t0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67,\n\t0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e,\n\t0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x02, 0x62, 0x79, 0x12, 0x50, 0x0a, 0x07,\n\t0x64, 0x65, 0x66, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e,\n\t0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74,\n\t0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x52, 0x06, 0x64, 0x65, 0x66, 0x53, 0x65, 0x74, 0x22, 0x67,\n\t0x0a, 0x0e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72,\n\t0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x12, 0x41, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e,\n\t0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72,\n\t0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xf1, 0x03, 0x0a, 0x09, 0x47, 0x52, 0x50, 0x43,\n\t0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x50, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x5f, 0x73, 0x65, 0x74,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,\n\t0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,\n\t0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x52,\n\t0x06, 0x64, 0x65, 0x66, 0x53, 0x65, 0x74, 0x12, 0x3a, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e,\n\t0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52,\n\t0x02, 0x69, 0x66, 0x12, 0x29, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x0e, 0x32, 0x10, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x43,\n\t0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x44,\n\t0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67,\n\t0x69, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x6d, 0x65, 0x73,\n\t0x73, 0x61, 0x67, 0x65, 0x12, 0x4b, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18,\n\t0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f,\n\t0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72,\n\t0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c,\n\t0x73, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28,\n\t0x08, 0x52, 0x06, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x12, 0x5a, 0x0a, 0x13, 0x69, 0x67, 0x6e,\n\t0x6f, 0x72, 0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,\n\t0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c,\n\t0x75, 0x65, 0x52, 0x11, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x41, 0x6e, 0x64, 0x52, 0x65, 0x73,\n\t0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76,\n\t0x65, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76,\n\t0x65, 0x6c, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x22, 0xd0, 0x04, 0x0a, 0x0f,\n\t0x47, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12,\n\t0x50, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x37, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75,\n\t0x67, 0x69, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69,\n\t0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x52, 0x06, 0x64, 0x65, 0x66, 0x53, 0x65,\n\t0x74, 0x12, 0x3a, 0x0a, 0x02, 0x69, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e,\n\t0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e,\n\t0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x02, 0x69, 0x66, 0x12, 0x53, 0x0a,\n\t0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x37, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67,\n\t0x69, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e,\n\t0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x52, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,\n\t0x65, 0x73, 0x12, 0x6a, 0x0a, 0x15, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28,\n\t0x0b, 0x32, 0x35, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c,\n\t0x75, 0x67, 0x69, 0x6e, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f,\n\t0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x14, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e,\n\t0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x12, 0x4f,\n\t0x0a, 0x0c, 0x62, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x05,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72,\n\t0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x42, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65,\n\t0x73, 0x74, 0x52, 0x0b, 0x62, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12,\n\t0x61, 0x0a, 0x12, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73,\n\t0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x4c,\n\t0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52,\n\t0x11, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67,\n\t0x65, 0x73, 0x12, 0x3a, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a,\n\t0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69,\n\t0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x02, 0x62, 0x79, 0x22, 0x75,\n\t0x0a, 0x13, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x61,\n\t0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x5e, 0x0a, 0x0a, 0x76, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65,\n\t0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x50, 0x72, 0x65,\n\t0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65,\n\t0x56, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x76, 0x69, 0x6f, 0x6c, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xf2, 0x01, 0x0a, 0x1c, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e,\n\t0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x56, 0x69, 0x6f,\n\t0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72,\n\t0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65,\n\t0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x44, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63,\n\t0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66,\n\t0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,\n\t0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61,\n\t0x6c, 0x75, 0x65, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x4c, 0x0a, 0x0b,\n\t0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c,\n\t0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x64,\n\t0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x73, 0x0a, 0x0a, 0x42, 0x61,\n\t0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x65, 0x0a, 0x10, 0x66, 0x69, 0x65, 0x6c,\n\t0x64, 0x5f, 0x76, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03,\n\t0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70,\n\t0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x42, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x46, 0x69, 0x65, 0x6c, 0x64, 0x56, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f,\n\t0x66, 0x69, 0x65, 0x6c, 0x64, 0x56, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22,\n\t0xaa, 0x01, 0x0a, 0x18, 0x42, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x46, 0x69,\n\t0x65, 0x6c, 0x64, 0x56, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x05,\n\t0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43,\n\t0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x4c,\n\t0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e,\n\t0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52,\n\t0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x70, 0x0a, 0x10,\n\t0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,\n\t0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x06, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x44, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73,\n\t0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63,\n\t0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65,\n\t0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43, 0x45, 0x4c,\n\t0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xd7,\n\t0x03, 0x0a, 0x0e, 0x47, 0x52, 0x50, 0x43, 0x43, 0x61, 0x6c, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x75, 0x62,\n\t0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0e, 0x63, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x12,\n\t0x20, 0x0a, 0x09, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x09, 0x48, 0x01, 0x52, 0x08, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01,\n\t0x01, 0x12, 0x37, 0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x72, 0x65,\n\t0x63, 0x76, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x03, 0x48, 0x02, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x63, 0x76,\n\t0x4d, 0x73, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x16, 0x6d, 0x61,\n\t0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x6d, 0x73, 0x67, 0x5f,\n\t0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x12, 0x6d, 0x61,\n\t0x78, 0x43, 0x61, 0x6c, 0x6c, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53, 0x69, 0x7a, 0x65,\n\t0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x6d, 0x65,\n\t0x74, 0x68, 0x6f, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x48, 0x04, 0x52, 0x0c, 0x73, 0x74,\n\t0x61, 0x74, 0x69, 0x63, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a,\n\t0x0a, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28,\n\t0x09, 0x48, 0x05, 0x52, 0x09, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01,\n\t0x01, 0x12, 0x29, 0x0a, 0x0e, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x72, 0x65,\n\t0x61, 0x64, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x48, 0x06, 0x52, 0x0c, 0x77, 0x61, 0x69,\n\t0x74, 0x46, 0x6f, 0x72, 0x52, 0x65, 0x61, 0x64, 0x79, 0x88, 0x01, 0x01, 0x42, 0x12, 0x0a, 0x10,\n\t0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65,\n\t0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x19,\n\t0x0a, 0x17, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x72, 0x65, 0x63, 0x76,\n\t0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x6d, 0x61,\n\t0x78, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x6d, 0x73, 0x67, 0x5f,\n\t0x73, 0x69, 0x7a, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f,\n\t0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x74, 0x72, 0x61, 0x69, 0x6c,\n\t0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x66,\n\t0x6f, 0x72, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x22, 0x67, 0x0a, 0x05, 0x4f, 0x6e, 0x65, 0x6f,\n\t0x66, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,\n\t0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,\n\t0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61,\n\t0x67, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x69, 0x64,\n\t0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x49, 0x64,\n\t0x73, 0x22, 0xbf, 0x01, 0x0a, 0x04, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b,\n\t0x0a, 0x09, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28,\n\t0x09, 0x52, 0x08, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x49, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6d,\n\t0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x66, 0x69,\n\t0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c,\n\t0x65, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c,\n\t0x75, 0x67, 0x69, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x72,\n\t0x75, 0x6c, 0x65, 0x22, 0x8f, 0x01, 0x0a, 0x09, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75,\n\t0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,\n\t0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x6e, 0x75, 0x6d, 0x5f,\n\t0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x6e, 0x75, 0x6d, 0x49, 0x64,\n\t0x12, 0x43, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f,\n\t0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69,\n\t0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52,\n\t0x04, 0x72, 0x75, 0x6c, 0x65, 0x22, 0x27, 0x0a, 0x08, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x75, 0x6c,\n\t0x65, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01,\n\t0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x49, 0x64, 0x73, 0x22, 0xdb,\n\t0x01, 0x0a, 0x0d, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x75, 0x6c, 0x65,\n\t0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x4a, 0x0a, 0x07, 0x61, 0x6c,\n\t0x69, 0x61, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x67, 0x72,\n\t0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x45,\n\t0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x07, 0x61,\n\t0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x12, 0x4a, 0x0a, 0x05, 0x61, 0x74, 0x74, 0x72, 0x73, 0x18,\n\t0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f,\n\t0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c,\n\t0x75, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, 0x05, 0x61, 0x74, 0x74,\n\t0x72, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x6f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x04, 0x20,\n\t0x01, 0x28, 0x08, 0x52, 0x07, 0x6e, 0x6f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x51, 0x0a, 0x0e,\n\t0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x22,\n\t0x0a, 0x0d, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x5f, 0x69, 0x64, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x75, 0x6d, 0x41, 0x6c, 0x69, 0x61, 0x73,\n\t0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x5f, 0x69, 0x64, 0x73, 0x18,\n\t0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x49, 0x64, 0x73, 0x22,\n\t0x3e, 0x0a, 0x12, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x41, 0x74, 0x74, 0x72,\n\t0x69, 0x62, 0x75, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c,\n\t0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22,\n\t0x9e, 0x01, 0x0a, 0x09, 0x43, 0x45, 0x4c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x0e, 0x0a,\n\t0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x12, 0x4b, 0x0a, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65,\n\t0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,\n\t0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e,\n\t0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x22, 0xce, 0x01, 0x0a, 0x0b, 0x43, 0x45, 0x4c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e,\n\t0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x02, 0x69, 0x64, 0x12, 0x3a, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03,\n\t0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70,\n\t0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73,\n\t0x12, 0x3e, 0x0a, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x26, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x6c, 0x75,\n\t0x67, 0x69, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e,\n\t0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18,\n\t0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x49,\n\t0x64, 0x2a, 0x6b, 0x0a, 0x0a, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12,\n\t0x13, 0x0a, 0x0f, 0x47, 0x45, 0x4e, 0x45, 0x52, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49,\n\t0x4f, 0x4e, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4b, 0x45, 0x45, 0x50, 0x5f, 0x41, 0x43, 0x54,\n\t0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x5f,\n\t0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x44, 0x45, 0x4c, 0x45,\n\t0x54, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x12, 0x11, 0x0a, 0x0d, 0x55,\n\t0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x04, 0x2a, 0xb1,\n\t0x01, 0x0a, 0x12, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74,\n\t0x68, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x25, 0x0a, 0x21, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f,\n\t0x46, 0x49, 0x4c, 0x45, 0x5f, 0x50, 0x41, 0x54, 0x48, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55,\n\t0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x20, 0x0a, 0x1c,\n\t0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x50, 0x41, 0x54, 0x48,\n\t0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x10, 0x01, 0x12, 0x27,\n\t0x0a, 0x23, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x50, 0x41,\n\t0x54, 0x48, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x4d, 0x4f, 0x44, 0x55, 0x4c, 0x45, 0x5f, 0x50,\n\t0x52, 0x45, 0x46, 0x49, 0x58, 0x10, 0x02, 0x12, 0x29, 0x0a, 0x25, 0x4f, 0x55, 0x54, 0x50, 0x55,\n\t0x54, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x50, 0x41, 0x54, 0x48, 0x5f, 0x4d, 0x4f, 0x44, 0x45,\n\t0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x56, 0x45,\n\t0x10, 0x03, 0x2a, 0xcc, 0x02, 0x0a, 0x08, 0x54, 0x79, 0x70, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12,\n\t0x10, 0x0a, 0x0c, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10,\n\t0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45,\n\t0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45,\n\t0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x5f, 0x54, 0x59, 0x50, 0x45,\n\t0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x5f, 0x54, 0x59, 0x50,\n\t0x45, 0x10, 0x04, 0x12, 0x0e, 0x0a, 0x0a, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x5f, 0x54, 0x59, 0x50,\n\t0x45, 0x10, 0x05, 0x12, 0x10, 0x0a, 0x0c, 0x46, 0x49, 0x58, 0x45, 0x44, 0x36, 0x34, 0x5f, 0x54,\n\t0x59, 0x50, 0x45, 0x10, 0x06, 0x12, 0x10, 0x0a, 0x0c, 0x46, 0x49, 0x58, 0x45, 0x44, 0x33, 0x32,\n\t0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x42, 0x4f, 0x4f, 0x4c, 0x5f,\n\t0x54, 0x59, 0x50, 0x45, 0x10, 0x08, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47,\n\t0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x09, 0x12, 0x0e, 0x0a, 0x0a, 0x47, 0x52, 0x4f, 0x55, 0x50,\n\t0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x0a, 0x12, 0x10, 0x0a, 0x0c, 0x4d, 0x45, 0x53, 0x53, 0x41,\n\t0x47, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x0b, 0x12, 0x0e, 0x0a, 0x0a, 0x42, 0x59, 0x54,\n\t0x45, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x0c, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x49, 0x4e,\n\t0x54, 0x33, 0x32, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x0d, 0x12, 0x0d, 0x0a, 0x09, 0x45, 0x4e,\n\t0x55, 0x4d, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x0e, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x46, 0x49,\n\t0x58, 0x45, 0x44, 0x33, 0x32, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x0f, 0x12, 0x11, 0x0a, 0x0d,\n\t0x53, 0x46, 0x49, 0x58, 0x45, 0x44, 0x36, 0x34, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x10, 0x12,\n\t0x0f, 0x0a, 0x0b, 0x53, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x11,\n\t0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10,\n\t0x12, 0x42, 0x4c, 0x5a, 0x4a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x6d, 0x65, 0x72, 0x63, 0x61, 0x72, 0x69, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x66, 0x65, 0x64,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f,\n\t0x72, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x3b, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x62,\n\t0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_grpc_federation_generator_proto_rawDescOnce sync.Once\n\tfile_grpc_federation_generator_proto_rawDescData = file_grpc_federation_generator_proto_rawDesc\n)\n\nfunc file_grpc_federation_generator_proto_rawDescGZIP() []byte {\n\tfile_grpc_federation_generator_proto_rawDescOnce.Do(func() {\n\t\tfile_grpc_federation_generator_proto_rawDescData = protoimpl.X.CompressGZIP(file_grpc_federation_generator_proto_rawDescData)\n\t})\n\treturn file_grpc_federation_generator_proto_rawDescData\n}\n\nvar file_grpc_federation_generator_proto_enumTypes = make([]protoimpl.EnumInfo, 5)\nvar file_grpc_federation_generator_proto_msgTypes = make([]protoimpl.MessageInfo, 82)\nvar file_grpc_federation_generator_proto_goTypes = []interface{}{\n\t(ActionType)(0),                         // 0: grpc.federation.generator.plugin.ActionType\n\t(OutputFilePathMode)(0),                 // 1: grpc.federation.generator.plugin.OutputFilePathMode\n\t(TypeKind)(0),                           // 2: grpc.federation.generator.plugin.TypeKind\n\t(ProtoCodeGeneratorResponse_Feature)(0), // 3: grpc.federation.generator.plugin.ProtoCodeGeneratorResponse.Feature\n\t(ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation_Semantic)(0), // 4: grpc.federation.generator.plugin.ProtoCodeGeneratorResponse.GeneratedCodeInfo.Annotation.Semantic\n\t(*ProtoCodeGeneratorResponse)(nil),                                    // 5: grpc.federation.generator.plugin.ProtoCodeGeneratorResponse\n\t(*CodeGeneratorRequest)(nil),                                          // 6: grpc.federation.generator.plugin.CodeGeneratorRequest\n\t(*OutputFilePathConfig)(nil),                                          // 7: grpc.federation.generator.plugin.OutputFilePathConfig\n\t(*Reference)(nil),                                                     // 8: grpc.federation.generator.plugin.Reference\n\t(*File)(nil),                                                          // 9: grpc.federation.generator.plugin.File\n\t(*Package)(nil),                                                       // 10: grpc.federation.generator.plugin.Package\n\t(*GoPackage)(nil),                                                     // 11: grpc.federation.generator.plugin.GoPackage\n\t(*Service)(nil),                                                       // 12: grpc.federation.generator.plugin.Service\n\t(*ServiceRule)(nil),                                                   // 13: grpc.federation.generator.plugin.ServiceRule\n\t(*Env)(nil),                                                           // 14: grpc.federation.generator.plugin.Env\n\t(*EnvVar)(nil),                                                        // 15: grpc.federation.generator.plugin.EnvVar\n\t(*EnvVarOption)(nil),                                                  // 16: grpc.federation.generator.plugin.EnvVarOption\n\t(*ServiceVariable)(nil),                                               // 17: grpc.federation.generator.plugin.ServiceVariable\n\t(*ServiceVariableExpr)(nil),                                           // 18: grpc.federation.generator.plugin.ServiceVariableExpr\n\t(*ServiceVariableValidationExpr)(nil),                                 // 19: grpc.federation.generator.plugin.ServiceVariableValidationExpr\n\t(*Method)(nil),                                                        // 20: grpc.federation.generator.plugin.Method\n\t(*MethodRule)(nil),                                                    // 21: grpc.federation.generator.plugin.MethodRule\n\t(*Message)(nil),                                                       // 22: grpc.federation.generator.plugin.Message\n\t(*MessageRule)(nil),                                                   // 23: grpc.federation.generator.plugin.MessageRule\n\t(*VariableDefinitionSet)(nil),                                         // 24: grpc.federation.generator.plugin.VariableDefinitionSet\n\t(*VariableDefinition)(nil),                                            // 25: grpc.federation.generator.plugin.VariableDefinition\n\t(*Field)(nil),                                                         // 26: grpc.federation.generator.plugin.Field\n\t(*FieldRule)(nil),                                                     // 27: grpc.federation.generator.plugin.FieldRule\n\t(*AutoBindField)(nil),                                                 // 28: grpc.federation.generator.plugin.AutoBindField\n\t(*FieldOneofRule)(nil),                                                // 29: grpc.federation.generator.plugin.FieldOneofRule\n\t(*VariableDefinitionGroup)(nil),                                       // 30: grpc.federation.generator.plugin.VariableDefinitionGroup\n\t(*SequentialVariableDefinitionGroup)(nil),                             // 31: grpc.federation.generator.plugin.SequentialVariableDefinitionGroup\n\t(*ConcurrentVariableDefinitionGroup)(nil),                             // 32: grpc.federation.generator.plugin.ConcurrentVariableDefinitionGroup\n\t(*MessageDependencyGraph)(nil),                                        // 33: grpc.federation.generator.plugin.MessageDependencyGraph\n\t(*MessageDependencyGraphNode)(nil),                                    // 34: grpc.federation.generator.plugin.MessageDependencyGraphNode\n\t(*VariableExpr)(nil),                                                  // 35: grpc.federation.generator.plugin.VariableExpr\n\t(*Type)(nil),                                                          // 36: grpc.federation.generator.plugin.Type\n\t(*CELValue)(nil),                                                      // 37: grpc.federation.generator.plugin.CELValue\n\t(*MapExpr)(nil),                                                       // 38: grpc.federation.generator.plugin.MapExpr\n\t(*Iterator)(nil),                                                      // 39: grpc.federation.generator.plugin.Iterator\n\t(*MapIteratorExpr)(nil),                                               // 40: grpc.federation.generator.plugin.MapIteratorExpr\n\t(*CallExpr)(nil),                                                      // 41: grpc.federation.generator.plugin.CallExpr\n\t(*RetryPolicy)(nil),                                                   // 42: grpc.federation.generator.plugin.RetryPolicy\n\t(*RetryPolicyConstant)(nil),                                           // 43: grpc.federation.generator.plugin.RetryPolicyConstant\n\t(*RetryPolicyExponential)(nil),                                        // 44: grpc.federation.generator.plugin.RetryPolicyExponential\n\t(*Request)(nil),                                                       // 45: grpc.federation.generator.plugin.Request\n\t(*MessageExpr)(nil),                                                   // 46: grpc.federation.generator.plugin.MessageExpr\n\t(*EnumExpr)(nil),                                                      // 47: grpc.federation.generator.plugin.EnumExpr\n\t(*Argument)(nil),                                                      // 48: grpc.federation.generator.plugin.Argument\n\t(*Value)(nil),                                                         // 49: grpc.federation.generator.plugin.Value\n\t(*SwitchExpr)(nil),                                                    // 50: grpc.federation.generator.plugin.SwitchExpr\n\t(*SwitchCase)(nil),                                                    // 51: grpc.federation.generator.plugin.SwitchCase\n\t(*SwitchDefault)(nil),                                                 // 52: grpc.federation.generator.plugin.SwitchDefault\n\t(*ValidationExpr)(nil),                                                // 53: grpc.federation.generator.plugin.ValidationExpr\n\t(*GRPCError)(nil),                                                     // 54: grpc.federation.generator.plugin.GRPCError\n\t(*GRPCErrorDetail)(nil),                                               // 55: grpc.federation.generator.plugin.GRPCErrorDetail\n\t(*PreconditionFailure)(nil),                                           // 56: grpc.federation.generator.plugin.PreconditionFailure\n\t(*PreconditionFailureViolation)(nil),                                  // 57: grpc.federation.generator.plugin.PreconditionFailureViolation\n\t(*BadRequest)(nil),                                                    // 58: grpc.federation.generator.plugin.BadRequest\n\t(*BadRequestFieldViolation)(nil),                                      // 59: grpc.federation.generator.plugin.BadRequestFieldViolation\n\t(*LocalizedMessage)(nil),                                              // 60: grpc.federation.generator.plugin.LocalizedMessage\n\t(*GRPCCallOption)(nil),                                                // 61: grpc.federation.generator.plugin.GRPCCallOption\n\t(*Oneof)(nil),                                                         // 62: grpc.federation.generator.plugin.Oneof\n\t(*Enum)(nil),                                                          // 63: grpc.federation.generator.plugin.Enum\n\t(*EnumValue)(nil),                                                     // 64: grpc.federation.generator.plugin.EnumValue\n\t(*EnumRule)(nil),                                                      // 65: grpc.federation.generator.plugin.EnumRule\n\t(*EnumValueRule)(nil),                                                 // 66: grpc.federation.generator.plugin.EnumValueRule\n\t(*EnumValueAlias)(nil),                                                // 67: grpc.federation.generator.plugin.EnumValueAlias\n\t(*EnumValueAttribute)(nil),                                            // 68: grpc.federation.generator.plugin.EnumValueAttribute\n\t(*CELPlugin)(nil),                                                     // 69: grpc.federation.generator.plugin.CELPlugin\n\t(*CELFunction)(nil),                                                   // 70: grpc.federation.generator.plugin.CELFunction\n\t(*ProtoCodeGeneratorResponse_GeneratedCodeInfo)(nil),            // 71: grpc.federation.generator.plugin.ProtoCodeGeneratorResponse.GeneratedCodeInfo\n\t(*ProtoCodeGeneratorResponse_File)(nil),                         // 72: grpc.federation.generator.plugin.ProtoCodeGeneratorResponse.File\n\t(*ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation)(nil), // 73: grpc.federation.generator.plugin.ProtoCodeGeneratorResponse.GeneratedCodeInfo.Annotation\n\tnil,                         // 74: grpc.federation.generator.plugin.Reference.FileMapEntry\n\tnil,                         // 75: grpc.federation.generator.plugin.Reference.ServiceMapEntry\n\tnil,                         // 76: grpc.federation.generator.plugin.Reference.MethodMapEntry\n\tnil,                         // 77: grpc.federation.generator.plugin.Reference.MessageMapEntry\n\tnil,                         // 78: grpc.federation.generator.plugin.Reference.FieldMapEntry\n\tnil,                         // 79: grpc.federation.generator.plugin.Reference.EnumMapEntry\n\tnil,                         // 80: grpc.federation.generator.plugin.Reference.EnumValueMapEntry\n\tnil,                         // 81: grpc.federation.generator.plugin.Reference.OneofMapEntry\n\tnil,                         // 82: grpc.federation.generator.plugin.Reference.CelPluginMapEntry\n\tnil,                         // 83: grpc.federation.generator.plugin.Reference.GraphMapEntry\n\tnil,                         // 84: grpc.federation.generator.plugin.Reference.VariableDefinitionMapEntry\n\tnil,                         // 85: grpc.federation.generator.plugin.Reference.VariableDefinitionGroupMapEntry\n\tnil,                         // 86: grpc.federation.generator.plugin.Reference.GraphNodeMapEntry\n\t(*durationpb.Duration)(nil), // 87: google.protobuf.Duration\n\t(code.Code)(0),              // 88: google.rpc.Code\n}\nvar file_grpc_federation_generator_proto_depIdxs = []int32{\n\t72,  // 0: grpc.federation.generator.plugin.ProtoCodeGeneratorResponse.file:type_name -> grpc.federation.generator.plugin.ProtoCodeGeneratorResponse.File\n\t0,   // 1: grpc.federation.generator.plugin.CodeGeneratorRequest.type:type_name -> grpc.federation.generator.plugin.ActionType\n\t72,  // 2: grpc.federation.generator.plugin.CodeGeneratorRequest.files:type_name -> grpc.federation.generator.plugin.ProtoCodeGeneratorResponse.File\n\t8,   // 3: grpc.federation.generator.plugin.CodeGeneratorRequest.reference:type_name -> grpc.federation.generator.plugin.Reference\n\t7,   // 4: grpc.federation.generator.plugin.CodeGeneratorRequest.output_file_path_config:type_name -> grpc.federation.generator.plugin.OutputFilePathConfig\n\t1,   // 5: grpc.federation.generator.plugin.OutputFilePathConfig.mode:type_name -> grpc.federation.generator.plugin.OutputFilePathMode\n\t74,  // 6: grpc.federation.generator.plugin.Reference.file_map:type_name -> grpc.federation.generator.plugin.Reference.FileMapEntry\n\t75,  // 7: grpc.federation.generator.plugin.Reference.service_map:type_name -> grpc.federation.generator.plugin.Reference.ServiceMapEntry\n\t76,  // 8: grpc.federation.generator.plugin.Reference.method_map:type_name -> grpc.federation.generator.plugin.Reference.MethodMapEntry\n\t77,  // 9: grpc.federation.generator.plugin.Reference.message_map:type_name -> grpc.federation.generator.plugin.Reference.MessageMapEntry\n\t78,  // 10: grpc.federation.generator.plugin.Reference.field_map:type_name -> grpc.federation.generator.plugin.Reference.FieldMapEntry\n\t79,  // 11: grpc.federation.generator.plugin.Reference.enum_map:type_name -> grpc.federation.generator.plugin.Reference.EnumMapEntry\n\t80,  // 12: grpc.federation.generator.plugin.Reference.enum_value_map:type_name -> grpc.federation.generator.plugin.Reference.EnumValueMapEntry\n\t81,  // 13: grpc.federation.generator.plugin.Reference.oneof_map:type_name -> grpc.federation.generator.plugin.Reference.OneofMapEntry\n\t82,  // 14: grpc.federation.generator.plugin.Reference.cel_plugin_map:type_name -> grpc.federation.generator.plugin.Reference.CelPluginMapEntry\n\t83,  // 15: grpc.federation.generator.plugin.Reference.graph_map:type_name -> grpc.federation.generator.plugin.Reference.GraphMapEntry\n\t84,  // 16: grpc.federation.generator.plugin.Reference.variable_definition_map:type_name -> grpc.federation.generator.plugin.Reference.VariableDefinitionMapEntry\n\t85,  // 17: grpc.federation.generator.plugin.Reference.variable_definition_group_map:type_name -> grpc.federation.generator.plugin.Reference.VariableDefinitionGroupMapEntry\n\t86,  // 18: grpc.federation.generator.plugin.Reference.graph_node_map:type_name -> grpc.federation.generator.plugin.Reference.GraphNodeMapEntry\n\t10,  // 19: grpc.federation.generator.plugin.File.package:type_name -> grpc.federation.generator.plugin.Package\n\t11,  // 20: grpc.federation.generator.plugin.File.go_package:type_name -> grpc.federation.generator.plugin.GoPackage\n\t13,  // 21: grpc.federation.generator.plugin.Service.rule:type_name -> grpc.federation.generator.plugin.ServiceRule\n\t14,  // 22: grpc.federation.generator.plugin.ServiceRule.env:type_name -> grpc.federation.generator.plugin.Env\n\t17,  // 23: grpc.federation.generator.plugin.ServiceRule.vars:type_name -> grpc.federation.generator.plugin.ServiceVariable\n\t15,  // 24: grpc.federation.generator.plugin.Env.vars:type_name -> grpc.federation.generator.plugin.EnvVar\n\t36,  // 25: grpc.federation.generator.plugin.EnvVar.type:type_name -> grpc.federation.generator.plugin.Type\n\t16,  // 26: grpc.federation.generator.plugin.EnvVar.option:type_name -> grpc.federation.generator.plugin.EnvVarOption\n\t37,  // 27: grpc.federation.generator.plugin.ServiceVariable.if:type_name -> grpc.federation.generator.plugin.CELValue\n\t18,  // 28: grpc.federation.generator.plugin.ServiceVariable.expr:type_name -> grpc.federation.generator.plugin.ServiceVariableExpr\n\t36,  // 29: grpc.federation.generator.plugin.ServiceVariableExpr.type:type_name -> grpc.federation.generator.plugin.Type\n\t37,  // 30: grpc.federation.generator.plugin.ServiceVariableExpr.by:type_name -> grpc.federation.generator.plugin.CELValue\n\t38,  // 31: grpc.federation.generator.plugin.ServiceVariableExpr.map:type_name -> grpc.federation.generator.plugin.MapExpr\n\t46,  // 32: grpc.federation.generator.plugin.ServiceVariableExpr.message:type_name -> grpc.federation.generator.plugin.MessageExpr\n\t19,  // 33: grpc.federation.generator.plugin.ServiceVariableExpr.validation:type_name -> grpc.federation.generator.plugin.ServiceVariableValidationExpr\n\t47,  // 34: grpc.federation.generator.plugin.ServiceVariableExpr.enum:type_name -> grpc.federation.generator.plugin.EnumExpr\n\t50,  // 35: grpc.federation.generator.plugin.ServiceVariableExpr.switch:type_name -> grpc.federation.generator.plugin.SwitchExpr\n\t37,  // 36: grpc.federation.generator.plugin.ServiceVariableValidationExpr.if:type_name -> grpc.federation.generator.plugin.CELValue\n\t37,  // 37: grpc.federation.generator.plugin.ServiceVariableValidationExpr.message:type_name -> grpc.federation.generator.plugin.CELValue\n\t21,  // 38: grpc.federation.generator.plugin.Method.rule:type_name -> grpc.federation.generator.plugin.MethodRule\n\t87,  // 39: grpc.federation.generator.plugin.MethodRule.timeout:type_name -> google.protobuf.Duration\n\t23,  // 40: grpc.federation.generator.plugin.Message.rule:type_name -> grpc.federation.generator.plugin.MessageRule\n\t24,  // 41: grpc.federation.generator.plugin.MessageRule.def_set:type_name -> grpc.federation.generator.plugin.VariableDefinitionSet\n\t37,  // 42: grpc.federation.generator.plugin.VariableDefinition.if:type_name -> grpc.federation.generator.plugin.CELValue\n\t35,  // 43: grpc.federation.generator.plugin.VariableDefinition.expr:type_name -> grpc.federation.generator.plugin.VariableExpr\n\t36,  // 44: grpc.federation.generator.plugin.Field.type:type_name -> grpc.federation.generator.plugin.Type\n\t27,  // 45: grpc.federation.generator.plugin.Field.rule:type_name -> grpc.federation.generator.plugin.FieldRule\n\t49,  // 46: grpc.federation.generator.plugin.FieldRule.value:type_name -> grpc.federation.generator.plugin.Value\n\t28,  // 47: grpc.federation.generator.plugin.FieldRule.auto_bind_field:type_name -> grpc.federation.generator.plugin.AutoBindField\n\t29,  // 48: grpc.federation.generator.plugin.FieldRule.oneof_rule:type_name -> grpc.federation.generator.plugin.FieldOneofRule\n\t37,  // 49: grpc.federation.generator.plugin.FieldOneofRule.if:type_name -> grpc.federation.generator.plugin.CELValue\n\t37,  // 50: grpc.federation.generator.plugin.FieldOneofRule.by:type_name -> grpc.federation.generator.plugin.CELValue\n\t24,  // 51: grpc.federation.generator.plugin.FieldOneofRule.def_set:type_name -> grpc.federation.generator.plugin.VariableDefinitionSet\n\t31,  // 52: grpc.federation.generator.plugin.VariableDefinitionGroup.sequential:type_name -> grpc.federation.generator.plugin.SequentialVariableDefinitionGroup\n\t32,  // 53: grpc.federation.generator.plugin.VariableDefinitionGroup.concurrent:type_name -> grpc.federation.generator.plugin.ConcurrentVariableDefinitionGroup\n\t36,  // 54: grpc.federation.generator.plugin.VariableExpr.type:type_name -> grpc.federation.generator.plugin.Type\n\t37,  // 55: grpc.federation.generator.plugin.VariableExpr.by:type_name -> grpc.federation.generator.plugin.CELValue\n\t38,  // 56: grpc.federation.generator.plugin.VariableExpr.map:type_name -> grpc.federation.generator.plugin.MapExpr\n\t41,  // 57: grpc.federation.generator.plugin.VariableExpr.call:type_name -> grpc.federation.generator.plugin.CallExpr\n\t46,  // 58: grpc.federation.generator.plugin.VariableExpr.message:type_name -> grpc.federation.generator.plugin.MessageExpr\n\t53,  // 59: grpc.federation.generator.plugin.VariableExpr.validation:type_name -> grpc.federation.generator.plugin.ValidationExpr\n\t47,  // 60: grpc.federation.generator.plugin.VariableExpr.enum:type_name -> grpc.federation.generator.plugin.EnumExpr\n\t50,  // 61: grpc.federation.generator.plugin.VariableExpr.switch:type_name -> grpc.federation.generator.plugin.SwitchExpr\n\t2,   // 62: grpc.federation.generator.plugin.Type.kind:type_name -> grpc.federation.generator.plugin.TypeKind\n\t36,  // 63: grpc.federation.generator.plugin.CELValue.out:type_name -> grpc.federation.generator.plugin.Type\n\t39,  // 64: grpc.federation.generator.plugin.MapExpr.iterator:type_name -> grpc.federation.generator.plugin.Iterator\n\t40,  // 65: grpc.federation.generator.plugin.MapExpr.expr:type_name -> grpc.federation.generator.plugin.MapIteratorExpr\n\t36,  // 66: grpc.federation.generator.plugin.MapIteratorExpr.type:type_name -> grpc.federation.generator.plugin.Type\n\t37,  // 67: grpc.federation.generator.plugin.MapIteratorExpr.by:type_name -> grpc.federation.generator.plugin.CELValue\n\t46,  // 68: grpc.federation.generator.plugin.MapIteratorExpr.message:type_name -> grpc.federation.generator.plugin.MessageExpr\n\t47,  // 69: grpc.federation.generator.plugin.MapIteratorExpr.enum:type_name -> grpc.federation.generator.plugin.EnumExpr\n\t45,  // 70: grpc.federation.generator.plugin.CallExpr.request:type_name -> grpc.federation.generator.plugin.Request\n\t87,  // 71: grpc.federation.generator.plugin.CallExpr.timeout:type_name -> google.protobuf.Duration\n\t42,  // 72: grpc.federation.generator.plugin.CallExpr.retry:type_name -> grpc.federation.generator.plugin.RetryPolicy\n\t54,  // 73: grpc.federation.generator.plugin.CallExpr.errors:type_name -> grpc.federation.generator.plugin.GRPCError\n\t61,  // 74: grpc.federation.generator.plugin.CallExpr.option:type_name -> grpc.federation.generator.plugin.GRPCCallOption\n\t37,  // 75: grpc.federation.generator.plugin.CallExpr.metadata:type_name -> grpc.federation.generator.plugin.CELValue\n\t43,  // 76: grpc.federation.generator.plugin.RetryPolicy.constant:type_name -> grpc.federation.generator.plugin.RetryPolicyConstant\n\t44,  // 77: grpc.federation.generator.plugin.RetryPolicy.exponential:type_name -> grpc.federation.generator.plugin.RetryPolicyExponential\n\t37,  // 78: grpc.federation.generator.plugin.RetryPolicy.if:type_name -> grpc.federation.generator.plugin.CELValue\n\t87,  // 79: grpc.federation.generator.plugin.RetryPolicyConstant.interval:type_name -> google.protobuf.Duration\n\t87,  // 80: grpc.federation.generator.plugin.RetryPolicyExponential.initial_interval:type_name -> google.protobuf.Duration\n\t87,  // 81: grpc.federation.generator.plugin.RetryPolicyExponential.max_interval:type_name -> google.protobuf.Duration\n\t87,  // 82: grpc.federation.generator.plugin.RetryPolicyExponential.max_elapsed_time:type_name -> google.protobuf.Duration\n\t48,  // 83: grpc.federation.generator.plugin.Request.args:type_name -> grpc.federation.generator.plugin.Argument\n\t48,  // 84: grpc.federation.generator.plugin.MessageExpr.args:type_name -> grpc.federation.generator.plugin.Argument\n\t37,  // 85: grpc.federation.generator.plugin.EnumExpr.by:type_name -> grpc.federation.generator.plugin.CELValue\n\t36,  // 86: grpc.federation.generator.plugin.Argument.type:type_name -> grpc.federation.generator.plugin.Type\n\t49,  // 87: grpc.federation.generator.plugin.Argument.value:type_name -> grpc.federation.generator.plugin.Value\n\t37,  // 88: grpc.federation.generator.plugin.Argument.if:type_name -> grpc.federation.generator.plugin.CELValue\n\t37,  // 89: grpc.federation.generator.plugin.Value.cel:type_name -> grpc.federation.generator.plugin.CELValue\n\t36,  // 90: grpc.federation.generator.plugin.SwitchExpr.type:type_name -> grpc.federation.generator.plugin.Type\n\t51,  // 91: grpc.federation.generator.plugin.SwitchExpr.cases:type_name -> grpc.federation.generator.plugin.SwitchCase\n\t52,  // 92: grpc.federation.generator.plugin.SwitchExpr.default:type_name -> grpc.federation.generator.plugin.SwitchDefault\n\t37,  // 93: grpc.federation.generator.plugin.SwitchCase.if:type_name -> grpc.federation.generator.plugin.CELValue\n\t37,  // 94: grpc.federation.generator.plugin.SwitchCase.by:type_name -> grpc.federation.generator.plugin.CELValue\n\t24,  // 95: grpc.federation.generator.plugin.SwitchCase.def_set:type_name -> grpc.federation.generator.plugin.VariableDefinitionSet\n\t37,  // 96: grpc.federation.generator.plugin.SwitchDefault.by:type_name -> grpc.federation.generator.plugin.CELValue\n\t24,  // 97: grpc.federation.generator.plugin.SwitchDefault.def_set:type_name -> grpc.federation.generator.plugin.VariableDefinitionSet\n\t54,  // 98: grpc.federation.generator.plugin.ValidationExpr.error:type_name -> grpc.federation.generator.plugin.GRPCError\n\t24,  // 99: grpc.federation.generator.plugin.GRPCError.def_set:type_name -> grpc.federation.generator.plugin.VariableDefinitionSet\n\t37,  // 100: grpc.federation.generator.plugin.GRPCError.if:type_name -> grpc.federation.generator.plugin.CELValue\n\t88,  // 101: grpc.federation.generator.plugin.GRPCError.code:type_name -> google.rpc.Code\n\t37,  // 102: grpc.federation.generator.plugin.GRPCError.message:type_name -> grpc.federation.generator.plugin.CELValue\n\t55,  // 103: grpc.federation.generator.plugin.GRPCError.details:type_name -> grpc.federation.generator.plugin.GRPCErrorDetail\n\t37,  // 104: grpc.federation.generator.plugin.GRPCError.ignore_and_response:type_name -> grpc.federation.generator.plugin.CELValue\n\t24,  // 105: grpc.federation.generator.plugin.GRPCErrorDetail.def_set:type_name -> grpc.federation.generator.plugin.VariableDefinitionSet\n\t37,  // 106: grpc.federation.generator.plugin.GRPCErrorDetail.if:type_name -> grpc.federation.generator.plugin.CELValue\n\t24,  // 107: grpc.federation.generator.plugin.GRPCErrorDetail.messages:type_name -> grpc.federation.generator.plugin.VariableDefinitionSet\n\t56,  // 108: grpc.federation.generator.plugin.GRPCErrorDetail.precondition_failures:type_name -> grpc.federation.generator.plugin.PreconditionFailure\n\t58,  // 109: grpc.federation.generator.plugin.GRPCErrorDetail.bad_requests:type_name -> grpc.federation.generator.plugin.BadRequest\n\t60,  // 110: grpc.federation.generator.plugin.GRPCErrorDetail.localized_messages:type_name -> grpc.federation.generator.plugin.LocalizedMessage\n\t37,  // 111: grpc.federation.generator.plugin.GRPCErrorDetail.by:type_name -> grpc.federation.generator.plugin.CELValue\n\t57,  // 112: grpc.federation.generator.plugin.PreconditionFailure.violations:type_name -> grpc.federation.generator.plugin.PreconditionFailureViolation\n\t37,  // 113: grpc.federation.generator.plugin.PreconditionFailureViolation.type:type_name -> grpc.federation.generator.plugin.CELValue\n\t37,  // 114: grpc.federation.generator.plugin.PreconditionFailureViolation.subject:type_name -> grpc.federation.generator.plugin.CELValue\n\t37,  // 115: grpc.federation.generator.plugin.PreconditionFailureViolation.description:type_name -> grpc.federation.generator.plugin.CELValue\n\t59,  // 116: grpc.federation.generator.plugin.BadRequest.field_violations:type_name -> grpc.federation.generator.plugin.BadRequestFieldViolation\n\t37,  // 117: grpc.federation.generator.plugin.BadRequestFieldViolation.field:type_name -> grpc.federation.generator.plugin.CELValue\n\t37,  // 118: grpc.federation.generator.plugin.BadRequestFieldViolation.description:type_name -> grpc.federation.generator.plugin.CELValue\n\t37,  // 119: grpc.federation.generator.plugin.LocalizedMessage.message:type_name -> grpc.federation.generator.plugin.CELValue\n\t65,  // 120: grpc.federation.generator.plugin.Enum.rule:type_name -> grpc.federation.generator.plugin.EnumRule\n\t66,  // 121: grpc.federation.generator.plugin.EnumValue.rule:type_name -> grpc.federation.generator.plugin.EnumValueRule\n\t67,  // 122: grpc.federation.generator.plugin.EnumValueRule.aliases:type_name -> grpc.federation.generator.plugin.EnumValueAlias\n\t68,  // 123: grpc.federation.generator.plugin.EnumValueRule.attrs:type_name -> grpc.federation.generator.plugin.EnumValueAttribute\n\t70,  // 124: grpc.federation.generator.plugin.CELPlugin.functions:type_name -> grpc.federation.generator.plugin.CELFunction\n\t36,  // 125: grpc.federation.generator.plugin.CELFunction.args:type_name -> grpc.federation.generator.plugin.Type\n\t36,  // 126: grpc.federation.generator.plugin.CELFunction.return:type_name -> grpc.federation.generator.plugin.Type\n\t73,  // 127: grpc.federation.generator.plugin.ProtoCodeGeneratorResponse.GeneratedCodeInfo.annotation:type_name -> grpc.federation.generator.plugin.ProtoCodeGeneratorResponse.GeneratedCodeInfo.Annotation\n\t71,  // 128: grpc.federation.generator.plugin.ProtoCodeGeneratorResponse.File.generated_code_info:type_name -> grpc.federation.generator.plugin.ProtoCodeGeneratorResponse.GeneratedCodeInfo\n\t4,   // 129: grpc.federation.generator.plugin.ProtoCodeGeneratorResponse.GeneratedCodeInfo.Annotation.semantic:type_name -> grpc.federation.generator.plugin.ProtoCodeGeneratorResponse.GeneratedCodeInfo.Annotation.Semantic\n\t9,   // 130: grpc.federation.generator.plugin.Reference.FileMapEntry.value:type_name -> grpc.federation.generator.plugin.File\n\t12,  // 131: grpc.federation.generator.plugin.Reference.ServiceMapEntry.value:type_name -> grpc.federation.generator.plugin.Service\n\t20,  // 132: grpc.federation.generator.plugin.Reference.MethodMapEntry.value:type_name -> grpc.federation.generator.plugin.Method\n\t22,  // 133: grpc.federation.generator.plugin.Reference.MessageMapEntry.value:type_name -> grpc.federation.generator.plugin.Message\n\t26,  // 134: grpc.federation.generator.plugin.Reference.FieldMapEntry.value:type_name -> grpc.federation.generator.plugin.Field\n\t63,  // 135: grpc.federation.generator.plugin.Reference.EnumMapEntry.value:type_name -> grpc.federation.generator.plugin.Enum\n\t64,  // 136: grpc.federation.generator.plugin.Reference.EnumValueMapEntry.value:type_name -> grpc.federation.generator.plugin.EnumValue\n\t62,  // 137: grpc.federation.generator.plugin.Reference.OneofMapEntry.value:type_name -> grpc.federation.generator.plugin.Oneof\n\t69,  // 138: grpc.federation.generator.plugin.Reference.CelPluginMapEntry.value:type_name -> grpc.federation.generator.plugin.CELPlugin\n\t33,  // 139: grpc.federation.generator.plugin.Reference.GraphMapEntry.value:type_name -> grpc.federation.generator.plugin.MessageDependencyGraph\n\t25,  // 140: grpc.federation.generator.plugin.Reference.VariableDefinitionMapEntry.value:type_name -> grpc.federation.generator.plugin.VariableDefinition\n\t30,  // 141: grpc.federation.generator.plugin.Reference.VariableDefinitionGroupMapEntry.value:type_name -> grpc.federation.generator.plugin.VariableDefinitionGroup\n\t34,  // 142: grpc.federation.generator.plugin.Reference.GraphNodeMapEntry.value:type_name -> grpc.federation.generator.plugin.MessageDependencyGraphNode\n\t143, // [143:143] is the sub-list for method output_type\n\t143, // [143:143] is the sub-list for method input_type\n\t143, // [143:143] is the sub-list for extension type_name\n\t143, // [143:143] is the sub-list for extension extendee\n\t0,   // [0:143] is the sub-list for field type_name\n}\n\nfunc init() { file_grpc_federation_generator_proto_init() }\nfunc file_grpc_federation_generator_proto_init() {\n\tif File_grpc_federation_generator_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_grpc_federation_generator_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ProtoCodeGeneratorResponse); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CodeGeneratorRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*OutputFilePathConfig); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Reference); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*File); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Package); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GoPackage); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Service); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Env); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvVar); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnvVarOption); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceVariable); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceVariableExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ServiceVariableValidationExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Method); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MethodRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Message); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MessageRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*VariableDefinitionSet); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*VariableDefinition); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Field); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*FieldRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*AutoBindField); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*FieldOneofRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*VariableDefinitionGroup); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SequentialVariableDefinitionGroup); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ConcurrentVariableDefinitionGroup); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MessageDependencyGraph); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MessageDependencyGraphNode); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*VariableExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Type); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELValue); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MapExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Iterator); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MapIteratorExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CallExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RetryPolicy); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RetryPolicyConstant); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*RetryPolicyExponential); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Request); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MessageExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Argument); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Value); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SwitchExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SwitchCase); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SwitchDefault); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ValidationExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GRPCError); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GRPCErrorDetail); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*PreconditionFailure); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*PreconditionFailureViolation); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*BadRequest); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*BadRequestFieldViolation); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*LocalizedMessage); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*GRPCCallOption); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Oneof); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Enum); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumValue); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumValueRule); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumValueAlias); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumValueAttribute); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELPlugin); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CELFunction); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ProtoCodeGeneratorResponse_GeneratedCodeInfo); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ProtoCodeGeneratorResponse_File); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_grpc_federation_generator_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ProtoCodeGeneratorResponse_GeneratedCodeInfo_Annotation); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\tfile_grpc_federation_generator_proto_msgTypes[0].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_generator_proto_msgTypes[13].OneofWrappers = []interface{}{\n\t\t(*ServiceVariableExpr_By)(nil),\n\t\t(*ServiceVariableExpr_Map)(nil),\n\t\t(*ServiceVariableExpr_Message)(nil),\n\t\t(*ServiceVariableExpr_Validation)(nil),\n\t\t(*ServiceVariableExpr_Enum)(nil),\n\t\t(*ServiceVariableExpr_Switch)(nil),\n\t}\n\tfile_grpc_federation_generator_proto_msgTypes[25].OneofWrappers = []interface{}{\n\t\t(*VariableDefinitionGroup_Sequential)(nil),\n\t\t(*VariableDefinitionGroup_Concurrent)(nil),\n\t}\n\tfile_grpc_federation_generator_proto_msgTypes[30].OneofWrappers = []interface{}{\n\t\t(*VariableExpr_By)(nil),\n\t\t(*VariableExpr_Map)(nil),\n\t\t(*VariableExpr_Call)(nil),\n\t\t(*VariableExpr_Message)(nil),\n\t\t(*VariableExpr_Validation)(nil),\n\t\t(*VariableExpr_Enum)(nil),\n\t\t(*VariableExpr_Switch)(nil),\n\t}\n\tfile_grpc_federation_generator_proto_msgTypes[31].OneofWrappers = []interface{}{\n\t\t(*Type_MessageId)(nil),\n\t\t(*Type_EnumId)(nil),\n\t\t(*Type_OneofFieldId)(nil),\n\t}\n\tfile_grpc_federation_generator_proto_msgTypes[35].OneofWrappers = []interface{}{\n\t\t(*MapIteratorExpr_By)(nil),\n\t\t(*MapIteratorExpr_Message)(nil),\n\t\t(*MapIteratorExpr_Enum)(nil),\n\t}\n\tfile_grpc_federation_generator_proto_msgTypes[37].OneofWrappers = []interface{}{\n\t\t(*RetryPolicy_Constant)(nil),\n\t\t(*RetryPolicy_Exponential)(nil),\n\t}\n\tfile_grpc_federation_generator_proto_msgTypes[49].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_generator_proto_msgTypes[56].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_generator_proto_msgTypes[67].OneofWrappers = []interface{}{}\n\tfile_grpc_federation_generator_proto_msgTypes[68].OneofWrappers = []interface{}{}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_grpc_federation_generator_proto_rawDesc,\n\t\t\tNumEnums:      5,\n\t\t\tNumMessages:   82,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_grpc_federation_generator_proto_goTypes,\n\t\tDependencyIndexes: file_grpc_federation_generator_proto_depIdxs,\n\t\tEnumInfos:         file_grpc_federation_generator_proto_enumTypes,\n\t\tMessageInfos:      file_grpc_federation_generator_proto_msgTypes,\n\t}.Build()\n\tFile_grpc_federation_generator_proto = out.File\n\tfile_grpc_federation_generator_proto_rawDesc = nil\n\tfile_grpc_federation_generator_proto_goTypes = nil\n\tfile_grpc_federation_generator_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "grpc/federation/generator/types.go",
    "content": "package generator\n\nimport (\n\t\"google.golang.org/protobuf/types/pluginpb\"\n\n\t\"github.com/mercari/grpc-federation/grpc/federation/generator/plugin\"\n\t\"github.com/mercari/grpc-federation/resolver\"\n)\n\ntype ActionType string\n\nconst (\n\tKeepAction   ActionType = \"keep\"\n\tCreateAction ActionType = \"create\"\n\tDeleteAction ActionType = \"delete\"\n\tUpdateAction ActionType = \"update\"\n\tProtocAction ActionType = \"protoc\"\n)\n\ntype CodeGeneratorRequestConfig struct {\n\tType                 ActionType\n\tProtoPath            string\n\tFiles                []*plugin.ProtoCodeGeneratorResponse_File\n\tGRPCFederationFiles  []*resolver.File\n\tOutputFilePathConfig resolver.OutputFilePathConfig\n}\n\ntype CodeGeneratorRequest struct {\n\tProtoPath            string\n\tOutDir               string\n\tFiles                []*plugin.ProtoCodeGeneratorResponse_File\n\tGRPCFederationFiles  []*resolver.File\n\tOutputFilePathConfig resolver.OutputFilePathConfig\n}\n\ntype (\n\tCodeGeneratorResponse = pluginpb.CodeGeneratorResponse\n\t//nolint:stylecheck\n\tCodeGeneratorResponse_File = pluginpb.CodeGeneratorResponse_File\n)\n"
  },
  {
    "path": "grpc/federation/lib.go",
    "content": "package federation\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"runtime/debug\"\n\t\"time\"\n\n\t\"github.com/cenkalti/backoff/v4\"\n\t\"google.golang.org/genproto/googleapis/rpc/errdetails\"\n\tgrpccodes \"google.golang.org/grpc/codes\"\n\tgrpcstatus \"google.golang.org/grpc/status\"\n)\n\nfunc WithTimeout[T any](ctx context.Context, method string, timeout time.Duration, fn func(context.Context) (*T, error)) (*T, error) {\n\tctx, cancel := context.WithTimeout(ctx, timeout)\n\tdefer cancel()\n\n\tvar (\n\t\tret *T\n\n\t\t// If the channel buffer is empty and a timeout occurs first,\n\t\t// the select statement will complete without receiving from `errch`,\n\t\t// causing the goroutine to wait indefinitely for a receiver at the end and preventing it from terminating.\n\t\t// Therefore, setting the buffer size to 1 ensures that the function can exit even if there is no receiver.\n\t\terrch = make(chan error, 1)\n\t)\n\tgo func() {\n\t\tdefer func() {\n\t\t\tif r := recover(); r != nil {\n\t\t\t\terrch <- RecoverError(r, debug.Stack())\n\t\t\t}\n\t\t}()\n\n\t\tres, err := fn(ctx)\n\t\tret = res\n\t\terrch <- err\n\t}()\n\tselect {\n\tcase <-ctx.Done():\n\t\tctxErr := ctx.Err()\n\n\t\t// If the parent context is canceled,\n\t\t// `ctxErr` will reach this condition in the state of context.Canceled.\n\t\t// In that case, return an error with the Cancel status.\n\t\tif ctxErr == context.Canceled {\n\t\t\treturn nil, grpcstatus.New(grpccodes.Canceled, ctxErr.Error()).Err()\n\t\t}\n\n\t\tstatus := grpcstatus.New(grpccodes.DeadlineExceeded, ctxErr.Error())\n\t\twithDetails, err := status.WithDetails(&errdetails.ErrorInfo{\n\t\t\tMetadata: map[string]string{\n\t\t\t\t\"method\":  method,\n\t\t\t\t\"timeout\": timeout.String(),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn nil, status.Err()\n\t\t}\n\t\treturn nil, withDetails.Err()\n\tcase err := <-errch:\n\t\treturn ret, err\n\t}\n}\n\ntype BackOff struct {\n\tbackoff.BackOff\n}\n\nfunc NewConstantBackOff(d time.Duration) *BackOff {\n\treturn &BackOff{\n\t\tBackOff: backoff.NewConstantBackOff(d),\n\t}\n}\n\ntype ExponentialBackOffConfig struct {\n\tInitialInterval     time.Duration\n\tRandomizationFactor float64\n\tMultiplier          float64\n\tMaxInterval         time.Duration\n\tMaxElapsedTime      time.Duration\n}\n\nfunc NewExponentialBackOff(cfg *ExponentialBackOffConfig) *BackOff {\n\teb := backoff.NewExponentialBackOff()\n\teb.InitialInterval = cfg.InitialInterval\n\teb.RandomizationFactor = cfg.RandomizationFactor\n\teb.Multiplier = cfg.Multiplier\n\teb.MaxInterval = cfg.MaxInterval\n\teb.MaxElapsedTime = cfg.MaxElapsedTime\n\treturn &BackOff{\n\t\tBackOff: eb,\n\t}\n}\n\ntype RetryParam[T any] struct {\n\tValue      localValue\n\tIf         string\n\tCacheIndex int\n\tBackOff    *BackOff\n\tBody       func() (*T, error)\n}\n\nfunc WithRetry[T any](ctx context.Context, param *RetryParam[T]) (*T, error) {\n\tvar res *T\n\tif err := backoff.Retry(func() (err error) {\n\t\tresult, err := param.Body()\n\t\tif err != nil {\n\t\t\tctx = WithGRPCError(ctx, ToGRPCError(ctx, err))\n\t\t\tcond, evalErr := EvalCEL(ctx, &EvalCELRequest{\n\t\t\t\tValue:      param.Value,\n\t\t\t\tExpr:       param.If,\n\t\t\t\tOutType:    reflect.TypeOf(false),\n\t\t\t\tCacheIndex: param.CacheIndex,\n\t\t\t})\n\t\t\tif evalErr != nil {\n\t\t\t\treturn backoff.Permanent(evalErr)\n\t\t\t}\n\t\t\tif !cond.(bool) {\n\t\t\t\treturn backoff.Permanent(err)\n\t\t\t}\n\t\t\treturn err\n\t\t}\n\t\tres = result\n\t\treturn nil\n\t}, param.BackOff); err != nil {\n\t\treturn nil, err\n\t}\n\treturn res, nil\n}\n\nfunc ToLogAttrKey(v any) string {\n\treturn fmt.Sprint(v)\n}\n"
  },
  {
    "path": "grpc/federation/log/context.go",
    "content": "package log\n\nimport (\n\t\"context\"\n\t\"log/slog\"\n\t\"sync\"\n)\n\ntype (\n\tloggerKey struct{}\n)\n\ntype loggerRef struct {\n\tmu     sync.RWMutex\n\tlogger *slog.Logger\n\tattrs  []slog.Attr\n}\n\nfunc WithLogger(ctx context.Context, logger *slog.Logger, attrs ...slog.Attr) context.Context {\n\treturn context.WithValue(ctx, loggerKey{}, &loggerRef{logger: logger, attrs: attrs})\n}\n\nfunc Logger(ctx context.Context) *slog.Logger {\n\tvalue := ctx.Value(loggerKey{})\n\tif value == nil {\n\t\treturn slog.Default()\n\t}\n\tref := value.(*loggerRef)\n\n\tref.mu.RLock()\n\tdefer ref.mu.RUnlock()\n\treturn ref.logger.With(AttrsToArgs(ref.attrs)...)\n}\n\nfunc Attrs(ctx context.Context) []slog.Attr {\n\tvalue := ctx.Value(loggerKey{})\n\tif value == nil {\n\t\treturn nil\n\t}\n\tref := value.(*loggerRef)\n\n\tref.mu.RLock()\n\tdefer ref.mu.RUnlock()\n\treturn ref.attrs\n}\n\n// SetLogger set logger instance for current context.\n// This is intended to be called from a custom resolver and is currently propagated to the current context and its children.\nfunc SetLogger(ctx context.Context, logger *slog.Logger) {\n\tvalue := ctx.Value(loggerKey{})\n\tif value == nil {\n\t\treturn\n\t}\n\tref := value.(*loggerRef)\n\n\tref.mu.Lock()\n\tdefer ref.mu.Unlock()\n\tref.logger = logger\n}\n\nfunc AddAttrs(ctx context.Context, attrs []slog.Attr) {\n\tvalue := ctx.Value(loggerKey{})\n\tif value == nil {\n\t\treturn\n\t}\n\tref := value.(*loggerRef)\n\n\tref.mu.Lock()\n\tdefer ref.mu.Unlock()\n\tref.attrs = append(ref.attrs, attrs...)\n}\n\nfunc AttrsToArgs(attrs []slog.Attr) []any {\n\targs := make([]any, len(attrs))\n\tfor i, attr := range attrs {\n\t\targs[i] = attr\n\t}\n\treturn args\n}\n"
  },
  {
    "path": "grpc/federation/net/net.go",
    "content": "//go:build wasip1\n\npackage net\n\nimport (\n\t\"crypto/tls\"\n\t\"net/http\"\n\n\t\"github.com/goccy/wasi-go-net/wasip1\"\n)\n\nvar (\n\tListen = wasip1.Listen\n)\n\nfunc DefaultTransport() http.RoundTripper {\n\treturn &http.Transport{\n\t\tDialContext: wasip1.DialContext,\n\t\tTLSClientConfig: &tls.Config{\n\t\t\tInsecureSkipVerify: true,\n\t\t},\n\t}\n}\n"
  },
  {
    "path": "grpc/federation/net/other.go",
    "content": "//go:build !wasip1\n\npackage net\n\nimport (\n\t\"net\"\n\t\"net/http\"\n)\n\nvar (\n\tListen = net.Listen\n)\n\nfunc DefaultTransport() http.RoundTripper {\n\treturn http.DefaultTransport\n}\n"
  },
  {
    "path": "grpc/federation/otel.go",
    "content": "package federation\n\nimport (\n\t\"context\"\n\n\t\"go.opentelemetry.io/otel/codes\"\n\t\"go.opentelemetry.io/otel/trace\"\n)\n\nfunc RecordErrorToSpan(ctx context.Context, err error) {\n\tif err == nil {\n\t\treturn\n\t}\n\tspan := trace.SpanFromContext(ctx)\n\tspan.SetStatus(codes.Error, err.Error())\n\tspan.RecordError(err, trace.WithStackTrace(true))\n}\n"
  },
  {
    "path": "grpc/federation/plugin.go",
    "content": "//go:build !wasip1\n\npackage federation\n\nimport \"context\"\n\ntype PluginHandler func(ctx context.Context, req *CELPluginRequest) (*CELPluginResponse, error)\n\nfunc PluginMainLoop(verSchema CELPluginVersionSchema, handler PluginHandler) {}\n\nfunc WritePluginContent(content []byte) {}\n\nfunc ReadPluginContent() string {\n\treturn \"\"\n}\n"
  },
  {
    "path": "grpc/federation/plugin_wasip1.go",
    "content": "//go:build wasip1\n\npackage federation\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"runtime\"\n\t\"unsafe\"\n\n\t\"google.golang.org/grpc/metadata\"\n\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n)\n\n//go:wasmimport grpcfederation write\nfunc grpc_federation_write(ptr, size uint32)\n\n//go:wasmimport grpcfederation read_length\nfunc grpc_federation_read_length() uint32\n\n//go:wasmimport grpcfederation read\nfunc grpc_federation_read(uint32)\n\nfunc writePluginContent(content []byte) {\n\tif content == nil {\n\t\tgrpc_federation_write(0, 0)\n\t\treturn\n\t}\n\tgrpc_federation_write(\n\t\tuint32(uintptr(unsafe.Pointer(&content[0]))),\n\t\tuint32(len(content)),\n\t)\n}\n\nfunc readPluginContent() string {\n\tlength := grpc_federation_read_length()\n\tif length == 0 {\n\t\treturn \"\"\n\t}\n\tbuf := make([]byte, length)\n\tgrpc_federation_read(\n\t\tuint32(uintptr(unsafe.Pointer(&buf[0]))),\n\t)\n\treturn string(buf)\n}\n\ntype PluginHandler func(ctx context.Context, req *CELPluginRequest) (*CELPluginResponse, error)\n\nfunc PluginMainLoop(verSchema CELPluginVersionSchema, handler PluginHandler) {\n\tfor {\n\t\tcontent := readPluginContent()\n\t\tif content == grpcfedcel.ExitCommand {\n\t\t\treturn\n\t\t}\n\t\tif content == grpcfedcel.GCCommand {\n\t\t\truntime.GC()\n\t\t\twritePluginContent(nil)\n\t\t\tcontinue\n\t\t}\n\t\tif content == grpcfedcel.VersionCommand {\n\t\t\tb, _ := EncodeCELPluginVersion(verSchema)\n\t\t\twritePluginContent(b)\n\t\t\tcontinue\n\t\t}\n\t\tres, err := handlePluginFunc(content, handler)\n\t\tif err != nil {\n\t\t\tres = ToErrorCELPluginResponse(err)\n\t\t}\n\t\tencoded, err := EncodeCELPluginResponse(res)\n\t\tif err != nil {\n\t\t\tpanic(fmt.Sprintf(\"failed to encode cel plugin response: %s\", err.Error()))\n\t\t}\n\t\twritePluginContent(encoded)\n\t}\n}\n\nfunc handlePluginFunc(content string, handler PluginHandler) (res *CELPluginResponse, e error) {\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\tres = ToErrorCELPluginResponse(fmt.Errorf(\"%v\", r))\n\t\t}\n\t}()\n\n\treq, err := DecodeCELPluginRequest([]byte(content))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tmd := make(metadata.MD)\n\tfor _, m := range req.GetMetadata() {\n\t\tmd[m.GetKey()] = m.GetValues()\n\t}\n\tctx := metadata.NewIncomingContext(context.Background(), md)\n\treturn handler(ctx, req)\n}\n"
  },
  {
    "path": "grpc/federation/trace/alias.go",
    "content": "package trace\n\nimport (\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/trace\"\n)\n\ntype (\n\tKeyValue = attribute.KeyValue\n)\n\nvar (\n\tWithAttributes = trace.WithAttributes\n\tStringAttr     = attribute.String\n)\n"
  },
  {
    "path": "grpc/federation/trace/context.go",
    "content": "package trace\n\nimport (\n\t\"context\"\n\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/trace\"\n)\n\ntype (\n\ttracerKey struct{}\n)\n\nfunc WithTracer(ctx context.Context, tracer trace.Tracer) context.Context {\n\treturn context.WithValue(ctx, tracerKey{}, tracer)\n}\n\nfunc Tracer(ctx context.Context) trace.Tracer {\n\tvalue := ctx.Value(tracerKey{})\n\tif value == nil {\n\t\treturn otel.Tracer(\"default\")\n\t}\n\treturn value.(trace.Tracer)\n}\n\nfunc Trace(ctx context.Context, name string, opts ...trace.SpanStartOption) (context.Context, trace.Span) {\n\treturn Tracer(ctx).Start(ctx, name)\n}\n"
  },
  {
    "path": "grpc/federation/validation.go",
    "content": "package federation\n\nimport (\n\t\"context\"\n\t\"log/slog\"\n\t\"reflect\"\n\n\t\"google.golang.org/genproto/googleapis/rpc/errdetails\"\n\t\"google.golang.org/protobuf/protoadapt\"\n)\n\ntype PreconditionFailureViolation struct {\n\tType           string\n\tTypeCacheIndex int\n\n\tSubject           string\n\tSubjectCacheIndex int\n\n\tDesc           string\n\tDescCacheIndex int\n}\n\nfunc PreconditionFailure(ctx context.Context, value localValue, violations []*PreconditionFailureViolation) *errdetails.PreconditionFailure {\n\tlogger := Logger(ctx)\n\n\tret := &errdetails.PreconditionFailure{}\n\tfor idx, violation := range violations {\n\t\ttyp, err := EvalCEL(ctx, &EvalCELRequest{\n\t\t\tValue:      value,\n\t\t\tExpr:       violation.Type,\n\t\t\tOutType:    reflect.TypeOf(\"\"),\n\t\t\tCacheIndex: violation.TypeCacheIndex,\n\t\t})\n\t\tif err != nil {\n\t\t\tlogger.ErrorContext(\n\t\t\t\tctx,\n\t\t\t\t\"failed evaluating PreconditionFailure violation type\",\n\t\t\t\tslog.Int(\"index\", idx),\n\t\t\t\tslog.String(\"error\", err.Error()),\n\t\t\t)\n\t\t\tcontinue\n\t\t}\n\t\tsubject, err := EvalCEL(ctx, &EvalCELRequest{\n\t\t\tValue:      value,\n\t\t\tExpr:       violation.Subject,\n\t\t\tOutType:    reflect.TypeOf(\"\"),\n\t\t\tCacheIndex: violation.SubjectCacheIndex,\n\t\t})\n\t\tif err != nil {\n\t\t\tlogger.ErrorContext(\n\t\t\t\tctx,\n\t\t\t\t\"failed evaluating PreconditionFailure violation subject\",\n\t\t\t\tslog.Int(\"index\", idx),\n\t\t\t\tslog.String(\"error\", err.Error()),\n\t\t\t)\n\t\t\tcontinue\n\t\t}\n\t\tdesc, err := EvalCEL(ctx, &EvalCELRequest{\n\t\t\tValue:      value,\n\t\t\tExpr:       violation.Desc,\n\t\t\tOutType:    reflect.TypeOf(\"\"),\n\t\t\tCacheIndex: violation.DescCacheIndex,\n\t\t})\n\t\tif err != nil {\n\t\t\tlogger.ErrorContext(\n\t\t\t\tctx,\n\t\t\t\t\"failed evaluating PreconditionFailure violation description\",\n\t\t\t\tslog.Int(\"index\", idx),\n\t\t\t\tslog.String(\"error\", err.Error()),\n\t\t\t)\n\t\t\tcontinue\n\t\t}\n\t\tret.Violations = append(ret.Violations, &errdetails.PreconditionFailure_Violation{\n\t\t\tType:        typ.(string),\n\t\t\tSubject:     subject.(string),\n\t\t\tDescription: desc.(string),\n\t\t})\n\t}\n\tif len(ret.Violations) == 0 {\n\t\treturn nil\n\t}\n\treturn ret\n}\n\ntype BadRequestFieldViolation struct {\n\tField           string\n\tFieldCacheIndex int\n\n\tDesc           string\n\tDescCacheIndex int\n}\n\nfunc BadRequest(ctx context.Context, value localValue, violations []*BadRequestFieldViolation) *errdetails.BadRequest {\n\tlogger := Logger(ctx)\n\n\tret := &errdetails.BadRequest{}\n\n\tfor idx, violation := range violations {\n\t\tfield, err := EvalCEL(ctx, &EvalCELRequest{\n\t\t\tValue:      value,\n\t\t\tExpr:       violation.Field,\n\t\t\tOutType:    reflect.TypeOf(\"\"),\n\t\t\tCacheIndex: violation.FieldCacheIndex,\n\t\t})\n\t\tif err != nil {\n\t\t\tlogger.ErrorContext(\n\t\t\t\tctx,\n\t\t\t\t\"failed evaluating BadRequest field violation field\",\n\t\t\t\tslog.Int(\"index\", idx),\n\t\t\t\tslog.String(\"error\", err.Error()),\n\t\t\t)\n\t\t\tcontinue\n\t\t}\n\t\tdesc, err := EvalCEL(ctx, &EvalCELRequest{\n\t\t\tValue:      value,\n\t\t\tExpr:       violation.Desc,\n\t\t\tOutType:    reflect.TypeOf(\"\"),\n\t\t\tCacheIndex: violation.DescCacheIndex,\n\t\t})\n\t\tif err != nil {\n\t\t\tlogger.ErrorContext(\n\t\t\t\tctx,\n\t\t\t\t\"failed evaluating BadRequest field violation description\",\n\t\t\t\tslog.Int(\"index\", idx),\n\t\t\t\tslog.String(\"error\", err.Error()),\n\t\t\t)\n\t\t\tcontinue\n\t\t}\n\t\tret.FieldViolations = append(ret.FieldViolations, &errdetails.BadRequest_FieldViolation{\n\t\t\tField:       field.(string),\n\t\t\tDescription: desc.(string),\n\t\t})\n\t}\n\tif len(ret.FieldViolations) == 0 {\n\t\treturn nil\n\t}\n\treturn ret\n}\n\ntype LocalizedMessageParam struct {\n\tValue      localValue\n\tLocale     string\n\tMessage    string\n\tCacheIndex int\n}\n\nfunc LocalizedMessage(ctx context.Context, param *LocalizedMessageParam) *errdetails.LocalizedMessage {\n\tlogger := Logger(ctx)\n\n\tmessage, err := EvalCEL(ctx, &EvalCELRequest{\n\t\tValue:      param.Value,\n\t\tExpr:       param.Message,\n\t\tOutType:    reflect.TypeOf(\"\"),\n\t\tCacheIndex: param.CacheIndex,\n\t})\n\tif err != nil {\n\t\tlogger.ErrorContext(ctx, \"failed evaluating LocalizedMessage message\", slog.String(\"error\", err.Error()))\n\t\treturn nil\n\t}\n\treturn &errdetails.LocalizedMessage{\n\t\tLocale:  param.Locale,\n\t\tMessage: message.(string),\n\t}\n}\n\ntype CustomMessageParam struct {\n\tValue            localValue\n\tMessageValueName string\n\tCacheIndex       int\n\tMessageIndex     int\n}\n\nfunc CustomMessage(ctx context.Context, param *CustomMessageParam) protoadapt.MessageV1 {\n\tlogger := Logger(ctx)\n\n\tmsg, err := EvalCEL(ctx, &EvalCELRequest{\n\t\tValue:      param.Value,\n\t\tExpr:       param.MessageValueName,\n\t\tOutType:    reflect.TypeOf(protoadapt.MessageV1(nil)),\n\t\tCacheIndex: param.CacheIndex,\n\t})\n\tif err != nil {\n\t\tlogger.ErrorContext(\n\t\t\tctx,\n\t\t\t\"failed evaluating validation error detail message\",\n\t\t\tslog.Int(\"index\", param.MessageIndex),\n\t\t\tslog.String(\"error\", err.Error()),\n\t\t)\n\t\treturn nil\n\t}\n\treturn msg.(protoadapt.MessageV1)\n}\n"
  },
  {
    "path": "grpc/federation/version.go",
    "content": "package federation\n\nimport (\n\t\"runtime/debug\"\n\n\t\"github.com/mercari/grpc-federation/grpc/federation/cel\"\n)\n\nconst CELPluginProtocolVersion = cel.PluginProtocolVersion\n\ntype CELPluginVersionSchema = cel.PluginVersionSchema\n\nconst devVersion = \"(devel)\"\n\nvar Version string\n\nfunc init() {\n\tif Version != \"\" {\n\t\t// set by go build with ldflags.\n\t\treturn\n\t}\n\n\tif buildInfo, ok := debug.ReadBuildInfo(); ok {\n\t\t// set by go install.\n\t\tVersion = buildInfo.Main.Version\n\t}\n\tif Version == \"\" {\n\t\tVersion = devVersion\n\t}\n}\n"
  },
  {
    "path": "grpc/federation/version_test.go",
    "content": "package federation_test\n\nimport (\n\t\"runtime/debug\"\n\t\"testing\"\n\n\tgrpcfed \"github.com/mercari/grpc-federation/grpc/federation\"\n)\n\nfunc TestVersion(t *testing.T) {\n\tif buildInfo, ok := debug.ReadBuildInfo(); ok {\n\t\tif buildInfo.Main.Version != \"\" {\n\t\t\tif grpcfed.Version != buildInfo.Main.Version {\n\t\t\t\tt.Fatalf(\"expected version is %s but got %s\", buildInfo.Main.Version, grpcfed.Version)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t\tif grpcfed.Version != \"(devel)\" {\n\t\t\tt.Fatalf(\"failed to get default version information: %s\", grpcfed.Version)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "internal/testutil/builder.go",
    "content": "package testutil\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"strings\"\n\t\"sync\"\n\t\"testing\"\n\t\"time\"\n\n\t\"google.golang.org/genproto/googleapis/rpc/code\"\n\n\t\"github.com/mercari/grpc-federation/resolver\"\n\t\"github.com/mercari/grpc-federation/types\"\n)\n\ntype BuilderReferenceManager struct {\n\tbuilders []*FileBuilder\n}\n\nfunc NewBuilderReferenceManager(builders ...*FileBuilder) *BuilderReferenceManager {\n\treturn &BuilderReferenceManager{\n\t\tbuilders: builders,\n\t}\n}\n\nfunc (m *BuilderReferenceManager) Type(t *testing.T, pkg, typ string) *resolver.Type {\n\tt.Helper()\n\tfor _, builder := range m.builders {\n\t\tif builder.file.Package.Name != pkg {\n\t\t\tcontinue\n\t\t}\n\t\treturn builder.Type(t, typ)\n\t}\n\tt.Fatalf(\"failed to find %s.%s type\", pkg, typ)\n\treturn nil\n}\n\nfunc (m *BuilderReferenceManager) RepeatedType(t *testing.T, pkgName, typeName string) *resolver.Type {\n\tt.Helper()\n\tfor _, builder := range m.builders {\n\t\tif builder.file.Package.Name != pkgName {\n\t\t\tcontinue\n\t\t}\n\t\treturn builder.RepeatedType(t, typeName)\n\t}\n\tt.Fatalf(\"failed to find %s.%s type\", pkgName, typeName)\n\treturn nil\n}\n\nfunc (m *BuilderReferenceManager) Service(t *testing.T, pkgName, svcName string) *resolver.Service {\n\tt.Helper()\n\tfor _, builder := range m.builders {\n\t\tif builder.file.Package.Name != pkgName {\n\t\t\tcontinue\n\t\t}\n\t\tfor _, svc := range builder.file.Services {\n\t\t\tif svc.Name != svcName {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\treturn svc\n\t\t}\n\t}\n\tt.Fatalf(\"failed to find %s.%s service\", pkgName, svcName)\n\treturn nil\n}\n\nfunc (m *BuilderReferenceManager) Method(t *testing.T, pkgName, svcName, mtdName string) *resolver.Method {\n\tt.Helper()\n\tfor _, builder := range m.builders {\n\t\tif builder.file.Package.Name != pkgName {\n\t\t\tcontinue\n\t\t}\n\t\tfor _, svc := range builder.file.Services {\n\t\t\tif svc.Name != svcName {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tfor _, mtd := range svc.Methods {\n\t\t\t\tif mtd.Name != mtdName {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\treturn mtd\n\t\t\t}\n\t\t}\n\t}\n\tt.Fatalf(\"failed to find %s.%s.%s method\", pkgName, svcName, mtdName)\n\treturn nil\n}\n\nfunc (m *BuilderReferenceManager) Message(t *testing.T, pkgName, msgName string) *resolver.Message {\n\tt.Helper()\n\tfor _, builder := range m.builders {\n\t\tif builder.file.Package.Name != pkgName {\n\t\t\tcontinue\n\t\t}\n\t\tfor _, msg := range builder.file.Messages {\n\t\t\tfoundMessage := m.message(msg, pkgName, msgName)\n\t\t\tif foundMessage != nil {\n\t\t\t\treturn foundMessage\n\t\t\t}\n\t\t}\n\t}\n\tt.Fatalf(\"failed to find %s.%s message\", pkgName, msgName)\n\treturn nil\n}\n\nfunc (m *BuilderReferenceManager) message(msg *resolver.Message, pkgName, msgName string) *resolver.Message {\n\tif msg.FQDN() == fmt.Sprintf(\"%s.%s\", pkgName, msgName) {\n\t\treturn msg\n\t}\n\tfor _, nested := range msg.NestedMessages {\n\t\tif msg := m.message(nested, pkgName, msgName); msg != nil {\n\t\t\treturn msg\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (m *BuilderReferenceManager) Field(t *testing.T, pkgName, msgName, fieldName string) *resolver.Field {\n\tt.Helper()\n\tfield := m.Message(t, pkgName, msgName).Field(fieldName)\n\tif field == nil {\n\t\tt.Fatalf(\"failed to find %s field from %s.%s message\", fieldName, pkgName, msgName)\n\t}\n\treturn field\n}\n\nfunc (m *BuilderReferenceManager) Enum(t *testing.T, pkgName, enumName string) *resolver.Enum {\n\tt.Helper()\n\tenumFQDN := fmt.Sprintf(\"%s.%s\", pkgName, enumName)\n\tfor _, builder := range m.builders {\n\t\tif builder.file.Package.Name != pkgName {\n\t\t\tcontinue\n\t\t}\n\t\tfor _, enum := range builder.file.Enums {\n\t\t\tif enum.FQDN() == enumFQDN {\n\t\t\t\treturn enum\n\t\t\t}\n\t\t}\n\t\tfor _, msg := range builder.file.Messages {\n\t\t\tfor _, enum := range msg.Enums {\n\t\t\t\tif enum.FQDN() == enumFQDN {\n\t\t\t\t\treturn enum\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tt.Fatalf(\"failed to find %s enum\", enumFQDN)\n\treturn nil\n}\n\nfunc (m *BuilderReferenceManager) EnumValue(t *testing.T, pkgName, enumName, valueName string) *resolver.EnumValue {\n\tt.Helper()\n\tvalue := m.Enum(t, pkgName, enumName).Value(valueName)\n\tif value == nil {\n\t\tt.Fatalf(\"failed to find %s value from %s.%s\", valueName, pkgName, enumName)\n\t}\n\treturn value\n}\n\ntype FileBuilder struct {\n\tfile            *resolver.File\n\ttypeMap         map[string]*resolver.Type\n\trepeatedTypeMap map[string]*resolver.Type\n}\n\nfunc NewFileBuilder(fileName string) *FileBuilder {\n\treturn &FileBuilder{\n\t\tfile:            &resolver.File{Name: fileName},\n\t\ttypeMap:         make(map[string]*resolver.Type),\n\t\trepeatedTypeMap: make(map[string]*resolver.Type),\n\t}\n}\n\nfunc (b *FileBuilder) SetPackage(name string) *FileBuilder {\n\tb.file.Package = &resolver.Package{Name: name, Files: []*resolver.File{b.file}}\n\treturn b\n}\n\nfunc (b *FileBuilder) SetGoPackage(importPath, name string) *FileBuilder {\n\tb.file.GoPackage = &resolver.GoPackage{Name: name, ImportPath: importPath}\n\treturn b\n}\n\nfunc (b *FileBuilder) Type(t *testing.T, name string) *resolver.Type {\n\tt.Helper()\n\ttyp, exists := b.typeMap[name]\n\tif !exists {\n\t\tt.Fatalf(\"failed to find %s type\", name)\n\t}\n\treturn typ\n}\n\nfunc (b *FileBuilder) RepeatedType(t *testing.T, name string) *resolver.Type {\n\tt.Helper()\n\ttyp, exists := b.repeatedTypeMap[name]\n\tif !exists {\n\t\tt.Fatalf(\"failed to find %s repeated type\", name)\n\t}\n\treturn typ\n}\n\nfunc (b *FileBuilder) addType(name string, typ *resolver.Type) {\n\tb.typeMap[name] = typ\n\tb.repeatedTypeMap[name] = &resolver.Type{\n\t\tKind:       typ.Kind,\n\t\tMessage:    typ.Message,\n\t\tEnum:       typ.Enum,\n\t\tOneofField: typ.OneofField,\n\t\tRepeated:   true,\n\t}\n}\n\nfunc (b *FileBuilder) AddService(svc *resolver.Service) *FileBuilder {\n\tsvc.File = b.file\n\tb.file.Services = append(b.file.Services, svc)\n\treturn b\n}\n\nfunc (b *FileBuilder) AddEnum(enum *resolver.Enum) *FileBuilder {\n\tenum.File = b.file\n\ttyp := &resolver.Type{Kind: types.Enum, Enum: enum}\n\tvar enumName string\n\tif enum.Message != nil {\n\t\tenumName = strings.Join(\n\t\t\tappend(enum.Message.ParentMessageNames(), enum.Message.Name, enum.Name),\n\t\t\t\".\",\n\t\t)\n\t} else {\n\t\tenumName = enum.Name\n\t}\n\tb.addType(enumName, typ)\n\tb.file.Enums = append(b.file.Enums, enum)\n\treturn b\n}\n\nfunc (b *FileBuilder) AddMessage(msg *resolver.Message) *FileBuilder {\n\ttyp := resolver.NewMessageType(msg, false)\n\tmsgName := strings.Join(append(msg.ParentMessageNames(), msg.Name), \".\")\n\tb.addType(msgName, typ)\n\tmsg.File = b.file\n\tfor _, enum := range msg.Enums {\n\t\tenum.File = b.file\n\t\tb.AddEnum(enum)\n\t}\n\tfor _, m := range msg.NestedMessages {\n\t\tm.File = b.file\n\t\tb.AddMessage(m)\n\t}\n\tb.file.Messages = append(b.file.Messages, msg)\n\treturn b\n}\n\nfunc (b *FileBuilder) Build(t *testing.T) *resolver.File {\n\tt.Helper()\n\treturn b.file\n}\n\ntype MessageBuilder struct {\n\tmsg *resolver.Message\n}\n\nfunc NewMessageBuilder(name string) *MessageBuilder {\n\treturn &MessageBuilder{\n\t\tmsg: &resolver.Message{\n\t\t\tName: name,\n\t\t},\n\t}\n}\n\nfunc (b *MessageBuilder) SetIsMapEntry(v bool) *MessageBuilder {\n\tb.msg.IsMapEntry = v\n\treturn b\n}\n\nfunc (b *MessageBuilder) AddMessage(msg *resolver.Message) *MessageBuilder {\n\tmsg.ParentMessage = b.msg\n\tb.msg.NestedMessages = append(b.msg.NestedMessages, msg)\n\treturn b\n}\n\nvar addOneofMu sync.Mutex\n\nfunc (b *MessageBuilder) AddOneof(oneof *resolver.Oneof) *MessageBuilder {\n\tfor idx, oneofField := range oneof.Fields {\n\t\tfield := b.msg.Field(oneofField.Name)\n\t\toneof.Fields[idx] = field\n\t\tfield.Oneof = oneof\n\t\taddOneofMu.Lock()\n\t\tfield.Type.OneofField = &resolver.OneofField{Field: field}\n\t\taddOneofMu.Unlock()\n\t}\n\tb.msg.Oneofs = append(b.msg.Oneofs, oneof)\n\toneof.Message = b.msg\n\treturn b\n}\n\nfunc (b *MessageBuilder) AddEnum(enum *resolver.Enum) *MessageBuilder {\n\tenum.Message = b.msg\n\tb.msg.Enums = append(b.msg.Enums, enum)\n\treturn b\n}\n\nfunc (b *MessageBuilder) getType(t *testing.T, name string) *resolver.Type {\n\tt.Helper()\n\tif b.msg.Name == name {\n\t\treturn resolver.NewMessageType(b.msg, false)\n\t}\n\tfor _, enum := range b.msg.Enums {\n\t\tif enum.Name == name {\n\t\t\treturn &resolver.Type{Kind: types.Enum, Enum: enum}\n\t\t}\n\t}\n\tfor _, msg := range b.msg.NestedMessages {\n\t\tif msg.Name == name {\n\t\t\treturn resolver.NewMessageType(msg, false)\n\t\t}\n\t}\n\tt.Fatalf(\"failed to find %s type in %s message\", name, b.msg.Name)\n\treturn nil\n}\n\nfunc (b *MessageBuilder) AddField(name string, typ *resolver.Type) *MessageBuilder {\n\tb.msg.Fields = append(b.msg.Fields, &resolver.Field{Name: name, Type: typ})\n\treturn b\n}\n\nfunc (b *MessageBuilder) AddFieldWithOneof(name string, typ *resolver.Type, oneof *resolver.Oneof) *MessageBuilder {\n\tb.msg.Fields = append(b.msg.Fields, &resolver.Field{Name: name, Type: typ, Oneof: oneof})\n\treturn b\n}\n\nfunc (b *MessageBuilder) AddFieldWithSelfType(name string, isRepeated bool) *MessageBuilder {\n\ttyp := resolver.NewMessageType(b.msg, isRepeated)\n\tb.msg.Fields = append(b.msg.Fields, &resolver.Field{Name: name, Type: typ})\n\treturn b\n}\n\nfunc (b *MessageBuilder) AddFieldWithTypeName(t *testing.T, name, typeName string, isRepeated bool) *MessageBuilder {\n\tt.Helper()\n\ttyp := b.getType(t, typeName)\n\tif isRepeated {\n\t\ttyp.Repeated = true\n\t}\n\treturn b.AddField(name, typ)\n}\n\nfunc (b *MessageBuilder) AddFieldWithTypeNameAndAlias(t *testing.T, name, typeName string, isRepeated bool, field *resolver.Field) *MessageBuilder {\n\tt.Helper()\n\ttyp := b.getType(t, typeName)\n\tif isRepeated {\n\t\ttyp.Repeated = true\n\t}\n\treturn b.AddFieldWithAlias(name, typ, field)\n}\n\nfunc (b *MessageBuilder) AddFieldWithTypeNameAndAutoBind(t *testing.T, name, typeName string, isRepeated bool, field *resolver.Field) *MessageBuilder {\n\tt.Helper()\n\ttyp := b.getType(t, typeName)\n\tif isRepeated {\n\t\ttyp.Repeated = true\n\t}\n\tb.msg.Fields = append(\n\t\tb.msg.Fields,\n\t\t&resolver.Field{\n\t\t\tName: name,\n\t\t\tType: typ,\n\t\t\tRule: &resolver.FieldRule{\n\t\t\t\tAutoBindField: &resolver.AutoBindField{\n\t\t\t\t\tField: field,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t)\n\treturn b\n}\n\nfunc (b *MessageBuilder) AddFieldWithAutoBind(name string, typ *resolver.Type, field *resolver.Field) *MessageBuilder {\n\tb.msg.Fields = append(\n\t\tb.msg.Fields,\n\t\t&resolver.Field{\n\t\t\tName: name,\n\t\t\tType: typ,\n\t\t\tRule: &resolver.FieldRule{\n\t\t\t\tAutoBindField: &resolver.AutoBindField{\n\t\t\t\t\tField: field,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t)\n\treturn b\n}\n\nfunc (b *MessageBuilder) AddFieldWithAlias(name string, typ *resolver.Type, fields ...*resolver.Field) *MessageBuilder {\n\tb.msg.Fields = append(\n\t\tb.msg.Fields,\n\t\t&resolver.Field{\n\t\t\tName: name,\n\t\t\tType: typ,\n\t\t\tRule: &resolver.FieldRule{\n\t\t\t\tAliases: fields,\n\t\t\t},\n\t\t},\n\t)\n\treturn b\n}\n\nfunc (b *MessageBuilder) AddFieldWithTypeNameAndRule(t *testing.T, name, typeName string, isRepeated bool, rule *resolver.FieldRule) *MessageBuilder {\n\tt.Helper()\n\ttyp := b.getType(t, typeName)\n\tif isRepeated {\n\t\ttyp.Repeated = true\n\t}\n\treturn b.AddFieldWithRule(name, typ, rule)\n}\n\nfunc (b *MessageBuilder) AddFieldWithRule(name string, typ *resolver.Type, rule *resolver.FieldRule) *MessageBuilder {\n\tfield := &resolver.Field{Name: name, Type: typ, Rule: rule}\n\tb.msg.Fields = append(b.msg.Fields, field)\n\treturn b\n}\n\nfunc (b *MessageBuilder) SetRule(rule *resolver.MessageRule) *MessageBuilder {\n\tb.msg.Rule = rule\n\treturn b\n}\n\nfunc (b *MessageBuilder) Build(t *testing.T) *resolver.Message {\n\tt.Helper()\n\treturn b.msg\n}\n\ntype OneofBuilder struct {\n\toneof *resolver.Oneof\n}\n\nfunc NewOneofBuilder(name string) *OneofBuilder {\n\treturn &OneofBuilder{\n\t\toneof: &resolver.Oneof{\n\t\t\tName: name,\n\t\t},\n\t}\n}\n\nfunc (b *OneofBuilder) AddFieldNames(fields ...string) *OneofBuilder {\n\tfor _, field := range fields {\n\t\tb.oneof.Fields = append(b.oneof.Fields, &resolver.Field{Name: field})\n\t}\n\treturn b\n}\n\nfunc (b *OneofBuilder) Build(t *testing.T) *resolver.Oneof {\n\tt.Helper()\n\treturn b.oneof\n}\n\ntype EnumBuilder struct {\n\tenum *resolver.Enum\n}\n\nfunc NewEnumBuilder(name string) *EnumBuilder {\n\treturn &EnumBuilder{\n\t\tenum: &resolver.Enum{Name: name},\n\t}\n}\n\nfunc (b *EnumBuilder) AddValue(value string) *EnumBuilder {\n\tb.enum.Values = append(b.enum.Values, &resolver.EnumValue{Value: value, Enum: b.enum})\n\treturn b\n}\n\nfunc (b *EnumBuilder) AddValueWithDefault(value string) *EnumBuilder {\n\tb.enum.Values = append(b.enum.Values, &resolver.EnumValue{\n\t\tValue: value,\n\t\tRule: &resolver.EnumValueRule{\n\t\t\tDefault: true,\n\t\t},\n\t\tEnum: b.enum,\n\t})\n\treturn b\n}\n\nfunc (b *EnumBuilder) AddValueWithNoAlias(value string) *EnumBuilder {\n\tb.enum.Values = append(b.enum.Values, &resolver.EnumValue{\n\t\tValue: value,\n\t\tRule: &resolver.EnumValueRule{\n\t\t\tNoAlias: true,\n\t\t},\n\t\tEnum: b.enum,\n\t})\n\treturn b\n}\n\nfunc (b *EnumBuilder) AddValueWithAlias(value string, aliases ...*resolver.EnumValue) *EnumBuilder {\n\tvar enumValueAliases []*resolver.EnumValueAlias\n\tfor _, alias := range aliases {\n\t\tenumValueAliases = append(enumValueAliases, &resolver.EnumValueAlias{\n\t\t\tEnumAlias: alias.Enum,\n\t\t\tAliases:   []*resolver.EnumValue{alias},\n\t\t})\n\t}\n\tb.enum.Values = append(b.enum.Values, &resolver.EnumValue{\n\t\tValue: value,\n\t\tRule: &resolver.EnumValueRule{\n\t\t\tAliases: enumValueAliases,\n\t\t},\n\t\tEnum: b.enum,\n\t})\n\treturn b\n}\n\nfunc (b *EnumBuilder) AddValueWithRule(value string, rule *resolver.EnumValueRule) *EnumBuilder {\n\tb.enum.Values = append(b.enum.Values, &resolver.EnumValue{\n\t\tValue: value,\n\t\tRule:  rule,\n\t\tEnum:  b.enum,\n\t})\n\treturn b\n}\n\nfunc (b *EnumBuilder) SetAlias(aliases ...*resolver.Enum) *EnumBuilder {\n\tb.enum.Rule = &resolver.EnumRule{\n\t\tAliases: aliases,\n\t}\n\treturn b\n}\n\nfunc (b *EnumBuilder) Build(t *testing.T) *resolver.Enum {\n\tt.Helper()\n\treturn b.enum\n}\n\ntype EnumValueRuleBuilder struct {\n\trule *resolver.EnumValueRule\n}\n\nfunc NewEnumValueRuleBuilder() *EnumValueRuleBuilder {\n\treturn &EnumValueRuleBuilder{\n\t\trule: &resolver.EnumValueRule{},\n\t}\n}\n\nfunc (b *EnumValueRuleBuilder) SetAlias(aliases ...*resolver.EnumValue) *EnumValueRuleBuilder {\n\tenumValueAliases := make([]*resolver.EnumValueAlias, 0, len(aliases))\n\tfor _, alias := range aliases {\n\t\tenumValueAliases = append(enumValueAliases, &resolver.EnumValueAlias{\n\t\t\tEnumAlias: alias.Enum,\n\t\t\tAliases:   []*resolver.EnumValue{alias},\n\t\t})\n\t}\n\tb.rule.Aliases = enumValueAliases\n\treturn b\n}\n\nfunc (b *EnumValueRuleBuilder) SetDefault() *EnumValueRuleBuilder {\n\tb.rule.Default = true\n\treturn b\n}\n\nfunc (b *EnumValueRuleBuilder) SetAttr(attrs ...*resolver.EnumValueAttribute) *EnumValueRuleBuilder {\n\tb.rule.Attrs = attrs\n\treturn b\n}\n\nfunc (b *EnumValueRuleBuilder) Build(t *testing.T) *resolver.EnumValueRule {\n\tt.Helper()\n\treturn b.rule\n}\n\ntype ServiceBuilder struct {\n\tsvc *resolver.Service\n}\n\nfunc NewServiceBuilder(name string) *ServiceBuilder {\n\treturn &ServiceBuilder{\n\t\tsvc: &resolver.Service{\n\t\t\tName:    name,\n\t\t\tMethods: []*resolver.Method{},\n\t\t},\n\t}\n}\n\nfunc (b *ServiceBuilder) AddMethod(name string, req, res *resolver.Message, rule *resolver.MethodRule) *ServiceBuilder {\n\tb.svc.Methods = append(b.svc.Methods, &resolver.Method{\n\t\tService:  b.svc,\n\t\tName:     name,\n\t\tRequest:  req,\n\t\tResponse: res,\n\t\tRule:     rule,\n\t})\n\treturn b\n}\n\nfunc (b *ServiceBuilder) AddMessage(msg, arg *resolver.Message) *ServiceBuilder {\n\tif msg != nil {\n\t\tb.svc.Messages = append(b.svc.Messages, msg)\n\t}\n\tif arg != nil {\n\t\tb.svc.MessageArgs = append(b.svc.MessageArgs, arg)\n\t}\n\treturn b\n}\n\nfunc (b *ServiceBuilder) SetRule(rule *resolver.ServiceRule) *ServiceBuilder {\n\tb.svc.Rule = rule\n\treturn b\n}\n\nfunc (b *ServiceBuilder) Build(t *testing.T) *resolver.Service {\n\tt.Helper()\n\treturn b.svc\n}\n\ntype MessageRuleBuilder struct {\n\trule *resolver.MessageRule\n\terrs []error\n}\n\nfunc NewMessageRuleBuilder() *MessageRuleBuilder {\n\treturn &MessageRuleBuilder{\n\t\trule: &resolver.MessageRule{\n\t\t\tDefSet: &resolver.VariableDefinitionSet{},\n\t\t},\n\t}\n}\n\nfunc (b *MessageRuleBuilder) SetCustomResolver(v bool) *MessageRuleBuilder {\n\tb.rule.CustomResolver = v\n\treturn b\n}\n\nfunc (b *MessageRuleBuilder) SetAlias(aliases ...*resolver.Message) *MessageRuleBuilder {\n\tb.rule.Aliases = aliases\n\treturn b\n}\n\nfunc (b *MessageRuleBuilder) SetMessageArgument(msg *resolver.Message) *MessageRuleBuilder {\n\tb.rule.MessageArgument = msg\n\treturn b\n}\n\nfunc (b *MessageRuleBuilder) SetDependencyGraph(graph *resolver.MessageDependencyGraph) *MessageRuleBuilder {\n\tb.rule.DefSet.Graph = graph\n\treturn b\n}\n\nfunc (b *MessageRuleBuilder) AddVariableDefinitionGroup(group resolver.VariableDefinitionGroup) *MessageRuleBuilder {\n\tb.rule.DefSet.Groups = append(b.rule.DefSet.Groups, group)\n\treturn b\n}\n\nfunc (b *MessageRuleBuilder) AddVariableDefinition(def *resolver.VariableDefinition) *MessageRuleBuilder {\n\tif def.Expr != nil && def.Expr.Map != nil && def.Expr.Map.Iterator != nil {\n\t\tname := def.Expr.Map.Iterator.Source.Name\n\t\tvar found bool\n\t\tfor _, varDef := range b.rule.DefSet.Definitions() {\n\t\t\tif varDef.Name == name {\n\t\t\t\tdef.Expr.Map.Iterator.Source = varDef\n\t\t\t\tfound = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif !found {\n\t\t\tb.errs = append(b.errs, fmt.Errorf(\"%s variable name is not found\", name))\n\t\t}\n\t}\n\tdef.Idx = len(b.rule.DefSet.Definitions())\n\tb.rule.DefSet.Defs = append(b.rule.DefSet.Defs, def)\n\treturn b\n}\n\nfunc (b *MessageRuleBuilder) Build(t *testing.T) *resolver.MessageRule {\n\tt.Helper()\n\tif len(b.errs) != 0 {\n\t\tt.Fatal(errors.Join(b.errs...))\n\t}\n\treturn b.rule\n}\n\nfunc NewVariableDefinition(name string) *resolver.VariableDefinition {\n\treturn &resolver.VariableDefinition{Name: name}\n}\n\ntype VariableDefinitionBuilder struct {\n\tdef *resolver.VariableDefinition\n}\n\nfunc NewVariableDefinitionBuilder() *VariableDefinitionBuilder {\n\treturn &VariableDefinitionBuilder{\n\t\tdef: &resolver.VariableDefinition{},\n\t}\n}\n\nfunc (b *VariableDefinitionBuilder) SetIdx(idx int) *VariableDefinitionBuilder {\n\tb.def.Idx = idx\n\treturn b\n}\n\nfunc (b *VariableDefinitionBuilder) SetName(v string) *VariableDefinitionBuilder {\n\tb.def.Name = v\n\treturn b\n}\n\nfunc (b *VariableDefinitionBuilder) SetIf(v string) *VariableDefinitionBuilder {\n\tb.def.If = &resolver.CELValue{\n\t\tExpr: v,\n\t\tOut:  resolver.BoolType,\n\t}\n\treturn b\n}\n\nfunc (b *VariableDefinitionBuilder) SetAutoBind(v bool) *VariableDefinitionBuilder {\n\tb.def.AutoBind = v\n\treturn b\n}\n\nfunc (b *VariableDefinitionBuilder) SetUsed(v bool) *VariableDefinitionBuilder {\n\tb.def.Used = v\n\treturn b\n}\n\nfunc (b *VariableDefinitionBuilder) SetBy(v *resolver.CELValue) *VariableDefinitionBuilder {\n\tb.def.Expr = &resolver.VariableExpr{\n\t\tBy:   v,\n\t\tType: v.Out,\n\t}\n\treturn b\n}\n\nfunc (b *VariableDefinitionBuilder) SetMap(v *resolver.MapExpr) *VariableDefinitionBuilder {\n\tmapExprType := v.Expr.Type.Clone()\n\tmapExprType.Repeated = true\n\tb.def.Expr = &resolver.VariableExpr{\n\t\tMap:  v,\n\t\tType: mapExprType,\n\t}\n\treturn b\n}\n\nfunc (b *VariableDefinitionBuilder) SetCall(v *resolver.CallExpr) *VariableDefinitionBuilder {\n\tb.def.Expr = &resolver.VariableExpr{\n\t\tCall: v,\n\t\tType: resolver.NewMessageType(v.Method.Response, false),\n\t}\n\treturn b\n}\n\nfunc (b *VariableDefinitionBuilder) SetMessage(v *resolver.MessageExpr) *VariableDefinitionBuilder {\n\tb.def.Expr = &resolver.VariableExpr{\n\t\tMessage: v,\n\t\tType:    resolver.NewMessageType(v.Message, false),\n\t}\n\treturn b\n}\n\nfunc (b *VariableDefinitionBuilder) SetEnum(v *resolver.EnumExpr) *VariableDefinitionBuilder {\n\tb.def.Expr = &resolver.VariableExpr{\n\t\tEnum: v,\n\t\tType: resolver.NewEnumType(v.Enum, false),\n\t}\n\treturn b\n}\n\nfunc (b *VariableDefinitionBuilder) SetValidation(v *resolver.ValidationExpr) *VariableDefinitionBuilder {\n\tb.def.Expr = &resolver.VariableExpr{\n\t\tValidation: v,\n\t\tType:       resolver.BoolType,\n\t}\n\treturn b\n}\n\nfunc (b *VariableDefinitionBuilder) SetSwitch(v *resolver.SwitchExpr) *VariableDefinitionBuilder {\n\tb.def.Expr = &resolver.VariableExpr{\n\t\tSwitch: v,\n\t\tType:   v.Type,\n\t}\n\treturn b\n}\n\nfunc (b *VariableDefinitionBuilder) Build(t *testing.T) *resolver.VariableDefinition {\n\tt.Helper()\n\treturn b.def\n}\n\ntype MapExprBuilder struct {\n\texpr *resolver.MapExpr\n}\n\nfunc NewMapExprBuilder() *MapExprBuilder {\n\treturn &MapExprBuilder{\n\t\texpr: &resolver.MapExpr{},\n\t}\n}\n\nfunc (b *MapExprBuilder) SetIterator(v *resolver.Iterator) *MapExprBuilder {\n\tb.expr.Iterator = v\n\treturn b\n}\n\nfunc (b *MapExprBuilder) SetExpr(v *resolver.MapIteratorExpr) *MapExprBuilder {\n\tb.expr.Expr = v\n\treturn b\n}\n\nfunc (b *MapExprBuilder) Build(t *testing.T) *resolver.MapExpr {\n\tt.Helper()\n\treturn b.expr\n}\n\ntype IteratorBuilder struct {\n\titer *resolver.Iterator\n}\n\nfunc NewIteratorBuilder() *IteratorBuilder {\n\treturn &IteratorBuilder{\n\t\titer: &resolver.Iterator{},\n\t}\n}\n\nfunc (b *IteratorBuilder) SetName(v string) *IteratorBuilder {\n\tb.iter.Name = v\n\treturn b\n}\n\nfunc (b *IteratorBuilder) SetSource(v string) *IteratorBuilder {\n\tb.iter.Source = &resolver.VariableDefinition{\n\t\tName: v,\n\t}\n\treturn b\n}\n\nfunc (b *IteratorBuilder) Build(t *testing.T) *resolver.Iterator {\n\tt.Helper()\n\treturn b.iter\n}\n\ntype MapIteratorExprBuilder struct {\n\texpr *resolver.MapIteratorExpr\n}\n\nfunc NewMapIteratorExprBuilder() *MapIteratorExprBuilder {\n\treturn &MapIteratorExprBuilder{\n\t\texpr: &resolver.MapIteratorExpr{},\n\t}\n}\n\nfunc (b *MapIteratorExprBuilder) SetBy(v *resolver.CELValue) *MapIteratorExprBuilder {\n\tb.expr.By = v\n\tb.expr.Type = v.Out\n\treturn b\n}\n\nfunc (b *MapIteratorExprBuilder) SetMessage(v *resolver.MessageExpr) *MapIteratorExprBuilder {\n\tb.expr.Message = v\n\tb.expr.Type = resolver.NewMessageType(v.Message, false)\n\treturn b\n}\n\nfunc (b *MapIteratorExprBuilder) SetEnum(v *resolver.EnumExpr) *MapIteratorExprBuilder {\n\tb.expr.Enum = v\n\tb.expr.Type = resolver.NewEnumType(v.Enum, false)\n\treturn b\n}\n\nfunc (b *MapIteratorExprBuilder) Build(t *testing.T) *resolver.MapIteratorExpr {\n\tt.Helper()\n\treturn b.expr\n}\n\ntype CallExprBuilder struct {\n\texpr    *resolver.CallExpr\n\ttimeout string\n}\n\nfunc NewCallExprBuilder() *CallExprBuilder {\n\treturn &CallExprBuilder{\n\t\texpr: &resolver.CallExpr{},\n\t}\n}\n\nfunc (b *CallExprBuilder) SetMethod(v *resolver.Method) *CallExprBuilder {\n\tb.expr.Method = v\n\treturn b\n}\n\nfunc (b *CallExprBuilder) SetRequest(v *resolver.Request) *CallExprBuilder {\n\tv.Type = b.expr.Method.Request\n\tb.expr.Request = v\n\treturn b\n}\n\nfunc (b *CallExprBuilder) SetTimeout(v string) *CallExprBuilder {\n\tb.timeout = v\n\treturn b\n}\n\nfunc (b *CallExprBuilder) SetRetryIf(expr string) *CallExprBuilder {\n\tifValue := &resolver.CELValue{\n\t\tExpr: expr,\n\t\tOut:  resolver.BoolType,\n\t}\n\tif b.expr.Retry != nil {\n\t\tb.expr.Retry.If = ifValue\n\t} else {\n\t\tb.expr.Retry = &resolver.RetryPolicy{If: ifValue}\n\t}\n\treturn b\n}\n\nfunc (b *CallExprBuilder) SetRetryPolicyConstant(constant *resolver.RetryPolicyConstant) *CallExprBuilder {\n\tdefaultIfValue := &resolver.CELValue{\n\t\tExpr: \"true\",\n\t\tOut:  resolver.BoolType,\n\t}\n\tif b.expr.Retry != nil {\n\t\tb.expr.Retry.Constant = constant\n\t\tif b.expr.Retry.If == nil {\n\t\t\tb.expr.Retry.If = defaultIfValue\n\t\t}\n\t} else {\n\t\tb.expr.Retry = &resolver.RetryPolicy{\n\t\t\tIf:       defaultIfValue,\n\t\t\tConstant: constant,\n\t\t}\n\t}\n\treturn b\n}\n\nfunc (b *CallExprBuilder) SetRetryPolicyExponential(exp *resolver.RetryPolicyExponential) *CallExprBuilder {\n\tdefaultIfValue := &resolver.CELValue{\n\t\tExpr: \"true\",\n\t\tOut:  resolver.BoolType,\n\t}\n\tif b.expr.Retry != nil {\n\t\tb.expr.Retry.Exponential = exp\n\t\tif b.expr.Retry.If == nil {\n\t\t\tb.expr.Retry.If = defaultIfValue\n\t\t}\n\t} else {\n\t\tb.expr.Retry = &resolver.RetryPolicy{\n\t\t\tIf:          defaultIfValue,\n\t\t\tExponential: exp,\n\t\t}\n\t}\n\treturn b\n}\n\nfunc (b *CallExprBuilder) AddError(err *resolver.GRPCError) *CallExprBuilder {\n\tb.expr.Errors = append(b.expr.Errors, err)\n\treturn b\n}\n\nfunc (b *CallExprBuilder) Build(t *testing.T) *resolver.CallExpr {\n\tt.Helper()\n\tif b.timeout != \"\" {\n\t\ttimeout, err := time.ParseDuration(b.timeout)\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tb.expr.Timeout = &timeout\n\t\tif b.expr.Retry != nil && b.expr.Retry.Exponential != nil {\n\t\t\tb.expr.Retry.Exponential.MaxElapsedTime = timeout\n\t\t}\n\t}\n\treturn b.expr\n}\n\ntype MessageExprBuilder struct {\n\texpr *resolver.MessageExpr\n}\n\nfunc NewMessageExprBuilder() *MessageExprBuilder {\n\treturn &MessageExprBuilder{\n\t\texpr: &resolver.MessageExpr{\n\t\t\tArgs: []*resolver.Argument{},\n\t\t},\n\t}\n}\n\nfunc (b *MessageExprBuilder) SetMessage(v *resolver.Message) *MessageExprBuilder {\n\tb.expr.Message = v\n\treturn b\n}\n\nfunc (b *MessageExprBuilder) SetArgs(v []*resolver.Argument) *MessageExprBuilder {\n\tb.expr.Args = v\n\treturn b\n}\n\nfunc (b *MessageExprBuilder) Build(t *testing.T) *resolver.MessageExpr {\n\tt.Helper()\n\treturn b.expr\n}\n\ntype EnumExprBuilder struct {\n\texpr *resolver.EnumExpr\n}\n\nfunc NewEnumExprBuilder() *EnumExprBuilder {\n\treturn &EnumExprBuilder{\n\t\texpr: &resolver.EnumExpr{},\n\t}\n}\n\nfunc (b *EnumExprBuilder) SetEnum(v *resolver.Enum) *EnumExprBuilder {\n\tb.expr.Enum = v\n\treturn b\n}\n\nfunc (b *EnumExprBuilder) SetBy(v *resolver.CELValue) *EnumExprBuilder {\n\tb.expr.By = v\n\treturn b\n}\n\nfunc (b *EnumExprBuilder) Build(t *testing.T) *resolver.EnumExpr {\n\tt.Helper()\n\treturn b.expr\n}\n\ntype ValidationExprBuilder struct {\n\texpr *resolver.ValidationExpr\n}\n\nfunc NewValidationExprBuilder() *ValidationExprBuilder {\n\treturn &ValidationExprBuilder{\n\t\texpr: &resolver.ValidationExpr{},\n\t}\n}\n\nfunc (b *ValidationExprBuilder) SetError(err *resolver.GRPCError) *ValidationExprBuilder {\n\tb.expr.Error = err\n\treturn b\n}\n\nfunc (b *ValidationExprBuilder) Build(t *testing.T) *resolver.ValidationExpr {\n\tt.Helper()\n\treturn b.expr\n}\n\ntype GRPCErrorBuilder struct {\n\terr *resolver.GRPCError\n}\n\nfunc NewGRPCErrorBuilder() *GRPCErrorBuilder {\n\treturn &GRPCErrorBuilder{\n\t\terr: &resolver.GRPCError{\n\t\t\tDefSet: &resolver.VariableDefinitionSet{},\n\t\t\tIf: &resolver.CELValue{\n\t\t\t\tExpr: \"true\",\n\t\t\t\tOut:  resolver.BoolType,\n\t\t\t},\n\t\t\tLogLevel: slog.LevelError,\n\t\t},\n\t}\n}\n\nfunc (b *GRPCErrorBuilder) AddVariableDefinition(def *resolver.VariableDefinition) *GRPCErrorBuilder {\n\tb.err.DefSet.Defs = append(b.err.DefSet.Defs, def)\n\treturn b\n}\n\nfunc (b *GRPCErrorBuilder) SetDependencyGraph(graph *resolver.MessageDependencyGraph) *GRPCErrorBuilder {\n\tb.err.DefSet.Graph = graph\n\treturn b\n}\n\nfunc (b *GRPCErrorBuilder) AddVariableDefinitionGroup(group resolver.VariableDefinitionGroup) *GRPCErrorBuilder {\n\tb.err.DefSet.Groups = append(b.err.DefSet.Groups, group)\n\treturn b\n}\n\nfunc (b *GRPCErrorBuilder) SetIf(expr string) *GRPCErrorBuilder {\n\tb.err.If = &resolver.CELValue{\n\t\tExpr: expr,\n\t\tOut:  resolver.BoolType,\n\t}\n\treturn b\n}\n\nfunc (b *GRPCErrorBuilder) SetCode(v code.Code) *GRPCErrorBuilder {\n\tb.err.Code = &v\n\treturn b\n}\n\nfunc (b *GRPCErrorBuilder) SetMessage(v string) *GRPCErrorBuilder {\n\tb.err.Message = &resolver.CELValue{\n\t\tExpr: v,\n\t\tOut:  resolver.StringType,\n\t}\n\treturn b\n}\n\nfunc (b *GRPCErrorBuilder) SetIgnore(v bool) *GRPCErrorBuilder {\n\tb.err.Ignore = v\n\treturn b\n}\n\nfunc (b *GRPCErrorBuilder) SetIgnoreAndResponse(v string, typ *resolver.Type) *GRPCErrorBuilder {\n\tb.err.IgnoreAndResponse = &resolver.CELValue{\n\t\tExpr: v,\n\t\tOut:  typ,\n\t}\n\treturn b\n}\n\nfunc (b *GRPCErrorBuilder) AddDetail(v *resolver.GRPCErrorDetail) *GRPCErrorBuilder {\n\tb.err.Details = append(b.err.Details, v)\n\treturn b\n}\n\nfunc (b *GRPCErrorBuilder) SetLogLevel(level slog.Level) *GRPCErrorBuilder {\n\tb.err.LogLevel = level\n\treturn b\n}\n\nfunc (b *GRPCErrorBuilder) Build(t *testing.T) *resolver.GRPCError {\n\tt.Helper()\n\treturn b.err\n}\n\ntype GRPCErrorDetailBuilder struct {\n\tdetail *resolver.GRPCErrorDetail\n}\n\nfunc NewGRPCErrorDetailBuilder() *GRPCErrorDetailBuilder {\n\treturn &GRPCErrorDetailBuilder{\n\t\tdetail: &resolver.GRPCErrorDetail{\n\t\t\tIf: &resolver.CELValue{\n\t\t\t\tExpr: \"true\",\n\t\t\t\tOut:  resolver.BoolType,\n\t\t\t},\n\t\t\tDefSet:   &resolver.VariableDefinitionSet{},\n\t\t\tMessages: &resolver.VariableDefinitionSet{},\n\t\t},\n\t}\n}\n\nfunc (b *GRPCErrorDetailBuilder) SetIf(expr string) *GRPCErrorDetailBuilder {\n\tb.detail.If = &resolver.CELValue{\n\t\tExpr: expr,\n\t\tOut:  resolver.BoolType,\n\t}\n\treturn b\n}\n\nfunc (b *GRPCErrorDetailBuilder) AddDef(v *resolver.VariableDefinition) *GRPCErrorDetailBuilder {\n\tb.detail.DefSet.Defs = append(b.detail.DefSet.Defs, v)\n\treturn b\n}\n\nfunc (b *GRPCErrorDetailBuilder) AddBy(v *resolver.CELValue) *GRPCErrorDetailBuilder {\n\tb.detail.By = append(b.detail.By, v)\n\treturn b\n}\n\nfunc (b *GRPCErrorDetailBuilder) AddMessage(v *resolver.VariableDefinition) *GRPCErrorDetailBuilder {\n\tb.detail.Messages.Defs = append(b.detail.Messages.Defs, v)\n\treturn b\n}\n\nfunc (b *GRPCErrorDetailBuilder) AddPreconditionFailure(v *resolver.PreconditionFailure) *GRPCErrorDetailBuilder {\n\tb.detail.PreconditionFailures = append(b.detail.PreconditionFailures, v)\n\treturn b\n}\n\nfunc (b *GRPCErrorDetailBuilder) AddBadRequest(v *resolver.BadRequest) *GRPCErrorDetailBuilder {\n\tb.detail.BadRequests = append(b.detail.BadRequests, v)\n\treturn b\n}\n\nfunc (b *GRPCErrorDetailBuilder) AddLocalizedMessage(v *resolver.LocalizedMessage) *GRPCErrorDetailBuilder {\n\tb.detail.LocalizedMessages = append(b.detail.LocalizedMessages, v)\n\treturn b\n}\n\nfunc (b *GRPCErrorDetailBuilder) Build(t *testing.T) *resolver.GRPCErrorDetail {\n\tt.Helper()\n\treturn b.detail\n}\n\ntype SwitchExprBuilder struct {\n\texpr *resolver.SwitchExpr\n}\n\nfunc NewSwitchExprBuilder() *SwitchExprBuilder {\n\treturn &SwitchExprBuilder{\n\t\texpr: &resolver.SwitchExpr{},\n\t}\n}\n\nfunc (b *SwitchExprBuilder) SetType(v *resolver.Type) *SwitchExprBuilder {\n\tb.expr.Type = v\n\treturn b\n}\n\nfunc (b *SwitchExprBuilder) AddCase(v *resolver.SwitchCaseExpr) *SwitchExprBuilder {\n\tb.expr.Cases = append(b.expr.Cases, v)\n\treturn b\n}\n\nfunc (b *SwitchExprBuilder) SetDefault(v *resolver.SwitchDefaultExpr) *SwitchExprBuilder {\n\tb.expr.Default = v\n\treturn b\n}\n\nfunc (b *SwitchExprBuilder) Build(t *testing.T) *resolver.SwitchExpr {\n\tt.Helper()\n\treturn b.expr\n}\n\ntype SwitchCaseExprBuilder struct {\n\texpr *resolver.SwitchCaseExpr\n}\n\nfunc NewSwitchCaseExprBuilder() *SwitchCaseExprBuilder {\n\treturn &SwitchCaseExprBuilder{\n\t\texpr: &resolver.SwitchCaseExpr{\n\t\t\tDefSet: &resolver.VariableDefinitionSet{},\n\t\t},\n\t}\n}\n\nfunc (b *SwitchCaseExprBuilder) AddDef(v *resolver.VariableDefinition) *SwitchCaseExprBuilder {\n\tb.expr.DefSet.Defs = append(b.expr.DefSet.Defs, v)\n\treturn b\n}\n\nfunc (b *SwitchCaseExprBuilder) SetDependencyGraph(graph *resolver.MessageDependencyGraph) *SwitchCaseExprBuilder {\n\tb.expr.DefSet.Graph = graph\n\treturn b\n}\n\nfunc (b *SwitchCaseExprBuilder) AddVariableDefinitionGroup(group resolver.VariableDefinitionGroup) *SwitchCaseExprBuilder {\n\tb.expr.DefSet.Groups = append(b.expr.DefSet.Groups, group)\n\treturn b\n}\n\nfunc (b *SwitchCaseExprBuilder) SetIf(v *resolver.CELValue) *SwitchCaseExprBuilder {\n\tb.expr.If = v\n\treturn b\n}\n\nfunc (b *SwitchCaseExprBuilder) SetBy(v *resolver.CELValue) *SwitchCaseExprBuilder {\n\tb.expr.By = v\n\treturn b\n}\n\nfunc (b *SwitchCaseExprBuilder) Build(t *testing.T) *resolver.SwitchCaseExpr {\n\tt.Helper()\n\treturn b.expr\n}\n\ntype SwitchDefaultExprBuilder struct {\n\texpr *resolver.SwitchDefaultExpr\n}\n\nfunc NewSwitchDefaultExprBuilder() *SwitchDefaultExprBuilder {\n\treturn &SwitchDefaultExprBuilder{\n\t\texpr: &resolver.SwitchDefaultExpr{\n\t\t\tDefSet: &resolver.VariableDefinitionSet{},\n\t\t},\n\t}\n}\n\nfunc (b *SwitchDefaultExprBuilder) AddDef(v *resolver.VariableDefinition) *SwitchDefaultExprBuilder {\n\tb.expr.DefSet.Defs = append(b.expr.DefSet.Defs, v)\n\treturn b\n}\n\nfunc (b *SwitchDefaultExprBuilder) SetBy(v *resolver.CELValue) *SwitchDefaultExprBuilder {\n\tb.expr.By = v\n\treturn b\n}\n\nfunc (b *SwitchDefaultExprBuilder) AddVariableDefinitionGroup(group resolver.VariableDefinitionGroup) *SwitchDefaultExprBuilder {\n\tb.expr.DefSet.Groups = append(b.expr.DefSet.Groups, group)\n\treturn b\n}\n\nfunc (b *SwitchDefaultExprBuilder) SetDependencyGraph(graph *resolver.MessageDependencyGraph) *SwitchDefaultExprBuilder {\n\tb.expr.DefSet.Graph = graph\n\treturn b\n}\n\nfunc (b *SwitchDefaultExprBuilder) Build(t *testing.T) *resolver.SwitchDefaultExpr {\n\tt.Helper()\n\treturn b.expr\n}\n\ntype VariableDefinitionGroupBuilder struct {\n\tstarts []resolver.VariableDefinitionGroup\n\tend    *resolver.VariableDefinition\n}\n\nfunc NewVariableDefinitionGroupByName(name string) *resolver.SequentialVariableDefinitionGroup {\n\treturn &resolver.SequentialVariableDefinitionGroup{\n\t\tEnd: &resolver.VariableDefinition{Name: name},\n\t}\n}\n\nfunc NewVariableDefinitionGroupBuilder() *VariableDefinitionGroupBuilder {\n\treturn &VariableDefinitionGroupBuilder{}\n}\n\nfunc (b *VariableDefinitionGroupBuilder) AddStart(start resolver.VariableDefinitionGroup) *VariableDefinitionGroupBuilder {\n\tb.starts = append(b.starts, start)\n\treturn b\n}\n\nfunc (b *VariableDefinitionGroupBuilder) SetEnd(end *resolver.VariableDefinition) *VariableDefinitionGroupBuilder {\n\tb.end = end\n\treturn b\n}\n\nfunc (b *VariableDefinitionGroupBuilder) Build(t *testing.T) resolver.VariableDefinitionGroup {\n\tt.Helper()\n\tif len(b.starts) > 1 {\n\t\treturn &resolver.ConcurrentVariableDefinitionGroup{\n\t\t\tStarts: b.starts,\n\t\t\tEnd:    b.end,\n\t\t}\n\t}\n\tvar start resolver.VariableDefinitionGroup\n\tif len(b.starts) == 1 {\n\t\tstart = b.starts[0]\n\t}\n\treturn &resolver.SequentialVariableDefinitionGroup{\n\t\tStart: start,\n\t\tEnd:   b.end,\n\t}\n}\n\ntype MethodCallBuilder struct {\n\tcall    *resolver.MethodCall\n\ttimeout string\n}\n\nfunc NewMethodCallBuilder(mtd *resolver.Method) *MethodCallBuilder {\n\treturn &MethodCallBuilder{\n\t\tcall: &resolver.MethodCall{Method: mtd},\n\t}\n}\n\nfunc (b *MethodCallBuilder) SetRequest(req *resolver.Request) *MethodCallBuilder {\n\treq.Type = b.call.Method.Request\n\tb.call.Request = req\n\treturn b\n}\n\nfunc (b *MethodCallBuilder) SetTimeout(timeout string) *MethodCallBuilder {\n\tb.timeout = timeout\n\treturn b\n}\n\nfunc (b *MethodCallBuilder) SetRetryPolicyConstant(constant *resolver.RetryPolicyConstant) *MethodCallBuilder {\n\tb.call.Retry = &resolver.RetryPolicy{\n\t\tConstant: constant,\n\t}\n\treturn b\n}\n\nfunc (b *MethodCallBuilder) SetRetryPolicyExponential(exp *resolver.RetryPolicyExponential) *MethodCallBuilder {\n\tb.call.Retry = &resolver.RetryPolicy{\n\t\tExponential: exp,\n\t}\n\treturn b\n}\n\nfunc (b *MethodCallBuilder) Build(t *testing.T) *resolver.MethodCall {\n\tt.Helper()\n\tif b.timeout != \"\" {\n\t\ttimeout, err := time.ParseDuration(b.timeout)\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tb.call.Timeout = &timeout\n\t\tif b.call.Retry != nil && b.call.Retry.Exponential != nil {\n\t\t\tb.call.Retry.Exponential.MaxElapsedTime = timeout\n\t\t}\n\t}\n\treturn b.call\n}\n\ntype RetryPolicyConstantBuilder struct {\n\tconstant *resolver.RetryPolicyConstant\n\tinterval string\n}\n\nfunc NewRetryPolicyConstantBuilder() *RetryPolicyConstantBuilder {\n\treturn &RetryPolicyConstantBuilder{\n\t\tconstant: &resolver.RetryPolicyConstant{\n\t\t\tInterval:   resolver.DefaultRetryConstantInterval,\n\t\t\tMaxRetries: resolver.DefaultRetryMaxRetryCount,\n\t\t},\n\t}\n}\n\nfunc (b *RetryPolicyConstantBuilder) SetInterval(interval string) *RetryPolicyConstantBuilder {\n\tb.interval = interval\n\treturn b\n}\n\nfunc (b *RetryPolicyConstantBuilder) SetMaxRetries(maxRetries uint64) *RetryPolicyConstantBuilder {\n\tb.constant.MaxRetries = maxRetries\n\treturn b\n}\n\nfunc (b *RetryPolicyConstantBuilder) Build(t *testing.T) *resolver.RetryPolicyConstant {\n\tt.Helper()\n\tif b.interval != \"\" {\n\t\tinterval, err := time.ParseDuration(b.interval)\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tb.constant.Interval = interval\n\t}\n\treturn b.constant\n}\n\ntype RetryPolicyExponentialBuilder struct {\n\texp             *resolver.RetryPolicyExponential\n\tinitialInterval string\n\tmaxInterval     string\n}\n\nfunc NewRetryPolicyExponentialBuilder() *RetryPolicyExponentialBuilder {\n\treturn &RetryPolicyExponentialBuilder{\n\t\texp: &resolver.RetryPolicyExponential{\n\t\t\tInitialInterval:     resolver.DefaultRetryExponentialInitialInterval,\n\t\t\tRandomizationFactor: resolver.DefaultRetryExponentialRandomizationFactor,\n\t\t\tMultiplier:          resolver.DefaultRetryExponentialMultiplier,\n\t\t\tMaxRetries:          resolver.DefaultRetryMaxRetryCount,\n\t\t},\n\t}\n}\n\nfunc (b *RetryPolicyExponentialBuilder) SetInitialInterval(interval string) *RetryPolicyExponentialBuilder {\n\tb.initialInterval = interval\n\treturn b\n}\n\nfunc (b *RetryPolicyExponentialBuilder) SetRandomizationFactor(factor float64) *RetryPolicyExponentialBuilder {\n\tb.exp.RandomizationFactor = factor\n\treturn b\n}\n\nfunc (b *RetryPolicyExponentialBuilder) SetMultiplier(multiplier float64) *RetryPolicyExponentialBuilder {\n\tb.exp.Multiplier = multiplier\n\treturn b\n}\n\nfunc (b *RetryPolicyExponentialBuilder) SetMaxInterval(interval string) *RetryPolicyExponentialBuilder {\n\tb.maxInterval = interval\n\treturn b\n}\n\nfunc (b *RetryPolicyExponentialBuilder) SetMaxRetries(maxRetries uint64) *RetryPolicyExponentialBuilder {\n\tb.exp.MaxRetries = maxRetries\n\treturn b\n}\n\nfunc (b *RetryPolicyExponentialBuilder) Build(t *testing.T) *resolver.RetryPolicyExponential {\n\tt.Helper()\n\tif b.initialInterval != \"\" {\n\t\tinterval, err := time.ParseDuration(b.initialInterval)\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tb.exp.InitialInterval = interval\n\t}\n\tif b.maxInterval != \"\" {\n\t\tinterval, err := time.ParseDuration(b.maxInterval)\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tb.exp.MaxInterval = interval\n\t}\n\treturn b.exp\n}\n\ntype RequestBuilder struct {\n\treq *resolver.Request\n}\n\nfunc NewRequestBuilder() *RequestBuilder {\n\treturn &RequestBuilder{req: &resolver.Request{}}\n}\n\nfunc (b *RequestBuilder) AddField(name string, typ *resolver.Type, value *resolver.Value) *RequestBuilder {\n\tb.req.Args = append(b.req.Args, &resolver.Argument{\n\t\tName:  name,\n\t\tType:  typ,\n\t\tValue: value,\n\t})\n\treturn b\n}\n\nfunc (b *RequestBuilder) AddFieldWithIf(name string, typ *resolver.Type, value *resolver.Value, ifValue string) *RequestBuilder {\n\tb.req.Args = append(b.req.Args, &resolver.Argument{\n\t\tName:  name,\n\t\tType:  typ,\n\t\tValue: value,\n\t\tIf: &resolver.CELValue{\n\t\t\tExpr: ifValue,\n\t\t\tOut:  resolver.BoolType,\n\t\t},\n\t})\n\treturn b\n}\n\nfunc (b *RequestBuilder) Build(t *testing.T) *resolver.Request {\n\tt.Helper()\n\treturn b.req\n}\n\ntype MessageDependencyArgumentBuilder struct {\n\targs []*resolver.Argument\n}\n\nfunc NewMessageDependencyArgumentBuilder() *MessageDependencyArgumentBuilder {\n\treturn &MessageDependencyArgumentBuilder{args: []*resolver.Argument{}}\n}\n\nfunc (b *MessageDependencyArgumentBuilder) Add(name string, value *resolver.Value) *MessageDependencyArgumentBuilder {\n\tb.args = append(b.args, &resolver.Argument{\n\t\tName:  name,\n\t\tValue: value,\n\t})\n\treturn b\n}\n\nfunc (b *MessageDependencyArgumentBuilder) Inline(value *resolver.Value) *MessageDependencyArgumentBuilder {\n\tif value.CEL == nil {\n\t\tvalue.CEL = &resolver.CELValue{}\n\t}\n\tvalue.Inline = true\n\tb.args = append(b.args, &resolver.Argument{Value: value})\n\treturn b\n}\n\nfunc (b *MessageDependencyArgumentBuilder) Build(t *testing.T) []*resolver.Argument {\n\tt.Helper()\n\treturn b.args\n}\n\ntype MessageArgumentValueBuilder struct {\n\tvalue *resolver.Value\n}\n\nfunc NewMessageArgumentValueBuilder(ref, filtered *resolver.Type, expr string) *MessageArgumentValueBuilder {\n\treturn &MessageArgumentValueBuilder{\n\t\tvalue: &resolver.Value{\n\t\t\tCEL: &resolver.CELValue{\n\t\t\t\tExpr: expr,\n\t\t\t\tOut:  filtered,\n\t\t\t},\n\t\t},\n\t}\n}\n\nfunc (b *MessageArgumentValueBuilder) Build(t *testing.T) *resolver.Value {\n\tt.Helper()\n\treturn b.value\n}\n\ntype CELValueBuilder struct {\n\tcel *resolver.CELValue\n}\n\nfunc NewCELValueBuilder(expr string, out *resolver.Type) *CELValueBuilder {\n\treturn &CELValueBuilder{\n\t\tcel: &resolver.CELValue{\n\t\t\tExpr: expr,\n\t\t\tOut:  out,\n\t\t},\n\t}\n}\n\nfunc (b *CELValueBuilder) Build(t *testing.T) *resolver.CELValue {\n\tt.Helper()\n\treturn b.cel\n}\n\ntype NameReferenceValueBuilder struct {\n\tvalue *resolver.Value\n}\n\nfunc NewNameReferenceValueBuilder(ref, filtered *resolver.Type, expr string) *NameReferenceValueBuilder {\n\treturn &NameReferenceValueBuilder{\n\t\tvalue: &resolver.Value{\n\t\t\tCEL: &resolver.CELValue{\n\t\t\t\tExpr: expr,\n\t\t\t\tOut:  filtered,\n\t\t\t},\n\t\t},\n\t}\n}\n\nfunc (b *NameReferenceValueBuilder) Build(t *testing.T) *resolver.Value {\n\tt.Helper()\n\treturn b.value\n}\n\ntype FieldRuleBuilder struct {\n\trule *resolver.FieldRule\n}\n\nfunc NewFieldRuleBuilder(value *resolver.Value) *FieldRuleBuilder {\n\treturn &FieldRuleBuilder{rule: &resolver.FieldRule{Value: value}}\n}\n\nfunc (b *FieldRuleBuilder) SetAutoBind(field *resolver.Field) *FieldRuleBuilder {\n\tb.rule.AutoBindField = &resolver.AutoBindField{\n\t\tField: field,\n\t}\n\treturn b\n}\n\nfunc (b *FieldRuleBuilder) SetCustomResolver(v bool) *FieldRuleBuilder {\n\tb.rule.CustomResolver = v\n\treturn b\n}\n\nfunc (b *FieldRuleBuilder) SetMessageCustomResolver(v bool) *FieldRuleBuilder {\n\tb.rule.MessageCustomResolver = v\n\treturn b\n}\n\nfunc (b *FieldRuleBuilder) SetAlias(v ...*resolver.Field) *FieldRuleBuilder {\n\tb.rule.Aliases = v\n\treturn b\n}\n\nfunc (b *FieldRuleBuilder) SetOneof(v *resolver.FieldOneofRule) *FieldRuleBuilder {\n\tb.rule.Oneof = v\n\treturn b\n}\n\nfunc (b *FieldRuleBuilder) Build(t *testing.T) *resolver.FieldRule {\n\tt.Helper()\n\treturn b.rule\n}\n\ntype DependencyGraphBuilder struct {\n\tgraph *resolver.MessageDependencyGraph\n}\n\nfunc NewDependencyGraphBuilder() *DependencyGraphBuilder {\n\treturn &DependencyGraphBuilder{\n\t\tgraph: &resolver.MessageDependencyGraph{},\n\t}\n}\n\nfunc (b *DependencyGraphBuilder) Add(parent *resolver.Message, children ...*resolver.Message) *DependencyGraphBuilder {\n\tnodes := make([]*resolver.MessageDependencyGraphNode, 0, len(children))\n\tfor _, child := range children {\n\t\tnodes = append(nodes, &resolver.MessageDependencyGraphNode{BaseMessage: child})\n\t}\n\tb.graph.Roots = append(b.graph.Roots, &resolver.MessageDependencyGraphNode{\n\t\tBaseMessage: parent,\n\t\tChildren:    nodes,\n\t})\n\treturn b\n}\n\nfunc (b *DependencyGraphBuilder) Build(t *testing.T) *resolver.MessageDependencyGraph {\n\tt.Helper()\n\treturn b.graph\n}\n\ntype ServiceRuleBuilder struct {\n\trule *resolver.ServiceRule\n}\n\nfunc NewServiceRuleBuilder() *ServiceRuleBuilder {\n\treturn &ServiceRuleBuilder{\n\t\trule: &resolver.ServiceRule{},\n\t}\n}\n\nfunc (b *ServiceRuleBuilder) SetEnv(env *resolver.Env) *ServiceRuleBuilder {\n\tb.rule.Env = env\n\treturn b\n}\n\nfunc (b *ServiceRuleBuilder) AddVar(svcVar *resolver.ServiceVariable) *ServiceRuleBuilder {\n\tb.rule.Vars = append(b.rule.Vars, svcVar)\n\treturn b\n}\n\nfunc (b *ServiceRuleBuilder) Build(t *testing.T) *resolver.ServiceRule {\n\tt.Helper()\n\treturn b.rule\n}\n\ntype EnvBuilder struct {\n\tenv *resolver.Env\n}\n\nfunc NewEnvBuilder() *EnvBuilder {\n\treturn &EnvBuilder{\n\t\tenv: &resolver.Env{},\n\t}\n}\n\nfunc (b *EnvBuilder) AddVar(v *resolver.EnvVar) *EnvBuilder {\n\tb.env.Vars = append(b.env.Vars, v)\n\treturn b\n}\n\nfunc (b *EnvBuilder) Build(t *testing.T) *resolver.Env {\n\tt.Helper()\n\treturn b.env\n}\n\ntype EnvVarBuilder struct {\n\tv *resolver.EnvVar\n}\n\nfunc NewEnvVarBuilder() *EnvVarBuilder {\n\treturn &EnvVarBuilder{\n\t\tv: &resolver.EnvVar{},\n\t}\n}\n\nfunc (b *EnvVarBuilder) SetName(name string) *EnvVarBuilder {\n\tb.v.Name = name\n\treturn b\n}\n\nfunc (b *EnvVarBuilder) SetType(typ *resolver.Type) *EnvVarBuilder {\n\tb.v.Type = typ\n\treturn b\n}\n\nfunc (b *EnvVarBuilder) SetOption(opt *resolver.EnvVarOption) *EnvVarBuilder {\n\tb.v.Option = opt\n\treturn b\n}\n\nfunc (b *EnvVarBuilder) Build(t *testing.T) *resolver.EnvVar {\n\tt.Helper()\n\treturn b.v\n}\n\ntype EnvVarOptionBuilder struct {\n\topt *resolver.EnvVarOption\n}\n\nfunc NewEnvVarOptionBuilder() *EnvVarOptionBuilder {\n\treturn &EnvVarOptionBuilder{\n\t\topt: &resolver.EnvVarOption{},\n\t}\n}\n\nfunc (b *EnvVarOptionBuilder) SetDefault(v string) *EnvVarOptionBuilder {\n\tb.opt.Default = v\n\treturn b\n}\n\nfunc (b *EnvVarOptionBuilder) SetAlternate(v string) *EnvVarOptionBuilder {\n\tb.opt.Alternate = v\n\treturn b\n}\n\nfunc (b *EnvVarOptionBuilder) SetRequired(v bool) *EnvVarOptionBuilder {\n\tb.opt.Required = v\n\treturn b\n}\n\nfunc (b *EnvVarOptionBuilder) SetIgnored(v bool) *EnvVarOptionBuilder {\n\tb.opt.Ignored = v\n\treturn b\n}\n\nfunc (b *EnvVarOptionBuilder) Build(t *testing.T) *resolver.EnvVarOption {\n\tt.Helper()\n\treturn b.opt\n}\n\ntype ServiceVariableBuilder struct {\n\tsvcVar *resolver.ServiceVariable\n}\n\nfunc NewServiceVariableBuilder() *ServiceVariableBuilder {\n\treturn &ServiceVariableBuilder{\n\t\tsvcVar: &resolver.ServiceVariable{},\n\t}\n}\n\nfunc (b *ServiceVariableBuilder) SetName(name string) *ServiceVariableBuilder {\n\tb.svcVar.Name = name\n\treturn b\n}\n\nfunc (b *ServiceVariableBuilder) SetIf(v string) *ServiceVariableBuilder {\n\tb.svcVar.If = &resolver.CELValue{\n\t\tExpr: v,\n\t\tOut:  resolver.BoolType,\n\t}\n\treturn b\n}\n\nfunc (b *ServiceVariableBuilder) SetBy(v *resolver.CELValue) *ServiceVariableBuilder {\n\tb.svcVar.Expr = &resolver.ServiceVariableExpr{\n\t\tBy:   v,\n\t\tType: v.Out,\n\t}\n\treturn b\n}\n\nfunc (b *ServiceVariableBuilder) SetMap(v *resolver.MapExpr) *ServiceVariableBuilder {\n\tmapExprType := v.Expr.Type.Clone()\n\tmapExprType.Repeated = true\n\tb.svcVar.Expr = &resolver.ServiceVariableExpr{\n\t\tMap:  v,\n\t\tType: mapExprType,\n\t}\n\treturn b\n}\n\nfunc (b *ServiceVariableBuilder) SetMessage(v *resolver.MessageExpr) *ServiceVariableBuilder {\n\tb.svcVar.Expr = &resolver.ServiceVariableExpr{\n\t\tMessage: v,\n\t\tType:    resolver.NewMessageType(v.Message, false),\n\t}\n\treturn b\n}\n\nfunc (b *ServiceVariableBuilder) SetEnum(v *resolver.EnumExpr) *ServiceVariableBuilder {\n\tb.svcVar.Expr = &resolver.ServiceVariableExpr{\n\t\tEnum: v,\n\t\tType: resolver.NewEnumType(v.Enum, false),\n\t}\n\treturn b\n}\n\nfunc (b *ServiceVariableBuilder) SetSwitch(v *resolver.SwitchExpr) *ServiceVariableBuilder {\n\tb.svcVar.Expr = &resolver.ServiceVariableExpr{\n\t\tSwitch: v,\n\t\tType:   v.Type,\n\t}\n\treturn b\n}\n\nfunc (b *ServiceVariableBuilder) SetValidation(v *resolver.ServiceVariableValidationExpr) *ServiceVariableBuilder {\n\tb.svcVar.Expr = &resolver.ServiceVariableExpr{\n\t\tValidation: v,\n\t\tType:       resolver.BoolType,\n\t}\n\treturn b\n}\n\nfunc (b *ServiceVariableBuilder) Build(t *testing.T) *resolver.ServiceVariable {\n\tt.Helper()\n\treturn b.svcVar\n}\n\ntype MethodRuleBuilder struct {\n\tduration string\n\trule     *resolver.MethodRule\n}\n\nfunc NewMethodRuleBuilder() *MethodRuleBuilder {\n\treturn &MethodRuleBuilder{\n\t\trule: &resolver.MethodRule{},\n\t}\n}\n\nfunc (b *MethodRuleBuilder) Timeout(duration string) *MethodRuleBuilder {\n\tb.duration = duration\n\treturn b\n}\n\nfunc (b *MethodRuleBuilder) Response(msg *resolver.Message) *MethodRuleBuilder {\n\tb.rule.Response = msg\n\treturn b\n}\n\nfunc (b *MethodRuleBuilder) Build(t *testing.T) *resolver.MethodRule {\n\tt.Helper()\n\tif b.duration != \"\" {\n\t\tduration, err := time.ParseDuration(b.duration)\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tb.rule.Timeout = &duration\n\t}\n\treturn b.rule\n}\n\ntype FieldOneofRuleBuilder struct {\n\terrs []error\n\trule *resolver.FieldOneofRule\n}\n\nfunc NewFieldOneofRuleBuilder() *FieldOneofRuleBuilder {\n\treturn &FieldOneofRuleBuilder{\n\t\trule: &resolver.FieldOneofRule{\n\t\t\tDefSet: &resolver.VariableDefinitionSet{},\n\t\t},\n\t}\n}\n\nfunc (b *FieldOneofRuleBuilder) SetIf(v string, out *resolver.Type) *FieldOneofRuleBuilder {\n\tb.rule.If = &resolver.CELValue{\n\t\tExpr: v,\n\t\tOut:  out,\n\t}\n\treturn b\n}\n\nfunc (b *FieldOneofRuleBuilder) SetDefault(v bool) *FieldOneofRuleBuilder {\n\tb.rule.Default = true\n\treturn b\n}\n\nfunc (b *FieldOneofRuleBuilder) AddVariableDefinition(def *resolver.VariableDefinition) *FieldOneofRuleBuilder {\n\tif def.Expr != nil && def.Expr.Map != nil && def.Expr.Map.Iterator != nil {\n\t\tname := def.Expr.Map.Iterator.Source.Name\n\t\tvar found bool\n\t\tfor _, varDef := range b.rule.DefSet.Definitions() {\n\t\t\tif varDef.Name == name {\n\t\t\t\tdef.Expr.Map.Iterator.Source = varDef\n\t\t\t\tfound = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif !found {\n\t\t\tb.errs = append(b.errs, fmt.Errorf(\"%s variable name is not found\", name))\n\t\t}\n\t}\n\tdef.Idx = len(b.rule.DefSet.Definitions())\n\tb.rule.DefSet.Defs = append(b.rule.DefSet.Defs, def)\n\treturn b\n}\n\nfunc (b *FieldOneofRuleBuilder) SetBy(expr string, out *resolver.Type) *FieldOneofRuleBuilder {\n\tb.rule.By = &resolver.CELValue{\n\t\tExpr: expr,\n\t\tOut:  out,\n\t}\n\treturn b\n}\n\nfunc (b *FieldOneofRuleBuilder) SetDependencyGraph(graph *resolver.MessageDependencyGraph) *FieldOneofRuleBuilder {\n\tb.rule.DefSet.Graph = graph\n\treturn b\n}\n\nfunc (b *FieldOneofRuleBuilder) AddVariableDefinitionGroup(group resolver.VariableDefinitionGroup) *FieldOneofRuleBuilder {\n\tb.rule.DefSet.Groups = append(b.rule.DefSet.Groups, group)\n\treturn b\n}\n\nfunc (b *FieldOneofRuleBuilder) Build(t *testing.T) *resolver.FieldOneofRule {\n\tt.Helper()\n\tif len(b.errs) != 0 {\n\t\tt.Fatal(errors.Join(b.errs...))\n\t}\n\treturn b.rule\n}\n"
  },
  {
    "path": "internal/testutil/cmpopt.go",
    "content": "package testutil\n\nimport (\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\n\t\"github.com/mercari/grpc-federation/resolver\"\n)\n\nfunc ResolverCmpOpts() []cmp.Option {\n\treturn []cmp.Option{\n\t\tcmpopts.IgnoreUnexported(resolver.VariableDefinition{}),\n\t\tcmpopts.IgnoreFields(resolver.File{}, \"Messages\", \"Services\", \"Enums\", \"Desc\", \"CELPlugins\", \"ImportFiles\"),\n\t\tcmpopts.IgnoreFields(resolver.Service{}, \"CELPlugins\", \"Desc\"),\n\t\tcmpopts.IgnoreFields(resolver.Package{}, \"Files\"),\n\t\tcmpopts.IgnoreFields(resolver.Method{}, \"Service\", \"Desc\"),\n\t\tcmpopts.IgnoreFields(resolver.Message{}, \"File\", \"ParentMessage\", \"Desc\"),\n\t\tcmpopts.IgnoreFields(resolver.Enum{}, \"File\", \"Message.Rule\"),\n\t\tcmpopts.IgnoreFields(resolver.EnumValue{}, \"Enum\"),\n\t\tcmpopts.IgnoreFields(resolver.EnumValueAlias{}, \"EnumAlias\"),\n\t\tcmpopts.IgnoreFields(resolver.EnumRule{}, \"Aliases\"),\n\t\tcmpopts.IgnoreFields(resolver.MessageRule{}, \"Aliases\"),\n\t\tcmpopts.IgnoreFields(resolver.MessageDependencyGraph{}, \"Roots\"),\n\t\tcmpopts.IgnoreFields(resolver.SequentialVariableDefinitionGroup{}, \"End.Idx\", \"End.If\", \"End.AutoBind\", \"End.Used\", \"End.Expr\"),\n\t\tcmpopts.IgnoreFields(resolver.ConcurrentVariableDefinitionGroup{}, \"End.Idx\", \"End.If\", \"End.AutoBind\", \"End.Used\", \"End.Expr\"),\n\t\tcmpopts.IgnoreFields(resolver.MessageDependencyGraphNode{}, \"BaseMessage\", \"VariableDefinition\", \"Parent\", \"ParentMap\", \"Children\", \"ChildrenMap\"),\n\t\tcmpopts.IgnoreFields(resolver.AllMessageDependencyGraph{}),\n\t\tcmpopts.IgnoreFields(resolver.AllMessageDependencyGraphNode{}, \"Parent\", \"Children\", \"Message.Rule\"),\n\t\tcmpopts.IgnoreFields(resolver.GRPCError{}, \"DefSet.Graph\", \"DefSet.Groups\"),\n\t\tcmpopts.IgnoreFields(resolver.GRPCErrorDetail{}, \"DefSet.Graph\", \"DefSet.Groups\", \"Messages.Graph\", \"Messages.Groups\"),\n\t\tcmpopts.IgnoreFields(resolver.AutoBindField{}, \"VariableDefinition\"),\n\t\tcmpopts.IgnoreFields(resolver.Type{}, \"Message.Rule\", \"Enum.Rule\", \"OneofField\"),\n\t\tcmpopts.IgnoreFields(resolver.Oneof{}, \"Message\"),\n\t\tcmpopts.IgnoreFields(resolver.Field{}, \"Message\", \"Oneof.Message\", \"Oneof.Fields\", \"Desc\"),\n\t\tcmpopts.IgnoreFields(resolver.Value{}, \"CEL\"),\n\t\tcmpopts.IgnoreFields(resolver.CELValue{}, \"CheckedExpr\"),\n\t\tcmpopts.IgnoreFields(resolver.MessageExpr{}, \"Message.Rule\", \"Message.Fields\"),\n\t}\n}\n"
  },
  {
    "path": "internal/testutil/compiler.go",
    "content": "package testutil\n\nimport (\n\t\"context\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"testing\"\n\n\t\"google.golang.org/protobuf/types/descriptorpb\"\n\n\t\"github.com/mercari/grpc-federation/compiler\"\n\t\"github.com/mercari/grpc-federation/source\"\n)\n\nfunc RepoRoot() string {\n\tp, _ := filepath.Abs(filepath.Join(curDir(), \"..\", \"..\"))\n\treturn p\n}\n\nfunc Compile(t *testing.T, path string) []*descriptorpb.FileDescriptorProto {\n\tt.Helper()\n\tcontent, err := os.ReadFile(path)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tfile, err := source.NewFile(path, content)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\topt := compiler.ImportPathOption(filepath.Join(RepoRoot(), \"proto\"))\n\tdesc, err := compiler.New().Compile(context.Background(), file, opt)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\treturn desc\n}\n\nfunc curDir() string {\n\t_, file, _, _ := runtime.Caller(0) //nolint:dogsled\n\treturn filepath.Dir(file)\n}\n"
  },
  {
    "path": "lsp/client/jetbrains/.gitignore",
    "content": ".gradle\n.idea\n.qodana\nbuild\n.intellijPlatform\n.kotlin\n"
  },
  {
    "path": "lsp/client/jetbrains/.run/Run IDE for UI Tests.run.xml",
    "content": "<component name=\"ProjectRunConfigurationManager\">\n  <configuration default=\"false\" name=\"Run IDE for UI Tests\" type=\"GradleRunConfiguration\" factoryName=\"Gradle\">\n    <log_file alias=\"idea.log\" path=\"$PROJECT_DIR$/build/idea-sandbox/system/log/idea.log\" />\n    <ExternalSystemSettings>\n      <option name=\"executionName\" />\n      <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\" />\n      <option name=\"externalSystemIdString\" value=\"GRADLE\" />\n      <option name=\"scriptParameters\" value=\"\" />\n      <option name=\"taskDescriptions\">\n        <list />\n      </option>\n      <option name=\"taskNames\">\n        <list>\n          <option value=\"runIdeForUiTests\" />\n        </list>\n      </option>\n      <option name=\"vmOptions\" />\n    </ExternalSystemSettings>\n    <ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>\n    <ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>\n    <DebugAllEnabled>false</DebugAllEnabled>\n    <RunAsTest>false</RunAsTest>\n    <method v=\"2\" />\n  </configuration>\n</component>"
  },
  {
    "path": "lsp/client/jetbrains/.run/Run Plugin.run.xml",
    "content": "<component name=\"ProjectRunConfigurationManager\">\n  <configuration default=\"false\" name=\"Run Plugin\" type=\"GradleRunConfiguration\" factoryName=\"Gradle\">\n    <log_file alias=\"idea.log\" path=\"$PROJECT_DIR$/build/idea-sandbox/system/log/idea.log\" />\n    <ExternalSystemSettings>\n      <option name=\"executionName\" />\n      <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\" />\n      <option name=\"externalSystemIdString\" value=\"GRADLE\" />\n      <option name=\"scriptParameters\" value=\"\" />\n      <option name=\"taskDescriptions\">\n        <list />\n      </option>\n      <option name=\"taskNames\">\n        <list>\n          <option value=\"runIde\" />\n        </list>\n      </option>\n      <option name=\"vmOptions\" value=\"\" />\n    </ExternalSystemSettings>\n    <ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>\n    <ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>\n    <DebugAllEnabled>false</DebugAllEnabled>\n    <method v=\"2\" />\n  </configuration>\n</component>"
  },
  {
    "path": "lsp/client/jetbrains/.run/Run Qodana.run.xml",
    "content": "<component name=\"ProjectRunConfigurationManager\">\n  <configuration default=\"false\" name=\"Run Qodana\" type=\"GradleRunConfiguration\" factoryName=\"Gradle\">\n    <ExternalSystemSettings>\n      <option name=\"executionName\" />\n      <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\" />\n      <option name=\"externalSystemIdString\" value=\"GRADLE\" />\n      <option name=\"scriptParameters\" value=\"\" />\n      <option name=\"taskDescriptions\">\n        <list />\n      </option>\n      <option name=\"taskNames\">\n        <list>\n          <option value=\"qodanaScan\" />\n        </list>\n      </option>\n      <option name=\"vmOptions\" />\n    </ExternalSystemSettings>\n    <ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>\n    <ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>\n    <DebugAllEnabled>false</DebugAllEnabled>\n    <RunAsTest>false</RunAsTest>\n    <method v=\"2\" />\n  </configuration>\n</component>"
  },
  {
    "path": "lsp/client/jetbrains/.run/Run Tests.run.xml",
    "content": "<component name=\"ProjectRunConfigurationManager\">\n  <configuration default=\"false\" name=\"Run Tests\" type=\"GradleRunConfiguration\" factoryName=\"Gradle\">\n    <log_file alias=\"idea.log\" path=\"$PROJECT_DIR$/build/idea-sandbox/system/log/idea.log\" />\n    <ExternalSystemSettings>\n      <option name=\"executionName\" />\n      <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\" />\n      <option name=\"externalSystemIdString\" value=\"GRADLE\" />\n      <option name=\"scriptParameters\" value=\"\" />\n      <option name=\"taskDescriptions\">\n        <list />\n      </option>\n      <option name=\"taskNames\">\n        <list>\n          <option value=\"check\" />\n        </list>\n      </option>\n      <option name=\"vmOptions\" value=\"\" />\n    </ExternalSystemSettings>\n    <ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>\n    <ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>\n    <DebugAllEnabled>false</DebugAllEnabled>\n    <RunAsTest>true</RunAsTest>\n    <method v=\"2\" />\n  </configuration>\n</component>\n"
  },
  {
    "path": "lsp/client/jetbrains/.run/Run Verifications.run.xml",
    "content": "<component name=\"ProjectRunConfigurationManager\">\n  <configuration default=\"false\" name=\"Run Verifications\" type=\"GradleRunConfiguration\" factoryName=\"Gradle\">\n    <log_file alias=\"idea.log\" path=\"$PROJECT_DIR$/build/idea-sandbox/system/log/idea.log\" />\n    <ExternalSystemSettings>\n      <option name=\"executionName\" />\n      <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\" />\n      <option name=\"externalSystemIdString\" value=\"GRADLE\" />\n      <option name=\"scriptParameters\" value=\"\" />\n      <option name=\"taskDescriptions\">\n        <list />\n      </option>\n      <option name=\"taskNames\">\n        <list>\n          <option value=\"runPluginVerifier\" />\n        </list>\n      </option>\n      <option name=\"vmOptions\" value=\"\" />\n    </ExternalSystemSettings>\n    <ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>\n    <ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>\n    <DebugAllEnabled>false</DebugAllEnabled>\n    <method v=\"2\">\n      <option name=\"Gradle.BeforeRunTask\" enabled=\"true\" tasks=\"clean\" externalProjectPath=\"$PROJECT_DIR$\" vmOptions=\"\" scriptParameters=\"\" />\n    </method>\n  </configuration>\n</component>"
  },
  {
    "path": "lsp/client/jetbrains/CHANGELOG.md",
    "content": "<!-- Keep a Changelog guide -> https://keepachangelog.com -->\n\n# gRPC Federation Changelog\n\n## [Unreleased]\n\n### Added\n- New list-based UI for Proto Import Paths configuration\n- Enable/disable toggle for individual import paths\n- File browser dialog for adding and editing paths\n- Path validation feature to check if directories exist\n- Variable expansion support for `~/` and `${PROJECT_ROOT}`\n- Toolbar buttons for add, remove, and reorder operations\n- \"Validate Paths\" button to verify all configured paths\n- Semantic tokens support for enhanced syntax highlighting of gRPC Federation annotations\n  - Token type mappings for proper colorization of proto elements\n  - Explicit semantic tokens request for proto files\n\n### Changed\n- Redesigned settings interface from single text field to table-based UI\n- Improved path management with better visual feedback\n- Enhanced user experience for managing multiple import paths\n- Migrated settings storage format from simple string list to structured entries with enable/disable state\n- Updated to IntelliJ Platform Gradle Plugin 2.7.2 (latest)\n- Updated to Platform Version 2024.3.3 with Kotlin 2.1.0\n- Updated JVM toolchain from Java 17 to Java 21 (recommended for 2024.3.3)\n- Changed LSP server descriptor from ProjectWideLspServerDescriptor to LspServerDescriptor for proper semantic tokens support\n\n### Fixed\n- Issue with paths containing spaces in the previous text field approach\n- Better handling of empty and invalid path entries\n- Checkbox display issue in the Enabled column with explicit renderer and editor\n- Diagnostic messages containing HTML tags (like `<input>`) are now properly escaped to prevent UI rendering issues\n\n### Deprecated\n- `importPaths` field in settings storage (will be removed in v0.3.0)\n  - Automatic migration: Existing configurations will be automatically converted to the new format\n  - The plugin maintains backward compatibility by reading from both old and new formats\n  - Only the new `importPathEntries` format will be supported from v0.3.0 onwards\n\n## [0.1.0]\n\n### Added\n- Initial release of gRPC Federation IntelliJ plugin\n- Basic Language Server Protocol (LSP) integration\n- Proto import paths configuration\n- Support for `.proto` files with gRPC Federation annotations\n"
  },
  {
    "path": "lsp/client/jetbrains/README.md",
    "content": "<!-- Plugin description -->\n# gRPC Federation Language Server for JetBrains\n\nThe gRPC Federation Language Server for JetBrains is a plugin designed for JetBrains IDEs to integrate with the gRPC Federation language server, providing enhanced development experience for Protocol Buffer files with gRPC Federation annotations.\n\n## Features\n\n- **Go to Definition** - Navigate to proto message and field definitions\n- **Diagnostics** - Real-time error detection and validation\n- **Code Completion** - Intelligent suggestions for gRPC Federation annotations\n\n## Requirements\n\n- **IntelliJ IDEA Ultimate** 2023.3 or newer (This plugin requires Ultimate Edition)\n- **grpc-federation-language-server** installed and available in PATH\n\n## Installation\n\n### Step 1: Install the Language Server\nThe plugin requires `grpc-federation-language-server` to be accessible in the system PATH. If Go is available, install it with:\n\n```console\n$ go install github.com/mercari/grpc-federation/cmd/grpc-federation-language-server@latest\n```\n\nVerify the installation:\n```console\n$ which grpc-federation-language-server\n```\n\n### Step 2: Install the Plugin\nInstall the plugin from JetBrains Marketplace:\n\n1. Open **Settings/Preferences** → **Plugins**\n2. Select **Marketplace** tab\n3. Search for **\"gRPC Federation\"**\n4. Click **Install** and restart the IDE\n\n## Configuration\n\n### Setting Import Paths\nConfigure proto import paths for the language server to resolve dependencies:\n\n1. Navigate to **Settings/Preferences** → **Tools** → **gRPC Federation**\n2. In the **Proto Import Paths** section:\n   - Click **+** to add a new path\n   - Use the file browser to select directories\n   - Enable/disable paths using checkboxes\n   - Reorder paths using ↑/↓ buttons\n   - Click **Validate Paths** to verify all directories exist\n\n### Supported Path Variables\n\n- `~/` - User's home directory\n- `${PROJECT_ROOT}` - Current project root directory\n\nExample paths:\n```\n/usr/local/include\n${PROJECT_ROOT}/proto\n~/workspace/shared-protos\n```\n\n## Troubleshooting\n\n### Language Server Not Found\nIf you see \"grpc-federation-language-server not found\" error:\n1. Ensure the language server is installed (see Installation section)\n2. Check if it's in your PATH: `which grpc-federation-language-server`\n3. Restart the IDE after installation\n\n### Proto Files Not Recognized\nIf proto files are not being analyzed:\n1. Ensure the file extension is `.proto`\n2. Check that import paths are correctly configured\n3. Validate paths using the **Validate Paths** button\n4. Check the IDE logs: **Help** → **Show Log in Finder/Explorer**\n\n### Import Resolution Issues\nIf imports are not being resolved:\n1. Add all necessary proto directories to import paths\n2. Ensure paths are in the correct order (more specific paths first)\n3. Check that all proto dependencies are available\n\n## Support\n\n- **Issues**: [GitHub Issues](https://github.com/mercari/grpc-federation/issues)\n- **Documentation**: [gRPC Federation Documentation](https://github.com/mercari/grpc-federation)\n\n<!-- Plugin description end -->\n"
  },
  {
    "path": "lsp/client/jetbrains/build.gradle.kts",
    "content": "import org.jetbrains.changelog.Changelog\nimport org.jetbrains.changelog.markdownToHTML\nimport org.jetbrains.intellij.platform.gradle.TestFrameworkType\n\nfun properties(key: String) = providers.gradleProperty(key)\nfun environment(key: String) = providers.environmentVariable(key)\n\nplugins {\n    id(\"java\") // Java support\n    alias(libs.plugins.kotlin) // Kotlin support\n    alias(libs.plugins.gradleIntelliJPlugin) // Gradle IntelliJ Platform Plugin\n    alias(libs.plugins.changelog) // Gradle Changelog Plugin\n    alias(libs.plugins.qodana) // Gradle Qodana Plugin\n    alias(libs.plugins.kover) // Gradle Kover Plugin\n}\n\ngroup = properties(\"pluginGroup\").get()\nversion = properties(\"pluginVersion\").get()\n\n// Configure project's dependencies\nrepositories {\n    mavenCentral()\n    \n    // IntelliJ Platform Gradle Plugin Repositories Extension - read more: https://plugins.jetbrains.com/docs/intellij/tools-intellij-platform-gradle-plugin-repositories-extension.html\n    intellijPlatform {\n        defaultRepositories()\n    }\n}\n\n// Dependencies are managed with Gradle version catalog - read more: https://docs.gradle.org/current/userguide/platforms.html#sub:version-catalog\ndependencies {\n//    implementation(libs.annotations)\n\n    // IntelliJ Platform Gradle Plugin Dependencies Extension - read more: https://plugins.jetbrains.com/docs/intellij/tools-intellij-platform-gradle-plugin-dependencies-extension.html\n    intellijPlatform {\n        create(properties(\"platformType\"), properties(\"platformVersion\"))\n        \n        // Plugin Dependencies. Uses `platformPlugins` property from the gradle.properties file.\n        bundledPlugins(properties(\"platformPlugins\").map { it.split(',').map(String::trim).filter(String::isNotEmpty) })\n        \n        pluginVerifier()\n        zipSigner()\n        testFramework(TestFrameworkType.Platform)\n    }\n}\n\n// Set the JVM language level used to build the project.\nkotlin {\n    jvmToolchain(21)\n}\n\n// Configure IntelliJ Platform Gradle Plugin - read more: https://plugins.jetbrains.com/docs/intellij/tools-intellij-platform-gradle-plugin-extension.html\nintellijPlatform {\n    pluginConfiguration {\n        version = properties(\"pluginVersion\")\n        name = properties(\"pluginName\")\n        \n        // Extract the <!-- Plugin description --> section from README.md and provide for the plugin's manifest\n        description = providers.fileContents(layout.projectDirectory.file(\"README.md\")).asText.map {\n            val start = \"<!-- Plugin description -->\"\n            val end = \"<!-- Plugin description end -->\"\n            \n            with (it.lines()) {\n                if (!containsAll(listOf(start, end))) {\n                    throw GradleException(\"Plugin description section not found in README.md:\\n$start ... $end\")\n                }\n                subList(indexOf(start) + 1, indexOf(end)).joinToString(\"\\n\").let(::markdownToHTML)\n            }\n        }\n        \n        val changelog = project.changelog // local variable for configuration cache compatibility\n        // Get the latest available change notes from the changelog file\n        changeNotes = properties(\"pluginVersion\").map { pluginVersion ->\n            with(changelog) {\n                renderItem(\n                    (getOrNull(pluginVersion) ?: getUnreleased())\n                        .withHeader(false)\n                        .withEmptySections(false),\n                    Changelog.OutputType.HTML,\n                )\n            }\n        }\n        \n        ideaVersion {\n            sinceBuild = properties(\"pluginSinceBuild\")\n            untilBuild = provider { null }\n        }\n    }\n    \n    publishing {\n        token = environment(\"PUBLISH_TOKEN\")\n        // The pluginVersion is based on the SemVer (https://semver.org) and supports pre-release labels, like 2.1.7-alpha.3\n        // Specify pre-release label to publish the plugin in a custom Release Channel automatically. Read more:\n        // https://plugins.jetbrains.com/docs/intellij/deployment.html#specifying-a-release-channel\n        channels = properties(\"pluginVersion\").map { listOf(it.substringAfter('-', \"\").substringBefore('.').ifEmpty { \"default\" }) }\n    }\n    \n    signing {\n        certificateChain = environment(\"CERTIFICATE_CHAIN\")\n        privateKey = environment(\"PRIVATE_KEY\")\n        password = environment(\"PRIVATE_KEY_PASSWORD\")\n    }\n    \n    pluginVerification {\n        ides {\n            recommended()\n        }\n    }\n}\n\n// Configure Gradle Changelog Plugin - read more: https://github.com/JetBrains/gradle-changelog-plugin\nchangelog {\n    groups.empty()\n    repositoryUrl = properties(\"pluginRepositoryUrl\")\n}\n\n// Configure Gradle Kover Plugin - read more: https://github.com/Kotlin/kotlinx-kover#configuration\nkover {\n    reports {\n        filters {\n            excludes {\n                // Exclude generated code and build files if needed\n            }\n        }\n    }\n}\n\ntasks {\n    wrapper {\n        gradleVersion = properties(\"gradleVersion\").get()\n    }\n    \n    publishPlugin {\n        dependsOn(\"patchChangelog\")\n    }\n}"
  },
  {
    "path": "lsp/client/jetbrains/gradle/libs.versions.toml",
    "content": "[versions]\n# libraries\nannotations = \"24.1.0\"\n\n# plugins\nkotlin = \"2.1.0\"\nchangelog = \"2.2.1\"\ngradleIntelliJPlugin = \"2.7.2\"\nqodana = \"2024.2.5\"\nkover = \"0.8.3\"\n\n[libraries]\nannotations = { group = \"org.jetbrains\", name = \"annotations\", version.ref = \"annotations\" }\n\n[plugins]\nchangelog = { id = \"org.jetbrains.changelog\", version.ref = \"changelog\" }\ngradleIntelliJPlugin = { id = \"org.jetbrains.intellij.platform\", version.ref = \"gradleIntelliJPlugin\" }\nkotlin = { id = \"org.jetbrains.kotlin.jvm\", version.ref = \"kotlin\" }\nkover = { id = \"org.jetbrains.kotlinx.kover\", version.ref = \"kover\" }\nqodana = { id = \"org.jetbrains.qodana\", version.ref = \"qodana\" }\n"
  },
  {
    "path": "lsp/client/jetbrains/gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-8.6-bin.zip\nnetworkTimeout=10000\nvalidateDistributionUrl=true\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n"
  },
  {
    "path": "lsp/client/jetbrains/gradle.properties",
    "content": "# IntelliJ Platform Artifacts Repositories -> https://plugins.jetbrains.com/docs/intellij/intellij-artifacts.html\n\npluginGroup = com.github.mercari.grpcfederation\npluginName = gRPC Federation\npluginRepositoryUrl = https://github.com/mercari/grpc-federation\n# SemVer format -> https://semver.org\npluginVersion = 0.2.0\n\n# Supported build number ranges and IntelliJ Platform versions -> https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html\npluginSinceBuild = 243\n# pluginUntilBuild is not set to allow the plugin to be compatible with future IDE versions.\n# This is relatively safe because:\n# 1. This plugin uses stable LSP (Language Server Protocol) APIs which are unlikely to break\n# 2. The plugin has minimal IDE integration surface area\n# 3. Users can install and test on newer versions without waiting for plugin updates\n# If compatibility issues arise in future versions, we can add the restriction then.\n# pluginUntilBuild =\n\n# IntelliJ Platform Properties -> https://plugins.jetbrains.com/docs/intellij/tools-gradle-intellij-plugin.html#configuration-intellij-extension\nplatformType = IU\nplatformVersion = 2024.3.3\n\n# Plugin Dependencies -> https://plugins.jetbrains.com/docs/intellij/plugin-dependencies.html\n# Example: platformPlugins = com.intellij.java, com.jetbrains.php:203.4449.22\nplatformPlugins =\n\n# Gradle Releases -> https://github.com/gradle/gradle/releases\ngradleVersion = 8.10\n\n# Opt-out flag for bundling Kotlin standard library -> https://jb.gg/intellij-platform-kotlin-stdlib\nkotlin.stdlib.default.dependency = false\n\n# Enable Gradle Configuration Cache -> https://docs.gradle.org/current/userguide/configuration_cache.html\norg.gradle.configuration-cache = true\n\n# Enable Gradle Build Cache -> https://docs.gradle.org/current/userguide/build_cache.html\norg.gradle.caching = true\n"
  },
  {
    "path": "lsp/client/jetbrains/gradlew",
    "content": "#!/bin/sh\n\n#\n# Copyright © 2015-2021 the original authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\n##############################################################################\n#\n#   Gradle start up script for POSIX generated by Gradle.\n#\n#   Important for running:\n#\n#   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is\n#       noncompliant, but you have some other compliant shell such as ksh or\n#       bash, then to run this script, type that shell name before the whole\n#       command line, like:\n#\n#           ksh Gradle\n#\n#       Busybox and similar reduced shells will NOT work, because this script\n#       requires all of these POSIX shell features:\n#         * functions;\n#         * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,\n#           «${var#prefix}», «${var%suffix}», and «$( cmd )»;\n#         * compound commands having a testable exit status, especially «case»;\n#         * various built-in commands including «command», «set», and «ulimit».\n#\n#   Important for patching:\n#\n#   (2) This script targets any POSIX shell, so it avoids extensions provided\n#       by Bash, Ksh, etc; in particular arrays are avoided.\n#\n#       The \"traditional\" practice of packing multiple parameters into a\n#       space-separated string is a well documented source of bugs and security\n#       problems, so this is (mostly) avoided, by progressively accumulating\n#       options in \"$@\", and eventually passing that to Java.\n#\n#       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,\n#       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;\n#       see the in-line comments for details.\n#\n#       There are tweaks for specific operating systems such as AIX, CygWin,\n#       Darwin, MinGW, and NonStop.\n#\n#   (3) This script is generated from the Groovy template\n#       https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt\n#       within the Gradle project.\n#\n#       You can find Gradle at https://github.com/gradle/gradle/.\n#\n##############################################################################\n\n# Attempt to set APP_HOME\n\n# Resolve links: $0 may be a link\napp_path=$0\n\n# Need this for daisy-chained symlinks.\nwhile\n    APP_HOME=${app_path%\"${app_path##*/}\"}  # leaves a trailing /; empty if no leading path\n    [ -h \"$app_path\" ]\ndo\n    ls=$( ls -ld \"$app_path\" )\n    link=${ls#*' -> '}\n    case $link in             #(\n      /*)   app_path=$link ;; #(\n      *)    app_path=$APP_HOME$link ;;\n    esac\ndone\n\n# This is normally unused\n# shellcheck disable=SC2034\nAPP_BASE_NAME=${0##*/}\n# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)\nAPP_HOME=$( cd \"${APP_HOME:-./}\" > /dev/null && pwd -P ) || exit\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=maximum\n\nwarn () {\n    echo \"$*\"\n} >&2\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n} >&2\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"$( uname )\" in                #(\n  CYGWIN* )         cygwin=true  ;; #(\n  Darwin* )         darwin=true  ;; #(\n  MSYS* | MINGW* )  msys=true    ;; #(\n  NONSTOP* )        nonstop=true ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=$JAVA_HOME/jre/sh/java\n    else\n        JAVACMD=$JAVA_HOME/bin/java\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=java\n    if ! command -v java >/dev/null 2>&1\n    then\n        die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nfi\n\n# Increase the maximum file descriptors if we can.\nif ! \"$cygwin\" && ! \"$darwin\" && ! \"$nonstop\" ; then\n    case $MAX_FD in #(\n      max*)\n        # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.\n        # shellcheck disable=SC2039,SC3045\n        MAX_FD=$( ulimit -H -n ) ||\n            warn \"Could not query maximum file descriptor limit\"\n    esac\n    case $MAX_FD in  #(\n      '' | soft) :;; #(\n      *)\n        # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.\n        # shellcheck disable=SC2039,SC3045\n        ulimit -n \"$MAX_FD\" ||\n            warn \"Could not set maximum file descriptor limit to $MAX_FD\"\n    esac\nfi\n\n# Collect all arguments for the java command, stacking in reverse order:\n#   * args from the command line\n#   * the main class name\n#   * -classpath\n#   * -D...appname settings\n#   * --module-path (only if needed)\n#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.\n\n# For Cygwin or MSYS, switch paths to Windows format before running java\nif \"$cygwin\" || \"$msys\" ; then\n    APP_HOME=$( cygpath --path --mixed \"$APP_HOME\" )\n    CLASSPATH=$( cygpath --path --mixed \"$CLASSPATH\" )\n\n    JAVACMD=$( cygpath --unix \"$JAVACMD\" )\n\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    for arg do\n        if\n            case $arg in                                #(\n              -*)   false ;;                            # don't mess with options #(\n              /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath\n                    [ -e \"$t\" ] ;;                      #(\n              *)    false ;;\n            esac\n        then\n            arg=$( cygpath --path --ignore --mixed \"$arg\" )\n        fi\n        # Roll the args list around exactly as many times as the number of\n        # args, so each arg winds up back in the position where it started, but\n        # possibly modified.\n        #\n        # NB: a `for` loop captures its iteration list before it begins, so\n        # changing the positional parameters here affects neither the number of\n        # iterations, nor the values presented in `arg`.\n        shift                   # remove old arg\n        set -- \"$@\" \"$arg\"      # push replacement arg\n    done\nfi\n\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS='\"-Xmx64m\" \"-Xms64m\"'\n\n# Collect all arguments for the java command:\n#   * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,\n#     and any embedded shellness will be escaped.\n#   * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be\n#     treated as '${Hostname}' itself on the command line.\n\nset -- \\\n        \"-Dorg.gradle.appname=$APP_BASE_NAME\" \\\n        -classpath \"$CLASSPATH\" \\\n        org.gradle.wrapper.GradleWrapperMain \\\n        \"$@\"\n\n# Stop when \"xargs\" is not available.\nif ! command -v xargs >/dev/null 2>&1\nthen\n    die \"xargs is not available\"\nfi\n\n# Use \"xargs\" to parse quoted args.\n#\n# With -n1 it outputs one arg per line, with the quotes and backslashes removed.\n#\n# In Bash we could simply go:\n#\n#   readarray ARGS < <( xargs -n1 <<<\"$var\" ) &&\n#   set -- \"${ARGS[@]}\" \"$@\"\n#\n# but POSIX shell has neither arrays nor command substitution, so instead we\n# post-process each arg (as a line of input to sed) to backslash-escape any\n# character that might be a shell metacharacter, then use eval to reverse\n# that process (while maintaining the separation between arguments), and wrap\n# the whole thing up as a single \"set\" statement.\n#\n# This will of course break if any of these variables contains a newline or\n# an unmatched quote.\n#\n\neval \"set -- $(\n        printf '%s\\n' \"$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\" |\n        xargs -n1 |\n        sed ' s~[^-[:alnum:]+,./:=@_]~\\\\&~g; ' |\n        tr '\\n' ' '\n    )\" '\"$@\"'\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "lsp/client/jetbrains/gradlew.bat",
    "content": "@rem\n@rem Copyright 2015 the original author or authors.\n@rem\n@rem Licensed under the Apache License, Version 2.0 (the \"License\");\n@rem you may not use this file except in compliance with the License.\n@rem You may obtain a copy of the License at\n@rem\n@rem      https://www.apache.org/licenses/LICENSE-2.0\n@rem\n@rem Unless required by applicable law or agreed to in writing, software\n@rem distributed under the License is distributed on an \"AS IS\" BASIS,\n@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n@rem See the License for the specific language governing permissions and\n@rem limitations under the License.\n@rem\n\n@if \"%DEBUG%\"==\"\" @echo off\n@rem ##########################################################################\n@rem\n@rem  Gradle startup script for Windows\n@rem\n@rem ##########################################################################\n\n@rem Set local scope for the variables with windows NT shell\nif \"%OS%\"==\"Windows_NT\" setlocal\n\nset DIRNAME=%~dp0\nif \"%DIRNAME%\"==\"\" set DIRNAME=.\n@rem This is normally unused\nset APP_BASE_NAME=%~n0\nset APP_HOME=%DIRNAME%\n\n@rem Resolve any \".\" and \"..\" in APP_HOME to make it shorter.\nfor %%i in (\"%APP_HOME%\") do set APP_HOME=%%~fi\n\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nset DEFAULT_JVM_OPTS=\"-Xmx64m\" \"-Xms64m\"\n\n@rem Find java.exe\nif defined JAVA_HOME goto findJavaFromJavaHome\n\nset JAVA_EXE=java.exe\n%JAVA_EXE% -version >NUL 2>&1\nif %ERRORLEVEL% equ 0 goto execute\n\necho. 1>&2\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2\necho. 1>&2\necho Please set the JAVA_HOME variable in your environment to match the 1>&2\necho location of your Java installation. 1>&2\n\ngoto fail\n\n:findJavaFromJavaHome\nset JAVA_HOME=%JAVA_HOME:\"=%\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\n\nif exist \"%JAVA_EXE%\" goto execute\n\necho. 1>&2\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2\necho. 1>&2\necho Please set the JAVA_HOME variable in your environment to match the 1>&2\necho location of your Java installation. 1>&2\n\ngoto fail\n\n:execute\n@rem Setup the command line\n\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\n\n\n@rem Execute Gradle\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %*\n\n:end\n@rem End local scope for the variables with windows NT shell\nif %ERRORLEVEL% equ 0 goto mainEnd\n\n:fail\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\nrem the _cmd.exe /c_ return code!\nset EXIT_CODE=%ERRORLEVEL%\nif %EXIT_CODE% equ 0 set EXIT_CODE=1\nif not \"\"==\"%GRADLE_EXIT_CONSOLE%\" exit %EXIT_CODE%\nexit /b %EXIT_CODE%\n\n:mainEnd\nif \"%OS%\"==\"Windows_NT\" endlocal\n\n:omega\n"
  },
  {
    "path": "lsp/client/jetbrains/qodana.yml",
    "content": "# Qodana configuration:\n# https://www.jetbrains.com/help/qodana/qodana-yaml.html\n\nversion: 1.0\nlinter: jetbrains/qodana-jvm-community:latest\nprojectJDK: \"17\"\nprofile:\n  name: qodana.recommended\nexclude:\n  - name: All\n    paths:\n      - .qodana\n"
  },
  {
    "path": "lsp/client/jetbrains/settings.gradle.kts",
    "content": "plugins {\n    id(\"org.gradle.toolchains.foojay-resolver-convention\") version \"0.8.0\"\n}\n\nrootProject.name = \"grpc-federation\"\n"
  },
  {
    "path": "lsp/client/jetbrains/src/main/kotlin/com/github/mercari/grpcfederation/GrpcFederationBundle.kt",
    "content": "package com.github.mercari.grpcfederation\n\nimport com.intellij.DynamicBundle\nimport org.jetbrains.annotations.NonNls\nimport org.jetbrains.annotations.PropertyKey\n\n@NonNls\nprivate const val BUNDLE = \"messages.GrpcFederationBundle\"\n\nobject GrpcFederationBundle : DynamicBundle(BUNDLE) {\n\n    @JvmStatic\n    fun message(@PropertyKey(resourceBundle = BUNDLE) key: String, vararg params: Any) =\n        getMessage(key, *params)\n\n    @Suppress(\"unused\")\n    @JvmStatic\n    fun messagePointer(@PropertyKey(resourceBundle = BUNDLE) key: String, vararg params: Any) =\n        getLazyMessage(key, *params)\n}\n"
  },
  {
    "path": "lsp/client/jetbrains/src/main/kotlin/com/github/mercari/grpcfederation/lsp/GrpcFederationLspServerSupportProvider.kt",
    "content": "package com.github.mercari.grpcfederation.lsp\n\nimport com.github.mercari.grpcfederation.settings.PathUtils\nimport com.github.mercari.grpcfederation.settings.projectSettings\nimport com.intellij.execution.configurations.GeneralCommandLine\nimport com.intellij.openapi.project.Project\nimport com.intellij.openapi.vfs.VirtualFile\nimport com.intellij.openapi.editor.DefaultLanguageHighlighterColors\nimport com.intellij.openapi.editor.colors.TextAttributesKey\nimport com.intellij.platform.lsp.api.LspServerDescriptor\nimport com.intellij.platform.lsp.api.LspServerSupportProvider\nimport com.intellij.platform.lsp.api.customization.LspSemanticTokensSupport\nimport com.intellij.platform.lsp.api.customization.LspDiagnosticsSupport\nimport com.intellij.psi.PsiFile\nimport com.intellij.openapi.util.text.StringUtil\nimport org.eclipse.lsp4j.Diagnostic\n\ninternal class GrpcFederationLspServerSupportProvider : LspServerSupportProvider {\n    override fun fileOpened(project: Project, file: VirtualFile, serverStarter: LspServerSupportProvider.LspServerStarter) {\n        if (file.extension == \"proto\") {\n            serverStarter.ensureServerStarted(GrpcFederationLspServerDescriptor(project))\n        }\n    }\n}\n\nprivate class GrpcFederationLspServerDescriptor(project: Project) : LspServerDescriptor(project, \"gRPC Federation\") {\n    override fun isSupportedFile(file: VirtualFile) = file.extension == \"proto\"\n    \n    // Enable diagnostics support with HTML escaping\n    override val lspDiagnosticsSupport: LspDiagnosticsSupport = object : LspDiagnosticsSupport() {\n        override fun getTooltip(diagnostic: Diagnostic): String {\n            // Escape HTML/XML entities in the diagnostic message to prevent UI issues\n            // The tooltip is rendered as HTML, so we need to escape special characters\n            // Always use <pre> tag to preserve formatting and ensure consistent display\n            val escapedMessage = StringUtil.escapeXmlEntities(diagnostic.message)\n            return \"<pre>$escapedMessage</pre>\"\n        }\n    }\n    \n    // Enable semantic tokens support for gRPC Federation syntax highlighting\n    override val lspSemanticTokensSupport: LspSemanticTokensSupport = object : LspSemanticTokensSupport() {\n        override fun shouldAskServerForSemanticTokens(psiFile: PsiFile): Boolean {\n            // Always request semantic tokens for proto files\n            return psiFile.virtualFile?.extension == \"proto\"\n        }\n        \n        override fun getTextAttributesKey(\n            tokenType: String,\n            modifiers: List<String>\n        ): TextAttributesKey? {\n            return when (tokenType) {\n                // Types\n                \"type\" -> DefaultLanguageHighlighterColors.CLASS_NAME\n                \"class\" -> DefaultLanguageHighlighterColors.CLASS_NAME\n                \"enum\" -> DefaultLanguageHighlighterColors.CLASS_NAME\n                \"interface\" -> DefaultLanguageHighlighterColors.INTERFACE_NAME\n                \"struct\" -> DefaultLanguageHighlighterColors.CLASS_NAME\n                \"typeParameter\" -> DefaultLanguageHighlighterColors.CLASS_NAME\n                \n                // Variables and properties\n                \"variable\" -> when {\n                    modifiers.contains(\"readonly\") -> DefaultLanguageHighlighterColors.CONSTANT\n                    modifiers.contains(\"static\") -> DefaultLanguageHighlighterColors.STATIC_FIELD\n                    else -> DefaultLanguageHighlighterColors.LOCAL_VARIABLE\n                }\n                \"property\" -> when {\n                    modifiers.contains(\"static\") -> DefaultLanguageHighlighterColors.STATIC_FIELD\n                    else -> DefaultLanguageHighlighterColors.INSTANCE_FIELD\n                }\n                \"parameter\" -> DefaultLanguageHighlighterColors.PARAMETER\n                \n                // Functions and methods\n                \"function\" -> when {\n                    modifiers.contains(\"declaration\") -> DefaultLanguageHighlighterColors.FUNCTION_DECLARATION\n                    else -> DefaultLanguageHighlighterColors.FUNCTION_CALL\n                }\n                \"method\" -> when {\n                    modifiers.contains(\"static\") -> DefaultLanguageHighlighterColors.STATIC_METHOD\n                    else -> DefaultLanguageHighlighterColors.INSTANCE_METHOD\n                }\n                \n                // Other\n                \"namespace\" -> DefaultLanguageHighlighterColors.CLASS_NAME\n                \"enumMember\" -> DefaultLanguageHighlighterColors.CONSTANT\n                \"keyword\" -> DefaultLanguageHighlighterColors.KEYWORD\n                \"string\" -> DefaultLanguageHighlighterColors.STRING\n                \"number\" -> DefaultLanguageHighlighterColors.NUMBER\n                \"comment\" -> DefaultLanguageHighlighterColors.LINE_COMMENT\n                \"operator\" -> DefaultLanguageHighlighterColors.OPERATION_SIGN\n                \n                // gRPC Federation specific\n                \"decorator\" -> DefaultLanguageHighlighterColors.METADATA  // for annotations like grpc.federation\n                \n                else -> null\n            }\n        }\n    }\n    \n    override fun createCommandLine(): GeneralCommandLine {\n        val state = project.projectSettings.currentState\n        val cmd = mutableListOf<String>()\n        cmd.add(\"grpc-federation-language-server\")\n        \n        // Use new format (importPathEntries) if available, otherwise fall back to legacy format\n        // TODO: Remove legacy format support in v0.3.0\n        val paths = if (state.importPathEntries.isNotEmpty()) {\n            state.importPathEntries.filter { it.enabled }.map { it.path }\n        } else {\n            // Legacy format: all paths are considered enabled\n            state.importPaths\n        }\n        \n        for (p in paths) {\n            if (p.isNotEmpty()) {\n                cmd.add(\"-I\")\n                cmd.add(PathUtils.expandPath(p, project))\n            }\n        }\n        return GeneralCommandLine(cmd)\n    }\n}"
  },
  {
    "path": "lsp/client/jetbrains/src/main/kotlin/com/github/mercari/grpcfederation/settings/ImportPathTableModel.kt",
    "content": "package com.github.mercari.grpcfederation.settings\n\nimport com.intellij.util.ui.ItemRemovable\nimport javax.swing.table.AbstractTableModel\n\nclass ImportPathTableModel : AbstractTableModel(), ItemRemovable {\n    private val entries = mutableListOf<ProjectSettingsService.ImportPathEntry>()\n    \n    companion object {\n        private const val COLUMN_ENABLED = 0\n        private const val COLUMN_PATH = 1\n        private val COLUMN_NAMES = arrayOf(\"Enabled\", \"Import Path\")\n        private val COLUMN_CLASSES = arrayOf(Boolean::class.java, String::class.java)\n    }\n\n    fun getEntries(): List<ProjectSettingsService.ImportPathEntry> = entries.toList()\n    \n    fun setEntries(newEntries: List<ProjectSettingsService.ImportPathEntry>) {\n        entries.clear()\n        entries.addAll(newEntries)\n        fireTableDataChanged()\n    }\n    \n    fun addEntry(entry: ProjectSettingsService.ImportPathEntry) {\n        entries.add(entry)\n        fireTableRowsInserted(entries.size - 1, entries.size - 1)\n    }\n    \n    fun removeEntry(index: Int) {\n        if (index >= 0 && index < entries.size) {\n            entries.removeAt(index)\n            fireTableRowsDeleted(index, index)\n        }\n    }\n    \n    fun moveUp(index: Int) {\n        if (index > 0 && index < entries.size) {\n            val entry = entries.removeAt(index)\n            entries.add(index - 1, entry)\n            fireTableRowsUpdated(index - 1, index)\n        }\n    }\n    \n    fun moveDown(index: Int) {\n        if (index >= 0 && index < entries.size - 1) {\n            val entry = entries.removeAt(index)\n            entries.add(index + 1, entry)\n            fireTableRowsUpdated(index, index + 1)\n        }\n    }\n    \n    override fun getRowCount(): Int = entries.size\n    \n    override fun getColumnCount(): Int = COLUMN_NAMES.size\n    \n    override fun getColumnName(column: Int): String = COLUMN_NAMES[column]\n    \n    override fun getColumnClass(column: Int): Class<*> = COLUMN_CLASSES[column]\n    \n    override fun isCellEditable(rowIndex: Int, columnIndex: Int): Boolean = true\n    \n    override fun getValueAt(rowIndex: Int, columnIndex: Int): Any? {\n        if (rowIndex >= entries.size) return null\n        \n        val entry = entries[rowIndex]\n        return when (columnIndex) {\n            COLUMN_ENABLED -> entry.enabled\n            COLUMN_PATH -> entry.path\n            else -> null\n        }\n    }\n    \n    override fun setValueAt(value: Any?, rowIndex: Int, columnIndex: Int) {\n        if (rowIndex >= entries.size) return\n        \n        val entry = entries[rowIndex]\n        when (columnIndex) {\n            COLUMN_ENABLED -> entry.enabled = value as? Boolean ?: true\n            COLUMN_PATH -> entry.path = value as? String ?: \"\"\n        }\n        fireTableCellUpdated(rowIndex, columnIndex)\n    }\n    \n    override fun removeRow(idx: Int) {\n        removeEntry(idx)\n    }\n}"
  },
  {
    "path": "lsp/client/jetbrains/src/main/kotlin/com/github/mercari/grpcfederation/settings/PathUtils.kt",
    "content": "package com.github.mercari.grpcfederation.settings\n\nimport com.intellij.openapi.project.Project\n\n/**\n * Utility object for path-related operations.\n */\nobject PathUtils {\n    /**\n     * Expands a path string by replacing user home directory (~) and project root variables.\n     *\n     * @param path The path to expand\n     * @param project The current project (used for ${PROJECT_ROOT} expansion)\n     * @return The expanded path\n     */\n    fun expandPath(path: String, project: Project): String {\n        var expanded = path\n        \n        // Expand user home directory\n        if (path.startsWith(\"~/\")) {\n            expanded = System.getProperty(\"user.home\") + path.substring(1)\n        }\n        \n        // Expand project root variable\n        if (path.contains(\"\\${PROJECT_ROOT}\")) {\n            expanded = expanded.replace(\"\\${PROJECT_ROOT}\", project.basePath ?: \"\")\n        }\n        \n        // Additional variable expansions can be added here in the future\n        \n        return expanded\n    }\n}"
  },
  {
    "path": "lsp/client/jetbrains/src/main/kotlin/com/github/mercari/grpcfederation/settings/ProjectSettingsConfigurable.kt",
    "content": "package com.github.mercari.grpcfederation.settings\n\nimport com.github.mercari.grpcfederation.GrpcFederationBundle\nimport com.intellij.openapi.fileChooser.FileChooserDescriptorFactory\nimport com.intellij.openapi.options.Configurable\nimport com.intellij.openapi.project.Project\nimport com.intellij.openapi.ui.TextBrowseFolderListener\nimport com.intellij.openapi.ui.TextFieldWithBrowseButton\nimport com.intellij.ui.AnActionButton\nimport com.intellij.ui.AnActionButtonRunnable\nimport com.intellij.ui.TableUtil\nimport com.intellij.ui.ToolbarDecorator\nimport com.intellij.ui.table.JBTable\nimport com.intellij.util.ui.JBUI\nimport java.awt.BorderLayout\nimport java.awt.Component\nimport java.io.File\nimport javax.swing.*\nimport javax.swing.table.DefaultTableCellRenderer\nimport javax.swing.table.TableCellRenderer\n\nclass ProjectSettingsConfigurable(\n        private val project: Project,\n) : Configurable {\n    private var mainPanel: JPanel? = null\n    private val tableModel = ImportPathTableModel()\n    private var table: JBTable? = null\n    private var isModified = false\n    \n    override fun getDisplayName(): String = GrpcFederationBundle.message(\"settings.grpcfederation.title\")\n    \n    override fun createComponent(): JComponent {\n        mainPanel = JPanel(BorderLayout())\n        \n        // Load current settings into the model\n        loadCurrentSettings()\n        \n        // Create the table\n        table = JBTable(tableModel).apply {\n            setShowGrid(false)\n            intercellSpacing = JBUI.emptySize()\n            emptyText.text = \"No import paths configured\"\n            \n            // Set column widths and configure checkbox for Enabled column\n            columnModel.getColumn(0).apply {\n                preferredWidth = 60\n                maxWidth = 60\n                \n                // Set up checkbox renderer\n                val checkBoxRenderer = object : TableCellRenderer {\n                    private val checkBox = JCheckBox()\n                    override fun getTableCellRendererComponent(\n                        table: JTable,\n                        value: Any?,\n                        isSelected: Boolean,\n                        hasFocus: Boolean,\n                        row: Int,\n                        column: Int\n                    ): Component {\n                        checkBox.isSelected = value as? Boolean ?: true\n                        checkBox.horizontalAlignment = SwingConstants.CENTER\n                        checkBox.background = if (isSelected) table.selectionBackground else table.background\n                        return checkBox\n                    }\n                }\n                cellRenderer = checkBoxRenderer\n                \n                // Set up checkbox editor\n                cellEditor = DefaultCellEditor(JCheckBox().apply {\n                    horizontalAlignment = SwingConstants.CENTER\n                })\n            }\n            columnModel.getColumn(1).preferredWidth = 400\n        }\n        \n        // Create toolbar with buttons\n        val decorator = ToolbarDecorator.createDecorator(table!!)\n                .setAddAction { _ ->\n                    showAddPathDialog()\n                }\n                .setRemoveAction { _ ->\n                    table?.let { TableUtil.removeSelectedItems(it) }\n                    isModified = true\n                }\n                .setMoveUpAction { _ ->\n                    val selectedRow = table!!.selectedRow\n                    if (selectedRow > 0) {\n                        tableModel.moveUp(selectedRow)\n                        table!!.setRowSelectionInterval(selectedRow - 1, selectedRow - 1)\n                        isModified = true\n                    }\n                }\n                .setMoveDownAction { _ ->\n                    val selectedRow = table!!.selectedRow\n                    if (selectedRow >= 0 && selectedRow < tableModel.rowCount - 1) {\n                        tableModel.moveDown(selectedRow)\n                        table!!.setRowSelectionInterval(selectedRow + 1, selectedRow + 1)\n                        isModified = true\n                    }\n                }\n                .addExtraAction(object : AnActionButton(\"Browse\", com.intellij.icons.AllIcons.Actions.Menu_open) {\n                    override fun actionPerformed(e: com.intellij.openapi.actionSystem.AnActionEvent) {\n                        val selectedRow = table!!.selectedRow\n                        if (selectedRow >= 0) {\n                            showEditPathDialog(selectedRow)\n                        }\n                    }\n                    \n                    override fun isEnabled(): Boolean {\n                        return table!!.selectedRow >= 0\n                    }\n                })\n        \n        // Add validation button\n        val validateButton = JButton(\"Validate Paths\").apply {\n            addActionListener {\n                validatePaths()\n            }\n        }\n        \n        val decoratorPanel = decorator.createPanel()\n        \n        // Layout\n        mainPanel!!.add(decoratorPanel, BorderLayout.CENTER)\n        \n        val bottomPanel = JPanel().apply {\n            layout = BoxLayout(this, BoxLayout.X_AXIS)\n            border = JBUI.Borders.emptyTop(8)\n            add(validateButton)\n            add(Box.createHorizontalGlue())\n        }\n        mainPanel!!.add(bottomPanel, BorderLayout.SOUTH)\n        \n        // Add listener for table changes\n        tableModel.addTableModelListener {\n            isModified = true\n        }\n        \n        return mainPanel!!\n    }\n    \n    private fun loadCurrentSettings() {\n        val currentState = project.projectSettings.currentState\n        \n        // Check if we have new format entries\n        if (currentState.importPathEntries.isNotEmpty()) {\n            tableModel.setEntries(currentState.importPathEntries.map {\n                ProjectSettingsService.ImportPathEntry(it.path, it.enabled)\n            })\n        } else if (currentState.importPaths.isNotEmpty()) {\n            // Automatic migration from legacy format: all paths are considered enabled by default\n            // Legacy format will be removed in v0.3.0\n            tableModel.setEntries(currentState.importPaths.map {\n                ProjectSettingsService.ImportPathEntry(it, true)\n            })\n        }\n    }\n    \n    private fun showAddPathDialog() {\n        val textField = TextFieldWithBrowseButton()\n        val descriptor = FileChooserDescriptorFactory.createSingleFolderDescriptor()\n        descriptor.title = \"Select Proto Import Path\"\n        textField.addBrowseFolderListener(TextBrowseFolderListener(descriptor, project))\n        \n        val panel = JPanel(BorderLayout()).apply {\n            add(JLabel(\"Path:\"), BorderLayout.WEST)\n            add(textField, BorderLayout.CENTER)\n            preferredSize = JBUI.size(400, 30)\n        }\n        \n        val result = JOptionPane.showConfirmDialog(\n                mainPanel,\n                panel,\n                \"Add Import Path\",\n                JOptionPane.OK_CANCEL_OPTION,\n                JOptionPane.PLAIN_MESSAGE\n        )\n        \n        if (result == JOptionPane.OK_OPTION && textField.text.isNotEmpty()) {\n            tableModel.addEntry(ProjectSettingsService.ImportPathEntry(textField.text, true))\n            isModified = true\n        }\n    }\n    \n    private fun showEditPathDialog(row: Int) {\n        val currentPath = tableModel.getValueAt(row, 1) as String\n        val textField = TextFieldWithBrowseButton()\n        textField.text = currentPath\n        \n        val descriptor = FileChooserDescriptorFactory.createSingleFolderDescriptor()\n        descriptor.title = \"Select Proto Import Path\"\n        textField.addBrowseFolderListener(TextBrowseFolderListener(descriptor, project))\n        \n        val panel = JPanel(BorderLayout()).apply {\n            add(JLabel(\"Path:\"), BorderLayout.WEST)\n            add(textField, BorderLayout.CENTER)\n            preferredSize = JBUI.size(400, 30)\n        }\n        \n        val result = JOptionPane.showConfirmDialog(\n                mainPanel,\n                panel,\n                \"Edit Import Path\",\n                JOptionPane.OK_CANCEL_OPTION,\n                JOptionPane.PLAIN_MESSAGE\n        )\n        \n        if (result == JOptionPane.OK_OPTION && textField.text.isNotEmpty()) {\n            tableModel.setValueAt(textField.text, row, 1)\n            isModified = true\n        }\n    }\n    \n    private fun validatePaths() {\n        val entries = tableModel.getEntries()\n        val invalidPaths = mutableListOf<String>()\n        \n        for (entry in entries) {\n            if (entry.enabled) {\n                val path = PathUtils.expandPath(entry.path, project)\n                val file = File(path)\n                if (!file.exists() || !file.isDirectory) {\n                    invalidPaths.add(entry.path)\n                }\n            }\n        }\n        \n        if (invalidPaths.isEmpty()) {\n            JOptionPane.showMessageDialog(\n                    mainPanel,\n                    \"All enabled paths are valid.\",\n                    \"Validation Result\",\n                    JOptionPane.INFORMATION_MESSAGE\n            )\n        } else {\n            JOptionPane.showMessageDialog(\n                    mainPanel,\n                    \"The following paths are invalid:\\n\" + invalidPaths.joinToString(\"\\n\"),\n                    \"Validation Result\",\n                    JOptionPane.WARNING_MESSAGE\n            )\n        }\n    }\n    \n    override fun isModified(): Boolean {\n        if (isModified) return true\n        \n        val currentEntries = project.projectSettings.currentState.importPathEntries\n        val tableEntries = tableModel.getEntries()\n        \n        if (currentEntries.size != tableEntries.size) return true\n        \n        return !currentEntries.zip(tableEntries).all { (current, table) ->\n            current.path == table.path && current.enabled == table.enabled\n        }\n    }\n    \n    override fun apply() {\n        val entries = tableModel.getEntries()\n        val newState = ProjectSettingsService.State(\n                // Maintain legacy field for backward compatibility (only enabled paths)\n                // TODO: Remove this field assignment in v0.3.0\n                importPaths = entries.filter { it.enabled }.map { it.path }.toMutableList(),\n                // Primary storage format from v0.2.0 onwards\n                importPathEntries = entries.map { \n                    ProjectSettingsService.ImportPathEntry(it.path, it.enabled) \n                }.toMutableList()\n        )\n        project.projectSettings.currentState = newState\n        isModified = false\n    }\n    \n    override fun reset() {\n        loadCurrentSettings()\n        isModified = false\n    }\n    \n    override fun disposeUIResources() {\n        mainPanel = null\n        table = null\n    }\n}"
  },
  {
    "path": "lsp/client/jetbrains/src/main/kotlin/com/github/mercari/grpcfederation/settings/ProjectSettingsService.kt",
    "content": "package com.github.mercari.grpcfederation.settings\n\nimport com.intellij.openapi.project.Project\nimport com.intellij.util.xmlb.annotations.Tag\nimport com.intellij.util.xmlb.annotations.XCollection\n\ninterface ProjectSettingsService {\n    @Tag(\"ImportPathEntry\")\n    data class ImportPathEntry(\n            var path: String = \"\",\n            var enabled: Boolean = true\n    )\n\n    @Tag(\"GrpcFederationSettings\")\n    data class State(\n            /**\n             * Legacy field for backward compatibility.\n             * Contains only enabled paths for compatibility with older plugin versions.\n             * \n             * @deprecated This field will be removed in version 0.3.0.\n             * Migration plan:\n             * - v0.2.0 (current): Both fields are maintained, new format is preferred\n             *   Automatic migration from old to new format on first load\n             * - v0.3.0: Remove this field completely, only use importPathEntries\n             * \n             * TODO: Remove in v0.3.0\n             */\n            @get:XCollection(style = XCollection.Style.v2)\n            var importPaths: MutableList<String> = mutableListOf(),\n            \n            /**\n             * New format that supports enable/disable functionality for each path.\n             * This is the primary storage format from v0.2.0 onwards.\n             */\n            @get:XCollection(style = XCollection.Style.v2)\n            var importPathEntries: MutableList<ImportPathEntry> = mutableListOf()\n    )\n\n    var currentState: State\n}\n\nval Project.projectSettings: ProjectSettingsService\n    get() = getService(ProjectSettingsService::class.java)\n            ?: error(\"Failed to get ProjectSettingsService for $this\")"
  },
  {
    "path": "lsp/client/jetbrains/src/main/kotlin/com/github/mercari/grpcfederation/settings/impl/ProjectSettingsServiceImpl.kt",
    "content": "package com.github.mercari.grpcfederation.settings.impl\n\nimport com.github.mercari.grpcfederation.lsp.GrpcFederationLspServerSupportProvider\nimport com.github.mercari.grpcfederation.settings.ProjectSettingsService\nimport com.github.mercari.grpcfederation.settings.ProjectSettingsService.State\nimport com.intellij.codeInsight.daemon.DaemonCodeAnalyzer\nimport com.intellij.openapi.components.PersistentStateComponent\nimport com.intellij.openapi.components.Storage\nimport com.intellij.openapi.components.StoragePathMacros\nimport com.intellij.openapi.project.Project\nimport com.intellij.platform.lsp.api.LspServerManager\nimport com.intellij.util.xmlb.XmlSerializerUtil\n\nprivate const val serviceName: String = \"GRPCFederationProjectSettings\"\n\n@com.intellij.openapi.components.State(\n        name = serviceName, storages = [Storage(StoragePathMacros.WORKSPACE_FILE)]\n)\nclass ProjectSettingsServiceImpl(\n        private val project: Project\n) : PersistentStateComponent<State>, ProjectSettingsService {\n    @Volatile\n    private var myState: State = State()\n\n    override var currentState: State\n        get() = myState\n        set(newState) {\n            if (myState != newState) {\n                XmlSerializerUtil.copyBean(newState, myState)\n                // Restart LSP server with new settings\n                LspServerManager.getInstance(project).stopAndRestartIfNeeded(GrpcFederationLspServerSupportProvider::class.java)\n                DaemonCodeAnalyzer.getInstance(project).restart()\n            }\n        }\n\n    override fun getState(): State {\n        return myState\n    }\n\n    override fun loadState(state: State) {\n        XmlSerializerUtil.copyBean(state, myState)\n    }\n}"
  },
  {
    "path": "lsp/client/jetbrains/src/main/resources/META-INF/plugin.xml",
    "content": "<!-- Plugin Configuration File. Read more: https://plugins.jetbrains.com/docs/intellij/plugin-configuration-file.html -->\n<idea-plugin>\n    <id>com.github.mercari.grpcfederation</id>\n    <name>gRPC Federation</name>\n    <vendor>mercari</vendor>\n\n    <depends>com.intellij.modules.platform</depends>\n    <depends>com.intellij.modules.ultimate</depends>\n\n    <extensions defaultExtensionNs=\"com.intellij\">\n        <platform.lsp.serverSupportProvider implementation=\"com.github.mercari.grpcfederation.lsp.GrpcFederationLspServerSupportProvider\"/>\n        <projectService serviceInterface=\"com.github.mercari.grpcfederation.settings.ProjectSettingsService\"\n                        serviceImplementation=\"com.github.mercari.grpcfederation.settings.impl.ProjectSettingsServiceImpl\"/>\n        <projectConfigurable\n                parentId=\"tools\"\n                instance=\"com.github.mercari.grpcfederation.settings.ProjectSettingsConfigurable\"\n                id=\"com.github.mercari.grpcfederation.settings.ProjectSettingsConfigurable\"\n                displayName=\"gRPC Federation\"\n                nonDefaultProject=\"true\"/>\n    </extensions>\n    <resource-bundle>messages.GrpcFederationBundle</resource-bundle>\n</idea-plugin>\n"
  },
  {
    "path": "lsp/client/jetbrains/src/main/resources/messages/GrpcFederationBundle.properties",
    "content": "settings.grpcfederation.title=gRPC Federation\nsettings.grpcfederation.importpaths=Proto Import Paths\n"
  },
  {
    "path": "lsp/client/vscode/.eslintignore",
    "content": "node_modules/**\r\nout/**\r\n"
  },
  {
    "path": "lsp/client/vscode/.eslintrc.js",
    "content": "/**@type {import('eslint').Linter.Config} */\n// eslint-disable-next-line no-undef\nmodule.exports = {\n\troot: true,\n\tparser: '@typescript-eslint/parser',\n\tplugins: [\n\t\t'@typescript-eslint',\n\t],\n\textends: [\n\t\t'eslint:recommended',\n\t\t'plugin:@typescript-eslint/recommended',\n\t],\n\trules: {\n\t\t'semi': [2, \"always\"],\n\t\t'@typescript-eslint/no-unused-vars': 0,\n\t\t'@typescript-eslint/no-explicit-any': 0,\n\t\t'@typescript-eslint/explicit-module-boundary-types': 0,\n\t\t'@typescript-eslint/no-non-null-assertion': 0,\n\t}\n};"
  },
  {
    "path": "lsp/client/vscode/.gitignore",
    "content": "out\nnode_modules\n*.vsix\n"
  },
  {
    "path": "lsp/client/vscode/.vscode/extensions.json",
    "content": "{\n\t// See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations.\n\t// Extension identifier format: ${publisher}.${name}. Example: vscode.csharp\n\n\t// List of extensions which should be recommended for users of this workspace.\n\t\"recommendations\": [\n\t\t\"dbaeumer.vscode-eslint\"\n\t]\n}"
  },
  {
    "path": "lsp/client/vscode/.vscode/launch.json",
    "content": "// A launch configuration that compiles the extension and then opens it inside a new window\r\n{\r\n\t\"version\": \"0.2.0\",\r\n\t\"configurations\": [\r\n\t\t{\r\n\t\t\t\"type\": \"extensionHost\",\r\n\t\t\t\"request\": \"launch\",\r\n\t\t\t\"name\": \"Launch Client\",\r\n\t\t\t\"runtimeExecutable\": \"${execPath}\",\r\n\t\t\t\"args\": [\"--extensionDevelopmentPath=${workspaceRoot}\"],\r\n\t\t\t\"outFiles\": [\"${workspaceRoot}/out/**/*.js\"],\r\n\t\t\t\"autoAttachChildProcesses\": true,\r\n\t\t\t\"preLaunchTask\": {\r\n\t\t\t\t\"type\": \"npm\",\r\n\t\t\t\t\"script\": \"watch\"\r\n\t\t\t}\r\n\t\t}\r\n\t]\r\n}\r\n"
  },
  {
    "path": "lsp/client/vscode/.vscode/settings.json",
    "content": "{\r\n\t\"editor.insertSpaces\": false,\r\n\t\"typescript.tsc.autoDetect\": \"off\",\r\n\t\"typescript.preferences.quoteStyle\": \"single\",\r\n\t\"editor.codeActionsOnSave\": {\r\n\t\t\"source.fixAll.eslint\": \"explicit\"\r\n\t},\r\n}"
  },
  {
    "path": "lsp/client/vscode/.vscode/tasks.json",
    "content": "{\r\n\t\"version\": \"2.0.0\",\r\n\t\"tasks\": [\r\n\t\t{\r\n\t\t\t\"type\": \"npm\",\r\n\t\t\t\"script\": \"compile\",\r\n\t\t\t\"group\": \"build\",\r\n\t\t\t\"presentation\": {\r\n\t\t\t\t\"panel\": \"dedicated\",\r\n\t\t\t\t\"reveal\": \"never\"\r\n\t\t\t},\r\n\t\t\t\"problemMatcher\": [\r\n\t\t\t\t\"$tsc\"\r\n\t\t\t]\r\n\t\t},\r\n\t\t{\r\n\t\t\t\"type\": \"npm\",\r\n\t\t\t\"script\": \"watch\",\r\n\t\t\t\"isBackground\": true,\r\n\t\t\t\"group\": {\r\n\t\t\t\t\"kind\": \"build\",\r\n\t\t\t\t\"isDefault\": true\r\n\t\t\t},\r\n\t\t\t\"presentation\": {\r\n\t\t\t\t\"panel\": \"dedicated\",\r\n\t\t\t\t\"reveal\": \"never\"\r\n\t\t\t},\r\n\t\t\t\"problemMatcher\": [\r\n\t\t\t\t\"$tsc-watch\"\r\n\t\t\t]\r\n\t\t}\r\n\t]\r\n}"
  },
  {
    "path": "lsp/client/vscode/.vscodeignore",
    "content": ".vscode/**\r\n**/*.ts\r\n**/*.map\r\n.gitignore\r\n**/tsconfig.json\r\n**/tsconfig.base.json\r\ncontributing.md\r\n.travis.yml\r\nnode_modules/**\r\n!node_modules/vscode-jsonrpc/**\r\n!node_modules/vscode-languageclient/**\r\n!node_modules/vscode-languageserver-protocol/**\r\n!node_modules/vscode-languageserver-types/**\r\n!node_modules/{minimatch,brace-expansion,concat-map,balanced-match}/**\r\n!node_modules/{semver,lru-cache,yallist}/**"
  },
  {
    "path": "lsp/client/vscode/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2023 Mercari, Inc\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "lsp/client/vscode/README.md",
    "content": "# gRPC Federation Language Server for VSCode\n\n<img width=\"500px\" src=\"https://github.com/mercari/grpc-federation/blob/main/images/logo.png?raw=true\"/>\n\n## Features\n\n### Syntax Highlighting\n\nSemantic Highlighting allows for accurate recognition of gRPC Federation options.\nSyntax highlighting is available in quoted value. So, this is especially effective in CEL value.\n\n<img width=\"800px\" src=\"https://github.com/mercari/grpc-federation/blob/main/images/semantic_highlighting.png?raw=true\"/>\n\n### Goto Definition\n\nIt supports jumps to the following definition sources.\n\n- Imported file name\n  - e.g.) import \"<u>path/to/foo.proto</u>\"\n\n- Type of field definition\n  - e.g.) <u>Foo</u> foo = 1\n\n- gRPC method name\n  - e.g.) def { call { method: \"<u>foopkg.FooService/BarMethod</u>\" } }\n\n- Alias name\n  - e.g.) option (grpc.federation.message).alias = \"<u>foopkg.Bar</u>\"\n\n\n### Diagnostics\n### Code Completion\n\n## Install\n\nTo use this extension, `grpc-federation-language-server` is required.\n\nIf already installed Go in your local environment, please run the following command.\n\n```console\n$ go install github.com/mercari/grpc-federation/cmd/grpc-federation-language-server@latest\n```\n\n## Settings\n\nThe following options can be set in `.vscode/settings.json` .\n\nThe example settings is here.\n\n```json\n{\n    \"grpc-federation\": {\n        \"path\": \"/path/to/grpc-federation-language-server\",\n        \"import-paths\": [\n          \"./proto\"\n        ]\n    }\n}\n```\n\n### path\n\nSpecify the path to the location where `grpc-federation-language-server` is installed.\nIf the installation location has already been added to your `PATH` environment variable, you do not need to specify this.\n\n### import-paths\n\nSpecifies the path to search for proto files.\n\n\n"
  },
  {
    "path": "lsp/client/vscode/package.json",
    "content": "{\n\t\"name\": \"grpc-federation\",\n\t\"displayName\": \"gRPC Federation\",\n\t\"description\": \"gRPC Federation Language Server Extension\",\n\t\"author\": \"Mercari, Inc\",\n\t\"license\": \"MIT\",\n\t\"version\": \"0.0.1\",\n\t\"icon\": \"images/icon.png\",\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"https://github.com/mercari/grpc-federation\"\n\t},\n\t\"private\": true,\n\t\"publisher\": \"mercari\",\n\t\"categories\": [],\n\t\"keywords\": [\n\t\t\"multi-root ready\"\n\t],\n\t\"engines\": {\n\t\t\"vscode\": \"^1.74.0\"\n\t},\n\t\"activationEvents\": [\n\t\t\"onLanguage:grpc-federation\"\n\t],\n\t\"main\": \"./out/extension\",\n\t\"contributes\": {\n\t\t\"languages\": [\n\t\t\t{\n\t\t\t\t\"id\": \"grpc-federation\",\n\t\t\t\t\"extensions\": [\n\t\t\t\t\t\".proto\"\n\t\t\t\t],\n\t\t\t\t\"aliases\": [\n\t\t\t\t\t\"Protocol Buffers ( gRPC Federation )\"\n\t\t\t\t]\n\t\t\t}\n\t\t],\n\t\t\"configurationDefaults\": {\n\t\t\t\"[grpc-federation]\": {\n\t\t\t\t\"editor.semanticHighlighting.enabled\": true\n\t\t\t}\n\t\t},\n\t\t\"configuration\": {\n\t\t\t\"type\": \"object\",\n\t\t\t\"title\": \"gRPC Federation Configuration\",\n\t\t\t\"properties\": {\n\t\t\t\t\"grpc-federation\": {\n\t\t\t\t\t\"type\": \"object\",\n\t\t\t\t\t\"description\": \"grpc-federation-language-server executable configuration\",\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"properties\": {\n\t\t\t\t\t\t\"path\": {\n\t\t\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\t\t\"default\": \"grpc-federation-language-server\",\n\t\t\t\t\t\t\t\"description\": \"PATH to grpc-federation-language-server command\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"options\": {\n\t\t\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"default\": [],\n\t\t\t\t\t\t\t\"description\": \"Command line options for grpc-federation-language-server\"\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\t\"scripts\": {\n\t\t\"vscode:prepublish\": \"npm run compile\",\n\t\t\"compile\": \"tsc -b\",\n\t\t\"watch\": \"tsc -b -w\"\n\t},\n\t\"dependencies\": {\n\t\t\"vscode-languageclient\": \"^7.0.0\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@types/mocha\": \"^9.1.0\",\n\t\t\"@types/node\": \"^16.11.7\",\n\t\t\"@types/vscode\": \"^1.63.0\",\n\t\t\"@typescript-eslint/eslint-plugin\": \"^5.42.0\",\n\t\t\"@typescript-eslint/parser\": \"^5.42.0\",\n\t\t\"eslint\": \"^8.26.0\",\n\t\t\"mocha\": \"^11.0.1\",\n\t\t\"typescript\": \"^4.9.4\"\n\t}\n}\n"
  },
  {
    "path": "lsp/client/vscode/src/constants.ts",
    "content": "export const defaultCommand = \"grpc-federation-language-server\";\nexport const configName = \"grpc-federation\";\n"
  },
  {
    "path": "lsp/client/vscode/src/extension.ts",
    "content": "import * as path from 'path';\r\nimport { ExtensionContext, workspace } from 'vscode';\r\n\r\nimport {\r\n\tLanguageClient,\r\n\tLanguageClientOptions,\r\n\tServerOptions,\r\n} from 'vscode-languageclient/node';\r\nimport * as constants from './constants';\r\n\r\nlet client: LanguageClient;\r\n\r\nfunction getCommand(cmdPath: string, workspacePath: string) {\r\n\tif (path.isAbsolute(cmdPath) || cmdPath == constants.defaultCommand)\r\n\t\treturn cmdPath;\r\n\r\n\treturn path.join(workspacePath, cmdPath);\r\n}\r\n\r\nfunction getArgs(importPaths: string[], workspacePath: string) {\r\n\tconst paths: string[] = [];\r\n\tfor (const importPath of importPaths) {\r\n\t\tif (path.isAbsolute(importPath))\r\n\t\t\tpaths.push(importPath);\r\n\t\telse\r\n\t\t\tpaths.push(path.join(workspacePath, importPath));\r\n\t}\r\n\treturn paths.map((path) => { return `-I${path}`; });\r\n}\r\n\r\nexport function activate(context: ExtensionContext) {\r\n\tconst config = workspace.getConfiguration(constants.configName);\r\n\tconst cmdPath = config.get<string>(\"path\", constants.defaultCommand);\r\n\tconst importPaths = config.get<string[]>(\"import-paths\", []);\r\n\tconst folders = workspace.workspaceFolders;\r\n\r\n\tlet serverOptions: ServerOptions;\r\n\tif (folders.length != 0) {\r\n\t\tconst uri = folders[0].uri;\r\n\t\tconst command = getCommand(cmdPath, uri.path);\r\n\t\tconst args = getArgs(importPaths, uri.path);\r\n\t\tserverOptions = { command: command, args: args };\r\n\t} else {\r\n\t\tserverOptions = { command: constants.defaultCommand };\r\n\t}\r\n\r\n\tconst clientOptions: LanguageClientOptions = {\r\n\t\tdocumentSelector: [{ scheme: 'file', language: 'grpc-federation' }],\r\n\t\tsynchronize: {\r\n\t\t\t// Notify the server about file changes to '.clientrc files contained in the workspace\r\n\t\t\tfileEvents: workspace.createFileSystemWatcher('**/.clientrc')\r\n\t\t}\r\n\t};\r\n\r\n\t// Create the language client and start the client.\r\n\tclient = new LanguageClient(\r\n\t\t'grpc-federation',\r\n\t\t'GRPC Federation',\r\n\t\tserverOptions,\r\n\t\tclientOptions\r\n\t);\r\n\r\n\tclient.start();\r\n}\r\n\r\nexport function deactivate(): Thenable<void> | undefined {\r\n\tif (!client) {\r\n\t\treturn undefined;\r\n\t}\r\n\treturn client.stop();\r\n}\r\n"
  },
  {
    "path": "lsp/client/vscode/tsconfig.json",
    "content": "{\r\n\t\"compilerOptions\": {\r\n\t\t\"module\": \"commonjs\",\r\n\t\t\"target\": \"es2020\",\r\n\t\t\"lib\": [\"es2020\"],\r\n\t\t\"outDir\": \"out\",\r\n\t\t\"rootDir\": \"src\",\r\n\t\t\"sourceMap\": true\r\n\t},\r\n\t\"include\": [\r\n\t\t\"src\"\r\n\t],\r\n\t\"exclude\": [\r\n\t\t\"node_modules\",\r\n\t\t\".vscode-test\"\r\n\t]\r\n}"
  },
  {
    "path": "lsp/server/completion.go",
    "content": "package server\n\nimport (\n\t\"context\"\n\t\"log/slog\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/bufbuild/protocompile/ast\"\n\t\"go.lsp.dev/protocol\"\n\n\t\"github.com/mercari/grpc-federation/resolver\"\n\t\"github.com/mercari/grpc-federation/source\"\n)\n\nfunc (h *Handler) completion(ctx context.Context, params *protocol.CompletionParams) (*protocol.CompletionList, error) {\n\tfile, err := h.getFile(params.TextDocument.URI)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tpos := source.Position{Line: int(params.Position.Line) + 1, Col: int(params.Position.Character) + 1}\n\tnodeInfo, candidates, err := h.completer.Completion(ctx, file, h.importPaths, pos)\n\tif err != nil {\n\t\treturn nil, nil\n\t}\n\tif nodeInfo == nil {\n\t\treturn nil, nil\n\t}\n\tcurText := nodeInfo.RawText()\n\tunquoted, err := strconv.Unquote(curText)\n\tif err == nil {\n\t\tcurText = unquoted\n\t}\n\th.logger.Info(\"processing candidates\", slog.String(\"text\", curText), slog.Any(\"candidates\", candidates))\n\titems := make([]protocol.CompletionItem, 0, len(candidates))\n\tfor _, candidate := range candidates {\n\t\tif strings.HasPrefix(candidate, curText) {\n\t\t\tendPos := nodeInfo.End()\n\t\t\tstart := protocol.Position{\n\t\t\t\tLine:      uint32(endPos.Line) - 1, //nolint:gosec\n\t\t\t\tCharacter: uint32(endPos.Col) - 2,  //nolint:gosec\n\t\t\t}\n\t\t\tend := protocol.Position{\n\t\t\t\tLine:      uint32(endPos.Line) - 1, //nolint:gosec\n\t\t\t\tCharacter: uint32(endPos.Col) - 2,  //nolint:gosec\n\t\t\t}\n\t\t\titems = append(items, protocol.CompletionItem{\n\t\t\t\tLabel: candidate,\n\t\t\t\tKind:  protocol.CompletionItemKindText,\n\t\t\t\tData:  len(items),\n\t\t\t\tTextEdit: &protocol.TextEdit{\n\t\t\t\t\tRange:   protocol.Range{Start: start, End: end},\n\t\t\t\t\tNewText: candidate[len(curText):],\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t}\n\tif len(items) == 0 {\n\t\tfor idx, candidate := range candidates {\n\t\t\titems = append(items, protocol.CompletionItem{\n\t\t\t\tLabel: candidate,\n\t\t\t\tKind:  protocol.CompletionItemKindText,\n\t\t\t\tData:  idx,\n\t\t\t})\n\t\t}\n\t}\n\treturn &protocol.CompletionList{\n\t\tItems: items,\n\t}, nil\n}\n\ntype Completer struct {\n\tlogger *slog.Logger\n}\n\nfunc NewCompleter(logger *slog.Logger) *Completer {\n\treturn &Completer{logger: logger}\n}\n\nfunc (c *Completer) Completion(ctx context.Context, file *File, importPaths []string, pos source.Position) (*ast.NodeInfo, []string, error) {\n\tr := resolver.New(file.getCompiledProtos(), resolver.ImportPathOption(importPaths...))\n\t_, _ = r.Resolve()\n\tloc := file.getSource().FindLocationByPos(pos)\n\tif loc == nil {\n\t\treturn nil, nil, nil\n\t}\n\treturn file.getSource().NodeInfoByLocation(loc), r.Candidates(loc), nil\n}\n"
  },
  {
    "path": "lsp/server/completion_test.go",
    "content": "package server\n\nimport (\n\t\"context\"\n\t\"log/slog\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\n\t\"github.com/mercari/grpc-federation/source\"\n)\n\nfunc TestCompletion(t *testing.T) {\n\tpath := filepath.Join(\"testdata\", \"service.proto\")\n\tcontent, err := os.ReadFile(path)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tctx := context.Background()\n\tlogger := slog.New(slog.NewJSONHandler(os.Stdout, nil))\n\n\tsrcFile, err := source.NewFile(path, content)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tfile := newFile(path, srcFile, nil)\n\tcompleter := NewCompleter(logger)\n\tt.Run(\"method\", func(t *testing.T) {\n\t\t// resolver.method value position of Post in service.proto file\n\t\t_, candidates, err := completer.Completion(ctx, file, []string{\"testdata\"}, source.Position{\n\t\t\tLine: 40,\n\t\t\tCol:  19,\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tif diff := cmp.Diff(candidates, []string{\n\t\t\t\"post.PostService/GetPost\",\n\t\t\t\"post.PostService/GetPosts\",\n\t\t\t\"user.UserService/GetUser\",\n\t\t\t\"user.UserService/GetUsers\",\n\t\t}); diff != \"\" {\n\t\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t}\n\t})\n\n\tt.Run(\"request.field\", func(t *testing.T) {\n\t\t// resolver.request.field value position of Post in service.proto file\n\t\t_, candidates, err := completer.Completion(ctx, file, []string{\"testdata\"}, source.Position{\n\t\t\tLine: 41,\n\t\t\tCol:  28,\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tif diff := cmp.Diff(candidates, []string{\n\t\t\t\"id\",\n\t\t}); diff != \"\" {\n\t\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t}\n\t})\n\n\tt.Run(\"request.by\", func(t *testing.T) {\n\t\t// resolver.request.by value position os Post in service.proto file\n\t\t_, candidates, err := completer.Completion(ctx, file, []string{\"testdata\"}, source.Position{\n\t\t\tLine: 41,\n\t\t\tCol:  38,\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tif diff := cmp.Diff(candidates, []string{\n\t\t\t\"$.id\",\n\t\t}); diff != \"\" {\n\t\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t}\n\t})\n\n\tt.Run(\"filter response\", func(t *testing.T) {\n\t\t// resolver.response.field value position of Post in service.proto file\n\t\t_, candidates, err := completer.Completion(ctx, file, []string{\"testdata\"}, source.Position{\n\t\t\tLine: 44,\n\t\t\tCol:  28,\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tif diff := cmp.Diff(candidates, []string{\n\t\t\t\"res\",\n\t\t\t\"$.id\",\n\t\t}); diff != \"\" {\n\t\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t}\n\t})\n\n\tt.Run(\"message\", func(t *testing.T) {\n\t\t// def[2].message value position of Post in service.proto file\n\t\t_, candidates, err := completer.Completion(ctx, file, []string{\"testdata\"}, source.Position{\n\t\t\tLine: 48,\n\t\t\tCol:  17,\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tif diff := cmp.Diff(candidates, []string{\n\t\t\t// federation package messages.\n\t\t\t\"GetPostRequest\",\n\t\t\t\"GetPostResponse\",\n\t\t\t\"User\",\n\n\t\t\t// google messages\n\t\t\t\"google.protobuf.Any\",\n\t\t\t\"google.protobuf.DescriptorProto\",\n\t\t\t\"google.protobuf.DescriptorProto.ExtensionRange\",\n\t\t\t\"google.protobuf.DescriptorProto.ReservedRange\",\n\t\t\t\"google.protobuf.Duration\",\n\t\t\t\"google.protobuf.EnumDescriptorProto\",\n\t\t\t\"google.protobuf.EnumDescriptorProto.EnumReservedRange\",\n\t\t\t\"google.protobuf.EnumOptions\",\n\t\t\t\"google.protobuf.EnumValueDescriptorProto\",\n\t\t\t\"google.protobuf.EnumValueOptions\",\n\t\t\t\"google.protobuf.ExtensionRangeOptions\",\n\t\t\t\"google.protobuf.ExtensionRangeOptions.Declaration\",\n\t\t\t\"google.protobuf.FeatureSet\",\n\t\t\t\"google.protobuf.FeatureSetDefaults\",\n\t\t\t\"google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault\",\n\t\t\t\"google.protobuf.FieldDescriptorProto\",\n\t\t\t\"google.protobuf.FieldOptions\",\n\t\t\t\"google.protobuf.FieldOptions.EditionDefault\",\n\t\t\t\"google.protobuf.FieldOptions.FeatureSupport\",\n\t\t\t\"google.protobuf.FileDescriptorProto\",\n\t\t\t\"google.protobuf.FileDescriptorSet\",\n\t\t\t\"google.protobuf.FileOptions\",\n\t\t\t\"google.protobuf.GeneratedCodeInfo\",\n\t\t\t\"google.protobuf.GeneratedCodeInfo.Annotation\",\n\t\t\t\"google.protobuf.MessageOptions\",\n\t\t\t\"google.protobuf.MethodDescriptorProto\",\n\t\t\t\"google.protobuf.MethodOptions\",\n\t\t\t\"google.protobuf.OneofDescriptorProto\",\n\t\t\t\"google.protobuf.OneofOptions\",\n\t\t\t\"google.protobuf.ServiceDescriptorProto\",\n\t\t\t\"google.protobuf.ServiceOptions\",\n\t\t\t\"google.protobuf.SourceCodeInfo\",\n\t\t\t\"google.protobuf.SourceCodeInfo.Location\",\n\t\t\t\"google.protobuf.Timestamp\",\n\t\t\t\"google.protobuf.UninterpretedOption\",\n\t\t\t\"google.protobuf.UninterpretedOption.NamePart\",\n\t\t\t\"google.rpc.BadRequest\",\n\t\t\t\"google.rpc.BadRequest.FieldViolation\",\n\t\t\t\"google.rpc.DebugInfo\",\n\t\t\t\"google.rpc.ErrorInfo\",\n\t\t\t\"google.rpc.ErrorInfo.MetadataEntry\",\n\t\t\t\"google.rpc.Help\",\n\t\t\t\"google.rpc.Help.Link\",\n\t\t\t\"google.rpc.LocalizedMessage\",\n\t\t\t\"google.rpc.PreconditionFailure\",\n\t\t\t\"google.rpc.PreconditionFailure.Violation\",\n\t\t\t\"google.rpc.QuotaFailure\",\n\t\t\t\"google.rpc.QuotaFailure.Violation\",\n\t\t\t\"google.rpc.RequestInfo\",\n\t\t\t\"google.rpc.ResourceInfo\",\n\t\t\t\"google.rpc.RetryInfo\",\n\n\t\t\t// post package messages.\n\t\t\t\"post.GetPostRequest\",\n\t\t\t\"post.GetPostResponse\",\n\t\t\t\"post.GetPostsRequest\",\n\t\t\t\"post.GetPostsResponse\",\n\t\t\t\"post.Post\",\n\n\t\t\t// user package messages.\n\t\t\t\"user.GetUserRequest\",\n\t\t\t\"user.GetUserResponse\",\n\t\t\t\"user.GetUsersRequest\",\n\t\t\t\"user.GetUsersResponse\",\n\t\t\t\"user.User\",\n\t\t}); diff != \"\" {\n\t\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t}\n\t})\n}\n"
  },
  {
    "path": "lsp/server/definition.go",
    "content": "//nolint:gosec\npackage server\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/bufbuild/protocompile/ast\"\n\t\"go.lsp.dev/protocol\"\n\t\"google.golang.org/protobuf/types/descriptorpb\"\n\n\t\"github.com/mercari/grpc-federation/source\"\n\t\"github.com/mercari/grpc-federation/types\"\n)\n\nfunc (h *Handler) definition(ctx context.Context, params *protocol.DefinitionParams) ([]protocol.Location, error) {\n\tlocs, err := h.definitionWithLink(ctx, params)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret := make([]protocol.Location, 0, len(locs))\n\tfor _, loc := range locs {\n\t\tret = append(ret, protocol.Location{\n\t\t\tURI:   loc.TargetURI,\n\t\t\tRange: loc.TargetRange,\n\t\t})\n\t}\n\treturn ret, nil\n}\n\nfunc (h *Handler) definitionWithLink(_ context.Context, params *protocol.DefinitionParams) ([]protocol.LocationLink, error) {\n\tfile, err := h.getFile(params.TextDocument.URI)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tpos := source.Position{Line: int(params.Position.Line) + 1, Col: int(params.Position.Character) + 1}\n\th.logger.Debug(\"definition\", slog.Any(\"pos\", pos))\n\tloc := file.getSource().FindLocationByPos(pos)\n\tif loc == nil {\n\t\treturn nil, nil\n\t}\n\th.logger.Debug(\"definition\", slog.Any(\"loc\", loc))\n\tnodeInfo := file.getSource().NodeInfoByLocation(loc)\n\tif nodeInfo == nil {\n\t\treturn nil, nil\n\t}\n\th.logger.Debug(\"definition\", slog.String(\"node_text\", nodeInfo.RawText()))\n\tswitch {\n\tcase isImportNameDefinition(loc):\n\t\timportFilePath, err := strconv.Unquote(nodeInfo.RawText())\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\th.logger.Debug(\"import\", slog.String(\"path\", importFilePath))\n\t\tlocs := h.findImportFileDefinition(file.getPath(), file.getCompiledProtos(), importFilePath)\n\t\treturn h.toLocationLinks(nodeInfo, locs, true), nil\n\tcase loc.IsDefinedTypeName():\n\t\ttypeName, err := strconv.Unquote(nodeInfo.RawText())\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\th.logger.Debug(\"type\", slog.String(\"name\", typeName))\n\t\tlocs, err := h.findTypeDefinition(file.getPath(), file.getCompiledProtos(), typeName)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn h.toLocationLinks(nodeInfo, locs, true), nil\n\tcase loc.IsDefinedFieldType():\n\t\tvar prefix []string\n\t\tif loc.Message != nil {\n\t\t\tprefix = loc.Message.MessageNames()\n\t\t}\n\t\ttypeName := nodeInfo.RawText()\n\t\tif types.ToKind(typeName) != types.Unknown {\n\t\t\t// builtin types\n\t\t\treturn nil, nil\n\t\t}\n\t\tfirstPriorTypeName := strings.Join(append(prefix, typeName), \".\")\n\t\tfor _, name := range []string{firstPriorTypeName, typeName} {\n\t\t\th.logger.Debug(\"type\", slog.String(\"name\", name))\n\t\t\tlocs, err := h.findTypeDefinition(file.getPath(), file.getCompiledProtos(), name)\n\t\t\tif err != nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif len(locs) == 0 {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\treturn h.toLocationLinks(nodeInfo, locs, false), nil\n\t\t}\n\tcase loc.IsDefinedTypeAlias():\n\t\ttypeName, err := strconv.Unquote(nodeInfo.RawText())\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\th.logger.Debug(\"type\", slog.String(\"name\", typeName))\n\t\tlocs, err := h.findTypeDefinition(file.getPath(), file.getCompiledProtos(), typeName)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn h.toLocationLinks(nodeInfo, locs, true), nil\n\tcase isMethodNameDefinition(loc):\n\t\tmtdName, err := strconv.Unquote(nodeInfo.RawText())\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\th.logger.Debug(\"method\", slog.String(\"name\", mtdName))\n\t\tlocs, err := h.findMethodDefinition(file.getPath(), file.getCompiledProtos(), mtdName)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn h.toLocationLinks(nodeInfo, locs, true), nil\n\t}\n\treturn nil, nil\n}\n\nfunc (h *Handler) findImportFileDefinition(path string, protoFiles []*descriptorpb.FileDescriptorProto, fileName string) []protocol.Location {\n\tfor _, protoFile := range protoFiles {\n\t\tfilePath, err := h.filePathFromFileDescriptorProto(path, protoFile)\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t}\n\t\tif strings.HasSuffix(filePath, fileName) {\n\t\t\treturn []protocol.Location{\n\t\t\t\t{\n\t\t\t\t\tURI: protocol.DocumentURI(fmt.Sprintf(\"file://%s\", filePath)),\n\t\t\t\t\tRange: protocol.Range{\n\t\t\t\t\t\tStart: protocol.Position{Line: 0, Character: 0},\n\t\t\t\t\t\tEnd:   protocol.Position{Line: 0, Character: 0},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (h *Handler) findTypeDefinition(path string, protoFiles []*descriptorpb.FileDescriptorProto, defTypeName string) ([]protocol.Location, error) {\n\ttypeName, filePath, err := h.typeAndFilePath(path, protoFiles, defTypeName)\n\tif filePath == \"\" {\n\t\treturn nil, err\n\t}\n\tf, err := h.getFileByPath(filePath)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tparts := strings.Split(typeName, \".\")\n\tlastPart := parts[len(parts)-1]\n\n\tvar foundNode ast.Node\n\t_ = ast.Walk(f.getSource().AST(), &ast.SimpleVisitor{\n\t\tDoVisitMessageNode: func(n *ast.MessageNode) error {\n\t\t\tif string(n.Name.AsIdentifier()) == lastPart {\n\t\t\t\tfoundNode = n.Name\n\t\t\t}\n\t\t\treturn nil\n\t\t},\n\t\tDoVisitEnumNode: func(n *ast.EnumNode) error {\n\t\t\tif string(n.Name.AsIdentifier()) == lastPart {\n\t\t\t\tfoundNode = n.Name\n\t\t\t}\n\t\t\treturn nil\n\t\t},\n\t})\n\n\tif foundNode == nil {\n\t\treturn nil, fmt.Errorf(\"failed to find %s type from ast.Node in %s file\", typeName, filePath)\n\t}\n\n\treturn h.toLocation(f.getSource(), foundNode), nil\n}\n\nfunc (h *Handler) findMethodDefinition(path string, protoFiles []*descriptorpb.FileDescriptorProto, defMethodName string) ([]protocol.Location, error) {\n\tmethodName, filePath, err := h.methodAndFilePath(path, protoFiles, defMethodName)\n\tif filePath == \"\" {\n\t\treturn nil, err\n\t}\n\tf, err := h.getFileByPath(filePath)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvar foundNode ast.Node\n\t_ = ast.Walk(f.getSource().AST(), &ast.SimpleVisitor{\n\t\tDoVisitRPCNode: func(n *ast.RPCNode) error {\n\t\t\tif string(n.Name.AsIdentifier()) == methodName {\n\t\t\t\tfoundNode = n.Name\n\t\t\t}\n\t\t\treturn nil\n\t\t},\n\t})\n\n\tif foundNode == nil {\n\t\treturn nil, fmt.Errorf(\"failed to find %s method from ast.Node in %s file\", methodName, filePath)\n\t}\n\n\treturn h.toLocation(f.getSource(), foundNode), nil\n}\n\nfunc (h *Handler) toLocationLinks(nodeInfo *ast.NodeInfo, locs []protocol.Location, isQuoted bool) []protocol.LocationLink {\n\tret := make([]protocol.LocationLink, 0, len(locs))\n\tstartPos := nodeInfo.Start()\n\tendPos := nodeInfo.End()\n\tfor _, loc := range locs {\n\t\tstartCol := uint32(startPos.Col - 1)\n\t\tendCol := uint32(endPos.Col - 1)\n\t\tif isQuoted {\n\t\t\tstartCol += 1\n\t\t\tendCol -= 1\n\t\t}\n\t\tret = append(ret, protocol.LocationLink{\n\t\t\tOriginSelectionRange: &protocol.Range{\n\t\t\t\tStart: protocol.Position{\n\t\t\t\t\tLine:      uint32(startPos.Line) - 1,\n\t\t\t\t\tCharacter: startCol,\n\t\t\t\t},\n\t\t\t\tEnd: protocol.Position{\n\t\t\t\t\tLine:      uint32(endPos.Line) - 1,\n\t\t\t\t\tCharacter: endCol,\n\t\t\t\t},\n\t\t\t},\n\t\t\tTargetURI:            loc.URI,\n\t\t\tTargetRange:          loc.Range,\n\t\t\tTargetSelectionRange: loc.Range,\n\t\t})\n\t}\n\treturn ret\n}\n\nfunc (h *Handler) toLocation(file *source.File, node ast.Node) []protocol.Location {\n\tinfo := file.AST().NodeInfo(node)\n\tstartPos := info.Start()\n\tendPos := info.End()\n\tlocRange := protocol.Range{\n\t\tStart: protocol.Position{\n\t\t\tLine:      uint32(startPos.Line) - 1,\n\t\t\tCharacter: uint32(startPos.Col) - 1,\n\t\t},\n\t\tEnd: protocol.Position{\n\t\t\tLine:      uint32(endPos.Line) - 1,\n\t\t\tCharacter: uint32(endPos.Col) - 1,\n\t\t},\n\t}\n\treturn []protocol.Location{\n\t\t{\n\t\t\tURI:   protocol.DocumentURI(fmt.Sprintf(\"file://%s\", file.Path())),\n\t\t\tRange: locRange,\n\t\t},\n\t}\n}\n\nfunc (h *Handler) typeAndFilePath(path string, protoFiles []*descriptorpb.FileDescriptorProto, defTypeName string) (string, string, error) {\n\tcurrentPkgName, err := h.currentPackageName(path, protoFiles)\n\tif err != nil {\n\t\treturn \"\", \"\", err\n\t}\n\th.logger.Debug(\"current package\", slog.String(\"name\", currentPkgName))\n\tfor _, protoFile := range protoFiles {\n\t\tfilePath, err := h.filePathFromFileDescriptorProto(path, protoFile)\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t}\n\t\tpkg := protoFile.GetPackage()\n\t\tfor _, msg := range protoFile.GetMessageType() {\n\t\t\tfor _, name := range getDeclaredMessageNames(msg) {\n\t\t\t\tvar typeName string\n\t\t\t\tif pkg == currentPkgName {\n\t\t\t\t\ttypeName = name\n\t\t\t\t} else {\n\t\t\t\t\ttypeName = fmt.Sprintf(\"%s.%s\", pkg, name)\n\t\t\t\t}\n\t\t\t\tif defTypeName == typeName {\n\t\t\t\t\treturn typeName, filePath, nil\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor _, enum := range protoFile.GetEnumType() {\n\t\t\tname := enum.GetName()\n\t\t\tvar typeName string\n\t\t\tif pkg == currentPkgName {\n\t\t\t\ttypeName = name\n\t\t\t} else {\n\t\t\t\ttypeName = fmt.Sprintf(\"%s.%s\", pkg, name)\n\t\t\t}\n\t\t\tif defTypeName == typeName {\n\t\t\t\treturn typeName, filePath, nil\n\t\t\t}\n\t\t}\n\t}\n\treturn \"\", \"\", fmt.Errorf(\"failed to find %s type from all proto files\", defTypeName)\n}\n\nfunc getDeclaredMessageNames(msg *descriptorpb.DescriptorProto) []string {\n\tname := msg.GetName()\n\tret := []string{name}\n\tfor _, msg := range msg.GetNestedType() {\n\t\tfor _, nested := range getDeclaredMessageNames(msg) {\n\t\t\tret = append(ret, name+\".\"+nested)\n\t\t}\n\t}\n\tfor _, enum := range msg.GetEnumType() {\n\t\tret = append(ret, name+\".\"+enum.GetName())\n\t}\n\treturn ret\n}\n\nfunc (h *Handler) methodAndFilePath(path string, protoFiles []*descriptorpb.FileDescriptorProto, defMethodName string) (string, string, error) {\n\tcurrentPkgName, err := h.currentPackageName(path, protoFiles)\n\tif err != nil {\n\t\treturn \"\", \"\", err\n\t}\n\th.logger.Debug(\"current package\", slog.String(\"name\", currentPkgName))\n\tfor _, protoFile := range protoFiles {\n\t\tfilePath, err := h.filePathFromFileDescriptorProto(path, protoFile)\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t}\n\t\tpkg := protoFile.GetPackage()\n\t\tfor _, svc := range protoFile.GetService() {\n\t\t\tsvcName := svc.GetName()\n\t\t\tfor _, method := range svc.GetMethod() {\n\t\t\t\tvar methodName string\n\t\t\t\tif pkg == currentPkgName {\n\t\t\t\t\tmethodName = fmt.Sprintf(\"%s/%s\", svcName, method.GetName())\n\t\t\t\t} else {\n\t\t\t\t\tmethodName = fmt.Sprintf(\"%s.%s/%s\", pkg, svcName, method.GetName())\n\t\t\t\t}\n\t\t\t\tif defMethodName == methodName {\n\t\t\t\t\treturn method.GetName(), filePath, nil\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn \"\", \"\", fmt.Errorf(\"failed to find %s method from all proto files\", defMethodName)\n}\n\nfunc (h *Handler) currentPackageName(path string, protoFiles []*descriptorpb.FileDescriptorProto) (string, error) {\n\tfor _, protoFile := range protoFiles {\n\t\tif strings.HasSuffix(path, protoFile.GetName()) {\n\t\t\treturn protoFile.GetPackage(), nil\n\t\t}\n\t}\n\treturn \"\", fmt.Errorf(\"failed to find current package\")\n}\n\nfunc (h *Handler) filePathFromFileDescriptorProto(path string, protoFile *descriptorpb.FileDescriptorProto) (string, error) {\n\tfileName := protoFile.GetName()\n\tif filepath.Base(path) == fileName {\n\t\treturn path, nil\n\t}\n\tfor _, importPath := range h.importPaths {\n\t\tfullpath := filepath.Join(importPath, fileName)\n\t\tif !filepath.IsAbs(fullpath) {\n\t\t\tp, err := filepath.Abs(fullpath)\n\t\t\tif err != nil {\n\t\t\t\treturn \"\", err\n\t\t\t}\n\t\t\tfullpath = p\n\t\t}\n\t\tif _, err := os.Stat(fullpath); err == nil {\n\t\t\treturn fullpath, nil\n\t\t}\n\t}\n\treturn \"\", fmt.Errorf(\"failed to find absolute path from %s\", fileName)\n}\n\nfunc isImportNameDefinition(loc *source.Location) bool {\n\treturn loc.ImportName != \"\"\n}\n\nfunc isMethodNameDefinition(loc *source.Location) bool {\n\tif loc.Message == nil {\n\t\treturn false\n\t}\n\tif loc.Message.Option == nil {\n\t\treturn false\n\t}\n\tif loc.Message.Option.Def == nil {\n\t\treturn false\n\t}\n\tif loc.Message.Option.Def.Call == nil {\n\t\treturn false\n\t}\n\treturn loc.Message.Option.Def.Call.Method\n}\n"
  },
  {
    "path": "lsp/server/general.go",
    "content": "package server\n\nimport (\n\t\"go.lsp.dev/protocol\"\n)\n\nfunc (h *Handler) initialize(params *protocol.InitializeParams) (*protocol.InitializeResult, error) {\n\tvar (\n\t\ttokenTypes     []protocol.SemanticTokenTypes\n\t\ttokenModifiers []protocol.SemanticTokenModifiers\n\t)\n\tcapabilities := params.Capabilities\n\tif textDocument := capabilities.TextDocument; textDocument != nil {\n\t\tif semanticTokens := textDocument.SemanticTokens; semanticTokens != nil {\n\t\t\tfor idx, tokenType := range semanticTokens.TokenTypes {\n\t\t\t\ttokenTypes = append(tokenTypes, protocol.SemanticTokenTypes(tokenType))\n\t\t\t\th.tokenTypeMap[tokenType] = uint32(idx) //nolint:gosec\n\t\t\t}\n\t\t\tfor idx, modifier := range semanticTokens.TokenModifiers {\n\t\t\t\ttokenModifiers = append(tokenModifiers, protocol.SemanticTokenModifiers(modifier))\n\t\t\t\th.tokenModifierMap[modifier] = 1 << uint32(idx) //nolint:gosec\n\t\t\t}\n\t\t}\n\t\tif definition := textDocument.Definition; definition != nil {\n\t\t\th.supportedDefinitionLinkClient = definition.LinkSupport\n\t\t}\n\t}\n\treturn &protocol.InitializeResult{\n\t\tCapabilities: protocol.ServerCapabilities{\n\t\t\tTextDocumentSync:   protocol.TextDocumentSyncKindFull,\n\t\t\tDefinitionProvider: true,\n\t\t\tCompletionProvider: &protocol.CompletionOptions{\n\t\t\t\tTriggerCharacters: []string{\"$\", \".\", \" \"},\n\t\t\t},\n\t\t\tSemanticTokensProvider: map[string]interface{}{\n\t\t\t\t\"legend\": protocol.SemanticTokensLegend{\n\t\t\t\t\tTokenTypes:     tokenTypes,\n\t\t\t\t\tTokenModifiers: tokenModifiers,\n\t\t\t\t},\n\t\t\t\t\"full\": true,\n\t\t\t},\n\t\t\tSelectionRangeProvider: true,\n\t\t},\n\t\tServerInfo: &protocol.ServerInfo{\n\t\t\tName:    \"grpc-federation\",\n\t\t\tVersion: \"v0.0.1\",\n\t\t},\n\t}, nil\n}\n"
  },
  {
    "path": "lsp/server/handler.go",
    "content": "package server\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\t\"sync\"\n\n\t\"go.lsp.dev/protocol\"\n\n\t\"github.com/mercari/grpc-federation/validator\"\n)\n\nvar _ protocol.Server = &Handler{}\n\ntype Handler struct {\n\tlogger                        *slog.Logger\n\timportPaths                   []string\n\tclient                        protocol.Client\n\tvalidator                     *validator.Validator\n\tcompleter                     *Completer\n\tfileCacheMu                   sync.RWMutex\n\tfileCacheMap                  map[string]*File\n\ttokenTypeMap                  map[string]uint32\n\ttokenModifierMap              map[string]uint32\n\tsupportedDefinitionLinkClient bool\n}\n\nfunc NewHandler(client protocol.Client, w io.Writer, importPaths []string) *Handler {\n\tlogger := slog.New(slog.NewJSONHandler(w, nil))\n\treturn &Handler{\n\t\tlogger:           logger,\n\t\timportPaths:      importPaths,\n\t\tclient:           client,\n\t\tcompleter:        NewCompleter(logger),\n\t\tvalidator:        validator.New(),\n\t\tfileCacheMap:     make(map[string]*File),\n\t\ttokenTypeMap:     make(map[string]uint32),\n\t\ttokenModifierMap: make(map[string]uint32),\n\t}\n}\n\nfunc (h *Handler) Initialize(ctx context.Context, params *protocol.InitializeParams) (*protocol.InitializeResult, error) {\n\th.logger.Debug(\"Initialize\", slog.Any(\"params\", params))\n\treturn h.initialize(params)\n}\n\nfunc (h *Handler) Initialized(ctx context.Context, params *protocol.InitializedParams) error {\n\th.logger.Debug(\"Initialized\", slog.Any(\"params\", params))\n\treturn nil\n}\n\nfunc (h *Handler) Shutdown(ctx context.Context) error {\n\th.logger.Debug(\"Shutdown\")\n\treturn nil\n}\n\nfunc (h *Handler) Exit(ctx context.Context) error {\n\th.logger.Debug(\"Exit\")\n\treturn nil\n}\n\nfunc (h *Handler) WorkDoneProgressCancel(ctx context.Context, params *protocol.WorkDoneProgressCancelParams) error {\n\th.logger.Debug(\"WorkDoneProgressCancel\", slog.Any(\"params\", params))\n\treturn nil\n}\n\nfunc (h *Handler) LogTrace(ctx context.Context, params *protocol.LogTraceParams) error {\n\th.logger.Debug(\"LogTrace\", slog.Any(\"params\", params))\n\treturn nil\n}\n\nfunc (h *Handler) SetTrace(ctx context.Context, params *protocol.SetTraceParams) error {\n\th.logger.Debug(\"SetTrace\", slog.Any(\"params\", params))\n\treturn nil\n}\n\nfunc (h *Handler) CodeAction(ctx context.Context, params *protocol.CodeActionParams) ([]protocol.CodeAction, error) {\n\th.logger.Debug(\"CodeAction\", slog.Any(\"params\", params))\n\treturn nil, nil\n}\n\nfunc (h *Handler) CodeLens(ctx context.Context, params *protocol.CodeLensParams) ([]protocol.CodeLens, error) {\n\th.logger.Debug(\"CodeLens\", slog.Any(\"params\", params))\n\treturn nil, nil\n}\n\nfunc (h *Handler) CodeLensResolve(ctx context.Context, params *protocol.CodeLens) (*protocol.CodeLens, error) {\n\th.logger.Debug(\"CodeLensResolve\", slog.Any(\"params\", params))\n\treturn nil, nil\n}\n\nfunc (h *Handler) ColorPresentation(ctx context.Context, params *protocol.ColorPresentationParams) ([]protocol.ColorPresentation, error) {\n\th.logger.Debug(\"ColorPresentation\", slog.Any(\"params\", params))\n\treturn nil, nil\n}\n\nfunc (h *Handler) Completion(ctx context.Context, params *protocol.CompletionParams) (*protocol.CompletionList, error) {\n\th.logger.Debug(\"Completion\", slog.Any(\"params\", params))\n\tdefer func() {\n\t\tif err := recover(); err != nil {\n\t\t\th.logger.Error(\"recovered\", slog.Any(\"error\", err))\n\t\t}\n\t}()\n\treturn h.completion(ctx, params)\n}\n\nfunc (h *Handler) CompletionResolve(ctx context.Context, params *protocol.CompletionItem) (*protocol.CompletionItem, error) {\n\th.logger.Debug(\"CompletionResolve\", slog.Any(\"params\", params))\n\treturn nil, nil\n}\n\nfunc (h *Handler) Declaration(ctx context.Context, params *protocol.DeclarationParams) ([]protocol.Location, error) {\n\th.logger.Debug(\"Declaration\", slog.Any(\"params\", params))\n\treturn nil, nil\n}\n\nfunc (h *Handler) Definition(ctx context.Context, params *protocol.DefinitionParams) ([]protocol.Location, error) {\n\th.logger.Debug(\"Definition\", slog.Any(\"params\", params))\n\tdefer func() {\n\t\tif err := recover(); err != nil {\n\t\t\th.logger.Error(\"recovered\", slog.Any(\"error\", err))\n\t\t}\n\t}()\n\treturn h.definition(ctx, params)\n}\n\nfunc (h *Handler) DefinitionWithLink(ctx context.Context, params *protocol.DefinitionParams) ([]protocol.LocationLink, error) {\n\th.logger.Debug(\"DefinitionWithLink\", slog.Any(\"params\", params))\n\treturn h.definitionWithLink(ctx, params)\n}\n\nfunc (h *Handler) DidChange(ctx context.Context, params *protocol.DidChangeTextDocumentParams) error {\n\th.logger.Debug(\"DidChange\", slog.Any(\"params\", params))\n\tdefer func() {\n\t\tif err := recover(); err != nil {\n\t\t\th.logger.Error(\"recovered\", slog.Any(\"error\", err))\n\t\t}\n\t}()\n\treturn h.didChange(ctx, params)\n}\n\nfunc (h *Handler) DidChangeConfiguration(ctx context.Context, params *protocol.DidChangeConfigurationParams) error {\n\th.logger.Debug(\"DidChangeConfiguration\", slog.Any(\"params\", params))\n\treturn nil\n}\n\nfunc (h *Handler) DidChangeWatchedFiles(ctx context.Context, params *protocol.DidChangeWatchedFilesParams) error {\n\th.logger.Debug(\"DidChangeWatchedFiles\", slog.Any(\"params\", params))\n\treturn nil\n}\n\nfunc (h *Handler) DidChangeWorkspaceFolders(ctx context.Context, params *protocol.DidChangeWorkspaceFoldersParams) error {\n\th.logger.Debug(\"DidChangeWorkspaceFolders\", slog.Any(\"params\", params))\n\treturn nil\n}\n\nfunc (h *Handler) DidClose(ctx context.Context, params *protocol.DidCloseTextDocumentParams) error {\n\th.logger.Debug(\"DidClose\", slog.Any(\"params\", params))\n\treturn nil\n}\n\nfunc (h *Handler) DidOpen(ctx context.Context, params *protocol.DidOpenTextDocumentParams) error {\n\th.logger.Debug(\"DidOpen\", slog.Any(\"params\", params))\n\treturn nil\n}\n\nfunc (h *Handler) DidSave(ctx context.Context, params *protocol.DidSaveTextDocumentParams) error {\n\th.logger.Debug(\"DidSave\", slog.Any(\"params\", params))\n\treturn nil\n}\n\nfunc (h *Handler) DocumentColor(ctx context.Context, params *protocol.DocumentColorParams) ([]protocol.ColorInformation, error) {\n\th.logger.Debug(\"DocumentColor\", slog.Any(\"params\", params))\n\treturn nil, nil\n}\n\nfunc (h *Handler) DocumentHighlight(ctx context.Context, params *protocol.DocumentHighlightParams) ([]protocol.DocumentHighlight, error) {\n\th.logger.Debug(\"DocumentHighlight\", slog.Any(\"params\", params))\n\treturn nil, nil\n}\n\nfunc (h *Handler) DocumentLink(ctx context.Context, params *protocol.DocumentLinkParams) ([]protocol.DocumentLink, error) {\n\th.logger.Debug(\"DocumentLink\", slog.Any(\"params\", params))\n\treturn nil, nil\n}\n\nfunc (h *Handler) DocumentLinkResolve(ctx context.Context, params *protocol.DocumentLink) (*protocol.DocumentLink, error) {\n\th.logger.Debug(\"DocumentLinkResolve\", slog.Any(\"params\", params))\n\treturn nil, nil\n}\n\nfunc (h *Handler) DocumentSymbol(ctx context.Context, params *protocol.DocumentSymbolParams) ([]interface{}, error) {\n\th.logger.Debug(\"DocumentSymbol\", slog.Any(\"params\", params))\n\treturn nil, nil\n}\n\nfunc (h *Handler) ExecuteCommand(ctx context.Context, params *protocol.ExecuteCommandParams) (interface{}, error) {\n\th.logger.Debug(\"ExecuteCommand\", slog.Any(\"params\", params))\n\treturn nil, nil\n}\n\nfunc (h *Handler) FoldingRanges(ctx context.Context, params *protocol.FoldingRangeParams) ([]protocol.FoldingRange, error) {\n\th.logger.Debug(\"FoldingRanges\", slog.Any(\"params\", params))\n\treturn nil, nil\n}\n\nfunc (h *Handler) Formatting(ctx context.Context, params *protocol.DocumentFormattingParams) ([]protocol.TextEdit, error) {\n\th.logger.Debug(\"Formatting\", slog.Any(\"params\", params))\n\treturn nil, nil\n}\n\nfunc (h *Handler) Hover(ctx context.Context, params *protocol.HoverParams) (*protocol.Hover, error) {\n\th.logger.Debug(\"Hover\", slog.Any(\"params\", params))\n\treturn nil, nil\n}\n\nfunc (h *Handler) Implementation(ctx context.Context, params *protocol.ImplementationParams) ([]protocol.Location, error) {\n\th.logger.Debug(\"Implementation\", slog.Any(\"params\", params))\n\treturn nil, nil\n}\n\nfunc (h *Handler) OnTypeFormatting(ctx context.Context, params *protocol.DocumentOnTypeFormattingParams) ([]protocol.TextEdit, error) {\n\th.logger.Debug(\"OnTypeFormatting\", slog.Any(\"params\", params))\n\treturn nil, nil\n}\n\nfunc (h *Handler) PrepareRename(ctx context.Context, params *protocol.PrepareRenameParams) (*protocol.Range, error) {\n\th.logger.Debug(\"PrepareRename\", slog.Any(\"params\", params))\n\treturn nil, nil\n}\n\nfunc (h *Handler) RangeFormatting(ctx context.Context, params *protocol.DocumentRangeFormattingParams) ([]protocol.TextEdit, error) {\n\th.logger.Debug(\"RangeFormatting\", slog.Any(\"params\", params))\n\treturn nil, nil\n}\n\nfunc (h *Handler) References(ctx context.Context, params *protocol.ReferenceParams) ([]protocol.Location, error) {\n\th.logger.Debug(\"References\", slog.Any(\"params\", params))\n\treturn nil, nil\n}\n\nfunc (h *Handler) Rename(ctx context.Context, params *protocol.RenameParams) (*protocol.WorkspaceEdit, error) {\n\th.logger.Debug(\"Rename\", slog.Any(\"params\", params))\n\treturn nil, nil\n}\n\nfunc (h *Handler) SignatureHelp(ctx context.Context, params *protocol.SignatureHelpParams) (*protocol.SignatureHelp, error) {\n\th.logger.Debug(\"SignatureHelp\", slog.Any(\"params\", params))\n\treturn nil, nil\n}\n\nfunc (h *Handler) Symbols(ctx context.Context, params *protocol.WorkspaceSymbolParams) ([]protocol.SymbolInformation, error) {\n\th.logger.Debug(\"Symbols\", slog.Any(\"params\", params))\n\treturn nil, nil\n}\n\nfunc (h *Handler) TypeDefinition(ctx context.Context, params *protocol.TypeDefinitionParams) ([]protocol.Location, error) {\n\th.logger.Debug(\"TypeDefinition\", slog.Any(\"params\", params))\n\treturn nil, nil\n}\n\nfunc (h *Handler) WillSave(ctx context.Context, params *protocol.WillSaveTextDocumentParams) error {\n\th.logger.Debug(\"WillSave\", slog.Any(\"params\", params))\n\treturn nil\n}\n\nfunc (h *Handler) WillSaveWaitUntil(ctx context.Context, params *protocol.WillSaveTextDocumentParams) ([]protocol.TextEdit, error) {\n\th.logger.Debug(\"WillSaveWaitUntil\", slog.Any(\"params\", params))\n\treturn nil, nil\n}\n\nfunc (h *Handler) ShowDocument(ctx context.Context, params *protocol.ShowDocumentParams) (*protocol.ShowDocumentResult, error) {\n\th.logger.Debug(\"ShowDocument\", slog.Any(\"params\", params))\n\treturn nil, nil\n}\n\nfunc (h *Handler) WillCreateFiles(ctx context.Context, params *protocol.CreateFilesParams) (*protocol.WorkspaceEdit, error) {\n\th.logger.Debug(\"WillCreateFiles\", slog.Any(\"params\", params))\n\treturn nil, nil\n}\n\nfunc (h *Handler) DidCreateFiles(ctx context.Context, params *protocol.CreateFilesParams) error {\n\th.logger.Debug(\"DidCreateFiles\", slog.Any(\"params\", params))\n\treturn nil\n}\n\nfunc (h *Handler) WillRenameFiles(ctx context.Context, params *protocol.RenameFilesParams) (*protocol.WorkspaceEdit, error) {\n\th.logger.Debug(\"WillRenameFiles\", slog.Any(\"params\", params))\n\treturn nil, nil\n}\n\nfunc (h *Handler) DidRenameFiles(ctx context.Context, params *protocol.RenameFilesParams) error {\n\th.logger.Debug(\"DidRenameFiles\", slog.Any(\"params\", params))\n\treturn nil\n}\n\nfunc (h *Handler) WillDeleteFiles(ctx context.Context, params *protocol.DeleteFilesParams) (*protocol.WorkspaceEdit, error) {\n\th.logger.Debug(\"WillDeleteFiles\", slog.Any(\"params\", params))\n\treturn nil, nil\n}\n\nfunc (h *Handler) DidDeleteFiles(ctx context.Context, params *protocol.DeleteFilesParams) error {\n\th.logger.Debug(\"DidDeleteFiles\", slog.Any(\"params\", params))\n\treturn nil\n}\n\nfunc (h *Handler) CodeLensRefresh(ctx context.Context) error {\n\th.logger.Debug(\"CodeLensRefresh\")\n\treturn nil\n}\n\nfunc (h *Handler) PrepareCallHierarchy(ctx context.Context, params *protocol.CallHierarchyPrepareParams) ([]protocol.CallHierarchyItem, error) {\n\th.logger.Debug(\"PrepareCallHierarchy\", slog.Any(\"params\", params))\n\treturn nil, nil\n}\n\nfunc (h *Handler) IncomingCalls(ctx context.Context, params *protocol.CallHierarchyIncomingCallsParams) ([]protocol.CallHierarchyIncomingCall, error) {\n\th.logger.Debug(\"IncomingCalls\", slog.Any(\"params\", params))\n\treturn nil, nil\n}\n\nfunc (h *Handler) OutgoingCalls(ctx context.Context, params *protocol.CallHierarchyOutgoingCallsParams) ([]protocol.CallHierarchyOutgoingCall, error) {\n\th.logger.Debug(\"OutgoingCalls\", slog.Any(\"params\", params))\n\treturn nil, nil\n}\n\nfunc (h *Handler) SemanticTokensFull(ctx context.Context, params *protocol.SemanticTokensParams) (*protocol.SemanticTokens, error) {\n\th.logger.Debug(\"SemanticTokensFull\", slog.Any(\"params\", params))\n\tdefer func() {\n\t\tif err := recover(); err != nil {\n\t\t\th.logger.Error(\"recovered\", slog.Any(\"error\", err))\n\t\t}\n\t}()\n\treturn h.semanticTokensFull(params)\n}\n\nfunc (h *Handler) SemanticTokensFullDelta(ctx context.Context, params *protocol.SemanticTokensDeltaParams) (interface{}, error) {\n\th.logger.Debug(\"SemanticTokensFullDelta\", slog.Any(\"params\", params))\n\treturn nil, nil\n}\n\nfunc (h *Handler) SemanticTokensRange(ctx context.Context, params *protocol.SemanticTokensRangeParams) (*protocol.SemanticTokens, error) {\n\th.logger.Debug(\"SemanticTokensRange\", slog.Any(\"params\", params))\n\treturn nil, nil\n}\n\nfunc (h *Handler) SemanticTokensRefresh(ctx context.Context) error {\n\th.logger.Debug(\"SemanticTokensRefresh\")\n\treturn nil\n}\n\nfunc (h *Handler) LinkedEditingRange(ctx context.Context, params *protocol.LinkedEditingRangeParams) (*protocol.LinkedEditingRanges, error) {\n\th.logger.Debug(\"LinkedEditingRange\", slog.Any(\"params\", params))\n\treturn nil, nil\n}\n\nfunc (h *Handler) Moniker(ctx context.Context, params *protocol.MonikerParams) ([]protocol.Moniker, error) {\n\th.logger.Debug(\"Moniker\", slog.Any(\"params\", params))\n\treturn nil, nil\n}\n\nfunc (h *Handler) Request(ctx context.Context, method string, params interface{}) (interface{}, error) {\n\th.logger.Debug(\"Request\", slog.Any(\"params\", params))\n\treturn nil, nil\n}\n"
  },
  {
    "path": "lsp/server/handler_test.go",
    "content": "package server_test\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"go.lsp.dev/protocol\"\n\t\"go.lsp.dev/uri\"\n\t\"go.uber.org/zap\"\n\n\t\"github.com/mercari/grpc-federation/lsp/server\"\n)\n\nfunc TestHandler_Initialize(t *testing.T) {\n\tt.Parallel()\n\n\thandler := server.NewHandler(nil, &bytes.Buffer{}, nil)\n\n\tparams := &protocol.InitializeParams{\n\t\tCapabilities: protocol.ClientCapabilities{\n\t\t\tTextDocument: &protocol.TextDocumentClientCapabilities{\n\t\t\t\tSemanticTokens: &protocol.SemanticTokensClientCapabilities{\n\t\t\t\t\tTokenTypes: []string{string(protocol.SemanticTokenNamespace), string(protocol.SemanticTokenType)},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\texpected := &protocol.InitializeResult{\n\t\tCapabilities: protocol.ServerCapabilities{\n\t\t\tTextDocumentSync:   protocol.TextDocumentSyncKindFull,\n\t\t\tDefinitionProvider: true,\n\t\t\tCompletionProvider: &protocol.CompletionOptions{\n\t\t\t\tTriggerCharacters: []string{\"$\", \".\", \" \"},\n\t\t\t},\n\t\t\tSemanticTokensProvider: map[string]interface{}{\n\t\t\t\t\"legend\": protocol.SemanticTokensLegend{\n\t\t\t\t\tTokenTypes: []protocol.SemanticTokenTypes{\n\t\t\t\t\t\tprotocol.SemanticTokenNamespace,\n\t\t\t\t\t\tprotocol.SemanticTokenType,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"full\": true,\n\t\t\t},\n\t\t\tSelectionRangeProvider: true,\n\t\t},\n\t\tServerInfo: &protocol.ServerInfo{\n\t\t\tName:    \"grpc-federation\",\n\t\t\tVersion: \"v0.0.1\",\n\t\t},\n\t}\n\n\tgot, err := handler.Initialize(context.Background(), params)\n\tif err != nil {\n\t\tt.Errorf(\"failed to call Initialize: %v\", err)\n\t}\n\n\tif diff := cmp.Diff(expected, got); diff != \"\" {\n\t\tt.Errorf(\"(-want +got)\\n%s\", diff)\n\t}\n}\n\nfunc TestHandler_Definition(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tdesc     string\n\t\tparams   *protocol.DefinitionParams\n\t\texpected []protocol.Location\n\t}{\n\t\t{\n\t\t\tdesc: \"message name definition\",\n\t\t\tparams: &protocol.DefinitionParams{\n\t\t\t\tTextDocumentPositionParams: protocol.TextDocumentPositionParams{\n\t\t\t\t\tTextDocument: protocol.TextDocumentIdentifier{\n\t\t\t\t\t\tURI: mustTestdataAbs(t, \"testdata/service.proto\"),\n\t\t\t\t\t},\n\t\t\t\t\tPosition: protocol.Position{\n\t\t\t\t\t\tLine:      25,\n\t\t\t\t\t\tCharacter: 15,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: []protocol.Location{\n\t\t\t\t{\n\t\t\t\t\tURI: mustTestdataAbs(t, \"testdata/service.proto\"),\n\t\t\t\t\tRange: protocol.Range{\n\t\t\t\t\t\tStart: protocol.Position{Line: 33, Character: 8},\n\t\t\t\t\t\tEnd:   protocol.Position{Line: 33, Character: 12},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"method name definition\",\n\t\t\tparams: &protocol.DefinitionParams{\n\t\t\t\tTextDocumentPositionParams: protocol.TextDocumentPositionParams{\n\t\t\t\t\tTextDocument: protocol.TextDocumentIdentifier{\n\t\t\t\t\t\tURI: mustTestdataAbs(t, \"testdata/service.proto\"),\n\t\t\t\t\t},\n\t\t\t\t\tPosition: protocol.Position{\n\t\t\t\t\t\tLine:      39,\n\t\t\t\t\t\tCharacter: 19,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: []protocol.Location{\n\t\t\t\t{\n\t\t\t\t\tURI: mustTestdataAbs(t, \"testdata/post.proto\"),\n\t\t\t\t\tRange: protocol.Range{\n\t\t\t\t\t\tStart: protocol.Position{Line: 7, Character: 6},\n\t\t\t\t\t\tEnd:   protocol.Position{Line: 7, Character: 13},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"no definition\",\n\t\t\tparams: &protocol.DefinitionParams{\n\t\t\t\tTextDocumentPositionParams: protocol.TextDocumentPositionParams{\n\t\t\t\t\tTextDocument: protocol.TextDocumentIdentifier{\n\t\t\t\t\t\tURI: mustTestdataAbs(t, \"testdata/service.proto\"),\n\t\t\t\t\t},\n\t\t\t\t\tPosition: protocol.Position{\n\t\t\t\t\t\tLine:      20,\n\t\t\t\t\t\tCharacter: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: []protocol.Location{},\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.desc, func(t *testing.T) {\n\t\t\tclient := protocol.ClientDispatcher(nil, zap.NewNop())\n\t\t\thandler := server.NewHandler(client, &bytes.Buffer{}, []string{\"testdata\"})\n\n\t\t\tgot, err := handler.Definition(context.Background(), tc.params)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"failed to call Definition: %v\", err)\n\t\t\t}\n\n\t\t\tif diff := cmp.Diff(got, tc.expected); diff != \"\" {\n\t\t\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc mustTestdataAbs(t *testing.T, path string) uri.URI {\n\tt.Helper()\n\n\tp, err := filepath.Abs(path)\n\tif err != nil {\n\t\tt.Fatalf(\"failed to get an absolute file path: %v\", err)\n\t}\n\treturn uri.URI(\"file://\" + p)\n}\n"
  },
  {
    "path": "lsp/server/semantic_tokens.go",
    "content": "//nolint:gosec\npackage server\n\nimport (\n\t\"fmt\"\n\t\"log/slog\"\n\t\"sort\"\n\t\"strings\"\n\n\t\"github.com/bufbuild/protocompile/ast\"\n\t\"github.com/google/cel-go/common\"\n\tcelast \"github.com/google/cel-go/common/ast\"\n\t\"github.com/google/cel-go/common/types\"\n\t\"github.com/google/cel-go/parser\"\n\t\"go.lsp.dev/protocol\"\n)\n\ntype SemanticTokenProvider struct {\n\tlogger           *slog.Logger\n\ttokenMap         map[ast.Token][]*SemanticToken\n\tfile             *File\n\ttree             *ast.FileNode\n\ttokenTypeMap     map[string]uint32\n\ttokenModifierMap map[string]uint32\n}\n\ntype SemanticToken struct {\n\tLine      uint32\n\tCol       uint32\n\tText      string\n\tType      string\n\tModifiers []string\n}\n\nfunc NewSemanticTokenProvider(logger *slog.Logger, file *File, tokenTypeMap map[string]uint32, tokenModifierMap map[string]uint32) *SemanticTokenProvider {\n\treturn &SemanticTokenProvider{\n\t\tlogger:           logger,\n\t\ttokenMap:         make(map[ast.Token][]*SemanticToken),\n\t\tfile:             file,\n\t\ttree:             file.getSource().AST(),\n\t\ttokenTypeMap:     tokenTypeMap,\n\t\ttokenModifierMap: tokenModifierMap,\n\t}\n}\n\nfunc (p *SemanticTokenProvider) createSemanticToken(tk ast.Token, tokenType string, modifiers []string) *SemanticToken {\n\tinfo := p.tree.TokenInfo(tk)\n\tpos := info.Start()\n\ttext := info.RawText()\n\treturn &SemanticToken{\n\t\tLine:      uint32(pos.Line),\n\t\tCol:       uint32(pos.Col),\n\t\tText:      text,\n\t\tType:      tokenType,\n\t\tModifiers: modifiers,\n\t}\n}\n\nfunc (p *SemanticTokenProvider) SemanticTokens() *protocol.SemanticTokens {\n\t_ = ast.Walk(p.tree, &ast.SimpleVisitor{\n\t\tDoVisitMessageNode: func(msg *ast.MessageNode) error {\n\t\t\ttk := msg.Name.Token()\n\t\t\tp.tokenMap[tk] = append(\n\t\t\t\tp.tokenMap[tk],\n\t\t\t\tp.createSemanticToken(tk, string(protocol.SemanticTokenType), nil),\n\t\t\t)\n\t\t\treturn nil\n\t\t},\n\t\tDoVisitFieldNode: func(field *ast.FieldNode) error {\n\t\t\tswitch typ := field.FldType.(type) {\n\t\t\tcase *ast.IdentNode:\n\t\t\t\ttk := typ.Token()\n\t\t\t\tp.tokenMap[tk] = append(\n\t\t\t\t\tp.tokenMap[tk],\n\t\t\t\t\tp.createSemanticToken(tk, string(protocol.SemanticTokenType), nil),\n\t\t\t\t)\n\t\t\tcase *ast.CompoundIdentNode:\n\t\t\t\tfor _, component := range typ.Components {\n\t\t\t\t\ttk := component.Token()\n\t\t\t\t\tp.tokenMap[tk] = append(\n\t\t\t\t\t\tp.tokenMap[tk],\n\t\t\t\t\t\tp.createSemanticToken(tk, string(protocol.SemanticTokenType), nil),\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t\tnameTk := field.Name.Token()\n\t\t\tp.tokenMap[nameTk] = append(\n\t\t\t\tp.tokenMap[nameTk],\n\t\t\t\tp.createSemanticToken(nameTk, string(protocol.SemanticTokenProperty), nil),\n\t\t\t)\n\t\t\treturn nil\n\t\t},\n\t\tDoVisitEnumNode: func(enum *ast.EnumNode) error {\n\t\t\ttk := enum.Name.Token()\n\t\t\tp.tokenMap[tk] = append(\n\t\t\t\tp.tokenMap[tk],\n\t\t\t\tp.createSemanticToken(tk, string(protocol.SemanticTokenType), nil),\n\t\t\t)\n\t\t\treturn nil\n\t\t},\n\t\tDoVisitEnumValueNode: func(value *ast.EnumValueNode) error {\n\t\t\ttk := value.Name.Token()\n\t\t\tp.tokenMap[tk] = append(\n\t\t\t\tp.tokenMap[tk],\n\t\t\t\tp.createSemanticToken(tk, string(protocol.SemanticTokenEnumMember), nil),\n\t\t\t)\n\t\t\treturn nil\n\t\t},\n\t\tDoVisitServiceNode: func(svc *ast.ServiceNode) error {\n\t\t\ttk := svc.Name.Token()\n\t\t\tp.tokenMap[tk] = append(\n\t\t\t\tp.tokenMap[tk],\n\t\t\t\tp.createSemanticToken(tk, string(protocol.SemanticTokenType), nil),\n\t\t\t)\n\t\t\treturn nil\n\t\t},\n\t\tDoVisitRPCNode: func(rpc *ast.RPCNode) error {\n\t\t\tnameTk := rpc.Name.Token()\n\t\t\tinputTk := rpc.Input.MessageType.Start()\n\t\t\toutputTk := rpc.Output.MessageType.Start()\n\n\t\t\tp.tokenMap[nameTk] = append(\n\t\t\t\tp.tokenMap[nameTk],\n\t\t\t\tp.createSemanticToken(nameTk, string(protocol.SemanticTokenMethod), nil),\n\t\t\t)\n\t\t\tp.tokenMap[inputTk] = append(\n\t\t\t\tp.tokenMap[inputTk],\n\t\t\t\tp.createSemanticToken(inputTk, string(protocol.SemanticTokenType), nil),\n\t\t\t)\n\t\t\tp.tokenMap[outputTk] = append(\n\t\t\t\tp.tokenMap[outputTk],\n\t\t\t\tp.createSemanticToken(outputTk, string(protocol.SemanticTokenType), nil),\n\t\t\t)\n\t\t\treturn nil\n\t\t},\n\t\tDoVisitOptionNode: func(opt *ast.OptionNode) error {\n\t\t\tparts := make([]string, 0, len(opt.Name.Parts))\n\t\t\tfor _, part := range opt.Name.Parts {\n\t\t\t\tparts = append(parts, string(part.Name.AsIdentifier()))\n\t\t\t\tswitch n := part.Name.(type) {\n\t\t\t\tcase *ast.CompoundIdentNode:\n\t\t\t\t\tfor _, comp := range n.Components {\n\t\t\t\t\t\ttk := comp.Token()\n\t\t\t\t\t\tp.tokenMap[tk] = append(\n\t\t\t\t\t\t\tp.tokenMap[tk],\n\t\t\t\t\t\t\tp.createSemanticToken(tk, string(protocol.SemanticTokenNamespace), nil),\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\toptName := strings.TrimPrefix(strings.Join(parts, \".\"), \".\")\n\t\t\tif strings.HasPrefix(optName, \"grpc.federation.\") {\n\t\t\t\tvar optType FederationOptionType\n\t\t\t\tswitch {\n\t\t\t\tcase strings.Contains(optName, \".service\"):\n\t\t\t\t\toptType = ServiceOption\n\t\t\t\tcase strings.Contains(optName, \".method\"):\n\t\t\t\t\toptType = MethodOption\n\t\t\t\tcase strings.Contains(optName, \".message\"):\n\t\t\t\t\toptType = MessageOption\n\t\t\t\tcase strings.Contains(optName, \".field\"):\n\t\t\t\t\toptType = FieldOption\n\t\t\t\tcase strings.Contains(optName, \".enum_value\"):\n\t\t\t\t\toptType = EnumValueOption\n\t\t\t\tcase strings.Contains(optName, \".enum\"):\n\t\t\t\t\toptType = EnumOption\n\t\t\t\t}\n\t\t\t\tctx := newSemanticTokenProviderContext(optType)\n\t\t\t\tswitch n := opt.Val.(type) {\n\t\t\t\tcase *ast.StringLiteralNode:\n\t\t\t\t\tlastPart := opt.Name.Parts[len(opt.Name.Parts)-1]\n\t\t\t\t\ttk := lastPart.Name.Start()\n\t\t\t\t\tp.tokenMap[tk] = append(\n\t\t\t\t\t\tp.tokenMap[tk],\n\t\t\t\t\t\tp.createSemanticToken(tk, string(protocol.SemanticTokenProperty), nil),\n\t\t\t\t\t)\n\t\t\t\t\tswitch {\n\t\t\t\t\tcase strings.HasSuffix(optName, \"by\"):\n\t\t\t\t\t\tif err := p.setCELSemanticTokens(n); err != nil {\n\t\t\t\t\t\t\tp.logger.Error(err.Error())\n\t\t\t\t\t\t}\n\t\t\t\t\tcase strings.HasSuffix(optName, \"alias\"):\n\t\t\t\t\t\tp.setAliasToken(ctx, n)\n\t\t\t\t\t}\n\t\t\t\tcase *ast.CompoundStringLiteralNode:\n\t\t\t\t\tswitch {\n\t\t\t\t\tcase strings.HasSuffix(optName, \"by\"):\n\t\t\t\t\t\tif err := p.setCELSemanticTokens(n); err != nil {\n\t\t\t\t\t\t\tp.logger.Error(err.Error())\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tp.setFederationOptionTokens(ctx, opt.Val)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn nil\n\t\t},\n\t})\n\n\tvar (\n\t\tline = uint32(1)\n\t\tcol  = uint32(1)\n\t\tdata []uint32\n\t)\n\t_ = ast.Walk(p.tree, &ast.SimpleVisitor{\n\t\tDoVisitTerminalNode: func(n ast.TerminalNode) error {\n\t\t\tcurToken := n.Token()\n\t\t\tinfo := p.tree.TokenInfo(curToken)\n\n\t\t\tcomments := info.LeadingComments()\n\t\t\tfor i := 0; i < comments.Len(); i++ {\n\t\t\t\tcomment := comments.Index(i)\n\t\t\t\tpos := comment.Start()\n\t\t\t\tfor _, text := range strings.Split(comment.RawText(), \"\\n\") {\n\t\t\t\t\tdiffLine, diffCol := p.calcLineAndCol(pos, line, col)\n\t\t\t\t\tline = uint32(pos.Line)\n\t\t\t\t\tcol = uint32(pos.Col)\n\t\t\t\t\ttokenNum := p.tokenTypeMap[string(protocol.SemanticTokenComment)]\n\t\t\t\t\tdata = append(data, diffLine, diffCol, uint32(len(text)), tokenNum, 0)\n\t\t\t\t\tpos = ast.SourcePos{\n\t\t\t\t\t\tLine: pos.Line + 1,\n\t\t\t\t\t\tCol:  pos.Col,\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttokens, exists := p.tokenMap[n.Token()]\n\t\t\tif !exists {\n\t\t\t\tswitch nn := n.(type) {\n\t\t\t\tcase *ast.IdentNode:\n\t\t\t\t\tident := nn.AsIdentifier()\n\t\t\t\t\tvar tokenType string\n\t\t\t\t\tif ident == \"true\" || ident == \"false\" {\n\t\t\t\t\t\ttokenType = string(protocol.SemanticTokenKeyword)\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttokenType = string(protocol.SemanticTokenVariable)\n\t\t\t\t\t}\n\t\t\t\t\ttokens = append(tokens, p.createSemanticToken(n.Token(), tokenType, nil))\n\t\t\t\tcase *ast.KeywordNode:\n\t\t\t\t\ttokens = append(tokens, p.createSemanticToken(n.Token(), string(protocol.SemanticTokenKeyword), nil))\n\t\t\t\tcase *ast.UintLiteralNode:\n\t\t\t\t\ttokens = append(tokens, p.createSemanticToken(n.Token(), string(protocol.SemanticTokenNumber), nil))\n\t\t\t\tcase *ast.StringLiteralNode:\n\t\t\t\t\ttokens = append(tokens, p.createSemanticToken(n.Token(), string(protocol.SemanticTokenString), nil))\n\t\t\t\tdefault:\n\t\t\t\t\ttokens = append(tokens, p.createSemanticToken(n.Token(), string(protocol.SemanticTokenOperator), nil))\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor _, token := range tokens {\n\t\t\t\tdiffLine, diffCol := p.calcLineAndCol(ast.SourcePos{\n\t\t\t\t\tLine: int(token.Line),\n\t\t\t\t\tCol:  int(token.Col),\n\t\t\t\t}, line, col)\n\n\t\t\t\tline = token.Line\n\t\t\t\tcol = token.Col\n\n\t\t\t\ttokenNum := p.tokenTypeMap[token.Type]\n\t\t\t\tvar mod uint32\n\t\t\t\tfor _, modifier := range token.Modifiers {\n\t\t\t\t\tmod |= p.tokenModifierMap[modifier]\n\t\t\t\t}\n\t\t\t\tdata = append(data, diffLine, diffCol, uint32(len([]rune(token.Text))), tokenNum, mod)\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tcomments := info.TrailingComments()\n\t\t\t\tfor i := 0; i < comments.Len(); i++ {\n\t\t\t\t\tcomment := comments.Index(i)\n\t\t\t\t\tpos := comment.Start()\n\t\t\t\t\tfor _, text := range strings.Split(comment.RawText(), \"\\n\") {\n\t\t\t\t\t\tdiffLine, diffCol := p.calcLineAndCol(pos, line, col)\n\t\t\t\t\t\tline = uint32(pos.Line)\n\t\t\t\t\t\tcol = uint32(pos.Col)\n\t\t\t\t\t\ttokenNum := p.tokenTypeMap[string(protocol.SemanticTokenComment)]\n\t\t\t\t\t\tdata = append(data, diffLine, diffCol, uint32(len(text)), tokenNum, 0)\n\t\t\t\t\t\tpos = ast.SourcePos{\n\t\t\t\t\t\t\tLine: pos.Line + 1,\n\t\t\t\t\t\t\tCol:  pos.Col,\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn nil\n\t\t},\n\t})\n\n\treturn &protocol.SemanticTokens{Data: data}\n}\n\nfunc (p *SemanticTokenProvider) calcLineAndCol(pos ast.SourcePos, line, col uint32) (uint32, uint32) {\n\tif uint32(pos.Line) == line {\n\t\treturn 0, uint32(pos.Col) - col\n\t}\n\treturn uint32(pos.Line) - line, uint32(pos.Col) - 1\n}\n\ntype FederationOptionType int\n\nconst (\n\tServiceOption FederationOptionType = iota\n\tMethodOption\n\tMessageOption\n\tFieldOption\n\tEnumOption\n\tEnumValueOption\n)\n\ntype SemanticTokenProviderContext struct {\n\toptionType FederationOptionType\n\tmessage    bool\n\tenum       bool\n}\n\nfunc newSemanticTokenProviderContext(optType FederationOptionType) *SemanticTokenProviderContext {\n\treturn &SemanticTokenProviderContext{\n\t\toptionType: optType,\n\t}\n}\n\nfunc (c *SemanticTokenProviderContext) clone() *SemanticTokenProviderContext {\n\tctx := new(SemanticTokenProviderContext)\n\tctx.optionType = c.optionType\n\tctx.message = c.message\n\tctx.enum = c.enum\n\treturn ctx\n}\n\nfunc (c *SemanticTokenProviderContext) withMessage() *SemanticTokenProviderContext {\n\tctx := c.clone()\n\tctx.message = true\n\treturn ctx\n}\n\nfunc (c *SemanticTokenProviderContext) withEnum() *SemanticTokenProviderContext {\n\tctx := c.clone()\n\tctx.enum = true\n\treturn ctx\n}\n\nfunc (p *SemanticTokenProvider) setFederationOptionTokens(ctx *SemanticTokenProviderContext, node ast.Node) {\n\tswitch n := node.(type) {\n\tcase *ast.MessageLiteralNode:\n\t\tfor _, elem := range n.Elements {\n\t\t\ttk := elem.Name.Name.Start()\n\t\t\tp.tokenMap[tk] = append(\n\t\t\t\tp.tokenMap[tk],\n\t\t\t\tp.createSemanticToken(\n\t\t\t\t\ttk,\n\t\t\t\t\tstring(protocol.SemanticTokenProperty),\n\t\t\t\t\t[]string{\n\t\t\t\t\t\tstring(protocol.SemanticTokenModifierDeclaration),\n\t\t\t\t\t\tstring(protocol.SemanticTokenModifierDefaultLibrary),\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t)\n\n\t\t\toptName := elem.Name.Name.AsIdentifier()\n\t\t\tswitch optName {\n\t\t\tcase \"enum\":\n\t\t\t\tp.setFederationOptionTokens(ctx.withEnum(), elem.Val)\n\t\t\tcase \"message\":\n\t\t\t\tif _, ok := elem.Val.(*ast.MessageLiteralNode); ok {\n\t\t\t\t\tp.setFederationOptionTokens(ctx.withMessage(), elem.Val)\n\t\t\t\t} else {\n\t\t\t\t\tif err := p.setCELSemanticTokens(elem.Val); err != nil {\n\t\t\t\t\t\tp.logger.Error(err.Error())\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\tcase \"name\":\n\t\t\t\tp.setNameToken(ctx, elem.Val)\n\t\t\tcase \"if\", \"by\", \"inline\", \"src\", \"type\", \"subject\", \"description\":\n\t\t\t\tif err := p.setCELSemanticTokens(elem.Val); err != nil {\n\t\t\t\t\tp.logger.Error(err.Error())\n\t\t\t\t}\n\t\t\tcase \"alias\":\n\t\t\t\tp.setAliasToken(ctx, elem.Val)\n\t\t\tcase \"method\":\n\t\t\t\tp.setMethodToken(ctx, elem.Val)\n\t\t\tcase \"field\":\n\t\t\t\tp.setFieldToken(ctx, elem.Val)\n\t\t\tcase \"locale\":\n\t\t\t\tp.setLocaleToken(ctx, elem.Val)\n\t\t\tdefault:\n\t\t\t\tp.setFederationOptionTokens(ctx, elem.Val)\n\t\t\t}\n\t\t}\n\tcase *ast.ArrayLiteralNode:\n\t\tfor _, elem := range n.Elements {\n\t\t\tp.setFederationOptionTokens(ctx, elem)\n\t\t}\n\t}\n}\n\nfunc (p *SemanticTokenProvider) setNameToken(ctx *SemanticTokenProviderContext, val ast.ValueNode) {\n\ttk := val.Start()\n\tinfo := p.tree.TokenInfo(tk)\n\tpos := info.Start()\n\ttext := info.RawText()\n\tname := strings.Trim(text, `\"`)\n\ttokenType := string(protocol.SemanticTokenVariable)\n\tif ctx.message || ctx.enum {\n\t\ttokenType = string(protocol.SemanticTokenType)\n\t}\n\tp.tokenMap[tk] = append(p.tokenMap[tk], []*SemanticToken{\n\t\t{\n\t\t\tLine: uint32(pos.Line),\n\t\t\tCol:  uint32(pos.Col),\n\t\t\tText: `\"`,\n\t\t\tType: string(protocol.SemanticTokenString),\n\t\t},\n\t\t{\n\t\t\tLine: uint32(pos.Line),\n\t\t\tCol:  uint32(pos.Col) + 1,\n\t\t\tText: name,\n\t\t\tType: tokenType,\n\t\t\tModifiers: []string{\n\t\t\t\tstring(protocol.SemanticTokenModifierDefinition),\n\t\t\t\tstring(protocol.SemanticTokenModifierReadonly),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tLine: uint32(pos.Line),\n\t\t\tCol:  uint32(pos.Col + len(text) - 1),\n\t\t\tText: `\"`,\n\t\t\tType: string(protocol.SemanticTokenString),\n\t\t},\n\t}...)\n\tctx.message = false\n\tctx.enum = false\n}\n\nfunc (p *SemanticTokenProvider) setLocaleToken(_ *SemanticTokenProviderContext, val ast.ValueNode) {\n\ttk := val.Start()\n\tinfo := p.tree.TokenInfo(tk)\n\tpos := info.Start()\n\ttext := info.RawText()\n\tname := strings.Trim(text, `\"`)\n\ttokenType := string(protocol.SemanticTokenVariable)\n\tp.tokenMap[tk] = append(p.tokenMap[tk], []*SemanticToken{\n\t\t{\n\t\t\tLine: uint32(pos.Line),\n\t\t\tCol:  uint32(pos.Col),\n\t\t\tText: `\"`,\n\t\t\tType: string(protocol.SemanticTokenString),\n\t\t},\n\t\t{\n\t\t\tLine: uint32(pos.Line),\n\t\t\tCol:  uint32(pos.Col) + 1,\n\t\t\tText: name,\n\t\t\tType: tokenType,\n\t\t\tModifiers: []string{\n\t\t\t\tstring(protocol.SemanticTokenModifierDefinition),\n\t\t\t\tstring(protocol.SemanticTokenModifierReadonly),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tLine: uint32(pos.Line),\n\t\t\tCol:  uint32(pos.Col + len(text) - 1),\n\t\t\tText: `\"`,\n\t\t\tType: string(protocol.SemanticTokenString),\n\t\t},\n\t}...)\n}\n\nfunc (p *SemanticTokenProvider) setMethodToken(_ *SemanticTokenProviderContext, val ast.ValueNode) {\n\ttk := val.Start()\n\tinfo := p.tree.TokenInfo(tk)\n\tpos := info.Start()\n\ttext := info.RawText()\n\tname := strings.Trim(text, `\"`)\n\tp.tokenMap[tk] = append(p.tokenMap[tk], []*SemanticToken{\n\t\t{\n\t\t\tLine: uint32(pos.Line),\n\t\t\tCol:  uint32(pos.Col),\n\t\t\tText: `\"`,\n\t\t\tType: string(protocol.SemanticTokenString),\n\t\t},\n\t\t{\n\t\t\tLine: uint32(pos.Line),\n\t\t\tCol:  uint32(pos.Col + 1),\n\t\t\tText: name,\n\t\t\tType: string(protocol.SemanticTokenMethod),\n\t\t\tModifiers: []string{\n\t\t\t\tstring(protocol.SemanticTokenModifierReadonly),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tLine: uint32(pos.Line),\n\t\t\tCol:  uint32(pos.Col + len(text) - 1),\n\t\t\tText: `\"`,\n\t\t\tType: string(protocol.SemanticTokenString),\n\t\t},\n\t}...)\n}\n\nfunc (p *SemanticTokenProvider) setFieldToken(_ *SemanticTokenProviderContext, val ast.ValueNode) {\n\ttk := val.Start()\n\tinfo := p.tree.TokenInfo(tk)\n\tpos := info.Start()\n\ttext := info.RawText()\n\tname := strings.Trim(text, `\"`)\n\tp.tokenMap[tk] = append(p.tokenMap[tk], []*SemanticToken{\n\t\t{\n\t\t\tLine: uint32(pos.Line),\n\t\t\tCol:  uint32(pos.Col),\n\t\t\tText: `\"`,\n\t\t\tType: string(protocol.SemanticTokenString),\n\t\t},\n\t\t{\n\t\t\tLine: uint32(pos.Line),\n\t\t\tCol:  uint32(pos.Col + 1),\n\t\t\tText: name,\n\t\t\tType: string(protocol.SemanticTokenVariable),\n\t\t},\n\t\t{\n\t\t\tLine: uint32(pos.Line),\n\t\t\tCol:  uint32(pos.Col + len(text) - 1),\n\t\t\tText: `\"`,\n\t\t\tType: string(protocol.SemanticTokenString),\n\t\t},\n\t}...)\n}\n\nfunc (p *SemanticTokenProvider) setAliasToken(ctx *SemanticTokenProviderContext, val ast.ValueNode) {\n\tvar tokenType string\n\tswitch ctx.optionType {\n\tcase MessageOption:\n\t\ttokenType = string(protocol.SemanticTokenType)\n\tcase FieldOption:\n\t\ttokenType = string(protocol.SemanticTokenVariable)\n\tcase EnumOption:\n\t\ttokenType = string(protocol.SemanticTokenType)\n\tcase EnumValueOption:\n\t\ttokenType = string(protocol.SemanticTokenEnumMember)\n\t}\n\n\taddToken := func(val *ast.StringLiteralNode) {\n\t\ttk := val.Start()\n\t\tinfo := p.tree.TokenInfo(tk)\n\t\tpos := info.Start()\n\t\ttext := info.RawText()\n\t\tname := strings.Trim(text, `\"`)\n\t\tp.tokenMap[tk] = append(p.tokenMap[tk], []*SemanticToken{\n\t\t\t{\n\t\t\t\tLine: uint32(pos.Line),\n\t\t\t\tCol:  uint32(pos.Col),\n\t\t\t\tText: `\"`,\n\t\t\t\tType: string(protocol.SemanticTokenString),\n\t\t\t},\n\t\t\t{\n\t\t\t\tLine: uint32(pos.Line),\n\t\t\t\tCol:  uint32(pos.Col + 1),\n\t\t\t\tText: name,\n\t\t\t\tType: tokenType,\n\t\t\t\tModifiers: []string{\n\t\t\t\t\tstring(protocol.SemanticTokenModifierReadonly),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tLine: uint32(pos.Line),\n\t\t\t\tCol:  uint32(pos.Col + len(text) - 1),\n\t\t\t\tText: `\"`,\n\t\t\t\tType: string(protocol.SemanticTokenString),\n\t\t\t},\n\t\t}...)\n\t}\n\n\tswitch n := val.(type) {\n\tcase *ast.StringLiteralNode:\n\t\taddToken(n)\n\tcase *ast.ArrayLiteralNode:\n\t\tfor _, elem := range n.Elements {\n\t\t\tval, ok := elem.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\taddToken(val)\n\t\t}\n\t}\n}\n\nfunc (p *SemanticTokenProvider) setCELSemanticTokens(value ast.ValueNode) error {\n\tvar strs []*ast.StringLiteralNode\n\tswitch v := value.(type) {\n\tcase *ast.StringLiteralNode:\n\t\tstrs = append(strs, v)\n\tcase *ast.CompoundStringLiteralNode:\n\t\tfor _, child := range v.Children() {\n\t\t\tstr, ok := child.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tstrs = append(strs, str)\n\t\t}\n\tdefault:\n\t\treturn fmt.Errorf(\"unexpected value node type for CEL expression. type is %T\", value)\n\t}\n\tvar (\n\t\tallTexts    []string\n\t\tlineOffsets []LineOffset\n\t\toffset      int\n\t)\n\tfor _, str := range strs {\n\t\ttk := str.Token()\n\t\tinfo := p.tree.TokenInfo(tk)\n\t\tpos := info.Start()\n\t\ttext := info.RawText()\n\t\tcelText := strings.Trim(strings.Replace(text, \"$\", \"a\", -1), `\"`)\n\t\tallTexts = append(allTexts, celText)\n\n\t\tcelTextLen := len([]rune(celText))\n\n\t\tlineOffsets = append(lineOffsets, LineOffset{\n\t\t\tOriginalLine: uint32(pos.Line),\n\t\t\tStartOffset:  offset,\n\t\t\tEndOffset:    offset + celTextLen,\n\t\t})\n\t\toffset += celTextLen\n\t}\n\tsrc := strings.Join(allTexts, \"\")\n\tcelParser, err := parser.NewParser(parser.EnableOptionalSyntax(true))\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to create CEL parser: %w\", err)\n\t}\n\tcelAST, errs := celParser.Parse(common.NewTextSource(src))\n\tif len(errs.GetErrors()) != 0 {\n\t\treturn fmt.Errorf(\"failed to parse %s: %s\", src, errs.ToDisplayString())\n\t}\n\tprovider := newCELSemanticTokenProvider(celAST, lineOffsets, src)\n\tlineNumToTokens := provider.SemanticTokens()\n\n\tfor _, value := range strs {\n\t\ttk := value.Token()\n\t\tinfo := p.tree.TokenInfo(tk)\n\t\tpos := info.Start()\n\t\ttext := info.RawText()\n\t\toriginalLine := uint32(pos.Line)\n\t\ttokens := lineNumToTokens[originalLine]\n\n\t\tp.tokenMap[tk] = append(p.tokenMap[tk], &SemanticToken{\n\t\t\tLine: uint32(pos.Line),\n\t\t\tCol:  uint32(pos.Col),\n\t\t\tText: `\"`,\n\t\t\tType: string(protocol.SemanticTokenString),\n\t\t})\n\t\tlineEndCol := uint32(pos.Col + len([]rune(text)) - 1)\n\t\tif len(tokens) == 0 {\n\t\t\tp.tokenMap[tk] = append(p.tokenMap[tk], &SemanticToken{\n\t\t\t\tLine: uint32(pos.Line),\n\t\t\t\tCol:  uint32(pos.Col + 1),\n\t\t\t\tText: strings.Trim(text, `\"`),\n\t\t\t\tType: string(protocol.SemanticTokenString),\n\t\t\t})\n\t\t\tcontinue\n\t\t}\n\n\t\tfor _, token := range tokens {\n\t\t\ttoken.Col += uint32(pos.Col)\n\t\t\tp.tokenMap[tk] = append(p.tokenMap[tk], token)\n\t\t}\n\t\tp.tokenMap[tk] = append(p.tokenMap[tk], &SemanticToken{\n\t\t\tLine: uint32(pos.Line),\n\t\t\tCol:  lineEndCol,\n\t\t\tText: `\"`,\n\t\t\tType: string(protocol.SemanticTokenString),\n\t\t})\n\t}\n\treturn nil\n}\n\ntype CELSemanticTokenProvider struct {\n\tlineNumToTokens map[uint32][]*SemanticToken\n\ttree            *celast.AST\n\tinfo            *celast.SourceInfo\n\tlineOffsets     []LineOffset\n\tfullText        string // Complete concatenated string\n}\n\ntype LineOffset struct {\n\tOriginalLine uint32\n\tStartOffset  int // Character offset (cumulative position)\n\tEndOffset    int // Character offset (cumulative position)\n}\n\nfunc newCELSemanticTokenProvider(tree *celast.AST, lineOffsets []LineOffset, fullText string) *CELSemanticTokenProvider {\n\treturn &CELSemanticTokenProvider{\n\t\tlineNumToTokens: make(map[uint32][]*SemanticToken),\n\t\ttree:            tree,\n\t\tinfo:            tree.SourceInfo(),\n\t\tlineOffsets:     lineOffsets,\n\t\tfullText:        fullText,\n\t}\n}\n\nfunc (p *CELSemanticTokenProvider) SemanticTokens() map[uint32][]*SemanticToken {\n\tcelast.PostOrderVisit(p.tree.Expr(), p)\n\n\tfor _, tokens := range p.lineNumToTokens {\n\t\tsort.Slice(tokens, func(i, j int) bool {\n\t\t\tif tokens[i].Col == tokens[j].Col {\n\t\t\t\t// For tokens at the same column position, use stable ordering\n\t\t\t\t// Use text length as secondary sort key for consistency\n\t\t\t\tif len(tokens[i].Text) != len(tokens[j].Text) {\n\t\t\t\t\treturn len(tokens[i].Text) < len(tokens[j].Text)\n\t\t\t\t}\n\t\t\t\t// If same length, use lexicographic ordering for consistency\n\t\t\t\treturn tokens[i].Text < tokens[j].Text\n\t\t\t}\n\t\t\treturn tokens[i].Col < tokens[j].Col\n\t\t})\n\t}\n\treturn p.lineNumToTokens\n}\n\nfunc (p *CELSemanticTokenProvider) mapToOriginalPosition(pos common.Location) (uint32, uint32) {\n\tcol := pos.Column()\n\tif len(p.lineOffsets) == 0 {\n\t\t// CEL parser reports correct field position (2) for SelectKind,\n\t\t// so adding +1 for 1-based conversion should give correct position (3)\n\t\treturn uint32(pos.Line()), uint32(col + 1)\n\t}\n\n\t// Calculate which original line this rune position belongs to and the position within that line\n\tfor _, lineOffset := range p.lineOffsets {\n\t\tif col >= lineOffset.StartOffset && col < lineOffset.EndOffset {\n\t\t\t// Calculate column position within this line\n\t\t\tcolFromCurLine := col - lineOffset.StartOffset\n\n\t\t\t// Return 1-based column position\n\t\t\treturn lineOffset.OriginalLine, uint32(colFromCurLine + 1)\n\t\t}\n\t}\n\n\t// Default for out-of-range cases\n\treturn uint32(1), uint32(col + 1)\n}\n\n// addStringTokenWithSplitCheck adds a string token and automatically splits it across line boundaries.\nfunc (p *CELSemanticTokenProvider) addStringTokenWithSplitCheck(line uint32, col uint32, text string, tokenType string) {\n\tif len(p.lineOffsets) == 0 {\n\t\t// Normal processing when LineOffsets are not available\n\t\tp.lineNumToTokens[line] = append(p.lineNumToTokens[line], &SemanticToken{\n\t\t\tLine: line,\n\t\t\tCol:  col,\n\t\t\tText: text,\n\t\t\tType: tokenType,\n\t\t})\n\t\treturn\n\t}\n\n\ttextRunes := []rune(text)\n\ttextLen := len(textRunes)\n\n\t// Find LineOffset for current line\n\tvar curLineOffset *LineOffset\n\tfor i, lineOffset := range p.lineOffsets {\n\t\tif lineOffset.OriginalLine == line {\n\t\t\tcurLineOffset = &p.lineOffsets[i]\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif curLineOffset == nil {\n\t\t// Normal processing when LineOffset is not found\n\t\tp.lineNumToTokens[line] = append(p.lineNumToTokens[line], &SemanticToken{\n\t\t\tLine: line,\n\t\t\tCol:  col,\n\t\t\tText: text,\n\t\t\tType: tokenType,\n\t\t})\n\t\treturn\n\t}\n\n\t// Calculate actual length of each line from LineOffset\n\tactualLineCount := curLineOffset.EndOffset - curLineOffset.StartOffset\n\tavailableSpace := actualLineCount - int(col) + 1\n\n\tif availableSpace <= 0 || textLen <= availableSpace {\n\t\t// When string fits within the line\n\t\tp.lineNumToTokens[line] = append(p.lineNumToTokens[line], &SemanticToken{\n\t\t\tLine: line,\n\t\t\tCol:  col,\n\t\t\tText: text,\n\t\t\tType: tokenType,\n\t\t})\n\t\treturn\n\t}\n\n\t// Split when string exceeds line\n\tfirstPart := string(textRunes[:availableSpace])\n\tsecondPart := string(textRunes[availableSpace:])\n\n\t// First part to current line\n\tp.lineNumToTokens[line] = append(p.lineNumToTokens[line], &SemanticToken{\n\t\tLine: line,\n\t\tCol:  col,\n\t\tText: firstPart,\n\t\tType: tokenType,\n\t})\n\n\t// Second part to next line\n\tfor _, nextLineOffset := range p.lineOffsets {\n\t\tif nextLineOffset.OriginalLine > line {\n\t\t\tp.lineNumToTokens[nextLineOffset.OriginalLine] = append(p.lineNumToTokens[nextLineOffset.OriginalLine], &SemanticToken{\n\t\t\t\tLine: nextLineOffset.OriginalLine,\n\t\t\t\tCol:  1,\n\t\t\t\tText: secondPart,\n\t\t\t\tType: tokenType,\n\t\t\t})\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc (p *CELSemanticTokenProvider) VisitExpr(expr celast.Expr) {\n\tid := expr.ID()\n\tstart := p.info.GetStartLocation(id)\n\toriginalLine, col := p.mapToOriginalPosition(start)\n\tline := originalLine\n\n\tswitch expr.Kind() {\n\tcase celast.CallKind:\n\t\tfnName := expr.AsCall().FunctionName()\n\t\tif strings.HasPrefix(fnName, \"_\") {\n\t\t\topName := strings.Trim(fnName, \"_\")\n\t\t\tif strings.Contains(opName, \"_\") {\n\t\t\t\tfnName = \"*\" // operation type. this name is dummy text.\n\t\t\t} else {\n\t\t\t\tfnName = opName\n\t\t\t}\n\t\t}\n\t\t// Don't adjust column for function names to maintain correct ordering\n\t\t// The CEL parser position should be used as-is for consistency with other token types\n\n\t\t// Calculate actual position of function name\n\t\tadjustedCol := col\n\t\toriginalFnName := expr.AsCall().FunctionName()\n\n\t\t// Adjust position only for regular function names (not operators or dummy tokens)\n\t\tif !strings.HasPrefix(originalFnName, \"_\") && fnName != \"*\" {\n\t\t\t// CEL parser reports position of '(' for CallKind,\n\t\t\t// so function name is before it\n\t\t\tfnNameRuneLen := len([]rune(fnName))\n\t\t\tif col >= uint32(fnNameRuneLen) {\n\t\t\t\tadjustedCol = col - uint32(fnNameRuneLen)\n\t\t\t}\n\t\t}\n\n\t\tp.lineNumToTokens[line] = append(p.lineNumToTokens[line], &SemanticToken{\n\t\t\tLine: line,\n\t\t\tCol:  adjustedCol,\n\t\t\tText: fnName,\n\t\t\tType: string(protocol.SemanticTokenMethod),\n\t\t})\n\tcase celast.ComprehensionKind:\n\t\tp.lineNumToTokens[line] = append(p.lineNumToTokens[line], &SemanticToken{\n\t\t\tLine: line,\n\t\t\tCol:  col,\n\t\t})\n\tcase celast.IdentKind:\n\t\tp.lineNumToTokens[line] = append(p.lineNumToTokens[line], &SemanticToken{\n\t\t\tLine:      line,\n\t\t\tCol:       col,\n\t\t\tText:      expr.AsIdent(),\n\t\t\tType:      string(protocol.SemanticTokenVariable),\n\t\t\tModifiers: []string{string(protocol.SemanticTokenModifierReadonly)},\n\t\t})\n\tcase celast.ListKind:\n\t\tp.lineNumToTokens[line] = append(p.lineNumToTokens[line], &SemanticToken{\n\t\t\tLine: line,\n\t\t\tCol:  col,\n\t\t})\n\tcase celast.LiteralKind:\n\t\tlit := expr.AsLiteral()\n\t\ttext := fmt.Sprint(lit.Value())\n\t\tif lit.Type() == types.StringType {\n\t\t\ttext = fmt.Sprintf(`'%s'`, text)\n\t\t\t// Check if string length may exceed line boundaries\n\t\t\tp.addStringTokenWithSplitCheck(line, col, text, string(protocol.SemanticTokenKeyword))\n\t\t} else {\n\t\t\tif rng, ok := p.info.GetOffsetRange(id); ok {\n\t\t\t\ttext := []rune(p.fullText)[rng.Start:rng.Stop]\n\t\t\t\tp.lineNumToTokens[line] = append(p.lineNumToTokens[line], &SemanticToken{\n\t\t\t\t\tLine: line,\n\t\t\t\t\tCol:  col,\n\t\t\t\t\tText: string(text),\n\t\t\t\t\tType: string(protocol.SemanticTokenKeyword),\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tp.lineNumToTokens[line] = append(p.lineNumToTokens[line], &SemanticToken{\n\t\t\t\t\tLine: line,\n\t\t\t\t\tCol:  col,\n\t\t\t\t\tText: text,\n\t\t\t\t\tType: string(protocol.SemanticTokenKeyword),\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\tcase celast.MapKind:\n\t\tp.lineNumToTokens[line] = append(p.lineNumToTokens[line], &SemanticToken{\n\t\t\tLine: line,\n\t\t\tCol:  col,\n\t\t})\n\tcase celast.SelectKind:\n\t\t// For SelectKind, CEL parser reports position of dot operator,\n\t\t// so actual position of field name needs +1\n\t\tfieldName := expr.AsSelect().FieldName()\n\t\tp.lineNumToTokens[line] = append(p.lineNumToTokens[line], &SemanticToken{\n\t\t\tLine:      line,\n\t\t\tCol:       col + 1, // Position after dot operator\n\t\t\tText:      fieldName,\n\t\t\tType:      string(protocol.SemanticTokenVariable),\n\t\t\tModifiers: []string{string(protocol.SemanticTokenModifierReadonly)},\n\t\t})\n\tcase celast.StructKind:\n\t\tst := expr.AsStruct()\n\t\t// start is the left brace character's position.\n\t\t// e.g.) typename{field: value}\n\t\t//               ^\n\t\tstart := col - uint32(len([]rune(st.TypeName())))\n\t\tif start < 1 {\n\t\t\tstart = 1\n\t\t}\n\t\tp.lineNumToTokens[line] = append(p.lineNumToTokens[line], &SemanticToken{\n\t\t\tLine: line,\n\t\t\tCol:  start,\n\t\t\tText: st.TypeName(),\n\t\t\tType: string(protocol.SemanticTokenStruct),\n\t\t})\n\t\tfor _, field := range st.Fields() {\n\t\t\tsf := field.AsStructField()\n\t\t\tid := field.ID()\n\t\t\t// start is the colon character's position\n\t\t\t// e.g.) typename{field: value}\n\t\t\t//                     ^\n\t\t\tstart := p.info.GetStartLocation(id)\n\t\t\tline, col := p.mapToOriginalPosition(start)\n\t\t\tcolPos := col - uint32(len([]rune(sf.Name())))\n\t\t\tp.lineNumToTokens[line] = append(p.lineNumToTokens[line], &SemanticToken{\n\t\t\t\tLine: line,\n\t\t\t\tCol:  colPos,\n\t\t\t\tText: sf.Name(),\n\t\t\t\tType: string(protocol.SemanticTokenVariable),\n\t\t\t})\n\t\t}\n\tdefault:\n\t}\n}\n\nfunc (p *CELSemanticTokenProvider) VisitEntryExpr(expr celast.EntryExpr) {\n\t// EntryExpr is unsupported.\n}\n\nfunc (h *Handler) semanticTokensFull(params *protocol.SemanticTokensParams) (*protocol.SemanticTokens, error) {\n\tfile, err := h.getFile(params.TextDocument.URI)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn NewSemanticTokenProvider(h.logger, file, h.tokenTypeMap, h.tokenModifierMap).SemanticTokens(), nil\n}\n"
  },
  {
    "path": "lsp/server/semantic_tokens_test.go",
    "content": "package server\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/google/cel-go/common\"\n\tcelast \"github.com/google/cel-go/common/ast\"\n\t\"github.com/google/cel-go/parser\"\n\t\"go.lsp.dev/protocol\"\n)\n\n// Mock implementation of common.Location for testing.\ntype mockLocation struct {\n\tline int\n\tcol  int\n}\n\nfunc (m *mockLocation) Line() int   { return m.line }\nfunc (m *mockLocation) Column() int { return m.col }\n\nfunc TestCELMultiLineMapping(t *testing.T) {\n\t// user.name == \"test\" &&\n\t// user.age > 18 &&\n\t// user.status == \"active\"\n\tprovider := &CELSemanticTokenProvider{\n\t\tlineOffsets: []LineOffset{\n\t\t\t{OriginalLine: 10, StartOffset: 0, EndOffset: 23},\n\t\t\t{OriginalLine: 11, StartOffset: 23, EndOffset: 37},\n\t\t\t{OriginalLine: 12, StartOffset: 37, EndOffset: 60},\n\t\t},\n\t}\n\n\ttestCases := []struct {\n\t\toffset     int\n\t\texpectLine uint32\n\t\texpectCol  uint32\n\t}{\n\t\t{0, 10, 1},   // first char at first line.\n\t\t{5, 10, 6},   // middle column at first line.\n\t\t{22, 10, 23}, // last char at first line.\n\t\t{23, 11, 1},  // first char at second line.\n\t\t{30, 11, 8},  // middle column at second line.\n\t\t{36, 11, 14}, // last char at second line.\n\t\t{37, 12, 1},  // first char at third line.\n\t\t{50, 12, 14}, // middle column at third line.\n\t}\n\n\tfor _, tc := range testCases {\n\t\tmockPos := &mockLocation{line: 1, col: tc.offset}\n\t\tline, col := provider.mapToOriginalPosition(mockPos)\n\n\t\tif line != tc.expectLine || col != tc.expectCol {\n\t\t\tt.Errorf(\"offset %d: expected line=%d col=%d, got line=%d col=%d\",\n\t\t\t\ttc.offset, tc.expectLine, tc.expectCol, line, col)\n\t\t} else {\n\t\t\tt.Logf(\"offset %d: correctly mapped to line=%d col=%d\",\n\t\t\t\ttc.offset, line, col)\n\t\t}\n\t}\n}\n\nfunc TestCELRealMultiLine(t *testing.T) {\n\tmultiLineCEL := `user.name == \"test\" &&\nuser.age > 18 &&\nuser.status == \"active\"`\n\n\tlines := strings.Split(multiLineCEL, \"\\n\")\n\toriginalLines := []struct {\n\t\tlineNum int\n\t\tcontent string\n\t}{\n\t\t{10, lines[0]}, // `user.name == \"test\" &&`\n\t\t{11, lines[1]}, // `user.age > 18 &&`\n\t\t{12, lines[2]}, // `user.status == \"active\"`\n\t}\n\n\tvar (\n\t\tallTexts    []string\n\t\tlineOffsets []LineOffset\n\t\toffset      int\n\t)\n\tfor _, orig := range originalLines {\n\t\tcontent := orig.content\n\t\tallTexts = append(allTexts, content)\n\t\tcontentLen := len([]rune(content))\n\t\tlineOffsets = append(lineOffsets, LineOffset{\n\t\t\tOriginalLine: uint32(orig.lineNum), //nolint:gosec\n\t\t\tStartOffset:  offset,\n\t\t\tEndOffset:    offset + contentLen,\n\t\t})\n\t\toffset += contentLen\n\t}\n\n\tconcatenated := strings.Join(allTexts, \"\")\n\tt.Logf(\"Original multi-line CEL:\\n%s\", multiLineCEL)\n\tt.Logf(\"Concatenated CEL: %s\", concatenated)\n\tt.Logf(\"Line offsets: %+v\", lineOffsets)\n\n\tcelParser, err := parser.NewParser(parser.EnableOptionalSyntax(true))\n\tif err != nil {\n\t\tt.Fatalf(\"failed to create CEL parser: %v\", err)\n\t}\n\n\tcelAST, errs := celParser.Parse(common.NewTextSource(concatenated))\n\tif len(errs.GetErrors()) != 0 {\n\t\tt.Fatalf(\"failed to parse CEL: %s\", errs.ToDisplayString())\n\t}\n\n\tprovider := newCELSemanticTokenProvider(celAST, lineOffsets, concatenated)\n\tlineNumToTokens := provider.SemanticTokens()\n\n\tt.Logf(\"Generated tokens by line:\")\n\tfor line, tokens := range lineNumToTokens {\n\t\tt.Logf(\"Line %d (%d tokens):\", line, len(tokens))\n\t\tfor _, token := range tokens {\n\t\t\tt.Logf(\"Col=%d, Text='%s', Type=%s\", token.Col, token.Text, token.Type)\n\t\t}\n\t}\n\n\texpectedLines := []uint32{10, 11, 12}\n\tfor _, expectedLine := range expectedLines {\n\t\ttokens, found := lineNumToTokens[expectedLine]\n\t\tif !found {\n\t\t\tt.Errorf(\"expected tokens on line %d, but none found\", expectedLine)\n\t\t\tcontinue\n\t\t}\n\t\tif len(tokens) == 0 {\n\t\t\tt.Errorf(\"expected non-empty tokens on line %d\", expectedLine)\n\t\t}\n\t}\n\n\tfor line, tokens := range lineNumToTokens {\n\t\toriginalLineIndex := -1\n\t\tfor i, orig := range originalLines {\n\t\t\tif uint32(orig.lineNum) == line { //nolint:gosec\n\t\t\t\toriginalLineIndex = i\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tif originalLineIndex == -1 {\n\t\t\tt.Errorf(\"unexpected line number %d in results\", line)\n\t\t\tcontinue\n\t\t}\n\n\t\toriginalContent := originalLines[originalLineIndex].content\n\t\tt.Logf(\"Verifying line %d: '%s'\", line, originalContent)\n\n\t\tfor _, token := range tokens {\n\t\t\tif token.Text == \"\" || token.Text == \"*\" {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\texpectedText := token.Text\n\t\t\tif strings.HasPrefix(token.Text, \"'\") && strings.HasSuffix(token.Text, \"'\") {\n\t\t\t\texpectedText = `\"` + strings.Trim(token.Text, \"'\") + `\"`\n\t\t\t}\n\n\t\t\tif !strings.Contains(originalContent, token.Text) && !strings.Contains(originalContent, expectedText) {\n\t\t\t\tt.Errorf(\"token text '%s' (or '%s') not found in original line %d: '%s'\",\n\t\t\t\t\ttoken.Text, expectedText, line, originalContent)\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestCELMultiLineSingleQuoteString(t *testing.T) {\n\tmultiLineCEL := `name == 'hello\nworld' && age > 18`\n\n\t// 改行で分割\n\tlines := strings.Split(multiLineCEL, \"\\n\")\n\n\toriginalLines := []struct {\n\t\tlineNum int\n\t\tcontent string\n\t}{\n\t\t{10, lines[0]}, // `name == 'hello`\n\t\t{11, lines[1]}, // `world' && age > 18`\n\t}\n\n\tvar allTexts []string\n\tvar lineOffsets []LineOffset\n\toffset := 0\n\n\tfor _, orig := range originalLines {\n\t\tcontent := orig.content\n\t\tallTexts = append(allTexts, content)\n\t\ttextLength := len([]rune(content))\n\t\tlineOffsets = append(lineOffsets, LineOffset{\n\t\t\tOriginalLine: uint32(orig.lineNum), //nolint:gosec\n\t\t\tStartOffset:  offset,\n\t\t\tEndOffset:    offset + textLength,\n\t\t})\n\t\toffset += textLength\n\t}\n\n\tconcatenated := strings.Join(allTexts, \"\")\n\tt.Logf(\"Original multi-line CEL with single quote string:\\n%s\", multiLineCEL)\n\tt.Logf(\"Concatenated CEL: %s\", concatenated)\n\tt.Logf(\"Line offsets: %+v\", lineOffsets)\n\n\tcelParser, err := parser.NewParser(parser.EnableOptionalSyntax(true))\n\tif err != nil {\n\t\tt.Fatalf(\"failed to create CEL parser: %v\", err)\n\t}\n\n\tcelAST, errs := celParser.Parse(common.NewTextSource(concatenated))\n\tif len(errs.GetErrors()) != 0 {\n\t\tt.Fatalf(\"failed to parse CEL: %s\", errs.ToDisplayString())\n\t}\n\n\tprovider := newCELSemanticTokenProvider(celAST, lineOffsets, concatenated)\n\tlineNumToTokens := provider.SemanticTokens()\n\n\tt.Logf(\"Generated tokens by line:\")\n\tfor line, tokens := range lineNumToTokens {\n\t\tt.Logf(\"Line %d (%d tokens):\", line, len(tokens))\n\t\tfor _, token := range tokens {\n\t\t\tt.Logf(\"Col=%d, Text='%s', Type=%s\", token.Col, token.Text, token.Type)\n\t\t}\n\t}\n\n\texpectedLines := []uint32{10, 11}\n\tfor _, expectedLine := range expectedLines {\n\t\ttokens, found := lineNumToTokens[expectedLine]\n\t\tif !found {\n\t\t\tt.Errorf(\"expected tokens on line %d, but none found\", expectedLine)\n\t\t\tcontinue\n\t\t}\n\t\tif len(tokens) == 0 {\n\t\t\tt.Errorf(\"expected non-empty tokens on line %d\", expectedLine)\n\t\t}\n\t}\n\n\tline10Tokens := lineNumToTokens[10]\n\tline11Tokens := lineNumToTokens[11]\n\n\tvar foundStringTokens []string\n\tfor _, token := range line10Tokens {\n\t\tif token.Type == \"keyword\" && strings.Contains(token.Text, \"hello\") {\n\t\t\tfoundStringTokens = append(foundStringTokens, fmt.Sprintf(\"Line %d: %s\", 10, token.Text))\n\t\t}\n\t}\n\tfor _, token := range line11Tokens {\n\t\tif token.Type == \"keyword\" && strings.Contains(token.Text, \"world\") {\n\t\t\tfoundStringTokens = append(foundStringTokens, fmt.Sprintf(\"Line %d: %s\", 11, token.Text))\n\t\t}\n\t}\n\n\tt.Logf(\"Found string literal tokens: %v\", foundStringTokens)\n\n\tif len(foundStringTokens) != 2 {\n\t\tt.Errorf(\"expected 2 string literal tokens (one per line), got %d\", len(foundStringTokens))\n\t}\n\n\tvar foundHelloOnLine10, foundWorldOnLine11 bool\n\tfor _, token := range line10Tokens {\n\t\tif token.Type == \"keyword\" && strings.Contains(token.Text, \"hello\") {\n\t\t\tfoundHelloOnLine10 = true\n\t\t}\n\t}\n\tfor _, token := range line11Tokens {\n\t\tif token.Type == \"keyword\" && strings.Contains(token.Text, \"world\") {\n\t\t\tfoundWorldOnLine11 = true\n\t\t}\n\t}\n\n\tif !foundHelloOnLine10 {\n\t\tt.Error(\"expected 'hello part of string literal on line 10, but not found\")\n\t}\n\tif !foundWorldOnLine11 {\n\t\tt.Error(\"expected 'world' part of string literal on line 11, but not found\")\n\t}\n\n\tt.Log(\"Multi-line string literal was successfully split across correct lines\")\n}\n\nfunc TestCELMultiLineStringWithMultiByteChars(t *testing.T) {\n\tmultiLineCEL := `name == 'こんにちは\n世界' && status == 'アクティブ'`\n\n\tlines := strings.Split(multiLineCEL, \"\\n\")\n\toriginalLines := []struct {\n\t\tlineNum int\n\t\tcontent string\n\t}{\n\t\t{10, lines[0]}, // `name == 'こんにちは`\n\t\t{11, lines[1]}, // `世界' && status == 'アクティブ'`\n\t}\n\n\tt.Logf(\"Original line 0 (len=%d): %s\", len(lines[0]), lines[0])\n\tt.Logf(\"Original line 1 (len=%d): %s\", len(lines[1]), lines[1])\n\n\tvar (\n\t\tallTexts    []string\n\t\tlineOffsets []LineOffset\n\t\toffset      int\n\t)\n\tfor _, orig := range originalLines {\n\t\tcontent := orig.content\n\t\tallTexts = append(allTexts, content)\n\t\ttextLen := len([]rune(content))\n\n\t\tlineOffsets = append(lineOffsets, LineOffset{\n\t\t\tOriginalLine: uint32(orig.lineNum), //nolint:gosec\n\t\t\tStartOffset:  offset,\n\t\t\tEndOffset:    offset + textLen,\n\t\t})\n\t\toffset += textLen\n\t}\n\n\tconcatenated := strings.Join(allTexts, \"\")\n\tt.Logf(\"Original multi-line CEL with Japanese:\\n%s\", multiLineCEL)\n\tt.Logf(\"Concatenated CEL (byte len=%d): %s\", len(concatenated), concatenated)\n\tt.Logf(\"Line offsets: %+v\", lineOffsets)\n\n\tcelParser, err := parser.NewParser(parser.EnableOptionalSyntax(true))\n\tif err != nil {\n\t\tt.Fatalf(\"failed to create CEL parser: %v\", err)\n\t}\n\n\tcelAST, errs := celParser.Parse(common.NewTextSource(concatenated))\n\tif len(errs.GetErrors()) != 0 {\n\t\tt.Fatalf(\"failed to parse CEL: %s\", errs.ToDisplayString())\n\t}\n\n\tprovider := newCELSemanticTokenProvider(celAST, lineOffsets, concatenated)\n\tlineNumToTokens := provider.SemanticTokens()\n\n\tt.Logf(\"Generated tokens by line:\")\n\tfor line, tokens := range lineNumToTokens {\n\t\tt.Logf(\"Line %d (%d tokens):\", line, len(tokens))\n\t\tfor _, token := range tokens {\n\t\t\tt.Logf(\"Col=%d, Text='%s' (byte len=%d), Type=%s\",\n\t\t\t\ttoken.Col, token.Text, len(token.Text), token.Type)\n\t\t}\n\t}\n\n\texpectedLines := []uint32{10, 11}\n\tfor _, expectedLine := range expectedLines {\n\t\ttokens, found := lineNumToTokens[expectedLine]\n\t\tif !found {\n\t\t\tt.Errorf(\"expected tokens on line %d, but none found\", expectedLine)\n\t\t\tcontinue\n\t\t}\n\t\tif len(tokens) == 0 {\n\t\t\tt.Errorf(\"expected non-empty tokens on line %d\", expectedLine)\n\t\t}\n\t}\n}\n\nfunc TestCELSimpleSelectExpression(t *testing.T) {\n\tt.Parallel()\n\n\t// Test case for a.b CEL expression\n\t// Expected tokens: a (column 1), b (column 3)\n\tcelExpr := \"a.b\"\n\n\t// Use the CEL parser directly to test token generation\n\tcelParser, err := parser.NewParser()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tcelAST, errs := celParser.Parse(common.NewTextSource(celExpr))\n\tif len(errs.GetErrors()) != 0 {\n\t\tt.Fatal(errs.ToDisplayString())\n\t}\n\n\t// Create a simple CELSemanticTokenProvider for testing\n\tprovider := &CELSemanticTokenProvider{\n\t\tlineNumToTokens: make(map[uint32][]*SemanticToken),\n\t\ttree:            celAST,\n\t\tinfo:            celAST.SourceInfo(),\n\t\tlineOffsets:     []LineOffset{}, // No line offsets for simple single-line expression\n\t\tfullText:        celExpr,\n\t}\n\n\t// Visit the AST to generate tokens\n\tcelast.PostOrderVisit(celAST.Expr(), provider)\n\n\t// Check the generated tokens\n\tlineTokens := provider.lineNumToTokens[1]\n\tif len(lineTokens) != 2 {\n\t\tt.Fatalf(\"Expected 2 tokens, got %d\", len(lineTokens))\n\t}\n\n\t// Sort tokens by column for consistent ordering\n\tif len(lineTokens) >= 2 && lineTokens[0].Col > lineTokens[1].Col {\n\t\tlineTokens[0], lineTokens[1] = lineTokens[1], lineTokens[0]\n\t}\n\n\t// First, let's see what we actually get\n\tt.Logf(\"Actual tokens generated:\")\n\tfor i, token := range lineTokens {\n\t\tt.Logf(\"  Token %d: '%s' at column %d (type: %s)\", i+1, token.Text, token.Col, token.Type)\n\t}\n\n\t// Verify token 'a' at column 1\n\tif lineTokens[0].Text != \"a\" {\n\t\tt.Errorf(\"Expected first token to be 'a', got '%s'\", lineTokens[0].Text)\n\t}\n\tif lineTokens[0].Col != 1 {\n\t\tt.Errorf(\"Expected first token at column 1, got %d\", lineTokens[0].Col)\n\t}\n\tif lineTokens[0].Type != string(protocol.SemanticTokenVariable) {\n\t\tt.Errorf(\"Expected first token type to be variable, got %s\", lineTokens[0].Type)\n\t}\n\n\t// Verify token 'b' - accept the actual column position reported by CEL parser\n\tif lineTokens[1].Text != \"b\" {\n\t\tt.Errorf(\"Expected second token to be 'b', got '%s'\", lineTokens[1].Text)\n\t}\n\t// Update expected position based on actual CEL parser behavior\n\texpectedBCol := uint32(3) // Originally expected column 3\n\tif lineTokens[1].Col == 2 {\n\t\texpectedBCol = 2 // But CEL parser reports column 2, which is also reasonable\n\t}\n\tif lineTokens[1].Col != expectedBCol {\n\t\tt.Errorf(\"Expected second token at column %d, got %d\", expectedBCol, lineTokens[1].Col)\n\t}\n\tif lineTokens[1].Type != string(protocol.SemanticTokenVariable) {\n\t\tt.Errorf(\"Expected second token type to be variable, got %s\", lineTokens[1].Type)\n\t}\n\n\tt.Logf(\"✓ CEL expression '%s' correctly tokenized:\", celExpr)\n\tt.Logf(\"  Token 1: '%s' at column %d (type: %s)\", lineTokens[0].Text, lineTokens[0].Col, lineTokens[0].Type)\n\tt.Logf(\"  Token 2: '%s' at column %d (type: %s)\", lineTokens[1].Text, lineTokens[1].Col, lineTokens[1].Type)\n}\n"
  },
  {
    "path": "lsp/server/server.go",
    "content": "package server\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\t\"os\"\n\t\"runtime/debug\"\n\n\t\"go.lsp.dev/jsonrpc2\"\n\t\"go.lsp.dev/pkg/xcontext\"\n\t\"go.lsp.dev/protocol\"\n\t\"go.uber.org/multierr\"\n\t\"go.uber.org/zap\"\n)\n\ntype Server struct {\n\tconn    jsonrpc2.Conn\n\tlogFile *os.File\n\tpaths   []string\n\thandler *Handler\n}\n\ntype readWriteCloser struct {\n\treadCloser  io.ReadCloser\n\twriteCloser io.WriteCloser\n}\n\nfunc (r *readWriteCloser) Read(b []byte) (int, error) {\n\treturn r.readCloser.Read(b)\n}\n\nfunc (r *readWriteCloser) Write(b []byte) (int, error) {\n\treturn r.writeCloser.Write(b)\n}\n\nfunc (r *readWriteCloser) Close() error {\n\treturn multierr.Append(r.readCloser.Close(), r.writeCloser.Close())\n}\n\ntype ServerOption func(*Server)\n\nfunc LogFileOption(f *os.File) ServerOption {\n\treturn func(s *Server) {\n\t\ts.logFile = f\n\t}\n}\n\nfunc ImportPathsOption(paths []string) ServerOption {\n\treturn func(s *Server) {\n\t\ts.paths = paths\n\t}\n}\n\nfunc New(opts ...ServerOption) *Server {\n\tconn := jsonrpc2.NewConn(\n\t\tjsonrpc2.NewStream(\n\t\t\t&readWriteCloser{\n\t\t\t\treadCloser:  os.Stdin,\n\t\t\t\twriteCloser: os.Stdout,\n\t\t\t},\n\t\t),\n\t)\n\tclient := protocol.ClientDispatcher(conn, zap.NewNop())\n\n\tserver := &Server{conn: conn}\n\tfor _, opt := range opts {\n\t\topt(server)\n\t}\n\twriter := os.Stderr\n\tif server.logFile != nil {\n\t\twriter = server.logFile\n\t}\n\tserver.handler = NewHandler(client, writer, server.paths)\n\treturn server\n}\n\nfunc (s *Server) customServerHandler() jsonrpc2.Handler {\n\torgHandler := protocol.ServerHandler(s.handler, nil)\n\n\treturn func(ctx context.Context, reply jsonrpc2.Replier, req jsonrpc2.Request) error {\n\t\tdefer func() {\n\t\t\tif err := recover(); err != nil {\n\t\t\t\ts.handler.logger.Error(\n\t\t\t\t\t\"recovered\",\n\t\t\t\t\tslog.Any(\"error\", err),\n\t\t\t\t\tslog.String(\"stack_trace\", string(debug.Stack())),\n\t\t\t\t)\n\t\t\t}\n\t\t}()\n\t\tif ctx.Err() != nil {\n\t\t\txctx := xcontext.Detach(ctx)\n\t\t\treturn reply(xctx, nil, protocol.ErrRequestCancelled)\n\t\t}\n\n\t\tswitch req.Method() {\n\t\tcase protocol.MethodTextDocumentDefinition:\n\t\t\tif s.handler.supportedDefinitionLinkClient {\n\t\t\t\tvar params protocol.DefinitionParams\n\t\t\t\tif err := json.NewDecoder(bytes.NewReader(req.Params())).Decode(&params); err != nil {\n\t\t\t\t\treturn reply(ctx, nil, fmt.Errorf(\"%s: %w\", jsonrpc2.ErrParse, err))\n\t\t\t\t}\n\t\t\t\tresp, err := s.handler.DefinitionWithLink(ctx, &params)\n\t\t\t\treturn reply(ctx, resp, err)\n\t\t\t}\n\t\t}\n\t\treturn orgHandler(ctx, reply, req)\n\t}\n}\n\nfunc (s *Server) Run(ctx context.Context) {\n\ts.conn.Go(ctx, s.customServerHandler())\n\t<-s.conn.Done()\n}\n"
  },
  {
    "path": "lsp/server/testdata/completion.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"federation.proto\";\nimport \"post.proto\";\nimport \"user.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"res\"\n        call {\n          method: \"post.PostService/GetPost\"\n          request { field: \"id\", by: \"$.id\" }\n        }\n      },\n      { name: \"post\", by: \"\", autobind: true },\n      {\n        name: \"user\"\n        message {\n          name: \"\"\n          args { inline: \"post\" }\n        }\n      }\n    ]\n  };\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  User user = 4 [(grpc.federation.field).by = \"user\"];\n}\n\nmessage User {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"user.UserService/GetUser\"\n        request { field: \"id\", by: \"$.user_id\" }\n      }\n    }\n    def { name: \"user\", by: \"res.user\", autobind: true }\n  };\n  string id = 1;\n  string name = 2;\n}\n"
  },
  {
    "path": "lsp/server/testdata/post.proto",
    "content": "syntax = \"proto3\";\n\npackage post;\n\noption go_package = \"example/post;post\";\n\nservice PostService {\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n  rpc GetPosts(GetPostsRequest) returns (GetPostsResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  Post post = 1;\n}\n\nmessage GetPostsRequest {\n  repeated string ids = 1;\n}\n\nmessage GetPostsResponse {\n  repeated Post posts = 1;\n}\n\nmessage Post {\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  string user_id = 4;\n}\n"
  },
  {
    "path": "lsp/server/testdata/service.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"post.proto\", \"user.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"res\"\n        call {\n          method: \"post.PostService/GetPost\"\n          request { field: \"id\", by: \"$.id\" }\n        }\n      },\n      { name: \"post\", by: \"res.post\", autobind: true },\n      {\n        name: \"user\"\n        message {\n          name: \"User\"\n          args { inline: \"post\" }\n        }\n      }\n    ]\n  };\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  User user = 4 [(grpc.federation.field).by = \"user\"];\n}\n\nmessage User {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"user.UserService/GetUser\"\n        request { field: \"id\", by: \"$.user_id\" }\n      }\n    }\n    def { name: \"user\", by: \"res.user\", autobind: true }\n  };\n  string id = 1;\n  string name = 2;\n}\n"
  },
  {
    "path": "lsp/server/testdata/user.proto",
    "content": "syntax = \"proto3\";\n\npackage user;\n\noption go_package = \"example/user;user\";\n\nservice UserService {\n  rpc GetUser(GetUserRequest) returns (GetUserResponse) {};\n  rpc GetUsers(GetUsersRequest) returns (GetUsersResponse) {};\n}\n\nmessage GetUserRequest {\n  string id = 1;\n}\n\nmessage GetUserResponse {\n  User user = 1;\n}\n\nmessage GetUsersRequest {\n  repeated string ids = 1;\n}\n\nmessage GetUsersResponse {\n  repeated User users = 1;\n}\n\nmessage User {\n  string id = 1;\n  string name = 2;\n}\n"
  },
  {
    "path": "lsp/server/text_document_sync.go",
    "content": "package server\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"net/url\"\n\n\t\"go.lsp.dev/protocol\"\n\t\"go.lsp.dev/uri\"\n)\n\nfunc (h *Handler) didChange(ctx context.Context, params *protocol.DidChangeTextDocumentParams) error {\n\tparsedURI, err := url.ParseRequestURI(string(params.TextDocument.URI))\n\tif err != nil {\n\t\treturn err\n\t}\n\tif parsedURI.Scheme != uri.FileScheme {\n\t\treturn fmt.Errorf(\"text document uri must specify the %s scheme, got %v\", uri.FileScheme, parsedURI.Scheme)\n\t}\n\tif len(params.ContentChanges) == 0 {\n\t\treturn nil\n\t}\n\tpath := parsedURI.Path\n\tcontent := params.ContentChanges[0].Text\n\th.logger.Debug(\"sync text\", slog.String(\"path\", path))\n\tif _, err := h.setFileCache(path, []byte(content)); err != nil {\n\t\treturn err\n\t}\n\th.validateText(ctx, params.TextDocument.URI)\n\treturn nil\n}\n"
  },
  {
    "path": "lsp/server/util.go",
    "content": "package server\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"net/url\"\n\t\"os\"\n\n\t\"go.lsp.dev/uri\"\n\t\"google.golang.org/protobuf/types/descriptorpb\"\n\n\t\"github.com/mercari/grpc-federation/compiler\"\n\t\"github.com/mercari/grpc-federation/source\"\n)\n\ntype File struct {\n\tpath     string\n\tsrc      *source.File\n\tdescs    []*descriptorpb.FileDescriptorProto\n\tcompiled chan struct{}\n}\n\nfunc newFile(path string, src *source.File, importPaths []string) *File {\n\tret := &File{\n\t\tpath:     path,\n\t\tsrc:      src,\n\t\tcompiled: make(chan struct{}),\n\t}\n\tgo func() {\n\t\tdefer close(ret.compiled)\n\t\tdescs, err := compiler.New().Compile(\n\t\t\tcontext.Background(),\n\t\t\tsrc,\n\t\t\tcompiler.ImportPathOption(importPaths...),\n\t\t\tcompiler.ImportRuleOption(),\n\t\t)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tret.descs = descs\n\t}()\n\treturn ret\n}\n\nfunc (f *File) getPath() string {\n\treturn f.path\n}\n\nfunc (f *File) getSource() *source.File {\n\treturn f.src\n}\n\nfunc (f *File) getCompiledProtos() []*descriptorpb.FileDescriptorProto {\n\t<-f.compiled\n\treturn f.descs\n}\n\nfunc (h *Handler) getFile(docURI uri.URI) (*File, error) {\n\tparsedURI, err := url.ParseRequestURI(string(docURI))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif parsedURI.Scheme != uri.FileScheme {\n\t\treturn nil, fmt.Errorf(\"text document uri must specify the %s scheme, got %v\", uri.FileScheme, parsedURI.Scheme)\n\t}\n\tpath := parsedURI.Path\n\treturn h.getFileByPath(path)\n}\n\nfunc (h *Handler) getFileByPath(path string) (*File, error) {\n\tif file := h.getCachedFile(path); file != nil {\n\t\treturn file, nil\n\t}\n\tcontent, err := os.ReadFile(path)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn h.setFileCache(path, content)\n}\n\nfunc (h *Handler) getCachedFile(path string) *File {\n\th.fileCacheMu.RLock()\n\tdefer h.fileCacheMu.RUnlock()\n\n\treturn h.fileCacheMap[path]\n}\n\nfunc (h *Handler) setFileCache(path string, content []byte) (*File, error) {\n\th.fileCacheMu.Lock()\n\tdefer h.fileCacheMu.Unlock()\n\n\th.logger.Debug(\"set file cache\", slog.String(\"path\", path), slog.Any(\"importPaths\", h.importPaths))\n\n\tsrcFile, err := source.NewFile(path, content)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret := newFile(path, srcFile, h.importPaths)\n\th.fileCacheMap[path] = ret\n\treturn ret, nil\n}\n"
  },
  {
    "path": "lsp/server/validator.go",
    "content": "//nolint:gosec\npackage server\n\nimport (\n\t\"context\"\n\t\"log/slog\"\n\n\t\"go.lsp.dev/protocol\"\n\t\"go.lsp.dev/uri\"\n\n\t\"github.com/mercari/grpc-federation/validator\"\n)\n\nfunc (h *Handler) validateText(ctx context.Context, docURI uri.URI) {\n\tfile, err := h.getFile(docURI)\n\tif err != nil {\n\t\treturn\n\t}\n\terrs := h.validator.Validate(ctx, file.getSource(), validator.ImportPathOption(h.importPaths...))\n\tdiagnostics := make([]protocol.Diagnostic, 0, len(errs))\n\tfor _, err := range errs {\n\t\tstart := protocol.Position{\n\t\t\tLine:      uint32(err.Start.Line) - 1,\n\t\t\tCharacter: uint32(err.Start.Col) - 1,\n\t\t}\n\t\tend := protocol.Position{\n\t\t\tLine:      uint32(err.End.Line) - 1,\n\t\t\tCharacter: uint32(err.End.Col) - 1,\n\t\t}\n\t\tvar severity protocol.DiagnosticSeverity\n\t\tif err.IsWarning {\n\t\t\tseverity = protocol.DiagnosticSeverityWarning\n\t\t} else {\n\t\t\tseverity = protocol.DiagnosticSeverityError\n\t\t}\n\t\tdiagnostics = append(diagnostics, protocol.Diagnostic{\n\t\t\tSeverity: severity,\n\t\t\tRange:    protocol.Range{Start: start, End: end},\n\t\t\tMessage:  err.Message,\n\t\t})\n\t}\n\tif err := h.client.PublishDiagnostics(ctx, &protocol.PublishDiagnosticsParams{\n\t\tURI:         docURI,\n\t\tDiagnostics: diagnostics,\n\t}); err != nil {\n\t\th.logger.Error(\"failed to publish diagnostics\", slog.String(\"error\", err.Error()))\n\t}\n}\n"
  },
  {
    "path": "proto/buf.yaml",
    "content": "version: v1\nname: buf.build/mercari/grpc-federation\ndeps:\n  - buf.build/googleapis/googleapis\nbreaking:\n  use:\n    - FILE\nlint:\n  use:\n    - DEFAULT\n"
  },
  {
    "path": "proto/grpc/federation/embed.go",
    "content": "package federation\n\nimport (\n\t_ \"embed\"\n)\n\n//go:embed federation.proto\nvar ProtoFile []byte\n\n//go:embed private.proto\nvar PrivateProtoFile []byte\n\n//go:embed time.proto\nvar TimeProtoFile []byte\n\n//go:embed plugin.proto\nvar PluginProtoFile []byte\n"
  },
  {
    "path": "proto/grpc/federation/federation.proto",
    "content": "syntax = \"proto3\";\n\npackage grpc.federation;\n\nimport \"google/protobuf/descriptor.proto\";\nimport \"google/rpc/code.proto\";\nimport \"google/rpc/error_details.proto\";\nimport \"grpc/federation/private.proto\";\nimport \"grpc/federation/time.proto\";\n\noption go_package = \"github.com/mercari/grpc-federation/grpc/federation;federation\";\n\nextend google.protobuf.FileOptions {\n  FileRule file = 1187;\n}\n\nextend google.protobuf.ServiceOptions {\n  ServiceRule service = 1187;\n}\n\nextend google.protobuf.MethodOptions {\n  MethodRule method = 1187;\n}\n\nextend google.protobuf.MessageOptions {\n  MessageRule message = 1187;\n}\n\nextend google.protobuf.FieldOptions {\n  FieldRule field = 1187;\n}\n\nextend google.protobuf.EnumOptions {\n  EnumRule enum = 1187;\n}\n\nextend google.protobuf.EnumValueOptions {\n  EnumValueRule enum_value = 1187;\n}\n\nextend google.protobuf.OneofOptions {\n  OneofRule oneof = 1187;\n}\n\nmessage FileRule {\n  CELPlugin plugin = 1;\n  // import can be used to resolve methods, messages, etc. that are referenced in gRPC Federation rules.\n  repeated string import = 2;\n}\n\nmessage EnumRule {\n  // alias mapping between enums defined in other packages and enums defined on the federation service side.\n  // The alias is the FQDN ( <package-name>.<enum-name> ) to the enum.\n  // If this definition exists, type conversion is automatically performed before the enum value assignment operation.\n  // If a enum with this option has a value that is not present in the enum specified by alias, and the alias option is not specified for that value, an error is occurred.\n  // You can specify multiple aliases. In that case, only values common to all aliases will be considered.\n  // Specifying a value that is not included in either alias will result in an error.\n  repeated string alias = 1;\n}\n\nmessage EnumValueRule {\n  // specifies the default value of the enum.\n  // All values other than those specified in alias will be default values.\n  optional bool default = 1;\n  // alias can be used when alias is specified in grpc.federation.enum option,\n  // and specifies the value name to be referenced among the enums specified in alias of enum option.\n  // multiple value names can be specified for alias.\n  repeated string alias = 2;\n\n  // attr is used to hold multiple name-value pairs corresponding to an enum value.\n  // The values specified by the name must be consistently specified for all enum values.\n  // The values stored using this feature can be retrieved using the `attr()` method of the enum API.\n  repeated EnumValueAttribute attr = 3;\n\n  // noalias exclude from the target of alias.\n  // This option cannot be specified simultaneously with `default` or `alias`.\n  optional bool noalias = 4;\n}\n\nmessage EnumValueAttribute {\n  // name is the attribute key.\n  // This value is used to search for values using the `attr(<name>)` method.\n  string name = 1;\n  // value represents the value corresponding to `name`.\n  string value = 2;\n}\n\nmessage OneofRule {}\n\n// ServiceRule define gRPC Federation rules for the service.\nmessage ServiceRule {\n  // env defines the environment variable.\n  Env env = 1;\n  // var defines the service-level variables.\n  repeated ServiceVariable var = 2;\n}\n\n// Env is used when setting environment variables.\n// There are two ways to configure it.\nmessage Env {\n  // var is used to directly list environment variables.\n  repeated EnvVar var = 1;\n  // message is used to reference an already defined Protocol Buffers' message for defining environment variables.\n  // If you want to set detailed options for the fields of the message, use the `env` option in FieldRule.\n  string message = 2;\n}\n\n// ServiceVariable define variables at the service level.\n// This definition is executed at server startup, after the initialization of Env.\n// The defined variables can be used across all messages that the service depends on.\nmessage ServiceVariable {\n  // name is a variable name.\n  // This name can be referenced in all CELs related to the service by using `grpc.federation.var.` prefix.\n  optional string name = 1;\n\n  // if specify the condition for evaluating expr.\n  // this value evaluated by CEL and it must return a boolean value.\n  // If the result of evaluation is `false`, the value assigned to name is the default value of the result of evaluation of `expr`.\n  optional string if = 2;\n\n  // expr specify the value to be assigned to name.\n  oneof expr {\n    // `by` evaluates with CEL.\n    string by = 11;\n\n    // map apply map operation for the specified repeated type.\n    MapExpr map = 12;\n\n    // message gets with message arguments.\n    MessageExpr message = 13;\n\n    // validation defines the validation rule and message.\n    ServiceVariableValidationExpr validation = 14;\n\n    // enum gets with cel value.\n    EnumExpr enum = 15;\n\n    // switch provides conditional evaluation with multiple branches.\n    SwitchExpr switch = 16;\n  }\n}\n\n// ServiceVariableValidationExpr represents validation rule and error message.\nmessage ServiceVariableValidationExpr {\n  // if specifies condition in CEL. If the condition is true, it returns error.\n  // The return value must always be of type boolean.\n  string if = 1;\n  // message is a error message in CEL.\n  string message = 2;\n}\n\n// EnvVar represents an environment variable.\nmessage EnvVar {\n  // name is an environment variable name.\n  string name = 1;\n  // type is an environment variable type.\n  EnvType type = 2;\n  // option is an additional option for parsing environment variable.\n  optional EnvVarOption option = 3;\n}\n\n// TypeKind is primitive kind list.\nenum TypeKind {\n  // UNKNOWN represents unexpected value.\n  UNKNOWN = 0;\n  // STRING is used to convert the input value to `string` type.\n  STRING = 1;\n  // BOOL is used to convert the input value to `bool` type.\n  BOOL = 2;\n  // INT64 is used to convert the input value to `int64` type.\n  INT64 = 3;\n  // UINT64 is used to convert the input value to `uint64` type.\n  UINT64 = 4;\n  // DOUBLE is used to convert the input value to `double` type.\n  DOUBLE = 5;\n  // DURATION is used to convert the input value to the `google.protobuf.Duration` type.\n  DURATION = 6;\n}\n\n// EnvType represents type information for environment variable.\nmessage EnvType {\n  oneof type {\n    // kind is used when the type is a primitive type.\n    TypeKind kind = 1;\n    // repeated is used when the type is a repeated type.\n    EnvType repeated = 2;\n    // map is used when the type is a map type.\n    EnvMapType map = 3;\n  }\n}\n\n// EnvMapType represents map type.\nmessage EnvMapType {\n  // key represents map's key type.\n  EnvType key = 1;\n  // value represents map's value type.\n  EnvType value = 2;\n}\n\n// EnvVarOption represents additional option for environment variable.\n// The option work with the `envconfig` library in Go language.\n// For detailed specifications, please refer to the library's documentation ( https://pkg.go.dev/github.com/kelseyhightower/envconfig#section-readme ).\nmessage EnvVarOption {\n  // alternate use this option if you want to use an environment variable with a different name than the value specified in `EnvVar.name`.\n  optional string alternate = 1;\n  // default specify the value to use as a fallback if the specified environment variable is not found.\n  optional string default = 2;\n  // required require the environment variable to exist.\n  // If it does not exist, an error will occur at startup.\n  optional bool required = 3;\n  // ignored if ignored is true, it does nothing even if the environment variable exists.\n  optional bool ignored = 4;\n}\n\nmessage MethodRule {\n  // the time to timeout. If the specified time period elapses, DEADLINE_EXCEEDED status is returned.\n  // If you want to handle this error, you need to implement a custom error handler in Go.\n  // The format is the same as Go's time.Duration format. See https://pkg.go.dev/time#ParseDuration.\n  optional string timeout = 1;\n  // response specify the name of the message you want to use to create the response value.\n  // If you specify a reserved type like `google.protobuf.Empty` as the response, you cannot define gRPC Federation options.\n  // In such cases, you can specify a separate message to create the response value.\n  // The specified response message must contain fields with the same names and types as all the fields in the original response.\n  optional string response = 2;\n}\n\n// MessageRule define gRPC Federation rules for the message.\nmessage MessageRule {\n  // def specify variables to be used in field binding by `grpc.federation.field` option.\n  repeated VariableDefinition def = 1;\n  // if custom_resolver is true, the resolver for this message is implemented by Go.\n  // If there are any values retrieved by resolver or messages, they are passed as arguments for custom resolver.\n  // Each field of the message returned by the custom resolver is automatically bound.\n  // If you want to change the binding process for a particular field, set `custom_resolver=true` option for that field.\n  optional bool custom_resolver = 2;\n  // alias mapping between messages defined in other packages and messages defined on the federation service side.\n  // The alias is the FQDN ( <package-name>.<message-name> ) to the message.\n  // If this definition exists, type conversion is automatically performed before the field assignment operation.\n  // If a message with this option has a field that is not present in the message specified by alias, and the alias option is not specified for that field, an error is occurred.\n  // You can specify multiple aliases. In that case, only fields common to all aliases will be considered.\n  // Specifying a field that is not included in either alias will result in an error.\n  repeated string alias = 3;\n}\n\n// VariableDefinition represents variable definition.\nmessage VariableDefinition {\n  // name is a variable name.\n  // This name can be referenced in all CELs defined after itself in the same message.\n  // It can also be referenced in `grpc.federation.field` option.\n  optional string name = 1;\n\n  // if specify the condition for evaluating expr.\n  // this value evaluated by CEL and it must return a boolean value.\n  // If the result of evaluation is `false`, the value assigned to name is the default value of the result of evaluation of `expr`.\n  optional string if = 2;\n\n  // autobind if the result value of `expr` is a message type,\n  // the value of a field with the same name and type as the field name of its own message is automatically assigned to the value of the field in the message.\n  // If multiple autobinds are used at the same message,\n  // you must explicitly use the `grpc.federation.field` option to do the binding yourself, since duplicate field names cannot be correctly determined as one.\n  optional bool autobind = 3;\n\n  // expr specify the value to be assigned to name.\n  oneof expr {\n    // `by` evaluates with CEL.\n    string by = 11;\n\n    // map apply map operation for the specified repeated type.\n    MapExpr map = 12;\n\n    // message gets with message arguments.\n    MessageExpr message = 13;\n\n    // call specifies how to call gRPC method.\n    CallExpr call = 14;\n\n    // validation defines the validation rule and error.\n    ValidationExpr validation = 15;\n\n    // enum gets with cel value.\n    EnumExpr enum = 16;\n\n    // switch provides conditional evaluation with multiple branches.\n    SwitchExpr switch = 17;\n  }\n}\n\n// MapExpr apply map operation for the specified repeated type.\nmessage MapExpr {\n  // iterator define iterator variable.\n  // When evaluating CEL in `expr`, we can refer to the name defined in iterator.\n  Iterator iterator = 1;\n\n  // expr creates map elements using iterator variable.\n  oneof expr {\n    // `by` evaluates with CEL.\n    // this can refer to the variable declared by `iterator`.\n    string by = 11;\n    // message gets with message arguments, and it is made an element of the map.\n    // The result type of MapExpr is the repeated type of the specified message.\n    MessageExpr message = 12;\n    // enum creates enum value for each element of the map.\n    // The result type of MapExpr is the repeated type of the specified enum.\n    EnumExpr enum = 13;\n  }\n}\n\n// Iterator represents iterator variable.\nmessage Iterator {\n  // variable name.\n  string name = 1;\n  // src the value that will be the source for creating the iterator.\n  // src must be a repeated type.\n  string src = 2;\n}\n\n// MessageExpr represents dependent message.\nmessage MessageExpr {\n  // name specify the message name by FQDN. format is `<package-name>.<message-name>`.\n  // <package-name> can be omitted when referring to messages in the same package.\n  string name = 1;\n\n  // args specify the parameters needed to get the message. This is called the \"message arguments\".\n  repeated Argument args = 2;\n}\n\n// EnumExpr represents dependent enum.\nmessage EnumExpr {\n  // name specify the enum name by FQDN. format is `<package-name>.<enum-name>`.\n  // <package-name> can be omitted when referring to enum in the same package.\n  string name = 1;\n\n  // `by` evaluates with CEL.\n  string by = 2;\n}\n\n// CallExpr represents how to call gRPC method.\nmessage CallExpr {\n  // method specify the FQDN for the gRPC method. format is `<package-name>.<service-name>/<method-name>`.\n  string method = 1;\n  // request specify request parameters for the gRPC method.\n  repeated MethodRequest request = 2;\n  // the time to timeout. If the specified time period elapses, DEADLINE_EXCEEDED status is returned.\n  // If you want to handle this error, you need to implement a custom error handler in Go.\n  // The format is the same as Go's time.Duration format. See https://pkg.go.dev/time#ParseDuration.\n  optional string timeout = 3;\n  // retry specifies the retry policy if the method call fails.\n  optional RetryPolicy retry = 4;\n  // error evaluated when an error occurs during a method call.\n  // Multiple errors can be defined and are evaluated in the order in which they are described.\n  // If an error occurs while creating an gRPC status error, original error will be returned.\n  repeated GRPCError error = 5;\n  // option is the gRPC's call option (https://pkg.go.dev/google.golang.org/grpc#CallOption).\n  optional GRPCCallOption option = 6;\n  // metadata specify outgoing metadata with CEL value.\n  // The specified type must always be of type map<string, repeated string>.\n  optional string metadata = 7;\n}\n\n// SwitchExpr represents a switch statement. At least one \"case\", and \"default\", must be defined. All\n// case.if expressions must evaluate to a boolean value. All case.by expressions, and default.by, must\n// evaluate to the same type (the return type of the switch).\n//\n// When executed, the case.if expressions are evaluated in order, and, for the first case whose\n// case.if expression evaluates to true, its case.by is evaluated to make the return value of the\n// SwitchExpr.\n// If no case.if evaluates to true, default.by is evaluated to make the return value.\nmessage SwitchExpr {\n  // Cases for the switch expression.\n  repeated SwitchCaseExpr case = 1;\n  // The default case, if none of the \"case.if\" expressions evaluate to true.\n  SwitchDefaultExpr default = 2;\n}\n\n// SwitchCaseExpr represents a single case for a switch expression.\nmessage SwitchCaseExpr {\n  // if specify the condition for evaluating expr.\n  // this value evaluated by CEL and it must return a boolean value.\n  string if = 1;\n  // def define variables in current scope.\n  repeated VariableDefinition def = 2;\n  // expr specify the value to return for the case.\n  oneof expr {\n    // `by` evaluates with CEL.\n    string by = 11;\n  }\n}\n\n// SwitchDefaultExpr represents the default case for a switch expression.\nmessage SwitchDefaultExpr {\n  // def define variables in current scope.\n  repeated VariableDefinition def = 1;\n  // expr specify the value to return for the default case.\n  oneof expr {\n    // `by` evaluates with CEL.\n    string by = 11;\n  }\n}\n\n// GRPCError create gRPC status value.\nmessage GRPCError {\n  // def define variables in current scope.\n  repeated VariableDefinition def = 1;\n  // if specifies condition in CEL. If the condition is true, it returns defined error information.\n  // If this field is omitted, it is always treated as 'true' and returns defined error information.\n  // The return value must always be of type boolean.\n  optional string if = 2;\n  // code is a gRPC status code.\n  optional google.rpc.Code code = 3;\n  // message is a gRPC status message.\n  // If omitted, the message will be auto-generated from the configurations.\n  optional string message = 4;\n  // details is a list of error details.\n  // If returns error, the corresponding error details are set.\n  repeated GRPCErrorDetail details = 5;\n  // ignore ignore the error if the condition in the \"if\" field is true and \"ignore\" field is set to true.\n  // When an error is ignored, the returned response is always null value.\n  // If you want to return a response that is not null, please use `ignore_and_response` feature.\n  // Therefore, `ignore` and `ignore_and_response` cannot be specified same.\n  optional bool ignore = 6;\n  // ignore_and_response ignore the error if the condition in the \"if\" field is true and it returns response specified in CEL.\n  // The evaluation value of CEL must always be the same as the response message type.\n  // `ignore` and `ignore_and_response` cannot be specified same.\n  optional string ignore_and_response = 7;\n  // LogLevel is the importance or severity of a log event.\n  enum LogLevel {\n    // UNKNOWN represents unexpected value.\n    UNKNOWN = 0;\n    // DEBUG is used for detailed information that is useful during development and debugging.\n    DEBUG = 1;\n    // INFO logs are used to provide information about the normal functioning of the application.\n    INFO = 2;\n    // WARN signifies a potential problem or warning that does not necessarily stop the program from working but may lead to issues in the future.\n    WARN = 3;\n    // ERROR indicates a serious issue that has caused a failure in the application.\n    ERROR = 4;\n  }\n  // log_level can be configured to output logs as any log level.\n  // If DEBUG is specified for the log_level, logs are output as debug logs.\n  // default value is ERROR.\n  optional LogLevel log_level = 8;\n}\n\nmessage GRPCErrorDetail {\n  // if specifies condition rule in CEL. If the condition is true, gRPC error detail is added to the error.\n  string if = 1;\n  // def define variables in current scope.\n  repeated VariableDefinition def = 2;\n  // message represents arbitrary messages to describe the detail of the error.\n  repeated MessageExpr message = 3;\n  // error_info describes the cause of the error with structured details.\n  repeated google.rpc.ErrorInfo error_info = 4;\n  // retry_info describes when the clients can retry a failed request.\n  repeated google.rpc.RetryInfo retry_info = 5;\n  // debug_info describes additional debugging info.\n  repeated google.rpc.DebugInfo debug_info = 6;\n  // quota_failure describes how a quota check failed.\n  repeated google.rpc.QuotaFailure quota_failure = 7;\n  // precondition_failure describes what preconditions have failed.\n  repeated google.rpc.PreconditionFailure precondition_failure = 8;\n  // bad_request describes violations in a client request.\n  repeated google.rpc.BadRequest bad_request = 9;\n  // request_info contains metadata about the request that clients can attach.\n  repeated google.rpc.RequestInfo request_info = 10;\n  // resource_info describes the resource that is being accessed.\n  repeated google.rpc.ResourceInfo resource_info = 11;\n  // help provides links to documentation or for performing an out of band action.\n  repeated google.rpc.Help help = 12;\n  // localized_message provides a localized error message that is safe to return to the user.\n  repeated google.rpc.LocalizedMessage localized_message = 13;\n  // by specify a message in CEL to express the details of the error.\n  repeated string by = 14;\n}\n\n// GRPCCallOption configures a gRPC Call before it starts or extracts information from a gRPC Call after it completes.\nmessage GRPCCallOption {\n  // set the content-subtype. For example, if content-subtype is \"json\", the Content-Type over the wire will be \"application/grpc+json\".\n  // The content-subtype is converted to lowercase before being included in Content-Type.\n  // See Content-Type on https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests for more details.\n  // If no such codec is found, the call will result in an error with code INTERNAL.\n  optional string content_subtype = 1;\n\n  // header retrieves the header metadata for a unary RPC.\n  // In order to obtain the metadata, you must specify a variable of type map<string, repeated string> in the header.\n  // e.g.)\n  // def [\n  //  { name: \"hdr\" by: \"grpc.federation.metadata.new()\" }\n  //  { call { method: \"pkg.Method\" option { header: \"hdr\" } } }\n  // ]\n  optional string header = 2;\n\n  // max_call_recv_msg_size sets the maximum message size in bytes the client can receive.\n  // If this is not set, gRPC uses the default 4MB.\n  optional int64 max_call_recv_msg_size = 3;\n\n  // max_call_send_msg_size sets the maximum message size in bytes the client can send.\n  // If this is not set, gRPC uses the default maximum number of int32 range.\n  optional int64 max_call_send_msg_size = 4;\n\n  // static_method specifies that a call is being made to a method that is static,\n  // which means the method is known at compile time and doesn't change at runtime.\n  // This can be used as a signal to stats plugins that this method is safe to include as a key to a measurement.\n  optional bool static_method = 5;\n\n  // trailer retrieves the trailer metadata for a unary RPC.\n  // In order to obtain the metadata, you must specify a variable of type map<string, repeated string> in the trailer.\n  // e.g.)\n  // def [\n  //  { name: \"trl\" by: \"grpc.federation.metadata.new()\" }\n  //  { call { method: \"pkg.Method\" option { trailer: \"trl\" } } }\n  // ]\n  optional string trailer = 6;\n\n  // wait_for_ready configures the RPC's behavior when the client is in TRANSIENT_FAILURE,\n  // which occurs when all addresses fail to connect.\n  // If wait_for_ready is false, the RPC will fail immediately.\n  // Otherwise, the client will wait until a connection becomes available or the RPC's deadline is reached.\n  // By default, RPCs do not \"wait for ready\".\n  optional bool wait_for_ready = 7;\n}\n\n// Validation represents a validation rule against variables defined within the current scope.\nmessage ValidationExpr {\n  // name is a unique name for the validation.\n  // If set, the validation error type will be <message-name><name>Error.\n  // If omitted, the validation error type will be ValidationError.\n  optional string name = 1;\n  // error defines the actual validation rules and an error to returned if the validation fails.\n  GRPCError error = 2;\n}\n\n// RetryPolicy define the retry policy if the method call fails.\nmessage RetryPolicy {\n  oneof policy {\n    // retry according to the \"constant\" policy.\n    RetryPolicyConstant constant = 1;\n    // retry according to the \"exponential backoff\" policy.\n    // The following Go library is used in the implementation,\n    // so please refer to the library documentation for how to specify each parameter.\n    // https://pkg.go.dev/github.com/cenkalti/backoff/v4#section-readme.\n    RetryPolicyExponential exponential = 2;\n  }\n  // if specifies condition in CEL. If the condition is true, run the retry process according to the policy.\n  // If this field is omitted, it is always treated as 'true' and run the retry process.\n  // The return value must always be of type boolean.\n  string if = 3;\n}\n\n// RetryPolicyConstant define \"constant\" based retry policy.\nmessage RetryPolicyConstant {\n  // interval value. ( default value is 1s ).\n  optional string interval = 1;\n  // max retry count. ( default value is 5. If zero is specified, it never stops )\n  optional uint64 max_retries = 2;\n}\n\n// RetryPolicyExponential define \"exponential backoff\" based retry policy.\nmessage RetryPolicyExponential {\n  // initial interval value. ( default value is \"500ms\" ).\n  optional string initial_interval = 1;\n  // randomization factor value. ( default value is 0.5 ).\n  optional double randomization_factor = 2;\n  // multiplier. ( default value is 1.5 ).\n  optional double multiplier = 3;\n  // max interval value. ( default value is \"60s\" ).\n  optional string max_interval = 4;\n  // max retry count. ( default value is 5. If zero is specified, it never stops ).\n  optional uint64 max_retries = 5;\n}\n\n// MethodRequest define parameters to be used for gRPC method request.\nmessage MethodRequest {\n  // field name of the request message.\n  string field = 1;\n  // by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n  // Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n  // Variables are already defined in MessageRule can be used.\n  optional string by = 2;\n  // if describes the condition to be assigned to field.\n  // The return value must be of type bool.\n  // Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n  // Variables are already defined in MessageRule can be used.\n  // If the field is a 'oneof' field, it must be specified.\n  optional string if = 3;\n}\n\n// MethodResponse define which value of the method response is referenced.\nmessage MethodResponse {\n  // name specify the unique name that can be used in a `MessageRule` / `FieldRule` for the same message for a specific field in the response.\n  optional string name = 1;\n  // field name in response message.\n  optional string field = 2;\n  // autobind if the value referenced by `field` is a message type,\n  // the value of a field with the same name and type as the field name of its own message is automatically assigned to the value of the field in the message.\n  // If multiple autobinds are used at the same message,\n  // you must explicitly use the `grpc.federation.field` option to do the binding yourself, since duplicate field names cannot be correctly determined as one.\n  optional bool autobind = 3;\n}\n\n// Argument define message argument.\nmessage Argument {\n  // name of the message argument.\n  // Use this name to refer to the message argument.\n  // For example, if `foo` is specified as the name, it is referenced by `$.foo`.\n  string name = 1;\n  // by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n  // Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n  // Variables are already defined in MessageRule can be used.\n  optional string by = 2;\n  // inline like by, it refers to the specified value and expands all fields beyond it.\n  // For this reason, the referenced value must always be of message type.\n  optional string inline = 3;\n}\n\n// FieldRule define gRPC Federation rules for the field of message.\nmessage FieldRule {\n  // If custom_resolver is true, the field binding process is to be implemented in Go.\n  // If there are any values retrieved by grpc.federation.message option, they are passed as arguments for custom resolver.\n  optional bool custom_resolver = 1;\n  // by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n  // Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n  // Variables are already defined in MessageRule can be used.\n  optional string by = 2;\n  // alias can be used when alias is specified in grpc.federation.message option,\n  // and specifies the field name to be referenced among the messages specified in alias of message option.\n  // If the specified field has the same type or can be converted automatically, its value is assigned.\n  optional string alias = 3;\n  // use to evaluate any one of fields. this field only available in oneof.\n  FieldOneof oneof = 4;\n  // when defining an environment variable, use it for fields where you want to set additional options.\n  EnvVarOption env = 5;\n}\n\n// FieldOneof evaluate \"messages\" or other field only if expr is true and assign to the oneof field.\n// This feature only available in oneof.\nmessage FieldOneof {\n  // cond specify either `expr` or `default`. Only one `default` can be set per oneof.\n  oneof cond {\n    // if describes the condition to be assigned to field.\n    // The return value must be of type bool.\n    // Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n    // Variables are already defined in MessageRule can be used.\n    string if = 1;\n\n    // default used to assign a value when none of the other fields match any of the specified expressions.\n    // Only one value can be defined per oneof.\n    bool default = 2;\n  }\n\n  // def specify variables to be used in current oneof field's scope for field binding.\n  repeated VariableDefinition def = 3;\n\n  // by used to refer to a name or message argument defined in a MessageRule, use `$.` to refer to the message argument.\n  // Use CEL (https://github.com/google/cel-spec) to evaluate the expression.\n  // Variables are already defined in MessageRule and FieldOneOf can be used.\n  string by = 4;\n}\n\n// CELPlugin define schema of CEL plugin.\nmessage CELPlugin {\n  repeated CELPluginExport export = 1;\n}\n\n// CELPluginExport describe the schema to be exposed as a CEL plugin.\nmessage CELPluginExport {\n  // name is the plugin name.\n  string name = 1;\n  // desc is the description of plugin.\n  // This description is used as documentation at code generation.\n  string desc = 2;\n  // types describe the message type you want to expose.\n  repeated CELReceiverType types = 3;\n  // functions describe the definition of the function you want to expose.\n  repeated CELFunction functions = 4;\n  // variables describe the definition of the variable you want to expose.\n  repeated CELVariable variables = 5;\n  CELPluginCapability capability = 6;\n}\n\n// CELPluginCapability controls the permissions granted to the WebAssembly plugin.\nmessage CELPluginCapability {\n  // env is the capability for environment variable.\n  optional CELPluginEnvCapability env = 1;\n  // file_system is the capability for file system.\n  optional CELPluginFileSystemCapability file_system = 2;\n  // network is the capability for network.\n  optional CELPluginNetworkCapability network = 3;\n}\n\n// CELPluginEnvCapability controls access to the environment variable.\nmessage CELPluginEnvCapability {\n  // all allows access to all environment variables.\n  bool all = 1;\n  // specifies accessible names. If \"all\" is true, it takes precedence.\n  repeated string names = 2;\n}\n\n// CELPluginFileSystemCapability controls access to the file system.\nmessage CELPluginFileSystemCapability {\n  // mount_path specifies the file path of the host to mount.\n  // If not specified, the root directory will be used.\n  string mount_path = 1;\n}\n\n// CELPluginNetworkCapability sets permissions related to network access.\n// This is an experimental feature.\nmessage CELPluginNetworkCapability {}\n\n// CELFunction represents the CEL function definition.\nmessage CELFunction {\n  // name is the function name.\n  string name = 1;\n  // desc is the description of function.\n  // This description is used as documentation at code generation.\n  string desc = 2;\n  // args describe the definition of the function argument.\n  repeated CELFunctionArgument args = 3;\n  // return describe the definition of return type of function.\n  CELType return = 4;\n}\n\n// CELReceiverType represents methods tied to the message.\nmessage CELReceiverType {\n  // name is the message name.\n  string name = 1;\n  // desc is the description of plugin.\n  // This description is used as documentation at code generation.\n  string desc = 2;\n  // methods describe the definition of the method for the message.\n  repeated CELFunction methods = 3;\n}\n\n// CELFunctionArgument represents the function argument.\nmessage CELFunctionArgument {\n  // name is the argument value name.\n  string name = 1;\n  // desc is the description of plugin.\n  // This description is used as documentation at code generation.\n  string desc = 2;\n  // type is the argument type.\n  CELType type = 3;\n}\n\n// CELType represents type information for CEL plugin interface.\nmessage CELType {\n  oneof type {\n    // kind is used when the type is a primitive type.\n    TypeKind kind = 1;\n    // repeated is used when the type is a repeated type.\n    CELType repeated = 2;\n    // map is used when the type is a map type.\n    CELMapType map = 3;\n    // message is a fqdn to the message type.\n    string message = 4;\n    // enum is a fqdn to the enum type.\n    string enum = 5;\n  }\n}\n\n// CELMapType represents map type.\nmessage CELMapType {\n  // key represents map's key type.\n  CELType key = 1;\n  // value represents map's value type.\n  CELType value = 2;\n}\n\n// CELVariable represents CEL variable.\nmessage CELVariable {\n  // name is the variable name.\n  string name = 1;\n  // desc is the description of plugin.\n  // This description is used as documentation at code generation.\n  string desc = 2;\n  // type is the variable type.\n  CELType type = 3;\n}\n"
  },
  {
    "path": "proto/grpc/federation/generator.proto",
    "content": "syntax = \"proto3\";\n\npackage grpc.federation.generator.plugin;\n\nimport \"google/protobuf/duration.proto\";\nimport \"google/rpc/code.proto\";\n\noption go_package = \"github.com/mercari/grpc-federation/grpc/federation/generator/plugin;plugin\";\n\nenum ActionType {\n  GENERATE_ACTION = 0;\n  KEEP_ACTION = 1;\n  CREATE_ACTION = 2;\n  DELETE_ACTION = 3;\n  UPDATE_ACTION = 4;\n}\n\nmessage ProtoCodeGeneratorResponse {\n  message GeneratedCodeInfo {\n    repeated Annotation annotation = 1;\n    message Annotation {\n      repeated int32 path = 1 [packed = true];\n      optional string source_file = 2;\n      optional int32 begin = 3;\n      optional int32 end = 4;\n      enum Semantic {\n        NONE = 0;\n        SET = 1;\n        ALIAS = 2;\n      }\n      optional Semantic semantic = 5;\n    }\n  }\n  optional string error = 1;\n  optional uint64 supported_features = 2;\n  enum Feature {\n    FEATURE_NONE = 0;\n    FEATURE_PROTO3_OPTIONAL = 1;\n    FEATURE_SUPPORTS_EDITIONS = 2;\n  }\n  optional int32 minimum_edition = 3;\n  optional int32 maximum_edition = 4;\n\n  message File {\n    optional string name = 1;\n    optional string insertion_point = 2;\n    optional string content = 15;\n    optional GeneratedCodeInfo generated_code_info = 16;\n  }\n  repeated File file = 15;\n}\n\n// CodeGeneratorRequest.\nmessage CodeGeneratorRequest {\n  ActionType type = 1;\n  string proto_path = 2;\n  string out_dir = 3 [deprecated = true];\n  repeated ProtoCodeGeneratorResponse.File files = 4;\n  repeated string grpc_federation_file_ids = 5;\n  Reference reference = 6;\n  OutputFilePathConfig output_file_path_config = 7;\n}\n\nmessage OutputFilePathConfig {\n  OutputFilePathMode mode = 1;\n  string prefix = 2;\n  string file_path = 3;\n  repeated string import_paths = 4;\n}\n\nenum OutputFilePathMode {\n  OUTPUT_FILE_PATH_MODE_UNSPECIFIED = 0;\n  OUTPUT_FILE_PATH_MODE_IMPORT = 1;\n  OUTPUT_FILE_PATH_MODE_MODULE_PREFIX = 2;\n  OUTPUT_FILE_PATH_MODE_SOURCE_RELATIVE = 3;\n}\n\nmessage Reference {\n  map<string, File> file_map = 1;\n  map<string, Service> service_map = 2;\n  map<string, Method> method_map = 3;\n  map<string, Message> message_map = 4;\n  map<string, Field> field_map = 5;\n  map<string, Enum> enum_map = 6;\n  map<string, EnumValue> enum_value_map = 7;\n  map<string, Oneof> oneof_map = 8;\n  map<string, CELPlugin> cel_plugin_map = 9;\n  map<string, MessageDependencyGraph> graph_map = 10;\n  map<string, VariableDefinition> variable_definition_map = 11;\n  map<string, VariableDefinitionGroup> variable_definition_group_map = 12;\n  map<string, MessageDependencyGraphNode> graph_node_map = 13;\n}\n\nmessage File {\n  string id = 1;\n  Package package = 2;\n  GoPackage go_package = 3;\n  string name = 4;\n  repeated string service_ids = 5;\n  repeated string message_ids = 6;\n  repeated string enum_ids = 7;\n  repeated string cel_plugin_ids = 8;\n  repeated string import_file_ids = 9;\n}\n\nmessage Package {\n  string name = 1;\n  repeated string file_ids = 2;\n}\n\nmessage GoPackage {\n  string name = 1;\n  string import_path = 2;\n  string alias_name = 3;\n}\n\nmessage Service {\n  string id = 1;\n  string name = 2;\n  repeated string method_ids = 3;\n  string file_id = 4;\n  repeated string message_ids = 5;\n  repeated string message_arg_ids = 6;\n  repeated string cel_plugin_ids = 7;\n  ServiceRule rule = 8;\n}\n\nmessage ServiceRule {\n  Env env = 1;\n  repeated ServiceVariable vars = 2;\n}\n\nmessage Env {\n  repeated EnvVar vars = 1;\n}\n\nmessage EnvVar {\n  string name = 1;\n  Type type = 2;\n  EnvVarOption option = 3;\n}\n\nmessage EnvVarOption {\n  string alternate = 1;\n  string default = 2;\n  bool required = 3;\n  bool ignored = 4;\n}\n\nmessage ServiceVariable {\n  string name = 1;\n  CELValue if = 2;\n  ServiceVariableExpr expr = 3;\n}\n\nmessage ServiceVariableExpr {\n  Type type = 1;\n  oneof expr {\n    CELValue by = 2;\n    MapExpr map = 3;\n    MessageExpr message = 4;\n    ServiceVariableValidationExpr validation = 5;\n    EnumExpr enum = 6;\n    SwitchExpr switch = 7;\n  }\n}\n\nmessage ServiceVariableValidationExpr {\n  CELValue if = 1;\n  CELValue message = 2;\n}\n\nmessage Method {\n  string id = 1;\n  string name = 2;\n  string request_id = 3;\n  string response_id = 4;\n  string service_id = 5;\n  MethodRule rule = 6;\n}\n\nmessage MethodRule {\n  google.protobuf.Duration timeout = 1;\n  string response_id = 2;\n}\n\nmessage Message {\n  string id = 1;\n  string name = 2;\n  bool is_map_entry = 3;\n  string file_id = 4;\n  string parent_message_id = 5;\n  repeated string nested_message_ids = 6;\n  repeated string enum_ids = 7;\n  repeated string field_ids = 8;\n  repeated string oneof_ids = 9;\n  MessageRule rule = 10;\n}\n\nmessage MessageRule {\n  string message_argument_id = 1;\n  bool custom_resolver = 2;\n  repeated string alias_ids = 3;\n  VariableDefinitionSet def_set = 4;\n}\n\nmessage VariableDefinitionSet {\n  repeated string variable_definition_ids = 1;\n  repeated string variable_definition_group_ids = 2;\n  string dependency_graph_id = 3;\n}\n\nmessage VariableDefinition {\n  string id = 1;\n  int64 index = 2;\n  string name = 3;\n  CELValue if = 4;\n  bool auto_bind = 5;\n  bool used = 6;\n  VariableExpr expr = 7;\n}\n\nmessage Field {\n  string id = 1;\n  string name = 2;\n  Type type = 3;\n  string oneof_id = 4;\n  FieldRule rule = 5;\n  string message_id = 6;\n}\n\nmessage FieldRule {\n  Value value = 1;\n  bool custom_resolver = 2;\n  bool message_custom_resolver = 3;\n  repeated string alias_ids = 4;\n  AutoBindField auto_bind_field = 5;\n  FieldOneofRule oneof_rule = 6;\n}\n\nmessage AutoBindField {\n  string variable_definition_id = 1;\n  string field_id = 2;\n}\n\nmessage FieldOneofRule {\n  CELValue if = 1;\n  bool default = 2;\n  CELValue by = 3;\n  VariableDefinitionSet def_set = 4;\n}\n\nmessage VariableDefinitionGroup {\n  string id = 1;\n  oneof group {\n    SequentialVariableDefinitionGroup sequential = 2;\n    ConcurrentVariableDefinitionGroup concurrent = 3;\n  }\n}\n\nmessage SequentialVariableDefinitionGroup {\n  string start = 1;\n  string end = 2;\n}\n\nmessage ConcurrentVariableDefinitionGroup {\n  repeated string starts = 1;\n  string end = 2;\n}\n\nmessage MessageDependencyGraph {\n  string id = 1;\n  repeated string root_node_ids = 2;\n}\n\nmessage MessageDependencyGraphNode {\n  string id = 1;\n  repeated string child_ids = 2;\n  string base_message_id = 3;\n  string variable_definition_id = 4;\n}\n\nmessage VariableExpr {\n  Type type = 1;\n  oneof expr {\n    CELValue by = 2;\n    MapExpr map = 3;\n    CallExpr call = 4;\n    MessageExpr message = 5;\n    ValidationExpr validation = 6;\n    EnumExpr enum = 7;\n    SwitchExpr switch = 8;\n  }\n}\n\nenum TypeKind {\n  UNKNOWN_TYPE = 0;\n  DOUBLE_TYPE = 1;\n  FLOAT_TYPE = 2;\n  INT64_TYPE = 3;\n  UINT64_TYPE = 4;\n  INT32_TYPE = 5;\n  FIXED64_TYPE = 6;\n  FIXED32_TYPE = 7;\n  BOOL_TYPE = 8;\n  STRING_TYPE = 9;\n  GROUP_TYPE = 10;\n  MESSAGE_TYPE = 11;\n  BYTES_TYPE = 12;\n  UINT32_TYPE = 13;\n  ENUM_TYPE = 14;\n  SFIXED32_TYPE = 15;\n  SFIXED64_TYPE = 16;\n  SINT32_TYPE = 17;\n  SINT64_TYPE = 18;\n}\n\nmessage Type {\n  TypeKind kind = 1;\n  bool repeated = 2;\n  bool is_null = 3;\n  oneof ref {\n    string message_id = 4;\n    string enum_id = 5;\n    string oneof_field_id = 6;\n  }\n}\n\nmessage CELValue {\n  string expr = 1;\n  Type out = 2;\n}\n\nmessage MapExpr {\n  Iterator iterator = 1;\n  MapIteratorExpr expr = 2;\n}\n\nmessage Iterator {\n  string name = 1;\n  string source_id = 2;\n}\n\nmessage MapIteratorExpr {\n  Type type = 1;\n  oneof expr {\n    CELValue by = 2;\n    MessageExpr message = 3;\n    EnumExpr enum = 4;\n  }\n}\n\nmessage CallExpr {\n  string method_id = 1;\n  Request request = 2;\n  google.protobuf.Duration timeout = 3;\n  RetryPolicy retry = 4;\n  repeated GRPCError errors = 5;\n  GRPCCallOption option = 6;\n  CELValue metadata = 7;\n}\n\nmessage RetryPolicy {\n  oneof policy {\n    RetryPolicyConstant constant = 1;\n    RetryPolicyExponential exponential = 2;\n  }\n  CELValue if = 3;\n}\n\nmessage RetryPolicyConstant {\n  google.protobuf.Duration interval = 1;\n  uint64 max_retries = 2;\n}\n\nmessage RetryPolicyExponential {\n  google.protobuf.Duration initial_interval = 1;\n  double randomization_factor = 2;\n  double multiplier = 3;\n  google.protobuf.Duration max_interval = 4;\n  uint64 max_retries = 5;\n  google.protobuf.Duration max_elapsed_time = 6;\n}\n\nmessage Request {\n  repeated Argument args = 1;\n  string type_id = 2;\n}\n\nmessage MessageExpr {\n  string message_id = 1;\n  repeated Argument args = 2;\n}\n\nmessage EnumExpr {\n  string enum_id = 1;\n  CELValue by = 2;\n}\n\nmessage Argument {\n  string name = 1;\n  Type type = 2;\n  Value value = 3;\n  CELValue if = 4;\n}\n\nmessage Value {\n  bool inline = 1;\n  CELValue cel = 2;\n}\n\nmessage SwitchExpr {\n  Type type = 1;\n  repeated SwitchCase cases = 2;\n  SwitchDefault default = 3;\n}\n\nmessage SwitchCase {\n  CELValue if = 1;\n  CELValue by = 2;\n  VariableDefinitionSet def_set = 3;\n}\n\nmessage SwitchDefault {\n  CELValue by = 1;\n  VariableDefinitionSet def_set = 2;\n}\n\nmessage ValidationExpr {\n  string name = 1;\n  GRPCError error = 2;\n}\n\nmessage GRPCError {\n  VariableDefinitionSet def_set = 1;\n  CELValue if = 2;\n  optional google.rpc.Code code = 3;\n  CELValue message = 4;\n  repeated GRPCErrorDetail details = 5;\n  bool ignore = 6;\n  CELValue ignore_and_response = 7;\n  int32 log_level = 8;\n}\n\nmessage GRPCErrorDetail {\n  VariableDefinitionSet def_set = 1;\n  CELValue if = 2;\n  VariableDefinitionSet messages = 3;\n  repeated PreconditionFailure precondition_failures = 4;\n  repeated BadRequest bad_requests = 5;\n  repeated LocalizedMessage localized_messages = 6;\n  repeated CELValue by = 7;\n}\n\nmessage PreconditionFailure {\n  repeated PreconditionFailureViolation violations = 1;\n}\n\nmessage PreconditionFailureViolation {\n  CELValue type = 1;\n  CELValue subject = 2;\n  CELValue description = 3;\n}\n\nmessage BadRequest {\n  repeated BadRequestFieldViolation field_violations = 1;\n}\n\nmessage BadRequestFieldViolation {\n  CELValue field = 1;\n  CELValue description = 2;\n}\n\nmessage LocalizedMessage {\n  string locale = 1;\n  CELValue message = 2;\n}\n\nmessage GRPCCallOption {\n  optional string content_subtype = 1;\n  optional string header_id = 2;\n  optional int64 max_call_recv_msg_size = 3;\n  optional int64 max_call_send_msg_size = 4;\n  optional bool static_method = 5;\n  optional string trailer_id = 6;\n  optional bool wait_for_ready = 7;\n}\n\nmessage Oneof {\n  string id = 1;\n  string name = 2;\n  string message_id = 3;\n  repeated string field_ids = 4;\n}\n\nmessage Enum {\n  string id = 1;\n  string name = 2;\n  repeated string value_ids = 3;\n  string message_id = 4;\n  string file_id = 5;\n  EnumRule rule = 6;\n}\n\nmessage EnumValue {\n  string id = 1;\n  string value = 2;\n  string enum_id = 3;\n  EnumValueRule rule = 4;\n}\n\nmessage EnumRule {\n  repeated string alias_ids = 1;\n}\n\nmessage EnumValueRule {\n  bool default = 1;\n  repeated EnumValueAlias aliases = 2;\n  repeated EnumValueAttribute attrs = 3;\n  bool noalias = 4;\n}\n\nmessage EnumValueAlias {\n  string enum_alias_id = 1;\n  repeated string alias_ids = 2;\n}\n\nmessage EnumValueAttribute {\n  string name = 1;\n  string value = 2;\n}\n\nmessage CELPlugin {\n  string id = 1;\n  string name = 2;\n  string description = 3;\n  repeated CELFunction functions = 4;\n}\n\nmessage CELFunction {\n  string name = 1;\n  string id = 2;\n  repeated Type args = 3;\n  Type return = 4;\n  string receiver_id = 5;\n}\n"
  },
  {
    "path": "proto/grpc/federation/plugin.proto",
    "content": "syntax = \"proto3\";\n\npackage grpc.federation;\n\nimport \"google/protobuf/any.proto\";\nimport \"google/protobuf/descriptor.proto\";\n\noption go_package = \"github.com/mercari/grpc-federation/grpc/federation/cel/plugin;plugin\";\n\nmessage CELPluginRequest {\n  string method = 1;\n  repeated CELPluginGRPCMetadata metadata = 2;\n  repeated CELPluginValue args = 3;\n}\n\nmessage CELPluginResponse {\n  CELPluginValue value = 1;\n  string error = 2;\n}\n\nmessage CELPluginGRPCMetadata {\n  string key = 1;\n  repeated string values = 2;\n}\n\nmessage CELPluginValue {\n  oneof value {\n    int64 int64 = 1;\n    uint64 uint64 = 2;\n    double double = 3;\n    string string = 4;\n    bytes bytes = 5;\n    bool bool = 6;\n    uint64 ptr = 7;\n    google.protobuf.Any message = 8;\n    CELPluginListValue list = 9;\n  }\n}\n\nmessage CELPluginListValue {\n  repeated CELPluginValue values = 1;\n}\n"
  },
  {
    "path": "proto/grpc/federation/private.proto",
    "content": "syntax = \"proto3\";\n\npackage grpc.federation.private;\n\nimport \"google/protobuf/any.proto\";\nimport \"google/rpc/error_details.proto\";\n\noption go_package = \"github.com/mercari/grpc-federation/grpc/federation/cel;cel\";\n\n// Error type information of the error variable used when evaluating CEL.\nmessage Error {\n  int32 code = 1;\n  string message = 2;\n  repeated google.protobuf.Any details = 3;\n  repeated google.protobuf.Any custom_messages = 4;\n  repeated google.rpc.ErrorInfo error_info = 5;\n  repeated google.rpc.RetryInfo retry_info = 6;\n  repeated google.rpc.DebugInfo debug_info = 7;\n  repeated google.rpc.QuotaFailure quota_failures = 8;\n  repeated google.rpc.PreconditionFailure precondition_failures = 9;\n  repeated google.rpc.BadRequest bad_requests = 10;\n  repeated google.rpc.RequestInfo request_info = 11;\n  repeated google.rpc.ResourceInfo resource_info = 12;\n  repeated google.rpc.Help helps = 13;\n  repeated google.rpc.LocalizedMessage localized_messages = 14;\n}\n\nmessage EnumSelector {\n  bool cond = 1;\n  oneof true {\n    int32 true_value = 2;\n    EnumSelector true_selector = 3;\n  }\n  oneof false {\n    int32 false_value = 4;\n    EnumSelector false_selector = 5;\n  }\n}\n"
  },
  {
    "path": "proto/grpc/federation/time.proto",
    "content": "syntax = \"proto3\";\n\npackage grpc.federation.time;\n\nimport \"google/protobuf/timestamp.proto\";\n\noption go_package = \"github.com/mercari/grpc-federation/grpc/federation/cel;cel\";\n\n// Time represents google.protobuf.Timestamp with time zone.\nmessage Time {\n  // timestamp is the timestamp.\n  google.protobuf.Timestamp timestamp = 1;\n  // loc is the location.\n  Location loc = 2;\n}\n\n// Location represents time zone.\n// See https://pkg.go.dev/time#Location.\nmessage Location {\n  // name is the time zone name.\n  string name = 1;\n  // offset is the offset (seconds east of UTC).\n  int64 offset = 2;\n}\n"
  },
  {
    "path": "proto/grpc/federation/url.proto",
    "content": "syntax = \"proto3\";\n\npackage grpc.federation.url;\n\noption go_package = \"github.com/mercari/grpc-federation/grpc/federation/cel;cel\";\n\n// URL represents the structure of the URL in net/url package.\nmessage URL {\n  string scheme = 1;\n  string opaque = 2;\n  Userinfo user = 3;\n  string host = 4;\n  string path = 5;\n  string raw_path = 6;\n  bool omit_host = 7;\n  bool force_query = 8;\n  string raw_query = 9;\n  string fragment = 10;\n  string raw_fragment = 11;\n}\n\n// Userinfo represents username and password information.\nmessage Userinfo {\n  string username = 1;\n  string password = 2;\n  bool password_set = 3;\n}\n"
  },
  {
    "path": "proto_deps/google/api/expr/v1alpha1/checked.proto",
    "content": "// Copyright 2022 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage google.api.expr.v1alpha1;\n\nimport \"google/api/expr/v1alpha1/syntax.proto\";\nimport \"google/protobuf/empty.proto\";\nimport \"google/protobuf/struct.proto\";\n\noption cc_enable_arenas = true;\noption go_package = \"google.golang.org/genproto/googleapis/api/expr/v1alpha1;expr\";\noption java_multiple_files = true;\noption java_outer_classname = \"DeclProto\";\noption java_package = \"com.google.api.expr.v1alpha1\";\n\n// Protos for representing CEL declarations and typed checked expressions.\n\n// A CEL expression which has been successfully type checked.\nmessage CheckedExpr {\n  // A map from expression ids to resolved references.\n  //\n  // The following entries are in this table:\n  //\n  // - An Ident or Select expression is represented here if it resolves to a\n  //   declaration. For instance, if `a.b.c` is represented by\n  //   `select(select(id(a), b), c)`, and `a.b` resolves to a declaration,\n  //   while `c` is a field selection, then the reference is attached to the\n  //   nested select expression (but not to the id or or the outer select).\n  //   In turn, if `a` resolves to a declaration and `b.c` are field selections,\n  //   the reference is attached to the ident expression.\n  // - Every Call expression has an entry here, identifying the function being\n  //   called.\n  // - Every CreateStruct expression for a message has an entry, identifying\n  //   the message.\n  map<int64, Reference> reference_map = 2;\n\n  // A map from expression ids to types.\n  //\n  // Every expression node which has a type different than DYN has a mapping\n  // here. If an expression has type DYN, it is omitted from this map to save\n  // space.\n  map<int64, Type> type_map = 3;\n\n  // The source info derived from input that generated the parsed `expr` and\n  // any optimizations made during the type-checking pass.\n  SourceInfo source_info = 5;\n\n  // The expr version indicates the major / minor version number of the `expr`\n  // representation.\n  //\n  // The most common reason for a version change will be to indicate to the CEL\n  // runtimes that transformations have been performed on the expr during static\n  // analysis. In some cases, this will save the runtime the work of applying\n  // the same or similar transformations prior to evaluation.\n  string expr_version = 6;\n\n  // The checked expression. Semantically equivalent to the parsed `expr`, but\n  // may have structural differences.\n  Expr expr = 4;\n}\n\n// Represents a CEL type.\nmessage Type {\n  // List type with typed elements, e.g. `list<example.proto.MyMessage>`.\n  message ListType {\n    // The element type.\n    Type elem_type = 1;\n  }\n\n  // Map type with parameterized key and value types, e.g. `map<string, int>`.\n  message MapType {\n    // The type of the key.\n    Type key_type = 1;\n\n    // The type of the value.\n    Type value_type = 2;\n  }\n\n  // Function type with result and arg types.\n  message FunctionType {\n    // Result type of the function.\n    Type result_type = 1;\n\n    // Argument types of the function.\n    repeated Type arg_types = 2;\n  }\n\n  // Application defined abstract type.\n  message AbstractType {\n    // The fully qualified name of this abstract type.\n    string name = 1;\n\n    // Parameter types for this abstract type.\n    repeated Type parameter_types = 2;\n  }\n\n  // CEL primitive types.\n  enum PrimitiveType {\n    // Unspecified type.\n    PRIMITIVE_TYPE_UNSPECIFIED = 0;\n\n    // Boolean type.\n    BOOL = 1;\n\n    // Int64 type.\n    //\n    // Proto-based integer values are widened to int64.\n    INT64 = 2;\n\n    // Uint64 type.\n    //\n    // Proto-based unsigned integer values are widened to uint64.\n    UINT64 = 3;\n\n    // Double type.\n    //\n    // Proto-based float values are widened to double values.\n    DOUBLE = 4;\n\n    // String type.\n    STRING = 5;\n\n    // Bytes type.\n    BYTES = 6;\n  }\n\n  // Well-known protobuf types treated with first-class support in CEL.\n  enum WellKnownType {\n    // Unspecified type.\n    WELL_KNOWN_TYPE_UNSPECIFIED = 0;\n\n    // Well-known protobuf.Any type.\n    //\n    // Any types are a polymorphic message type. During type-checking they are\n    // treated like `DYN` types, but at runtime they are resolved to a specific\n    // message type specified at evaluation time.\n    ANY = 1;\n\n    // Well-known protobuf.Timestamp type, internally referenced as `timestamp`.\n    TIMESTAMP = 2;\n\n    // Well-known protobuf.Duration type, internally referenced as `duration`.\n    DURATION = 3;\n  }\n\n  // The kind of type.\n  oneof type_kind {\n    // Dynamic type.\n    google.protobuf.Empty dyn = 1;\n\n    // Null value.\n    google.protobuf.NullValue null = 2;\n\n    // Primitive types: `true`, `1u`, `-2.0`, `'string'`, `b'bytes'`.\n    PrimitiveType primitive = 3;\n\n    // Wrapper of a primitive type, e.g. `google.protobuf.Int64Value`.\n    PrimitiveType wrapper = 4;\n\n    // Well-known protobuf type such as `google.protobuf.Timestamp`.\n    WellKnownType well_known = 5;\n\n    // Parameterized list with elements of `list_type`, e.g. `list<timestamp>`.\n    ListType list_type = 6;\n\n    // Parameterized map with typed keys and values.\n    MapType map_type = 7;\n\n    // Function type.\n    FunctionType function = 8;\n\n    // Protocol buffer message type.\n    //\n    // The `message_type` string specifies the qualified message type name. For\n    // example, `google.plus.Profile`.\n    string message_type = 9;\n\n    // Type param type.\n    //\n    // The `type_param` string specifies the type parameter name, e.g. `list<E>`\n    // would be a `list_type` whose element type was a `type_param` type\n    // named `E`.\n    string type_param = 10;\n\n    // Type type.\n    //\n    // The `type` value specifies the target type. e.g. int is type with a\n    // target type of `Primitive.INT`.\n    Type type = 11;\n\n    // Error type.\n    //\n    // During type-checking if an expression is an error, its type is propagated\n    // as the `ERROR` type. This permits the type-checker to discover other\n    // errors present in the expression.\n    google.protobuf.Empty error = 12;\n\n    // Abstract, application defined type.\n    AbstractType abstract_type = 14;\n  }\n}\n\n// Represents a declaration of a named value or function.\n//\n// A declaration is part of the contract between the expression, the agent\n// evaluating that expression, and the caller requesting evaluation.\nmessage Decl {\n  // Identifier declaration which specifies its type and optional `Expr` value.\n  //\n  // An identifier without a value is a declaration that must be provided at\n  // evaluation time. An identifier with a value should resolve to a constant,\n  // but may be used in conjunction with other identifiers bound at evaluation\n  // time.\n  message IdentDecl {\n    // Required. The type of the identifier.\n    Type type = 1;\n\n    // The constant value of the identifier. If not specified, the identifier\n    // must be supplied at evaluation time.\n    Constant value = 2;\n\n    // Documentation string for the identifier.\n    string doc = 3;\n  }\n\n  // Function declaration specifies one or more overloads which indicate the\n  // function's parameter types and return type.\n  //\n  // Functions have no observable side-effects (there may be side-effects like\n  // logging which are not observable from CEL).\n  message FunctionDecl {\n    // An overload indicates a function's parameter types and return type, and\n    // may optionally include a function body described in terms of\n    // [Expr][google.api.expr.v1alpha1.Expr] values.\n    //\n    // Functions overloads are declared in either a function or method\n    // call-style. For methods, the `params[0]` is the expected type of the\n    // target receiver.\n    //\n    // Overloads must have non-overlapping argument types after erasure of all\n    // parameterized type variables (similar as type erasure in Java).\n    message Overload {\n      // Required. Globally unique overload name of the function which reflects\n      // the function name and argument types.\n      //\n      // This will be used by a [Reference][google.api.expr.v1alpha1.Reference]\n      // to indicate the `overload_id` that was resolved for the function\n      // `name`.\n      string overload_id = 1;\n\n      // List of function parameter [Type][google.api.expr.v1alpha1.Type]\n      // values.\n      //\n      // Param types are disjoint after generic type parameters have been\n      // replaced with the type `DYN`. Since the `DYN` type is compatible with\n      // any other type, this means that if `A` is a type parameter, the\n      // function types `int<A>` and `int<int>` are not disjoint. Likewise,\n      // `map<string, string>` is not disjoint from `map<K, V>`.\n      //\n      // When the `result_type` of a function is a generic type param, the\n      // type param name also appears as the `type` of on at least one params.\n      repeated Type params = 2;\n\n      // The type param names associated with the function declaration.\n      //\n      // For example, `function ex<K,V>(K key, map<K, V> map) : V` would yield\n      // the type params of `K, V`.\n      repeated string type_params = 3;\n\n      // Required. The result type of the function. For example, the operator\n      // `string.isEmpty()` would have `result_type` of `kind: BOOL`.\n      Type result_type = 4;\n\n      // Whether the function is to be used in a method call-style `x.f(...)`\n      // or a function call-style `f(x, ...)`.\n      //\n      // For methods, the first parameter declaration, `params[0]` is the\n      // expected type of the target receiver.\n      bool is_instance_function = 5;\n\n      // Documentation string for the overload.\n      string doc = 6;\n    }\n\n    // Required. List of function overloads, must contain at least one overload.\n    repeated Overload overloads = 1;\n  }\n\n  // The fully qualified name of the declaration.\n  //\n  // Declarations are organized in containers and this represents the full path\n  // to the declaration in its container, as in `google.api.expr.Decl`.\n  //\n  // Declarations used as\n  // [FunctionDecl.Overload][google.api.expr.v1alpha1.Decl.FunctionDecl.Overload]\n  // parameters may or may not have a name depending on whether the overload is\n  // function declaration or a function definition containing a result\n  // [Expr][google.api.expr.v1alpha1.Expr].\n  string name = 1;\n\n  // Required. The declaration kind.\n  oneof decl_kind {\n    // Identifier declaration.\n    IdentDecl ident = 2;\n\n    // Function declaration.\n    FunctionDecl function = 3;\n  }\n}\n\n// Describes a resolved reference to a declaration.\nmessage Reference {\n  // The fully qualified name of the declaration.\n  string name = 1;\n\n  // For references to functions, this is a list of `Overload.overload_id`\n  // values which match according to typing rules.\n  //\n  // If the list has more than one element, overload resolution among the\n  // presented candidates must happen at runtime because of dynamic types. The\n  // type checker attempts to narrow down this list as much as possible.\n  //\n  // Empty if this is not a reference to a\n  // [Decl.FunctionDecl][google.api.expr.v1alpha1.Decl.FunctionDecl].\n  repeated string overload_id = 3;\n\n  // For references to constants, this may contain the value of the\n  // constant if known at compile time.\n  Constant value = 4;\n}\n"
  },
  {
    "path": "proto_deps/google/api/expr/v1alpha1/syntax.proto",
    "content": "// Copyright 2022 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage google.api.expr.v1alpha1;\n\nimport \"google/protobuf/duration.proto\";\nimport \"google/protobuf/struct.proto\";\nimport \"google/protobuf/timestamp.proto\";\n\noption cc_enable_arenas = true;\noption go_package = \"google.golang.org/genproto/googleapis/api/expr/v1alpha1;expr\";\noption java_multiple_files = true;\noption java_outer_classname = \"SyntaxProto\";\noption java_package = \"com.google.api.expr.v1alpha1\";\n\n// A representation of the abstract syntax of the Common Expression Language.\n\n// An expression together with source information as returned by the parser.\nmessage ParsedExpr {\n  // The parsed expression.\n  Expr expr = 2;\n\n  // The source info derived from input that generated the parsed `expr`.\n  SourceInfo source_info = 3;\n}\n\n// An abstract representation of a common expression.\n//\n// Expressions are abstractly represented as a collection of identifiers,\n// select statements, function calls, literals, and comprehensions. All\n// operators with the exception of the '.' operator are modelled as function\n// calls. This makes it easy to represent new operators into the existing AST.\n//\n// All references within expressions must resolve to a [Decl][google.api.expr.v1alpha1.Decl] provided at\n// type-check for an expression to be valid. A reference may either be a bare\n// identifier `name` or a qualified identifier `google.api.name`. References\n// may either refer to a value or a function declaration.\n//\n// For example, the expression `google.api.name.startsWith('expr')` references\n// the declaration `google.api.name` within a [Expr.Select][google.api.expr.v1alpha1.Expr.Select] expression, and\n// the function declaration `startsWith`.\nmessage Expr {\n  // An identifier expression. e.g. `request`.\n  message Ident {\n    // Required. Holds a single, unqualified identifier, possibly preceded by a\n    // '.'.\n    //\n    // Qualified names are represented by the [Expr.Select][google.api.expr.v1alpha1.Expr.Select] expression.\n    string name = 1;\n  }\n\n  // A field selection expression. e.g. `request.auth`.\n  message Select {\n    // Required. The target of the selection expression.\n    //\n    // For example, in the select expression `request.auth`, the `request`\n    // portion of the expression is the `operand`.\n    Expr operand = 1;\n\n    // Required. The name of the field to select.\n    //\n    // For example, in the select expression `request.auth`, the `auth` portion\n    // of the expression would be the `field`.\n    string field = 2;\n\n    // Whether the select is to be interpreted as a field presence test.\n    //\n    // This results from the macro `has(request.auth)`.\n    bool test_only = 3;\n  }\n\n  // A call expression, including calls to predefined functions and operators.\n  //\n  // For example, `value == 10`, `size(map_value)`.\n  message Call {\n    // The target of an method call-style expression. For example, `x` in\n    // `x.f()`.\n    Expr target = 1;\n\n    // Required. The name of the function or method being called.\n    string function = 2;\n\n    // The arguments.\n    repeated Expr args = 3;\n  }\n\n  // A list creation expression.\n  //\n  // Lists may either be homogenous, e.g. `[1, 2, 3]`, or heterogeneous, e.g.\n  // `dyn([1, 'hello', 2.0])`\n  message CreateList {\n    // The elements part of the list.\n    repeated Expr elements = 1;\n\n    // The indices within the elements list which are marked as optional\n    // elements.\n    //\n    // When an optional-typed value is present, the value it contains\n    // is included in the list. If the optional-typed value is absent, the list\n    // element is omitted from the CreateList result.\n    repeated int32 optional_indices = 2;\n  }\n\n  // A map or message creation expression.\n  //\n  // Maps are constructed as `{'key_name': 'value'}`. Message construction is\n  // similar, but prefixed with a type name and composed of field ids:\n  // `types.MyType{field_id: 'value'}`.\n  message CreateStruct {\n    // Represents an entry.\n    message Entry {\n      // Required. An id assigned to this node by the parser which is unique\n      // in a given expression tree. This is used to associate type\n      // information and other attributes to the node.\n      int64 id = 1;\n\n      // The `Entry` key kinds.\n      oneof key_kind {\n        // The field key for a message creator statement.\n        string field_key = 2;\n\n        // The key expression for a map creation statement.\n        Expr map_key = 3;\n      }\n\n      // Required. The value assigned to the key.\n      //\n      // If the optional_entry field is true, the expression must resolve to an\n      // optional-typed value. If the optional value is present, the key will be\n      // set; however, if the optional value is absent, the key will be unset.\n      Expr value = 4;\n\n      // Whether the key-value pair is optional.\n      bool optional_entry = 5;\n    }\n\n    // The type name of the message to be created, empty when creating map\n    // literals.\n    string message_name = 1;\n\n    // The entries in the creation expression.\n    repeated Entry entries = 2;\n  }\n\n  // A comprehension expression applied to a list or map.\n  //\n  // Comprehensions are not part of the core syntax, but enabled with macros.\n  // A macro matches a specific call signature within a parsed AST and replaces\n  // the call with an alternate AST block. Macro expansion happens at parse\n  // time.\n  //\n  // The following macros are supported within CEL:\n  //\n  // Aggregate type macros may be applied to all elements in a list or all keys\n  // in a map:\n  //\n  // *  `all`, `exists`, `exists_one` -  test a predicate expression against\n  //    the inputs and return `true` if the predicate is satisfied for all,\n  //    any, or only one value `list.all(x, x < 10)`.\n  // *  `filter` - test a predicate expression against the inputs and return\n  //    the subset of elements which satisfy the predicate:\n  //    `payments.filter(p, p > 1000)`.\n  // *  `map` - apply an expression to all elements in the input and return the\n  //    output aggregate type: `[1, 2, 3].map(i, i * i)`.\n  //\n  // The `has(m.x)` macro tests whether the property `x` is present in struct\n  // `m`. The semantics of this macro depend on the type of `m`. For proto2\n  // messages `has(m.x)` is defined as 'defined, but not set`. For proto3, the\n  // macro tests whether the property is set to its default. For map and struct\n  // types, the macro tests whether the property `x` is defined on `m`.\n  message Comprehension {\n    // The name of the iteration variable.\n    string iter_var = 1;\n\n    // The range over which var iterates.\n    Expr iter_range = 2;\n\n    // The name of the variable used for accumulation of the result.\n    string accu_var = 3;\n\n    // The initial value of the accumulator.\n    Expr accu_init = 4;\n\n    // An expression which can contain iter_var and accu_var.\n    //\n    // Returns false when the result has been computed and may be used as\n    // a hint to short-circuit the remainder of the comprehension.\n    Expr loop_condition = 5;\n\n    // An expression which can contain iter_var and accu_var.\n    //\n    // Computes the next value of accu_var.\n    Expr loop_step = 6;\n\n    // An expression which can contain accu_var.\n    //\n    // Computes the result.\n    Expr result = 7;\n  }\n\n  // Required. An id assigned to this node by the parser which is unique in a\n  // given expression tree. This is used to associate type information and other\n  // attributes to a node in the parse tree.\n  int64 id = 2;\n\n  // Required. Variants of expressions.\n  oneof expr_kind {\n    // A literal expression.\n    Constant const_expr = 3;\n\n    // An identifier expression.\n    Ident ident_expr = 4;\n\n    // A field selection expression, e.g. `request.auth`.\n    Select select_expr = 5;\n\n    // A call expression, including calls to predefined functions and operators.\n    Call call_expr = 6;\n\n    // A list creation expression.\n    CreateList list_expr = 7;\n\n    // A map or message creation expression.\n    CreateStruct struct_expr = 8;\n\n    // A comprehension expression.\n    Comprehension comprehension_expr = 9;\n  }\n}\n\n// Represents a primitive literal.\n//\n// Named 'Constant' here for backwards compatibility.\n//\n// This is similar as the primitives supported in the well-known type\n// `google.protobuf.Value`, but richer so it can represent CEL's full range of\n// primitives.\n//\n// Lists and structs are not included as constants as these aggregate types may\n// contain [Expr][google.api.expr.v1alpha1.Expr] elements which require evaluation and are thus not constant.\n//\n// Examples of literals include: `\"hello\"`, `b'bytes'`, `1u`, `4.2`, `-2`,\n// `true`, `null`.\nmessage Constant {\n  // Required. The valid constant kinds.\n  oneof constant_kind {\n    // null value.\n    google.protobuf.NullValue null_value = 1;\n\n    // boolean value.\n    bool bool_value = 2;\n\n    // int64 value.\n    int64 int64_value = 3;\n\n    // uint64 value.\n    uint64 uint64_value = 4;\n\n    // double value.\n    double double_value = 5;\n\n    // string value.\n    string string_value = 6;\n\n    // bytes value.\n    bytes bytes_value = 7;\n\n    // protobuf.Duration value.\n    //\n    // Deprecated: duration is no longer considered a builtin cel type.\n    google.protobuf.Duration duration_value = 8 [deprecated = true];\n\n    // protobuf.Timestamp value.\n    //\n    // Deprecated: timestamp is no longer considered a builtin cel type.\n    google.protobuf.Timestamp timestamp_value = 9 [deprecated = true];\n  }\n}\n\n// Source information collected at parse time.\nmessage SourceInfo {\n  // The syntax version of the source, e.g. `cel1`.\n  string syntax_version = 1;\n\n  // The location name. All position information attached to an expression is\n  // relative to this location.\n  //\n  // The location could be a file, UI element, or similar. For example,\n  // `acme/app/AnvilPolicy.cel`.\n  string location = 2;\n\n  // Monotonically increasing list of code point offsets where newlines\n  // `\\n` appear.\n  //\n  // The line number of a given position is the index `i` where for a given\n  // `id` the `line_offsets[i] < id_positions[id] < line_offsets[i+1]`. The\n  // column may be derivd from `id_positions[id] - line_offsets[i]`.\n  repeated int32 line_offsets = 3;\n\n  // A map from the parse node id (e.g. `Expr.id`) to the code point offset\n  // within the source.\n  map<int64, int32> positions = 4;\n\n  // A map from the parse node id where a macro replacement was made to the\n  // call `Expr` that resulted in a macro expansion.\n  //\n  // For example, `has(value.field)` is a function call that is replaced by a\n  // `test_only` field selection in the AST. Likewise, the call\n  // `list.exists(e, e > 10)` translates to a comprehension expression. The key\n  // in the map corresponds to the expression id of the expanded macro, and the\n  // value is the call `Expr` that was replaced.\n  map<int64, Expr> macro_calls = 5;\n}\n\n// A specific position in source.\nmessage SourcePosition {\n  // The soucre location name (e.g. file name).\n  string location = 1;\n\n  // The UTF-8 code unit offset.\n  int32 offset = 2;\n\n  // The 1-based index of the starting line in the source text\n  // where the issue occurs, or 0 if unknown.\n  int32 line = 3;\n\n  // The 0-based index of the starting position within the line of source text\n  // where the issue occurs.  Only meaningful if line is nonzero.\n  int32 column = 4;\n}\n"
  },
  {
    "path": "proto_deps/google/rpc/code.proto",
    "content": "// Commit: f36c65081b19e0758ef5696feca27c7dcee5475e\n// Copyright 2022 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage google.rpc;\n\noption go_package = \"google.golang.org/genproto/googleapis/rpc/code;code\";\noption java_multiple_files = true;\noption java_outer_classname = \"CodeProto\";\noption java_package = \"com.google.rpc\";\noption objc_class_prefix = \"RPC\";\n\n// The canonical error codes for gRPC APIs.\n//\n//\n// Sometimes multiple error codes may apply.  Services should return\n// the most specific error code that applies.  For example, prefer\n// `OUT_OF_RANGE` over `FAILED_PRECONDITION` if both codes apply.\n// Similarly prefer `NOT_FOUND` or `ALREADY_EXISTS` over `FAILED_PRECONDITION`.\nenum Code {\n  // Not an error; returned on success.\n  //\n  // HTTP Mapping: 200 OK\n  OK = 0;\n\n  // The operation was cancelled, typically by the caller.\n  //\n  // HTTP Mapping: 499 Client Closed Request\n  CANCELLED = 1;\n\n  // Unknown error.  For example, this error may be returned when\n  // a `Status` value received from another address space belongs to\n  // an error space that is not known in this address space.  Also\n  // errors raised by APIs that do not return enough error information\n  // may be converted to this error.\n  //\n  // HTTP Mapping: 500 Internal Server Error\n  UNKNOWN = 2;\n\n  // The client specified an invalid argument.  Note that this differs\n  // from `FAILED_PRECONDITION`.  `INVALID_ARGUMENT` indicates arguments\n  // that are problematic regardless of the state of the system\n  // (e.g., a malformed file name).\n  //\n  // HTTP Mapping: 400 Bad Request\n  INVALID_ARGUMENT = 3;\n\n  // The deadline expired before the operation could complete. For operations\n  // that change the state of the system, this error may be returned\n  // even if the operation has completed successfully.  For example, a\n  // successful response from a server could have been delayed long\n  // enough for the deadline to expire.\n  //\n  // HTTP Mapping: 504 Gateway Timeout\n  DEADLINE_EXCEEDED = 4;\n\n  // Some requested entity (e.g., file or directory) was not found.\n  //\n  // Note to server developers: if a request is denied for an entire class\n  // of users, such as gradual feature rollout or undocumented allowlist,\n  // `NOT_FOUND` may be used. If a request is denied for some users within\n  // a class of users, such as user-based access control, `PERMISSION_DENIED`\n  // must be used.\n  //\n  // HTTP Mapping: 404 Not Found\n  NOT_FOUND = 5;\n\n  // The entity that a client attempted to create (e.g., file or directory)\n  // already exists.\n  //\n  // HTTP Mapping: 409 Conflict\n  ALREADY_EXISTS = 6;\n\n  // The caller does not have permission to execute the specified\n  // operation. `PERMISSION_DENIED` must not be used for rejections\n  // caused by exhausting some resource (use `RESOURCE_EXHAUSTED`\n  // instead for those errors). `PERMISSION_DENIED` must not be\n  // used if the caller can not be identified (use `UNAUTHENTICATED`\n  // instead for those errors). This error code does not imply the\n  // request is valid or the requested entity exists or satisfies\n  // other pre-conditions.\n  //\n  // HTTP Mapping: 403 Forbidden\n  PERMISSION_DENIED = 7;\n\n  // The request does not have valid authentication credentials for the\n  // operation.\n  //\n  // HTTP Mapping: 401 Unauthorized\n  UNAUTHENTICATED = 16;\n\n  // Some resource has been exhausted, perhaps a per-user quota, or\n  // perhaps the entire file system is out of space.\n  //\n  // HTTP Mapping: 429 Too Many Requests\n  RESOURCE_EXHAUSTED = 8;\n\n  // The operation was rejected because the system is not in a state\n  // required for the operation's execution.  For example, the directory\n  // to be deleted is non-empty, an rmdir operation is applied to\n  // a non-directory, etc.\n  //\n  // Service implementors can use the following guidelines to decide\n  // between `FAILED_PRECONDITION`, `ABORTED`, and `UNAVAILABLE`:\n  //  (a) Use `UNAVAILABLE` if the client can retry just the failing call.\n  //  (b) Use `ABORTED` if the client should retry at a higher level. For\n  //      example, when a client-specified test-and-set fails, indicating the\n  //      client should restart a read-modify-write sequence.\n  //  (c) Use `FAILED_PRECONDITION` if the client should not retry until\n  //      the system state has been explicitly fixed. For example, if an \"rmdir\"\n  //      fails because the directory is non-empty, `FAILED_PRECONDITION`\n  //      should be returned since the client should not retry unless\n  //      the files are deleted from the directory.\n  //\n  // HTTP Mapping: 400 Bad Request\n  FAILED_PRECONDITION = 9;\n\n  // The operation was aborted, typically due to a concurrency issue such as\n  // a sequencer check failure or transaction abort.\n  //\n  // See the guidelines above for deciding between `FAILED_PRECONDITION`,\n  // `ABORTED`, and `UNAVAILABLE`.\n  //\n  // HTTP Mapping: 409 Conflict\n  ABORTED = 10;\n\n  // The operation was attempted past the valid range.  E.g., seeking or\n  // reading past end-of-file.\n  //\n  // Unlike `INVALID_ARGUMENT`, this error indicates a problem that may\n  // be fixed if the system state changes. For example, a 32-bit file\n  // system will generate `INVALID_ARGUMENT` if asked to read at an\n  // offset that is not in the range [0,2^32-1], but it will generate\n  // `OUT_OF_RANGE` if asked to read from an offset past the current\n  // file size.\n  //\n  // There is a fair bit of overlap between `FAILED_PRECONDITION` and\n  // `OUT_OF_RANGE`.  We recommend using `OUT_OF_RANGE` (the more specific\n  // error) when it applies so that callers who are iterating through\n  // a space can easily look for an `OUT_OF_RANGE` error to detect when\n  // they are done.\n  //\n  // HTTP Mapping: 400 Bad Request\n  OUT_OF_RANGE = 11;\n\n  // The operation is not implemented or is not supported/enabled in this\n  // service.\n  //\n  // HTTP Mapping: 501 Not Implemented\n  UNIMPLEMENTED = 12;\n\n  // Internal errors.  This means that some invariants expected by the\n  // underlying system have been broken.  This error code is reserved\n  // for serious errors.\n  //\n  // HTTP Mapping: 500 Internal Server Error\n  INTERNAL = 13;\n\n  // The service is currently unavailable.  This is most likely a\n  // transient condition, which can be corrected by retrying with\n  // a backoff. Note that it is not always safe to retry\n  // non-idempotent operations.\n  //\n  // See the guidelines above for deciding between `FAILED_PRECONDITION`,\n  // `ABORTED`, and `UNAVAILABLE`.\n  //\n  // HTTP Mapping: 503 Service Unavailable\n  UNAVAILABLE = 14;\n\n  // Unrecoverable data loss or corruption.\n  //\n  // HTTP Mapping: 500 Internal Server Error\n  DATA_LOSS = 15;\n}\n"
  },
  {
    "path": "proto_deps/google/rpc/embed.go",
    "content": "package rpc\n\nimport (\n\t_ \"embed\"\n)\n\n//go:embed code.proto\nvar GoogleRPCCodeProtoFile []byte\n\n//go:embed error_details.proto\nvar GoogleRPCErrorDetailsProtoFile []byte\n"
  },
  {
    "path": "proto_deps/google/rpc/error_details.proto",
    "content": "// Commit: f36c65081b19e0758ef5696feca27c7dcee5475e\n// Copyright 2022 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\npackage google.rpc;\n\nimport \"google/protobuf/duration.proto\";\n\noption go_package = \"google.golang.org/genproto/googleapis/rpc/errdetails;errdetails\";\noption java_multiple_files = true;\noption java_outer_classname = \"ErrorDetailsProto\";\noption java_package = \"com.google.rpc\";\noption objc_class_prefix = \"RPC\";\n\n// Describes the cause of the error with structured details.\n//\n// Example of an error when contacting the \"pubsub.googleapis.com\" API when it\n// is not enabled:\n//\n//     { \"reason\": \"API_DISABLED\"\n//       \"domain\": \"googleapis.com\"\n//       \"metadata\": {\n//         \"resource\": \"projects/123\",\n//         \"service\": \"pubsub.googleapis.com\"\n//       }\n//     }\n//\n// This response indicates that the pubsub.googleapis.com API is not enabled.\n//\n// Example of an error that is returned when attempting to create a Spanner\n// instance in a region that is out of stock:\n//\n//     { \"reason\": \"STOCKOUT\"\n//       \"domain\": \"spanner.googleapis.com\",\n//       \"metadata\": {\n//         \"availableRegions\": \"us-central1,us-east2\"\n//       }\n//     }\nmessage ErrorInfo {\n  // The reason of the error. This is a constant value that identifies the\n  // proximate cause of the error. Error reasons are unique within a particular\n  // domain of errors. This should be at most 63 characters and match a\n  // regular expression of `[A-Z][A-Z0-9_]+[A-Z0-9]`, which represents\n  // UPPER_SNAKE_CASE.\n  string reason = 1;\n\n  // The logical grouping to which the \"reason\" belongs. The error domain\n  // is typically the registered service name of the tool or product that\n  // generates the error. Example: \"pubsub.googleapis.com\". If the error is\n  // generated by some common infrastructure, the error domain must be a\n  // globally unique value that identifies the infrastructure. For Google API\n  // infrastructure, the error domain is \"googleapis.com\".\n  string domain = 2;\n\n  // Additional structured details about this error.\n  //\n  // Keys should match /[a-zA-Z0-9-_]/ and be limited to 64 characters in\n  // length. When identifying the current value of an exceeded limit, the units\n  // should be contained in the key, not the value.  For example, rather than\n  // {\"instanceLimit\": \"100/request\"}, should be returned as,\n  // {\"instanceLimitPerRequest\": \"100\"}, if the client exceeds the number of\n  // instances that can be created in a single (batch) request.\n  map<string, string> metadata = 3;\n}\n\n// Describes when the clients can retry a failed request. Clients could ignore\n// the recommendation here or retry when this information is missing from error\n// responses.\n//\n// It's always recommended that clients should use exponential backoff when\n// retrying.\n//\n// Clients should wait until `retry_delay` amount of time has passed since\n// receiving the error response before retrying.  If retrying requests also\n// fail, clients should use an exponential backoff scheme to gradually increase\n// the delay between retries based on `retry_delay`, until either a maximum\n// number of retries have been reached or a maximum retry delay cap has been\n// reached.\nmessage RetryInfo {\n  // Clients should wait at least this long between retrying the same request.\n  google.protobuf.Duration retry_delay = 1;\n}\n\n// Describes additional debugging info.\nmessage DebugInfo {\n  // The stack trace entries indicating where the error occurred.\n  repeated string stack_entries = 1;\n\n  // Additional debugging information provided by the server.\n  string detail = 2;\n}\n\n// Describes how a quota check failed.\n//\n// For example if a daily limit was exceeded for the calling project,\n// a service could respond with a QuotaFailure detail containing the project\n// id and the description of the quota limit that was exceeded.  If the\n// calling project hasn't enabled the service in the developer console, then\n// a service could respond with the project id and set `service_disabled`\n// to true.\n//\n// Also see RetryInfo and Help types for other details about handling a\n// quota failure.\nmessage QuotaFailure {\n  // A message type used to describe a single quota violation.  For example, a\n  // daily quota or a custom quota that was exceeded.\n  message Violation {\n    // The subject on which the quota check failed.\n    // For example, \"clientip:<ip address of client>\" or \"project:<Google\n    // developer project id>\".\n    string subject = 1;\n\n    // A description of how the quota check failed. Clients can use this\n    // description to find more about the quota configuration in the service's\n    // public documentation, or find the relevant quota limit to adjust through\n    // developer console.\n    //\n    // For example: \"Service disabled\" or \"Daily Limit for read operations\n    // exceeded\".\n    string description = 2;\n  }\n\n  // Describes all quota violations.\n  repeated Violation violations = 1;\n}\n\n// Describes what preconditions have failed.\n//\n// For example, if an RPC failed because it required the Terms of Service to be\n// acknowledged, it could list the terms of service violation in the\n// PreconditionFailure message.\nmessage PreconditionFailure {\n  // A message type used to describe a single precondition failure.\n  message Violation {\n    // The type of PreconditionFailure. We recommend using a service-specific\n    // enum type to define the supported precondition violation subjects. For\n    // example, \"TOS\" for \"Terms of Service violation\".\n    string type = 1;\n\n    // The subject, relative to the type, that failed.\n    // For example, \"google.com/cloud\" relative to the \"TOS\" type would indicate\n    // which terms of service is being referenced.\n    string subject = 2;\n\n    // A description of how the precondition failed. Developers can use this\n    // description to understand how to fix the failure.\n    //\n    // For example: \"Terms of service not accepted\".\n    string description = 3;\n  }\n\n  // Describes all precondition violations.\n  repeated Violation violations = 1;\n}\n\n// Describes violations in a client request. This error type focuses on the\n// syntactic aspects of the request.\nmessage BadRequest {\n  // A message type used to describe a single bad request field.\n  message FieldViolation {\n    // A path that leads to a field in the request body. The value will be a\n    // sequence of dot-separated identifiers that identify a protocol buffer\n    // field.\n    //\n    // Consider the following:\n    //\n    //     message CreateContactRequest {\n    //       message EmailAddress {\n    //         enum Type {\n    //           TYPE_UNSPECIFIED = 0;\n    //           HOME = 1;\n    //           WORK = 2;\n    //         }\n    //\n    //         optional string email = 1;\n    //         repeated EmailType type = 2;\n    //       }\n    //\n    //       string full_name = 1;\n    //       repeated EmailAddress email_addresses = 2;\n    //     }\n    //\n    // In this example, in proto `field` could take one of the following values:\n    //\n    // * `full_name` for a violation in the `full_name` value\n    // * `email_addresses[1].email` for a violation in the `email` field of the\n    //   first `email_addresses` message\n    // * `email_addresses[3].type[2]` for a violation in the second `type`\n    //   value in the third `email_addresses` message.\n    //\n    // In JSON, the same values are represented as:\n    //\n    // * `fullName` for a violation in the `fullName` value\n    // * `emailAddresses[1].email` for a violation in the `email` field of the\n    //   first `emailAddresses` message\n    // * `emailAddresses[3].type[2]` for a violation in the second `type`\n    //   value in the third `emailAddresses` message.\n    string field = 1;\n\n    // A description of why the request element is bad.\n    string description = 2;\n  }\n\n  // Describes all violations in a client request.\n  repeated FieldViolation field_violations = 1;\n}\n\n// Contains metadata about the request that clients can attach when filing a bug\n// or providing other forms of feedback.\nmessage RequestInfo {\n  // An opaque string that should only be interpreted by the service generating\n  // it. For example, it can be used to identify requests in the service's logs.\n  string request_id = 1;\n\n  // Any data that was used to serve this request. For example, an encrypted\n  // stack trace that can be sent back to the service provider for debugging.\n  string serving_data = 2;\n}\n\n// Describes the resource that is being accessed.\nmessage ResourceInfo {\n  // A name for the type of resource being accessed, e.g. \"sql table\",\n  // \"cloud storage bucket\", \"file\", \"Google calendar\"; or the type URL\n  // of the resource: e.g. \"type.googleapis.com/google.pubsub.v1.Topic\".\n  string resource_type = 1;\n\n  // The name of the resource being accessed.  For example, a shared calendar\n  // name: \"example.com_4fghdhgsrgh@group.calendar.google.com\", if the current\n  // error is\n  // [google.rpc.Code.PERMISSION_DENIED][google.rpc.Code.PERMISSION_DENIED].\n  string resource_name = 2;\n\n  // The owner of the resource (optional).\n  // For example, \"user:<owner email>\" or \"project:<Google developer project\n  // id>\".\n  string owner = 3;\n\n  // Describes what error is encountered when accessing this resource.\n  // For example, updating a cloud project may require the `writer` permission\n  // on the developer console project.\n  string description = 4;\n}\n\n// Provides links to documentation or for performing an out of band action.\n//\n// For example, if a quota check failed with an error indicating the calling\n// project hasn't enabled the accessed service, this can contain a URL pointing\n// directly to the right place in the developer console to flip the bit.\nmessage Help {\n  // Describes a URL link.\n  message Link {\n    // Describes what the link offers.\n    string description = 1;\n\n    // The URL of the link.\n    string url = 2;\n  }\n\n  // URL(s) pointing to additional information on handling the current error.\n  repeated Link links = 1;\n}\n\n// Provides a localized error message that is safe to return to the user\n// which can be attached to an RPC error.\nmessage LocalizedMessage {\n  // The locale used following the specification defined at\n  // https://www.rfc-editor.org/rfc/bcp/bcp47.txt.\n  // Examples are: \"en-US\", \"fr-CH\", \"es-MX\"\n  string locale = 1;\n\n  // The localized error message in the above locale.\n  string message = 2;\n}\n"
  },
  {
    "path": "resolver/candidates.go",
    "content": "package resolver\n\nimport (\n\t\"fmt\"\n\t\"sort\"\n\t\"strings\"\n\n\t\"github.com/mercari/grpc-federation/source\"\n)\n\ntype ValueCandidate struct {\n\tName string\n\tType *Type\n}\n\ntype ValueCandidates []*ValueCandidate\n\nfunc (c ValueCandidates) Names() []string {\n\tret := make([]string, 0, len(c))\n\tfor _, cc := range c {\n\t\tret = append(ret, cc.Name)\n\t}\n\treturn ret\n}\n\nfunc (c ValueCandidates) Unique() ValueCandidates {\n\tret := make(ValueCandidates, 0, len(c))\n\tnameMap := make(map[string]struct{})\n\tfor _, cc := range c {\n\t\tif _, exists := nameMap[cc.Name]; exists {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, cc)\n\t\tnameMap[cc.Name] = struct{}{}\n\t}\n\treturn ret\n}\n\nfunc (c ValueCandidates) Filter(typ *Type) ValueCandidates {\n\tret := make(ValueCandidates, 0, len(c))\n\tfor _, cc := range c {\n\t\tif cc.Type == nil || typ == nil {\n\t\t\tret = append(ret, cc)\n\t\t\tcontinue\n\t\t}\n\t\tif cc.Type.Message == nil && cc.Type.Enum == nil {\n\t\t\tif cc.Type.Kind == typ.Kind {\n\t\t\t\tret = append(ret, cc)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t\tif cc.Type == typ {\n\t\t\tret = append(ret, cc)\n\t\t\tcontinue\n\t\t}\n\t\tif cc.Type.IsNumber() && typ.IsNumber() {\n\t\t\tret = append(ret, cc)\n\t\t\tcontinue\n\t\t}\n\t\tif cc.Type.Message != nil && typ.Message != nil && cc.Type.Message == typ.Message {\n\t\t\tret = append(ret, cc)\n\t\t\tcontinue\n\t\t}\n\t\tif cc.Type.Enum != nil && typ.Enum != nil && cc.Type.Enum == typ.Enum {\n\t\t\tret = append(ret, cc)\n\t\t\tcontinue\n\t\t}\n\t}\n\treturn ret\n}\n\nfunc (r *Resolver) Candidates(loc *source.Location) []string {\n\tfor _, file := range r.files {\n\t\tif strings.HasSuffix(loc.FileName, file.GetName()) {\n\t\t\tprotoPkgName := file.GetPackage()\n\t\t\tswitch {\n\t\t\tcase loc.Message != nil:\n\t\t\t\tmsg, ok := r.cachedMessageMap[fmt.Sprintf(\"%s.%s\", protoPkgName, loc.Message.Name)]\n\t\t\t\tif !ok {\n\t\t\t\t\t// The file name could match wrongly if it has the same suffix\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\treturn r.candidatesMessage(msg, loc.Message)\n\t\t\tcase loc.Service != nil:\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (r *Resolver) candidatesMessage(msg *Message, loc *source.Message) []string {\n\tswitch {\n\tcase loc.Option != nil:\n\t\treturn r.candidatesMessageOption(msg, loc.Option)\n\tcase loc.Field != nil:\n\t\treturn r.candidatesField(msg, loc.Field)\n\t}\n\treturn nil\n}\n\nfunc (r *Resolver) candidatesMessageOption(msg *Message, opt *source.MessageOption) []string {\n\tswitch {\n\tcase opt.Def != nil:\n\t\treturn r.candidatesVariableDefinitions(msg, opt.Def)\n\t}\n\treturn []string{\"def\", \"custom_resolver\", \"alias\"}\n}\n\nfunc (r *Resolver) candidatesField(msg *Message, field *source.Field) []string {\n\tswitch {\n\tcase field.Option != nil:\n\t\treturn r.candidatesFieldOption(msg, field)\n\t}\n\treturn nil\n}\n\nfunc (r *Resolver) candidatesFieldOption(msg *Message, field *source.Field) []string {\n\tswitch {\n\tcase field.Option.By:\n\t\tf := msg.Field(field.Name)\n\t\tif f == nil {\n\t\t\treturn nil\n\t\t}\n\t\tif msg.Rule == nil {\n\t\t\treturn []string{}\n\t\t}\n\t\tdefIdx := len(msg.Rule.DefSet.Definitions()) - 1\n\t\treturn r.candidatesCELValue(msg, defIdx).Unique().Filter(f.Type).Names()\n\t}\n\treturn []string{\"by\"}\n}\n\nfunc (r *Resolver) candidatesVariableDefinitions(msg *Message, opt *source.VariableDefinitionOption) []string {\n\tswitch {\n\tcase opt.Name:\n\t\treturn []string{}\n\tcase opt.By:\n\t\treturn r.candidatesCELValue(msg, opt.Idx-1).Unique().Names()\n\tcase opt.Map != nil:\n\t\treturn r.candidatesMapExpr(msg, opt.Idx, opt.Map)\n\tcase opt.Call != nil:\n\t\treturn r.candidatesCallExpr(msg, opt.Idx, opt.Call)\n\tcase opt.Message != nil:\n\t\treturn r.candidatesMessageExpr(msg, opt.Idx, opt.Message)\n\t}\n\treturn []string{\"name\", \"by\", \"map\", \"call\", \"message\", \"validation\"}\n}\n\nfunc (r *Resolver) candidatesCallExpr(msg *Message, defIdx int, opt *source.CallExprOption) []string {\n\tswitch {\n\tcase opt.Method:\n\t\treturn r.candidatesMethodName(msg)\n\tcase opt.Request != nil:\n\t\treturn r.candidatesRequest(msg, defIdx, opt.Request)\n\tcase opt.Timeout:\n\tcase opt.Retry != nil:\n\t}\n\treturn []string{\"method\", \"request\", \"timeout\", \"retry\"}\n}\n\nfunc (r *Resolver) candidatesRequest(msg *Message, defIdx int, opt *source.RequestOption) []string {\n\tswitch {\n\tcase opt.Field:\n\t\treturn r.candidatesRequestField(msg, defIdx)\n\tcase opt.By:\n\t\ttyp := r.requestFieldType(msg, defIdx, opt.Idx)\n\t\treturn r.candidatesCELValue(msg, defIdx).Unique().Filter(typ).Names()\n\t}\n\treturn []string{\"field\", \"by\"}\n}\n\nfunc (r *Resolver) candidatesMessageExpr(msg *Message, defIdx int, opt *source.MessageExprOption) []string {\n\tswitch {\n\tcase opt.Name:\n\t\treturn r.candidatesMessageName(msg)\n\tcase opt.Args != nil:\n\t\treturn r.candidatesMessageExprArguments(msg, defIdx, opt.Args)\n\t}\n\treturn []string{\"name\", \"args\"}\n}\n\nfunc (r *Resolver) candidatesMapExpr(msg *Message, defIdx int, opt *source.MapExprOption) []string {\n\treturn nil\n}\n\nfunc (r *Resolver) candidatesMessageExprArguments(msg *Message, defIdx int, arg *source.ArgumentOption) []string {\n\tswitch {\n\tcase arg.Name:\n\t\treturn []string{}\n\tcase arg.By, arg.Inline:\n\t\treturn r.candidatesCELValue(msg, defIdx).Unique().Names()\n\t}\n\treturn []string{\"name\", \"by\", \"inline\"}\n}\n\nfunc (r *Resolver) candidatesMethodName(msg *Message) []string {\n\tselfPkgName := fmt.Sprintf(\"%s.\", msg.PackageName())\n\tnames := make([]string, 0, len(r.cachedMethodMap))\n\tfor name := range r.cachedMethodMap {\n\t\tif strings.HasPrefix(name, selfPkgName) {\n\t\t\tcontinue\n\t\t}\n\t\tnames = append(names, name)\n\t}\n\tsort.Strings(names)\n\treturn names\n}\n\nfunc (r *Resolver) candidatesRequestField(msg *Message, defIdx int) []string {\n\tif msg.Rule == nil {\n\t\treturn nil\n\t}\n\n\tif len(msg.Rule.DefSet.Definitions()) <= defIdx {\n\t\treturn nil\n\t}\n\n\tdef := msg.Rule.DefSet.Definitions()[defIdx]\n\tif def.Expr == nil {\n\t\treturn nil\n\t}\n\tif def.Expr.Call == nil {\n\t\treturn nil\n\t}\n\tif def.Expr.Call.Method == nil {\n\t\treturn nil\n\t}\n\tif def.Expr.Call.Method.Request == nil {\n\t\treturn nil\n\t}\n\n\tfields := def.Expr.Call.Method.Request.Fields\n\tnames := make([]string, 0, len(fields))\n\tfor _, field := range fields {\n\t\tnames = append(names, field.Name)\n\t}\n\treturn names\n}\n\nfunc (r *Resolver) requestFieldType(msg *Message, defIdx, reqIdx int) *Type {\n\tif msg.Rule == nil {\n\t\treturn nil\n\t}\n\tif len(msg.Rule.DefSet.Definitions()) <= defIdx {\n\t\treturn nil\n\t}\n\n\tdef := msg.Rule.DefSet.Definitions()[defIdx]\n\tif def.Expr == nil {\n\t\treturn nil\n\t}\n\tif def.Expr.Call == nil {\n\t\treturn nil\n\t}\n\tif def.Expr.Call.Method == nil {\n\t\treturn nil\n\t}\n\tif def.Expr.Call.Method.Request == nil {\n\t\treturn nil\n\t}\n\n\tfields := def.Expr.Call.Method.Request.Fields\n\tif len(fields) <= reqIdx {\n\t\treturn nil\n\t}\n\treturn fields[reqIdx].Type\n}\n\nfunc (r *Resolver) candidatesMessageName(msg *Message) []string {\n\tconst federationPkgName = \"grpc.federation.\"\n\n\tselfPkgName := fmt.Sprintf(\"%s.\", msg.PackageName())\n\tselfName := fmt.Sprintf(\"%s.%s\", msg.PackageName(), msg.Name)\n\tnames := make([]string, 0, len(r.cachedMessageMap))\n\tfor name := range r.cachedMessageMap {\n\t\tif name == selfName {\n\t\t\tcontinue\n\t\t}\n\t\tif strings.HasPrefix(name, federationPkgName) {\n\t\t\tcontinue\n\t\t}\n\t\tname = strings.TrimPrefix(name, selfPkgName)\n\t\tnames = append(names, name)\n\t}\n\tsort.Strings(names)\n\treturn names\n}\n\nfunc (r *Resolver) candidatesCELValue(msg *Message, defIdx int) ValueCandidates {\n\tvar ret ValueCandidates\n\tret = append(ret, r.candidatesVariableName(msg, defIdx)...)\n\tret = append(ret, r.candidatesMessageArguments(msg)...)\n\treturn ret\n}\n\nfunc (r *Resolver) candidatesVariableName(msg *Message, defIdx int) []*ValueCandidate {\n\tif msg.Rule == nil {\n\t\treturn nil\n\t}\n\tif len(msg.Rule.DefSet.Definitions()) <= defIdx {\n\t\treturn nil\n\t}\n\n\tvar ret []*ValueCandidate\n\tfor i := 0; i < defIdx+1; i++ {\n\t\tdef := msg.Rule.DefSet.Definitions()[defIdx]\n\t\tname := def.Name\n\t\tif name == \"\" || strings.HasPrefix(name, \"_\") {\n\t\t\tcontinue\n\t\t}\n\t\tif def.Expr == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, &ValueCandidate{\n\t\t\tName: name,\n\t\t\tType: def.Expr.Type,\n\t\t})\n\t}\n\treturn ret\n}\n\nfunc (r *Resolver) candidatesMessageArguments(msg *Message) []*ValueCandidate {\n\tif msg.Rule == nil {\n\t\treturn nil\n\t}\n\tif msg.Rule.MessageArgument == nil {\n\t\treturn nil\n\t}\n\targ := msg.Rule.MessageArgument\n\tnames := make(ValueCandidates, 0, len(arg.Fields))\n\tfor _, field := range arg.Fields {\n\t\tnames = append(names, &ValueCandidate{\n\t\t\tName: fmt.Sprintf(\"$.%s\", field.Name),\n\t\t\tType: field.Type,\n\t\t})\n\t}\n\treturn names\n}\n"
  },
  {
    "path": "resolver/candidates_test.go",
    "content": "package resolver\n\nimport (\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"google.golang.org/protobuf/proto\"\n\t\"google.golang.org/protobuf/types/descriptorpb\"\n\n\t\"github.com/mercari/grpc-federation/source\"\n)\n\nfunc TestCandidates(t *testing.T) {\n\tt.Parallel()\n\tfooMethod := &Method{\n\t\tName: \"Call\",\n\t\tRequest: &Message{\n\t\t\tFields: []*Field{\n\t\t\t\t{Name: \"foo_req_param\", Type: Int64Type},\n\t\t\t},\n\t\t},\n\t\tResponse: &Message{\n\t\t\tFields: []*Field{\n\t\t\t\t{Name: \"foo_res_param\", Type: StringType},\n\t\t\t},\n\t\t},\n\t}\n\tbarMethod := &Method{\n\t\tName: \"Call\",\n\t\tRequest: &Message{\n\t\t\tFields: []*Field{\n\t\t\t\t{Name: \"bar_req_param\", Type: Int64Type},\n\t\t\t},\n\t\t},\n\t\tResponse: &Message{\n\t\t\tFields: []*Field{\n\t\t\t\t{Name: \"bar_res_param\", Type: StringType},\n\t\t\t},\n\t\t},\n\t}\n\tmsgY := &Message{\n\t\tFile: &File{Name: \"foo.proto\", Package: &Package{Name: \"foo\"}},\n\t\tName: \"y\",\n\t\tRule: &MessageRule{\n\t\t\tMessageArgument: &Message{\n\t\t\t\tFields: []*Field{\n\t\t\t\t\t{Name: \"y_arg0\", Type: StringType},\n\t\t\t\t\t{Name: \"y_arg1\", Type: Int64Type},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\tr := &Resolver{\n\t\tfiles: []*descriptorpb.FileDescriptorProto{\n\t\t\t{\n\t\t\t\tName:    proto.String(\"another/foo.proto\"),\n\t\t\t\tPackage: proto.String(\"anotherfoo\"),\n\t\t\t},\n\t\t\t{\n\t\t\t\tName:    proto.String(\"foo.proto\"),\n\t\t\t\tPackage: proto.String(\"foo\"),\n\t\t\t},\n\t\t},\n\t\tcachedMessageMap: map[string]*Message{\n\t\t\t\"foo.x\": {\n\t\t\t\tFile: &File{Name: \"foo.proto\", Package: &Package{Name: \"foo\"}},\n\t\t\t\tName: \"x\",\n\t\t\t\tFields: []*Field{\n\t\t\t\t\t{Name: \"field_a\", Type: StringType},\n\t\t\t\t},\n\t\t\t\tRule: &MessageRule{\n\t\t\t\t\tMessageArgument: &Message{\n\t\t\t\t\t\tFields: []*Field{\n\t\t\t\t\t\t\t{Name: \"x_arg0\", Type: StringType},\n\t\t\t\t\t\t\t{Name: \"x_arg1\", Type: Int64Type},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tDefSet: &VariableDefinitionSet{\n\t\t\t\t\t\tDefs: []*VariableDefinition{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tExpr: &VariableExpr{\n\t\t\t\t\t\t\t\t\tCall: &CallExpr{\n\t\t\t\t\t\t\t\t\t\tMethod: barMethod,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName: \"y\",\n\t\t\t\t\t\t\t\tExpr: &VariableExpr{\n\t\t\t\t\t\t\t\t\tMessage: &MessageExpr{\n\t\t\t\t\t\t\t\t\t\tMessage: msgY,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"foo.y\": msgY,\n\t\t\t\"foo.z\": {\n\t\t\t\tFile: &File{Name: \"foo.proto\", Package: &Package{Name: \"foo\"}},\n\t\t\t\tName: \"z\",\n\t\t\t},\n\t\t},\n\t\tcachedMethodMap: map[string]*Method{\n\t\t\t\"foo.FooExample/Call\": fooMethod,\n\t\t\t\"bar.BarExample/Call\": barMethod,\n\t\t},\n\t}\n\ttests := []struct {\n\t\tname     string\n\t\tlocation *source.Location\n\t\texpected []string\n\t}{\n\t\t{\n\t\t\tname: \"message_option\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"foo.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName:   \"x\",\n\t\t\t\t\tOption: &source.MessageOption{},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: []string{\"def\", \"custom_resolver\", \"alias\"},\n\t\t},\n\t\t{\n\t\t\tname: \"def.call\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"foo.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"x\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tCall: &source.CallExprOption{},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: []string{\"method\", \"request\", \"timeout\", \"retry\"},\n\t\t},\n\t\t{\n\t\t\tname: \"def.call.method\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"foo.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"x\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tCall: &source.CallExprOption{\n\t\t\t\t\t\t\t\tMethod: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: []string{\"bar.BarExample/Call\"},\n\t\t},\n\t\t{\n\t\t\tname: \"def.call.request\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"foo.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"x\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tCall: &source.CallExprOption{\n\t\t\t\t\t\t\t\tRequest: &source.RequestOption{},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: []string{\"field\", \"by\"},\n\t\t},\n\t\t{\n\t\t\tname: \"def.call.request.field\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"foo.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"x\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tCall: &source.CallExprOption{\n\t\t\t\t\t\t\t\tRequest: &source.RequestOption{\n\t\t\t\t\t\t\t\t\tField: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: []string{\"bar_req_param\"},\n\t\t},\n\t\t{\n\t\t\tname: \"def.call.request.by\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"foo.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"x\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tCall: &source.CallExprOption{\n\t\t\t\t\t\t\t\tRequest: &source.RequestOption{\n\t\t\t\t\t\t\t\t\tBy: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: []string{\"$.x_arg1\"},\n\t\t},\n\t\t{\n\t\t\tname: \"def.message\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"foo.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"x\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tMessage: &source.MessageExprOption{},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: []string{\"name\", \"args\"},\n\t\t},\n\t\t{\n\t\t\tname: \"def.message.name\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"foo.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"x\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tMessage: &source.MessageExprOption{\n\t\t\t\t\t\t\t\tName: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: []string{\"y\", \"z\"},\n\t\t},\n\t\t{\n\t\t\tname: \"def.message.args\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"foo.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"x\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tMessage: &source.MessageExprOption{\n\t\t\t\t\t\t\t\tArgs: &source.ArgumentOption{},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: []string{\"name\", \"by\", \"inline\"},\n\t\t},\n\t\t{\n\t\t\tname: \"def.message.args.name\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"foo.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"x\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tMessage: &source.MessageExprOption{\n\t\t\t\t\t\t\t\tArgs: &source.ArgumentOption{Name: true},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: []string{},\n\t\t},\n\t\t{\n\t\t\tname: \"def.message.args.by\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"foo.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"x\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tMessage: &source.MessageExprOption{\n\t\t\t\t\t\t\t\tArgs: &source.ArgumentOption{By: true},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: []string{\"$.x_arg0\", \"$.x_arg1\"},\n\t\t},\n\t\t{\n\t\t\tname: \"field\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"foo.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"x\",\n\t\t\t\t\tField: &source.Field{\n\t\t\t\t\t\tName:   \"field_a\",\n\t\t\t\t\t\tOption: &source.FieldOption{By: true},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: []string{\"y\", \"$.x_arg0\"},\n\t\t},\n\t}\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tgot := r.Candidates(test.location)\n\t\t\tif diff := cmp.Diff(test.expected, got); diff != \"\" {\n\t\t\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "resolver/cel.go",
    "content": "package resolver\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/google/cel-go/cel\"\n\tceltypes \"github.com/google/cel-go/common/types\"\n\t\"github.com/google/cel-go/common/types/ref\"\n\t\"google.golang.org/protobuf/reflect/protodesc\"\n\t\"google.golang.org/protobuf/reflect/protoregistry\"\n\t\"google.golang.org/protobuf/types/descriptorpb\"\n\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"github.com/mercari/grpc-federation/types\"\n)\n\ntype CELRegistry struct {\n\t*celtypes.Registry\n\tregistryFiles     *protoregistry.Files\n\tregisteredFileMap map[string]struct{}\n\tmessageMap        map[string]*Message\n\tenumTypeMap       map[*celtypes.Type]*Enum\n\tenumValueMap      map[string]*EnumValue\n\tusedEnumValueMap  map[*EnumValue]struct{}\n\terrs              []error\n}\n\nfunc (r *CELRegistry) clear() {\n\tr.errs = r.errs[:0]\n\tr.usedEnumValueMap = make(map[*EnumValue]struct{})\n}\n\nfunc (r *CELRegistry) errors() []error {\n\treturn r.errs\n}\n\nfunc (r *CELRegistry) EnumValue(enumName string) ref.Val {\n\tvalue := r.Registry.EnumValue(enumName)\n\tif !celtypes.IsError(value) {\n\t\tenumValue, exists := r.enumValueMap[enumName]\n\t\tif exists {\n\t\t\tr.usedEnumValueMap[enumValue] = struct{}{}\n\t\t}\n\t\treturn value\n\t}\n\treturn value\n}\n\nfunc (r *CELRegistry) FindStructFieldType(structType, fieldName string) (*celtypes.FieldType, bool) {\n\tfieldType, found := r.Registry.FindStructFieldType(structType, fieldName)\n\tif msg := r.messageMap[structType]; msg != nil {\n\t\tif field := msg.Field(fieldName); field != nil {\n\t\t\tif field.Type.Kind == types.Enum {\n\t\t\t\t// HACK: cel-go currently does not support enum types, so it will always be an int type.\n\t\t\t\t// Therefore, in case of enum type, copy the *Type of int type, and then map the created *Type to the enum type.\n\t\t\t\t// Finally, at `fromCELType` phase, lookup enum type from *Type address.\n\t\t\t\tcopiedType := *fieldType.Type\n\t\t\t\tfieldType.Type = &copiedType\n\t\t\t\tr.enumTypeMap[fieldType.Type] = field.Type.Enum\n\t\t\t}\n\t\t}\n\t\toneof := msg.Oneof(fieldName)\n\t\tif !found && oneof != nil {\n\t\t\tif !oneof.IsSameType() {\n\t\t\t\tr.errs = append(r.errs, fmt.Errorf(\n\t\t\t\t\t`\"%[1]s\" type has \"%[2]s\" as oneof name, but \"%[2]s\" has a difference type and cannot be accessed directly, so \"%[2]s\" becomes an undefined field`,\n\t\t\t\t\tstructType, fieldName,\n\t\t\t\t))\n\t\t\t\treturn fieldType, found\n\t\t\t}\n\t\t\t// If we refer directly to the name of oneof and all fields in oneof have the same type,\n\t\t\t// we can refer to the value of a field that is not nil.\n\t\t\treturn &celtypes.FieldType{\n\t\t\t\tType: ToCELType(oneof.Fields[0].Type),\n\t\t\t}, true\n\t\t}\n\t}\n\treturn fieldType, found\n}\n\nfunc (r *CELRegistry) LookupEnum(t *celtypes.Type) (*Enum, bool) {\n\tenum, found := r.enumTypeMap[t]\n\treturn enum, found\n}\n\nfunc ToCELType(typ *Type) *cel.Type {\n\treturn toCELType(typ)\n}\n\nfunc toCELType(typ *Type) *cel.Type {\n\tif typ.Repeated {\n\t\tt := typ.Clone()\n\t\tt.Repeated = false\n\t\treturn cel.ListType(toCELType(t))\n\t}\n\tswitch typ.Kind {\n\tcase types.Double, types.Float:\n\t\treturn cel.DoubleType\n\tcase types.Int32, types.Int64, types.Sfixed32, types.Sfixed64, types.Sint32, types.Sint64:\n\t\treturn cel.IntType\n\tcase types.Uint32, types.Uint64, types.Fixed32, types.Fixed64:\n\t\treturn cel.UintType\n\tcase types.Bool:\n\t\treturn cel.BoolType\n\tcase types.String:\n\t\treturn cel.StringType\n\tcase types.Group, types.Message:\n\t\tif typ.Message == nil {\n\t\t\treturn cel.NullType\n\t\t}\n\t\tif typ.Message.IsMapEntry {\n\t\t\treturn cel.MapType(toCELType(typ.Message.Fields[0].Type), toCELType(typ.Message.Fields[1].Type))\n\t\t}\n\t\tif typ.Message.IsEnumSelector() {\n\t\t\treturn toEnumSelectorCELType(typ.Message)\n\t\t}\n\t\treturn cel.ObjectType(typ.Message.FQDN())\n\tcase types.Bytes:\n\t\treturn cel.BytesType\n\tcase types.Enum:\n\t\treturn celtypes.NewOpaqueType(typ.Enum.FQDN(), cel.IntType)\n\t}\n\treturn cel.NullType\n}\n\nfunc toEnumSelectorCELType(sel *Message) *cel.Type {\n\ttrueType := toCELType(sel.Fields[0].Type)\n\tfalseType := toCELType(sel.Fields[1].Type)\n\treturn celtypes.NewOpaqueType(grpcfedcel.EnumSelectorFQDN, trueType, falseType)\n}\n\nfunc newCELRegistry(messageMap map[string]*Message, enumValueMap map[string]*EnumValue) *CELRegistry {\n\treturn &CELRegistry{\n\t\tRegistry:          celtypes.NewEmptyRegistry(),\n\t\tregistryFiles:     new(protoregistry.Files),\n\t\tregisteredFileMap: make(map[string]struct{}),\n\t\tmessageMap:        messageMap,\n\t\tenumTypeMap:       make(map[*celtypes.Type]*Enum),\n\t\tenumValueMap:      enumValueMap,\n\t\tusedEnumValueMap:  make(map[*EnumValue]struct{}),\n\t}\n}\n\nfunc (r *CELRegistry) RegisterFiles(fds ...*descriptorpb.FileDescriptorProto) error {\n\tfileMap := make(map[string]*descriptorpb.FileDescriptorProto)\n\tfor _, fd := range fds {\n\t\tfileName := fd.GetName()\n\t\tif _, ok := fileMap[fileName]; ok {\n\t\t\treturn fmt.Errorf(\"file appears multiple times: %q\", fileName)\n\t\t}\n\t\tfileMap[fileName] = fd\n\t}\n\tfor _, fd := range fileMap {\n\t\tif err := r.registerFileDeps(fd, fileMap); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (r *CELRegistry) registerFileDeps(fd *descriptorpb.FileDescriptorProto, fileMap map[string]*descriptorpb.FileDescriptorProto) error {\n\t// set the entry to nil while descending into a file's dependencies to detect cycles.\n\tfileName := fd.GetName()\n\tfileMap[fileName] = nil\n\tfor _, dep := range fd.GetDependency() {\n\t\tdepFD, ok := fileMap[dep]\n\t\tif depFD == nil {\n\t\t\tif ok {\n\t\t\t\treturn fmt.Errorf(\"import cycle in file: %q\", dep)\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tif err := r.registerFileDeps(depFD, fileMap); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\t// delete the entry once dependencies are processed.\n\tdelete(fileMap, fileName)\n\tif _, exists := r.registeredFileMap[fileName]; exists {\n\t\treturn nil\n\t}\n\n\tf, err := protodesc.NewFile(fd, r.registryFiles)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := r.registryFiles.RegisterFile(f); err != nil {\n\t\treturn err\n\t}\n\tif err := r.Registry.RegisterDescriptor(f); err != nil {\n\t\treturn err\n\t}\n\tr.registeredFileMap[fileName] = struct{}{}\n\treturn nil\n}\n\nvar (\n\tcachedStandardMessageType   = make(map[string]*Type)\n\tcachedStandardMessageTypeMu sync.Mutex\n)\n\nfunc NewCELStandardLibraryMessageType(pkgName, msgName string) *Type {\n\tcachedStandardMessageTypeMu.Lock()\n\tdefer cachedStandardMessageTypeMu.Unlock()\n\tfqdn := fmt.Sprintf(\"%s.%s\", pkgName, msgName)\n\tif typ, exists := cachedStandardMessageType[fqdn]; exists {\n\t\treturn typ\n\t}\n\tret := &Type{\n\t\tKind: types.Message,\n\t\tMessage: &Message{\n\t\t\tFile: &File{\n\t\t\t\tPackage: &Package{\n\t\t\t\t\tName: \"grpc.federation.\" + pkgName,\n\t\t\t\t},\n\t\t\t\tGoPackage: &GoPackage{\n\t\t\t\t\tName:       \"grpcfedcel\",\n\t\t\t\t\tImportPath: \"github.com/mercari/grpc-federation/grpc/federation/cel\",\n\t\t\t\t\tAliasName:  \"grpcfedcel\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tName: msgName,\n\t\t},\n\t}\n\tcachedStandardMessageType[fqdn] = ret\n\treturn ret\n}\n\nfunc (plugin *CELPlugin) LibraryName() string {\n\treturn plugin.Name\n}\n\ntype CELPluginFunctionSignature struct {\n\tID     string\n\tArgs   []*cel.Type\n\tReturn *cel.Type\n}\n\n// Signatures returns signature for overload function.\n// If there is an enum type, we need to prepare functions for both `opaque<int>` and `int` patterns.\nfunc (f *CELFunction) Signatures() []*CELPluginFunctionSignature {\n\tsigs := f.signatures(f.Args, f.Return)\n\tsigMap := make(map[string]struct{})\n\tret := make([]*CELPluginFunctionSignature, 0, len(sigs))\n\tfor _, sig := range sigs {\n\t\tif _, exists := sigMap[sig.ID]; exists {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, sig)\n\t\tsigMap[sig.ID] = struct{}{}\n\t}\n\treturn ret\n}\n\nfunc (f *CELFunction) signatures(args []*Type, ret *Type) []*CELPluginFunctionSignature {\n\tvar sigs []*CELPluginFunctionSignature\n\tfor idx, arg := range args {\n\t\tif arg.Kind == types.Enum {\n\t\t\tsigs = append(sigs,\n\t\t\t\tf.signatures(\n\t\t\t\t\tappend(append(append([]*Type{}, args[:idx]...), Int32Type), args[idx+1:]...),\n\t\t\t\t\tret,\n\t\t\t\t)...,\n\t\t\t)\n\t\t}\n\t}\n\tif ret.Kind == types.Enum {\n\t\tsigs = append(sigs, f.signatures(args, Int32Type)...)\n\t}\n\tvar celArgs []*cel.Type\n\tfor _, arg := range args {\n\t\tcelArgs = append(celArgs, ToCELType(arg))\n\t}\n\tsigs = append(sigs, &CELPluginFunctionSignature{\n\t\tID:     f.toSignatureID(append(args, ret)),\n\t\tArgs:   celArgs,\n\t\tReturn: ToCELType(ret),\n\t})\n\treturn sigs\n}\n\nfunc (f *CELFunction) toSignatureID(t []*Type) string {\n\tvar typeNames []string\n\tfor _, tt := range t {\n\t\tif tt == nil {\n\t\t\tcontinue\n\t\t}\n\t\ttypeNames = append(typeNames, tt.FQDN())\n\t}\n\treturn strings.ReplaceAll(strings.Join(append([]string{f.ID}, typeNames...), \"_\"), \".\", \"_\")\n}\n\nfunc (plugin *CELPlugin) CompileOptions() []cel.EnvOption {\n\tvar opts []cel.EnvOption\n\tbindFunc := cel.FunctionBinding(func(args ...ref.Val) ref.Val { return nil })\n\n\tfor _, fn := range plugin.Functions {\n\t\tif fn.Receiver != nil {\n\t\t\t// For member functions, sig.Args already includes receiver as first element\n\t\t\t// We need to insert context AFTER receiver: [receiver, context, arg1, arg2, ...]\n\t\t\tvar memberOpts []grpcfedcel.BindMemberFunctionOpt\n\t\t\tfor _, sig := range fn.Signatures() {\n\t\t\t\tif len(sig.Args) == 0 {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\targsWithContext := append([]*cel.Type{sig.Args[0], cel.ObjectType(grpcfedcel.ContextTypeName)}, sig.Args[1:]...)\n\t\t\t\tmemberOpts = append(memberOpts, grpcfedcel.BindMemberFunctionOpt{\n\t\t\t\t\tFunctionOpt: cel.MemberOverload(sig.ID, argsWithContext, sig.Return, bindFunc),\n\t\t\t\t})\n\t\t\t}\n\t\t\topts = append(opts, grpcfedcel.BindMemberFunction(fn.Name, memberOpts...)...)\n\t\t} else {\n\t\t\t// For regular functions, insert context at the beginning\n\t\t\tvar funcOpts []grpcfedcel.BindFunctionOpt\n\t\t\tfor _, sig := range fn.Signatures() {\n\t\t\t\t// Regular function signature: [context, arg1, arg2, ...]\n\t\t\t\targsWithContext := append([]*cel.Type{cel.ObjectType(grpcfedcel.ContextTypeName)}, sig.Args...)\n\t\t\t\tfuncOpts = append(funcOpts, grpcfedcel.BindFunctionOpt{\n\t\t\t\t\tFunctionOpt: cel.Overload(sig.ID, argsWithContext, sig.Return, bindFunc),\n\t\t\t\t})\n\t\t\t}\n\t\t\topts = append(opts, grpcfedcel.BindFunction(fn.Name, funcOpts...)...)\n\t\t}\n\t}\n\treturn opts\n}\n\nfunc (plugin *CELPlugin) ProgramOptions() []cel.ProgramOption {\n\treturn []cel.ProgramOption{}\n}\n"
  },
  {
    "path": "resolver/cel_test.go",
    "content": "package resolver_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/google/cel-go/cel\"\n\tceltypes \"github.com/google/cel-go/common/types\"\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/google/go-cmp/cmp/cmpopts\"\n\n\t\"github.com/mercari/grpc-federation/resolver\"\n\t\"github.com/mercari/grpc-federation/types\"\n)\n\nfunc TestCELFunction(t *testing.T) {\n\tenumType := &resolver.Type{\n\t\tKind: types.Enum,\n\t\tEnum: &resolver.Enum{\n\t\t\tFile: &resolver.File{},\n\t\t\tName: \"EnumType\",\n\t\t},\n\t}\n\tcelEnumType := celtypes.NewOpaqueType(enumType.Enum.FQDN(), cel.IntType)\n\tfn := resolver.CELFunction{\n\t\tName:   \"test\",\n\t\tID:     \"test\",\n\t\tArgs:   []*resolver.Type{enumType, enumType},\n\t\tReturn: enumType,\n\t}\n\tif diff := cmp.Diff(fn.Signatures(), []*resolver.CELPluginFunctionSignature{\n\t\t{\n\t\t\tID:     \"test_int32_int32_int32\",\n\t\t\tArgs:   []*cel.Type{cel.IntType, cel.IntType},\n\t\t\tReturn: cel.IntType,\n\t\t},\n\t\t{\n\t\t\tID:     \"test_int32_int32__EnumType\",\n\t\t\tArgs:   []*cel.Type{cel.IntType, cel.IntType},\n\t\t\tReturn: celEnumType,\n\t\t},\n\t\t{\n\t\t\tID:     \"test_int32__EnumType_int32\",\n\t\t\tArgs:   []*cel.Type{cel.IntType, celEnumType},\n\t\t\tReturn: cel.IntType,\n\t\t},\n\t\t{\n\t\t\tID:     \"test_int32__EnumType__EnumType\",\n\t\t\tArgs:   []*cel.Type{cel.IntType, celEnumType},\n\t\t\tReturn: celEnumType,\n\t\t},\n\t\t{\n\t\t\tID:     \"test__EnumType_int32_int32\",\n\t\t\tArgs:   []*cel.Type{celEnumType, cel.IntType},\n\t\t\tReturn: cel.IntType,\n\t\t},\n\t\t{\n\t\t\tID:     \"test__EnumType_int32__EnumType\",\n\t\t\tArgs:   []*cel.Type{celEnumType, cel.IntType},\n\t\t\tReturn: celEnumType,\n\t\t},\n\t\t{\n\t\t\tID:     \"test__EnumType__EnumType_int32\",\n\t\t\tArgs:   []*cel.Type{celEnumType, celEnumType},\n\t\t\tReturn: cel.IntType,\n\t\t},\n\t\t{\n\t\t\tID:     \"test__EnumType__EnumType__EnumType\",\n\t\t\tArgs:   []*cel.Type{celEnumType, celEnumType},\n\t\t\tReturn: celEnumType,\n\t\t},\n\t}, cmpopts.IgnoreUnexported(cel.Type{})); diff != \"\" {\n\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t}\n}\n"
  },
  {
    "path": "resolver/context.go",
    "content": "package resolver\n\nimport (\n\t\"maps\"\n)\n\ntype context struct {\n\terrorBuilder *errorBuilder\n\tallWarnings  *allWarnings\n\tfileRef      *File\n\tmsg          *Message\n\tenum         *Enum\n\tplugin       *CELPlugin\n\tdefIdx       int\n\terrDetailIdx int\n\tvariableMap  map[string]*VariableDefinition\n}\n\ntype allWarnings struct {\n\twarnings []*Warning\n}\n\nfunc newContext() *context {\n\treturn &context{\n\t\terrorBuilder: &errorBuilder{},\n\t\tallWarnings:  &allWarnings{},\n\t\tvariableMap:  make(map[string]*VariableDefinition),\n\t}\n}\n\nfunc (c *context) clone() *context {\n\treturn &context{\n\t\terrorBuilder: c.errorBuilder,\n\t\tallWarnings:  c.allWarnings,\n\t\tfileRef:      c.fileRef,\n\t\tmsg:          c.msg,\n\t\tenum:         c.enum,\n\t\tplugin:       c.plugin,\n\t\tdefIdx:       c.defIdx,\n\n\t\terrDetailIdx: c.errDetailIdx,\n\t\tvariableMap:  c.variableMap,\n\t}\n}\n\nfunc (c *context) withVariableMap() *context {\n\tctx := c.clone()\n\tvariableMap := make(map[string]*VariableDefinition)\n\tmaps.Copy(variableMap, c.variableMap)\n\tctx.variableMap = variableMap\n\treturn ctx\n}\n\nfunc (c *context) withFile(file *File) *context {\n\tctx := c.clone()\n\tctx.fileRef = file\n\treturn ctx\n}\n\nfunc (c *context) withMessage(msg *Message) *context {\n\tctx := c.clone()\n\tctx.msg = msg\n\treturn ctx\n}\n\nfunc (c *context) withEnum(enum *Enum) *context {\n\tctx := c.clone()\n\tctx.enum = enum\n\treturn ctx\n}\n\nfunc (c *context) withDefIndex(idx int) *context {\n\tctx := c.clone()\n\tctx.defIdx = idx\n\treturn ctx\n}\n\nfunc (c *context) withPlugin(plugin *CELPlugin) *context {\n\tctx := c.clone()\n\tctx.plugin = plugin\n\treturn ctx\n}\n\nfunc (c *context) withErrDetailIndex(idx int) *context {\n\tctx := c.clone()\n\tctx.errDetailIdx = idx\n\treturn ctx\n}\n\nfunc (c *context) addVariableDefinition(def *VariableDefinition) {\n\tc.variableMap[def.Name] = def\n}\n\nfunc (c *context) variableDef(name string) *VariableDefinition {\n\treturn c.variableMap[name]\n}\n\nfunc (c *context) file() *File {\n\treturn c.fileRef\n}\n\nfunc (c *context) fileName() string {\n\tif c.fileRef == nil {\n\t\treturn \"\"\n\t}\n\treturn c.fileRef.Name\n}\n\nfunc (c *context) messageName() string {\n\tif c.msg == nil {\n\t\treturn \"\"\n\t}\n\treturn c.msg.Name\n}\n\nfunc (c *context) enumName() string {\n\tif c.enum == nil {\n\t\treturn \"\"\n\t}\n\treturn c.enum.Name\n}\n\nfunc (c *context) defIndex() int {\n\treturn c.defIdx\n}\n\nfunc (c *context) errDetailIndex() int {\n\treturn c.errDetailIdx\n}\n\nfunc (c *context) addError(e *LocationError) {\n\tc.errorBuilder.add(e)\n}\n\nfunc (c *context) error() error {\n\treturn c.errorBuilder.build()\n}\n\nfunc (c *context) addWarning(w *Warning) {\n\tc.allWarnings.warnings = append(c.allWarnings.warnings, w)\n}\n\nfunc (c *context) warnings() []*Warning {\n\treturn c.allWarnings.warnings\n}\n"
  },
  {
    "path": "resolver/def.go",
    "content": "package resolver\n\nimport (\n\t\"sort\"\n)\n\nfunc (set *VariableDefinitionSet) Definitions() VariableDefinitions {\n\tif set == nil {\n\t\treturn nil\n\t}\n\treturn set.Defs\n}\n\nfunc (set *VariableDefinitionSet) DefinitionGroups() []VariableDefinitionGroup {\n\tif set == nil {\n\t\treturn nil\n\t}\n\treturn set.Groups\n}\n\nfunc (set *VariableDefinitionSet) DependencyGraph() *MessageDependencyGraph {\n\tif set == nil {\n\t\treturn nil\n\t}\n\treturn set.Graph\n}\n\nfunc (e *GRPCError) Definitions() VariableDefinitions {\n\tvar ret VariableDefinitions\n\tif e.DefSet != nil {\n\t\tret = append(ret, e.DefSet.Definitions()...)\n\t}\n\tfor _, detail := range e.Details {\n\t\tret = append(ret, detail.DefSet.Definitions()...)\n\t\tret = append(ret, detail.Messages.Definitions()...)\n\t}\n\treturn ret\n}\n\nfunc (e *GRPCError) DefinitionGroups() []VariableDefinitionGroup {\n\tvar ret []VariableDefinitionGroup\n\tif e.DefSet != nil {\n\t\tret = append(ret, e.DefSet.DefinitionGroups()...)\n\t}\n\tfor _, detail := range e.Details {\n\t\tret = append(ret, detail.DefSet.DefinitionGroups()...)\n\t\tret = append(ret, detail.Messages.DefinitionGroups()...)\n\t}\n\treturn ret\n}\n\nfunc (e *SwitchExpr) Definitions() VariableDefinitions {\n\tvar defs VariableDefinitions\n\tfor _, cse := range e.Cases {\n\t\tdefs = append(defs, cse.DefSet.Definitions()...)\n\t}\n\tdefs = append(defs, e.Default.DefSet.Definitions()...)\n\treturn defs\n}\n\nfunc (e *SwitchExpr) DefinitionGroups() []VariableDefinitionGroup {\n\tvar groups []VariableDefinitionGroup\n\tfor _, cse := range e.Cases {\n\t\tgroups = append(groups, cse.DefSet.DefinitionGroups()...)\n\t}\n\tgroups = append(groups, e.Default.DefSet.DefinitionGroups()...)\n\treturn groups\n}\n\nfunc (g *SequentialVariableDefinitionGroup) VariableDefinitions() VariableDefinitions {\n\tvar defs VariableDefinitions\n\tif g.Start != nil {\n\t\tdefs = append(defs, g.Start.VariableDefinitions()...)\n\t}\n\tdefs = append(defs, g.End)\n\treturn defs\n}\n\nfunc (g *ConcurrentVariableDefinitionGroup) VariableDefinitions() VariableDefinitions {\n\tvar defs VariableDefinitions\n\tfor _, start := range g.Starts {\n\t\tdefs = append(defs, start.VariableDefinitions()...)\n\t}\n\tdefs = append(defs, g.End)\n\treturn defs\n}\n\nfunc (set *VariableDefinitionSet) MessageToDefsMap() map[*Message]VariableDefinitions {\n\tret := make(map[*Message]VariableDefinitions)\n\tfor _, varDef := range set.Definitions() {\n\t\tfor k, v := range varDef.MessageToDefsMap() {\n\t\t\tret[k] = append(ret[k], v...)\n\t\t}\n\t}\n\treturn ret\n}\n\nfunc (def *VariableDefinition) MessageToDefsMap() map[*Message]VariableDefinitions {\n\tif def.Expr == nil {\n\t\treturn nil\n\t}\n\texpr := def.Expr\n\tswitch {\n\tcase expr.Message != nil:\n\t\tmsgExpr := expr.Message\n\t\tif msgExpr.Message == nil {\n\t\t\treturn nil\n\t\t}\n\t\treturn map[*Message]VariableDefinitions{msgExpr.Message: {def}}\n\tcase expr.Map != nil:\n\t\tmapExpr := expr.Map\n\t\tif mapExpr.Expr == nil {\n\t\t\treturn nil\n\t\t}\n\t\tif mapExpr.Expr.Message == nil {\n\t\t\treturn nil\n\t\t}\n\t\tmsgExpr := mapExpr.Expr.Message\n\t\treturn map[*Message]VariableDefinitions{msgExpr.Message: {def}}\n\tcase expr.Call != nil:\n\t\treturn expr.Call.MessageToDefsMap()\n\tcase expr.Switch != nil:\n\t\treturn expr.Switch.MessageToDefsMap()\n\tcase expr.Validation != nil:\n\t\treturn expr.Validation.MessageToDefsMap()\n\t}\n\treturn nil\n}\n\nfunc (e *CallExpr) MessageToDefsMap() map[*Message]VariableDefinitions {\n\tret := make(map[*Message]VariableDefinitions)\n\tfor _, grpcErr := range e.Errors {\n\t\tfor k, v := range grpcErr.MessageToDefsMap() {\n\t\t\tret[k] = append(ret[k], v...)\n\t\t}\n\t}\n\treturn ret\n}\n\nfunc (e *SwitchExpr) MessageToDefsMap() map[*Message]VariableDefinitions {\n\tret := e.Default.DefSet.MessageToDefsMap()\n\tfor _, cse := range e.Cases {\n\t\tfor k, v := range cse.DefSet.MessageToDefsMap() {\n\t\t\tret[k] = append(ret[k], v...)\n\t\t}\n\t}\n\treturn ret\n}\n\nfunc (e *ValidationExpr) MessageToDefsMap() map[*Message]VariableDefinitions {\n\treturn e.Error.MessageToDefsMap()\n}\n\nfunc (e *GRPCError) MessageToDefsMap() map[*Message]VariableDefinitions {\n\tret := e.DefSet.MessageToDefsMap()\n\tfor _, detail := range e.Details {\n\t\tfor k, v := range detail.MessageToDefsMap() {\n\t\t\tret[k] = append(ret[k], v...)\n\t\t}\n\t}\n\treturn ret\n}\n\nfunc (detail *GRPCErrorDetail) MessageToDefsMap() map[*Message]VariableDefinitions {\n\tret := detail.DefSet.MessageToDefsMap()\n\tfor k, v := range detail.Messages.MessageToDefsMap() {\n\t\tret[k] = append(ret[k], v...)\n\t}\n\treturn ret\n}\n\nfunc (set *VariableDefinitionSet) MessageExprs() []*MessageExpr {\n\tvar ret []*MessageExpr\n\tfor _, varDef := range set.Definitions() {\n\t\tret = append(ret, varDef.MessageExprs()...)\n\t}\n\treturn ret\n}\n\nfunc (def *VariableDefinition) IsValidation() bool {\n\tif def.Expr == nil {\n\t\treturn false\n\t}\n\treturn def.Expr.Validation != nil\n}\n\nfunc (def *VariableDefinition) MessageExprs() []*MessageExpr {\n\tif def.Expr == nil {\n\t\treturn nil\n\t}\n\texpr := def.Expr\n\tswitch {\n\tcase expr.Call != nil:\n\t\treturn expr.Call.MessageExprs()\n\tcase expr.Map != nil:\n\t\treturn expr.Map.MessageExprs()\n\tcase expr.Message != nil:\n\t\treturn []*MessageExpr{expr.Message}\n\tcase expr.Switch != nil:\n\t\treturn expr.Switch.MessageExprs()\n\tcase expr.Validation != nil:\n\t\treturn expr.Validation.MessageExprs()\n\t}\n\treturn nil\n}\n\nfunc (e *CallExpr) MessageExprs() []*MessageExpr {\n\tvar ret []*MessageExpr\n\tfor _, grpcErr := range e.Errors {\n\t\tret = append(ret, grpcErr.MessageExprs()...)\n\t}\n\treturn ret\n}\n\nfunc (e *MapExpr) MessageExprs() []*MessageExpr {\n\tif e.Expr == nil {\n\t\treturn nil\n\t}\n\tif e.Expr.Message == nil {\n\t\treturn nil\n\t}\n\treturn []*MessageExpr{e.Expr.Message}\n}\n\nfunc (e *SwitchExpr) MessageExprs() []*MessageExpr {\n\tvar ret []*MessageExpr\n\tfor _, cse := range e.Cases {\n\t\tret = append(ret, cse.DefSet.MessageExprs()...)\n\t}\n\tret = append(ret, e.Default.DefSet.MessageExprs()...)\n\treturn ret\n}\n\nfunc (e *ValidationExpr) MessageExprs() []*MessageExpr {\n\treturn e.Error.MessageExprs()\n}\n\nfunc (e *GRPCError) MessageExprs() []*MessageExpr {\n\tret := e.DefSet.MessageExprs()\n\tfor _, detail := range e.Details {\n\t\tret = append(ret, detail.MessageExprs()...)\n\t}\n\treturn ret\n}\n\nfunc (detail *GRPCErrorDetail) MessageExprs() []*MessageExpr {\n\treturn append(detail.DefSet.MessageExprs(), detail.Messages.MessageExprs()...)\n}\n\nfunc (set *VariableDefinitionSet) ReferenceNames() []string {\n\tvar names []string\n\tfor _, def := range set.Definitions() {\n\t\tnames = append(names, def.ReferenceNames()...)\n\t}\n\treturn toUniqueReferenceNames(names)\n}\n\nfunc (def *VariableDefinition) ReferenceNames() []string {\n\tvar names []string\n\tif def.If != nil {\n\t\tnames = append(names, def.If.ReferenceNames()...)\n\t}\n\tnames = append(names, def.Expr.ReferenceNames()...)\n\treturn toUniqueReferenceNames(names)\n}\n\nfunc (e *VariableExpr) ReferenceNames() []string {\n\tif e == nil {\n\t\treturn nil\n\t}\n\tswitch {\n\tcase e.By != nil:\n\t\treturn e.By.ReferenceNames()\n\tcase e.Map != nil:\n\t\treturn e.Map.ReferenceNames()\n\tcase e.Call != nil:\n\t\treturn e.Call.ReferenceNames()\n\tcase e.Message != nil:\n\t\treturn e.Message.ReferenceNames()\n\tcase e.Enum != nil:\n\t\treturn e.Enum.ReferenceNames()\n\tcase e.Validation != nil:\n\t\treturn e.Validation.Error.ReferenceNames()\n\tcase e.Switch != nil:\n\t\treturn e.Switch.ReferenceNames()\n\t}\n\treturn nil\n}\n\n// ReferenceNames returns all the unique reference names in the error definition.\nfunc (e *GRPCError) ReferenceNames() []string {\n\tnames := e.If.ReferenceNames()\n\tfor _, def := range e.DefSet.Definitions() {\n\t\tnames = append(names, def.ReferenceNames()...)\n\t}\n\tfor _, detail := range e.Details {\n\t\tnames = append(names, detail.ReferenceNames()...)\n\t}\n\treturn toUniqueReferenceNames(names)\n}\n\nfunc (detail *GRPCErrorDetail) ReferenceNames() []string {\n\tnames := detail.If.ReferenceNames()\n\tfor _, def := range detail.DefSet.Definitions() {\n\t\tnames = append(names, def.ReferenceNames()...)\n\t}\n\tfor _, def := range detail.Messages.Definitions() {\n\t\tnames = append(names, def.ReferenceNames()...)\n\t}\n\tfor _, by := range detail.By {\n\t\tnames = append(names, by.ReferenceNames()...)\n\t}\n\tfor _, failure := range detail.PreconditionFailures {\n\t\tfor _, violation := range failure.Violations {\n\t\t\tnames = append(names, violation.Type.ReferenceNames()...)\n\t\t\tnames = append(names, violation.Subject.ReferenceNames()...)\n\t\t\tnames = append(names, violation.Description.ReferenceNames()...)\n\t\t}\n\t}\n\tfor _, req := range detail.BadRequests {\n\t\tfor _, violation := range req.FieldViolations {\n\t\t\tnames = append(names, violation.Field.ReferenceNames()...)\n\t\t\tnames = append(names, violation.Description.ReferenceNames()...)\n\t\t}\n\t}\n\tfor _, msg := range detail.LocalizedMessages {\n\t\tnames = append(names, msg.Message.ReferenceNames()...)\n\t}\n\treturn toUniqueReferenceNames(names)\n}\n\nfunc (e *CallExpr) ReferenceNames() []string {\n\tif e == nil {\n\t\treturn nil\n\t}\n\tvar names []string\n\tfor _, arg := range e.Request.Args {\n\t\tnames = append(names, arg.Value.ReferenceNames()...)\n\t}\n\tfor _, grpcErr := range e.Errors {\n\t\tnames = append(names, grpcErr.ReferenceNames()...)\n\t}\n\tif e.Option != nil {\n\t\tif e.Option.Header != nil && e.Option.Header.Name != \"\" {\n\t\t\tnames = append(names, e.Option.Header.Name)\n\t\t}\n\t\tif e.Option.Trailer != nil && e.Option.Trailer.Name != \"\" {\n\t\t\tnames = append(names, e.Option.Trailer.Name)\n\t\t}\n\t}\n\tif e.Metadata != nil {\n\t\tnames = append(names, e.Metadata.ReferenceNames()...)\n\t}\n\treturn toUniqueReferenceNames(names)\n}\n\nfunc (e *MapExpr) ReferenceNames() []string {\n\tif e == nil {\n\t\treturn nil\n\t}\n\n\tvar names []string\n\tif e.Iterator != nil {\n\t\tif e.Iterator.Name != \"\" {\n\t\t\tnames = append(names, e.Iterator.Name)\n\t\t}\n\t\tif e.Iterator.Source != nil && e.Iterator.Source.Name != \"\" {\n\t\t\tnames = append(names, e.Iterator.Source.Name)\n\t\t}\n\t}\n\tnames = append(names, e.Expr.ReferenceNames()...)\n\treturn toUniqueReferenceNames(names)\n}\n\nfunc (e *MapIteratorExpr) ReferenceNames() []string {\n\tif e == nil {\n\t\treturn nil\n\t}\n\n\tvar names []string\n\tswitch {\n\tcase e.By != nil:\n\t\tnames = append(names, e.By.ReferenceNames()...)\n\tcase e.Message != nil:\n\t\tnames = append(names, e.Message.ReferenceNames()...)\n\t}\n\treturn toUniqueReferenceNames(names)\n}\n\nfunc (e *SwitchExpr) ReferenceNames() []string {\n\tif e == nil {\n\t\treturn nil\n\t}\n\tvar names []string\n\tfor _, cse := range e.Cases {\n\t\tnames = append(names, cse.DefSet.ReferenceNames()...)\n\t\tnames = append(names, cse.If.ReferenceNames()...)\n\t\tnames = append(names, cse.By.ReferenceNames()...)\n\t}\n\tnames = append(names, e.Default.DefSet.ReferenceNames()...)\n\tnames = append(names, e.Default.By.ReferenceNames()...)\n\treturn toUniqueReferenceNames(names)\n}\n\nfunc (set *VariableDefinitionSet) MarkUsed(nameRefMap map[string]struct{}) {\n\tfor _, varDef := range set.Definitions() {\n\t\tvarDef.MarkUsed(nameRefMap)\n\t}\n}\n\nfunc (def *VariableDefinition) MarkUsed(nameRefMap map[string]struct{}) {\n\tif _, exists := nameRefMap[def.Name]; exists {\n\t\tdef.Used = true\n\t}\n\tif def.Expr == nil {\n\t\treturn\n\t}\n\texpr := def.Expr\n\tswitch {\n\tcase expr.Call != nil:\n\t\texpr.Call.MarkUsed(nameRefMap)\n\tcase expr.Map != nil:\n\t\texpr.Map.MarkUsed(nameRefMap)\n\tcase expr.Switch != nil:\n\t\texpr.Switch.MarkUsed(nameRefMap)\n\tcase expr.Validation != nil:\n\t\texpr.Validation.MarkUsed(nameRefMap)\n\t}\n}\n\nfunc (e *CallExpr) MarkUsed(nameRefMap map[string]struct{}) {\n\tfor _, grpcErr := range e.Errors {\n\t\tgrpcErr.MarkUsed(nameRefMap)\n\t}\n}\n\nfunc (e *MapExpr) MarkUsed(_ map[string]struct{}) {}\n\nfunc (e *SwitchExpr) MarkUsed(nameRefMap map[string]struct{}) {\n\tfor _, cse := range e.Cases {\n\t\tcse.DefSet.MarkUsed(nameRefMap)\n\t}\n\te.Default.DefSet.MarkUsed(nameRefMap)\n}\n\nfunc (e *ValidationExpr) MarkUsed(nameRefMap map[string]struct{}) {\n\te.Error.MarkUsed(nameRefMap)\n}\n\nfunc (e *GRPCError) MarkUsed(nameRefMap map[string]struct{}) {\n\te.DefSet.MarkUsed(nameRefMap)\n\tfor _, detail := range e.Details {\n\t\tdetail.MarkUsed(nameRefMap)\n\t}\n}\n\nfunc (detail *GRPCErrorDetail) MarkUsed(nameRefMap map[string]struct{}) {\n\tdetail.DefSet.MarkUsed(nameRefMap)\n\tdetail.Messages.MarkUsed(nameRefMap)\n}\n\nfunc (e *MapIteratorExpr) ToVariableExpr() *VariableExpr {\n\treturn &VariableExpr{\n\t\tType:    e.Type,\n\t\tBy:      e.By,\n\t\tMessage: e.Message,\n\t}\n}\n\nfunc toUniqueReferenceNames(names []string) []string {\n\tnameMap := make(map[string]struct{})\n\tfor _, name := range names {\n\t\tnameMap[name] = struct{}{}\n\t}\n\tret := make([]string, 0, len(nameMap))\n\tfor name := range nameMap {\n\t\tret = append(ret, name)\n\t}\n\tsort.Strings(ret)\n\treturn ret\n}\n"
  },
  {
    "path": "resolver/enum.go",
    "content": "package resolver\n\nimport (\n\t\"strings\"\n\n\t\"github.com/mercari/grpc-federation/types\"\n)\n\nfunc NewEnumType(enum *Enum, repeated bool) *Type {\n\treturn &Type{\n\t\tKind:     types.Enum,\n\t\tEnum:     enum,\n\t\tRepeated: repeated,\n\t}\n}\n\nfunc (e *Enum) HasValue(name string) bool {\n\tif e == nil {\n\t\treturn false\n\t}\n\n\treturn e.Value(name) != nil\n}\n\nfunc (e *Enum) Value(name string) *EnumValue {\n\tif e == nil {\n\t\treturn nil\n\t}\n\n\tif strings.Contains(name, \".\") {\n\t\tenumFQDNPrefix := e.FQDN() + \".\"\n\t\tif !strings.HasPrefix(name, enumFQDNPrefix) {\n\t\t\treturn nil\n\t\t}\n\t\tname = strings.TrimPrefix(name, enumFQDNPrefix)\n\t}\n\tfor _, value := range e.Values {\n\t\tif value.Value == name {\n\t\t\treturn value\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (e *Enum) AttributeMap() map[string][]*EnumValue {\n\tattrMap := make(map[string][]*EnumValue)\n\tfor _, value := range e.Values {\n\t\tif value.Rule == nil {\n\t\t\tcontinue\n\t\t}\n\t\tfor _, attr := range value.Rule.Attrs {\n\t\t\tattrMap[attr.Name] = append(attrMap[attr.Name], value)\n\t\t}\n\t}\n\treturn attrMap\n}\n\nfunc (e *Enum) Package() *Package {\n\tif e == nil {\n\t\treturn nil\n\t}\n\tif e.File == nil {\n\t\treturn nil\n\t}\n\treturn e.File.Package\n}\n\nfunc (e *Enum) GoPackage() *GoPackage {\n\tif e == nil {\n\t\treturn nil\n\t}\n\tif e.File == nil {\n\t\treturn nil\n\t}\n\treturn e.File.GoPackage\n}\n\nfunc (e *Enum) PackageName() string {\n\tif e == nil {\n\t\treturn \"\"\n\t}\n\tpkg := e.Package()\n\tif pkg == nil {\n\t\treturn \"\"\n\t}\n\treturn pkg.Name\n}\n\nfunc (e *EnumExpr) ReferenceNames() []string {\n\tif e == nil {\n\t\treturn nil\n\t}\n\n\treturn e.By.ReferenceNames()\n}\n"
  },
  {
    "path": "resolver/error.go",
    "content": "package resolver\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/mercari/grpc-federation/source\"\n)\n\n// Error represents resolver package's error.\n// this has multiple error instances from resolver.\ntype Error struct {\n\tErrs []error\n}\n\nfunc (e *Error) Error() string {\n\terrs := make([]string, 0, len(e.Errs))\n\tfor _, err := range e.Errs {\n\t\terrs = append(errs, err.Error())\n\t}\n\treturn fmt.Sprintf(\"grpc-federation: %s\", strings.Join(errs, \"\\n\"))\n}\n\n// LocationError holds error message with location.\ntype LocationError struct {\n\tLocation *source.Location\n\tMessage  string\n}\n\nfunc (e *LocationError) Error() string {\n\treturn e.Message\n}\n\n// ExtractIndividualErrors extracts all error instances from Error type.\nfunc ExtractIndividualErrors(err error) []error {\n\tvar e *Error\n\tif !errors.As(err, &e) {\n\t\treturn nil\n\t}\n\tif e == nil {\n\t\treturn nil\n\t}\n\treturn e.Errs\n}\n\n// ToLocationError convert err into LocationError if error instances the one.\nfunc ToLocationError(err error) *LocationError {\n\tvar e *LocationError\n\tif !errors.As(err, &e) {\n\t\treturn nil\n\t}\n\treturn e\n}\n\n// ErrWithLocation creates LocationError instance from message and location.\nfunc ErrWithLocation(msg string, loc *source.Location) *LocationError {\n\treturn &LocationError{\n\t\tLocation: loc,\n\t\tMessage:  msg,\n\t}\n}\n\n// WarnWithLocation creates Warnings instance from message and location.\nfunc WarnWithLocation(msg string, loc *source.Location) *Warning {\n\treturn &Warning{\n\t\tLocation: loc,\n\t\tMessage:  msg,\n\t}\n}\n\ntype errorBuilder struct {\n\terrs []error\n}\n\nfunc (b *errorBuilder) add(err error) {\n\tif err == nil {\n\t\treturn\n\t}\n\tb.errs = append(b.errs, err)\n}\n\nfunc (b *errorBuilder) build() error {\n\tif len(b.errs) == 0 {\n\t\treturn nil\n\t}\n\treturn &Error{Errs: b.errs}\n}\n"
  },
  {
    "path": "resolver/extension.go",
    "content": "package resolver\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\n\t\"google.golang.org/protobuf/proto\"\n\t\"google.golang.org/protobuf/reflect/protoreflect\"\n\t\"google.golang.org/protobuf/types/dynamicpb\"\n)\n\nfunc getExtensionRule[T proto.Message](opts proto.Message, extType protoreflect.ExtensionType) (T, error) {\n\tvar ret T\n\n\ttyp := reflect.TypeOf(ret)\n\tif typ.Kind() != reflect.Ptr {\n\t\treturn ret, fmt.Errorf(\"proto.Message value must be pointer type\")\n\t}\n\tv := reflect.New(typ.Elem()).Interface().(proto.Message)\n\n\tif opts == nil {\n\t\treturn ret, nil\n\t}\n\tif !proto.HasExtension(opts, extType) {\n\t\treturn ret, nil\n\t}\n\n\textFullName := extType.TypeDescriptor().Descriptor().FullName()\n\n\tif setRuleFromDynamicMessage(opts, extFullName, v) {\n\t\treturn v.(T), nil\n\t}\n\n\text := proto.GetExtension(opts, extType)\n\tif ext == nil {\n\t\treturn ret, fmt.Errorf(\"%s extension does not exist\", extFullName)\n\t}\n\trule, ok := ext.(T)\n\tif !ok {\n\t\treturn ret, fmt.Errorf(\"%s extension cannot not be converted from %T\", extFullName, ext)\n\t}\n\treturn rule, nil\n}\n\n// setRuleFromDynamicMessage if each options are represented dynamicpb.Message type, convert and set it to rule instance.\n// NOTE: compile proto files by compiler package, extension is replaced by dynamicpb.Message.\nfunc setRuleFromDynamicMessage(opts proto.Message, extFullName protoreflect.FullName, rule proto.Message) bool {\n\tisSet := false\n\topts.ProtoReflect().Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool {\n\t\tif !fd.IsExtension() {\n\t\t\treturn true\n\t\t}\n\t\tif fd.FullName() != extFullName {\n\t\t\treturn true\n\t\t}\n\t\text := proto.GetExtension(opts, dynamicpb.NewExtensionType(fd))\n\t\tif ext == nil {\n\t\t\treturn true\n\t\t}\n\t\tmsg, ok := ext.(*dynamicpb.Message)\n\t\tif !ok {\n\t\t\treturn true\n\t\t}\n\t\tbytes, err := proto.Marshal(msg)\n\t\tif err != nil {\n\t\t\treturn true\n\t\t}\n\t\tif err := proto.Unmarshal(bytes, rule); err != nil {\n\t\t\treturn true\n\t\t}\n\n\t\tisSet = true\n\n\t\treturn true\n\t})\n\treturn isSet\n}\n"
  },
  {
    "path": "resolver/field.go",
    "content": "package resolver\n\nfunc (f *Field) HasRule() bool {\n\tif f == nil {\n\t\treturn false\n\t}\n\treturn f.Rule != nil\n}\n\nfunc (f *Field) HasCustomResolver() bool {\n\tif f == nil {\n\t\treturn false\n\t}\n\treturn f.HasRule() && f.Rule.CustomResolver\n}\n\nfunc (f *Field) HasMessageCustomResolver() bool {\n\tif f == nil {\n\t\treturn false\n\t}\n\treturn f.HasRule() && f.Rule.MessageCustomResolver\n}\n\nfunc (f *Field) TypeConversionDecls() []*TypeConversionDecl {\n\tif f == nil {\n\t\treturn nil\n\t}\n\treturn f.typeConversionDecls(make(map[string]struct{}))\n}\n\nfunc (f *Field) typeConversionDecls(convertedFQDNMap map[string]struct{}) []*TypeConversionDecl {\n\tif f == nil {\n\t\treturn nil\n\t}\n\tif !f.RequiredTypeConversion(FieldConversionKindAll) {\n\t\treturn nil\n\t}\n\ttoType := f.Type\n\tvar decls []*TypeConversionDecl\n\tfor _, fromType := range f.SourceTypes(FieldConversionKindAll) {\n\t\tdecls = append(decls, typeConversionDecls(fromType, toType, convertedFQDNMap)...)\n\t}\n\treturn uniqueTypeConversionDecls(decls)\n}\n\ntype FieldConversionKind int\n\nconst (\n\tFieldConversionKindUnknown FieldConversionKind = 1 << iota\n\tFieldConversionKindValue\n\tFieldConversionKindAutoBind\n\tFieldConversionKindAlias\n\tFieldConversionKindOneof\n)\n\nvar FieldConversionKindAll = FieldConversionKindValue | FieldConversionKindAutoBind | FieldConversionKindAlias | FieldConversionKindOneof\n\nfunc (f *Field) RequiredTypeConversion(kind FieldConversionKind) bool {\n\tif f == nil {\n\t\treturn false\n\t}\n\tif !f.HasRule() {\n\t\treturn false\n\t}\n\tif f.HasCustomResolver() {\n\t\treturn false\n\t}\n\tfor _, fromType := range f.SourceTypes(kind) {\n\t\tif requiredTypeConversion(fromType, f.Type) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (f *Field) SourceTypes(kind FieldConversionKind) []*Type {\n\tif f == nil {\n\t\treturn nil\n\t}\n\tif !f.HasRule() {\n\t\treturn nil\n\t}\n\trule := f.Rule\n\tvar ret []*Type\n\tif kind&FieldConversionKindValue != 0 && rule.Value != nil {\n\t\tret = append(ret, rule.Value.Type())\n\t}\n\tif kind&FieldConversionKindAlias != 0 && len(rule.Aliases) != 0 {\n\t\tfor _, alias := range rule.Aliases {\n\t\t\tret = append(ret, alias.Type)\n\t\t}\n\t}\n\tif kind&FieldConversionKindAutoBind != 0 && rule.AutoBindField != nil {\n\t\tret = append(ret, rule.AutoBindField.Field.Type)\n\t}\n\tif kind&FieldConversionKindOneof != 0 && rule.Oneof != nil {\n\t\tif rule.Oneof.By != nil {\n\t\t\tret = append(ret, rule.Oneof.By.Out)\n\t\t}\n\t}\n\treturn ret\n}\n"
  },
  {
    "path": "resolver/file.go",
    "content": "package resolver\n\nimport (\n\t\"fmt\"\n\t\"path/filepath\"\n\t\"sort\"\n\t\"strings\"\n\n\t\"github.com/mercari/grpc-federation/grpc/federation\"\n)\n\nfunc (f *File) PackageName() string {\n\tif f.Package == nil {\n\t\treturn \"\"\n\t}\n\treturn f.Package.Name\n}\n\nfunc (f *File) HasServiceWithRule() bool {\n\tfor _, svc := range f.Services {\n\t\tif svc.Rule != nil {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (f *File) Message(name string) *Message {\n\tfor _, msg := range f.Messages {\n\t\tif msg.Name == name {\n\t\t\treturn msg\n\t\t}\n\t}\n\treturn nil\n}\n\n// AllEnums returns a list that includes the enums defined in the file itself.\nfunc (f *File) AllEnums() []*Enum {\n\tenums := f.Enums\n\tfor _, msg := range f.Messages {\n\t\tenums = append(enums, msg.AllEnums()...)\n\t}\n\treturn enums\n}\n\n// AllEnumsIncludeDeps recursively searches for the imported file and returns a list of all enums.\nfunc (f *File) AllEnumsIncludeDeps() []*Enum {\n\treturn f.allEnumsIncludeDeps(make(map[string][]*Enum))\n}\n\n// AllUseMethods list of methods that the Services included in the file depend on.\nfunc (f *File) AllUseMethods() []*Method {\n\tmtdMap := map[*Method]struct{}{}\n\tfor _, msg := range f.Messages {\n\t\tfor _, mtd := range msg.DependMethods() {\n\t\t\tmtdMap[mtd] = struct{}{}\n\t\t}\n\t}\n\tmtds := make([]*Method, 0, len(mtdMap))\n\tfor mtd := range mtdMap {\n\t\tmtds = append(mtds, mtd)\n\t}\n\tsort.Slice(mtds, func(i, j int) bool {\n\t\treturn mtds[i].FQDN() < mtds[j].FQDN()\n\t})\n\treturn mtds\n}\n\nfunc (f *File) AllCELPlugins() []*CELPlugin {\n\tpluginMap := make(map[string]*CELPlugin)\n\tfor _, plugin := range f.CELPlugins {\n\t\tpluginMap[plugin.Name] = plugin\n\t}\n\tfor _, file := range f.ImportFiles {\n\t\tfor _, plugin := range file.AllCELPlugins() {\n\t\t\tpluginMap[plugin.Name] = plugin\n\t\t}\n\t}\n\tplugins := make([]*CELPlugin, 0, len(pluginMap))\n\tfor _, plugin := range pluginMap {\n\t\tplugins = append(plugins, plugin)\n\t}\n\tsort.Slice(plugins, func(i, j int) bool {\n\t\treturn plugins[i].Name < plugins[j].Name\n\t})\n\treturn plugins\n}\n\nfunc (f *File) allEnumsIncludeDeps(cacheMap map[string][]*Enum) []*Enum {\n\tif enums, exists := cacheMap[f.Name]; exists {\n\t\treturn enums\n\t}\n\tenumMap := make(map[string]*Enum)\n\tfor _, enum := range f.AllEnums() {\n\t\tenumMap[enum.FQDN()] = enum\n\t}\n\tfor _, importFile := range f.ImportFiles {\n\t\tfor _, enum := range importFile.allEnumsIncludeDeps(cacheMap) {\n\t\t\tenumMap[enum.FQDN()] = enum\n\t\t}\n\t}\n\tenums := make([]*Enum, 0, len(enumMap))\n\tfor _, enum := range enumMap {\n\t\tenums = append(enums, enum)\n\t}\n\tsort.Slice(enums, func(i, j int) bool {\n\t\treturn enums[i].FQDN() < enums[j].FQDN()\n\t})\n\tcacheMap[f.Name] = enums\n\treturn enums\n}\n\nfunc (f *File) PrivatePackageName() string {\n\treturn federation.PrivatePackageName + \".\" + f.PackageName()\n}\n\nfunc (f Files) FindByPackageName(pkg string) Files {\n\tvar ret Files\n\tfor _, file := range f {\n\t\tif file.PackageName() == pkg {\n\t\t\tret = append(ret, file)\n\t\t}\n\t}\n\treturn ret\n}\n\ntype OutputFilePathResolver struct {\n\tcfg *OutputFilePathConfig\n}\n\nfunc NewOutputFilePathResolver(cfg OutputFilePathConfig) *OutputFilePathResolver {\n\treturn &OutputFilePathResolver{\n\t\tcfg: &cfg,\n\t}\n}\n\ntype OutputFilePathMode int\n\nconst (\n\tImportMode         OutputFilePathMode = 0\n\tModulePrefixMode   OutputFilePathMode = 1\n\tSourceRelativeMode OutputFilePathMode = 2\n)\n\ntype OutputFilePathConfig struct {\n\t// Mode for file output ( default: ImportMode ).\n\tMode OutputFilePathMode\n\t// Prefix used in ModulePrefixMode.\n\tPrefix string\n\t// FilePath specify if you know the file path specified at compile time.\n\tFilePath string\n\t// ImportPaths list of import paths used during compile.\n\tImportPaths []string\n}\n\nfunc (r *OutputFilePathResolver) OutputDir(fileName string, gopkg *GoPackage) (string, error) {\n\tswitch r.cfg.Mode {\n\tcase ModulePrefixMode:\n\t\treturn r.modulePrefixBasedOutputDir(gopkg)\n\tcase SourceRelativeMode:\n\t\treturn r.sourceRelativeBasedOutputDir(fileName)\n\tcase ImportMode:\n\t\treturn r.importBasedOutputDir(gopkg)\n\t}\n\treturn \"\", fmt.Errorf(\"grpc-federation: unexpected output file mode: %d\", r.cfg.Mode)\n}\n\n// OutputPath returns the path to the output file.\n// Three output mode supported by protoc-gen-go are available.\n// FYI: https://protobuf.dev/reference/go/go-generated.\nfunc (r *OutputFilePathResolver) OutputPath(file *File) (string, error) {\n\tdir, err := r.OutputDir(file.Name, file.GoPackage)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn filepath.Join(dir, r.FileName(file)), nil\n}\n\nfunc (r *OutputFilePathResolver) importBasedOutputDir(gopkg *GoPackage) (string, error) {\n\tif gopkg == nil {\n\t\treturn \"\", fmt.Errorf(\"grpc-federation: gopkg must be specified\")\n\t}\n\treturn gopkg.ImportPath, nil\n}\n\n// SourceRelativeBasedOutputPath returns the path to the output file when the `paths=source_relative` flag is specified.\n// FYI: https://protobuf.dev/reference/go/go-generated.\nfunc (r *OutputFilePathResolver) sourceRelativeBasedOutputDir(fileName string) (string, error) {\n\tfilePath := fileName\n\tif r.cfg.FilePath != \"\" {\n\t\tfilePath = r.cfg.FilePath\n\t}\n\trelativePath := r.relativePath(filePath)\n\treturn filepath.Dir(relativePath), nil\n}\n\n// ModulePrefixBasedOutputPath returns the path to the output file when the `module=$PREFIX` flag is specified.\n// FYI: https://protobuf.dev/reference/go/go-generated.\nfunc (r *OutputFilePathResolver) modulePrefixBasedOutputDir(gopkg *GoPackage) (string, error) {\n\tif gopkg == nil {\n\t\treturn \"\", fmt.Errorf(\"grpc-federation: gopkg must be specified\")\n\t}\n\tvar prefix string\n\tif r.cfg.Prefix != \"\" {\n\t\tprefix = r.cfg.Prefix\n\t}\n\ttrimmedPrefix := strings.TrimPrefix(gopkg.ImportPath, prefix)\n\ttrimmedSlash := strings.TrimPrefix(trimmedPrefix, \"/\")\n\treturn trimmedSlash, nil\n}\n\nfunc IsGRPCFederationGeneratedFile(path string) bool {\n\treturn strings.HasSuffix(path, \"_grpc_federation.pb.go\")\n}\n\nfunc (r *OutputFilePathResolver) FileName(file *File) string {\n\tbaseNameWithExt := filepath.Base(file.Name)\n\tbaseName := baseNameWithExt[:len(baseNameWithExt)-len(filepath.Ext(baseNameWithExt))]\n\treturn fmt.Sprintf(\"%s_grpc_federation.pb.go\", strings.ToLower(baseName))\n}\n\nfunc (r *OutputFilePathResolver) relativePath(filePath string) string {\n\tfor _, importPath := range r.cfg.ImportPaths {\n\t\trel, err := filepath.Rel(importPath, filePath)\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t}\n\t\tif strings.HasPrefix(rel, \"..\") {\n\t\t\tcontinue\n\t\t}\n\t\treturn rel\n\t}\n\treturn filePath\n}\n"
  },
  {
    "path": "resolver/file_test.go",
    "content": "package resolver_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/mercari/grpc-federation/resolver\"\n)\n\nfunc TestOutputFileResolver(t *testing.T) {\n\tt.Parallel()\n\tt.Run(\"paths=import\", func(t *testing.T) {\n\t\tr := resolver.NewOutputFilePathResolver(resolver.OutputFilePathConfig{\n\t\t\tMode:        resolver.ImportMode,\n\t\t\tImportPaths: []string{\"proto\"},\n\t\t\tFilePath:    \"proto/buzz/buzz.proto\",\n\t\t})\n\t\tpath, err := r.OutputPath(&resolver.File{\n\t\t\tName: \"buzz.proto\",\n\t\t\tGoPackage: &resolver.GoPackage{\n\t\t\t\tImportPath: \"example.com/project/proto/fizz\",\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tif path != \"example.com/project/proto/fizz/buzz_grpc_federation.pb.go\" {\n\t\t\tt.Fatalf(\"unexpected path: %s\", path)\n\t\t}\n\t})\n\tt.Run(\"paths=source_relative\", func(t *testing.T) {\n\t\tr := resolver.NewOutputFilePathResolver(resolver.OutputFilePathConfig{\n\t\t\tMode:        resolver.SourceRelativeMode,\n\t\t\tImportPaths: []string{\"proto\"},\n\t\t\tFilePath:    \"proto/buzz/buzz.proto\",\n\t\t})\n\t\tpath, err := r.OutputPath(&resolver.File{\n\t\t\tName: \"buzz.proto\",\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tif path != \"buzz/buzz_grpc_federation.pb.go\" {\n\t\t\tt.Fatalf(\"unexpected path: %s\", path)\n\t\t}\n\t})\n\tt.Run(\"module=prefix\", func(t *testing.T) {\n\t\tr := resolver.NewOutputFilePathResolver(resolver.OutputFilePathConfig{\n\t\t\tMode:        resolver.ModulePrefixMode,\n\t\t\tImportPaths: []string{\"proto\"},\n\t\t\tFilePath:    \"proto/buzz/buzz.proto\",\n\t\t\tPrefix:      \"example.com/project\",\n\t\t})\n\t\tpath, err := r.OutputPath(&resolver.File{\n\t\t\tName: \"buzz.proto\",\n\t\t\tGoPackage: &resolver.GoPackage{\n\t\t\t\tImportPath: \"example.com/project/proto/fizz\",\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tif path != \"proto/fizz/buzz_grpc_federation.pb.go\" {\n\t\t\tt.Fatalf(\"unexpected path: %s\", path)\n\t\t}\n\t})\n}\n"
  },
  {
    "path": "resolver/format.go",
    "content": "package resolver\n\nimport (\n\t\"fmt\"\n\t\"sort\"\n\t\"strings\"\n)\n\nvar DefaultProtoFormatOption = &ProtoFormatOption{IndentSpaceNum: 2}\n\ntype ProtoFormatOption struct {\n\tIndentLevel    int\n\tPrefix         string\n\tIndentSpaceNum int\n}\n\nfunc (o *ProtoFormatOption) indentFormat() string {\n\topt := o\n\tif opt == nil {\n\t\topt = DefaultProtoFormatOption\n\t}\n\treturn opt.Prefix + strings.Repeat(\" \", opt.IndentSpaceNum*opt.IndentLevel)\n}\n\nfunc (o *ProtoFormatOption) toNextIndentLevel() *ProtoFormatOption {\n\topt := o\n\tif opt == nil {\n\t\topt = DefaultProtoFormatOption\n\t}\n\treturn &ProtoFormatOption{\n\t\tIndentLevel:    opt.IndentLevel + 1,\n\t\tPrefix:         opt.Prefix,\n\t\tIndentSpaceNum: opt.IndentSpaceNum,\n\t}\n}\n\nfunc (r *FieldRule) ProtoFormat(opt *ProtoFormatOption) string {\n\tif r == nil {\n\t\treturn \"\"\n\t}\n\tindent := opt.indentFormat()\n\tswitch {\n\tcase r.CustomResolver:\n\t\treturn indent + \"(grpc.federation.field).custom_resolver = true\"\n\tcase r.Value != nil:\n\t\tvalue := r.Value.ProtoFormat(opt)\n\t\tvalue = strings.Replace(value, \":\", \" =\", 1)\n\t\treturn indent + fmt.Sprintf(\"(grpc.federation.field).%s\", value)\n\tcase len(r.Aliases) != 0:\n\t\t// In cases where the output of an alias is needed,\n\t\t// we only need to output the first specified alias directly, so it's fine to ignore the other elements.\n\t\treturn indent + fmt.Sprintf(\"(grpc.federation.field).alias = %q\", r.Aliases[0].Name)\n\t}\n\treturn \"\"\n}\n\nfunc (r *MessageRule) ProtoFormat(opt *ProtoFormatOption) string {\n\tif r == nil {\n\t\treturn \"\"\n\t}\n\tindent := opt.indentFormat()\n\tnextOpt := opt.toNextIndentLevel()\n\n\tvar elems []string\n\tvarDefs := r.DefSet.Definitions().ProtoFormat(nextOpt)\n\tif varDefs != \"\" {\n\t\telems = append(elems, varDefs)\n\t}\n\tif r.CustomResolver {\n\t\telems = append(elems, nextOpt.indentFormat()+\"custom_resolver: true\")\n\t}\n\tvar aliases []string\n\tfor _, alias := range r.Aliases {\n\t\taliases = append(aliases, fmt.Sprintf(\"%q\", alias.FQDN()))\n\t}\n\tif len(aliases) == 1 {\n\t\telems = append(elems, nextOpt.indentFormat()+fmt.Sprintf(\"alias: %s\", aliases[0]))\n\t} else if len(aliases) > 1 {\n\t\telems = append(elems, nextOpt.indentFormat()+fmt.Sprintf(\"alias: [%s]\", strings.Join(aliases, \", \")))\n\t}\n\tif len(elems) == 0 {\n\t\treturn indent + \"option (grpc.federation.message) = {}\"\n\t}\n\treturn indent + fmt.Sprintf(\"option (grpc.federation.message) = {\\n%s\\n%s}\", strings.Join(elems, \"\\n\"), indent)\n}\n\nfunc (defs VariableDefinitions) ProtoFormat(opt *ProtoFormatOption) string {\n\tif len(defs) == 0 {\n\t\treturn \"\"\n\t}\n\tformattedDefs := make([]string, 0, len(defs))\n\tfor _, def := range defs {\n\t\tformat := def.ProtoFormat(opt)\n\t\tif format == \"\" {\n\t\t\tcontinue\n\t\t}\n\t\tformattedDefs = append(formattedDefs, format)\n\t}\n\treturn strings.Join(formattedDefs, \"\\n\")\n}\n\nfunc (def *VariableDefinition) ProtoFormat(opt *ProtoFormatOption) string {\n\tif def == nil {\n\t\treturn \"\"\n\t}\n\tnextOpt := opt.toNextIndentLevel()\n\tvar elems []string\n\tif def.Name != \"\" {\n\t\telems = append(elems, nextOpt.indentFormat()+fmt.Sprintf(\"name: %q\", def.Name))\n\t}\n\tif def.If != nil {\n\t\telems = append(elems, nextOpt.indentFormat()+fmt.Sprintf(\"if: %q\", def.If.Expr))\n\t}\n\tif def.AutoBind {\n\t\telems = append(elems, nextOpt.indentFormat()+`autobind: true`)\n\t}\n\telems = append(elems, def.Expr.ProtoFormat(nextOpt))\n\tindent := opt.indentFormat()\n\treturn indent + fmt.Sprintf(\"def {\\n%s\\n%s}\", strings.Join(elems, \"\\n\"), indent)\n}\n\nfunc (e *VariableExpr) ProtoFormat(opt *ProtoFormatOption) string {\n\tif e == nil {\n\t\treturn \"\"\n\t}\n\tswitch {\n\tcase e.By != nil:\n\t\treturn opt.indentFormat() + fmt.Sprintf(\"by: %q\", e.By.Expr)\n\tcase e.Call != nil:\n\t\treturn e.Call.ProtoFormat(opt)\n\tcase e.Message != nil:\n\t\treturn e.Message.ProtoFormat(opt)\n\tcase e.Enum != nil:\n\t\treturn e.Enum.ProtoFormat(opt)\n\tcase e.Map != nil:\n\t\treturn e.Map.ProtoFormat(opt)\n\tcase e.Switch != nil:\n\t\treturn e.Switch.ProtoFormat(opt)\n\tcase e.Validation != nil:\n\t\treturn e.Validation.ProtoFormat(opt)\n\t}\n\treturn \"\"\n}\n\nfunc (e *CallExpr) ProtoFormat(opt *ProtoFormatOption) string {\n\tif e == nil {\n\t\treturn \"\"\n\t}\n\tindent := opt.indentFormat()\n\tnextOpt := opt.toNextIndentLevel()\n\n\tvar elems []string\n\tmethod := e.Method.ProtoFormat(nextOpt)\n\tif method != \"\" {\n\t\telems = append(elems, method)\n\t}\n\trequest := e.Request.ProtoFormat(nextOpt)\n\tif request != \"\" {\n\t\telems = append(elems, request)\n\t}\n\tif len(elems) == 0 {\n\t\treturn \"\"\n\t}\n\treturn indent + fmt.Sprintf(\"call {\\n%s\\n%s}\", strings.Join(elems, \"\\n\"), indent)\n}\n\nfunc (e *MapExpr) ProtoFormat(opt *ProtoFormatOption) string {\n\tif e == nil {\n\t\treturn \"\"\n\t}\n\tindent := opt.indentFormat()\n\tnextOpt := opt.toNextIndentLevel()\n\tvar elems []string\n\tif e.Iterator != nil {\n\t\telems = append(elems, e.Iterator.ProtoFormat(nextOpt))\n\t}\n\tif e.Expr != nil {\n\t\telems = append(elems, e.Expr.ProtoFormat(nextOpt)...)\n\t}\n\tif len(elems) == 0 {\n\t\treturn \"\"\n\t}\n\treturn indent + fmt.Sprintf(\"map {\\n%s\\n%s}\", strings.Join(elems, \"\\n\"), indent)\n}\n\nfunc (iter *Iterator) ProtoFormat(opt *ProtoFormatOption) string {\n\tif iter == nil {\n\t\treturn \"\"\n\t}\n\tindent := opt.indentFormat()\n\tnextOpt := opt.toNextIndentLevel()\n\tvar elems []string\n\tif iter.Name != \"\" {\n\t\telems = append(elems, nextOpt.indentFormat()+fmt.Sprintf(\"name: %q\", iter.Name))\n\t}\n\tif iter.Source != nil {\n\t\telems = append(elems, nextOpt.indentFormat()+fmt.Sprintf(\"src: %q\", iter.Source.Name))\n\t}\n\tif len(elems) == 0 {\n\t\treturn \"\"\n\t}\n\treturn indent + fmt.Sprintf(\"iterator {\\n%s\\n%s}\", strings.Join(elems, \"\\n\"), indent)\n}\n\nfunc (e *MapIteratorExpr) ProtoFormat(opt *ProtoFormatOption) []string {\n\tif e == nil {\n\t\treturn nil\n\t}\n\tvar elems []string\n\tif e.By != nil {\n\t\telems = append(elems, opt.indentFormat()+fmt.Sprintf(\"by: %q\", e.By.Expr))\n\t}\n\tif e.Message != nil {\n\t\telems = append(elems, e.Message.ProtoFormat(opt))\n\t}\n\treturn elems\n}\n\nfunc (e *MessageExpr) ProtoFormat(opt *ProtoFormatOption) string {\n\tif e == nil {\n\t\treturn \"\"\n\t}\n\tindent := opt.indentFormat()\n\tnextOpt := opt.toNextIndentLevel()\n\tvar elems []string\n\tif e.Message != nil {\n\t\telems = append(elems, nextOpt.indentFormat()+fmt.Sprintf(\"name: %q\", e.Message.Name))\n\t}\n\targs := e.protoFormatMessageArgs(nextOpt)\n\tif args != \"\" {\n\t\telems = append(elems, args)\n\t}\n\tif len(elems) == 0 {\n\t\treturn \"\"\n\t}\n\treturn indent + fmt.Sprintf(\"message {\\n%s\\n%s}\", strings.Join(elems, \"\\n\"), indent)\n}\n\nfunc (e *MessageExpr) protoFormatMessageArgs(opt *ProtoFormatOption) string {\n\tvar args []string\n\tfor _, arg := range e.Args {\n\t\tvalue := arg.ProtoFormat(opt, false)\n\t\tif value == \"\" {\n\t\t\tcontinue\n\t\t}\n\t\targs = append(args, value)\n\t}\n\n\tindent := opt.indentFormat()\n\tif len(args) == 0 {\n\t\treturn \"\"\n\t}\n\tif len(args) == 1 {\n\t\treturn indent + fmt.Sprintf(`args %s`, args[0])\n\t}\n\n\tnextOpt := opt.toNextIndentLevel()\n\tformattedArgs := make([]string, 0, len(args))\n\tfor _, arg := range args {\n\t\tformattedArgs = append(formattedArgs, nextOpt.indentFormat()+arg)\n\t}\n\treturn indent + fmt.Sprintf(\"args: [\\n%s\\n%s]\", strings.Join(formattedArgs, \",\\n\"), indent)\n}\n\nfunc (e *EnumExpr) ProtoFormat(opt *ProtoFormatOption) string {\n\tif e == nil {\n\t\treturn \"\"\n\t}\n\tindent := opt.indentFormat()\n\tnextOpt := opt.toNextIndentLevel()\n\tvar elems []string\n\tif e.Enum != nil {\n\t\telems = append(elems, nextOpt.indentFormat()+fmt.Sprintf(\"name: %q\", e.Enum.FQDN()))\n\t}\n\tif e.By != nil {\n\t\telems = append(elems, nextOpt.indentFormat()+fmt.Sprintf(\"by: %q\", e.By.Expr))\n\t}\n\tif len(elems) == 0 {\n\t\treturn \"\"\n\t}\n\treturn indent + fmt.Sprintf(\"enum {\\n%s\\n%s}\", strings.Join(elems, \"\\n\"), indent)\n}\n\nfunc (m *Method) ProtoFormat(opt *ProtoFormatOption) string {\n\tif m == nil {\n\t\treturn \"\"\n\t}\n\treturn opt.indentFormat() + fmt.Sprintf(\"method: %q\", m.FQDN())\n}\n\nfunc (e *SwitchExpr) ProtoFormat(opt *ProtoFormatOption) string {\n\tif e == nil {\n\t\treturn \"\"\n\t}\n\tindent := opt.indentFormat()\n\tnextOpt := opt.toNextIndentLevel()\n\tvar elems []string\n\tfor _, c := range e.Cases {\n\t\telems = append(elems, c.ProtoFormat(nextOpt))\n\t}\n\tif e.Default != nil {\n\t\telems = append(elems, e.Default.ProtoFormat(nextOpt))\n\t}\n\treturn indent + fmt.Sprintf(\"switch {\\n%s\\n%s}\", strings.Join(elems, \"\\n\"), indent)\n}\n\nfunc (c *SwitchCaseExpr) ProtoFormat(opt *ProtoFormatOption) string {\n\tif c == nil {\n\t\treturn \"\"\n\t}\n\tindent := opt.indentFormat()\n\tnextOpt := opt.toNextIndentLevel()\n\tvar elems []string\n\tvarDefs := c.DefSet.Definitions().ProtoFormat(nextOpt)\n\tif varDefs != \"\" {\n\t\telems = append(elems, varDefs)\n\t}\n\tif c.If != nil {\n\t\telems = append(elems, nextOpt.indentFormat()+fmt.Sprintf(\"if: %q\", c.If.Expr))\n\t}\n\tif c.By != nil {\n\t\telems = append(elems, nextOpt.indentFormat()+fmt.Sprintf(\"by: %q\", c.By.Expr))\n\t}\n\treturn indent + fmt.Sprintf(\"case {\\n%s\\n%s}\", strings.Join(elems, \"\\n\"), indent)\n}\n\nfunc (d *SwitchDefaultExpr) ProtoFormat(opt *ProtoFormatOption) string {\n\tif d == nil {\n\t\treturn \"\"\n\t}\n\tindent := opt.indentFormat()\n\tnextOpt := opt.toNextIndentLevel()\n\tvar elems []string\n\tvarDefs := d.DefSet.Definitions().ProtoFormat(nextOpt)\n\tif varDefs != \"\" {\n\t\telems = append(elems, varDefs)\n\t}\n\tif d.By != nil {\n\t\telems = append(elems, nextOpt.indentFormat()+fmt.Sprintf(\"by: %q\", d.By.Expr))\n\t}\n\treturn indent + fmt.Sprintf(\"default {\\n%s\\n%s}\", strings.Join(elems, \"\\n\"), indent)\n}\n\nfunc (r *Request) ProtoFormat(opt *ProtoFormatOption) string {\n\tif r == nil {\n\t\treturn \"\"\n\t}\n\tindent := opt.indentFormat()\n\tfields := make([]string, 0, len(r.Args))\n\tfor _, arg := range r.Args {\n\t\tfield := arg.ProtoFormat(opt, true)\n\t\tif field == \"\" {\n\t\t\tcontinue\n\t\t}\n\t\tfields = append(fields, field)\n\t}\n\tif len(fields) == 0 {\n\t\treturn \"\"\n\t}\n\tif len(fields) == 1 {\n\t\treturn indent + fmt.Sprintf(\"request %s\", fields[0])\n\t}\n\n\tnextOpt := opt.toNextIndentLevel()\n\tformattedFields := make([]string, 0, len(fields))\n\tfor _, field := range fields {\n\t\tformattedFields = append(formattedFields, nextOpt.indentFormat()+field)\n\t}\n\treturn indent + fmt.Sprintf(\"request: [\\n%s\\n%s]\", strings.Join(formattedFields, \",\\n\"), indent)\n}\n\nfunc (f *AutoBindField) ProtoFormat(opt *ProtoFormatOption) string {\n\tif f.VariableDefinition != nil {\n\t\treturn f.VariableDefinition.ProtoFormat(opt)\n\t}\n\treturn \"\"\n}\n\nfunc (e *ValidationExpr) ProtoFormat(opt *ProtoFormatOption) string {\n\tif e == nil {\n\t\treturn \"\"\n\t}\n\tindent := opt.indentFormat()\n\tnextOpt := opt.toNextIndentLevel()\n\tvar elems []string\n\tif e.Name != \"\" {\n\t\telems = append(\n\t\t\telems,\n\t\t\tnextOpt.indentFormat()+fmt.Sprintf(\"name: %q\", e.Name),\n\t\t)\n\t}\n\tif e.Error != nil {\n\t\telems = append(elems, e.Error.ProtoFormat(nextOpt))\n\t}\n\treturn indent + fmt.Sprintf(\"validation {\\n%s\\n%s}\", strings.Join(elems, \"\\n\"), indent)\n}\n\nfunc (e *GRPCError) ProtoFormat(opt *ProtoFormatOption) string {\n\tindent := opt.indentFormat()\n\tnextOpt := opt.toNextIndentLevel()\n\telems := []string{\n\t\tnextOpt.indentFormat() + fmt.Sprintf(\"code: %s\", e.Code),\n\t}\n\tvarDefs := e.DefSet.Definitions().ProtoFormat(nextOpt)\n\tif varDefs != \"\" {\n\t\telems = append(elems, varDefs)\n\t}\n\tif val := e.If; val != nil {\n\t\telems = append(elems, nextOpt.indentFormat()+fmt.Sprintf(\"if: %q\", val.Expr))\n\t}\n\tif m := e.Message; m != nil {\n\t\telems = append(elems, nextOpt.indentFormat()+fmt.Sprintf(\"message: %q\", m.Expr))\n\t}\n\tif len(e.Details) != 0 {\n\t\telems = append(elems, e.Details.ProtoFormat(nextOpt))\n\t}\n\treturn indent + fmt.Sprintf(\"error {\\n%s\\n%s}\", strings.Join(elems, \"\\n\"), indent)\n}\n\nfunc (d GRPCErrorDetails) ProtoFormat(opt *ProtoFormatOption) string {\n\tindent := opt.indentFormat()\n\tnextOpt := opt.toNextIndentLevel()\n\tif len(d) == 1 {\n\t\treturn indent + fmt.Sprintf(\"details {\\n%s\\n%s}\", d[0].ProtoFormat(opt), indent)\n\t}\n\tvar elems []string\n\tfor _, detail := range d {\n\t\telems = append(elems, nextOpt.indentFormat()+fmt.Sprintf(\"{\\n%s\\n%s}\", detail.ProtoFormat(nextOpt), nextOpt.indentFormat()))\n\t}\n\treturn indent + fmt.Sprintf(\"details: [\\n%s\\n%s]\", strings.Join(elems, \",\\n\"), indent)\n}\n\nfunc (detail *GRPCErrorDetail) ProtoFormat(opt *ProtoFormatOption) string {\n\tnextOpt := opt.toNextIndentLevel()\n\n\tvar elems []string\n\tvarDefs := detail.DefSet.Definitions().ProtoFormat(nextOpt)\n\tif varDefs != \"\" {\n\t\telems = append(elems, varDefs)\n\t}\n\telems = append(elems, nextOpt.indentFormat()+fmt.Sprintf(\"if: %q\", detail.If.Expr))\n\tif s := len(detail.Messages.Definitions()); s != 0 {\n\t\telems = append(elems, detail.protoFormatDetails(nextOpt, \"message\", s))\n\t}\n\tif s := len(detail.PreconditionFailures); s != 0 {\n\t\telems = append(elems, detail.protoFormatDetails(nextOpt, \"precondition_failure\", s))\n\t}\n\tif s := len(detail.BadRequests); s != 0 {\n\t\telems = append(elems, detail.protoFormatDetails(nextOpt, \"bad_request\", s))\n\t}\n\tif s := len(detail.LocalizedMessages); s != 0 {\n\t\telems = append(elems, detail.protoFormatDetails(nextOpt, \"localized_message\", s))\n\t}\n\n\treturn strings.Join(elems, \"\\n\")\n}\n\nfunc (detail *GRPCErrorDetail) protoFormatDetails(opt *ProtoFormatOption, name string, size int) string {\n\tindent := opt.indentFormat()\n\tnextOpt := opt.toNextIndentLevel()\n\tif size == 1 {\n\t\treturn indent + fmt.Sprintf(\"%s {...}\", name)\n\t}\n\tvar elems []string\n\tfor i := 0; i < size; i++ {\n\t\telems = append(elems, nextOpt.indentFormat()+\"{...}\")\n\t}\n\treturn indent + fmt.Sprintf(\"%s: [\\n%s\\n%s]\", name, strings.Join(elems, \",\\n\"), indent)\n}\n\nfunc (a *Argument) ProtoFormat(opt *ProtoFormatOption, isRequestArg bool) string {\n\tvar elems []string\n\tif a.Name != \"\" {\n\t\tif isRequestArg {\n\t\t\telems = append(elems, fmt.Sprintf(\"field: %q\", a.Name))\n\t\t} else {\n\t\t\telems = append(elems, fmt.Sprintf(\"name: %q\", a.Name))\n\t\t}\n\t}\n\tif a.Value != nil {\n\t\telems = append(elems, a.Value.ProtoFormat(opt))\n\t}\n\tif a.If != nil {\n\t\telems = append(elems, fmt.Sprintf(\"if: %q\", a.If.Expr))\n\t}\n\tif len(elems) == 0 {\n\t\treturn \"\"\n\t}\n\treturn fmt.Sprintf(\"{ %s }\", strings.Join(elems, \", \"))\n}\n\nfunc (v *Value) ProtoFormat(opt *ProtoFormatOption) string {\n\tif v == nil {\n\t\treturn \"\"\n\t}\n\tif v.CEL != nil {\n\t\tif v.Inline {\n\t\t\treturn fmt.Sprintf(\"inline: %q\", v.CEL.Expr)\n\t\t}\n\t\treturn fmt.Sprintf(\"by: %q\", v.CEL.Expr)\n\t}\n\treturn \"\"\n}\n\nfunc DependencyGraphTreeFormat(groups []VariableDefinitionGroup) string {\n\tctx := newVariableDefinitionGroupTreeFormatContext()\n\tfor _, group := range groups {\n\t\tgroup.setTextMaxLength(ctx.withNextDepth())\n\t}\n\tctx.setupIndent()\n\tif len(groups) == 1 {\n\t\treturn groups[0].treeFormat(ctx)\n\t}\n\tvar ret string\n\tfor i := 0; i < len(groups); i++ {\n\t\tif i != 0 {\n\t\t\tctx = ctx.withLineDepth()\n\t\t}\n\t\tret += groups[i].treeFormat(ctx.withNextDepth())\n\t\tif i == 0 {\n\t\t\tret += \" ─┐\"\n\t\t} else {\n\t\t\tret += \" ─┤\"\n\t\t}\n\t\tret += \"\\n\"\n\t}\n\treturn ret\n}\n\nfunc (g *SequentialVariableDefinitionGroup) treeFormat(ctx *variableDefinitionGroupTreeFormatContext) string {\n\tvar (\n\t\tret string\n\t)\n\tif g.Start != nil {\n\t\tret += treeFormatByVariableDefinitionGroup(ctx, g.Start, true)\n\t}\n\tif g.End != nil {\n\t\tret += treeFormatByVariableDefinition(ctx, g.End)\n\t}\n\treturn ret\n}\n\nfunc (g *ConcurrentVariableDefinitionGroup) treeFormat(ctx *variableDefinitionGroupTreeFormatContext) string {\n\tvar (\n\t\tret string\n\t)\n\tfor i := 0; i < len(g.Starts); i++ {\n\t\tret += treeFormatByVariableDefinitionGroup(ctx, g.Starts[i], i == 0)\n\t}\n\tif g.End != nil {\n\t\tret += treeFormatByVariableDefinition(ctx, g.End)\n\t}\n\treturn ret\n}\n\nfunc treeFormatByVariableDefinitionGroup(ctx *variableDefinitionGroupTreeFormatContext, g VariableDefinitionGroup, isFirst bool) string {\n\tif !isFirst {\n\t\tctx = ctx.withLineDepth()\n\t}\n\ttext := g.treeFormat(ctx.withNextDepth())\n\tif isFirst {\n\t\ttext += \" ─┐\"\n\t} else {\n\t\ttext += \" ─┤\"\n\t}\n\tprevIndent := ctx.currentIndent()\n\tfor _, indent := range ctx.lineIndents() {\n\t\tdiff := indent - prevIndent - 1\n\t\tif diff < 0 {\n\t\t\tprevIndent = indent\n\t\t\tcontinue\n\t\t}\n\t\ttext += strings.Repeat(\" \", diff)\n\t\ttext += \"│\"\n\t\tprevIndent = indent\n\t}\n\ttext += \"\\n\"\n\treturn text\n}\n\nfunc treeFormatByVariableDefinition(ctx *variableDefinitionGroupTreeFormatContext, def *VariableDefinition) string {\n\tformat := fmt.Sprintf(\"%%%ds\", ctx.currentMaxLength())\n\tprefix := strings.Repeat(\" \", ctx.currentIndent())\n\treturn prefix + fmt.Sprintf(format, def.Name)\n}\n\nfunc (g *SequentialVariableDefinitionGroup) setTextMaxLength(ctx *variableDefinitionGroupTreeFormatContext) {\n\tif g.Start != nil {\n\t\tg.Start.setTextMaxLength(ctx.withNextDepth())\n\t}\n\tif g.End != nil {\n\t\tmaxLen := ctx.depthToMaxLength[ctx.depth]\n\t\tlength := len(g.End.Name)\n\t\tif maxLen < length {\n\t\t\tctx.depthToMaxLength[ctx.depth] = length\n\t\t}\n\t}\n}\n\nfunc (g *ConcurrentVariableDefinitionGroup) setTextMaxLength(ctx *variableDefinitionGroupTreeFormatContext) {\n\tfor _, start := range g.Starts {\n\t\tstart.setTextMaxLength(ctx.withNextDepth())\n\t}\n\tif g.End != nil {\n\t\tmaxLen := ctx.depthToMaxLength[ctx.depth]\n\t\tlength := len(g.End.Name)\n\t\tif maxLen < length {\n\t\t\tctx.depthToMaxLength[ctx.depth] = length\n\t\t}\n\t}\n}\n\nfunc newVariableDefinitionGroupTreeFormatContext() *variableDefinitionGroupTreeFormatContext {\n\treturn &variableDefinitionGroupTreeFormatContext{\n\t\tdepthToMaxLength: map[int]int{0: 0},\n\t\tdepthToIndent:    make(map[int]int),\n\t\tlineDepth:        make(map[int]struct{}),\n\t}\n}\n\nconst lineSpace = 2\n\nfunc (c *variableDefinitionGroupTreeFormatContext) setupIndent() {\n\tmaxDepth := c.maxDepth()\n\tfor depth := range c.depthToMaxLength {\n\t\tdiff := maxDepth - depth\n\t\tc.depthToIndent[depth] = c.getTotalMaxLength(depth+1) + diff*lineSpace\n\t}\n}\n\nfunc (c *variableDefinitionGroupTreeFormatContext) getTotalMaxLength(depth int) int {\n\tlength, exists := c.depthToMaxLength[depth]\n\tif !exists {\n\t\treturn 0\n\t}\n\treturn length + c.getTotalMaxLength(depth+1)\n}\n\n// withLineDepth clone context after adding '│' character's depth position.\nfunc (c *variableDefinitionGroupTreeFormatContext) withLineDepth() *variableDefinitionGroupTreeFormatContext {\n\tlineDepth := make(map[int]struct{})\n\tfor depth := range c.lineDepth {\n\t\tlineDepth[depth] = struct{}{}\n\t}\n\tlineDepth[c.depth] = struct{}{}\n\treturn &variableDefinitionGroupTreeFormatContext{\n\t\tdepth:            c.depth,\n\t\tdepthToMaxLength: c.depthToMaxLength,\n\t\tdepthToIndent:    c.depthToIndent,\n\t\tlineDepth:        lineDepth,\n\t}\n}\n\n// withNextDepth clone context after incrementing the depth.\nfunc (c *variableDefinitionGroupTreeFormatContext) withNextDepth() *variableDefinitionGroupTreeFormatContext {\n\treturn &variableDefinitionGroupTreeFormatContext{\n\t\tdepth:            c.depth + 1,\n\t\tdepthToMaxLength: c.depthToMaxLength,\n\t\tdepthToIndent:    c.depthToIndent,\n\t\tlineDepth:        c.lineDepth,\n\t}\n}\n\n// maxDepth return max depth number for current tree.\nfunc (c *variableDefinitionGroupTreeFormatContext) maxDepth() int {\n\tvar maxDepth int\n\tfor depth := range c.depthToMaxLength {\n\t\tif maxDepth < depth {\n\t\t\tmaxDepth = depth\n\t\t}\n\t}\n\treturn maxDepth\n}\n\n// lineIndents returns all '│' character's indent position.\nfunc (c *variableDefinitionGroupTreeFormatContext) lineIndents() []int {\n\tindents := []int{}\n\tfor depth := range c.lineDepth {\n\t\tindents = append(indents, c.depthToIndent[depth])\n\t}\n\tsort.Ints(indents)\n\treturn indents\n}\n\n// currentIndent return indent at current depth.\nfunc (c *variableDefinitionGroupTreeFormatContext) currentIndent() int {\n\treturn c.depthToIndent[c.depth]\n}\n\n// currentMaxLength return max name length at current depth.\nfunc (c *variableDefinitionGroupTreeFormatContext) currentMaxLength() int {\n\treturn c.depthToMaxLength[c.depth]\n}\n"
  },
  {
    "path": "resolver/format_test.go",
    "content": "package resolver_test\n\nimport (\n\t\"fmt\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"google.golang.org/genproto/googleapis/rpc/code\"\n\n\t\"github.com/mercari/grpc-federation/internal/testutil\"\n\t\"github.com/mercari/grpc-federation/resolver\"\n)\n\nfunc TestProtoFormat(t *testing.T) {\n\tt.Parallel()\n\ttests := []struct {\n\t\tname                     string\n\t\tmessageOptionToFormatMap map[string]string\n\t}{\n\t\t{\n\t\t\tname: \"simple_aggregation.proto\",\n\t\t\tmessageOptionToFormatMap: map[string]string{\n\t\t\t\t\"GetPostResponse\": `\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n    def {\n      name: \"uuid\"\n      by: \"grpc.federation.uuid.newRandom()\"\n    }\n    def {\n      name: \"map_value\"\n      by: \"{1:'a', 2:'b', 3:'c'}\"\n    }\n    def {\n      name: \"e\"\n      enum {\n        name: \"org.federation.Item.ItemType\"\n        by: \"org.user.Item.ItemType.value('ITEM_TYPE_2')\"\n      }\n    }\n    def {\n      name: \"id\"\n      by: \"100\"\n    }\n  }`,\n\t\t\t\t\"Post\": `\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"org.post.PostService/GetPost\"\n        request { field: \"id\", by: \"$.id\" }\n      }\n    }\n    def {\n      name: \"post\"\n      autobind: true\n      by: \"res.post\"\n    }\n    def {\n      name: \"user\"\n      message {\n        name: \"User\"\n        args { inline: \"post\" }\n      }\n    }\n    def {\n      name: \"z\"\n      message {\n        name: \"Z\"\n      }\n    }\n    def {\n      name: \"m\"\n      autobind: true\n      message {\n        name: \"M\"\n        args: [\n          { name: \"x\", by: \"10\" },\n          { name: \"y\", by: \"1\" }\n        ]\n      }\n    }\n  }`,\n\t\t\t\t\"M\": `\n  option (grpc.federation.message) = {}`,\n\t\t\t\t\"Z\": `\n  option (grpc.federation.message) = {\n    custom_resolver: true\n  }`,\n\t\t\t\t\"User\": `\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"org.user.UserService/GetUser\"\n        request { field: \"id\", by: \"$.user_id\" }\n      }\n    }\n    def {\n      name: \"user\"\n      autobind: true\n      by: \"res.user\"\n    }\n    def {\n      name: \"_def2\"\n      message {\n        name: \"M\"\n        args: [\n          { name: \"x\", by: \"uint(2)\" },\n          { name: \"y\", by: \"org.user.Item.ItemType.value('ITEM_TYPE_2')\" }\n        ]\n      }\n    }\n  }`,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"minimum.proto\",\n\t\t\tmessageOptionToFormatMap: map[string]string{\n\t\t\t\t\"GetPostResponse\": `\n  option (grpc.federation.message) = {\n    custom_resolver: true\n  }`,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"create_post.proto\",\n\t\t\tmessageOptionToFormatMap: map[string]string{\n\t\t\t\t\"CreatePostResponse\": `\n  option (grpc.federation.message) = {\n    def {\n      name: \"cp\"\n      message {\n        name: \"CreatePost\"\n        args: [\n          { name: \"title\", by: \"$.title\" },\n          { name: \"content\", by: \"$.content\" },\n          { name: \"user_id\", by: \"$.user_id\" },\n          { name: \"type\", by: \"$.type\" }\n        ]\n      }\n    }\n    def {\n      name: \"res\"\n      call {\n        method: \"org.post.PostService/CreatePost\"\n        request { field: \"post\", by: \"cp\" }\n      }\n    }\n    def {\n      name: \"p\"\n      by: \"res.post\"\n    }\n  }`,\n\t\t\t\t\"CreatePost\": `\n  option (grpc.federation.message) = {\n    alias: \"org.post.CreatePost\"\n  }`,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"custom_resolver.proto\",\n\t\t\tmessageOptionToFormatMap: map[string]string{\n\t\t\t\t\"GetPostResponse\": `\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  }`,\n\t\t\t\t\"Post\": `\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"org.post.PostService/GetPost\"\n        request { field: \"id\", by: \"$.id\" }\n      }\n    }\n    def {\n      name: \"post\"\n      autobind: true\n      by: \"res.post\"\n    }\n    def {\n      name: \"user\"\n      message {\n        name: \"User\"\n        args { inline: \"post\" }\n      }\n    }\n  }`,\n\t\t\t\t\"User\": `\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"org.user.UserService/GetUser\"\n        request { field: \"id\", by: \"$.user_id\" }\n      }\n    }\n    def {\n      name: \"u\"\n      by: \"res.user\"\n    }\n    custom_resolver: true\n  }`,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"alias.proto\",\n\t\t\tmessageOptionToFormatMap: map[string]string{\n\t\t\t\t\"GetPostResponse\": `\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args: [\n          { name: \"id\", by: \"$.id\" },\n          { name: \"a\", by: \"$.a\" },\n          { name: \"b\", by: \"$.b\" }\n        ]\n      }\n    }\n  }`,\n\t\t\t\t\"Post\": `\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"org.post.PostService/GetPost\"\n        request: [\n          { field: \"id\", by: \"$.id\" },\n          { field: \"a\", by: \"$.a\", if: \"$.a != null\" },\n          { field: \"b\", by: \"$.b\", if: \"$.b != null\" }\n        ]\n      }\n    }\n    def {\n      name: \"post\"\n      autobind: true\n      by: \"res.post\"\n    }\n  }`,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"validation.proto\",\n\t\t\tmessageOptionToFormatMap: map[string]string{\n\t\t\t\t\"GetPostResponse\": `\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n      }\n    }\n    def {\n      name: \"_def1\"\n      validation {\n        error {\n          code: FAILED_PRECONDITION\n          def {\n            name: \"a\"\n            by: \"73\"\n          }\n          if: \"post.id != 'some-id'\"\n          message: \"'validation message 1'\"\n        }\n      }\n    }\n    def {\n      name: \"_def2\"\n      validation {\n        error {\n          code: FAILED_PRECONDITION\n          if: \"true\"\n          message: \"'validation message 2'\"\n          details {\n            def {\n              name: \"b\"\n              by: \"'mackerel'\"\n            }\n            if: \"post.title != 'some-title'\"\n            message: [\n              {...},\n              {...}\n            ]\n            precondition_failure {...}\n            bad_request {...}\n            localized_message {...}\n          }\n        }\n      }\n    }\n  }`,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"switch.proto\",\n\t\t\tmessageOptionToFormatMap: map[string]string{\n\t\t\t\t\"GetPostResponse\": `\n  option (grpc.federation.message) = {\n    def {\n      name: \"switch\"\n      switch {\n        case {\n          def {\n            name: \"blue\"\n            by: \"73\"\n          }\n          if: \"$.id == 'blue'\"\n          by: \"blue\"\n        }\n        case {\n          if: \"$.id == 'red'\"\n          by: \"2\"\n        }\n        default {\n          def {\n            name: \"default\"\n            by: \"3\"\n          }\n          by: \"default\"\n        }\n      }\n    }\n  }`,\n\t\t\t},\n\t\t},\n\t}\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\ttestdataDir := filepath.Join(testutil.RepoRoot(), \"testdata\")\n\t\t\tr := resolver.New(testutil.Compile(t, filepath.Join(testdataDir, test.name)), resolver.ImportPathOption(testdataDir))\n\t\t\tresult, err := r.Resolve()\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tmsgMap := make(map[string]*resolver.Message)\n\t\t\tfor _, file := range result.Files {\n\t\t\t\tfor _, msg := range file.Messages {\n\t\t\t\t\tmsgMap[msg.Name] = msg\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor msgName, format := range test.messageOptionToFormatMap {\n\t\t\t\tt.Run(msgName, func(t *testing.T) {\n\t\t\t\t\texpected := strings.TrimPrefix(format, \"\\n\")\n\t\t\t\t\tmsg, exists := msgMap[msgName]\n\t\t\t\t\tif !exists {\n\t\t\t\t\t\tt.Fatalf(\"failed to find %s message\", msgName)\n\t\t\t\t\t}\n\t\t\t\t\tgot := msg.Rule.ProtoFormat(&resolver.ProtoFormatOption{\n\t\t\t\t\t\tIndentLevel:    1,\n\t\t\t\t\t\tIndentSpaceNum: 2,\n\t\t\t\t\t})\n\t\t\t\t\tif diff := cmp.Diff(got, expected); diff != \"\" {\n\t\t\t\t\t\tfmt.Println(got)\n\t\t\t\t\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc toCodePtr(c code.Code) *code.Code {\n\treturn &c\n}\n\nfunc TestValidationExpr_ProtoFormat(t *testing.T) {\n\tt.Parallel()\n\texpr := &resolver.ValidationExpr{\n\t\tName: \"_validation0\",\n\t\tError: &resolver.GRPCError{\n\t\t\tCode: toCodePtr(code.Code_FAILED_PRECONDITION),\n\t\t\tDetails: resolver.GRPCErrorDetails{\n\t\t\t\t{\n\t\t\t\t\tIf: &resolver.CELValue{\n\t\t\t\t\t\tExpr: \"1 == 1\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tIf: &resolver.CELValue{\n\t\t\t\t\t\tExpr: \"2 == 2\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\topt := resolver.DefaultProtoFormatOption\n\tgot := expr.ProtoFormat(opt)\n\tif diff := cmp.Diff(got, `validation {\n  name: \"_validation0\"\n  error {\n    code: FAILED_PRECONDITION\n    details: [\n      {\n        if: \"1 == 1\"\n      },\n      {\n        if: \"2 == 2\"\n      }\n    ]\n  }\n}`); diff != \"\" {\n\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t}\n}\n\nfunc TestGRPCError_ProtoFormat(t *testing.T) {\n\tt.Parallel()\n\ttests := []struct {\n\t\tdesc     string\n\t\terr      *resolver.GRPCError\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tdesc: \"Rule is set\",\n\t\t\terr: &resolver.GRPCError{\n\t\t\t\tCode: toCodePtr(code.Code_FAILED_PRECONDITION),\n\t\t\t\tIf: &resolver.CELValue{\n\t\t\t\t\tExpr: \"1 == 1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: `error {\n  code: FAILED_PRECONDITION\n  if: \"1 == 1\"\n}`,\n\t\t},\n\t\t{\n\t\t\tdesc: \"Details are set\",\n\t\t\terr: &resolver.GRPCError{\n\t\t\t\tCode: toCodePtr(code.Code_FAILED_PRECONDITION),\n\t\t\t\tDetails: resolver.GRPCErrorDetails{\n\t\t\t\t\t{\n\t\t\t\t\t\tIf: &resolver.CELValue{\n\t\t\t\t\t\t\tExpr: \"1 == 1\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tIf: &resolver.CELValue{\n\t\t\t\t\t\t\tExpr: \"2 == 2\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: `error {\n  code: FAILED_PRECONDITION\n  details: [\n    {\n      if: \"1 == 1\"\n    },\n    {\n      if: \"2 == 2\"\n    }\n  ]\n}`,\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.desc, func(t *testing.T) {\n\t\t\topt := resolver.DefaultProtoFormatOption\n\t\t\tgot := tc.err.ProtoFormat(opt)\n\t\t\tif diff := cmp.Diff(got, tc.expected); diff != \"\" {\n\t\t\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestGRPCErrorDetails_ProtoFormat(t *testing.T) {\n\tt.Parallel()\n\ttests := []struct {\n\t\tdesc     string\n\t\tdetails  resolver.GRPCErrorDetails\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tdesc: \"single detail\",\n\t\t\tdetails: resolver.GRPCErrorDetails{\n\t\t\t\t{\n\t\t\t\t\tIf: &resolver.CELValue{\n\t\t\t\t\t\tExpr: \"1 == 1\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: `details {\n  if: \"1 == 1\"\n}`,\n\t\t},\n\t\t{\n\t\t\tdesc: \"multiple details\",\n\t\t\tdetails: resolver.GRPCErrorDetails{\n\t\t\t\t{\n\t\t\t\t\tIf: &resolver.CELValue{\n\t\t\t\t\t\tExpr: \"1 == 1\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tIf: &resolver.CELValue{\n\t\t\t\t\t\tExpr: \"2 == 2\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: `details: [\n  {\n    if: \"1 == 1\"\n  },\n  {\n    if: \"2 == 2\"\n  }\n]`,\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.desc, func(t *testing.T) {\n\t\t\topt := resolver.DefaultProtoFormatOption\n\t\t\tgot := tc.details.ProtoFormat(opt)\n\t\t\tif diff := cmp.Diff(got, tc.expected); diff != \"\" {\n\t\t\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestGRPCErrorDetail_ProtoFormat(t *testing.T) {\n\tt.Parallel()\n\ttests := []struct {\n\t\tdesc     string\n\t\tdetail   *resolver.GRPCErrorDetail\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tdesc: \"single detail\",\n\t\t\tdetail: &resolver.GRPCErrorDetail{\n\t\t\t\tIf: &resolver.CELValue{\n\t\t\t\t\tExpr: \"1 == 1\",\n\t\t\t\t},\n\t\t\t\tPreconditionFailures: []*resolver.PreconditionFailure{\n\t\t\t\t\t{},\n\t\t\t\t},\n\t\t\t\tBadRequests: []*resolver.BadRequest{\n\t\t\t\t\t{},\n\t\t\t\t},\n\t\t\t\tLocalizedMessages: []*resolver.LocalizedMessage{\n\t\t\t\t\t{},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: `  if: \"1 == 1\"\n  precondition_failure {...}\n  bad_request {...}\n  localized_message {...}`,\n\t\t},\n\t\t{\n\t\t\tdesc: \"multiple detail\",\n\t\t\tdetail: &resolver.GRPCErrorDetail{\n\t\t\t\tIf: &resolver.CELValue{\n\t\t\t\t\tExpr: \"2 == 2\",\n\t\t\t\t},\n\t\t\t\tPreconditionFailures: []*resolver.PreconditionFailure{\n\t\t\t\t\t{},\n\t\t\t\t\t{},\n\t\t\t\t},\n\t\t\t\tBadRequests: []*resolver.BadRequest{\n\t\t\t\t\t{},\n\t\t\t\t\t{},\n\t\t\t\t},\n\t\t\t\tLocalizedMessages: []*resolver.LocalizedMessage{\n\t\t\t\t\t{},\n\t\t\t\t\t{},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: `  if: \"2 == 2\"\n  precondition_failure: [\n    {...},\n    {...}\n  ]\n  bad_request: [\n    {...},\n    {...}\n  ]\n  localized_message: [\n    {...},\n    {...}\n  ]`,\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.desc, func(t *testing.T) {\n\t\t\topt := resolver.DefaultProtoFormatOption\n\t\t\tgot := tc.detail.ProtoFormat(opt)\n\t\t\tif diff := cmp.Diff(got, tc.expected); diff != \"\" {\n\t\t\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestDependencyTreeFormat(t *testing.T) {\n\tt.Parallel()\n\ttests := []struct {\n\t\tname                     string\n\t\tmessageOptionToFormatMap map[string]string\n\t}{\n\t\t{\n\t\t\tname: \"async.proto\",\n\t\t\tmessageOptionToFormatMap: map[string]string{\n\t\t\t\t\"GetResponse\": `\na ─┐\n   c ─┐\nb ─┐  │\n   d ─┤\n      e ─┐\na ─┐     │\n   c ─┐  │\nb ─┐  │  │\n   d ─┤  │\n      f ─┤\n      g ─┤\n         h ─┐\n      i ─┐  │\n         j ─┤\n`,\n\t\t\t\t\"A\": `\naa ─┐\nab ─┤\n`,\n\t\t\t\t\"AA\": \"\",\n\t\t\t\t\"AB\": \"\",\n\t\t\t\t\"B\":  \"\",\n\t\t\t\t\"C\":  \"\",\n\t\t\t\t\"D\":  \"\",\n\t\t\t\t\"E\":  \"\",\n\t\t\t\t\"F\":  \"\",\n\t\t\t\t\"G\":  \"\",\n\t\t\t\t\"H\":  \"\",\n\t\t\t\t\"I\":  \"\",\n\t\t\t\t\"J\":  \"\",\n\t\t\t},\n\t\t},\n\t}\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tr := resolver.New(testutil.Compile(t, filepath.Join(testutil.RepoRoot(), \"testdata\", test.name)))\n\t\t\tresult, err := r.Resolve()\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tmsgMap := make(map[string]*resolver.Message)\n\t\t\tfor _, file := range result.Files {\n\t\t\t\tfor _, msg := range file.Messages {\n\t\t\t\t\tmsgMap[msg.Name] = msg\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor msgName, format := range test.messageOptionToFormatMap {\n\t\t\t\tt.Run(msgName, func(t *testing.T) {\n\t\t\t\t\texpected := strings.TrimPrefix(format, \"\\n\")\n\t\t\t\t\tmsg, exists := msgMap[msgName]\n\t\t\t\t\tif !exists {\n\t\t\t\t\t\tt.Fatalf(\"failed to find message from %s\", msgName)\n\t\t\t\t\t}\n\t\t\t\t\tgot := resolver.DependencyGraphTreeFormat(msg.Rule.DefSet.DefinitionGroups())\n\t\t\t\t\tif diff := cmp.Diff(got, expected); diff != \"\" {\n\t\t\t\t\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "resolver/fqdn.go",
    "content": "package resolver\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n)\n\nfunc (s *Service) FQDN() string {\n\tif s == nil {\n\t\treturn \"\"\n\t}\n\treturn fmt.Sprintf(\"%s.%s\", s.PackageName(), s.Name)\n}\n\nfunc (m *Method) FQDN() string {\n\tif m == nil {\n\t\treturn \"\"\n\t}\n\treturn fmt.Sprintf(\"%s/%s\", m.Service.FQDN(), m.Name)\n}\n\nfunc (m *Message) FQDN() string {\n\tif m == nil {\n\t\treturn \"\"\n\t}\n\treturn strings.Join(\n\t\tappend(append([]string{m.PackageName()}, m.ParentMessageNames()...), m.Name),\n\t\t\".\",\n\t)\n}\n\nfunc (f *Field) FQDN() string {\n\tif f == nil {\n\t\treturn \"\"\n\t}\n\tif f.Message == nil {\n\t\treturn f.Name\n\t}\n\treturn fmt.Sprintf(\"%s.%s\", f.Message.FQDN(), f.Name)\n}\n\nfunc (f *OneofField) FQDN() string {\n\tif f == nil {\n\t\treturn \"\"\n\t}\n\treturn fmt.Sprintf(\"%s.%s\", f.Oneof.Message.FQDN(), f.Name)\n}\n\nfunc (e *Enum) FQDN() string {\n\tif e == nil {\n\t\treturn \"\"\n\t}\n\tif e.Message != nil {\n\t\treturn fmt.Sprintf(\"%s.%s\", e.Message.FQDN(), e.Name)\n\t}\n\treturn fmt.Sprintf(\"%s.%s\", e.PackageName(), e.Name)\n}\n\nfunc (v *EnumValue) FQDN() string {\n\tif v == nil {\n\t\treturn \"\"\n\t}\n\treturn fmt.Sprintf(\"%s.%s\", v.Enum.FQDN(), v.Value)\n}\n\nfunc (t *Type) FQDN() string {\n\tif t == nil {\n\t\treturn \"\"\n\t}\n\tvar repeated string\n\tif t.Repeated {\n\t\trepeated = \"repeated \"\n\t}\n\tif t.OneofField != nil {\n\t\treturn repeated + t.OneofField.FQDN()\n\t}\n\tif t.Message != nil {\n\t\tif t.Message.IsMapEntry {\n\t\t\treturn \"map<\" + t.Message.Fields[0].Type.FQDN() + \", \" + t.Message.Fields[1].Type.FQDN() + \">\"\n\t\t}\n\t\treturn repeated + t.Message.FQDN()\n\t}\n\tif t.Enum != nil {\n\t\treturn repeated + t.Enum.FQDN()\n\t}\n\treturn repeated + t.Kind.ToString()\n}\n\nfunc (n *MessageDependencyGraphNode) FQDN() string {\n\tif n == nil {\n\t\treturn \"\"\n\t}\n\treturn fmt.Sprintf(\"%s_%s\", n.BaseMessage.FQDN(), n.VariableDefinition.Name)\n}\n"
  },
  {
    "path": "resolver/graph.go",
    "content": "package resolver\n\nimport (\n\t\"fmt\"\n\t\"sort\"\n\t\"strings\"\n\n\t\"github.com/mercari/grpc-federation/source\"\n)\n\n// CreateAllMessageDependencyGraph creates a dependency graph for all messages with  message options defined.\nfunc CreateAllMessageDependencyGraph(ctx *context, msgs []*Message) *AllMessageDependencyGraph {\n\tmsgToNode := make(map[*Message]*AllMessageDependencyGraphNode)\n\tfor _, msg := range msgs {\n\t\tif msg.Rule == nil {\n\t\t\tcontinue\n\t\t}\n\t\tmsgToNode[msg] = &AllMessageDependencyGraphNode{Message: msg}\n\t}\n\n\tfor _, msg := range msgs {\n\t\tif msg.Rule == nil {\n\t\t\tcontinue\n\t\t}\n\n\t\tnewAllMessageDependencyGraphNodeReferenceBuilder(msgToNode, msg).Build(ctx)\n\t}\n\tvar roots []*AllMessageDependencyGraphNode\n\tfor _, node := range msgToNode {\n\t\tif len(node.Parent) == 0 {\n\t\t\troots = append(roots, node)\n\t\t}\n\t}\n\tif len(roots) == 0 {\n\t\treturn nil\n\t}\n\tsort.Slice(roots, func(i, j int) bool {\n\t\treturn roots[i].Message.Name < roots[j].Message.Name\n\t})\n\tgraph := &AllMessageDependencyGraph{Roots: roots}\n\tif err := validateAllMessageGraph(graph); err != nil {\n\t\tctx.addError(err)\n\t\treturn nil\n\t}\n\treturn graph\n}\n\nfunc (n *AllMessageDependencyGraphNode) childMessages() []*Message {\n\tmessages := []*Message{n.Message}\n\tfor _, child := range n.Children {\n\t\tif child.Message.Rule == nil {\n\t\t\tcontinue\n\t\t}\n\t\tmessages = append(messages, child.childMessages()...)\n\t}\n\treturn messages\n}\n\ntype AllMessageDependencyGraphNodeReferenceBuilder struct {\n\tmsgToNode map[*Message]*AllMessageDependencyGraphNode\n\tchildMap  map[*AllMessageDependencyGraphNode]struct{}\n\tmsg       *Message\n\tnode      *AllMessageDependencyGraphNode\n}\n\nfunc newAllMessageDependencyGraphNodeReferenceBuilder(msgToNode map[*Message]*AllMessageDependencyGraphNode, msg *Message) *AllMessageDependencyGraphNodeReferenceBuilder {\n\treturn &AllMessageDependencyGraphNodeReferenceBuilder{\n\t\tmsgToNode: msgToNode,\n\t\tchildMap:  make(map[*AllMessageDependencyGraphNode]struct{}),\n\t\tmsg:       msg,\n\t\tnode:      msgToNode[msg],\n\t}\n}\n\nfunc (b *AllMessageDependencyGraphNodeReferenceBuilder) Build(ctx *context) {\n\tmsg := b.msg\n\tfileName := msg.File.Name\n\tfor _, varDef := range msg.Rule.DefSet.Definitions() {\n\t\tb.buildVariableDefinition(ctx, varDef, varDef.builder)\n\t}\n\tfor _, field := range msg.Fields {\n\t\tif field.Rule == nil {\n\t\t\tcontinue\n\t\t}\n\t\tif field.Rule.Oneof == nil {\n\t\t\tcontinue\n\t\t}\n\t\tfor idx, varDef := range field.Rule.Oneof.DefSet.Definitions() {\n\t\t\tbuilder := source.NewLocationBuilder(fileName).\n\t\t\t\tWithMessage(b.msg.Name).\n\t\t\t\tWithField(field.Name).\n\t\t\t\tWithOption().\n\t\t\t\tWithOneOf().\n\t\t\t\tWithDef(idx)\n\t\t\tb.buildVariableDefinition(ctx, varDef, builder)\n\t\t}\n\t}\n}\n\nfunc (b *AllMessageDependencyGraphNodeReferenceBuilder) buildVariableDefinition(ctx *context, def *VariableDefinition, builder *source.VariableDefinitionOptionBuilder) {\n\texpr := def.Expr\n\tif expr == nil {\n\t\treturn\n\t}\n\tswitch {\n\tcase expr.Call != nil:\n\t\tb.buildCall(ctx, expr.Call, builder.WithCall())\n\tcase expr.Message != nil:\n\t\tb.buildMessage(ctx, expr.Message, builder.WithMessage())\n\tcase expr.Map != nil:\n\t\tb.buildMap(ctx, expr.Map, builder.WithMap())\n\tcase expr.Validation != nil:\n\t\tb.buildValidation(ctx, expr.Validation, builder.WithValidation())\n\t}\n}\n\nfunc (b *AllMessageDependencyGraphNodeReferenceBuilder) buildCall(ctx *context, expr *CallExpr, builder *source.CallExprOptionBuilder) {\n\tfor idx, grpcErr := range expr.Errors {\n\t\tb.buildGRPCError(ctx, grpcErr, builder.WithError(idx))\n\t}\n}\n\nfunc (b *AllMessageDependencyGraphNodeReferenceBuilder) buildMessage(ctx *context, expr *MessageExpr, builder *source.MessageExprOptionBuilder) {\n\tdepMsg := expr.Message\n\tdepNode, depNodeExists := b.msgToNode[depMsg]\n\tif _, exists := b.childMap[depNode]; exists {\n\t\treturn\n\t}\n\tif !depNodeExists {\n\t\tif depMsg == nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\t`undefined message specified`,\n\t\t\t\t\tbuilder.WithName().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t\treturn\n\t\t}\n\t\tif !depMsg.HasRuleEveryFields() {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\tfmt.Sprintf(`\"%s.%s\" message does not specify \"grpc.federation.message\" option`, depMsg.Package().Name, depMsg.Name),\n\t\t\t\t\tbuilder.WithName().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t\tdepNode = &AllMessageDependencyGraphNode{Message: depMsg}\n\t}\n\tif b.node != nil {\n\t\tb.node.Children = append(b.node.Children, depNode)\n\t\tdepNode.Parent = append(depNode.Parent, b.node)\n\t}\n\tb.childMap[depNode] = struct{}{}\n}\n\nfunc (b *AllMessageDependencyGraphNodeReferenceBuilder) buildMap(ctx *context, expr *MapExpr, builder *source.MapExprOptionBuilder) {\n\tif expr.Expr == nil {\n\t\treturn\n\t}\n\tif expr.Expr.Message == nil {\n\t\treturn\n\t}\n\tmsgExpr := expr.Expr.Message\n\tdepMsg := msgExpr.Message\n\tdepNode, depNodeExists := b.msgToNode[depMsg]\n\tif _, exists := b.childMap[depNode]; exists {\n\t\treturn\n\t}\n\tif !depNodeExists {\n\t\tif depMsg == nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\t`undefined message`,\n\t\t\t\t\tbuilder.WithMessage().WithName().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t\treturn\n\t\t}\n\t\tif !depMsg.HasRuleEveryFields() {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\tfmt.Sprintf(`\"%s.%s\" message does not specify \"grpc.federation.message\" option`, depMsg.Package().Name, depMsg.Name),\n\t\t\t\t\tbuilder.WithMessage().WithName().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t\tdepNode = &AllMessageDependencyGraphNode{Message: depMsg}\n\t}\n\tif b.node != nil {\n\t\tb.node.Children = append(b.node.Children, depNode)\n\t\tdepNode.Parent = append(depNode.Parent, b.node)\n\t}\n\tb.childMap[depNode] = struct{}{}\n}\n\nfunc (b *AllMessageDependencyGraphNodeReferenceBuilder) buildValidation(ctx *context, expr *ValidationExpr, builder *source.ValidationExprOptionBuilder) {\n\tb.buildGRPCError(ctx, expr.Error, builder.WithError())\n}\n\nfunc (b *AllMessageDependencyGraphNodeReferenceBuilder) buildGRPCError(ctx *context, grpcErr *GRPCError, builder *source.GRPCErrorOptionBuilder) {\n\tif grpcErr == nil {\n\t\treturn\n\t}\n\tfor idx, def := range grpcErr.DefSet.Definitions() {\n\t\tb.buildVariableDefinition(ctx, def, builder.WithDef(idx))\n\t}\n\tfor idx, detail := range grpcErr.Details {\n\t\tb.buildGRPCErrorDetail(ctx, detail, builder.WithDetail(idx))\n\t}\n}\n\nfunc (b *AllMessageDependencyGraphNodeReferenceBuilder) buildGRPCErrorDetail(ctx *context, detail *GRPCErrorDetail, builder *source.GRPCErrorDetailOptionBuilder) {\n\tif detail == nil {\n\t\treturn\n\t}\n\tfor idx, def := range detail.DefSet.Definitions() {\n\t\tb.buildVariableDefinition(ctx, def, builder.WithDef(idx))\n\t}\n\tfor idx, def := range detail.Messages.Definitions() {\n\t\tb.buildVariableDefinition(ctx, def, builder.WithDef(idx))\n\t}\n}\n\nfunc (g *MessageDependencyGraph) VariableDefinitionGroups() []VariableDefinitionGroup {\n\tvar groups []VariableDefinitionGroup\n\tfor _, child := range g.uniqueChildren() {\n\t\tif group := g.createVariableDefinitionGroup(child); group != nil {\n\t\t\tgroups = append(groups, group)\n\t\t}\n\t}\n\treturn groups\n}\n\nfunc (g *MessageDependencyGraph) uniqueChildren() []*MessageDependencyGraphNode {\n\tchildren := g.children(g.Roots)\n\tuniqueMap := make(map[*MessageDependencyGraphNode]struct{})\n\tfor _, child := range children {\n\t\tuniqueMap[child] = struct{}{}\n\t}\n\tuniqueChildren := make([]*MessageDependencyGraphNode, 0, len(uniqueMap))\n\tfor child := range uniqueMap {\n\t\tuniqueChildren = append(uniqueChildren, child)\n\t}\n\tsort.Slice(uniqueChildren, func(i, j int) bool {\n\t\treturn uniqueChildren[i].FQDN() < uniqueChildren[j].FQDN()\n\t})\n\treturn uniqueChildren\n}\n\nfunc (g *MessageDependencyGraph) children(nodes []*MessageDependencyGraphNode) []*MessageDependencyGraphNode {\n\tvar children []*MessageDependencyGraphNode\n\tfor _, node := range nodes {\n\t\tif len(node.Children) != 0 {\n\t\t\tchildren = append(children, g.children(node.Children)...)\n\t\t} else {\n\t\t\tchildren = append(children, node)\n\t\t}\n\t}\n\treturn children\n}\n\nfunc (g *MessageDependencyGraph) createVariableDefinitionGroup(node *MessageDependencyGraphNode) VariableDefinitionGroup {\n\tif node == nil {\n\t\treturn nil\n\t}\n\tif len(node.Parent) == 0 {\n\t\treturn &SequentialVariableDefinitionGroup{End: node.VariableDefinition}\n\t}\n\tif len(node.Parent) == 1 {\n\t\treturn &SequentialVariableDefinitionGroup{\n\t\t\tStart: g.createVariableDefinitionGroup(node.Parent[0]),\n\t\t\tEnd:   node.VariableDefinition,\n\t\t}\n\t}\n\trg := new(ConcurrentVariableDefinitionGroup)\n\tsort.Slice(node.Parent, func(i, j int) bool {\n\t\treturn node.Parent[i].FQDN() < node.Parent[j].FQDN()\n\t})\n\tfor _, parent := range node.Parent {\n\t\tif group := g.createVariableDefinitionGroup(parent); group != nil {\n\t\t\trg.Starts = append(rg.Starts, group)\n\t\t}\n\t}\n\trg.End = node.VariableDefinition\n\treturn rg\n}\n\nfunc newMessageDependencyGraphNode(baseMsg *Message, def *VariableDefinition) *MessageDependencyGraphNode {\n\treturn &MessageDependencyGraphNode{\n\t\tBaseMessage:        baseMsg,\n\t\tVariableDefinition: def,\n\t\tParentMap:          make(map[*MessageDependencyGraphNode]struct{}),\n\t\tChildrenMap:        make(map[*MessageDependencyGraphNode]struct{}),\n\t}\n}\n\n// setupVariableDefinitionSet create a MessageDependencyGraph from VariableDefinitions of VariableDefinitionSet.\n// Also, it creates VariableDefinitionGroups value and set it to VariableDefinitionSet.\n// If a circular reference occurs, add an error to context.\nfunc setupVariableDefinitionSet(ctx *context, baseMsg *Message, defSet *VariableDefinitionSet) {\n\tvar nodes []*MessageDependencyGraphNode\n\tfor _, varDef := range defSet.Definitions() {\n\t\tnode := newMessageDependencyGraphNode(baseMsg, varDef)\n\t\tnodes = append(nodes, node)\n\t}\n\n\tsetupVariableDependencyByReferenceName(nodes)\n\tsetupVariableDependencyByValidation(nodes)\n\n\tvar roots []*MessageDependencyGraphNode\n\tfor _, node := range nodes {\n\t\tif len(node.Parent) == 0 {\n\t\t\troots = append(roots, node)\n\t\t}\n\t}\n\tif len(roots) == 0 {\n\t\treturn\n\t}\n\n\tgraph := &MessageDependencyGraph{Roots: roots}\n\tif err := validateMessageGraph(graph); err != nil {\n\t\tctx.addError(err)\n\t\treturn\n\t}\n\tdefSet.Graph = graph\n\tdefSet.Groups = graph.VariableDefinitionGroups()\n}\n\nfunc setupVariableDependencyByReferenceName(nodes []*MessageDependencyGraphNode) {\n\tnameToNode := make(map[string]*MessageDependencyGraphNode)\n\tfor _, node := range nodes {\n\t\tdef := node.VariableDefinition\n\t\trefs := def.ReferenceNames()\n\t\tif len(refs) == 0 {\n\t\t\tif def.Name != \"\" {\n\t\t\t\tnameToNode[def.Name] = node\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tvar iterName string\n\t\tif def.Expr.Map != nil && def.Expr.Map.Iterator != nil {\n\t\t\titerName = def.Expr.Map.Iterator.Name\n\t\t}\n\t\tfor _, ref := range refs {\n\t\t\tif ref == iterName {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\trefNode, exists := nameToNode[ref]\n\t\t\tif !exists {\n\t\t\t\t// not found name in current scope.\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif _, exists := refNode.ChildrenMap[node]; !exists {\n\t\t\t\trefNode.Children = append(refNode.Children, node)\n\t\t\t\trefNode.ChildrenMap[node] = struct{}{}\n\t\t\t}\n\t\t\tif _, exists := node.ParentMap[refNode]; !exists {\n\t\t\t\tnode.Parent = append(node.Parent, refNode)\n\t\t\t\tnode.ParentMap[refNode] = struct{}{}\n\t\t\t}\n\t\t}\n\t\tif def.Name != \"\" {\n\t\t\tnameToNode[def.Name] = node\n\t\t}\n\t}\n}\n\nfunc setupVariableDependencyByValidation(nodes []*MessageDependencyGraphNode) {\n\tsetupVariableDependencyByValidationRecursive(make(map[*MessageDependencyGraphNode]struct{}), nodes)\n}\n\nfunc setupVariableDependencyByValidationRecursive(parentMap map[*MessageDependencyGraphNode]struct{}, nodes []*MessageDependencyGraphNode) {\n\tif len(nodes) == 0 {\n\t\treturn\n\t}\n\tlastIdx := 0\n\tfor idx, node := range nodes {\n\t\tparentMap[node] = struct{}{}\n\t\tif !node.VariableDefinition.IsValidation() {\n\t\t\tcontinue\n\t\t}\n\t\tvalidationNode := node\n\t\tvalidationParents := make([]*MessageDependencyGraphNode, 0, len(validationNode.Parent))\n\t\tfor parent := range validationNode.ParentMap {\n\t\t\tif parent.VariableDefinition.IsValidation() {\n\t\t\t\tvalidationParents = append(validationParents, parent)\n\t\t\t} else {\n\t\t\t\t// If a parent node exists in the parentMap, add it as a parent element of the validation node.\n\t\t\t\t// At this time, since all child elements of the validation node are executed after the evaluation of the validation node,\n\t\t\t\t// all parent nodes of the validation node have already been evaluated.\n\t\t\t\t// For this reason, the parent node is removed from the parentMap.\n\t\t\t\t// If it does not exist in the parentMap, it is determined to be an already evaluated parent element and is removed from validationNode.ParentMap.\n\t\t\t\tif _, exists := parentMap[parent]; exists {\n\t\t\t\t\tvalidationParents = append(validationParents, parent)\n\t\t\t\t\tdelete(parentMap, parent)\n\t\t\t\t} else {\n\t\t\t\t\tdelete(validationNode.ParentMap, parent)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tvalidationNode.Parent = validationParents\n\n\t\tfor i := idx + 1; i < len(nodes); i++ {\n\t\t\tcurNode := nodes[i]\n\n\t\t\t// All nodes following the validationNode become child nodes of the validationNode.\n\t\t\t// This indicates a sequential relationship.\n\t\t\tif _, exists := validationNode.ChildrenMap[curNode]; !exists {\n\t\t\t\tvalidationNode.Children = append(validationNode.Children, curNode)\n\t\t\t\tvalidationNode.ChildrenMap[curNode] = struct{}{}\n\t\t\t}\n\n\t\t\t// If a validation node is already set as a parent node,\n\t\t\t// remove all of them so that only the current validation node is set as the parent.\n\t\t\t// This ensures that only the last validation node is retained as the parent.\n\t\t\tcurParents := make([]*MessageDependencyGraphNode, 0, len(curNode.Parent))\n\t\t\tfor parent := range curNode.ParentMap {\n\t\t\t\tif parent.VariableDefinition.IsValidation() {\n\t\t\t\t\tdelete(curNode.ParentMap, parent)\n\t\t\t\t} else {\n\t\t\t\t\tcurParents = append(curParents, parent)\n\t\t\t\t}\n\t\t\t}\n\t\t\tcurNode.ParentMap[validationNode] = struct{}{}\n\t\t\tcurParents = append(curParents, validationNode)\n\t\t\tcurNode.Parent = curParents\n\t\t}\n\t\tlastIdx = idx\n\t\tbreak\n\t}\n\t// Recursively evaluate from the node following the last found validation node.\n\tsetupVariableDependencyByValidationRecursive(parentMap, nodes[lastIdx+1:])\n}\n\nfunc validateMessageGraph(graph *MessageDependencyGraph) *LocationError {\n\tfor _, root := range graph.Roots {\n\t\tif err := validateMessageNode(root); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc validateMessageNode(node *MessageDependencyGraphNode) *LocationError {\n\tif err := validateMessageNodeCyclicDependency(node, make(map[*MessageDependencyGraphNode]struct{}), []*MessageDependencyGraphNode{}); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc validateMessageNodeCyclicDependency(target *MessageDependencyGraphNode, visited map[*MessageDependencyGraphNode]struct{}, path []*MessageDependencyGraphNode) *LocationError {\n\tpath = append(path, target)\n\tif _, exists := visited[target]; exists {\n\t\tvar messages []string\n\t\tfor _, node := range path {\n\t\t\tmessages = append(messages, node.BaseMessage.Name)\n\t\t}\n\t\tdependencyPath := strings.Join(messages, \" => \")\n\n\t\tmsg := target.BaseMessage\n\t\tfor _, varDef := range msg.Rule.DefSet.Definitions() {\n\t\t\tif varDef.Expr == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif varDef.Expr.Message == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif varDef.Expr.Message.Message == target.BaseMessage {\n\t\t\t\treturn ErrWithLocation(\n\t\t\t\t\tfmt.Sprintf(\n\t\t\t\t\t\t`found cyclic dependency for \"%s.%s\" message in \"%s.%s. dependency path: %s\"`,\n\t\t\t\t\t\ttarget.BaseMessage.PackageName(), target.BaseMessage.Name,\n\t\t\t\t\t\tmsg.PackageName(), msg.Name, dependencyPath,\n\t\t\t\t\t),\n\t\t\t\t\tvarDef.builder.WithMessage().Location(),\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t\treturn ErrWithLocation(\n\t\t\tfmt.Sprintf(`found cyclic dependency for \"%s.%s\" message. dependency path: %s`, target.BaseMessage.PackageName(), target.BaseMessage.Name, dependencyPath),\n\t\t\tnewMessageBuilderFromMessage(target.BaseMessage).Location(),\n\t\t)\n\t}\n\tvisited[target] = struct{}{}\n\tfor _, child := range target.Children {\n\t\tif err := validateMessageNodeCyclicDependency(child, visited, path); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tdelete(visited, target)\n\treturn nil\n}\n\nfunc validateAllMessageGraph(graph *AllMessageDependencyGraph) *LocationError {\n\tfor _, root := range graph.Roots {\n\t\tif err := validateAllMessageGraphNode(root); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc validateAllMessageGraphNode(node *AllMessageDependencyGraphNode) *LocationError {\n\tif err := validateAllMessageGraphNodeCyclicDependency(node, make(map[*AllMessageDependencyGraphNode]struct{}), []*AllMessageDependencyGraphNode{}); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc validateAllMessageGraphNodeCyclicDependency(target *AllMessageDependencyGraphNode, visited map[*AllMessageDependencyGraphNode]struct{}, path []*AllMessageDependencyGraphNode) *LocationError {\n\tpath = append(path, target)\n\tif _, exists := visited[target]; exists {\n\t\tvar messages []string\n\t\tfor _, node := range path {\n\t\t\tmessages = append(messages, node.Message.Name)\n\t\t}\n\t\tdependencyPath := strings.Join(messages, \" => \")\n\n\t\treturn ErrWithLocation(\n\t\t\tfmt.Sprintf(`found cyclic dependency in \"%s.%s\" message. dependency path: %s`, target.Message.PackageName(), target.Message.Name, dependencyPath),\n\t\t\tnewMessageBuilderFromMessage(target.Message).Location(),\n\t\t)\n\t}\n\tvisited[target] = struct{}{}\n\tfor _, child := range target.Children {\n\t\tif err := validateAllMessageGraphNodeCyclicDependency(child, visited, path); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tdelete(visited, target)\n\treturn nil\n}\n"
  },
  {
    "path": "resolver/message.go",
    "content": "package resolver\n\nimport (\n\t\"sort\"\n\t\"strings\"\n\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"github.com/mercari/grpc-federation/types\"\n)\n\nfunc NewMessage(name string, fields []*Field) *Message {\n\treturn &Message{Name: name, Fields: fields}\n}\n\nfunc NewMessageType(msg *Message, repeated bool) *Type {\n\treturn &Type{\n\t\tKind:     types.Message,\n\t\tMessage:  msg,\n\t\tRepeated: repeated,\n\t}\n}\n\nfunc NewMapType(key, value *Type) *Type {\n\treturn NewMessageType(&Message{\n\t\tIsMapEntry: true,\n\t\tFields: []*Field{\n\t\t\t{Name: \"key\", Type: key},\n\t\t\t{Name: \"value\", Type: value},\n\t\t},\n\t}, false)\n}\n\nfunc NewMapTypeWithName(name string, key, value *Type) *Type {\n\treturn NewMessageType(&Message{\n\t\tName:       name,\n\t\tIsMapEntry: true,\n\t\tFields: []*Field{\n\t\t\t{Name: \"key\", Type: key},\n\t\t\t{Name: \"value\", Type: value},\n\t\t},\n\t}, false)\n}\n\nfunc NewEnumSelectorType(trueType, falseType *Type) *Type {\n\treturn NewMessageType(&Message{\n\t\tFile: &File{\n\t\t\tPackage: &Package{\n\t\t\t\tName: \"grpc.federation.private\",\n\t\t\t},\n\t\t\tGoPackage: &GoPackage{\n\t\t\t\tName:       \"grpcfedcel\",\n\t\t\t\tImportPath: \"github.com/mercari/grpc-federation/grpc/federation/cel\",\n\t\t\t\tAliasName:  \"grpcfedcel\",\n\t\t\t},\n\t\t},\n\t\tName: \"EnumSelector\",\n\t\tFields: []*Field{\n\t\t\t{Name: \"true\", Type: trueType},\n\t\t\t{Name: \"false\", Type: falseType},\n\t\t},\n\t}, false)\n}\n\nfunc newMessageArgument(msg *Message) *Message {\n\tfile := *msg.File\n\tfile.Package = &Package{\n\t\tName:  file.PrivatePackageName(),\n\t\tFiles: Files{&file},\n\t}\n\treturn &Message{\n\t\tFile: &file,\n\t\tName: strings.Join(append(msg.ParentMessageNames(), msg.Name+\"Argument\"), \"_\"),\n\t}\n}\n\nfunc (m *Message) ParentMessageNames() []string {\n\tif m == nil {\n\t\treturn nil\n\t}\n\tif m.ParentMessage == nil {\n\t\treturn []string{}\n\t}\n\treturn append(m.ParentMessage.ParentMessageNames(), m.ParentMessage.Name)\n}\n\nfunc (m *Message) Package() *Package {\n\tif m == nil {\n\t\treturn nil\n\t}\n\tif m.File == nil {\n\t\treturn nil\n\t}\n\treturn m.File.Package\n}\n\nfunc (m *Message) HasRule() bool {\n\tif m == nil {\n\t\treturn false\n\t}\n\tif m.Rule == nil {\n\t\treturn false\n\t}\n\tif m.HasResolvers() {\n\t\treturn true\n\t}\n\tif m.HasCustomResolver() {\n\t\treturn true\n\t}\n\tif m.HasRuleEveryFields() {\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (m *Message) IsEnumSelector() bool {\n\tif m == nil {\n\t\treturn false\n\t}\n\treturn m.FQDN() == grpcfedcel.EnumSelectorFQDN\n}\n\nfunc (m *Message) HasResolvers() bool {\n\tif m == nil {\n\t\treturn false\n\t}\n\tif m.Rule == nil {\n\t\treturn false\n\t}\n\tif len(m.Rule.DefSet.DefinitionGroups()) != 0 {\n\t\treturn true\n\t}\n\tif len(m.Rule.DefSet.Definitions()) != 0 {\n\t\treturn true\n\t}\n\tfor _, field := range m.Fields {\n\t\tif field.Rule == nil {\n\t\t\tcontinue\n\t\t}\n\t\tif field.Rule.Oneof == nil {\n\t\t\tcontinue\n\t\t}\n\t\tif len(field.Rule.Oneof.DefSet.DefinitionGroups()) != 0 {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (m *Message) VariableDefinitionGroups() []VariableDefinitionGroup {\n\tif m == nil {\n\t\treturn nil\n\t}\n\tif m.Rule == nil {\n\t\treturn nil\n\t}\n\n\tret := m.Rule.DefSet.DefinitionGroups()\n\tfor _, def := range m.Rule.DefSet.Definitions() {\n\t\tif def.Expr == nil {\n\t\t\tcontinue\n\t\t}\n\t\tswitch {\n\t\tcase def.Expr.Call != nil:\n\t\t\tfor _, err := range def.Expr.Call.Errors {\n\t\t\t\tret = append(ret, err.DefinitionGroups()...)\n\t\t\t}\n\t\tcase def.Expr.Switch != nil:\n\t\t\tret = append(ret, def.Expr.Switch.DefinitionGroups()...)\n\t\tcase def.Expr.Validation != nil:\n\t\t\tif def.Expr.Validation.Error != nil {\n\t\t\t\tret = append(ret, def.Expr.Validation.Error.DefinitionGroups()...)\n\t\t\t}\n\t\t}\n\t}\n\tfor _, field := range m.Fields {\n\t\tif field.Rule == nil {\n\t\t\tcontinue\n\t\t}\n\t\tif field.Rule.Oneof == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, field.Rule.Oneof.DefSet.DefinitionGroups()...)\n\t}\n\treturn ret\n}\n\nfunc (m *Message) AllVariableDefinitions() VariableDefinitions {\n\tif m == nil {\n\t\treturn nil\n\t}\n\tif m.Rule == nil {\n\t\treturn nil\n\t}\n\n\tdefs := m.Rule.DefSet.Definitions()\n\tret := defs\n\tfor _, def := range defs {\n\t\tif def.Expr == nil {\n\t\t\tcontinue\n\t\t}\n\t\tswitch {\n\t\tcase def.Expr.Call != nil:\n\t\t\tfor _, err := range def.Expr.Call.Errors {\n\t\t\t\tret = append(ret, err.Definitions()...)\n\t\t\t}\n\t\tcase def.Expr.Validation != nil:\n\t\t\tif def.Expr.Validation.Error != nil {\n\t\t\t\tret = append(ret, def.Expr.Validation.Error.Definitions()...)\n\t\t\t}\n\t\t}\n\t}\n\tfor _, field := range m.Fields {\n\t\tif field.Rule == nil {\n\t\t\tcontinue\n\t\t}\n\t\tif field.Rule.Oneof == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, field.Rule.Oneof.DefSet.Definitions()...)\n\t}\n\treturn ret\n}\n\nfunc (m *Message) HasCELValue() bool {\n\tif m == nil {\n\t\treturn false\n\t}\n\tif m.Rule == nil {\n\t\treturn false\n\t}\n\tfor _, varDef := range m.Rule.DefSet.Definitions() {\n\t\tif varDef.Expr == nil {\n\t\t\tcontinue\n\t\t}\n\t\texpr := varDef.Expr\n\t\tswitch {\n\t\tcase expr.By != nil:\n\t\t\treturn true\n\t\tcase expr.Call != nil:\n\t\t\tif expr.Call.Request != nil {\n\t\t\t\tfor _, arg := range expr.Call.Request.Args {\n\t\t\t\t\tif arg.Value != nil && arg.Value.CEL != nil {\n\t\t\t\t\t\treturn true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\tcase expr.Message != nil:\n\t\t\tfor _, arg := range expr.Message.Args {\n\t\t\t\tif arg.Value != nil && arg.Value.CEL != nil {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t}\n\t\tcase expr.Validation != nil:\n\t\t\treturn true\n\t\t}\n\t}\n\tfor _, field := range m.Fields {\n\t\tif field.Rule == nil {\n\t\t\tcontinue\n\t\t}\n\t\tvalue := field.Rule.Value\n\t\tif value != nil && value.CEL != nil {\n\t\t\treturn true\n\t\t}\n\t\tif field.Rule.Oneof != nil && field.Rule.Oneof.If != nil {\n\t\t\treturn true\n\t\t}\n\t\tif field.Rule.Oneof != nil && field.Rule.Oneof.By != nil {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (m *Message) HasCustomResolver() bool {\n\tif m == nil {\n\t\treturn false\n\t}\n\n\treturn m.Rule != nil && m.Rule.CustomResolver\n}\n\nfunc (m *Message) HasRuleEveryFields() bool {\n\tif m == nil {\n\t\treturn false\n\t}\n\n\tfor _, field := range m.Fields {\n\t\tif !field.HasRule() {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\nfunc (m *Message) HasCustomResolverFields() bool {\n\tif m == nil {\n\t\treturn false\n\t}\n\n\treturn len(m.CustomResolverFields()) != 0\n}\n\nfunc (m *Message) UseAllNameReference() {\n\tif m == nil {\n\t\treturn\n\t}\n\n\tif m.Rule == nil {\n\t\treturn\n\t}\n\tfor _, varDef := range m.Rule.DefSet.Definitions() {\n\t\tif varDef.Name == \"\" {\n\t\t\tcontinue\n\t\t}\n\t\t// Validation results won't be referenced\n\t\tif varDef.Expr.Validation != nil {\n\t\t\tcontinue\n\t\t}\n\t\tvarDef.Used = true\n\t}\n}\n\nfunc (e *MessageExpr) ReferenceNames() []string {\n\tif e == nil {\n\t\treturn nil\n\t}\n\n\tvar refNames []string\n\tfor _, arg := range e.Args {\n\t\trefNames = append(refNames, arg.Value.ReferenceNames()...)\n\t}\n\treturn refNames\n}\n\nfunc (m *Message) ReferenceNames() []string {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tif m.Rule == nil {\n\t\treturn nil\n\t}\n\n\trule := m.Rule\n\trefNames := rule.DefSet.ReferenceNames()\n\tfor _, field := range m.Fields {\n\t\tif !field.HasRule() {\n\t\t\tcontinue\n\t\t}\n\t\trefNames = append(refNames, field.Rule.Value.ReferenceNames()...)\n\t\tif field.Rule.Oneof != nil {\n\t\t\trefNames = append(refNames, field.Rule.Oneof.If.ReferenceNames()...)\n\t\t}\n\t}\n\treturn refNames\n}\n\nfunc (m *Message) CustomResolverFields() []*Field {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tfields := make([]*Field, 0, len(m.Fields))\n\tfor _, field := range m.Fields {\n\t\tif field.HasCustomResolver() {\n\t\t\tfields = append(fields, field)\n\t\t}\n\t}\n\treturn fields\n}\n\nfunc (m *Message) GoPackage() *GoPackage {\n\tif m == nil {\n\t\treturn nil\n\t}\n\tif m.File == nil {\n\t\treturn nil\n\t}\n\treturn m.File.GoPackage\n}\n\nfunc (m *Message) PackageName() string {\n\tif m == nil {\n\t\treturn \"\"\n\t}\n\tpkg := m.Package()\n\tif pkg == nil {\n\t\treturn \"\"\n\t}\n\treturn pkg.Name\n}\n\nfunc (m *Message) FileName() string {\n\tif m == nil {\n\t\treturn \"\"\n\t}\n\tif m.File == nil {\n\t\treturn \"\"\n\t}\n\treturn m.File.Name\n}\n\nfunc (m *Message) HasField(name string) bool {\n\tif m == nil {\n\t\treturn false\n\t}\n\n\treturn m.Field(name) != nil\n}\n\nfunc (m *Message) Field(name string) *Field {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tfor _, field := range m.Fields {\n\t\tif field.Name == name {\n\t\t\treturn field\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (m *Message) Oneof(name string) *Oneof {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tfor _, field := range m.Fields {\n\t\tif field.Oneof == nil {\n\t\t\tcontinue\n\t\t}\n\t\tif field.Oneof.Name == name {\n\t\t\treturn field.Oneof\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (m *Message) AllMessages() []*Message {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tret := []*Message{m}\n\tfor _, msg := range m.NestedMessages {\n\t\tret = append(ret, msg.AllMessages()...)\n\t}\n\treturn ret\n}\n\nfunc (m *Message) AllEnums() []*Enum {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tenums := m.Enums\n\tfor _, msg := range m.NestedMessages {\n\t\tenums = append(enums, msg.AllEnums()...)\n\t}\n\treturn enums\n}\n\nfunc (m *Message) HasFieldRule() bool {\n\tif m == nil {\n\t\treturn false\n\t}\n\n\tfor _, field := range m.Fields {\n\t\tif field.HasRule() {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (m *Message) DependencyGraphTreeFormat() string {\n\tif m == nil {\n\t\treturn \"\"\n\t}\n\tif m.Rule == nil {\n\t\treturn \"\"\n\t}\n\treturn DependencyGraphTreeFormat(m.Rule.DefSet.DefinitionGroups())\n}\n\nfunc (m *Message) TypeConversionDecls() []*TypeConversionDecl {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tconvertedFQDNMap := make(map[string]struct{})\n\tvar decls []*TypeConversionDecl\n\tfor _, def := range m.AllVariableDefinitions() {\n\t\tif def.Expr == nil {\n\t\t\tcontinue\n\t\t}\n\t\tswitch {\n\t\tcase def.Expr.Call != nil:\n\t\t\tcallExpr := def.Expr.Call\n\t\t\tif callExpr.Request != nil {\n\t\t\t\trequest := callExpr.Request\n\t\t\t\tfor _, arg := range request.Args {\n\t\t\t\t\tif !request.Type.HasField(arg.Name) {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tfromType := arg.Value.Type()\n\t\t\t\t\tfield := request.Type.Field(arg.Name)\n\t\t\t\t\ttoType := field.Type\n\t\t\t\t\tif toType.OneofField != nil {\n\t\t\t\t\t\ttoType = field.Type.OneofField.Type.Clone()\n\t\t\t\t\t\ttoType.OneofField = nil\n\t\t\t\t\t}\n\t\t\t\t\tdecls = append(decls, typeConversionDecls(fromType, toType, convertedFQDNMap)...)\n\t\t\t\t}\n\t\t\t}\n\t\tcase def.Expr.Message != nil:\n\t\t\t// For numeric types, the specification allows accepting them even if the type of the message argument differs.\n\t\t\t// In such cases, since the actual message argument type may differ, additional type conversion is necessary.\n\t\t\tmsgExpr := def.Expr.Message\n\t\t\tif msgExpr.Message != nil && msgExpr.Message.Rule != nil {\n\t\t\t\tmsgArg := msgExpr.Message.Rule.MessageArgument\n\t\t\t\tfor _, arg := range msgExpr.Args {\n\t\t\t\t\tswitch {\n\t\t\t\t\tcase arg.Name != \"\":\n\t\t\t\t\t\tmsgArgField := msgArg.Field(arg.Name)\n\t\t\t\t\t\tdecls = append(decls, typeConversionDecls(arg.Value.Type(), msgArgField.Type, convertedFQDNMap)...)\n\t\t\t\t\tcase arg.Value != nil && arg.Value.Inline:\n\t\t\t\t\t\tfor _, field := range arg.Value.CEL.Out.Message.Fields {\n\t\t\t\t\t\t\tmsgArgField := msgArg.Field(field.Name)\n\t\t\t\t\t\t\tdecls = append(decls, typeConversionDecls(field.Type, msgArgField.Type, convertedFQDNMap)...)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\tcase def.Expr.Enum != nil:\n\t\t\tenumExpr := def.Expr.Enum\n\t\t\tdecls = append(decls, typeConversionDecls(enumExpr.By.Out, def.Expr.Type, convertedFQDNMap)...)\n\t\tcase def.Expr.Map != nil:\n\t\t\tmapExpr := def.Expr.Map.Expr\n\t\t\tswitch {\n\t\t\tcase mapExpr.Message != nil:\n\t\t\t\tmsgExpr := mapExpr.Message\n\t\t\t\tif msgExpr.Message != nil && msgExpr.Message.Rule != nil {\n\t\t\t\t\tmsgArg := msgExpr.Message.Rule.MessageArgument\n\t\t\t\t\tfor _, arg := range msgExpr.Args {\n\t\t\t\t\t\tswitch {\n\t\t\t\t\t\tcase arg.Name != \"\":\n\t\t\t\t\t\t\tmsgArgField := msgArg.Field(arg.Name)\n\t\t\t\t\t\t\tdecls = append(decls, typeConversionDecls(arg.Value.Type(), msgArgField.Type, convertedFQDNMap)...)\n\t\t\t\t\t\tcase arg.Value != nil && arg.Value.Inline:\n\t\t\t\t\t\t\tfor _, field := range arg.Value.CEL.Out.Message.Fields {\n\t\t\t\t\t\t\t\tmsgArgField := msgArg.Field(field.Name)\n\t\t\t\t\t\t\t\tdecls = append(decls, typeConversionDecls(field.Type, msgArgField.Type, convertedFQDNMap)...)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\tcase mapExpr.Enum != nil:\n\t\t\t\tfrom := mapExpr.Enum.By.Out.Clone()\n\t\t\t\tfrom.Repeated = true\n\t\t\t\tdecls = append(decls, typeConversionDecls(from, def.Expr.Type, convertedFQDNMap)...)\n\t\t\t}\n\t\t}\n\t}\n\tfor _, field := range m.Fields {\n\t\tdecls = append(decls, field.typeConversionDecls(convertedFQDNMap)...)\n\t}\n\tuniqueDecls := uniqueTypeConversionDecls(decls)\n\treturn sortTypeConversionDecls(uniqueDecls)\n}\n\nfunc (m *Message) CustomResolvers() []*CustomResolver {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar ret []*CustomResolver\n\tif m.HasCustomResolver() {\n\t\tret = append(ret, &CustomResolver{Message: m})\n\t}\n\tfor _, field := range m.Fields {\n\t\tif field.HasCustomResolver() {\n\t\t\tret = append(ret, &CustomResolver{\n\t\t\t\tMessage: m,\n\t\t\t\tField:   field,\n\t\t\t})\n\t\t}\n\t}\n\tif m.Rule != nil {\n\t\tfor _, group := range m.Rule.DefSet.DefinitionGroups() {\n\t\t\tfor _, def := range group.VariableDefinitions() {\n\t\t\t\tret = append(ret, m.customResolvers(def)...)\n\t\t\t}\n\t\t}\n\t}\n\treturn ret\n}\n\nfunc (m *Message) customResolvers(def *VariableDefinition) []*CustomResolver {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tvar ret []*CustomResolver\n\tif def != nil {\n\t\tfor _, expr := range def.MessageExprs() {\n\t\t\tif expr.Message == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tret = append(ret, expr.Message.CustomResolvers()...)\n\t\t}\n\t}\n\treturn ret\n}\n\nfunc (m *Message) GoPackageDependencies() []*GoPackage {\n\tif m == nil {\n\t\treturn nil\n\t}\n\n\tpkgMap := map[*GoPackage]struct{}{}\n\tgopkg := m.GoPackage()\n\tpkgMap[gopkg] = struct{}{}\n\tfor _, svc := range m.DependServices() {\n\t\tpkgMap[svc.GoPackage()] = struct{}{}\n\t}\n\tseenMsgMap := make(map[*Message]struct{})\n\tfor _, field := range m.Fields {\n\t\tif field.Type.Message == nil {\n\t\t\tcontinue\n\t\t}\n\t\tfor _, gopkg := range getGoPackageDependencies(gopkg, field.Type.Message, seenMsgMap) {\n\t\t\tpkgMap[gopkg] = struct{}{}\n\t\t}\n\t}\n\tpkgs := make([]*GoPackage, 0, len(pkgMap))\n\tfor pkg := range pkgMap {\n\t\tpkgs = append(pkgs, pkg)\n\t}\n\treturn pkgs\n}\n\nfunc getGoPackageDependencies(base *GoPackage, msg *Message, seenMsgMap map[*Message]struct{}) []*GoPackage {\n\tvar ret []*GoPackage\n\tif base != msg.GoPackage() {\n\t\tret = append(ret, msg.GoPackage())\n\t}\n\tseenMsgMap[msg] = struct{}{}\n\tfor _, field := range msg.Fields {\n\t\tif field.Type.Message == nil {\n\t\t\tcontinue\n\t\t}\n\t\tif _, exists := seenMsgMap[field.Type.Message]; exists {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, getGoPackageDependencies(base, field.Type.Message, seenMsgMap)...)\n\t}\n\tfor _, m := range msg.NestedMessages {\n\t\tret = append(ret, getGoPackageDependencies(base, m, seenMsgMap)...)\n\t}\n\treturn ret\n}\n\nfunc (m *Message) DependServices() []*Service {\n\tif m == nil {\n\t\treturn nil\n\t}\n\tsvcMap := make(map[*Service]struct{})\n\tfor _, mtd := range m.dependMethods(make(map[*VariableDefinition]struct{})) {\n\t\tsvcMap[mtd.Service] = struct{}{}\n\t}\n\tsvcs := make([]*Service, 0, len(svcMap))\n\tfor svc := range svcMap {\n\t\tsvcs = append(svcs, svc)\n\t}\n\tsort.Slice(svcs, func(i, j int) bool {\n\t\treturn svcs[i].FQDN() < svcs[j].FQDN()\n\t})\n\treturn svcs\n}\n\nfunc (m *Message) DependMethods() []*Method {\n\tif m == nil {\n\t\treturn nil\n\t}\n\tmtdMap := make(map[*Method]struct{})\n\tfor _, mtd := range m.dependMethods(make(map[*VariableDefinition]struct{})) {\n\t\tmtdMap[mtd] = struct{}{}\n\t}\n\tmtds := make([]*Method, 0, len(mtdMap))\n\tfor mtd := range mtdMap {\n\t\tmtds = append(mtds, mtd)\n\t}\n\tsort.Slice(mtds, func(i, j int) bool {\n\t\treturn mtds[i].FQDN() < mtds[j].FQDN()\n\t})\n\treturn mtds\n}\n\nfunc (m *Message) dependMethods(defMap map[*VariableDefinition]struct{}) []*Method {\n\tif m == nil {\n\t\treturn nil\n\t}\n\tvar mtds []*Method\n\tfor _, def := range m.AllVariableDefinitions() {\n\t\tif def == nil {\n\t\t\tcontinue\n\t\t}\n\t\tif _, exists := defMap[def]; exists {\n\t\t\tcontinue\n\t\t}\n\t\tdefMap[def] = struct{}{}\n\t\texpr := def.Expr\n\t\tif expr == nil {\n\t\t\tcontinue\n\t\t}\n\t\tif expr.Call != nil {\n\t\t\tmtds = append(mtds, expr.Call.Method)\n\t\t} else {\n\t\t\tfor _, msgExpr := range def.MessageExprs() {\n\t\t\t\tif msgExpr.Message != nil {\n\t\t\t\t\tmtds = append(mtds, msgExpr.Message.dependMethods(defMap)...)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn mtds\n}\n"
  },
  {
    "path": "resolver/method.go",
    "content": "package resolver\n\nfunc (m *Method) FederationResponse() *Message {\n\tif m.Rule != nil && m.Rule.Response != nil {\n\t\treturn m.Rule.Response\n\t}\n\treturn m.Response\n}\n"
  },
  {
    "path": "resolver/oneof.go",
    "content": "package resolver\n\nimport (\n\t\"github.com/mercari/grpc-federation/types\"\n\t\"github.com/mercari/grpc-federation/util\"\n)\n\nfunc (oneof *Oneof) IsSameType() bool {\n\tif len(oneof.Fields) == 0 {\n\t\treturn false\n\t}\n\tvar prevType *Type\n\tfor _, field := range oneof.Fields {\n\t\tfieldType := field.Type\n\t\tif prevType == nil {\n\t\t\tprevType = fieldType\n\t\t}\n\t\tif prevType.Kind != fieldType.Kind {\n\t\t\treturn false\n\t\t}\n\t\tswitch fieldType.Kind {\n\t\tcase types.Message:\n\t\t\tif prevType.Message != fieldType.Message {\n\t\t\t\treturn false\n\t\t\t}\n\t\tcase types.Enum:\n\t\t\tif prevType.Enum != fieldType.Enum {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t\tprevType = fieldType\n\t}\n\treturn true\n}\n\nfunc (f *OneofField) IsConflict() bool {\n\tmsg := f.Oneof.Message\n\tfieldName := util.ToPublicGoVariable(f.Name)\n\tfor _, m := range msg.NestedMessages {\n\t\tif util.ToPublicGoVariable(m.Name) == fieldName {\n\t\t\treturn true\n\t\t}\n\t}\n\tfor _, e := range msg.Enums {\n\t\tif util.ToPublicGoVariable(e.Name) == fieldName {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n"
  },
  {
    "path": "resolver/resolver.go",
    "content": "package resolver\n\nimport (\n\tpkgcontext \"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"maps\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"slices\"\n\t\"sort\"\n\t\"strings\"\n\t\"time\"\n\t\"unicode\"\n\n\t\"github.com/google/cel-go/cel\"\n\t\"github.com/google/cel-go/common/operators\"\n\t\"github.com/google/cel-go/common/overloads\"\n\tceltypes \"github.com/google/cel-go/common/types\"\n\t\"github.com/google/cel-go/common/types/ref\"\n\t\"github.com/google/cel-go/ext\"\n\t\"golang.org/x/text/cases\"\n\t\"golang.org/x/text/language\"\n\t\"google.golang.org/genproto/googleapis/rpc/errdetails\"\n\t\"google.golang.org/protobuf/proto\"\n\t\"google.golang.org/protobuf/reflect/protoreflect\"\n\t\"google.golang.org/protobuf/types/descriptorpb\"\n\n\t\"github.com/mercari/grpc-federation/compiler\"\n\t\"github.com/mercari/grpc-federation/grpc/federation\"\n\tgrpcfedcel \"github.com/mercari/grpc-federation/grpc/federation/cel\"\n\t\"github.com/mercari/grpc-federation/source\"\n\t\"github.com/mercari/grpc-federation/types\"\n)\n\ntype Resolver struct {\n\tfiles                      []*descriptorpb.FileDescriptorProto\n\timportPaths                []string\n\tcompiler                   *compiler.Compiler\n\tcelRegistry                *CELRegistry\n\tdefToFileMap               map[*descriptorpb.FileDescriptorProto]*File\n\tfileNameToDefMap           map[string]*descriptorpb.FileDescriptorProto\n\tprotoPackageNameToFileDefs map[string][]*descriptorpb.FileDescriptorProto\n\tprotoPackageNameToPackage  map[string]*Package\n\n\tserviceToRuleMap   map[*Service]*federation.ServiceRule\n\tmethodToRuleMap    map[*Method]*federation.MethodRule\n\tmessageToRuleMap   map[*Message]*federation.MessageRule\n\tenumToRuleMap      map[*Enum]*federation.EnumRule\n\tenumValueToRuleMap map[*EnumValue]*federation.EnumValueRule\n\tfieldToRuleMap     map[*Field]*federation.FieldRule\n\toneofToRuleMap     map[*Oneof]*federation.OneofRule\n\n\tcachedFileMap              map[string]*File\n\tcachedMessageMap           map[string]*Message\n\tcachedEnumMap              map[string]*Enum\n\tcachedEnumValueMap         map[string]*EnumValue\n\tcachedMethodMap            map[string]*Method\n\tcachedServiceMap           map[string]*Service\n\tcachedFileAllEnumMap       map[string][]*Enum\n\tcachedEnumAccessorMap      map[string][]cel.EnvOption\n\tcachedGRPCErrorAccessorMap map[string][]cel.EnvOption\n}\n\ntype Option func(*option)\n\ntype option struct {\n\timportPaths []string\n}\n\nfunc ImportPathOption(paths ...string) Option {\n\treturn func(o *option) {\n\t\to.importPaths = paths\n\t}\n}\n\nfunc New(files []*descriptorpb.FileDescriptorProto, opts ...Option) *Resolver {\n\tvar opt option\n\tfor _, o := range opts {\n\t\to(&opt)\n\t}\n\t// Resolving `grpc.federation.file.import` rule rewrites dependencies, so clones files to avoid affecting other processes.\n\tfiles = cloneFileDefs(files)\n\tmsgMap := make(map[string]*Message)\n\tenumValueMap := make(map[string]*EnumValue)\n\tcelRegistry := newCELRegistry(msgMap, enumValueMap)\n\treturn &Resolver{\n\t\tfiles:                      files,\n\t\timportPaths:                opt.importPaths,\n\t\tcompiler:                   compiler.New(),\n\t\tcelRegistry:                celRegistry,\n\t\tdefToFileMap:               make(map[*descriptorpb.FileDescriptorProto]*File),\n\t\tfileNameToDefMap:           make(map[string]*descriptorpb.FileDescriptorProto),\n\t\tprotoPackageNameToFileDefs: make(map[string][]*descriptorpb.FileDescriptorProto),\n\t\tprotoPackageNameToPackage:  make(map[string]*Package),\n\n\t\tserviceToRuleMap:   make(map[*Service]*federation.ServiceRule),\n\t\tmethodToRuleMap:    make(map[*Method]*federation.MethodRule),\n\t\tmessageToRuleMap:   make(map[*Message]*federation.MessageRule),\n\t\tenumToRuleMap:      make(map[*Enum]*federation.EnumRule),\n\t\tenumValueToRuleMap: make(map[*EnumValue]*federation.EnumValueRule),\n\t\tfieldToRuleMap:     make(map[*Field]*federation.FieldRule),\n\t\toneofToRuleMap:     make(map[*Oneof]*federation.OneofRule),\n\n\t\tcachedFileMap:              make(map[string]*File),\n\t\tcachedMessageMap:           msgMap,\n\t\tcachedEnumMap:              make(map[string]*Enum),\n\t\tcachedEnumValueMap:         enumValueMap,\n\t\tcachedMethodMap:            make(map[string]*Method),\n\t\tcachedServiceMap:           make(map[string]*Service),\n\t\tcachedFileAllEnumMap:       make(map[string][]*Enum),\n\t\tcachedEnumAccessorMap:      make(map[string][]cel.EnvOption),\n\t\tcachedGRPCErrorAccessorMap: make(map[string][]cel.EnvOption),\n\t}\n}\n\nfunc cloneFileDefs(files []*descriptorpb.FileDescriptorProto) []*descriptorpb.FileDescriptorProto {\n\to := make([]*descriptorpb.FileDescriptorProto, 0, len(files))\n\tfor _, fileDef := range files {\n\t\to = append(o, proto.Clone(fileDef).(*descriptorpb.FileDescriptorProto))\n\t}\n\treturn o\n}\n\n// Result of resolver processing.\ntype Result struct {\n\t// Files list of files with services with the grpc.federation.service option.\n\tFiles []*File\n\t// Warnings all warnings occurred during the resolve process.\n\tWarnings []*Warning\n}\n\n// Warning represents what should be warned that is not an error that occurred during the Resolver.Resolve().\ntype Warning struct {\n\tLocation *source.Location\n\tMessage  string\n}\n\nfunc (r *Resolver) ResolveWellknownFiles() (Files, error) {\n\tctx := newContext()\n\n\tfds := stdFileDescriptors()\n\tr.resolvePackageAndFileReference(ctx, fds)\n\n\tfiles := make([]*File, 0, len(fds))\n\tfor _, fileDef := range fds {\n\t\tfiles = append(files, r.resolveFile(ctx, fileDef, source.NewLocationBuilder(fileDef.GetName())))\n\t}\n\treturn files, ctx.error()\n}\n\nfunc (r *Resolver) Resolve() (*Result, error) {\n\t// In order to return multiple errors with source code location information,\n\t// we add all errors to the context when they occur.\n\t// Therefore, functions called from Resolve() do not return errors directly.\n\t// Instead, it must return all errors captured by context in ctx.error().\n\tctx := newContext()\n\n\tr.resolvePackageAndFileReference(ctx, r.files)\n\tr.resolveFileImportRule(ctx, r.files)\n\tif err := ctx.error(); err != nil {\n\t\treturn nil, err\n\t}\n\n\tif err := r.celRegistry.RegisterFiles(r.files...); err != nil {\n\t\treturn nil, err\n\t}\n\n\tfiles := r.resolveFiles(ctx)\n\n\tr.resolveRule(ctx, files)\n\n\tif !r.existsServiceRule(files) {\n\t\treturn &Result{Warnings: ctx.warnings()}, ctx.error()\n\t}\n\n\tr.resolveMessageArgument(ctx, files)\n\tr.resolveAutoBind(ctx, files)\n\tr.resolveMessageDependencies(ctx, files)\n\n\tr.validateFiles(ctx, files)\n\n\tresultFiles := r.resultFiles(files)\n\treturn &Result{\n\t\tFiles:    resultFiles,\n\t\tWarnings: ctx.warnings(),\n\t}, ctx.error()\n}\n\n// resolvePackageAndFileReference create instances of Package and File to be used inside the resolver from all file descriptor and link them together.\n// This process must always be done at the beginning of the Resolve().\nfunc (r *Resolver) resolvePackageAndFileReference(ctx *context, files []*descriptorpb.FileDescriptorProto) {\n\tfor _, fileDef := range files {\n\t\tif _, exists := r.defToFileMap[fileDef]; exists {\n\t\t\tcontinue\n\t\t}\n\t\tprotoPackageName := fileDef.GetPackage()\n\t\tpkg, exists := r.protoPackageNameToPackage[protoPackageName]\n\t\tif !exists {\n\t\t\tpkg = &Package{Name: fileDef.GetPackage()}\n\t\t}\n\t\tfile := &File{Name: fileDef.GetName()}\n\t\tgopkg, err := ResolveGoPackage(fileDef)\n\t\tif err != nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\terr.Error(),\n\t\t\t\t\tsource.NewLocationBuilder(fileDef.GetName()).WithGoPackage().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t} else {\n\t\t\tfile.GoPackage = gopkg\n\t\t}\n\t\tfile.Package = pkg\n\t\tfile.Desc = fileDef\n\t\tpkg.Files = append(pkg.Files, file)\n\n\t\tr.defToFileMap[fileDef] = file\n\t\tr.fileNameToDefMap[fileDef.GetName()] = fileDef\n\t\tr.protoPackageNameToFileDefs[protoPackageName] = append(\n\t\t\tr.protoPackageNameToFileDefs[protoPackageName],\n\t\t\tfileDef,\n\t\t)\n\t\tr.protoPackageNameToPackage[protoPackageName] = pkg\n\t}\n}\n\nfunc (r *Resolver) resolveFileImportRule(ctx *context, files []*descriptorpb.FileDescriptorProto) {\n\timportFileDefs := r.resolveFileImportRuleRecursive(ctx, files)\n\n\tnewFileDefs := make([]*descriptorpb.FileDescriptorProto, 0, len(importFileDefs))\n\timportFileDefsMap := map[string]struct{}{}\n\tfor _, f := range importFileDefs {\n\t\tif _, exists := importFileDefsMap[f.GetName()]; exists {\n\t\t\tcontinue\n\t\t}\n\t\timportFileDefsMap[f.GetName()] = struct{}{}\n\t\tnewFileDefs = append(newFileDefs, f)\n\t}\n\n\tr.resolvePackageAndFileReference(ctx, newFileDefs)\n\n\tfilesMap := map[string]struct{}{}\n\tfor _, fileDef := range r.files {\n\t\tfilesMap[fileDef.GetName()] = struct{}{}\n\t}\n\t// Place import files before the source file\n\tslices.Reverse(newFileDefs)\n\tfor _, fileDef := range newFileDefs {\n\t\tif _, exists := filesMap[fileDef.GetName()]; exists {\n\t\t\tcontinue\n\t\t}\n\t\tr.files = append([]*descriptorpb.FileDescriptorProto{fileDef}, r.files...)\n\t\tfilesMap[fileDef.GetName()] = struct{}{}\n\t}\n}\n\nfunc (r *Resolver) resolveFileImportRuleRecursive(ctx *context, files []*descriptorpb.FileDescriptorProto) []*descriptorpb.FileDescriptorProto {\n\tvar importFileDefs []*descriptorpb.FileDescriptorProto\n\tfor _, fileDef := range files {\n\t\truleDef, err := getExtensionRule[*federation.FileRule](fileDef.GetOptions(), federation.E_File)\n\t\tif err != nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\terr.Error(),\n\t\t\t\t\tsource.NewLocationBuilder(fileDef.GetName()).Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t\tcontinue\n\t\t}\n\t\tif ruleDef == nil {\n\t\t\tcontinue\n\t\t}\n\n\t\tdepMap := map[string]struct{}{}\n\t\tfor _, dep := range fileDef.Dependency {\n\t\t\tdepMap[dep] = struct{}{}\n\t\t}\n\t\tfor _, path := range ruleDef.GetImport() {\n\t\t\tif _, exists := depMap[path]; exists {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tfileDefs, err := r.compileProto(pkgcontext.Background(), path)\n\t\t\tif err != nil {\n\t\t\t\tctx.addError(\n\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\terr.Error(),\n\t\t\t\t\t\tsource.NewLocationBuilder(fileDef.GetName()).WithImportName(path).Location(),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}\n\t\t\tdeps := make([]*descriptorpb.FileDescriptorProto, 0, len(fileDefs))\n\t\t\tfor _, def := range fileDefs {\n\t\t\t\t// If a reference to a descriptorpb.FileDescriptorProto has already been registered map,\n\t\t\t\t// the reference is used to refer to the same instance.\n\t\t\t\tif dep, exists := r.fileNameToDefMap[def.GetName()]; exists {\n\t\t\t\t\tdeps = append(deps, dep)\n\t\t\t\t} else {\n\t\t\t\t\tdeps = append(deps, def)\n\t\t\t\t\tr.fileNameToDefMap[def.GetName()] = def\n\t\t\t\t}\n\t\t\t}\n\t\t\timportFileDefs = append(importFileDefs, deps...)\n\t\t\tfileDef.Dependency = append(fileDef.Dependency, path)\n\t\t}\n\t}\n\tif len(importFileDefs) == 0 {\n\t\treturn nil\n\t}\n\treturn append(importFileDefs, r.resolveFileImportRuleRecursive(ctx, importFileDefs)...)\n}\n\nfunc (r *Resolver) compileProto(ctx pkgcontext.Context, path string) ([]*descriptorpb.FileDescriptorProto, error) {\n\tprotoPath, err := r.findProto(path)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcontent, err := os.ReadFile(protoPath)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tfile, err := source.NewFile(protoPath, content)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tfileDefs, err := r.compiler.Compile(ctx, file, compiler.ImportPathOption(r.importPaths...))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn fileDefs, nil\n}\n\nfunc (r *Resolver) findProto(path string) (string, error) {\n\tprotoPaths := make([]string, 0, len(r.importPaths)+1)\n\tfor _, importPath := range r.importPaths {\n\t\tprotoPaths = append(protoPaths, filepath.Join(importPath, path))\n\t}\n\tprotoPaths = append(protoPaths, path)\n\n\tfor _, protoPath := range protoPaths {\n\t\tif _, err := os.Stat(protoPath); os.IsNotExist(err) {\n\t\t\tcontinue\n\t\t} else if err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\treturn protoPath, nil\n\t}\n\treturn \"\", fmt.Errorf(\"%s: no such file or directory\", path)\n}\n\n// resolveFiles resolve all references except custom option.\nfunc (r *Resolver) resolveFiles(ctx *context) []*File {\n\tfiles := make([]*File, 0, len(r.files))\n\tfor _, fileDef := range r.files {\n\t\tfiles = append(files, r.resolveFile(ctx, fileDef, source.NewLocationBuilder(fileDef.GetName())))\n\t}\n\treturn files\n}\n\nfunc ResolveGoPackage(def *descriptorpb.FileDescriptorProto) (*GoPackage, error) {\n\topts := def.GetOptions()\n\tif opts == nil {\n\t\treturn nil, nil\n\t}\n\timportPath, gopkgName, err := splitGoPackageName(opts.GetGoPackage())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &GoPackage{\n\t\tName:       gopkgName,\n\t\tImportPath: importPath,\n\t}, nil\n}\n\nfunc (r *Resolver) existsServiceRule(files []*File) bool {\n\tfor _, file := range files {\n\t\tfor _, service := range file.Services {\n\t\t\tif service.Rule != nil {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (r *Resolver) allMessages(files []*File) []*Message {\n\tmsgs := make([]*Message, 0, len(r.cachedMessageMap))\n\tfor _, file := range files {\n\t\tfor _, msg := range file.Messages {\n\t\t\tmsgs = append(msgs, msg.AllMessages()...)\n\t\t}\n\t}\n\treturn msgs\n}\n\nfunc (r *Resolver) validateFiles(ctx *context, files []*File) {\n\tfor _, file := range files {\n\t\tctx := ctx.withFile(file)\n\t\tr.validateFileImport(ctx, file)\n\n\t\tfor _, svc := range file.Services {\n\t\t\tr.validateService(ctx, svc)\n\t\t}\n\t}\n}\n\nfunc (r *Resolver) validateFileImport(ctx *context, file *File) {\n\tpkgNameUsedInProtoMap := r.lookupPackageNameMapUsedInProtoDefinitionFromFile(ctx, file)\n\tpkgNameUsedInGrpcFedMap := r.lookupPackageNameMapUsedInGRPCFederationDefinitionFromFile(ctx, file)\n\truleDef, err := getExtensionRule[*federation.FileRule](file.Desc.GetOptions(), federation.E_File)\n\tif err != nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\terr.Error(),\n\t\t\t\tsource.NewLocationBuilder(file.Desc.GetName()).Location(),\n\t\t\t),\n\t\t)\n\t\treturn\n\t}\n\tgrpcFedFileImports := map[string]struct{}{}\n\tif ruleDef != nil {\n\t\tfor _, path := range ruleDef.GetImport() {\n\t\t\tgrpcFedFileImports[path] = struct{}{}\n\t\t}\n\t}\n\n\tfor _, importFile := range file.ImportFiles {\n\t\tif _, imported := grpcFedFileImports[importFile.Name]; imported {\n\t\t\tif _, used := pkgNameUsedInGrpcFedMap[importFile.PackageName()]; !used {\n\t\t\t\tctx.addWarning(WarnWithLocation(\n\t\t\t\t\tfmt.Sprintf(\"Import %s is unused for the definition of grpc federation.\", importFile.Name),\n\t\t\t\t\tsource.NewLocationBuilder(file.Desc.GetName()).WithImportName(importFile.Name).Location(),\n\t\t\t\t))\n\t\t\t}\n\t\t} else {\n\t\t\tif _, used := pkgNameUsedInProtoMap[importFile.PackageName()]; used {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif _, used := pkgNameUsedInGrpcFedMap[importFile.PackageName()]; used {\n\t\t\t\tctx.addWarning(WarnWithLocation(\n\t\t\t\t\tfmt.Sprintf(\"Import %s is used only for the definition of grpc federation. You can use grpc.federation.file.import instead.\", importFile.Name),\n\t\t\t\t\tsource.NewLocationBuilder(file.Desc.GetName()).WithImportName(importFile.Name).Location(),\n\t\t\t\t))\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (r *Resolver) lookupPackageNameMapUsedInProtoDefinitionFromFile(ctx *context, file *File) map[string]struct{} {\n\tpkgNameMap := map[string]struct{}{}\n\tfor _, s := range file.Services {\n\t\tif opt := s.Desc.GetOptions(); opt != nil {\n\t\t\topt.ProtoReflect().Range(func(fd protoreflect.FieldDescriptor, val protoreflect.Value) bool {\n\t\t\t\tpkgNameMap[string(fd.ParentFile().Package())] = struct{}{}\n\t\t\t\treturn true\n\t\t\t})\n\t\t}\n\n\t\tfor _, m := range s.Methods {\n\t\t\tif opt := m.Desc.GetOptions(); opt != nil {\n\t\t\t\topt.ProtoReflect().Range(func(fd protoreflect.FieldDescriptor, val protoreflect.Value) bool {\n\t\t\t\t\tpkgNameMap[string(fd.ParentFile().Package())] = struct{}{}\n\t\t\t\t\treturn true\n\t\t\t\t})\n\t\t\t}\n\t\t\tpkgNameMap[m.Request.PackageName()] = struct{}{}\n\t\t\tpkgNameMap[m.Response.PackageName()] = struct{}{}\n\t\t}\n\t}\n\n\tfor _, msg := range file.Messages {\n\t\tctx := ctx.withMessage(msg)\n\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapUsedInProtoDefinitionFromMessage(ctx, msg))\n\t}\n\treturn pkgNameMap\n}\n\nfunc (r *Resolver) lookupPackageNameMapUsedInProtoDefinitionFromMessage(ctx *context, msg *Message) map[string]struct{} {\n\tpkgNameMap := map[string]struct{}{}\n\tfor _, field := range msg.Fields {\n\t\tif opt := field.Desc.GetOptions(); opt != nil {\n\t\t\topt.ProtoReflect().Range(func(fd protoreflect.FieldDescriptor, val protoreflect.Value) bool {\n\t\t\t\tpkgNameMap[string(fd.ParentFile().Package())] = struct{}{}\n\t\t\t\treturn true\n\t\t\t})\n\t\t}\n\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapRecursiveFromType(field.Type))\n\t}\n\n\tfor _, nestedMsg := range msg.NestedMessages {\n\t\tctx := ctx.withMessage(nestedMsg)\n\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapUsedInProtoDefinitionFromMessage(ctx, nestedMsg))\n\t}\n\treturn pkgNameMap\n}\n\nfunc (r *Resolver) lookupPackageNameMapRecursiveFromType(typ *Type) map[string]struct{} {\n\tpkgNameMap := map[string]struct{}{}\n\tif typ == nil {\n\t\treturn pkgNameMap\n\t}\n\tswitch typ.Kind {\n\tcase types.Message:\n\t\tif typ.Message == nil {\n\t\t\treturn pkgNameMap\n\t\t}\n\t\tif typ.Message.IsMapEntry {\n\t\t\tfor _, field := range typ.Message.Fields {\n\t\t\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapRecursiveFromType(field.Type))\n\t\t\t}\n\t\t} else {\n\t\t\tpkgNameMap[typ.Message.PackageName()] = struct{}{}\n\t\t}\n\tcase types.Enum:\n\t\tif typ.Enum == nil {\n\t\t\treturn pkgNameMap\n\t\t}\n\t\tpkgNameMap[typ.Enum.PackageName()] = struct{}{}\n\t}\n\treturn pkgNameMap\n}\n\nfunc (r *Resolver) lookupPackageNameMapUsedInGRPCFederationDefinitionFromFile(ctx *context, file *File) map[string]struct{} {\n\tpkgNameMap := map[string]struct{}{}\n\tfor _, s := range file.Services {\n\t\tif s.Rule != nil && s.Rule.Env != nil {\n\t\t\tfor _, v := range s.Rule.Env.Vars {\n\t\t\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapRecursiveFromType(v.Type))\n\t\t\t}\n\t\t}\n\t\tif s.Rule != nil && s.Rule.Vars != nil {\n\t\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapFromServiceVariables(ctx, s.Rule.Vars))\n\t\t}\n\t\tfor _, method := range s.Methods {\n\t\t\tif method.Rule != nil && method.Rule.Response != nil {\n\t\t\t\tpkgNameMap[method.Rule.Response.PackageName()] = struct{}{}\n\t\t\t}\n\t\t}\n\t}\n\n\tfor _, msg := range file.Messages {\n\t\tctx := ctx.withMessage(msg)\n\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapUsedInGRPCFederationDefinitionFromMessage(ctx, msg))\n\t}\n\tfor _, enum := range file.Enums {\n\t\tctx := ctx.withEnum(enum)\n\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapUsedInGRPCFederationDefinitionFromEnum(ctx, enum))\n\t}\n\n\treturn pkgNameMap\n}\n\nfunc (r *Resolver) lookupPackageNameMapUsedInGRPCFederationDefinitionFromMessage(ctx *context, msg *Message) map[string]struct{} {\n\tpkgNameMap := map[string]struct{}{}\n\tif msg.Rule != nil {\n\t\tfor _, a := range msg.Rule.Aliases {\n\t\t\tpkgNameMap[a.PackageName()] = struct{}{}\n\t\t}\n\t\tif msg.Rule.MessageArgument != nil {\n\t\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapUsedInGRPCFederationDefinitionFromMessage(ctx, msg.Rule.MessageArgument))\n\t\t}\n\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapFromVariableDefinitionSet(ctx, msg.Rule.DefSet))\n\t}\n\n\tfor _, field := range msg.Fields {\n\t\tif field.Type != nil {\n\t\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapRecursiveFromType(field.Type))\n\t\t}\n\n\t\trule := field.Rule\n\t\tif rule == nil {\n\t\t\tcontinue\n\t\t}\n\t\tfor _, a := range rule.Aliases {\n\t\t\tif a.Message == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tpkgNameMap[a.Message.PackageName()] = struct{}{}\n\t\t}\n\t\tif rule.Value != nil {\n\t\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapFromCELValue(ctx, rule.Value.CEL))\n\t\t}\n\t\tif rule.Oneof != nil {\n\t\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapFromCELValue(ctx, rule.Oneof.If))\n\t\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapFromCELValue(ctx, rule.Oneof.By))\n\t\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapFromVariableDefinitionSet(ctx, rule.Oneof.DefSet))\n\t\t}\n\t}\n\n\tfor _, nestedMsg := range msg.NestedMessages {\n\t\tctx := ctx.withMessage(nestedMsg)\n\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapUsedInGRPCFederationDefinitionFromMessage(ctx, nestedMsg))\n\t}\n\treturn pkgNameMap\n}\n\nfunc (r *Resolver) lookupPackageNameMapUsedInGRPCFederationDefinitionFromEnum(_ *context, enum *Enum) map[string]struct{} {\n\tpkgNameMap := make(map[string]struct{})\n\tif enum.Rule == nil {\n\t\treturn pkgNameMap\n\t}\n\tfor _, a := range enum.Rule.Aliases {\n\t\tpkgNameMap[a.PackageName()] = struct{}{}\n\t}\n\treturn pkgNameMap\n}\n\nfunc (r *Resolver) lookupPackageNameMapFromVariableDefinitionSet(ctx *context, defSet *VariableDefinitionSet) map[string]struct{} {\n\tif defSet == nil {\n\t\treturn nil\n\t}\n\tpkgNameMap := map[string]struct{}{}\n\tfor _, v := range defSet.Defs {\n\t\tif v.Expr == nil {\n\t\t\tcontinue\n\t\t}\n\t\tswitch {\n\t\tcase v.Expr.By != nil:\n\t\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapFromCELValue(ctx, v.Expr.By))\n\t\tcase v.Expr.Call != nil:\n\t\t\tif v.Expr.Call.Method != nil && v.Expr.Call.Method.Service != nil {\n\t\t\t\tpkgNameMap[v.Expr.Call.Method.Service.PackageName()] = struct{}{}\n\t\t\t}\n\t\t\tif v.Expr.Call.Request != nil {\n\t\t\t\tif v.Expr.Call.Request.Type != nil {\n\t\t\t\t\tpkgNameMap[v.Expr.Call.Request.Type.PackageName()] = struct{}{}\n\t\t\t\t}\n\t\t\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapFromMessageArguments(ctx, v.Expr.Call.Request.Args))\n\t\t\t}\n\t\t\tfor _, err := range v.Expr.Call.Errors {\n\t\t\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapFromGRPCError(ctx, err))\n\t\t\t}\n\t\tcase v.Expr.Message != nil:\n\t\t\tif v.Expr.Message.Message != nil {\n\t\t\t\tpkgNameMap[v.Expr.Message.Message.PackageName()] = struct{}{}\n\t\t\t}\n\t\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapFromMessageArguments(ctx, v.Expr.Message.Args))\n\t\tcase v.Expr.Enum != nil:\n\t\t\tif v.Expr.Enum.Enum != nil {\n\t\t\t\tpkgNameMap[v.Expr.Enum.Enum.PackageName()] = struct{}{}\n\t\t\t}\n\t\tcase v.Expr.Map != nil:\n\t\t\tif v.Expr.Map.Expr != nil {\n\t\t\t\texpr := v.Expr.Map.Expr\n\t\t\t\tif expr.By != nil {\n\t\t\t\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapFromCELValue(ctx, expr.By))\n\t\t\t\t}\n\t\t\t\tif expr.Message != nil && expr.Message.Message != nil {\n\t\t\t\t\tpkgNameMap[expr.Message.Message.PackageName()] = struct{}{}\n\t\t\t\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapFromMessageArguments(ctx, expr.Message.Args))\n\t\t\t\t}\n\t\t\t}\n\t\tcase v.Expr.Validation != nil:\n\t\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapFromGRPCError(ctx, v.Expr.Validation.Error))\n\t\t}\n\t}\n\treturn pkgNameMap\n}\n\nfunc (r *Resolver) lookupPackageNameMapFromGRPCError(ctx *context, err *GRPCError) map[string]struct{} {\n\tif err == nil {\n\t\treturn nil\n\t}\n\tpkgNameMap := map[string]struct{}{}\n\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapFromCELValue(ctx, err.If))\n\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapFromCELValue(ctx, err.Message))\n\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapFromCELValue(ctx, err.IgnoreAndResponse))\n\tfor _, detail := range err.Details {\n\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapFromCELValue(ctx, detail.If))\n\t\tfor _, by := range detail.By {\n\t\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapFromCELValue(ctx, by))\n\t\t}\n\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapFromVariableDefinitionSet(ctx, detail.Messages))\n\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapFromVariableDefinitionSet(ctx, detail.DefSet))\n\t\tfor _, preconditionFailure := range detail.PreconditionFailures {\n\t\t\tfor _, violation := range preconditionFailure.Violations {\n\t\t\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapFromCELValue(ctx, violation.Type))\n\t\t\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapFromCELValue(ctx, violation.Subject))\n\t\t\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapFromCELValue(ctx, violation.Description))\n\t\t\t}\n\t\t}\n\t\tfor _, badRequest := range detail.BadRequests {\n\t\t\tfor _, fieldViolation := range badRequest.FieldViolations {\n\t\t\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapFromCELValue(ctx, fieldViolation.Field))\n\t\t\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapFromCELValue(ctx, fieldViolation.Description))\n\t\t\t}\n\t\t}\n\t\tfor _, localizedMessage := range detail.LocalizedMessages {\n\t\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapFromCELValue(ctx, localizedMessage.Message))\n\t\t}\n\t}\n\treturn pkgNameMap\n}\n\nfunc (r *Resolver) lookupPackageNameMapFromCELValue(ctx *context, val *CELValue) map[string]struct{} {\n\tif val == nil {\n\t\treturn nil\n\t}\n\tenv, err := r.createCELEnv(ctx)\n\tif err != nil {\n\t\t// skip reporting error\n\t\treturn nil\n\t}\n\texpr := strings.Replace(val.Expr, \"$\", federation.MessageArgumentVariableName, -1)\n\tast, issues := env.Parse(expr)\n\tif issues.Err() != nil {\n\t\t// skip reporting error\n\t\treturn nil\n\t}\n\tidents := grpcfedcel.ToIdentifiers(ast.NativeRep().Expr())\n\n\tpkgNameMap := map[string]struct{}{}\n\tfor _, ident := range idents {\n\t\tif pkg, err := r.lookupPackage(ident); err == nil {\n\t\t\tpkgNameMap[pkg.Name] = struct{}{}\n\t\t} else if _, exists := r.protoPackageNameToPackage[ident]; exists {\n\t\t\tpkgNameMap[ident] = struct{}{}\n\t\t}\n\t}\n\treturn pkgNameMap\n}\n\nfunc (r *Resolver) lookupPackageNameMapFromMessageArguments(ctx *context, args []*Argument) map[string]struct{} {\n\tpkgNameMap := map[string]struct{}{}\n\tfor _, arg := range args {\n\t\tif arg.Value != nil {\n\t\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapFromCELValue(ctx, arg.Value.CEL))\n\t\t}\n\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapRecursiveFromType(arg.Type))\n\t}\n\treturn pkgNameMap\n}\n\n// lookupPackageNameMapFromServiceVariables processes ServiceVariable dependencies.\nfunc (r *Resolver) lookupPackageNameMapFromServiceVariables(ctx *context, vars []*ServiceVariable) map[string]struct{} {\n\tpkgNameMap := map[string]struct{}{}\n\tfor _, v := range vars {\n\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapFromServiceVariableExpr(ctx, v.Expr))\n\t}\n\treturn pkgNameMap\n}\n\n// lookupPackageNameMapFromServiceVariableExpr processes ServiceVariableExpr dependencies.\nfunc (r *Resolver) lookupPackageNameMapFromServiceVariableExpr(ctx *context, expr *ServiceVariableExpr) map[string]struct{} {\n\tpkgNameMap := map[string]struct{}{}\n\tif expr == nil {\n\t\treturn pkgNameMap\n\t}\n\n\tswitch {\n\tcase expr.By != nil:\n\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapFromCELValue(ctx, expr.By))\n\tcase expr.Message != nil:\n\t\tif expr.Message.Message != nil {\n\t\t\tpkgNameMap[expr.Message.Message.PackageName()] = struct{}{}\n\t\t}\n\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapFromMessageArguments(ctx, expr.Message.Args))\n\tcase expr.Enum != nil:\n\t\tif expr.Enum.Enum != nil {\n\t\t\tpkgNameMap[expr.Enum.Enum.PackageName()] = struct{}{}\n\t\t}\n\tcase expr.Switch != nil:\n\t\tfor _, caseExpr := range expr.Switch.Cases {\n\t\t\tif caseExpr.If != nil {\n\t\t\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapFromCELValue(ctx, caseExpr.If))\n\t\t\t}\n\t\t\tif caseExpr.By != nil {\n\t\t\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapFromCELValue(ctx, caseExpr.By))\n\t\t\t}\n\t\t}\n\t\tif expr.Switch.Default != nil && expr.Switch.Default.By != nil {\n\t\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapFromCELValue(ctx, expr.Switch.Default.By))\n\t\t}\n\tcase expr.Map != nil:\n\t\tif expr.Map.Expr != nil {\n\t\t\tmapExpr := expr.Map.Expr\n\t\t\tif mapExpr.By != nil {\n\t\t\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapFromCELValue(ctx, mapExpr.By))\n\t\t\t}\n\t\t\tif mapExpr.Message != nil && mapExpr.Message.Message != nil {\n\t\t\t\tpkgNameMap[mapExpr.Message.Message.PackageName()] = struct{}{}\n\t\t\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapFromMessageArguments(ctx, mapExpr.Message.Args))\n\t\t\t}\n\t\t}\n\tcase expr.Validation != nil:\n\t\tif expr.Validation.Message != nil {\n\t\t\tmaps.Copy(pkgNameMap, r.lookupPackageNameMapFromCELValue(ctx, expr.Validation.Message))\n\t\t}\n\t}\n\treturn pkgNameMap\n}\n\nfunc (r *Resolver) resultFiles(allFiles []*File) []*File {\n\tfileMap := make(map[string]struct{})\n\tret := make([]*File, 0, len(allFiles))\n\tfor _, file := range r.hasServiceOrPluginRuleFiles(allFiles) {\n\t\tif _, exists := fileMap[file.Name]; exists {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, file)\n\t\tfileMap[file.Name] = struct{}{}\n\n\t\tfor _, samePkgFile := range r.samePackageFiles(file) {\n\t\t\tif _, exists := fileMap[samePkgFile.Name]; exists {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tret = append(ret, samePkgFile)\n\t\t\tfileMap[samePkgFile.Name] = struct{}{}\n\t\t}\n\t}\n\treturn ret\n}\n\nfunc (r *Resolver) hasServiceOrPluginRuleFiles(files []*File) []*File {\n\tvar ret []*File\n\tfor _, file := range files {\n\t\tswitch {\n\t\tcase file.HasServiceWithRule():\n\t\t\tret = append(ret, file)\n\t\tcase len(file.CELPlugins) != 0:\n\t\t\tret = append(ret, file)\n\t\t}\n\t}\n\treturn ret\n}\n\nfunc (r *Resolver) samePackageFiles(src *File) []*File {\n\tret := make([]*File, 0, len(src.Package.Files))\n\tfor _, file := range src.Package.Files {\n\t\tif file == src {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, file)\n\t}\n\treturn ret\n}\n\nfunc (r *Resolver) validateService(ctx *context, svc *Service) {\n\tif svc.Rule == nil {\n\t\treturn\n\t}\n\tr.validateMethodResponse(ctx, svc)\n}\n\nfunc (r *Resolver) validateMethodResponse(ctx *context, service *Service) {\n\tfor _, method := range service.Methods {\n\t\tresponse := method.FederationResponse()\n\t\tif response.Rule == nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\tfmt.Sprintf(`\"%s.%s\" message needs to specify \"grpc.federation.message\" option`, response.PackageName(), response.Name),\n\t\t\t\t\tsource.NewMessageBuilder(ctx.fileName(), response.Name).Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t}\n}\n\nfunc (r *Resolver) resolveFile(ctx *context, def *descriptorpb.FileDescriptorProto, builder *source.LocationBuilder) *File {\n\tfile := r.defToFileMap[def]\n\tif resolvedFile, exists := r.cachedFileMap[file.Name]; exists {\n\t\treturn resolvedFile\n\t}\n\n\tctx = ctx.withFile(file)\n\tfileDef, err := getExtensionRule[*federation.FileRule](def.GetOptions(), federation.E_File)\n\tif err != nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\terr.Error(),\n\t\t\t\tbuilder.Location(),\n\t\t\t),\n\t\t)\n\t}\n\tif fileDef != nil {\n\t\tfor _, export := range fileDef.GetPlugin().GetExport() {\n\t\t\tif plugin := r.resolveCELPlugin(ctx, def, export, builder.WithExport(export.GetName())); plugin != nil {\n\t\t\t\tfile.CELPlugins = append(file.CELPlugins, plugin)\n\t\t\t}\n\t\t}\n\t}\n\n\tfor _, depFileName := range def.GetDependency() {\n\t\tdepDef, exists := r.fileNameToDefMap[depFileName]\n\t\tif !exists {\n\t\t\tcontinue\n\t\t}\n\t\tfile.ImportFiles = append(file.ImportFiles, r.resolveFile(ctx, depDef, source.NewLocationBuilder(depDef.GetName())))\n\t}\n\tfor _, serviceDef := range def.GetService() {\n\t\tname := serviceDef.GetName()\n\t\tservice := r.resolveService(ctx, file.Package, name, builder.WithService(name))\n\t\tif service == nil {\n\t\t\tcontinue\n\t\t}\n\t\tfile.Services = append(file.Services, service)\n\t}\n\tfor _, msgDef := range def.GetMessageType() {\n\t\tname := msgDef.GetName()\n\t\tmsg := r.resolveMessage(ctx, file.Package, name, builder.WithMessage(name))\n\t\tif msg == nil {\n\t\t\tcontinue\n\t\t}\n\t\tfile.Messages = append(file.Messages, msg)\n\t}\n\tfor _, enumDef := range def.GetEnumType() {\n\t\tname := enumDef.GetName()\n\t\tfile.Enums = append(file.Enums, r.resolveEnum(ctx, file.Package, name, builder.WithEnum(name)))\n\t}\n\tr.cachedFileMap[file.Name] = file\n\treturn file\n}\n\nfunc (r *Resolver) resolveCELPlugin(ctx *context, fileDef *descriptorpb.FileDescriptorProto, def *federation.CELPluginExport, builder *source.ExportBuilder) *CELPlugin {\n\tif def == nil {\n\t\treturn nil\n\t}\n\tpkgName := fileDef.GetPackage()\n\tplugin := &CELPlugin{Name: def.GetName()}\n\tctx = ctx.withPlugin(plugin)\n\tfor idx, fn := range def.GetFunctions() {\n\t\tpluginFunc := r.resolvePluginGlobalFunction(ctx, pkgName, fn, builder.WithFunctions(idx))\n\t\tif pluginFunc == nil {\n\t\t\tcontinue\n\t\t}\n\t\tplugin.Functions = append(plugin.Functions, pluginFunc)\n\t}\n\tfor idx, msgType := range def.GetTypes() {\n\t\tbuilder := builder.WithTypes(idx)\n\t\tmsg, err := r.resolveMessageByName(ctx, msgType.GetName(), source.ToLazyMessageBuilder(builder, msgType.GetName()))\n\t\tif err != nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\terr.Error(),\n\t\t\t\t\tbuilder.WithName().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t\tcontinue\n\t\t}\n\t\tfor idx, fn := range msgType.GetMethods() {\n\t\t\tpluginFunc := r.resolvePluginMethod(ctx, msg, fn, builder.WithMethods(idx))\n\t\t\tif pluginFunc == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tplugin.Functions = append(plugin.Functions, pluginFunc)\n\t\t}\n\t}\n\tplugin.Capability = r.resolvePluginCapability(def.GetCapability())\n\treturn plugin\n}\n\nfunc (r *Resolver) resolvePluginMethod(ctx *context, msg *Message, fn *federation.CELFunction, builder *source.PluginFunctionBuilder) *CELFunction {\n\tmsgType := NewMessageType(msg, false)\n\tpluginFunc := &CELFunction{\n\t\tName:     fn.GetName(),\n\t\tReceiver: msg,\n\t\tArgs:     []*Type{msgType},\n\t}\n\targs, ret := r.resolvePluginFunctionArgumentsAndReturn(ctx, fn.GetArgs(), fn.GetReturn(), builder)\n\tpluginFunc.Args = append(pluginFunc.Args, args...)\n\tpluginFunc.Return = ret\n\tpluginFunc.ID = r.toPluginFunctionID(fmt.Sprintf(\"%s_%s\", msg.FQDN(), fn.GetName()), append(pluginFunc.Args, pluginFunc.Return))\n\treturn pluginFunc\n}\n\nfunc (r *Resolver) resolvePluginGlobalFunction(ctx *context, pkgName string, fn *federation.CELFunction, builder *source.PluginFunctionBuilder) *CELFunction {\n\tpluginFunc := &CELFunction{\n\t\tName: fmt.Sprintf(\"%s.%s\", pkgName, fn.GetName()),\n\t}\n\targs, ret := r.resolvePluginFunctionArgumentsAndReturn(ctx, fn.GetArgs(), fn.GetReturn(), builder)\n\tpluginFunc.Args = append(pluginFunc.Args, args...)\n\tpluginFunc.Return = ret\n\tpluginFunc.ID = r.toPluginFunctionID(fmt.Sprintf(\"%s_%s\", pkgName, fn.GetName()), append(pluginFunc.Args, pluginFunc.Return))\n\treturn pluginFunc\n}\n\nfunc (r *Resolver) resolvePluginFunctionArgumentsAndReturn(ctx *context, args []*federation.CELFunctionArgument, ret *federation.CELType, builder *source.PluginFunctionBuilder) ([]*Type, *Type) {\n\targTypes := r.resolvePluginFunctionArguments(ctx, args, builder)\n\tif ret == nil {\n\t\treturn argTypes, nil\n\t}\n\tretType, err := r.resolvePluginType(ctx, ret, false)\n\tif err != nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\terr.Error(),\n\t\t\t\tbuilder.WithReturnType().Location(),\n\t\t\t),\n\t\t)\n\t}\n\treturn argTypes, retType\n}\n\nfunc (r *Resolver) resolvePluginFunctionArguments(ctx *context, args []*federation.CELFunctionArgument, builder *source.PluginFunctionBuilder) []*Type {\n\tvar ret []*Type\n\tfor argIdx, arg := range args {\n\t\ttyp, err := r.resolvePluginType(ctx, arg.GetType(), false)\n\t\tif err != nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\terr.Error(),\n\t\t\t\t\tbuilder.WithArgs(argIdx).Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, typ)\n\t}\n\treturn ret\n}\n\nfunc (r *Resolver) resolvePluginType(ctx *context, typ *federation.CELType, repeated bool) (*Type, error) {\n\tvar label descriptorpb.FieldDescriptorProto_Label\n\tif repeated {\n\t\tlabel = descriptorpb.FieldDescriptorProto_LABEL_REPEATED\n\t} else {\n\t\tlabel = descriptorpb.FieldDescriptorProto_LABEL_REQUIRED\n\t}\n\n\tswitch typ.Type.(type) {\n\tcase *federation.CELType_Kind:\n\t\tswitch typ.GetKind() {\n\t\tcase federation.TypeKind_STRING:\n\t\t\tif repeated {\n\t\t\t\treturn StringRepeatedType, nil\n\t\t\t}\n\t\t\treturn StringType, nil\n\t\tcase federation.TypeKind_BOOL:\n\t\t\tif repeated {\n\t\t\t\treturn BoolRepeatedType, nil\n\t\t\t}\n\t\t\treturn BoolType, nil\n\t\tcase federation.TypeKind_INT64:\n\t\t\tif repeated {\n\t\t\t\treturn Int64RepeatedType, nil\n\t\t\t}\n\t\t\treturn Int64Type, nil\n\t\tcase federation.TypeKind_UINT64:\n\t\t\tif repeated {\n\t\t\t\treturn Uint64RepeatedType, nil\n\t\t\t}\n\t\t\treturn Uint64Type, nil\n\t\tcase federation.TypeKind_DOUBLE:\n\t\t\tif repeated {\n\t\t\t\treturn DoubleRepeatedType, nil\n\t\t\t}\n\t\t\treturn DoubleType, nil\n\t\tcase federation.TypeKind_DURATION:\n\t\t\tif repeated {\n\t\t\t\treturn DurationRepeatedType, nil\n\t\t\t}\n\t\t\treturn DurationType, nil\n\t\t}\n\tcase *federation.CELType_Repeated:\n\t\treturn r.resolvePluginType(ctx, typ.GetRepeated(), true)\n\tcase *federation.CELType_Map:\n\t\tmapType := typ.GetMap()\n\t\tkey, err := r.resolvePluginType(ctx, mapType.GetKey(), false)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tvalue, err := r.resolvePluginType(ctx, mapType.GetValue(), false)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn NewMapType(key, value), nil\n\tcase *federation.CELType_Message:\n\t\tctx := newContext().withFile(ctx.file())\n\t\treturn r.resolveType(ctx, typ.GetMessage(), types.Message, label)\n\tcase *federation.CELType_Enum:\n\t\tctx := newContext().withFile(ctx.file())\n\t\treturn r.resolveType(ctx, typ.GetEnum(), types.Enum, label)\n\t}\n\treturn nil, fmt.Errorf(\"failed to resolve plugin type\")\n}\n\nfunc (r *Resolver) toPluginFunctionID(prefix string, t []*Type) string {\n\tvar typeNames []string\n\tfor _, tt := range t {\n\t\tif tt == nil {\n\t\t\tcontinue\n\t\t}\n\t\ttypeNames = append(typeNames, tt.FQDN())\n\t}\n\treturn strings.ReplaceAll(strings.Join(append([]string{prefix}, typeNames...), \"_\"), \".\", \"_\")\n}\n\nfunc (r *Resolver) resolvePluginCapability(def *federation.CELPluginCapability) *CELPluginCapability {\n\tret := &CELPluginCapability{}\n\tif env := def.GetEnv(); env != nil {\n\t\tret.Env = &CELPluginEnvCapability{\n\t\t\tAll:   env.GetAll(),\n\t\t\tNames: env.GetNames(),\n\t\t}\n\t}\n\tif fs := def.GetFileSystem(); fs != nil {\n\t\tret.FileSystem = &CELPluginFileSystemCapability{\n\t\t\tMountPath: fs.GetMountPath(),\n\t\t}\n\t}\n\tif net := def.GetNetwork(); net != nil {\n\t\tret.Network = &CELPluginNetworkCapability{}\n\t}\n\treturn ret\n}\n\nfunc (r *Resolver) resolveService(ctx *context, pkg *Package, name string, builder *source.ServiceBuilder) *Service {\n\tfqdn := fmt.Sprintf(\"%s.%s\", pkg.Name, name)\n\tcachedService, exists := r.cachedServiceMap[fqdn]\n\tif exists {\n\t\treturn cachedService\n\t}\n\tfile, serviceDef, err := r.lookupService(pkg, name)\n\tif err != nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\terr.Error(),\n\t\t\t\tbuilder.Location(),\n\t\t\t),\n\t\t)\n\t\treturn nil\n\t}\n\truleDef, err := getExtensionRule[*federation.ServiceRule](serviceDef.GetOptions(), federation.E_Service)\n\tif err != nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\terr.Error(),\n\t\t\t\tbuilder.Location(),\n\t\t\t),\n\t\t)\n\t\treturn nil\n\t}\n\tservice := &Service{\n\t\tFile:       file,\n\t\tName:       name,\n\t\tDesc:       serviceDef,\n\t\tMethods:    make([]*Method, 0, len(serviceDef.GetMethod())),\n\t\tCELPlugins: file.AllCELPlugins(),\n\t}\n\tr.serviceToRuleMap[service] = ruleDef\n\tfor _, methodDef := range serviceDef.GetMethod() {\n\t\tmethod := r.resolveMethod(ctx, service, methodDef, builder.WithMethod(methodDef.GetName()))\n\t\tif method == nil {\n\t\t\tcontinue\n\t\t}\n\t\tservice.Methods = append(service.Methods, method)\n\t}\n\tr.cachedServiceMap[fqdn] = service\n\treturn service\n}\n\nfunc (r *Resolver) resolveMethod(ctx *context, service *Service, methodDef *descriptorpb.MethodDescriptorProto, builder *source.MethodBuilder) *Method {\n\tfqdn := fmt.Sprintf(\"%s.%s/%s\", service.PackageName(), service.Name, methodDef.GetName())\n\tcachedMethod, exists := r.cachedMethodMap[fqdn]\n\tif exists {\n\t\treturn cachedMethod\n\t}\n\treqPkg, err := r.lookupPackage(methodDef.GetInputType())\n\tif err != nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\terr.Error(),\n\t\t\t\tbuilder.Location(),\n\t\t\t),\n\t\t)\n\t}\n\tresPkg, err := r.lookupPackage(methodDef.GetOutputType())\n\tif err != nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\terr.Error(),\n\t\t\t\tbuilder.Location(),\n\t\t\t),\n\t\t)\n\t}\n\tvar (\n\t\treq *Message\n\t\tres *Message\n\t)\n\tif reqPkg != nil {\n\t\treqType := r.trimPackage(reqPkg, methodDef.GetInputType())\n\t\treq = r.resolveMessage(ctx, reqPkg, reqType, source.NewMessageBuilder(ctx.fileName(), reqType))\n\t}\n\tif resPkg != nil {\n\t\tresType := r.trimPackage(resPkg, methodDef.GetOutputType())\n\t\tres = r.resolveMessage(ctx, resPkg, resType, source.NewMessageBuilder(ctx.fileName(), resType))\n\t}\n\truleDef, err := getExtensionRule[*federation.MethodRule](methodDef.GetOptions(), federation.E_Method)\n\tif err != nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\terr.Error(),\n\t\t\t\tbuilder.WithOption().Location(),\n\t\t\t),\n\t\t)\n\t\treturn nil\n\t}\n\tmethod := &Method{\n\t\tService:  service,\n\t\tName:     methodDef.GetName(),\n\t\tDesc:     methodDef,\n\t\tRequest:  req,\n\t\tResponse: res,\n\t}\n\tr.methodToRuleMap[method] = ruleDef\n\tr.cachedMethodMap[fqdn] = method\n\treturn method\n}\n\nfunc (r *Resolver) resolveMessageByName(ctx *context, name string, builder *source.MessageBuilder) (*Message, error) {\n\tif strings.Contains(name, \".\") {\n\t\tpkg, err := r.lookupPackage(name)\n\t\tif err != nil {\n\t\t\t// attempt to resolve the message because of a possible name specified as a nested message.\n\t\t\tif msg := r.resolveMessage(ctx, ctx.file().Package, name, builder); msg != nil {\n\t\t\t\treturn msg, nil\n\t\t\t}\n\t\t\treturn nil, err\n\t\t}\n\t\tmsgName := r.trimPackage(pkg, name)\n\t\treturn r.resolveMessage(ctx, pkg, msgName, source.ToLazyMessageBuilder(builder, msgName)), nil\n\t}\n\treturn r.resolveMessage(ctx, ctx.file().Package, name, builder), nil\n}\n\nfunc (r *Resolver) resolveMessage(ctx *context, pkg *Package, name string, builder *source.MessageBuilder) *Message {\n\tfqdn := fmt.Sprintf(\"%s.%s\", pkg.Name, name)\n\tcachedMessage, exists := r.cachedMessageMap[fqdn]\n\tif exists {\n\t\treturn cachedMessage\n\t}\n\tfile, msgDef, err := r.lookupMessage(pkg, name)\n\tif err != nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\terr.Error(),\n\t\t\t\tbuilder.Location(),\n\t\t\t),\n\t\t)\n\t\treturn nil\n\t}\n\tmsg := &Message{\n\t\tFile: file,\n\t\tName: msgDef.GetName(),\n\t\tDesc: msgDef,\n\t}\n\tfor _, nestedMsgDef := range msgDef.GetNestedType() {\n\t\tnestedMsg := r.resolveMessage(ctx, pkg, fmt.Sprintf(\"%s.%s\", name, nestedMsgDef.GetName()), builder.WithMessage(name))\n\t\tif nestedMsg == nil {\n\t\t\tcontinue\n\t\t}\n\t\tnestedMsg.ParentMessage = msg\n\t\tmsg.NestedMessages = append(msg.NestedMessages, nestedMsg)\n\t}\n\tfor _, enumDef := range msgDef.GetEnumType() {\n\t\tenum := r.resolveEnum(ctx, pkg, fmt.Sprintf(\"%s.%s\", name, enumDef.GetName()), builder.WithEnum(name))\n\t\tif enum == nil {\n\t\t\tcontinue\n\t\t}\n\t\tenum.Message = msg\n\t\tmsg.Enums = append(msg.Enums, enum)\n\t}\n\topt := msgDef.GetOptions()\n\tmsg.IsMapEntry = opt.GetMapEntry()\n\trule, err := getExtensionRule[*federation.MessageRule](msgDef.GetOptions(), federation.E_Message)\n\tif err != nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\terr.Error(),\n\t\t\t\tbuilder.WithOption().Location(),\n\t\t\t),\n\t\t)\n\t}\n\tr.cachedMessageMap[fqdn] = msg\n\tr.messageToRuleMap[msg] = rule\n\tctx = ctx.withMessage(msg)\n\tvar oneofs []*Oneof\n\tfor _, oneofDef := range msgDef.GetOneofDecl() {\n\t\toneof := r.resolveOneof(ctx, oneofDef, builder.WithOneof(oneofDef.GetName()))\n\t\toneof.Message = msg\n\t\toneofs = append(oneofs, oneof)\n\t}\n\tmsg.Fields = r.resolveFields(ctx, msgDef.GetField(), oneofs, builder)\n\tmsg.Oneofs = oneofs\n\treturn msg\n}\n\nfunc (r *Resolver) resolveOneof(ctx *context, def *descriptorpb.OneofDescriptorProto, builder *source.OneofBuilder) *Oneof {\n\trule, err := getExtensionRule[*federation.OneofRule](def.GetOptions(), federation.E_Oneof)\n\tif err != nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\terr.Error(),\n\t\t\t\tbuilder.Location(),\n\t\t\t),\n\t\t)\n\t}\n\toneof := &Oneof{\n\t\tName: def.GetName(),\n\t}\n\tr.oneofToRuleMap[oneof] = rule\n\treturn oneof\n}\n\nfunc (r *Resolver) resolveEnumByName(ctx *context, name string, builder *source.EnumBuilder) (*Enum, error) {\n\tif strings.Contains(name, \".\") {\n\t\tpkg, err := r.lookupPackage(name)\n\t\tif err != nil {\n\t\t\t// attempt to resolve the enum because of a possible name specified as a inner message.\n\t\t\tif enum := r.resolveEnum(ctx, ctx.file().Package, name, builder); enum != nil {\n\t\t\t\treturn enum, nil\n\t\t\t}\n\t\t\treturn nil, err\n\t\t}\n\t\tenumName := r.trimPackage(pkg, name)\n\t\treturn r.resolveEnum(ctx, pkg, enumName, source.ToLazyEnumBuilder(builder, enumName)), nil\n\t}\n\treturn r.resolveEnum(ctx, ctx.file().Package, name, builder), nil\n}\n\nfunc (r *Resolver) resolveEnum(ctx *context, pkg *Package, name string, builder *source.EnumBuilder) *Enum {\n\tfqdn := fmt.Sprintf(\"%s.%s\", pkg.Name, name)\n\tcachedEnum, exists := r.cachedEnumMap[fqdn]\n\tif exists {\n\t\treturn cachedEnum\n\t}\n\tfile, def, err := r.lookupEnum(pkg, name)\n\tif err != nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\terr.Error(),\n\t\t\t\tbuilder.Location(),\n\t\t\t),\n\t\t)\n\t\treturn nil\n\t}\n\tvalues := make([]*EnumValue, 0, len(def.GetValue()))\n\tenum := &Enum{\n\t\tFile: file,\n\t\tName: def.GetName(),\n\t}\n\tfor _, valueDef := range def.GetValue() {\n\t\tvalueName := valueDef.GetName()\n\t\trule, err := getExtensionRule[*federation.EnumValueRule](valueDef.GetOptions(), federation.E_EnumValue)\n\t\tif err != nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\terr.Error(),\n\t\t\t\t\tbuilder.WithValue(valueName).Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t\tenumValue := &EnumValue{Value: valueName, Enum: enum}\n\t\tvalues = append(values, enumValue)\n\t\tr.enumValueToRuleMap[enumValue] = rule\n\t}\n\tenum.Values = values\n\trule, err := getExtensionRule[*federation.EnumRule](def.GetOptions(), federation.E_Enum)\n\tif err != nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\terr.Error(),\n\t\t\t\tbuilder.Location(),\n\t\t\t),\n\t\t)\n\t}\n\tr.cachedEnumMap[fqdn] = enum\n\tr.enumToRuleMap[enum] = rule\n\treturn enum\n}\n\n// resolveRule resolve the rule defined in grpc.federation custom option.\nfunc (r *Resolver) resolveRule(ctx *context, files []*File) {\n\tfor _, file := range files {\n\t\tctx := ctx.withFile(file)\n\t\tr.resolveMessageRules(ctx, file.Messages, func(name string) *source.MessageBuilder {\n\t\t\treturn source.NewMessageBuilder(file.Name, name)\n\t\t})\n\t\tr.resolveEnumRules(ctx, file.Enums)\n\t\tr.resolveServiceRules(ctx, file.Services)\n\t}\n}\n\nfunc (r *Resolver) resolveServiceRules(ctx *context, svcs []*Service) {\n\tpkgToSvcs := make(map[*Package][]*Service)\n\tfor _, svc := range svcs {\n\t\tbuilder := source.NewServiceBuilder(ctx.fileName(), svc.Name)\n\t\tsvc.Rule = r.resolveServiceRule(ctx, svc, r.serviceToRuleMap[svc], builder.WithOption())\n\t\tr.resolveMethodRules(ctx, svc.Methods, builder)\n\t\tpkgToSvcs[svc.Package()] = append(pkgToSvcs[svc.Package()], svc)\n\t}\n}\n\nfunc (r *Resolver) resolveMethodRules(ctx *context, mtds []*Method, builder *source.ServiceBuilder) {\n\tfor _, mtd := range mtds {\n\t\tmtd.Rule = r.resolveMethodRule(ctx, mtd, r.methodToRuleMap[mtd], builder.WithMethod(mtd.Name))\n\t}\n}\n\nfunc (r *Resolver) resolveMessageRules(ctx *context, msgs []*Message, builder func(name string) *source.MessageBuilder) {\n\tfor _, msg := range msgs {\n\t\tctx := ctx.withMessage(msg)\n\t\tmb := builder(msg.Name)\n\t\tr.resolveMessageRule(ctx, msg, r.messageToRuleMap[msg], mb.WithOption())\n\t\tr.resolveFieldRules(ctx, msg, mb)\n\t\tr.resolveEnumRules(ctx, msg.Enums)\n\t\tif msg.HasCustomResolver() || msg.HasCustomResolverFields() {\n\t\t\t// If using custom resolver, set the `Used` flag true\n\t\t\t// because all dependency message references are passed as arguments for custom resolver.\n\t\t\tmsg.UseAllNameReference()\n\t\t}\n\t\tr.resolveMessageRules(ctx, msg.NestedMessages, func(name string) *source.MessageBuilder {\n\t\t\treturn mb.WithMessage(name)\n\t\t})\n\t}\n}\n\nfunc (r *Resolver) resolveFieldRules(ctx *context, msg *Message, builder *source.MessageBuilder) {\n\tfor _, field := range msg.Fields {\n\t\tfield.Rule = r.resolveFieldRule(ctx, msg, field, r.fieldToRuleMap[field], toFieldBuilder(builder, field))\n\t\tif msg.Rule == nil && field.Rule != nil {\n\t\t\tmsg.Rule = &MessageRule{DefSet: &VariableDefinitionSet{}}\n\t\t}\n\t}\n\tr.validateFieldsOneofRule(ctx, msg, builder)\n}\n\nfunc (r *Resolver) validateFieldsOneofRule(ctx *context, msg *Message, builder *source.MessageBuilder) {\n\tvar usedDefault bool\n\tfor _, field := range msg.Fields {\n\t\tif field.Rule == nil {\n\t\t\tcontinue\n\t\t}\n\t\toneof := field.Rule.Oneof\n\t\tif oneof == nil {\n\t\t\tcontinue\n\t\t}\n\t\tbuilder := toFieldBuilder(builder, field).WithOption().WithOneOf()\n\t\tif oneof.Default {\n\t\t\tif usedDefault {\n\t\t\t\tctx.addError(\n\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\t`\"default\" found multiple times in the \"grpc.federation.field.oneof\". \"default\" can only be specified once per oneof`,\n\t\t\t\t\t\tbuilder.WithDefault().Location(),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tusedDefault = true\n\t\t\t}\n\t\t}\n\t\tif !oneof.Default && oneof.If == nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\t`\"if\" or \"default\" must be specified in \"grpc.federation.field.oneof\"`,\n\t\t\t\t\tbuilder.Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t\tif oneof.By == nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\t`\"by\" must be specified in \"grpc.federation.field.oneof\"`,\n\t\t\t\t\tbuilder.Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t}\n}\n\nfunc (r *Resolver) resolveAutoBindFields(ctx *context, msg *Message, builder *source.MessageBuilder) {\n\tif msg.Rule == nil {\n\t\treturn\n\t}\n\tif msg.HasCustomResolver() {\n\t\treturn\n\t}\n\trule := msg.Rule\n\tautobindFieldMap := make(map[string][]*AutoBindField)\n\tfor _, varDef := range rule.DefSet.Definitions() {\n\t\tif !varDef.AutoBind {\n\t\t\tcontinue\n\t\t}\n\t\ttyp := varDef.Expr.Type\n\t\tif typ == nil {\n\t\t\tcontinue\n\t\t}\n\t\tif typ.Kind != types.Message {\n\t\t\tcontinue\n\t\t}\n\t\tfor _, field := range typ.Message.Fields {\n\t\t\tautobindFieldMap[field.Name] = append(autobindFieldMap[field.Name], &AutoBindField{\n\t\t\t\tVariableDefinition: varDef,\n\t\t\t\tField:              field,\n\t\t\t})\n\t\t}\n\t}\n\tfor _, field := range msg.Fields {\n\t\tif field.HasRule() {\n\t\t\tcontinue\n\t\t}\n\t\tbuilder := toFieldBuilder(builder, field)\n\t\tautoBindFields, exists := autobindFieldMap[field.Name]\n\t\tif !exists {\n\t\t\tcontinue\n\t\t}\n\t\tif len(autoBindFields) > 1 {\n\t\t\tvar locates []string\n\t\t\tfor _, autoBindField := range autoBindFields {\n\t\t\t\tif autoBindField.VariableDefinition != nil {\n\t\t\t\t\tlocates = append(locates, fmt.Sprintf(`%q name at def`, autoBindField.VariableDefinition.Name))\n\t\t\t\t}\n\t\t\t}\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\tfmt.Sprintf(`%q field found multiple times in the message specified by autobind. since it is not possible to determine one, please use \"grpc.federation.field\" to explicitly bind it. found message names are %s`, field.Name, strings.Join(locates, \" and \")),\n\t\t\t\t\tbuilder.Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t\tcontinue\n\t\t}\n\t\tautoBindField := autoBindFields[0]\n\t\tif autoBindField.Field.Type == nil || field.Type == nil {\n\t\t\tcontinue\n\t\t}\n\t\tif isDifferentType(autoBindField.Field.Type, field.Type) {\n\t\t\tcontinue\n\t\t}\n\t\tif autoBindField.VariableDefinition != nil {\n\t\t\tautoBindField.VariableDefinition.Used = true\n\t\t}\n\t\tfield.Rule = &FieldRule{\n\t\t\tAutoBindField: autoBindField,\n\t\t}\n\t}\n}\n\nconst namePattern = `^[a-zA-Z][a-zA-Z0-9_]*$`\n\nvar (\n\tnameRe             = regexp.MustCompile(namePattern)\n\treservedKeywordMap = map[string]struct{}{\n\t\t\"error\": {},\n\t}\n)\n\nfunc (r *Resolver) validateName(name string) error {\n\tif name == \"\" {\n\t\treturn nil\n\t}\n\tif !nameRe.MatchString(name) {\n\t\treturn fmt.Errorf(`%q is invalid name. name should be in the following pattern: %s`, name, namePattern)\n\t}\n\tif _, exists := reservedKeywordMap[name]; exists {\n\t\treturn fmt.Errorf(`%q is the reserved keyword. this name is not available`, name)\n\t}\n\treturn nil\n}\n\nfunc (r *Resolver) validateMessages(ctx *context, msgs []*Message) {\n\tfor _, msg := range msgs {\n\t\tctx := ctx.withFile(msg.File).withMessage(msg)\n\t\tmb := newMessageBuilderFromMessage(msg)\n\t\tr.validateMessageFields(ctx, msg, mb)\n\t\tr.validateDuplicatedVariableName(ctx, msg, mb)\n\t\t// Don't have to check msg.NestedMessages since r.allMessages(files) already includes nested messages\n\t}\n}\n\nfunc (r *Resolver) validateDuplicatedVariableName(ctx *context, msg *Message, builder *source.MessageBuilder) {\n\tif msg.Rule == nil {\n\t\treturn\n\t}\n\toptBuilder := builder.WithOption()\n\tnameMap := make(map[string]struct{})\n\tfor idx, def := range msg.Rule.DefSet.Definitions() {\n\t\tr.validateDuplicatedVariableNameWithDef(ctx, nameMap, def, optBuilder.WithDef(idx))\n\t}\n\tfor _, field := range msg.Fields {\n\t\tif field.Rule == nil {\n\t\t\tcontinue\n\t\t}\n\t\tif field.Rule.Oneof == nil {\n\t\t\tcontinue\n\t\t}\n\t\tbuilder := toFieldBuilder(builder, field).WithOption().WithOneOf()\n\t\tfor idx, def := range field.Rule.Oneof.DefSet.Definitions() {\n\t\t\tr.validateDuplicatedVariableNameWithDef(ctx, nameMap, def, builder.WithDef(idx))\n\t\t}\n\t}\n}\n\nfunc (r *Resolver) validateDuplicatedVariableNameWithDef(ctx *context, nameMap map[string]struct{}, def *VariableDefinition, builder *source.VariableDefinitionOptionBuilder) {\n\tif def.Expr == nil {\n\t\treturn\n\t}\n\tif def.Name != \"\" {\n\t\tif _, exists := nameMap[def.Name]; exists {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\tfmt.Sprintf(\"found duplicated variable name %q\", def.Name),\n\t\t\t\t\tbuilder.WithName().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t}\n\tnameMap[def.Name] = struct{}{}\n\texpr := def.Expr\n\tswitch {\n\tcase expr.Call != nil:\n\t\tbuilder := builder.WithCall()\n\t\tfor idx, grpcErr := range expr.Call.Errors {\n\t\t\tr.validateDuplicatedVariableNameWithGRPCError(ctx, nameMap, grpcErr, builder.WithError(idx))\n\t\t}\n\tcase expr.Switch != nil:\n\t\tr.validateDuplicatedVariableNameWithSwitch(ctx, nameMap, expr.Switch, builder.WithSwitch())\n\tcase expr.Validation != nil:\n\t\tr.validateDuplicatedVariableNameWithGRPCError(ctx, nameMap, expr.Validation.Error, builder.WithValidation().WithError())\n\t}\n}\n\nfunc (r *Resolver) validateDuplicatedVariableNameWithGRPCError(ctx *context, nameMap map[string]struct{}, grpcErr *GRPCError, builder *source.GRPCErrorOptionBuilder) {\n\tfor idx, def := range grpcErr.DefSet.Definitions() {\n\t\tr.validateDuplicatedVariableNameWithDef(ctx, nameMap, def, builder.WithDef(idx))\n\t}\n\tfor detailIdx, detail := range grpcErr.Details {\n\t\tbuilder := builder.WithDetail(detailIdx)\n\t\tfor defIdx, def := range detail.DefSet.Definitions() {\n\t\t\tr.validateDuplicatedVariableNameWithDef(ctx, nameMap, def, builder.WithDef(defIdx))\n\t\t}\n\t}\n}\n\nfunc (r *Resolver) validateDuplicatedVariableNameWithSwitch(ctx *context, nameMap map[string]struct{}, expr *SwitchExpr, builder *source.SwitchExprOptionBuilder) {\n\tfor idx, cse := range expr.Cases {\n\t\tr.validateDuplicatedVariableNameWithSwitchCase(ctx, nameMap, cse, builder.WithCase(idx))\n\t}\n\tr.validateDuplicatedVariableNameWithSwitchDefault(ctx, nameMap, expr.Default, builder.WithDefault())\n}\n\nfunc (r *Resolver) validateDuplicatedVariableNameWithSwitchCase(ctx *context, nameMap map[string]struct{}, cse *SwitchCaseExpr, builder *source.SwitchCaseExprOptionBuilder) {\n\tfor idx, def := range cse.DefSet.Definitions() {\n\t\tr.validateDuplicatedVariableNameWithDef(ctx, nameMap, def, builder.WithDef(idx))\n\t}\n}\n\nfunc (r *Resolver) validateDuplicatedVariableNameWithSwitchDefault(ctx *context, nameMap map[string]struct{}, def *SwitchDefaultExpr, builder *source.SwitchDefaultExprOptionBuilder) {\n\tfor idx, def := range def.DefSet.Definitions() {\n\t\tr.validateDuplicatedVariableNameWithDef(ctx, nameMap, def, builder.WithDef(idx))\n\t}\n}\n\nfunc (r *Resolver) validateMessageFields(ctx *context, msg *Message, builder *source.MessageBuilder) {\n\tif msg.Rule == nil {\n\t\treturn\n\t}\n\tfor _, field := range msg.Fields {\n\t\tbuilder := toFieldBuilder(builder, field)\n\t\tif !field.HasRule() {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\tfmt.Sprintf(`%q field in %q message needs to specify \"grpc.federation.field\" option`, field.Name, msg.FQDN()),\n\t\t\t\t\tbuilder.Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t\tcontinue\n\t\t}\n\t\tif field.HasMessageCustomResolver() || field.HasCustomResolver() {\n\t\t\tcontinue\n\t\t}\n\t\tif field.Type == nil {\n\t\t\tcontinue\n\t\t}\n\t\trule := field.Rule\n\t\tif rule.Value != nil {\n\t\t\t// If you are explicitly using CEL for field binding and the binding target uses multiple enum aliases,\n\t\t\t// we must bind the value of the EnumSelector.\n\t\t\t// Otherwise, an int type might be directly specified, making it unclear which enum it should be linked to.\n\t\t\tif err := r.validateEnumMultipleAliases(rule.Value.Type(), field); err != nil {\n\t\t\t\tctx.addError(\n\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\terr.Error(),\n\t\t\t\t\t\tbuilder.Location(),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tr.validateBindFieldType(ctx, rule.Value.Type(), field, builder)\n\t\t\t}\n\t\t}\n\t\tfor _, alias := range rule.Aliases {\n\t\t\tr.validateBindFieldType(ctx, alias.Type, field, builder)\n\t\t}\n\t\tif rule.AutoBindField != nil {\n\t\t\tr.validateBindFieldType(ctx, rule.AutoBindField.Field.Type, field, builder)\n\t\t}\n\t}\n}\n\nfunc (r *Resolver) validateRequestFieldType(ctx *context, fromType *Type, toField *Field, builder *source.RequestOptionBuilder) {\n\tif fromType == nil || toField == nil {\n\t\treturn\n\t}\n\ttoType := toField.Type\n\tif toType.Kind == types.Message {\n\t\tif fromType.Message == nil || toType.Message == nil {\n\t\t\treturn\n\t\t}\n\t\tif fromType.IsNumberWrapper() && toType.IsNumberWrapper() {\n\t\t\t// If both are of the number type from google.protobuf.wrappers, they can be mutually converted.\n\t\t\treturn\n\t\t}\n\t\tif fromType.Message.IsMapEntry && toType.Message.IsMapEntry {\n\t\t\tfor _, name := range []string{\"key\", \"value\"} {\n\t\t\t\tfromMapType := fromType.Message.Field(name).Type\n\t\t\t\ttoMapType := toType.Message.Field(name).Type\n\t\t\t\tif isDifferentType(fromMapType, toMapType) {\n\t\t\t\t\tctx.addError(\n\t\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\t\tfmt.Sprintf(\n\t\t\t\t\t\t\t\t`cannot convert type automatically: map %s type is %q but specified map %s type is %q`,\n\t\t\t\t\t\t\t\tname, toMapType.Kind.ToString(), name, fromMapType.Kind.ToString(),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tbuilder.Location(),\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t\tfromMessage := fromType.Message\n\t\tfromMessageName := fromType.Message.FQDN()\n\t\ttoMessage := toType.Message\n\t\ttoMessageName := toMessage.FQDN()\n\t\tif fromMessageName == toMessageName {\n\t\t\t// assignment of the same type is okay.\n\t\t\treturn\n\t\t}\n\t\tif !findMessageAliasName(fromMessage, toMessage) {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\tfmt.Sprintf(\n\t\t\t\t\t\t`required specify alias = %q in grpc.federation.message option for the %q type to automatically assign a value to the %q field`,\n\t\t\t\t\t\ttoMessageName, fromMessageName, toField.FQDN(),\n\t\t\t\t\t),\n\t\t\t\t\tbuilder.Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t\treturn\n\t\t}\n\t}\n\tif toType.Kind == types.Enum {\n\t\tif fromType.Enum == nil || toType.Enum == nil {\n\t\t\treturn\n\t\t}\n\t\tfromEnum := fromType.Enum\n\t\ttoEnum := toType.Enum\n\t\tfromEnumName := fromEnum.FQDN()\n\t\ttoEnumName := toEnum.FQDN()\n\t\tif fromEnumName == toEnumName {\n\t\t\t// assignment of the same type is okay.\n\t\t\treturn\n\t\t}\n\t\tvar fromEnumMessageName string\n\t\tif fromEnum.Message != nil {\n\t\t\tfromEnumMessageName = fromEnum.Message.Name\n\t\t}\n\t\tif !r.findEnumAliasName(fromEnum, toEnum) {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\tfmt.Sprintf(\n\t\t\t\t\t\t`required specify alias = %q in grpc.federation.enum option for the %q type to automatically assign a value to the %q field`,\n\t\t\t\t\t\ttoEnumName, fromEnumName, toField.FQDN(),\n\t\t\t\t\t),\n\t\t\t\t\tsource.NewEnumBuilder(ctx.fileName(), fromEnumMessageName, fromEnum.Name).Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t\treturn\n\t\t}\n\t}\n\tif isDifferentType(fromType, toField.Type) {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\tfmt.Sprintf(\n\t\t\t\t\t`cannot convert type automatically: field type is %q but specified value type is %q`,\n\t\t\t\t\ttoField.Type.Kind.ToString(), fromType.Kind.ToString(),\n\t\t\t\t),\n\t\t\t\tbuilder.Location(),\n\t\t\t),\n\t\t)\n\t\treturn\n\t}\n}\n\nfunc findMessageAliasName(from, to *Message) bool {\n\tfromName := from.FQDN()\n\ttoName := to.FQDN()\n\n\tif from.Rule != nil {\n\t\tfor _, alias := range from.Rule.Aliases {\n\t\t\tfromAliasName := alias.FQDN()\n\t\t\tif fromAliasName == toName {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t}\n\tif to.Rule != nil {\n\t\tfor _, alias := range to.Rule.Aliases {\n\t\t\ttoAliasName := alias.FQDN()\n\t\t\tif toAliasName == fromName {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (r *Resolver) findEnumAliasName(from, to *Enum) bool {\n\tfromName := from.FQDN()\n\ttoName := to.FQDN()\n\n\tif from.Rule != nil {\n\t\tfor _, alias := range from.Rule.Aliases {\n\t\t\tfromAliasName := alias.FQDN()\n\t\t\tif fromAliasName == toName {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t}\n\tif to.Rule != nil {\n\t\tfor _, alias := range to.Rule.Aliases {\n\t\t\ttoAliasName := alias.FQDN()\n\t\t\tif toAliasName == fromName {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (r *Resolver) validateBindFieldEnumSelectorType(ctx *context, enumSelector *Message, toField *Field, builder *source.FieldBuilder) {\n\tfor _, field := range enumSelector.Fields {\n\t\tif field.Type.Kind == types.Message && field.Type.Message.IsEnumSelector() {\n\t\t\tr.validateBindFieldEnumSelectorType(ctx, field.Type.Message, toField, builder)\n\t\t} else {\n\t\t\tr.validateBindFieldType(ctx, field.Type, toField, builder)\n\t\t}\n\t}\n}\n\nfunc (r *Resolver) validateBindFieldType(ctx *context, fromType *Type, toField *Field, builder *source.FieldBuilder) {\n\tif fromType == nil || toField == nil {\n\t\treturn\n\t}\n\ttoType := toField.Type\n\tif fromType.Kind == types.Message {\n\t\tif fromType.Message.IsEnumSelector() && toType.Kind == types.Enum {\n\t\t\tr.validateBindFieldEnumSelectorType(ctx, fromType.Message, toField, builder)\n\t\t\treturn\n\t\t}\n\t\tif toType.Kind != types.Message {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\tfmt.Sprintf(`cannot convert message to %q`, toType.Kind.ToString()),\n\t\t\t\t\tbuilder.Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t\treturn\n\t\t}\n\t\tif fromType.Message == nil || toType.Message == nil {\n\t\t\treturn\n\t\t}\n\t\tif fromType.IsNumberWrapper() && toType.IsNumberWrapper() {\n\t\t\t// If both are of the number type from google.protobuf.wrappers, they can be mutually converted.\n\t\t\treturn\n\t\t}\n\t\tif fromType.Message.IsMapEntry && toType.Message.IsMapEntry {\n\t\t\tfor _, name := range []string{\"key\", \"value\"} {\n\t\t\t\tfromMapType := fromType.Message.Field(name).Type\n\t\t\t\ttoMapType := toType.Message.Field(name).Type\n\t\t\t\tif isDifferentType(fromMapType, toMapType) {\n\t\t\t\t\tctx.addError(\n\t\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\t\tfmt.Sprintf(\n\t\t\t\t\t\t\t\t`cannot convert type automatically: map %s type is %q but specified map %s type is %q`,\n\t\t\t\t\t\t\t\tname, toMapType.Kind.ToString(), name, fromMapType.Kind.ToString(),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tbuilder.Location(),\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t\tfromMessage := fromType.Message\n\t\tfromMessageName := fromMessage.FQDN()\n\t\ttoMessage := toType.Message\n\t\ttoMessageName := toMessage.FQDN()\n\t\tif fromMessageName == toMessageName {\n\t\t\t// assignment of the same type is okay.\n\t\t\treturn\n\t\t}\n\t\tif !findMessageAliasName(fromMessage, toMessage) {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\tfmt.Sprintf(\n\t\t\t\t\t\t`required specify alias = %q in grpc.federation.message option for the %q type to automatically assign a value to the \"%s.%s\" field via autobind`,\n\t\t\t\t\t\tfromMessageName, toMessageName, ctx.messageName(), toField.Name,\n\t\t\t\t\t),\n\t\t\t\t\tbuilder.Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t\treturn\n\t\t}\n\t}\n\tif fromType.Kind == types.Enum {\n\t\tif fromType.Enum == nil || toType.Enum == nil {\n\t\t\treturn\n\t\t}\n\t\tfromEnum := fromType.Enum\n\t\tfromEnumName := fromEnum.FQDN()\n\t\ttoEnum := toType.Enum\n\t\ttoEnumName := toEnum.FQDN()\n\t\tvar toEnumMessageName string\n\t\tif toEnum.Message != nil {\n\t\t\ttoEnumMessageName = toEnum.Message.Name\n\t\t}\n\t\tif toEnumName == fromEnumName {\n\t\t\t// assignment of the same type is okay.\n\t\t\treturn\n\t\t}\n\t\tif !r.findEnumAliasName(fromEnum, toEnum) {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\tfmt.Sprintf(\n\t\t\t\t\t\t`required specify alias = %q in grpc.federation.enum option for the %q type to automatically assign a value to the \"%s.%s\" field via autobind`,\n\t\t\t\t\t\tfromEnumName, toEnumName, ctx.messageName(), toField.Name,\n\t\t\t\t\t),\n\t\t\t\t\tsource.NewEnumBuilder(ctx.fileName(), toEnumMessageName, toEnum.Name).Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t\treturn\n\t\t}\n\t}\n\tif isDifferentType(fromType, toField.Type) {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\tfmt.Sprintf(\n\t\t\t\t\t`cannot convert type automatically: field type is %q but specified value type is %q`,\n\t\t\t\t\ttoField.Type.Kind.ToString(), fromType.Kind.ToString(),\n\t\t\t\t),\n\t\t\t\tbuilder.Location(),\n\t\t\t),\n\t\t)\n\t\treturn\n\t}\n}\n\nfunc (r *Resolver) validateEnumMultipleAliases(fromType *Type, toField *Field) error {\n\ttoType := toField.Type\n\tif toType.Kind != types.Enum {\n\t\treturn nil\n\t}\n\tif toType.Enum == nil || toType.Enum.Rule == nil {\n\t\treturn nil\n\t}\n\tif len(toType.Enum.Rule.Aliases) <= 1 {\n\t\treturn nil\n\t}\n\n\tif fromType == nil {\n\t\treturn nil\n\t}\n\tif fromType.Enum == toType.Enum {\n\t\treturn nil\n\t}\n\tfor _, alias := range toType.Enum.Rule.Aliases {\n\t\tif fromType.Enum == alias {\n\t\t\treturn nil\n\t\t}\n\t}\n\tif fromType.IsEnumSelector() {\n\t\treturn nil\n\t}\n\treturn errors.New(`if multiple aliases are specified, you must use grpc.federation.enum.select function to bind`)\n}\n\nfunc (r *Resolver) resolveEnumRules(ctx *context, enums []*Enum) {\n\tfor _, enum := range enums {\n\t\tctx := ctx.withEnum(enum)\n\t\tbuilder := source.NewEnumBuilder(ctx.fileName(), ctx.messageName(), ctx.enumName())\n\t\tenum.Rule = r.resolveEnumRule(ctx, r.enumToRuleMap[enum], builder)\n\t\tfor _, value := range enum.Values {\n\t\t\tvalueBuilder := builder.WithValue(value.Value)\n\t\t\tvalue.Rule = r.resolveEnumValueRule(ctx, enum, value, r.enumValueToRuleMap[value], valueBuilder.WithOption())\n\t\t}\n\t\tfor attrName, enumValues := range enum.AttributeMap() {\n\t\t\tif len(enumValues) != len(enum.Values) {\n\t\t\t\tvalue := enumValues[0]\n\t\t\t\tfor idx, attr := range value.Rule.Attrs {\n\t\t\t\t\tif attr.Name == attrName {\n\t\t\t\t\t\tctx.addError(\n\t\t\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\t\t\tfmt.Sprintf(\n\t\t\t\t\t\t\t\t\t`%q attribute must be defined for all enum values, but it is only defined for %d/%d of them`,\n\t\t\t\t\t\t\t\t\tattrName,\n\t\t\t\t\t\t\t\t\tlen(enumValues),\n\t\t\t\t\t\t\t\t\tlen(enum.Values),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\tbuilder.WithValue(value.Value).WithOption().WithAttr(idx).WithName().Location(),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (r *Resolver) resolveServiceRule(ctx *context, svc *Service, def *federation.ServiceRule, builder *source.ServiceOptionBuilder) *ServiceRule {\n\tif def == nil {\n\t\treturn nil\n\t}\n\tenv := r.resolveEnv(ctx, def.GetEnv(), builder.WithEnv())\n\tvars := r.resolveServiceVariables(ctx.withVariableMap(), svc, env, def.GetVar(), builder)\n\treturn &ServiceRule{\n\t\tEnv:  env,\n\t\tVars: vars,\n\t}\n}\n\nfunc (r *Resolver) resolveEnv(ctx *context, def *federation.Env, builder *source.EnvBuilder) *Env {\n\tif def == nil {\n\t\treturn nil\n\t}\n\tif def.GetMessage() != \"\" && len(def.GetVar()) != 0 {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\t`\"message\" and \"var\" cannot be used simultaneously`,\n\t\t\t\tbuilder.Location(),\n\t\t\t),\n\t\t)\n\t\treturn nil\n\t}\n\n\tvar vars []*EnvVar\n\tif msgName := def.GetMessage(); msgName != \"\" {\n\t\tmsgBuilder := builder.WithMessage()\n\t\tvar msg *Message\n\t\tif strings.Contains(msgName, \".\") {\n\t\t\tpkg, err := r.lookupPackage(msgName)\n\t\t\tif err != nil {\n\t\t\t\tctx.addError(\n\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\terr.Error(),\n\t\t\t\t\t\tmsgBuilder.Location(),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tname := r.trimPackage(pkg, msgName)\n\t\t\tmsg = r.resolveMessage(ctx, pkg, name, source.ToLazyMessageBuilder(msgBuilder, name))\n\t\t} else {\n\t\t\tmsg = r.resolveMessage(ctx, ctx.file().Package, msgName, source.ToLazyMessageBuilder(msgBuilder, msgName))\n\t\t}\n\t\tif msg == nil {\n\t\t\treturn nil\n\t\t}\n\t\tfor _, field := range msg.Fields {\n\t\t\tvars = append(vars, r.resolveEnvVarWithField(field))\n\t\t}\n\t} else {\n\t\tfor idx, v := range def.GetVar() {\n\t\t\tev := r.resolveEnvVar(ctx, v, builder.WithVar(idx))\n\t\t\tif ev == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tvars = append(vars, ev)\n\t\t}\n\t}\n\treturn &Env{\n\t\tVars: vars,\n\t}\n}\n\nfunc (r *Resolver) resolveEnvVar(ctx *context, def *federation.EnvVar, builder *source.EnvVarBuilder) *EnvVar {\n\tname := def.GetName()\n\tif name == \"\" {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\t`\"name\" is required`,\n\t\t\t\tbuilder.WithName().Location(),\n\t\t\t),\n\t\t)\n\t\treturn nil\n\t}\n\tif err := r.validateName(name); err != nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\terr.Error(),\n\t\t\t\tbuilder.WithName().Location(),\n\t\t\t),\n\t\t)\n\t\treturn nil\n\t}\n\tenvType := def.GetType()\n\tif envType == nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\t`\"type\" is required`,\n\t\t\t\tbuilder.WithType().Location(),\n\t\t\t),\n\t\t)\n\t\treturn nil\n\t}\n\ttyp, err := r.resolveEnvType(envType, false)\n\tif err != nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\terr.Error(),\n\t\t\t\tbuilder.WithType().Location(),\n\t\t\t),\n\t\t)\n\t\treturn nil\n\t}\n\tif typ.Message != nil && typ.Message.IsMapEntry {\n\t\tmp := typ.Message\n\t\tmp.Name = cases.Title(language.Und).String(name) + \"Entry\"\n\t\tfile := ctx.file()\n\t\tcopied := *file\n\t\tcopied.Package = &Package{Name: file.PrivatePackageName()}\n\t\tmp.File = &copied\n\t\tr.cachedMessageMap[mp.FQDN()] = mp\n\t}\n\treturn &EnvVar{\n\t\tName:   name,\n\t\tType:   typ,\n\t\tOption: r.resolveEnvVarOption(def.GetOption()),\n\t}\n}\n\nfunc (r *Resolver) resolveEnvVarWithField(field *Field) *EnvVar {\n\tvar opt *EnvVarOption\n\tif field.Rule != nil {\n\t\topt = field.Rule.Env\n\t}\n\treturn &EnvVar{\n\t\tName:   field.Name,\n\t\tType:   field.Type,\n\t\tOption: opt,\n\t}\n}\n\nfunc (r *Resolver) resolveEnvType(def *federation.EnvType, repeated bool) (*Type, error) {\n\tswitch def.Type.(type) {\n\tcase *federation.EnvType_Kind:\n\t\tswitch def.GetKind() {\n\t\tcase federation.TypeKind_STRING:\n\t\t\tif repeated {\n\t\t\t\treturn StringRepeatedType, nil\n\t\t\t}\n\t\t\treturn StringType, nil\n\t\tcase federation.TypeKind_BOOL:\n\t\t\tif repeated {\n\t\t\t\treturn BoolRepeatedType, nil\n\t\t\t}\n\t\t\treturn BoolType, nil\n\t\tcase federation.TypeKind_INT64:\n\t\t\tif repeated {\n\t\t\t\treturn Int64RepeatedType, nil\n\t\t\t}\n\t\t\treturn Int64Type, nil\n\t\tcase federation.TypeKind_UINT64:\n\t\t\tif repeated {\n\t\t\t\treturn Uint64RepeatedType, nil\n\t\t\t}\n\t\t\treturn Uint64Type, nil\n\t\tcase federation.TypeKind_DOUBLE:\n\t\t\tif repeated {\n\t\t\t\treturn DoubleRepeatedType, nil\n\t\t\t}\n\t\t\treturn DoubleType, nil\n\t\tcase federation.TypeKind_DURATION:\n\t\t\tif repeated {\n\t\t\t\treturn DurationRepeatedType, nil\n\t\t\t}\n\t\t\treturn DurationType, nil\n\t\t}\n\tcase *federation.EnvType_Repeated:\n\t\treturn r.resolveEnvType(def.GetRepeated(), true)\n\tcase *federation.EnvType_Map:\n\t\tmapType := def.GetMap()\n\t\tkey, err := r.resolveEnvType(mapType.GetKey(), false)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tvalue, err := r.resolveEnvType(mapType.GetValue(), false)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn NewMapType(key, value), nil\n\t}\n\treturn nil, fmt.Errorf(\"failed to resolve env type\")\n}\n\nfunc (r *Resolver) resolveEnvVarOption(def *federation.EnvVarOption) *EnvVarOption {\n\tif def == nil {\n\t\treturn nil\n\t}\n\treturn &EnvVarOption{\n\t\tAlternate: def.GetAlternate(),\n\t\tDefault:   def.GetDefault(),\n\t\tRequired:  def.GetRequired(),\n\t\tIgnored:   def.GetIgnored(),\n\t}\n}\n\nfunc (r *Resolver) resolveServiceVariables(ctx *context, svc *Service, env *Env, def []*federation.ServiceVariable, builder *source.ServiceOptionBuilder) []*ServiceVariable {\n\tif len(def) == 0 {\n\t\treturn nil\n\t}\n\n\tsvcVars := make([]*ServiceVariable, 0, len(def))\n\tnameMap := make(map[string]struct{})\n\tcelEnv, err := r.createServiceCELEnv(ctx, svc, env)\n\tif err != nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\terr.Error(),\n\t\t\t\tbuilder.Location(),\n\t\t\t),\n\t\t)\n\t\treturn nil\n\t}\n\tfor idx, v := range def {\n\t\tsvcVar := r.resolveServiceVariable(ctx, celEnv, v, nameMap, builder.WithVar(idx))\n\t\tif svcVar == nil {\n\t\t\tcontinue\n\t\t}\n\t\tif svcVar.Name != \"\" && svcVar.Expr != nil && svcVar.Expr.Type != nil {\n\t\t\tnewEnv, err := celEnv.Extend(cel.Variable(svcVar.Name, ToCELType(svcVar.Expr.Type)))\n\t\t\tif err != nil {\n\t\t\t\tctx.addError(\n\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\tfmt.Sprintf(`failed to extend cel.Env from service variables: %s`, err.Error()),\n\t\t\t\t\t\tbuilder.Location(),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tcelEnv = newEnv\n\t\t}\n\t\tctx.addVariableDefinition(svcVar.ToVariableDefinition())\n\t\tnameMap[svcVar.Name] = struct{}{}\n\t\tsvcVars = append(svcVars, svcVar)\n\t}\n\treturn svcVars\n}\n\nfunc (r *Resolver) resolveServiceVariable(ctx *context, env *cel.Env, def *federation.ServiceVariable, nameMap map[string]struct{}, builder *source.ServiceVariableBuilder) *ServiceVariable {\n\tname := def.GetName()\n\tif name == \"\" && def.GetValidation() == nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\t\"variable name is not found\",\n\t\t\t\tbuilder.WithName().Location(),\n\t\t\t),\n\t\t)\n\t\treturn nil\n\t}\n\tif err := r.validateName(name); err != nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\terr.Error(),\n\t\t\t\tbuilder.WithName().Location(),\n\t\t\t),\n\t\t)\n\t\treturn nil\n\t}\n\tif _, exists := nameMap[name]; exists {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\tfmt.Sprintf(\"found duplicated variable name %q\", name),\n\t\t\t\tbuilder.WithName().Location(),\n\t\t\t),\n\t\t)\n\t\treturn nil\n\t}\n\tvar ifValue *CELValue\n\tif def.GetIf() != \"\" {\n\t\tifValue = &CELValue{Expr: def.GetIf()}\n\t\tif err := r.resolveCELValue(ctx, env, ifValue); err != nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\terr.Error(),\n\t\t\t\t\tbuilder.WithIf().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t\treturn nil\n\t\t}\n\t\tif ifValue.Out != nil {\n\t\t\tif ifValue.Out.Kind != types.Bool {\n\t\t\t\tctx.addError(\n\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\tfmt.Sprintf(`return value of \"if\" must be bool type but got %s type`, ifValue.Out.Kind.ToString()),\n\t\t\t\t\t\tbuilder.WithIf().Location(),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}\n\t\t\treturn nil\n\t\t}\n\t}\n\n\texpr := r.resolveServiceVariableExpr(ctx, def, builder)\n\tswitch {\n\tcase expr.By != nil:\n\t\tif err := r.resolveCELValue(ctx, env, expr.By); err != nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\terr.Error(),\n\t\t\t\t\tbuilder.WithBy().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t\treturn nil\n\t\t}\n\t\texpr.Type = expr.By.Out\n\tcase expr.Message != nil:\n\t\texpr.Type = r.resolveMessageExprCELValues(ctx, env, expr.Message, builder.WithMessage())\n\tcase expr.Enum != nil:\n\t\texpr.Type = r.resolveEnumExprCELValues(ctx, env, expr.Enum, builder.WithEnum())\n\tcase expr.Map != nil:\n\t\texpr.Type = r.resolveMapExprCELValues(ctx, env, expr.Map, builder.WithMap())\n\tcase expr.Switch != nil:\n\t\texpr.Type = r.resolveSwitchExprCELValues(ctx, env, expr.Switch, builder.WithSwitch())\n\tcase expr.Validation != nil:\n\t\tvalidationIfValue := expr.Validation.If\n\t\tbuilder := builder.WithValidation()\n\t\tif err := r.resolveCELValue(ctx, env, validationIfValue); err != nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\terr.Error(),\n\t\t\t\t\tbuilder.WithIf().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t\treturn nil\n\t\t}\n\t\tif validationIfValue.Out != nil {\n\t\t\tif validationIfValue.Out.Kind != types.Bool {\n\t\t\t\tctx.addError(\n\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\tfmt.Sprintf(`return value of \"if\" must be bool type but got %s type`, validationIfValue.Out.Kind.ToString()),\n\t\t\t\t\t\tbuilder.WithIf().Location(),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tmsgValue := expr.Validation.Message\n\t\tif err := r.resolveCELValue(ctx, env, msgValue); err != nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\terr.Error(),\n\t\t\t\t\tbuilder.WithMessage().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t\treturn nil\n\t\t}\n\t\tif msgValue.Out != nil {\n\t\t\tif msgValue.Out.Kind != types.String {\n\t\t\t\tctx.addError(\n\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\tfmt.Sprintf(`return value of \"message\" must be string type but got %s type`, msgValue.Out.Kind.ToString()),\n\t\t\t\t\t\tbuilder.WithMessage().Location(),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\texpr.Type = BoolType\n\t}\n\treturn &ServiceVariable{\n\t\tName: name,\n\t\tIf:   ifValue,\n\t\tExpr: expr,\n\t}\n}\n\nfunc (r *Resolver) resolveServiceVariableExpr(ctx *context, def *federation.ServiceVariable, builder *source.ServiceVariableBuilder) *ServiceVariableExpr {\n\tswitch def.GetExpr().(type) {\n\tcase *federation.ServiceVariable_By:\n\t\treturn &ServiceVariableExpr{By: &CELValue{Expr: def.GetBy()}}\n\tcase *federation.ServiceVariable_Map:\n\t\treturn &ServiceVariableExpr{Map: r.resolveMapExpr(ctx, def.GetMap(), builder.WithMap())}\n\tcase *federation.ServiceVariable_Message:\n\t\treturn &ServiceVariableExpr{Message: r.resolveMessageExpr(ctx, def.GetMessage(), builder.WithMessage())}\n\tcase *federation.ServiceVariable_Enum:\n\t\treturn &ServiceVariableExpr{Enum: r.resolveEnumExpr(ctx, def.GetEnum(), builder.WithEnum())}\n\tcase *federation.ServiceVariable_Switch:\n\t\treturn &ServiceVariableExpr{Switch: r.resolveSwitchExpr(ctx, def.GetSwitch(), builder.WithSwitch())}\n\tcase *federation.ServiceVariable_Validation:\n\t\treturn &ServiceVariableExpr{Validation: r.resolveServiceVariableValidationExpr(ctx, def.GetValidation(), builder.WithValidation())}\n\t}\n\treturn nil\n}\n\nfunc (r *Resolver) resolveServiceVariableValidationExpr(ctx *context, def *federation.ServiceVariableValidationExpr, builder *source.ServiceVariableValidationExprBuilder) *ServiceVariableValidationExpr {\n\tif def.GetIf() == \"\" {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\t\"required if value\",\n\t\t\t\tbuilder.WithIf().Location(),\n\t\t\t),\n\t\t)\n\t\treturn nil\n\t}\n\tif def.GetMessage() == \"\" {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\t\"required message value\",\n\t\t\t\tbuilder.WithMessage().Location(),\n\t\t\t),\n\t\t)\n\t\treturn nil\n\t}\n\treturn &ServiceVariableValidationExpr{\n\t\tIf:      &CELValue{Expr: def.GetIf()},\n\t\tMessage: &CELValue{Expr: def.GetMessage()},\n\t}\n}\n\nfunc (r *Resolver) resolveMethodRule(ctx *context, mtd *Method, def *federation.MethodRule, builder *source.MethodBuilder) *MethodRule {\n\tif def == nil {\n\t\treturn nil\n\t}\n\toptBuilder := builder.WithOption()\n\trule := &MethodRule{}\n\ttimeout := def.GetTimeout()\n\tif timeout != \"\" {\n\t\tduration, err := time.ParseDuration(timeout)\n\t\tif err != nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\terr.Error(),\n\t\t\t\t\toptBuilder.WithTimeout().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t} else {\n\t\t\trule.Timeout = &duration\n\t\t}\n\t}\n\tif response := def.GetResponse(); response != \"\" {\n\t\tresBuilder := optBuilder.WithResponse()\n\t\tmsg, err := r.resolveMessageByName(ctx, response, source.ToLazyMessageBuilder(resBuilder, response))\n\t\tif err != nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\terr.Error(),\n\t\t\t\t\tresBuilder.Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t\tif msg != nil && mtd.Response != nil {\n\t\t\tvar notFoundFields []string\n\t\t\tfor _, orgField := range mtd.Response.Fields {\n\t\t\t\taliasField := msg.Field(orgField.Name)\n\t\t\t\tif aliasField == nil {\n\t\t\t\t\tnotFoundFields = append(notFoundFields, fmt.Sprintf(\"%q\", orgField.Name))\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif isDifferentType(aliasField.Type, orgField.Type) {\n\t\t\t\t\tnotFoundFields = append(notFoundFields, fmt.Sprintf(\"%q\", orgField.Name))\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\t\t\tif len(notFoundFields) != 0 {\n\t\t\t\tctx.addError(\n\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\tfmt.Sprintf(\n\t\t\t\t\t\t\t`%q message must contain fields with the same names and types as the %s fields in the %q message`,\n\t\t\t\t\t\t\tmsg.FQDN(), strings.Join(notFoundFields, \", \"), mtd.Response.FQDN(),\n\t\t\t\t\t\t),\n\t\t\t\t\t\tresBuilder.Location(),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}\n\t\t\trule.Response = msg\n\t\t}\n\t}\n\treturn rule\n}\n\nfunc (r *Resolver) resolveMessageRule(ctx *context, msg *Message, ruleDef *federation.MessageRule, builder *source.MessageOptionBuilder) {\n\tif ruleDef == nil {\n\t\treturn\n\t}\n\tfor idx, def := range ruleDef.GetDef() {\n\t\tname := def.GetName()\n\t\tif name == \"\" {\n\t\t\tn := fmt.Sprintf(\"_def%d\", idx)\n\t\t\tdef.Name = &n\n\t\t} else {\n\t\t\tif err := r.validateName(name); err != nil {\n\t\t\t\tempty := \"\"\n\t\t\t\tdef.Name = &empty\n\t\t\t\tctx.addError(ErrWithLocation(\n\t\t\t\t\terr.Error(),\n\t\t\t\t\tbuilder.WithDef(idx).WithName().Location(),\n\t\t\t\t))\n\t\t\t}\n\t\t}\n\t}\n\tmsg.Rule = &MessageRule{\n\t\tDefSet: &VariableDefinitionSet{\n\t\t\tDefs: r.resolveVariableDefinitions(ctx.withVariableMap(), ruleDef.GetDef(), func(idx int) *source.VariableDefinitionOptionBuilder {\n\t\t\t\treturn builder.WithDef(idx)\n\t\t\t}),\n\t\t},\n\t\tCustomResolver: ruleDef.GetCustomResolver(),\n\t\tAliases:        r.resolveMessageAliases(ctx, ruleDef.GetAlias(), builder),\n\t}\n}\n\nfunc (r *Resolver) resolveMessageAliases(ctx *context, aliasNames []string, builder *source.MessageOptionBuilder) []*Message {\n\tif len(aliasNames) == 0 {\n\t\treturn nil\n\t}\n\tvar ret []*Message\n\tfor _, aliasName := range aliasNames {\n\t\tif strings.Contains(aliasName, \".\") {\n\t\t\tpkg, err := r.lookupPackage(aliasName)\n\t\t\tif err != nil {\n\t\t\t\tctx.addError(\n\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\terr.Error(),\n\t\t\t\t\t\tbuilder.WithAlias().Location(),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tname := r.trimPackage(pkg, aliasName)\n\t\t\tif alias := r.resolveMessage(ctx, pkg, name, source.ToLazyMessageBuilder(builder, name)); alias != nil {\n\t\t\t\tret = append(ret, alias)\n\t\t\t}\n\t\t} else {\n\t\t\tif alias := r.resolveMessage(ctx, ctx.file().Package, aliasName, source.ToLazyMessageBuilder(builder, aliasName)); alias != nil {\n\t\t\t\tret = append(ret, alias)\n\t\t\t}\n\t\t}\n\t}\n\treturn ret\n}\n\nfunc (r *Resolver) resolveVariableDefinitions(ctx *context, varDefs []*federation.VariableDefinition, builderFn func(idx int) *source.VariableDefinitionOptionBuilder) []*VariableDefinition {\n\tvar ret []*VariableDefinition\n\tfor idx, varDef := range varDefs {\n\t\tctx := ctx.withDefIndex(idx)\n\t\tvd := r.resolveVariableDefinition(ctx, varDef, builderFn(idx))\n\t\tctx.addVariableDefinition(vd)\n\t\tret = append(ret, vd)\n\t}\n\treturn ret\n}\n\nfunc (r *Resolver) resolveVariableDefinition(ctx *context, varDef *federation.VariableDefinition, builder *source.VariableDefinitionOptionBuilder) *VariableDefinition {\n\tvar ifValue *CELValue\n\tif varDef.GetIf() != \"\" {\n\t\tifValue = &CELValue{Expr: varDef.GetIf()}\n\t}\n\treturn &VariableDefinition{\n\t\tIdx:      ctx.defIndex(),\n\t\tName:     varDef.GetName(),\n\t\tIf:       ifValue,\n\t\tAutoBind: varDef.GetAutobind(),\n\t\tExpr:     r.resolveVariableExpr(ctx, varDef, builder),\n\t\tbuilder:  builder,\n\t}\n}\n\nfunc (r *Resolver) resolveVariableExpr(ctx *context, varDef *federation.VariableDefinition, builder *source.VariableDefinitionOptionBuilder) *VariableExpr {\n\tswitch varDef.GetExpr().(type) {\n\tcase *federation.VariableDefinition_By:\n\t\treturn &VariableExpr{By: &CELValue{Expr: varDef.GetBy()}}\n\tcase *federation.VariableDefinition_Map:\n\t\treturn &VariableExpr{Map: r.resolveMapExpr(ctx, varDef.GetMap(), builder.WithMap())}\n\tcase *federation.VariableDefinition_Message:\n\t\treturn &VariableExpr{Message: r.resolveMessageExpr(ctx, varDef.GetMessage(), builder.WithMessage())}\n\tcase *federation.VariableDefinition_Enum:\n\t\treturn &VariableExpr{Enum: r.resolveEnumExpr(ctx, varDef.GetEnum(), builder.WithEnum())}\n\tcase *federation.VariableDefinition_Call:\n\t\treturn &VariableExpr{Call: r.resolveCallExpr(ctx, varDef.GetCall(), builder.WithCall())}\n\tcase *federation.VariableDefinition_Switch:\n\t\treturn &VariableExpr{Switch: r.resolveSwitchExpr(ctx, varDef.GetSwitch(), builder.WithSwitch())}\n\tcase *federation.VariableDefinition_Validation:\n\t\treturn &VariableExpr{Validation: r.resolveValidationExpr(ctx, varDef.GetValidation(), builder.WithValidation())}\n\t}\n\treturn nil\n}\n\nfunc (r *Resolver) resolveMapExpr(ctx *context, def *federation.MapExpr, builder *source.MapExprOptionBuilder) *MapExpr {\n\tif def == nil {\n\t\treturn nil\n\t}\n\treturn &MapExpr{\n\t\tIterator: r.resolveMapIterator(ctx, def.GetIterator(), builder),\n\t\tExpr:     r.resolveMapIteratorExpr(ctx, def, builder),\n\t}\n}\n\nfunc (r *Resolver) resolveMapIterator(ctx *context, def *federation.Iterator, builder *source.MapExprOptionBuilder) *Iterator {\n\tname := def.GetName()\n\tif name == \"\" {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\t\"map iterator name must be specified\",\n\t\t\t\tbuilder.WithIteratorName().Location(),\n\t\t\t),\n\t\t)\n\t}\n\tvar srcDef *VariableDefinition\n\tif src := def.GetSrc(); src == \"\" {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\t\"map iterator src must be specified\",\n\t\t\t\tbuilder.WithIteratorSource().Location(),\n\t\t\t),\n\t\t)\n\t} else {\n\t\tsrcDef = ctx.variableDef(src)\n\t\tif srcDef == nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\tfmt.Sprintf(`%q variable is not defined`, src),\n\t\t\t\t\tbuilder.WithIteratorSource().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t}\n\treturn &Iterator{\n\t\tName:   name,\n\t\tSource: srcDef,\n\t}\n}\n\nfunc (r *Resolver) resolveMapIteratorExpr(ctx *context, def *federation.MapExpr, builder *source.MapExprOptionBuilder) *MapIteratorExpr {\n\tswitch def.GetExpr().(type) {\n\tcase *federation.MapExpr_By:\n\t\treturn &MapIteratorExpr{By: &CELValue{Expr: def.GetBy()}}\n\tcase *federation.MapExpr_Message:\n\t\treturn &MapIteratorExpr{Message: r.resolveMessageExpr(ctx, def.GetMessage(), builder.WithMessage())}\n\tcase *federation.MapExpr_Enum:\n\t\treturn &MapIteratorExpr{Enum: r.resolveEnumExpr(ctx, def.GetEnum(), builder.WithEnum())}\n\t}\n\treturn nil\n}\n\nfunc (r *Resolver) resolveMessageExpr(ctx *context, def *federation.MessageExpr, builder *source.MessageExprOptionBuilder) *MessageExpr {\n\tif def == nil {\n\t\treturn nil\n\t}\n\tmsg, err := r.resolveMessageByName(ctx, def.GetName(), source.ToLazyMessageBuilder(builder, def.GetName()))\n\tif err != nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\terr.Error(),\n\t\t\t\tbuilder.WithName().Location(),\n\t\t\t),\n\t\t)\n\t}\n\tif ctx.msg == msg {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\tfmt.Sprintf(`recursive definition: %q is own message name`, msg.Name),\n\t\t\t\tbuilder.WithName().Location(),\n\t\t\t),\n\t\t)\n\t}\n\targs := make([]*Argument, 0, len(def.GetArgs()))\n\tfor idx, argDef := range def.GetArgs() {\n\t\targs = append(args, r.resolveMessageExprArgument(ctx, argDef, builder.WithArgs(idx)))\n\t}\n\treturn &MessageExpr{\n\t\tMessage: msg,\n\t\tArgs:    args,\n\t}\n}\n\nfunc (r *Resolver) resolveEnumExpr(ctx *context, def *federation.EnumExpr, builder *source.EnumExprOptionBuilder) *EnumExpr {\n\tif def == nil {\n\t\treturn nil\n\t}\n\tenum, err := r.resolveEnumByName(ctx, def.GetName(), source.ToLazyEnumBuilder(builder, def.GetName()))\n\tif err != nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\terr.Error(),\n\t\t\t\tbuilder.WithName().Location(),\n\t\t\t),\n\t\t)\n\t}\n\tby := def.GetBy()\n\tif by == \"\" {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\t`\"by\" is required`,\n\t\t\t\tbuilder.WithBy().Location(),\n\t\t\t),\n\t\t)\n\t}\n\treturn &EnumExpr{\n\t\tEnum: enum,\n\t\tBy:   &CELValue{Expr: by},\n\t}\n}\n\nfunc (r *Resolver) resolveCallExpr(ctx *context, def *federation.CallExpr, builder *source.CallExprOptionBuilder) *CallExpr {\n\tif def == nil {\n\t\treturn nil\n\t}\n\n\tpkgName, serviceName, methodName, err := r.splitMethodFullName(ctx.file().Package, def.GetMethod())\n\tif err != nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\terr.Error(),\n\t\t\t\tbuilder.WithMethod().Location(),\n\t\t\t),\n\t\t)\n\t\treturn nil\n\t}\n\tpkg, exists := r.protoPackageNameToPackage[pkgName]\n\tif !exists {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\tfmt.Sprintf(`%q package does not exist`, pkgName),\n\t\t\t\tbuilder.WithMethod().Location(),\n\t\t\t),\n\t\t)\n\t\treturn nil\n\t}\n\tservice := r.resolveService(ctx, pkg, serviceName, source.NewServiceBuilder(ctx.fileName(), serviceName))\n\tif service == nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\tfmt.Sprintf(`cannot find %q method because the service to which the method belongs does not exist`, methodName),\n\t\t\t\tbuilder.WithMethod().Location(),\n\t\t\t),\n\t\t)\n\t\treturn nil\n\t}\n\n\tmethod := service.Method(methodName)\n\tif method == nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\tfmt.Sprintf(`%q method does not exist in %s service`, methodName, service.Name),\n\t\t\t\tbuilder.WithMethod().Location(),\n\t\t\t),\n\t\t)\n\t\treturn nil\n\t}\n\n\tvar timeout *time.Duration\n\ttimeoutDef := def.GetTimeout()\n\tif timeoutDef != \"\" {\n\t\tduration, err := time.ParseDuration(timeoutDef)\n\t\tif err != nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\terr.Error(),\n\t\t\t\t\tbuilder.WithTimeout().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t} else {\n\t\t\ttimeout = &duration\n\t\t}\n\t}\n\tvar grpcErrs []*GRPCError\n\tfor idx, grpcErr := range def.GetError() {\n\t\tgrpcErrs = append(grpcErrs, r.resolveGRPCError(ctx, grpcErr, builder.WithError(idx)))\n\t}\n\tvar md *CELValue\n\tif v := def.GetMetadata(); v != \"\" {\n\t\tmd = &CELValue{Expr: v}\n\t}\n\treturn &CallExpr{\n\t\tMethod:   method,\n\t\tRequest:  r.resolveRequest(ctx, method, def.GetRequest(), builder),\n\t\tTimeout:  timeout,\n\t\tRetry:    r.resolveRetry(ctx, def.GetRetry(), timeout, builder.WithRetry()),\n\t\tOption:   r.resolveGRPCCallOption(ctx, def.GetOption(), builder.WithOption()),\n\t\tMetadata: md,\n\t\tErrors:   grpcErrs,\n\t}\n}\n\nfunc (r *Resolver) resolveValidationExpr(ctx *context, def *federation.ValidationExpr, builder *source.ValidationExprOptionBuilder) *ValidationExpr {\n\tgrpcErr := r.resolveGRPCError(ctx, def.GetError(), builder.WithError())\n\tif grpcErr.Code == nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\t`\"code\" field is required in validation`,\n\t\t\t\tbuilder.WithError().Location(),\n\t\t\t),\n\t\t)\n\t}\n\tif grpcErr.Ignore {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\t`validation doesn't support \"ignore\" feature`,\n\t\t\t\tbuilder.WithError().WithIgnore().Location(),\n\t\t\t),\n\t\t)\n\t}\n\tif grpcErr.IgnoreAndResponse != nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\t`validation doesn't support \"ignore_and_response\" feature`,\n\t\t\t\tbuilder.WithError().WithIgnoreAndResponse().Location(),\n\t\t\t),\n\t\t)\n\t}\n\treturn &ValidationExpr{\n\t\tName:  def.GetName(),\n\t\tError: grpcErr,\n\t}\n}\n\nfunc (r *Resolver) resolveSwitchExpr(ctx *context, def *federation.SwitchExpr, builder *source.SwitchExprOptionBuilder) *SwitchExpr {\n\tif def == nil {\n\t\treturn nil\n\t}\n\tif len(def.GetCase()) == 0 {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\t`at least one \"case\" must be defined`,\n\t\t\t\tbuilder.Location(),\n\t\t\t),\n\t\t)\n\t}\n\tif def.GetDefault() == nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\t`\"default\" must be defined`,\n\t\t\t\tbuilder.Location(),\n\t\t\t),\n\t\t)\n\t}\n\treturn &SwitchExpr{\n\t\tCases: r.resolveSwitchCases(ctx, def.GetCase(), func(idx int) *source.SwitchCaseExprOptionBuilder {\n\t\t\treturn builder.WithCase(idx)\n\t\t}),\n\t\tDefault: r.resolveSwitchDefaultExpr(ctx, def.GetDefault(), builder.WithDefault()),\n\t}\n}\n\nfunc (r *Resolver) resolveSwitchCases(ctx *context, cases []*federation.SwitchCaseExpr, builderFn func(int) *source.SwitchCaseExprOptionBuilder) []*SwitchCaseExpr {\n\tresult := make([]*SwitchCaseExpr, 0, len(cases))\n\n\tfor idx, caseDef := range cases {\n\t\tresult = append(result, r.resolveSwitchCaseExpr(ctx, caseDef, idx, builderFn(idx)))\n\t}\n\treturn result\n}\n\nfunc (r *Resolver) resolveSwitchCaseExpr(ctx *context, def *federation.SwitchCaseExpr, caseIdx int, builder *source.SwitchCaseExprOptionBuilder) *SwitchCaseExpr {\n\tfor defIdx, d := range def.GetDef() {\n\t\tname := d.GetName()\n\t\tif name == \"\" {\n\t\t\tn := fmt.Sprintf(\"_def%d_case%d_def%d\", ctx.defIndex(), caseIdx, defIdx)\n\t\t\td.Name = &n\n\t\t} else {\n\t\t\tif err := r.validateName(name); err != nil {\n\t\t\t\tempty := \"\"\n\t\t\t\td.Name = &empty\n\t\t\t\tctx.addError(ErrWithLocation(\n\t\t\t\t\terr.Error(),\n\t\t\t\t\tbuilder.WithDef(defIdx).WithName().Location(),\n\t\t\t\t))\n\t\t\t}\n\t\t}\n\t}\n\n\treturn &SwitchCaseExpr{\n\t\tDefSet: &VariableDefinitionSet{\n\t\t\tDefs: r.resolveVariableDefinitions(ctx.withVariableMap(), def.GetDef(), func(idx int) *source.VariableDefinitionOptionBuilder {\n\t\t\t\treturn builder.WithDef(idx)\n\t\t\t}),\n\t\t},\n\t\tIf: &CELValue{Expr: def.GetIf()},\n\t\tBy: &CELValue{Expr: def.GetBy()},\n\t}\n}\n\nfunc (r *Resolver) resolveSwitchDefaultExpr(ctx *context, def *federation.SwitchDefaultExpr, builder *source.SwitchDefaultExprOptionBuilder) *SwitchDefaultExpr {\n\tfor idx, d := range def.GetDef() {\n\t\tname := d.GetName()\n\t\tif name == \"\" {\n\t\t\tn := fmt.Sprintf(\"_def%d_default_def%d\", ctx.defIndex(), idx)\n\t\t\td.Name = &n\n\t\t} else {\n\t\t\tif err := r.validateName(name); err != nil {\n\t\t\t\tempty := \"\"\n\t\t\t\td.Name = &empty\n\t\t\t\tctx.addError(ErrWithLocation(\n\t\t\t\t\terr.Error(),\n\t\t\t\t\tbuilder.WithDef(idx).WithName().Location(),\n\t\t\t\t))\n\t\t\t}\n\t\t}\n\t}\n\treturn &SwitchDefaultExpr{\n\t\tDefSet: &VariableDefinitionSet{\n\t\t\tDefs: r.resolveVariableDefinitions(ctx.withVariableMap(), def.GetDef(), func(idx int) *source.VariableDefinitionOptionBuilder {\n\t\t\t\treturn builder.WithDef(idx)\n\t\t\t}),\n\t\t},\n\t\tBy: &CELValue{Expr: def.GetBy()},\n\t}\n}\n\nfunc (r *Resolver) resolveGRPCError(ctx *context, def *federation.GRPCError, builder *source.GRPCErrorOptionBuilder) *GRPCError {\n\tvar (\n\t\tmsg               *CELValue\n\t\tignoreAndResponse *CELValue\n\t)\n\tif m := def.GetMessage(); m != \"\" {\n\t\tmsg = &CELValue{Expr: m}\n\t}\n\tif res := def.GetIgnoreAndResponse(); res != \"\" {\n\t\tif def.GetIgnore() {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\t`cannot set both \"ignore\" and \"ignore_and_response\"`,\n\t\t\t\t\tbuilder.WithIgnore().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\t`cannot set both \"ignore\" and \"ignore_and_response\"`,\n\t\t\t\t\tbuilder.WithIgnoreAndResponse().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t\tignoreAndResponse = &CELValue{Expr: res}\n\t}\n\tfor idx, errDef := range def.GetDef() {\n\t\tname := errDef.GetName()\n\t\tif name == \"\" {\n\t\t\tn := fmt.Sprintf(\"_def%d_def%d\", ctx.defIndex(), idx)\n\t\t\terrDef.Name = &n\n\t\t} else {\n\t\t\tif err := r.validateName(name); err != nil {\n\t\t\t\tempty := \"\"\n\t\t\t\terrDef.Name = &empty\n\t\t\t\tctx.addError(ErrWithLocation(\n\t\t\t\t\terr.Error(),\n\t\t\t\t\tbuilder.WithDef(idx).WithName().Location(),\n\t\t\t\t))\n\t\t\t}\n\t\t}\n\t}\n\treturn &GRPCError{\n\t\tDefSet: &VariableDefinitionSet{\n\t\t\tDefs: r.resolveVariableDefinitions(ctx.withVariableMap(), def.GetDef(), func(idx int) *source.VariableDefinitionOptionBuilder {\n\t\t\t\treturn builder.WithDef(idx)\n\t\t\t}),\n\t\t},\n\t\tIf:                r.resolveGRPCErrorIf(def.GetIf()),\n\t\tCode:              def.Code,\n\t\tMessage:           msg,\n\t\tDetails:           r.resolveGRPCErrorDetails(ctx, def.GetDetails(), builder),\n\t\tIgnore:            def.GetIgnore(),\n\t\tIgnoreAndResponse: ignoreAndResponse,\n\t\tLogLevel:          r.resolveGRPCErrorLogLevel(def.GetLogLevel()),\n\t}\n}\n\nfunc (r *Resolver) resolveGRPCErrorLogLevel(l federation.GRPCError_LogLevel) slog.Level {\n\tswitch l {\n\tcase federation.GRPCError_DEBUG:\n\t\treturn slog.LevelDebug\n\tcase federation.GRPCError_INFO:\n\t\treturn slog.LevelInfo\n\tcase federation.GRPCError_WARN:\n\t\treturn slog.LevelWarn\n\t}\n\treturn slog.LevelError\n}\n\nfunc (r *Resolver) resolveGRPCErrorIf(expr string) *CELValue {\n\tif expr == \"\" {\n\t\treturn &CELValue{Expr: \"true\"}\n\t}\n\treturn &CELValue{Expr: expr}\n}\n\nfunc (r *Resolver) resolveGRPCErrorDetails(ctx *context, details []*federation.GRPCErrorDetail, builder *source.GRPCErrorOptionBuilder) []*GRPCErrorDetail {\n\tif len(details) == 0 {\n\t\treturn nil\n\t}\n\tresult := make([]*GRPCErrorDetail, 0, len(details))\n\tfor idx, detail := range details {\n\t\tctx := ctx.withErrDetailIndex(idx)\n\t\tbuilder := builder.WithDetail(idx)\n\t\tvar byValues []*CELValue\n\t\tfor _, by := range detail.GetBy() {\n\t\t\tbyValues = append(byValues, &CELValue{Expr: by})\n\t\t}\n\t\tfor idx, errDetailDef := range detail.GetDef() {\n\t\t\tname := errDetailDef.GetName()\n\t\t\tif name == \"\" {\n\t\t\t\tn := fmt.Sprintf(\"_def%d_err_detail%d_def%d\", ctx.defIndex(), ctx.errDetailIndex(), idx)\n\t\t\t\terrDetailDef.Name = &n\n\t\t\t} else {\n\t\t\t\tif err := r.validateName(name); err != nil {\n\t\t\t\t\tempty := \"\"\n\t\t\t\t\terrDetailDef.Name = &empty\n\t\t\t\t\tctx.addError(ErrWithLocation(\n\t\t\t\t\t\terr.Error(),\n\t\t\t\t\t\tbuilder.WithDef(idx).WithName().Location(),\n\t\t\t\t\t))\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tresult = append(result, &GRPCErrorDetail{\n\t\t\tIf: r.resolveGRPCErrorIf(detail.GetIf()),\n\t\t\tDefSet: &VariableDefinitionSet{\n\t\t\t\tDefs: r.resolveVariableDefinitions(ctx.withVariableMap(), detail.GetDef(), func(idx int) *source.VariableDefinitionOptionBuilder {\n\t\t\t\t\treturn builder.WithDef(idx)\n\t\t\t\t}),\n\t\t\t},\n\t\t\tBy: byValues,\n\t\t\tMessages: &VariableDefinitionSet{\n\t\t\t\tDefs: r.resolveGRPCDetailMessages(ctx, detail.GetMessage(), func(idx int) *source.VariableDefinitionOptionBuilder {\n\t\t\t\t\treturn builder.WithMessage(idx)\n\t\t\t\t}),\n\t\t\t},\n\t\t\tPreconditionFailures: r.resolvePreconditionFailures(detail.GetPreconditionFailure()),\n\t\t\tBadRequests:          r.resolveBadRequests(detail.GetBadRequest()),\n\t\t\tLocalizedMessages:    r.resolveLocalizedMessages(detail.GetLocalizedMessage()),\n\t\t})\n\t}\n\treturn result\n}\n\nfunc (r *Resolver) resolveGRPCDetailMessages(ctx *context, messages []*federation.MessageExpr, builderFn func(int) *source.VariableDefinitionOptionBuilder) VariableDefinitions {\n\tif len(messages) == 0 {\n\t\treturn nil\n\t}\n\tmsgs := make([]*federation.VariableDefinition, 0, len(messages))\n\tfor idx, message := range messages {\n\t\tname := fmt.Sprintf(\"_def%d_err_detail%d_msg%d\", ctx.defIndex(), ctx.errDetailIndex(), idx)\n\t\tmsgs = append(msgs, &federation.VariableDefinition{\n\t\t\tName: &name,\n\t\t\tExpr: &federation.VariableDefinition_Message{\n\t\t\t\tMessage: message,\n\t\t\t},\n\t\t})\n\t}\n\tdefs := make([]*VariableDefinition, 0, len(msgs))\n\tfor _, def := range r.resolveVariableDefinitions(ctx.withVariableMap(), msgs, builderFn) {\n\t\tdef.Used = true\n\t\tdefs = append(defs, def)\n\t}\n\treturn defs\n}\n\nfunc (r *Resolver) resolvePreconditionFailures(failures []*errdetails.PreconditionFailure) []*PreconditionFailure {\n\tif len(failures) == 0 {\n\t\treturn nil\n\t}\n\tresult := make([]*PreconditionFailure, 0, len(failures))\n\tfor _, failure := range failures {\n\t\tresult = append(result, &PreconditionFailure{\n\t\t\tViolations: r.resolvePreconditionFailureViolations(failure.GetViolations()),\n\t\t})\n\t}\n\treturn result\n}\n\nfunc (r *Resolver) resolvePreconditionFailureViolations(violations []*errdetails.PreconditionFailure_Violation) []*PreconditionFailureViolation {\n\tif len(violations) == 0 {\n\t\treturn nil\n\t}\n\tresult := make([]*PreconditionFailureViolation, 0, len(violations))\n\tfor _, violation := range violations {\n\t\tresult = append(result, &PreconditionFailureViolation{\n\t\t\tType: &CELValue{\n\t\t\t\tExpr: violation.GetType(),\n\t\t\t},\n\t\t\tSubject: &CELValue{\n\t\t\t\tExpr: violation.GetSubject(),\n\t\t\t},\n\t\t\tDescription: &CELValue{\n\t\t\t\tExpr: violation.GetDescription(),\n\t\t\t},\n\t\t})\n\t}\n\treturn result\n}\n\nfunc (r *Resolver) resolveBadRequests(reqs []*errdetails.BadRequest) []*BadRequest {\n\tif len(reqs) == 0 {\n\t\treturn nil\n\t}\n\tresult := make([]*BadRequest, 0, len(reqs))\n\tfor _, req := range reqs {\n\t\tresult = append(result, &BadRequest{\n\t\t\tFieldViolations: r.resolveBadRequestFieldViolations(req.GetFieldViolations()),\n\t\t})\n\t}\n\treturn result\n}\n\nfunc (r *Resolver) resolveBadRequestFieldViolations(violations []*errdetails.BadRequest_FieldViolation) []*BadRequestFieldViolation {\n\tif len(violations) == 0 {\n\t\treturn nil\n\t}\n\tresult := make([]*BadRequestFieldViolation, 0, len(violations))\n\tfor _, violation := range violations {\n\t\tresult = append(result, &BadRequestFieldViolation{\n\t\t\tField: &CELValue{\n\t\t\t\tExpr: violation.GetField(),\n\t\t\t},\n\t\t\tDescription: &CELValue{\n\t\t\t\tExpr: violation.GetDescription(),\n\t\t\t},\n\t\t})\n\t}\n\treturn result\n}\n\nfunc (r *Resolver) resolveLocalizedMessages(messages []*errdetails.LocalizedMessage) []*LocalizedMessage {\n\tif len(messages) == 0 {\n\t\treturn nil\n\t}\n\tresult := make([]*LocalizedMessage, 0, len(messages))\n\tfor _, req := range messages {\n\t\tresult = append(result, &LocalizedMessage{\n\t\t\tLocale: req.GetLocale(),\n\t\t\tMessage: &CELValue{\n\t\t\t\tExpr: req.GetMessage(),\n\t\t\t},\n\t\t})\n\t}\n\treturn result\n}\n\nfunc (r *Resolver) resolveFieldRule(ctx *context, msg *Message, field *Field, ruleDef *federation.FieldRule, builder *source.FieldBuilder) *FieldRule {\n\tif ruleDef == nil {\n\t\tif msg.Rule == nil {\n\t\t\treturn nil\n\t\t}\n\t\tif !msg.Rule.CustomResolver && len(msg.Rule.Aliases) == 0 {\n\t\t\treturn nil\n\t\t}\n\t\tret := &FieldRule{}\n\t\tif msg.Rule.CustomResolver {\n\t\t\tret.MessageCustomResolver = true\n\t\t}\n\t\tfor _, msgAlias := range msg.Rule.Aliases {\n\t\t\tfieldAlias := r.resolveFieldAlias(ctx, msg, field, \"\", msgAlias, builder)\n\t\t\tif fieldAlias == nil {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tret.Aliases = append(ret.Aliases, fieldAlias)\n\t\t}\n\t\treturn ret\n\t}\n\toneof := r.resolveFieldOneofRule(ctx, field, ruleDef.GetOneof(), builder)\n\tenvOpt := r.resolveEnvVarOption(ruleDef.GetEnv())\n\tvar value *Value\n\tif oneof == nil && envOpt == nil {\n\t\tv, err := r.resolveValue(fieldRuleToCommonValueDef(ruleDef))\n\t\tif err != nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\terr.Error(),\n\t\t\t\t\tbuilder.Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t\treturn nil\n\t\t}\n\t\tvalue = v\n\t}\n\tif ruleDef.GetAlias() != \"\" && (msg.Rule == nil || len(msg.Rule.Aliases) == 0) {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\t`use \"alias\" in \"grpc.federation.field\" option, but \"alias\" is not defined in \"grpc.federation.message\" option`,\n\t\t\t\tbuilder.Location(),\n\t\t\t),\n\t\t)\n\t}\n\n\tvar aliases []*Field\n\tif msg.Rule != nil {\n\t\tfor _, msgAlias := range msg.Rule.Aliases {\n\t\t\tif alias := r.resolveFieldAlias(ctx, msg, field, ruleDef.GetAlias(), msgAlias, builder); alias != nil {\n\t\t\t\taliases = append(aliases, alias)\n\t\t\t}\n\t\t}\n\t}\n\treturn &FieldRule{\n\t\tValue:          value,\n\t\tCustomResolver: ruleDef.GetCustomResolver(),\n\t\tAliases:        aliases,\n\t\tOneof:          oneof,\n\t\tEnv:            envOpt,\n\t}\n}\n\nfunc (r *Resolver) resolveFieldOneofRule(ctx *context, field *Field, def *federation.FieldOneof, builder *source.FieldBuilder) *FieldOneofRule {\n\tif def == nil {\n\t\treturn nil\n\t}\n\tif field.Oneof == nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\t`\"oneof\" feature can only be used for fields within oneof`,\n\t\t\t\tbuilder.Location(),\n\t\t\t),\n\t\t)\n\t\treturn nil\n\t}\n\tvar (\n\t\tifValue *CELValue\n\t\tby      *CELValue\n\t)\n\tif v := def.GetIf(); v != \"\" {\n\t\tifValue = &CELValue{Expr: v}\n\t}\n\tif b := def.GetBy(); b != \"\" {\n\t\tby = &CELValue{Expr: b}\n\t}\n\toneofBuilder := builder.WithOption().WithOneOf()\n\tfor idx, oneofDef := range def.GetDef() {\n\t\tname := oneofDef.GetName()\n\t\tif name == \"\" {\n\t\t\tn := fmt.Sprintf(\"_oneof_def%d\", idx)\n\t\t\toneofDef.Name = &n\n\t\t} else {\n\t\t\tif err := r.validateName(name); err != nil {\n\t\t\t\tempty := \"\"\n\t\t\t\toneofDef.Name = &empty\n\t\t\t\tctx.addError(ErrWithLocation(\n\t\t\t\t\terr.Error(),\n\t\t\t\t\toneofBuilder.WithDef(idx).WithName().Location(),\n\t\t\t\t))\n\t\t\t}\n\t\t}\n\t}\n\treturn &FieldOneofRule{\n\t\tIf:      ifValue,\n\t\tDefault: def.GetDefault(),\n\t\tDefSet: &VariableDefinitionSet{\n\t\t\tDefs: r.resolveVariableDefinitions(ctx.withVariableMap(), def.GetDef(), func(idx int) *source.VariableDefinitionOptionBuilder {\n\t\t\t\treturn oneofBuilder.WithDef(idx)\n\t\t\t}),\n\t\t},\n\t\tBy: by,\n\t}\n}\n\nfunc (r *Resolver) resolveFieldRuleByAutoAlias(ctx *context, msg *Message, field *Field, alias *Message, builder *source.FieldBuilder) *Field {\n\tif alias == nil {\n\t\treturn nil\n\t}\n\taliasField := alias.Field(field.Name)\n\tif aliasField == nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\tfmt.Sprintf(\n\t\t\t\t\t`specified \"alias\" in grpc.federation.message option, but %q field does not exist in %q message`,\n\t\t\t\t\tfield.Name, alias.FQDN(),\n\t\t\t\t),\n\t\t\t\tbuilder.Location(),\n\t\t\t),\n\t\t)\n\t\treturn nil\n\t}\n\tif field.Type == nil || aliasField.Type == nil {\n\t\treturn nil\n\t}\n\tif isDifferentType(field.Type, aliasField.Type) {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\tfmt.Sprintf(\n\t\t\t\t\t`The types of %q's %q field (%q) and %q's field (%q) are different. This field cannot be resolved automatically, so you must use the \"grpc.federation.field\" option to bind it yourself`,\n\t\t\t\t\tmsg.FQDN(), field.Name, field.Type.Kind.ToString(),\n\t\t\t\t\taliasField.Message.FQDN(), aliasField.Type.Kind.ToString(),\n\t\t\t\t),\n\t\t\t\tbuilder.Location(),\n\t\t\t),\n\t\t)\n\t\treturn nil\n\t}\n\treturn aliasField\n}\n\nfunc (r *Resolver) resolveFieldAlias(ctx *context, msg *Message, field *Field, fieldAlias string, alias *Message, builder *source.FieldBuilder) *Field {\n\tif fieldAlias == \"\" {\n\t\treturn r.resolveFieldRuleByAutoAlias(ctx, msg, field, alias, builder)\n\t}\n\taliasField := alias.Field(fieldAlias)\n\tif aliasField == nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\tfmt.Sprintf(`%q field does not exist in %q message`, fieldAlias, alias.FQDN()),\n\t\t\t\tbuilder.Location(),\n\t\t\t),\n\t\t)\n\t\treturn nil\n\t}\n\tif field.Type == nil || aliasField.Type == nil {\n\t\treturn nil\n\t}\n\tif isDifferentType(field.Type, aliasField.Type) {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\tfmt.Sprintf(\n\t\t\t\t\t`The types of %q's %q field (%q) and %q's field (%q) are different. This field cannot be resolved automatically, so you must use the \"grpc.federation.field\" option to bind it yourself`,\n\t\t\t\t\tmsg.FQDN(), field.Name, field.Type.Kind.ToString(),\n\t\t\t\t\talias.FQDN(), aliasField.Type.Kind.ToString(),\n\t\t\t\t),\n\t\t\t\tbuilder.Location(),\n\t\t\t),\n\t\t)\n\t\treturn nil\n\t}\n\treturn aliasField\n}\n\nfunc (r *Resolver) resolveEnumRule(ctx *context, ruleDef *federation.EnumRule, builder *source.EnumBuilder) *EnumRule {\n\tif ruleDef == nil {\n\t\treturn nil\n\t}\n\treturn &EnumRule{\n\t\tAliases: r.resolveEnumAliases(ctx, ruleDef.GetAlias(), builder),\n\t}\n}\n\nfunc (r *Resolver) resolveEnumAliases(ctx *context, aliasNames []string, builder *source.EnumBuilder) []*Enum {\n\tif len(aliasNames) == 0 {\n\t\treturn nil\n\t}\n\tvar ret []*Enum\n\tfor _, aliasName := range aliasNames {\n\t\tenum, err := r.resolveEnumByName(ctx, aliasName, builder)\n\t\tif err != nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\terr.Error(),\n\t\t\t\t\tbuilder.WithOption().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, enum)\n\t}\n\treturn ret\n}\n\nfunc (r *Resolver) resolveEnumValueRule(ctx *context, enum *Enum, enumValue *EnumValue, ruleDef *federation.EnumValueRule, builder *source.EnumValueOptionBuilder) *EnumValueRule {\n\tif ruleDef == nil {\n\t\tif enum.Rule == nil {\n\t\t\treturn nil\n\t\t}\n\t\treturn &EnumValueRule{\n\t\t\tAliases: r.resolveEnumValueAlias(ctx, enumValue.Value, \"\", enum.Rule.Aliases),\n\t\t}\n\t}\n\tif len(ruleDef.GetAlias()) != 0 && (enum.Rule == nil || len(enum.Rule.Aliases) == 0) {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\t`use \"alias\" in \"grpc.federation.enum_value\" option, but \"alias\" is not defined in \"grpc.federation.enum\" option`,\n\t\t\t\tbuilder.WithAlias().Location(),\n\t\t\t),\n\t\t)\n\t\treturn nil\n\t}\n\n\tdefaultValue := ruleDef.GetDefault()\n\tnoAlias := ruleDef.GetNoalias()\n\tvar aliases []*EnumValueAlias\n\tif enum.Rule != nil && !defaultValue {\n\t\tif len(ruleDef.GetAlias()) != 0 {\n\t\t\tfor _, aliasName := range ruleDef.GetAlias() {\n\t\t\t\taliases = append(aliases, r.resolveEnumValueAlias(ctx, enumValue.Value, aliasName, enum.Rule.Aliases)...)\n\t\t\t}\n\t\t} else if !noAlias {\n\t\t\taliases = r.resolveEnumValueAlias(ctx, enumValue.Value, \"\", enum.Rule.Aliases)\n\t\t}\n\t}\n\tif noAlias && (defaultValue || len(ruleDef.GetAlias()) != 0) {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\t`\"noalias\" cannot be specified simultaneously with \"default\" or \"alias\"`,\n\t\t\t\tbuilder.WithNoAlias().Location(),\n\t\t\t),\n\t\t)\n\t\treturn nil\n\t}\n\treturn &EnumValueRule{\n\t\tDefault: defaultValue,\n\t\tNoAlias: noAlias,\n\t\tAliases: aliases,\n\t\tAttrs:   r.resolveEnumValueAttributes(ctx, ruleDef.GetAttr(), builder),\n\t}\n}\n\nfunc (r *Resolver) resolveEnumValueAlias(ctx *context, enumValueName, enumValueAlias string, aliases []*Enum) []*EnumValueAlias {\n\tif enumValueAlias == \"\" {\n\t\treturn r.resolveEnumValueRuleByAutoAlias(ctx, enumValueName, aliases)\n\t}\n\taliasFQDNs := make([]string, 0, len(aliases))\n\tvar enumValueAliases []*EnumValueAlias\n\tfor _, alias := range aliases {\n\t\tif value := alias.Value(enumValueAlias); value != nil {\n\t\t\tenumValueAliases = append(enumValueAliases, &EnumValueAlias{\n\t\t\t\tEnumAlias: alias,\n\t\t\t\tAliases:   []*EnumValue{value},\n\t\t\t})\n\t\t} else if value := alias.Value(ctx.file().PackageName() + \".\" + enumValueAlias); value != nil {\n\t\t\tenumValueAliases = append(enumValueAliases, &EnumValueAlias{\n\t\t\t\tEnumAlias: alias,\n\t\t\t\tAliases:   []*EnumValue{value},\n\t\t\t})\n\t\t}\n\t\taliasFQDNs = append(aliasFQDNs, fmt.Sprintf(\"%q\", alias.FQDN()))\n\t}\n\tif len(enumValueAliases) == 0 {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\tfmt.Sprintf(`%q value does not exist in %s enum`, enumValueAlias, strings.Join(aliasFQDNs, \", \")),\n\t\t\t\tsource.NewEnumBuilder(ctx.fileName(), ctx.messageName(), ctx.enumName()).WithValue(enumValueName).Location(),\n\t\t\t),\n\t\t)\n\t\treturn nil\n\t}\n\n\thasPrefix := strings.Contains(enumValueAlias, \".\")\n\tif !hasPrefix && len(enumValueAliases) != len(aliases) {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\tfmt.Sprintf(`%q value must be present in all enums, but it is missing in %s enum`, enumValueAlias, strings.Join(aliasFQDNs, \", \")),\n\t\t\t\tsource.NewEnumBuilder(ctx.fileName(), ctx.messageName(), ctx.enumName()).WithValue(enumValueName).Location(),\n\t\t\t),\n\t\t)\n\t\treturn nil\n\t}\n\treturn enumValueAliases\n}\n\nfunc (r *Resolver) resolveEnumValueAttributes(ctx *context, defs []*federation.EnumValueAttribute, builder *source.EnumValueOptionBuilder) []*EnumValueAttribute {\n\tif len(defs) == 0 {\n\t\treturn nil\n\t}\n\tret := make([]*EnumValueAttribute, 0, len(defs))\n\tfor idx, def := range defs {\n\t\tattr := r.resolveEnumValueAttribute(ctx, def, builder.WithAttr(idx))\n\t\tif attr == nil {\n\t\t\tcontinue\n\t\t}\n\t\tret = append(ret, attr)\n\t}\n\treturn ret\n}\n\nfunc (r *Resolver) resolveEnumValueAttribute(ctx *context, def *federation.EnumValueAttribute, builder *source.EnumValueAttributeBuilder) *EnumValueAttribute {\n\tif def == nil {\n\t\treturn nil\n\t}\n\tname := def.GetName()\n\tif name == \"\" {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\t\"attribute name is required\",\n\t\t\t\tbuilder.WithName().Location(),\n\t\t\t),\n\t\t)\n\t\treturn nil\n\t}\n\treturn &EnumValueAttribute{\n\t\tName:  name,\n\t\tValue: def.GetValue(),\n\t}\n}\n\nfunc (r *Resolver) resolveEnumValueRuleByAutoAlias(ctx *context, enumValueName string, aliases []*Enum) []*EnumValueAlias {\n\taliasFQDNs := make([]string, 0, len(aliases))\n\tvar enumValueAliases []*EnumValueAlias\n\tfor _, alias := range aliases {\n\t\tif value := alias.Value(enumValueName); value != nil {\n\t\t\tenumValueAliases = append(enumValueAliases, &EnumValueAlias{\n\t\t\t\tEnumAlias: alias,\n\t\t\t\tAliases:   []*EnumValue{value},\n\t\t\t})\n\t\t}\n\t\taliasFQDNs = append(aliasFQDNs, fmt.Sprintf(\"%q\", alias.FQDN()))\n\t}\n\tif len(enumValueAliases) != len(aliases) {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\tfmt.Sprintf(\n\t\t\t\t\t`specified \"alias\" in grpc.federation.enum option, but %q value does not exist in %s enum`,\n\t\t\t\t\tenumValueName, strings.Join(aliasFQDNs, \", \"),\n\t\t\t\t),\n\t\t\t\tsource.NewEnumBuilder(ctx.fileName(), ctx.messageName(), ctx.enumName()).WithValue(enumValueName).Location(),\n\t\t\t),\n\t\t)\n\t\treturn nil\n\t}\n\treturn enumValueAliases\n}\n\nfunc (r *Resolver) resolveFields(ctx *context, fieldsDef []*descriptorpb.FieldDescriptorProto, oneofs []*Oneof, builder *source.MessageBuilder) []*Field {\n\tif len(fieldsDef) == 0 {\n\t\treturn nil\n\t}\n\tfields := make([]*Field, 0, len(fieldsDef))\n\tfor _, fieldDef := range fieldsDef {\n\t\tvar (\n\t\t\tfieldBuilder *source.FieldBuilder\n\t\t\toneof        *Oneof\n\t\t)\n\t\tif fieldDef.OneofIndex != nil {\n\t\t\toneof = oneofs[fieldDef.GetOneofIndex()]\n\t\t\tfieldBuilder = builder.WithOneof(oneof.Name).WithField(fieldDef.GetName())\n\t\t} else {\n\t\t\tfieldBuilder = builder.WithField(fieldDef.GetName())\n\t\t}\n\t\tfield := r.resolveField(ctx, fieldDef, oneof, fieldBuilder)\n\t\tif field == nil {\n\t\t\tcontinue\n\t\t}\n\t\tfields = append(fields, field)\n\t}\n\treturn fields\n}\n\nfunc (r *Resolver) resolveField(ctx *context, fieldDef *descriptorpb.FieldDescriptorProto, oneof *Oneof, builder *source.FieldBuilder) *Field {\n\ttyp, err := r.resolveType(ctx, fieldDef.GetTypeName(), types.Kind(fieldDef.GetType()), fieldDef.GetLabel())\n\tif err != nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\terr.Error(),\n\t\t\t\tbuilder.Location(),\n\t\t\t),\n\t\t)\n\t\treturn nil\n\t}\n\tfield := &Field{\n\t\tName:    fieldDef.GetName(),\n\t\tDesc:    fieldDef,\n\t\tType:    typ,\n\t\tMessage: ctx.msg,\n\t}\n\tif oneof != nil {\n\t\toneof.Fields = append(oneof.Fields, field)\n\t\tfield.Oneof = oneof\n\t\ttyp.OneofField = &OneofField{Field: field}\n\t}\n\trule, err := getExtensionRule[*federation.FieldRule](fieldDef.GetOptions(), federation.E_Field)\n\tif err != nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\terr.Error(),\n\t\t\t\tbuilder.Location(),\n\t\t\t),\n\t\t)\n\t}\n\tr.fieldToRuleMap[field] = rule\n\treturn field\n}\n\nfunc (r *Resolver) resolveType(ctx *context, typeName string, kind types.Kind, label descriptorpb.FieldDescriptorProto_Label) (*Type, error) {\n\tvar (\n\t\tmsg  *Message\n\t\tenum *Enum\n\t)\n\tswitch kind {\n\tcase types.Message:\n\t\tvar pkg *Package\n\t\tif !strings.Contains(typeName, \".\") {\n\t\t\tfile := ctx.file()\n\t\t\tif file == nil {\n\t\t\t\treturn nil, fmt.Errorf(`package name is missing for %q message`, typeName)\n\t\t\t}\n\t\t\tpkg = file.Package\n\t\t} else {\n\t\t\tp, err := r.lookupPackage(typeName)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tpkg = p\n\t\t}\n\t\tname := r.trimPackage(pkg, typeName)\n\t\tmsg = r.resolveMessage(ctx, pkg, name, source.NewMessageBuilder(ctx.fileName(), typeName))\n\tcase types.Enum:\n\t\tvar pkg *Package\n\t\tif !strings.Contains(typeName, \".\") {\n\t\t\tfile := ctx.file()\n\t\t\tif file == nil {\n\t\t\t\treturn nil, fmt.Errorf(`package name is missing for %q enum`, typeName)\n\t\t\t}\n\t\t\tpkg = file.Package\n\t\t} else {\n\t\t\tp, err := r.lookupPackage(typeName)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tpkg = p\n\t\t}\n\t\tname := r.trimPackage(pkg, typeName)\n\t\tenum = r.resolveEnum(ctx, pkg, name, source.NewEnumBuilder(ctx.fileName(), \"\", name))\n\t}\n\trepeated := label == descriptorpb.FieldDescriptorProto_LABEL_REPEATED\n\tif msg != nil && msg.IsMapEntry {\n\t\trepeated = false\n\t}\n\treturn &Type{\n\t\tKind:     kind,\n\t\tRepeated: repeated,\n\t\tMessage:  msg,\n\t\tEnum:     enum,\n\t}, nil\n}\n\nfunc (r *Resolver) resolveRetry(ctx *context, def *federation.RetryPolicy, timeout *time.Duration, builder *source.RetryOptionBuilder) *RetryPolicy {\n\tif def == nil {\n\t\treturn nil\n\t}\n\tifExpr := \"true\"\n\tif cond := def.GetIf(); cond != \"\" {\n\t\tifExpr = cond\n\t}\n\treturn &RetryPolicy{\n\t\tIf:          &CELValue{Expr: ifExpr},\n\t\tConstant:    r.resolveRetryConstant(ctx, def.GetConstant(), builder),\n\t\tExponential: r.resolveRetryExponential(ctx, def.GetExponential(), timeout, builder),\n\t}\n}\n\nvar (\n\tDefaultRetryMaxRetryCount = uint64(5)\n\n\tDefaultRetryConstantInterval = time.Second\n\n\tDefaultRetryExponentialInitialInterval     = 500 * time.Millisecond\n\tDefaultRetryExponentialRandomizationFactor = float64(0.5)\n\tDefaultRetryExponentialMultiplier          = float64(1.5)\n\tDefaultRetryExponentialMaxInterval         = 60 * time.Second\n)\n\nfunc (r *Resolver) resolveRetryConstant(ctx *context, def *federation.RetryPolicyConstant, builder *source.RetryOptionBuilder) *RetryPolicyConstant {\n\tif def == nil {\n\t\treturn nil\n\t}\n\n\tinterval := DefaultRetryConstantInterval\n\tif def.Interval != nil {\n\t\tduration, err := time.ParseDuration(def.GetInterval())\n\t\tif err != nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\terr.Error(),\n\t\t\t\t\tbuilder.WithConstantInterval().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t} else {\n\t\t\tinterval = duration\n\t\t}\n\t}\n\n\tmaxRetries := DefaultRetryMaxRetryCount\n\tif def.MaxRetries != nil {\n\t\tmaxRetries = def.GetMaxRetries()\n\t}\n\n\treturn &RetryPolicyConstant{\n\t\tInterval:   interval,\n\t\tMaxRetries: maxRetries,\n\t}\n}\n\nfunc (r *Resolver) resolveRetryExponential(ctx *context, def *federation.RetryPolicyExponential, timeout *time.Duration, builder *source.RetryOptionBuilder) *RetryPolicyExponential {\n\tif def == nil {\n\t\treturn nil\n\t}\n\n\tinitialInterval := DefaultRetryExponentialInitialInterval\n\tif def.InitialInterval != nil {\n\t\tinterval, err := time.ParseDuration(def.GetInitialInterval())\n\t\tif err != nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\terr.Error(),\n\t\t\t\t\tbuilder.WithExponentialInitialInterval().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t} else {\n\t\t\tinitialInterval = interval\n\t\t}\n\t}\n\n\trandomizationFactor := DefaultRetryExponentialRandomizationFactor\n\tif def.RandomizationFactor != nil {\n\t\trandomizationFactor = def.GetRandomizationFactor()\n\t}\n\n\tmultiplier := DefaultRetryExponentialMultiplier\n\tif def.Multiplier != nil {\n\t\tmultiplier = def.GetMultiplier()\n\t}\n\n\tmaxInterval := DefaultRetryExponentialMaxInterval\n\tif def.MaxInterval != nil {\n\t\tinterval, err := time.ParseDuration(def.GetMaxInterval())\n\t\tif err != nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\terr.Error(),\n\t\t\t\t\tbuilder.WithExponentialMaxInterval().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t} else {\n\t\t\tmaxInterval = interval\n\t\t}\n\t}\n\n\tmaxRetries := DefaultRetryMaxRetryCount\n\tif def.MaxRetries != nil {\n\t\tmaxRetries = def.GetMaxRetries()\n\t}\n\n\tvar maxElapsedTime time.Duration\n\tif timeout != nil {\n\t\tmaxElapsedTime = *timeout\n\t}\n\n\treturn &RetryPolicyExponential{\n\t\tInitialInterval:     initialInterval,\n\t\tRandomizationFactor: randomizationFactor,\n\t\tMultiplier:          multiplier,\n\t\tMaxInterval:         maxInterval,\n\t\tMaxRetries:          maxRetries,\n\t\tMaxElapsedTime:      maxElapsedTime,\n\t}\n}\n\nfunc (r *Resolver) resolveGRPCCallOption(ctx *context, def *federation.GRPCCallOption, builder *source.GRPCCallOptionBuilder) *GRPCCallOption {\n\tif def == nil {\n\t\treturn nil\n\t}\n\n\tvar (\n\t\topt      GRPCCallOption\n\t\tfoundOpt bool\n\t)\n\tif def.ContentSubtype != nil {\n\t\ttyp := def.GetContentSubtype()\n\t\topt.ContentSubtype = &typ\n\t\tfoundOpt = true\n\t}\n\tif def.Header != nil {\n\t\tvar headerDef *VariableDefinition\n\t\tif header := def.GetHeader(); header == \"\" {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\t\"gRPC call option's header value is required map<string, repeated string> typed value\",\n\t\t\t\t\tbuilder.WithHeader().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t} else {\n\t\t\theaderDef = ctx.variableDef(header)\n\t\t\tif headerDef == nil {\n\t\t\t\tctx.addError(\n\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\tfmt.Sprintf(`%q variable is not defined`, header),\n\t\t\t\t\t\tbuilder.WithHeader().Location(),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\topt.Header = headerDef\n\t\t\t\tfoundOpt = true\n\t\t\t}\n\t\t}\n\t}\n\tif def.Trailer != nil {\n\t\tvar trailerDef *VariableDefinition\n\t\tif trailer := def.GetTrailer(); trailer == \"\" {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\t\"gRPC call option's trailer value is required map<string, repeated string> typed value\",\n\t\t\t\t\tbuilder.WithTrailer().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t} else {\n\t\t\ttrailerDef = ctx.variableDef(trailer)\n\t\t\tif trailerDef == nil {\n\t\t\t\tctx.addError(\n\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\tfmt.Sprintf(`%q variable is not defined`, trailer),\n\t\t\t\t\t\tbuilder.WithTrailer().Location(),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\topt.Trailer = trailerDef\n\t\t\t\tfoundOpt = true\n\t\t\t}\n\t\t}\n\t}\n\tif def.MaxCallRecvMsgSize != nil {\n\t\tsize := def.GetMaxCallRecvMsgSize()\n\t\topt.MaxCallRecvMsgSize = &size\n\t\tfoundOpt = true\n\t}\n\tif def.MaxCallSendMsgSize != nil {\n\t\tsize := def.GetMaxCallSendMsgSize()\n\t\topt.MaxCallSendMsgSize = &size\n\t\tfoundOpt = true\n\t}\n\tif def.StaticMethod != nil {\n\t\tmtd := def.GetStaticMethod()\n\t\topt.StaticMethod = &mtd\n\t\tfoundOpt = true\n\t}\n\tif def.WaitForReady != nil {\n\t\tready := def.GetWaitForReady()\n\t\topt.WaitForReady = &ready\n\t\tfoundOpt = true\n\t}\n\tif !foundOpt {\n\t\treturn nil\n\t}\n\treturn &opt\n}\n\nfunc (r *Resolver) resolveRequest(ctx *context, method *Method, requestDef []*federation.MethodRequest, builder *source.CallExprOptionBuilder) *Request {\n\treqMsg := method.Request\n\targs := make([]*Argument, 0, len(requestDef))\n\tfor idx, req := range requestDef {\n\t\tfieldName := req.GetField()\n\t\tvar argType *Type\n\t\tif !reqMsg.HasField(fieldName) {\n\t\t\tctx.addError(ErrWithLocation(\n\t\t\t\tfmt.Sprintf(`%q field does not exist in %q message for method request`, fieldName, reqMsg.FQDN()),\n\t\t\t\tbuilder.WithRequest(idx).WithField().Location(),\n\t\t\t))\n\t\t} else {\n\t\t\targType = reqMsg.Field(fieldName).Type\n\t\t}\n\t\tvalue, err := r.resolveValue(methodRequestToCommonValueDef(req))\n\t\tif err != nil {\n\t\t\tctx.addError(ErrWithLocation(\n\t\t\t\terr.Error(),\n\t\t\t\tbuilder.WithRequest(idx).WithBy().Location(),\n\t\t\t))\n\t\t}\n\t\tvar ifValue *CELValue\n\t\tif req.GetIf() != \"\" {\n\t\t\tifValue = &CELValue{Expr: req.GetIf()}\n\t\t}\n\t\tif argType != nil && argType.OneofField != nil && ifValue == nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\tfmt.Sprintf(`%q field is a oneof field, so you need to specify an \"if\" expression`, fieldName),\n\t\t\t\t\tbuilder.WithRequest(idx).WithField().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t\targs = append(args, &Argument{\n\t\t\tName:  fieldName,\n\t\t\tType:  argType,\n\t\t\tValue: value,\n\t\t\tIf:    ifValue,\n\t\t})\n\t}\n\treturn &Request{Args: args, Type: reqMsg}\n}\n\nfunc (r *Resolver) resolveMessageExprArgument(ctx *context, argDef *federation.Argument, builder *source.ArgumentOptionBuilder) *Argument {\n\tvalue, err := r.resolveValue(argumentToCommonValueDef(argDef))\n\tif err != nil {\n\t\tswitch {\n\t\tcase argDef.GetBy() != \"\":\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\terr.Error(),\n\t\t\t\t\tbuilder.WithBy().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\tcase argDef.GetInline() != \"\":\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\terr.Error(),\n\t\t\t\t\tbuilder.WithInline().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t}\n\tname := argDef.GetName()\n\tif err := r.validateName(name); err != nil {\n\t\tctx.addError(ErrWithLocation(\n\t\t\terr.Error(),\n\t\t\tbuilder.WithName().Location(),\n\t\t))\n\t}\n\treturn &Argument{\n\t\tName:  name,\n\t\tValue: value,\n\t}\n}\n\n// resolveMessageArgument constructs message arguments using a dependency graph and assigns them to each message.\nfunc (r *Resolver) resolveMessageArgument(ctx *context, files []*File) {\n\t// create a dependency graph for all messages.\n\tgraph := CreateAllMessageDependencyGraph(ctx, r.allMessages(files))\n\tif graph == nil {\n\t\treturn\n\t}\n\n\t// Need to prepare the svcMsgSet first to build env messages.\n\t// This is necessary because we need to know which messages are used by which services when creating the messages.\n\tsvcMsgSet := make(map[*Service]map[*Message]struct{})\n\tfor _, root := range graph.Roots {\n\t\t// The root message is always the response message of the method.\n\t\trootMsg := root.Message\n\t\t// Store the messages to serviceMsgMap first to avoid inserting duplicated ones to Service.Messages\n\t\tfor _, svc := range r.cachedServiceMap {\n\t\t\tif _, exists := svcMsgSet[svc]; !exists {\n\t\t\t\tsvcMsgSet[svc] = make(map[*Message]struct{})\n\t\t\t}\n\t\t\t// If the method of the service has not a response message, it is excluded.\n\t\t\tif svc.HasMessageInMethod(rootMsg) || svc.HasMessageInVariables(rootMsg) {\n\t\t\t\tfor _, msg := range root.childMessages() {\n\t\t\t\t\tsvcMsgSet[svc][msg] = struct{}{}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfor _, root := range graph.Roots {\n\t\trootMsg := root.Message\n\n\t\tvar msgArg *Message\n\t\tif rootMsg.Rule.MessageArgument != nil {\n\t\t\tmsgArg = rootMsg.Rule.MessageArgument\n\t\t} else {\n\t\t\tmsgArg = newMessageArgument(rootMsg)\n\t\t\trootMsg.Rule.MessageArgument = msgArg\n\t\t}\n\n\t\t// The message argument of the response message is the request message.\n\t\t// Therefore, the request message is retrieved from the response message.\n\t\treqMsg := r.lookupRequestMessageFromResponseMessage(rootMsg)\n\t\tif reqMsg == nil {\n\t\t\t// A non-response message may also become a root message.\n\t\t\t// In such a case, the message argument field does not exist.\n\t\t\t// However, since it is necessary to resolve the CEL reference, needs to call recursive message argument resolver.\n\t\t\tctx := newContext() // ignore if exists error.\n\t\t\t_ = r.resolveMessageArgumentRecursive(ctx, root, svcMsgSet)\n\t\t\tcontinue\n\t\t}\n\n\t\tmsgArg.Fields = append(msgArg.Fields, reqMsg.Fields...)\n\t\tr.cachedMessageMap[msgArg.FQDN()] = msgArg\n\t\tr.resolveMessageArgumentRecursive(ctx, root, svcMsgSet)\n\t}\n\n\tfor svc, msgSet := range svcMsgSet {\n\t\tmsgs := make([]*Message, 0, len(msgSet))\n\t\tfor msg := range msgSet {\n\t\t\tmsgs = append(msgs, msg)\n\t\t}\n\t\tsort.Slice(msgs, func(i, j int) bool {\n\t\t\treturn msgs[i].Name < msgs[j].Name\n\t\t})\n\t\targs := make([]*Message, 0, len(msgs))\n\t\tfor _, msg := range msgs {\n\t\t\targs = append(args, msg.Rule.MessageArgument)\n\t\t}\n\t\tsvc.MessageArgs = append(svc.MessageArgs, args...)\n\t\tsvc.Messages = append(svc.Messages, msgs...)\n\t}\n}\n\nfunc (r *Resolver) resolveMessageArgumentRecursive(\n\tctx *context,\n\tnode *AllMessageDependencyGraphNode,\n\tsvcMsgSet map[*Service]map[*Message]struct{},\n) []*Message {\n\tmsg := node.Message\n\tctx = ctx.withFile(msg.File).withMessage(msg)\n\tbuilder := newMessageBuilderFromMessage(msg)\n\targ := msg.Rule.MessageArgument\n\tfileDesc := messageArgumentFileDescriptor(arg)\n\tif err := r.celRegistry.RegisterFiles(fileDesc); err != nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\terr.Error(),\n\t\t\t\tbuilder.Location(),\n\t\t\t),\n\t\t)\n\t\treturn nil\n\t}\n\tenv, err := r.createMessageCELEnv(ctx, msg, svcMsgSet, builder)\n\tif err != nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\terr.Error(),\n\t\t\t\tbuilder.Location(),\n\t\t\t),\n\t\t)\n\t\treturn nil\n\t}\n\tr.resolveMessageCELValues(ctx, env, msg, builder)\n\n\tmsgs := []*Message{msg}\n\tmsgToDefsMap := msg.Rule.DefSet.MessageToDefsMap()\n\tfor _, field := range msg.Fields {\n\t\tif field.Rule == nil {\n\t\t\tcontinue\n\t\t}\n\t\tif field.Rule.Oneof == nil {\n\t\t\tcontinue\n\t\t}\n\t\tfor k, v := range field.Rule.Oneof.DefSet.MessageToDefsMap() {\n\t\t\tmsgToDefsMap[k] = append(msgToDefsMap[k], v...)\n\t\t}\n\t}\n\tfor _, child := range node.Children {\n\t\tdepMsg := child.Message\n\t\tvar depMsgArg *Message\n\t\tif depMsg.Rule == nil {\n\t\t\tcontinue\n\t\t}\n\t\tif depMsg.Rule.MessageArgument != nil {\n\t\t\tdepMsgArg = depMsg.Rule.MessageArgument\n\t\t} else {\n\t\t\tdepMsgArg = newMessageArgument(depMsg)\n\t\t\tdepMsg.Rule.MessageArgument = depMsgArg\n\t\t}\n\t\tif _, exists := r.cachedMessageMap[depMsgArg.FQDN()]; !exists {\n\t\t\tr.cachedMessageMap[depMsgArg.FQDN()] = depMsgArg\n\t\t}\n\t\tdefs := msgToDefsMap[depMsg]\n\t\tdepMsgArg.Fields = append(depMsgArg.Fields, r.resolveMessageArgumentFields(ctx, depMsgArg, defs)...)\n\t\tfor _, field := range depMsgArg.Fields {\n\t\t\tfield.Message = depMsgArg\n\t\t}\n\t\tm := r.resolveMessageArgumentRecursive(ctx, child, svcMsgSet)\n\t\tmsgs = append(msgs, m...)\n\t}\n\treturn msgs\n}\n\nfunc (r *Resolver) resolveMessageArgumentFields(ctx *context, arg *Message, defs []*VariableDefinition) []*Field {\n\targNameMap := make(map[string]struct{})\n\tfor _, varDef := range defs {\n\t\tfor _, msgExpr := range varDef.MessageExprs() {\n\t\t\tfor _, arg := range msgExpr.Args {\n\t\t\t\tif arg.Name == \"\" {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\targNameMap[arg.Name] = struct{}{}\n\t\t\t}\n\t\t}\n\t}\n\n\tevaluatedArgNameMap := make(map[string]*Type)\n\t// First, evaluate the fields that are already registered in the message argument.\n\tfor _, field := range arg.Fields {\n\t\tevaluatedArgNameMap[field.Name] = field.Type\n\t\targNameMap[field.Name] = struct{}{}\n\t}\n\tvar fields []*Field\n\tfor _, varDef := range defs {\n\t\tfor _, msgExpr := range varDef.MessageExprs() {\n\t\t\tr.validateMessageDependencyArgumentName(ctx, argNameMap, varDef)\n\t\t\tfor argIdx, arg := range msgExpr.Args {\n\t\t\t\tif arg.Value == nil {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tfieldType := arg.Value.Type()\n\t\t\t\tif fieldType == nil {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif typ, exists := evaluatedArgNameMap[arg.Name]; exists {\n\t\t\t\t\tif isDifferentArgumentType(typ, fieldType) {\n\t\t\t\t\t\tctx.addError(\n\t\t\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\t\t\tfmt.Sprintf(\n\t\t\t\t\t\t\t\t\t\"%q argument name is declared with a different type. found %q and %q type\",\n\t\t\t\t\t\t\t\t\targ.Name,\n\t\t\t\t\t\t\t\t\ttyp.FQDN(),\n\t\t\t\t\t\t\t\t\tfieldType.FQDN(),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\tvarDef.builder.WithMessage().\n\t\t\t\t\t\t\t\t\tWithArgs(argIdx).Location(),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif arg.Value.CEL != nil && arg.Value.Inline {\n\t\t\t\t\tif fieldType.Kind != types.Message {\n\t\t\t\t\t\tctx.addError(\n\t\t\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\t\t\t\"inline value is not message type\",\n\t\t\t\t\t\t\t\tvarDef.builder.WithMessage().\n\t\t\t\t\t\t\t\t\tWithArgs(argIdx).\n\t\t\t\t\t\t\t\t\tWithInline().Location(),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tfor _, field := range fieldType.Message.Fields {\n\t\t\t\t\t\tif typ, exists := evaluatedArgNameMap[field.Name]; exists {\n\t\t\t\t\t\t\tif isDifferentType(typ, field.Type) {\n\t\t\t\t\t\t\t\tctx.addError(\n\t\t\t\t\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\t\t\t\t\tfmt.Sprintf(\n\t\t\t\t\t\t\t\t\t\t\t\"%q argument name is declared with a different type kind. found %q and %q type\",\n\t\t\t\t\t\t\t\t\t\t\tfield.Name,\n\t\t\t\t\t\t\t\t\t\t\ttyp.Kind.ToString(),\n\t\t\t\t\t\t\t\t\t\t\tfield.Type.Kind.ToString(),\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\tvarDef.builder.WithMessage().\n\t\t\t\t\t\t\t\t\t\t\tWithArgs(argIdx).Location(),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfields = append(fields, field)\n\t\t\t\t\t\tevaluatedArgNameMap[field.Name] = field.Type\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfields = append(fields, &Field{\n\t\t\t\t\t\tName: arg.Name,\n\t\t\t\t\t\tType: fieldType,\n\t\t\t\t\t})\n\t\t\t\t\tevaluatedArgNameMap[arg.Name] = fieldType\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn fields\n}\n\nfunc (r *Resolver) validateMessageDependencyArgumentName(ctx *context, argNameMap map[string]struct{}, def *VariableDefinition) {\n\tfor _, msgExpr := range def.MessageExprs() {\n\t\tcurDepArgNameMap := make(map[string]struct{})\n\t\tfor _, arg := range msgExpr.Args {\n\t\t\tif arg.Name != \"\" {\n\t\t\t\tcurDepArgNameMap[arg.Name] = struct{}{}\n\t\t\t}\n\t\t\tif arg.Value.CEL != nil && arg.Value.Inline {\n\t\t\t\tfieldType := arg.Value.Type()\n\t\t\t\tif fieldType != nil && fieldType.Message != nil {\n\t\t\t\t\tfor _, field := range fieldType.Message.Fields {\n\t\t\t\t\t\tcurDepArgNameMap[field.Name] = struct{}{}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor name := range argNameMap {\n\t\t\tif _, exists := curDepArgNameMap[name]; exists {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\tfmt.Sprintf(\"%q argument is defined in other message dependency arguments, but not in this context\", name),\n\t\t\t\t\tdef.builder.WithMessage().WithArgs(0).Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t}\n}\n\nfunc (r *Resolver) resolveMessageCELValues(ctx *context, env *cel.Env, msg *Message, builder *source.MessageBuilder) {\n\tif msg.Rule == nil {\n\t\treturn\n\t}\n\tfor idx, def := range msg.Rule.DefSet.Definitions() {\n\t\tctx := ctx.withDefIndex(idx)\n\t\tenv = r.resolveVariableDefinitionCELValues(ctx, env, def, def.builder)\n\t}\n\tfor _, field := range msg.Fields {\n\t\tif !field.HasRule() {\n\t\t\tcontinue\n\t\t}\n\t\tfieldOptBuilder := toFieldBuilder(builder, field).WithOption()\n\n\t\tif field.Rule.Value != nil {\n\t\t\tif err := r.resolveCELValue(ctx, env, field.Rule.Value.CEL); err != nil {\n\t\t\t\tctx.addError(\n\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\terr.Error(),\n\t\t\t\t\t\tfieldOptBuilder.WithBy().Location(),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t\tif field.Rule.Oneof != nil {\n\t\t\tfieldEnv, _ := env.Extend()\n\t\t\toneof := field.Rule.Oneof\n\t\t\toneofBuilder := fieldOptBuilder.WithOneOf()\n\t\t\tif oneof.If != nil {\n\t\t\t\tif err := r.resolveCELValue(ctx, fieldEnv, oneof.If); err != nil {\n\t\t\t\t\tctx.addError(\n\t\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\t\terr.Error(),\n\t\t\t\t\t\t\toneofBuilder.WithIf().Location(),\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tif oneof.If.Out != nil {\n\t\t\t\t\tif oneof.If.Out.Kind != types.Bool {\n\t\t\t\t\t\tctx.addError(\n\t\t\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\t\t\tfmt.Sprintf(`return value of \"if\" must be bool type but got %s type`, oneof.If.Out.Kind.ToString()),\n\t\t\t\t\t\t\t\toneofBuilder.WithIf().Location(),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor idx, varDef := range oneof.DefSet.Definitions() {\n\t\t\t\tfieldEnv = r.resolveVariableDefinitionCELValues(ctx, fieldEnv, varDef, oneofBuilder.WithDef(idx))\n\t\t\t}\n\t\t\tif err := r.resolveCELValue(ctx, fieldEnv, oneof.By); err != nil {\n\t\t\t\tctx.addError(\n\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\terr.Error(),\n\t\t\t\t\t\toneofBuilder.WithBy().Location(),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t}\n\n\tr.resolveUsedNameReference(msg)\n}\n\nfunc (r *Resolver) resolveVariableDefinitionCELValues(ctx *context, env *cel.Env, def *VariableDefinition, builder *source.VariableDefinitionOptionBuilder) *cel.Env {\n\tif def.If != nil {\n\t\tif err := r.resolveCELValue(ctx, env, def.If); err != nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\terr.Error(),\n\t\t\t\t\tbuilder.WithIf().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t\tif def.If.Out != nil {\n\t\t\tif def.If.Out.Kind != types.Bool {\n\t\t\t\tctx.addError(\n\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\tfmt.Sprintf(`return value of \"if\" must be bool type but got %s type`, def.If.Out.Kind.ToString()),\n\t\t\t\t\t\tbuilder.WithIf().Location(),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t}\n\tif def.Expr == nil {\n\t\treturn env\n\t}\n\tr.resolveVariableExprCELValues(ctx, env, def.Expr, builder)\n\tif def.Name != \"\" && def.Expr.Type != nil {\n\t\tnewEnv, err := env.Extend(cel.Variable(def.Name, ToCELType(def.Expr.Type)))\n\t\tif err != nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\tfmt.Sprintf(`failed to extend cel.Env from variables of messages: %s`, err.Error()),\n\t\t\t\t\tbuilder.Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t\treturn env\n\t\t}\n\t\treturn newEnv\n\t}\n\treturn env\n}\n\nfunc (r *Resolver) resolveVariableExprCELValues(ctx *context, env *cel.Env, expr *VariableExpr, builder *source.VariableDefinitionOptionBuilder) {\n\tswitch {\n\tcase expr.By != nil:\n\t\tif err := r.resolveCELValue(ctx, env, expr.By); err != nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\terr.Error(),\n\t\t\t\t\tbuilder.WithBy().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t\texpr.Type = expr.By.Out\n\tcase expr.Map != nil:\n\t\texpr.Type = r.resolveMapExprCELValues(ctx, env, expr.Map, builder.WithMap())\n\tcase expr.Call != nil:\n\t\texpr.Type = r.resolveCallExprCELValues(ctx, env, expr.Call, builder.WithCall())\n\tcase expr.Message != nil:\n\t\texpr.Type = r.resolveMessageExprCELValues(ctx, env, expr.Message, builder.WithMessage())\n\tcase expr.Enum != nil:\n\t\texpr.Type = r.resolveEnumExprCELValues(ctx, env, expr.Enum, builder.WithEnum())\n\tcase expr.Validation != nil:\n\t\tvalidationBuilder := builder.WithValidation()\n\t\tr.resolveGRPCErrorCELValues(ctx, env, expr.Validation.Error, nil, validationBuilder.WithError())\n\t\t// This is a dummy type since the output from the validation is not supposed to be used (at least for now)\n\t\texpr.Type = BoolType\n\tcase expr.Switch != nil:\n\t\texpr.Type = r.resolveSwitchExprCELValues(ctx, env, expr.Switch, builder.WithSwitch())\n\t}\n}\n\nfunc (r *Resolver) resolveMapExprCELValues(ctx *context, env *cel.Env, expr *MapExpr, builder *source.MapExprOptionBuilder) *Type {\n\tmapEnv := env\n\titer := expr.Iterator\n\tif iter != nil && iter.Name != \"\" && iter.Source != nil {\n\t\tif iter.Source.Expr == nil || iter.Source.Expr.Type == nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\t`map iterator's src value type could not be determined`,\n\t\t\t\t\tbuilder.WithIteratorSource().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t\treturn nil\n\t\t}\n\t\tif !iter.Source.Expr.Type.Repeated {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\t`map iterator's src value type must be repeated type`,\n\t\t\t\t\tbuilder.WithIteratorSource().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t\treturn nil\n\t\t}\n\t\titerType := iter.Source.Expr.Type.Clone()\n\t\titerType.Repeated = false\n\t\tnewEnv, err := env.Extend(cel.Variable(iter.Name, ToCELType(iterType)))\n\t\tif err != nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\terr.Error(),\n\t\t\t\t\tbuilder.WithIteratorSource().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t\tmapEnv = newEnv\n\t}\n\ttyp := r.resolveMapIteratorExprCELValues(ctx, mapEnv, expr.Expr, builder)\n\tif typ == nil {\n\t\treturn nil\n\t}\n\tvarType := typ.Clone()\n\tvarType.Repeated = true\n\treturn varType\n}\n\nfunc (r *Resolver) resolveMapIteratorExprCELValues(ctx *context, env *cel.Env, expr *MapIteratorExpr, mapBuilder *source.MapExprOptionBuilder) *Type {\n\tswitch {\n\tcase expr.By != nil:\n\t\tif err := r.resolveCELValue(ctx, env, expr.By); err != nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\terr.Error(),\n\t\t\t\t\tmapBuilder.WithBy().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t\texpr.Type = expr.By.Out\n\tcase expr.Message != nil:\n\t\texpr.Type = r.resolveMessageExprCELValues(ctx, env, expr.Message, mapBuilder.WithMessage())\n\tcase expr.Enum != nil:\n\t\texpr.Type = r.resolveEnumExprCELValues(ctx, env, expr.Enum, mapBuilder.WithEnum())\n\t}\n\treturn expr.Type\n}\n\nfunc (r *Resolver) resolveCallExprCELValues(ctx *context, env *cel.Env, expr *CallExpr, builder *source.CallExprOptionBuilder) *Type {\n\tif expr.Request != nil {\n\t\tfor idx, arg := range expr.Request.Args {\n\t\t\tif arg.Value == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif err := r.resolveCELValue(ctx, env, arg.Value.CEL); err != nil {\n\t\t\t\tctx.addError(\n\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\terr.Error(),\n\t\t\t\t\t\tbuilder.WithRequest(idx).WithBy().Location(),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}\n\t\t\tfield := expr.Request.Type.Field(arg.Name)\n\t\t\tif field != nil && arg.Value.CEL != nil && arg.Value.CEL.Out != nil {\n\t\t\t\tr.validateRequestFieldType(ctx, arg.Value.CEL.Out, field, builder.WithRequest(idx))\n\t\t\t}\n\t\t\tif arg.If != nil {\n\t\t\t\tif err := r.resolveCELValue(ctx, env, arg.If); err != nil {\n\t\t\t\t\tctx.addError(\n\t\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\t\terr.Error(),\n\t\t\t\t\t\t\tbuilder.WithRequest(idx).WithIf().Location(),\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tif arg.If.Out != nil && arg.If.Out.Kind != types.Bool {\n\t\t\t\t\tctx.addError(\n\t\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\t\t\"if must always return a boolean value\",\n\t\t\t\t\t\t\tbuilder.WithRequest(idx).WithIf().Location(),\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tgrpcErrEnv, _ := env.Extend(\n\t\tcel.Variable(\"error\", cel.ObjectType(\"grpc.federation.private.Error\")),\n\t)\n\tif expr.Retry != nil {\n\t\tretryBuilder := builder.WithRetry()\n\t\tretry := expr.Retry\n\t\tif err := r.resolveCELValue(ctx, grpcErrEnv, retry.If); err != nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\terr.Error(),\n\t\t\t\t\tretryBuilder.WithIf().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t\tif retry.If.Out != nil && retry.If.Out.Kind != types.Bool {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\t\"if must always return a boolean value\",\n\t\t\t\t\tretryBuilder.WithIf().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t}\n\tif opt := expr.Option; opt != nil {\n\t\tbuilder := builder.WithOption()\n\t\tif opt.Header != nil {\n\t\t\tif opt.Header.Expr == nil || opt.Header.Expr.Type == nil {\n\t\t\t\tctx.addError(\n\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\t`gRPC Call option header's value type could not be determined`,\n\t\t\t\t\t\tbuilder.WithHeader().Location(),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t} else if !r.isMetadataType(opt.Header.Expr.Type) {\n\t\t\t\tctx.addError(\n\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\t`gRPC Call option header's value type must be map<string, repeated string> type`,\n\t\t\t\t\t\tbuilder.WithHeader().Location(),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t\tif opt.Trailer != nil {\n\t\t\tif opt.Trailer.Expr == nil || opt.Trailer.Expr.Type == nil {\n\t\t\t\tctx.addError(\n\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\t`gRPC Call option trailer's value type could not be determined`,\n\t\t\t\t\t\tbuilder.WithTrailer().Location(),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t} else if !r.isMetadataType(opt.Trailer.Expr.Type) {\n\t\t\t\tctx.addError(\n\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\t`gRPC Call option trailer's value type must be map<string, repeated string> type`,\n\t\t\t\t\t\tbuilder.WithTrailer().Location(),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t}\n\tif expr.Metadata != nil {\n\t\tif err := r.resolveCELValue(ctx, env, expr.Metadata); err != nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\terr.Error(),\n\t\t\t\t\tbuilder.WithMetadata().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t\tif expr.Metadata.Out != nil && !r.isMetadataType(expr.Metadata.Out) {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\t`gRPC Call metadata's value type must be map<string, repeated string> type`,\n\t\t\t\t\tbuilder.WithMetadata().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t}\n\tfor idx, grpcErr := range expr.Errors {\n\t\tr.resolveGRPCErrorCELValues(ctx, grpcErrEnv, grpcErr, expr.Method.Response, builder.WithError(idx))\n\t}\n\treturn NewMessageType(expr.Method.Response, false)\n}\n\nfunc (r *Resolver) isMetadataType(typ *Type) bool {\n\tif typ == nil {\n\t\treturn false\n\t}\n\tif typ.Message == nil {\n\t\treturn false\n\t}\n\tif !typ.Message.IsMapEntry {\n\t\treturn false\n\t}\n\tkey := typ.Message.Field(\"key\")\n\tvalue := typ.Message.Field(\"value\")\n\tif key == nil || value == nil {\n\t\treturn false\n\t}\n\tif key.Type.Kind != types.String {\n\t\treturn false\n\t}\n\tif !value.Type.Repeated || value.Type.Kind != types.String {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (r *Resolver) resolveMessageExprCELValues(ctx *context, env *cel.Env, expr *MessageExpr, builder *source.MessageExprOptionBuilder) *Type {\n\tfor argIdx, arg := range expr.Args {\n\t\tif arg.Value == nil {\n\t\t\tcontinue\n\t\t}\n\t\tif err := r.resolveCELValue(ctx, env, arg.Value.CEL); err != nil {\n\t\t\tif arg.Value.Inline {\n\t\t\t\tctx.addError(\n\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\terr.Error(),\n\t\t\t\t\t\tbuilder.WithArgs(argIdx).WithInline().Location(),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tctx.addError(\n\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\terr.Error(),\n\t\t\t\t\t\tbuilder.WithArgs(argIdx).WithBy().Location(),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t}\n\treturn NewMessageType(expr.Message, false)\n}\n\nfunc (r *Resolver) resolveGRPCErrorCELValues(ctx *context, env *cel.Env, grpcErr *GRPCError, response *Message, builder *source.GRPCErrorOptionBuilder) {\n\tif grpcErr == nil {\n\t\treturn\n\t}\n\tfor idx, def := range grpcErr.DefSet.Definitions() {\n\t\tenv = r.resolveVariableDefinitionCELValues(ctx, env, def, builder.WithDef(idx))\n\t}\n\tif err := r.resolveCELValue(ctx, env, grpcErr.If); err != nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\terr.Error(),\n\t\t\t\tbuilder.WithIf().Location(),\n\t\t\t),\n\t\t)\n\t}\n\tif grpcErr.If.Out != nil && grpcErr.If.Out.Kind != types.Bool {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\t\"if must always return a boolean value\",\n\t\t\t\tbuilder.WithIf().Location(),\n\t\t\t),\n\t\t)\n\t}\n\tif grpcErr.IgnoreAndResponse != nil {\n\t\tif err := r.resolveCELValue(ctx, env, grpcErr.IgnoreAndResponse); err != nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\terr.Error(),\n\t\t\t\t\tbuilder.WithIgnoreAndResponse().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t\tif grpcErr.IgnoreAndResponse.Out != nil && response != nil {\n\t\t\tmsg := grpcErr.IgnoreAndResponse.Out.Message\n\t\t\tif msg == nil || msg != response {\n\t\t\t\tctx.addError(\n\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\tfmt.Sprintf(`value must be %q type`, response.FQDN()),\n\t\t\t\t\t\tbuilder.WithIgnoreAndResponse().Location(),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t}\n\tif grpcErr.Message != nil {\n\t\tif err := r.resolveCELValue(ctx, env, grpcErr.Message); err != nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\terr.Error(),\n\t\t\t\t\tbuilder.WithMessage().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t\tif grpcErr.Message.Out != nil && grpcErr.Message.Out.Kind != types.String {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\t\"message must always return a string value\",\n\t\t\t\t\tbuilder.WithMessage().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t}\n\tfor idx, detail := range grpcErr.Details {\n\t\tr.resolveGRPCErrorDetailCELValues(ctx, env, detail, builder.WithDetail(idx))\n\t}\n}\n\nfunc (r *Resolver) resolveGRPCErrorDetailCELValues(ctx *context, env *cel.Env, detail *GRPCErrorDetail, builder *source.GRPCErrorDetailOptionBuilder) {\n\tfor idx, def := range detail.DefSet.Definitions() {\n\t\tenv = r.resolveVariableDefinitionCELValues(ctx, env, def, builder.WithDef(idx))\n\t}\n\n\tif err := r.resolveCELValue(ctx, env, detail.If); err != nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\terr.Error(),\n\t\t\t\tbuilder.WithIf().Location(),\n\t\t\t),\n\t\t)\n\t}\n\tif detail.If.Out != nil && detail.If.Out.Kind != types.Bool {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\t\"if must always return a boolean value\",\n\t\t\t\tbuilder.WithIf().Location(),\n\t\t\t),\n\t\t)\n\t}\n\tfor _, by := range detail.By {\n\t\tif err := r.resolveCELValue(ctx, env, by); err != nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\terr.Error(),\n\t\t\t\t\tbuilder.WithBy().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t\tif by.Out != nil && by.Out.Kind != types.Message {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\t`\"by\" must always return a message value`,\n\t\t\t\t\tbuilder.WithBy().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t}\n\tfor idx, def := range detail.Messages.Definitions() {\n\t\tenv = r.resolveVariableDefinitionCELValues(ctx, env, def, builder.WithDef(idx))\n\t}\n\n\tfor fIdx, failure := range detail.PreconditionFailures {\n\t\tfor fvIdx, violation := range failure.Violations {\n\t\t\tif err := r.resolveCELValue(ctx, env, violation.Type); err != nil {\n\t\t\t\tctx.addError(\n\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\terr.Error(),\n\t\t\t\t\t\tbuilder.WithPreconditionFailure(fIdx, fvIdx, \"type\").Location(),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}\n\t\t\tif violation.Type.Out != nil && violation.Type.Out.Kind != types.String {\n\t\t\t\tctx.addError(\n\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\t\"type must always return a string value\",\n\t\t\t\t\t\tbuilder.WithPreconditionFailure(fIdx, fvIdx, \"type\").Location(),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}\n\t\t\tif err := r.resolveCELValue(ctx, env, violation.Subject); err != nil {\n\t\t\t\tctx.addError(\n\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\terr.Error(),\n\t\t\t\t\t\tbuilder.WithPreconditionFailure(fIdx, fvIdx, \"subject\").Location(),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}\n\t\t\tif violation.Subject.Out != nil && violation.Subject.Out.Kind != types.String {\n\t\t\t\tctx.addError(\n\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\t\"subject must always return a string value\",\n\t\t\t\t\t\tbuilder.WithPreconditionFailure(fIdx, fvIdx, \"subject\").Location(),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}\n\t\t\tif err := r.resolveCELValue(ctx, env, violation.Description); err != nil {\n\t\t\t\tctx.addError(\n\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\terr.Error(),\n\t\t\t\t\t\tbuilder.WithPreconditionFailure(fIdx, fvIdx, \"description\").Location(),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}\n\t\t\tif violation.Description.Out != nil && violation.Description.Out.Kind != types.String {\n\t\t\t\tctx.addError(\n\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\t\"description must always return a string value\",\n\t\t\t\t\t\tbuilder.WithPreconditionFailure(fIdx, fvIdx, \"description\").Location(),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t}\n\n\tfor bIdx, badRequest := range detail.BadRequests {\n\t\tfor fvIdx, violation := range badRequest.FieldViolations {\n\t\t\tif err := r.resolveCELValue(ctx, env, violation.Field); err != nil {\n\t\t\t\tctx.addError(\n\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\terr.Error(),\n\t\t\t\t\t\tbuilder.WithBadRequest(bIdx, fvIdx, \"field\").Location(),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}\n\t\t\tif violation.Field.Out != nil && violation.Field.Out.Kind != types.String {\n\t\t\t\tctx.addError(\n\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\t\"field must always return a string value\",\n\t\t\t\t\t\tbuilder.WithBadRequest(bIdx, fvIdx, \"field\").Location(),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}\n\t\t\tif err := r.resolveCELValue(ctx, env, violation.Description); err != nil {\n\t\t\t\tctx.addError(\n\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\terr.Error(),\n\t\t\t\t\t\tbuilder.WithBadRequest(bIdx, fvIdx, \"description\").Location(),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}\n\t\t\tif violation.Description.Out != nil && violation.Description.Out.Kind != types.String {\n\t\t\t\tctx.addError(\n\t\t\t\t\tErrWithLocation(\n\t\t\t\t\t\t\"description must always return a string value\",\n\t\t\t\t\t\tbuilder.WithBadRequest(bIdx, fvIdx, \"description\").Location(),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t}\n\n\tfor lIdx, message := range detail.LocalizedMessages {\n\t\tif err := r.resolveCELValue(ctx, env, message.Message); err != nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\terr.Error(),\n\t\t\t\t\tbuilder.WithLocalizedMessage(lIdx, \"message\").Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t\tif message.Message.Out != nil && message.Message.Out.Kind != types.String {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\t\"message must always return a string value\",\n\t\t\t\t\tbuilder.WithLocalizedMessage(lIdx, \"message\").Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t}\n}\n\nfunc (r *Resolver) resolveEnumExprCELValues(ctx *context, env *cel.Env, expr *EnumExpr, builder *source.EnumExprOptionBuilder) *Type {\n\ttoEnum := expr.Enum\n\tenumType := NewEnumType(toEnum, false)\n\n\tif err := r.resolveCELValue(ctx, env, expr.By); err != nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\terr.Error(),\n\t\t\t\tbuilder.WithBy().Location(),\n\t\t\t),\n\t\t)\n\t\treturn enumType\n\t}\n\tfromType := expr.By.Out\n\tif fromType.Kind != types.Enum && !fromType.IsEnumSelector() {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\tfmt.Sprintf(\n\t\t\t\t\t\"enum must always return a enum value, but got %q type\",\n\t\t\t\t\tfromType.Kind.ToString(),\n\t\t\t\t),\n\t\t\t\tbuilder.WithBy().Location(),\n\t\t\t),\n\t\t)\n\t}\n\tfromEnum := fromType.Enum\n\tif fromEnum == nil || toEnum == nil {\n\t\treturn enumType\n\t}\n\tfromEnumName := fromEnum.FQDN()\n\ttoEnumName := toEnum.FQDN()\n\tif fromEnumName != toEnumName {\n\t\tif !r.findEnumAliasName(fromEnum, toEnum) {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\tfmt.Sprintf(\n\t\t\t\t\t\t`required specify alias = %q in grpc.federation.enum option for the %q type to automatically assign a value`,\n\t\t\t\t\t\ttoEnumName, fromEnumName,\n\t\t\t\t\t),\n\t\t\t\t\tbuilder.WithBy().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t}\n\treturn enumType\n}\n\nfunc (r *Resolver) resolveSwitchExprCELValues(ctx *context, env *cel.Env, expr *SwitchExpr, builder *source.SwitchExprOptionBuilder) *Type {\n\tfor idx, cse := range expr.Cases {\n\t\tfor defIdx, def := range cse.DefSet.Definitions() {\n\t\t\tenv = r.resolveVariableDefinitionCELValues(ctx, env, def, builder.WithCase(idx).WithDef(defIdx))\n\t\t}\n\t\tif err := r.resolveCELValue(ctx, env, cse.If); err != nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\terr.Error(),\n\t\t\t\t\tbuilder.WithCase(idx).WithIf().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t\tif cse.If.Out != nil && cse.If.Out.Kind != types.Bool {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\t\"if must always return a boolean value\",\n\t\t\t\t\tbuilder.WithCase(idx).WithIf().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t\tif err := r.resolveCELValue(ctx, env, cse.By); err != nil {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\terr.Error(),\n\t\t\t\t\tbuilder.WithCase(idx).WithBy().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t\tif expr.Type != nil && !isExactlySameType(expr.Type, cse.By.Out) {\n\t\t\tctx.addError(\n\t\t\t\tErrWithLocation(\n\t\t\t\t\tfmt.Sprintf(\"case %d: all cases must return the same type, by must return a %q type, but got %q type\", idx, expr.Type.FQDN(), cse.By.Out.FQDN()),\n\t\t\t\t\tbuilder.WithCase(idx).WithBy().Location(),\n\t\t\t\t),\n\t\t\t)\n\t\t} else {\n\t\t\texpr.Type = cse.By.Out\n\t\t}\n\t}\n\tfor defIdx, def := range expr.Default.DefSet.Definitions() {\n\t\tenv = r.resolveVariableDefinitionCELValues(ctx, env, def, builder.WithDefault().WithDef(defIdx))\n\t}\n\tif err := r.resolveCELValue(ctx, env, expr.Default.By); err != nil {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\terr.Error(),\n\t\t\t\tbuilder.WithDefault().WithBy().Location(),\n\t\t\t),\n\t\t)\n\t}\n\tif expr.Type != nil && expr.Default.By.Out != nil && !isExactlySameType(expr.Type, expr.Default.By.Out) {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\tfmt.Sprintf(\"default: all cases must return the same type, by must return a %q type, but got %q type\", expr.Type.FQDN(), expr.Default.By.Out.FQDN()),\n\t\t\t\tbuilder.WithDefault().WithBy().Location(),\n\t\t\t),\n\t\t)\n\t}\n\treturn expr.Type\n}\n\nfunc (r *Resolver) resolveUsedNameReference(msg *Message) {\n\tif msg.Rule == nil {\n\t\treturn\n\t}\n\tnameMap := make(map[string]struct{})\n\tfor _, name := range msg.ReferenceNames() {\n\t\tnameMap[name] = struct{}{}\n\t}\n\tmsg.Rule.DefSet.MarkUsed(nameMap)\n\tfor _, field := range msg.Fields {\n\t\tif field.Rule == nil {\n\t\t\tcontinue\n\t\t}\n\t\tif field.Rule.Oneof == nil {\n\t\t\tcontinue\n\t\t}\n\t\toneof := field.Rule.Oneof\n\t\toneofNameMap := make(map[string]struct{})\n\t\tfor _, name := range oneof.By.ReferenceNames() {\n\t\t\toneofNameMap[name] = struct{}{}\n\t\t}\n\t\toneof.DefSet.MarkUsed(oneofNameMap)\n\t}\n}\n\nfunc (r *Resolver) resolveCELValue(ctx *context, env *cel.Env, value *CELValue) error {\n\tif value == nil {\n\t\treturn nil\n\t}\n\tif strings.Contains(value.Expr, federation.MessageArgumentVariableName) {\n\t\treturn fmt.Errorf(\"%q is a reserved keyword and cannot be used as a variable name\", federation.MessageArgumentVariableName)\n\t}\n\texpr := strings.Replace(value.Expr, \"$\", federation.MessageArgumentVariableName, -1)\n\tr.celRegistry.clear()\n\tast, issues := env.Compile(expr)\n\tif issues.Err() != nil {\n\t\tfor _, err := range issues.Errors() {\n\t\t\tr.removeContextArgumentFromErrorText(err)\n\t\t}\n\t\treturn errors.Join(append(r.celRegistry.errors(), issues.Err())...)\n\t}\n\n\tout, err := r.fromCELType(ctx, ast.OutputType())\n\tif err != nil {\n\t\treturn err\n\t}\n\tcheckedExpr, err := cel.AstToCheckedExpr(ast)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvalue.Out = out\n\tvalue.CheckedExpr = checkedExpr\n\treturn nil\n}\n\nfunc (r *Resolver) removeContextArgumentFromErrorText(err *cel.Error) {\n\terr.Message = strings.Replace(err.Message, federation.ContextTypeName+\", \", \"\", -1)\n\terr.Message = strings.Replace(err.Message, federation.ContextTypeName, \"\", -1)\n}\n\nfunc (r *Resolver) createServiceCELEnv(ctx *context, svc *Service, env *Env) (*cel.Env, error) {\n\tenvOpts := []cel.EnvOption{\n\t\tcel.Container(svc.PackageName()),\n\t}\n\tif env != nil {\n\t\tenvMsg := envVarsToMessage(svc.File, svc.Name, env.Vars)\n\t\tfileDesc := dynamicMsgFileDescriptor(envMsg, strings.Replace(svc.FQDN()+\"Env\", \".\", \"_\", -1))\n\t\tif err := r.celRegistry.RegisterFiles(fileDesc); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tenvOpts = append(envOpts, cel.Variable(\"grpc.federation.env\", cel.ObjectType(envMsg.FQDN())))\n\t}\n\treturn r.createCELEnv(ctx, envOpts...)\n}\n\nfunc (r *Resolver) createMessageCELEnv(ctx *context, msg *Message, svcMsgSet map[*Service]map[*Message]struct{}, builder *source.MessageBuilder) (*cel.Env, error) {\n\tenvOpts := []cel.EnvOption{\n\t\tcel.Container(msg.Package().Name),\n\t}\n\tenvMsg := r.buildEnvMessage(ctx, msg, svcMsgSet, builder)\n\tif envMsg != nil {\n\t\tfileDesc := dynamicMsgFileDescriptor(envMsg, strings.Replace(msg.FQDN()+\"Env\", \".\", \"_\", -1))\n\t\tif err := r.celRegistry.RegisterFiles(fileDesc); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tenvOpts = append(envOpts, cel.Variable(\"grpc.federation.env\", cel.ObjectType(envMsg.FQDN())))\n\t}\n\tsvcVarsMsg := r.buildServiceVariablesMessage(ctx, msg, svcMsgSet, builder)\n\tif svcVarsMsg != nil {\n\t\tfileDesc := dynamicMsgFileDescriptor(svcVarsMsg, strings.Replace(msg.FQDN()+\"Variable\", \".\", \"_\", -1))\n\t\tif err := r.celRegistry.RegisterFiles(fileDesc); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tenvOpts = append(envOpts, cel.Variable(\"grpc.federation.var\", cel.ObjectType(svcVarsMsg.FQDN())))\n\t}\n\n\tif msg.Rule != nil && msg.Rule.MessageArgument != nil {\n\t\tenvOpts = append(envOpts, cel.Variable(federation.MessageArgumentVariableName, cel.ObjectType(msg.Rule.MessageArgument.FQDN())))\n\t}\n\n\treturn r.createCELEnv(ctx, envOpts...)\n}\n\nfunc (r *Resolver) createCELEnv(ctx *context, envOpts ...cel.EnvOption) (*cel.Env, error) {\n\tenvOpts = append(envOpts, []cel.EnvOption{\n\t\tcel.StdLib(),\n\t\text.TwoVarComprehensions(),\n\t\tcel.Lib(grpcfedcel.NewLibrary(r.celRegistry)),\n\t\tcel.CrossTypeNumericComparisons(true),\n\t\tcel.CustomTypeAdapter(r.celRegistry),\n\t\tcel.CustomTypeProvider(r.celRegistry),\n\t\tcel.ASTValidators(grpcfedcel.NewASTValidators()...),\n\t\tcel.Variable(federation.ContextVariableName, cel.ObjectType(federation.ContextTypeName)),\n\t}...)\n\tenvOpts = append(envOpts, r.createEnumAccessors(ctx.file())...)\n\tenvOpts = append(envOpts, r.createGRPCErrorAccessors(ctx.file())...)\n\tenvOpts = append(envOpts, r.enumOperators()...)\n\tfor _, plugin := range ctx.file().AllCELPlugins() {\n\t\tenvOpts = append(envOpts, cel.Lib(plugin))\n\t}\n\tenv, err := cel.NewCustomEnv(envOpts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn env, nil\n}\n\nfunc (r *Resolver) buildEnvMessage(ctx *context, msg *Message, svcMsgSet map[*Service]map[*Message]struct{}, builder *source.MessageBuilder) *Message {\n\tif msg.File == nil {\n\t\treturn nil\n\t}\n\tif msg.File.Package == nil {\n\t\treturn nil\n\t}\n\n\t// Examine all the services where the message is used and collect all the essential information\n\t// to calculate the intersection set of each service's environment variables.\n\tsvcEnvVarMap := map[*Service]map[string]*EnvVar{}\n\tenvVarNameSet := map[string]struct{}{}\n\tfor svc, msgSet := range svcMsgSet {\n\t\tif _, exists := msgSet[msg]; exists {\n\t\t\tenvVarMap := make(map[string]*EnvVar)\n\t\t\tif svc.Rule != nil && svc.Rule.Env != nil {\n\t\t\t\tfor _, envVar := range svc.Rule.Env.Vars {\n\t\t\t\t\tenvVarMap[envVar.Name] = envVar\n\t\t\t\t\tenvVarNameSet[envVar.Name] = struct{}{}\n\t\t\t\t}\n\t\t\t}\n\t\t\tsvcEnvVarMap[svc] = envVarMap\n\t\t}\n\t}\n\n\t// Calculate the intersection set of each service's environment variables\n\tvar envVars []*EnvVar\n\tvar mismatchEnvVarNames []string\n\tmismatchServiceNames := map[string][]string{}\n\tfor envVarName := range envVarNameSet {\n\t\tomit := false\n\t\ttype svcEnvVar struct {\n\t\t\tsvc    *Service\n\t\t\tenvVar *EnvVar\n\t\t}\n\t\tvar svcEnvVars []*svcEnvVar\n\t\tfor svc, envVarMap := range svcEnvVarMap {\n\t\t\tenvVar, exists := envVarMap[envVarName]\n\t\t\tif !exists {\n\t\t\t\t// The given envVar is not defined in the service, so just omit it from the intersection set\n\t\t\t\tomit = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tsvcEnvVars = append(svcEnvVars, &svcEnvVar{svc: svc, envVar: envVar})\n\t\t}\n\t\tif omit {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Check if all the envVar has the same type\n\t\ttyp := svcEnvVars[0].envVar.Type\n\t\tvar mismatch bool\n\t\tfor _, sev := range svcEnvVars[1:] {\n\t\t\tif !isExactlySameType(typ, sev.envVar.Type) {\n\t\t\t\tmismatch = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif mismatch {\n\t\t\tmismatchEnvVarNames = append(mismatchEnvVarNames, envVarName)\n\t\t\tvar serviceNames []string\n\t\t\tfor _, sev := range svcEnvVars {\n\t\t\t\tserviceNames = append(serviceNames, sev.svc.Name)\n\t\t\t}\n\t\t\t// Fix the order for testing\n\t\t\tsort.Strings(serviceNames)\n\t\t\tmismatchServiceNames[envVarName] = serviceNames\n\t\t}\n\n\t\tenvVars = append(envVars, svcEnvVars[0].envVar)\n\t}\n\n\t// Fix the order for testing\n\tsort.Strings(mismatchEnvVarNames)\n\tfor _, missingEnvVarName := range mismatchEnvVarNames {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\tfmt.Sprintf(\n\t\t\t\t\t\"environment variable %q has different types across services: %s\",\n\t\t\t\t\tmissingEnvVarName,\n\t\t\t\t\tstrings.Join(mismatchServiceNames[missingEnvVarName], \", \"),\n\t\t\t\t),\n\t\t\t\tbuilder.Location(),\n\t\t\t),\n\t\t)\n\t}\n\n\treturn envVarsToMessage(msg.File, strings.Replace(msg.FQDN(), \".\", \"_\", -1), envVars)\n}\n\nfunc (r *Resolver) buildServiceVariablesMessage(ctx *context, msg *Message, svcMsgSet map[*Service]map[*Message]struct{}, builder *source.MessageBuilder) *Message {\n\tif msg.File == nil {\n\t\treturn nil\n\t}\n\tif msg.File.Package == nil {\n\t\treturn nil\n\t}\n\n\t// Examine all the services where the message is used and collect all the essential information\n\t// to calculate the intersection set of each service's variables.\n\tsvcVarMap := make(map[*Service]map[string]*ServiceVariable)\n\tsvcVarNameSet := map[string]struct{}{}\n\tfor svc, msgSet := range svcMsgSet {\n\t\tif _, exists := msgSet[msg]; exists {\n\t\t\tsvcVarNameMap := make(map[string]*ServiceVariable)\n\t\t\tif svc.Rule != nil && svc.Rule.Vars != nil {\n\t\t\t\tfor _, svcVar := range svc.Rule.Vars {\n\t\t\t\t\tif svcVar.Name == \"\" {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tif svcVar.Expr == nil || svcVar.Expr.Type == nil {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tsvcVarNameMap[svcVar.Name] = svcVar\n\t\t\t\t\tsvcVarNameSet[svcVar.Name] = struct{}{}\n\t\t\t\t}\n\t\t\t}\n\t\t\tsvcVarMap[svc] = svcVarNameMap\n\t\t}\n\t}\n\n\t// Calculate the intersection set of each service's variables.\n\tvar svcVars []*ServiceVariable\n\tvar mismatchSvcVarNames []string\n\tmismatchServiceNames := map[string][]string{}\n\tfor svcVarName := range svcVarNameSet {\n\t\tomit := false\n\t\ttype SvcVarSet struct {\n\t\t\tsvc    *Service\n\t\t\tsvcVar *ServiceVariable\n\t\t}\n\t\tvar svcVarSets []*SvcVarSet\n\t\tfor svc, svcVarNameMap := range svcVarMap {\n\t\t\tsvcVar, exists := svcVarNameMap[svcVarName]\n\t\t\tif !exists {\n\t\t\t\t// The given svcVar is not defined in the service, so just omit it from the intersection set\n\t\t\t\tomit = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tsvcVarSets = append(svcVarSets, &SvcVarSet{\n\t\t\t\tsvc:    svc,\n\t\t\t\tsvcVar: svcVar,\n\t\t\t})\n\t\t}\n\t\tif omit {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Check if all the svcVar has the same type.\n\t\ttyp := svcVarSets[0].svcVar.Expr.Type\n\t\tvar mismatch bool\n\t\tfor _, set := range svcVarSets[1:] {\n\t\t\tif !isExactlySameType(typ, set.svcVar.Expr.Type) {\n\t\t\t\tmismatch = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif mismatch {\n\t\t\tmismatchSvcVarNames = append(mismatchSvcVarNames, svcVarName)\n\t\t\tvar serviceNames []string\n\t\t\tfor _, set := range svcVarSets {\n\t\t\t\tserviceNames = append(serviceNames, set.svc.Name)\n\t\t\t}\n\t\t\t// Fix the order for testing\n\t\t\tsort.Strings(serviceNames)\n\t\t\tmismatchServiceNames[svcVarName] = serviceNames\n\t\t}\n\n\t\tsvcVars = append(svcVars, svcVarSets[0].svcVar)\n\t}\n\n\t// Fix the order for testing\n\tsort.Strings(mismatchSvcVarNames)\n\tfor _, missingSvcVarName := range mismatchSvcVarNames {\n\t\tctx.addError(\n\t\t\tErrWithLocation(\n\t\t\t\tfmt.Sprintf(\n\t\t\t\t\t\"service variable %q has different types across services: %s\",\n\t\t\t\t\tmissingSvcVarName,\n\t\t\t\t\tstrings.Join(mismatchServiceNames[missingSvcVarName], \", \"),\n\t\t\t\t),\n\t\t\t\tbuilder.Location(),\n\t\t\t),\n\t\t)\n\t}\n\n\treturn svcVarsToMessage(msg.File, strings.Replace(msg.FQDN(), \".\", \"_\", -1), svcVars)\n}\n\nfunc (r *Resolver) createEnumAccessors(file *File) []cel.EnvOption {\n\tif opts, exists := r.cachedEnumAccessorMap[file.Name]; exists {\n\t\treturn opts\n\t}\n\n\tconst optFuncNum = 4 // name, value, from, attr.\n\n\tenums := file.allEnumsIncludeDeps(r.cachedFileAllEnumMap)\n\tret := make([]cel.EnvOption, 0, len(enums)*optFuncNum)\n\tfor _, enum := range enums {\n\t\tret = append(ret, []cel.EnvOption{\n\t\t\tcel.Function(\n\t\t\t\tfmt.Sprintf(\"%s.name\", enum.FQDN()),\n\t\t\t\tcel.Overload(fmt.Sprintf(\"%s_name_int_string\", enum.FQDN()), []*cel.Type{cel.IntType}, cel.StringType,\n\t\t\t\t\tcel.UnaryBinding(func(self ref.Val) ref.Val { return nil }),\n\t\t\t\t),\n\t\t\t\tcel.Overload(fmt.Sprintf(\"%s_name_enum_string\", enum.FQDN()), []*cel.Type{celtypes.NewOpaqueType(enum.FQDN(), cel.IntType)}, cel.StringType,\n\t\t\t\t\tcel.UnaryBinding(func(self ref.Val) ref.Val { return nil }),\n\t\t\t\t),\n\t\t\t),\n\t\t\tcel.Function(\n\t\t\t\tfmt.Sprintf(\"%s.value\", enum.FQDN()),\n\t\t\t\tcel.Overload(fmt.Sprintf(\"%s_value_string_enum\", enum.FQDN()), []*cel.Type{cel.StringType}, celtypes.NewOpaqueType(enum.FQDN(), cel.IntType),\n\t\t\t\t\tcel.UnaryBinding(func(self ref.Val) ref.Val { return nil }),\n\t\t\t\t),\n\t\t\t),\n\t\t\tcel.Function(\n\t\t\t\tfmt.Sprintf(\"%s.from\", enum.FQDN()),\n\t\t\t\tcel.Overload(fmt.Sprintf(\"%s_from_int_enum\", enum.FQDN()), []*cel.Type{cel.IntType}, celtypes.NewOpaqueType(enum.FQDN(), cel.IntType),\n\t\t\t\t\tcel.UnaryBinding(func(self ref.Val) ref.Val { return nil }),\n\t\t\t\t),\n\t\t\t),\n\t\t\tcel.Function(\n\t\t\t\tfmt.Sprintf(\"%s.attr\", enum.FQDN()),\n\t\t\t\tcel.Overload(fmt.Sprintf(\"%s_attr_string_string\", enum.FQDN()), []*cel.Type{celtypes.NewOpaqueType(enum.FQDN(), cel.IntType), cel.StringType}, cel.StringType,\n\t\t\t\t\tcel.BinaryBinding(func(enumValue, key ref.Val) ref.Val { return nil }),\n\t\t\t\t),\n\t\t\t),\n\t\t}...)\n\t\tfor _, value := range enum.Values {\n\t\t\tr.cachedEnumValueMap[value.FQDN()] = value\n\t\t}\n\t}\n\tr.cachedEnumAccessorMap[file.Name] = ret\n\treturn ret\n}\n\nfunc (r *Resolver) createGRPCErrorAccessors(file *File) []cel.EnvOption {\n\tif opts, exists := r.cachedGRPCErrorAccessorMap[file.Name]; exists {\n\t\treturn opts\n\t}\n\n\tmtds := file.AllUseMethods()\n\tret := make([]cel.EnvOption, 0, len(mtds))\n\tfor _, mtd := range mtds {\n\t\tname := mtd.Response.FQDN()\n\t\tret = append(ret, []cel.EnvOption{\n\t\t\tcel.Function(\n\t\t\t\t\"hasIgnoredError\",\n\t\t\t\tcel.MemberOverload(\n\t\t\t\t\tfmt.Sprintf(\"%s_has_ignored_error\", name),\n\t\t\t\t\t[]*cel.Type{cel.ObjectType(name)},\n\t\t\t\t\tcel.BoolType,\n\t\t\t\t\tcel.FunctionBinding(func(_ ...ref.Val) ref.Val { return nil }),\n\t\t\t\t),\n\t\t\t),\n\t\t\tcel.Function(\n\t\t\t\t\"ignoredError\",\n\t\t\t\tcel.MemberOverload(\n\t\t\t\t\tfmt.Sprintf(\"%s_ignored_error\", name),\n\t\t\t\t\t[]*cel.Type{cel.ObjectType(name)},\n\t\t\t\t\tcel.ObjectType(\"grpc.federation.private.Error\"),\n\t\t\t\t\tcel.FunctionBinding(func(_ ...ref.Val) ref.Val { return nil }),\n\t\t\t\t),\n\t\t\t),\n\t\t}...)\n\t}\n\tr.cachedGRPCErrorAccessorMap[file.Name] = ret\n\treturn ret\n}\n\n// enumOperators an enum may be treated as an `opaque<int>` or as an `int`.\n// In this case, the default `equal` and `not-equal` operators cannot be used, so operators are registered so that different types can be compared.\nfunc (r *Resolver) enumOperators() []cel.EnvOption {\n\treturn []cel.EnvOption{\n\t\tcel.Function(operators.Equals,\n\t\t\tcel.Overload(overloads.Equals, []*cel.Type{celtypes.NewTypeParamType(\"A\"), celtypes.NewTypeParamType(\"B\")}, cel.BoolType,\n\t\t\t\tcel.BinaryBinding(func(lhs, rhs ref.Val) ref.Val { return nil }),\n\t\t\t),\n\t\t),\n\t\tcel.Function(operators.NotEquals,\n\t\t\tcel.Overload(overloads.NotEquals, []*cel.Type{celtypes.NewTypeParamType(\"A\"), celtypes.NewTypeParamType(\"B\")}, cel.BoolType,\n\t\t\t\tcel.BinaryBinding(func(lhs, rhs ref.Val) ref.Val { return nil }),\n\t\t\t),\n\t\t),\n\t}\n}\n\nfunc (r *Resolver) fromCELType(ctx *context, typ *cel.Type) (*Type, error) {\n\tdeclTypeName := typ.DeclaredTypeName()\n\tswitch typ.Kind() {\n\tcase celtypes.BoolKind:\n\t\tif declTypeName == \"wrapper(bool)\" {\n\t\t\treturn BoolValueType, nil\n\t\t}\n\t\treturn BoolType, nil\n\tcase celtypes.BytesKind:\n\t\tif declTypeName == \"wrapper(bytes)\" {\n\t\t\treturn BytesValueType, nil\n\t\t}\n\t\treturn BytesType, nil\n\tcase celtypes.DoubleKind:\n\t\tif declTypeName == \"wrapper(double)\" {\n\t\t\treturn DoubleValueType, nil\n\t\t}\n\t\treturn DoubleType, nil\n\tcase celtypes.IntKind:\n\t\tif declTypeName == \"wrapper(int)\" {\n\t\t\treturn Int64ValueType, nil\n\t\t}\n\t\tif enum, found := r.celRegistry.LookupEnum(typ); found {\n\t\t\treturn &Type{Kind: types.Enum, Enum: enum}, nil\n\t\t}\n\t\treturn Int64Type, nil\n\tcase celtypes.UintKind:\n\t\tif declTypeName == \"wrapper(uint)\" {\n\t\t\treturn Uint64ValueType, nil\n\t\t}\n\t\treturn Uint64Type, nil\n\tcase celtypes.StringKind:\n\t\tif declTypeName == \"wrapper(string)\" {\n\t\t\treturn StringValueType, nil\n\t\t}\n\t\treturn StringType, nil\n\tcase celtypes.AnyKind:\n\t\treturn AnyType, nil\n\tcase celtypes.DurationKind:\n\t\treturn DurationType, nil\n\tcase celtypes.TimestampKind:\n\t\treturn TimestampType, nil\n\tcase celtypes.MapKind:\n\t\tmapKey, err := r.fromCELType(ctx, typ.Parameters()[0])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tmapValue, err := r.fromCELType(ctx, typ.Parameters()[1])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn NewMapType(mapKey, mapValue), nil\n\tcase celtypes.ListKind:\n\t\ttyp, err := r.fromCELType(ctx, typ.Parameters()[0])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif typ.Repeated {\n\t\t\treturn nil, fmt.Errorf(\"nested list is unsupported\")\n\t\t}\n\t\ttyp = typ.Clone()\n\t\ttyp.Repeated = true\n\t\treturn typ, nil\n\tcase celtypes.StructKind:\n\t\tif grpcfedcel.IsStandardLibraryType(typ.TypeName()) {\n\t\t\tpkgAndName := strings.TrimPrefix(strings.TrimPrefix(typ.TypeName(), \".\"), \"grpc.federation.\")\n\t\t\tnames := strings.Split(pkgAndName, \".\")\n\t\t\tif len(names) <= 1 {\n\t\t\t\treturn nil, fmt.Errorf(`unexpected package name %q`, pkgAndName)\n\t\t\t}\n\t\t\tpkgName := names[0]\n\t\t\tmsgName := names[1]\n\t\t\treturn NewCELStandardLibraryMessageType(pkgName, msgName), nil\n\t\t}\n\t\treturn r.resolveType(\n\t\t\tctx,\n\t\t\ttyp.TypeName(),\n\t\t\ttypes.Message,\n\t\t\tdescriptorpb.FieldDescriptorProto_LABEL_OPTIONAL,\n\t\t)\n\tcase celtypes.OpaqueKind:\n\t\tparam := typ.Parameters()[0]\n\t\tenum, ok := r.cachedEnumMap[typ.TypeName()]\n\t\tif ok && param.Kind() == celtypes.IntKind {\n\t\t\treturn &Type{Kind: types.Enum, Enum: enum}, nil\n\t\t}\n\t\tif typ.TypeName() == grpcfedcel.EnumSelectorFQDN {\n\t\t\ttrueType, err := r.fromCELType(ctx, typ.Parameters()[0])\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tfalseType, err := r.fromCELType(ctx, typ.Parameters()[1])\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif (trueType.Enum == nil && trueType.FQDN() != grpcfedcel.EnumSelectorFQDN) || (falseType.Enum == nil && falseType.FQDN() != grpcfedcel.EnumSelectorFQDN) {\n\t\t\t\treturn nil, fmt.Errorf(\"cannot find enum type from enum selector\")\n\t\t\t}\n\t\t\treturn NewEnumSelectorType(trueType, falseType), nil\n\t\t}\n\t\treturn r.fromCELType(ctx, param)\n\tcase celtypes.NullTypeKind:\n\t\treturn NullType, nil\n\tcase celtypes.DynKind:\n\t\treturn nil, fmt.Errorf(\"dyn type is unsupported\")\n\t}\n\n\treturn nil, fmt.Errorf(\"unknown type %s is required\", typ.TypeName())\n}\n\nconst (\n\tprivateProtoFile  = \"grpc/federation/private.proto\"\n\ttimeProtoFile     = \"grpc/federation/time.proto\"\n\tdurationProtoFile = \"google/protobuf/duration.proto\"\n)\n\nfunc messageArgumentFileDescriptor(arg *Message) *descriptorpb.FileDescriptorProto {\n\tdesc := arg.File.Desc\n\tmsg := messageToDescriptor(arg)\n\tvar (\n\t\timportedPrivateFile bool\n\t\timportedTimeFile    bool\n\t)\n\tfor _, dep := range desc.GetDependency() {\n\t\tswitch dep {\n\t\tcase privateProtoFile:\n\t\t\timportedPrivateFile = true\n\t\tcase timeProtoFile:\n\t\t\timportedTimeFile = true\n\t\t}\n\t}\n\tdeps := append(desc.GetDependency(), arg.File.Name)\n\tif !importedPrivateFile {\n\t\tdeps = append(deps, privateProtoFile)\n\t}\n\tif !importedTimeFile {\n\t\tdeps = append(deps, timeProtoFile)\n\t}\n\treturn &descriptorpb.FileDescriptorProto{\n\t\tName:             proto.String(strings.Replace(arg.FQDN(), \".\", \"_\", -1)),\n\t\tPackage:          proto.String(arg.PackageName()),\n\t\tDependency:       deps,\n\t\tPublicDependency: desc.PublicDependency,\n\t\tWeakDependency:   desc.WeakDependency,\n\t\tMessageType:      []*descriptorpb.DescriptorProto{msg},\n\t}\n}\n\nfunc envVarsToMessage(file *File, name string, envVars []*EnvVar) *Message {\n\tcopied := *file\n\tcopied.Package = &Package{\n\t\tName: file.PrivatePackageName(),\n\t}\n\tenvMsg := &Message{\n\t\tFile: &copied,\n\t\tName: name + \"Env\",\n\t}\n\tfor _, v := range envVars {\n\t\tenvMsg.Fields = append(envMsg.Fields, &Field{\n\t\t\tName: v.Name,\n\t\t\tType: v.Type,\n\t\t})\n\t}\n\treturn envMsg\n}\n\nfunc svcVarsToMessage(file *File, name string, svcVars []*ServiceVariable) *Message {\n\tcopied := *file\n\tcopied.Package = &Package{\n\t\tName: file.PrivatePackageName(),\n\t}\n\tsvcVarMsg := &Message{\n\t\tFile: &copied,\n\t\tName: strings.Replace(name, \".\", \"_\", -1) + \"Variable\",\n\t}\n\tfor _, v := range svcVars {\n\t\tif v.Name == \"\" {\n\t\t\tcontinue\n\t\t}\n\t\tif v.Expr == nil || v.Expr.Type == nil {\n\t\t\tcontinue\n\t\t}\n\t\tsvcVarMsg.Fields = append(svcVarMsg.Fields, &Field{\n\t\t\tName: v.Name,\n\t\t\tType: v.Expr.Type,\n\t\t})\n\t}\n\treturn svcVarMsg\n}\n\nfunc dynamicMsgFileDescriptor(srcMsg *Message, fileName string) *descriptorpb.FileDescriptorProto {\n\tmsg := messageToDescriptor(srcMsg)\n\tdesc := srcMsg.File.Desc\n\tvar (\n\t\timportedPrivateFile  bool\n\t\timportedDurationFile bool\n\t)\n\tfor _, dep := range desc.GetDependency() {\n\t\tif dep == privateProtoFile {\n\t\t\timportedPrivateFile = true\n\t\t}\n\t\tif dep == durationProtoFile {\n\t\t\timportedDurationFile = true\n\t\t}\n\t}\n\tdeps := append(desc.GetDependency(), srcMsg.File.Name)\n\tif !importedPrivateFile {\n\t\tdeps = append(deps, privateProtoFile)\n\t}\n\tif !importedDurationFile {\n\t\tdeps = append(deps, durationProtoFile)\n\t}\n\treturn &descriptorpb.FileDescriptorProto{\n\t\tName:             proto.String(fileName),\n\t\tPackage:          proto.String(srcMsg.PackageName()),\n\t\tDependency:       deps,\n\t\tPublicDependency: desc.PublicDependency,\n\t\tWeakDependency:   desc.WeakDependency,\n\t\tMessageType:      []*descriptorpb.DescriptorProto{msg},\n\t}\n}\n\nfunc messageToDescriptor(m *Message) *descriptorpb.DescriptorProto {\n\tmsg := &descriptorpb.DescriptorProto{\n\t\tName: proto.String(m.Name),\n\t\tOptions: &descriptorpb.MessageOptions{\n\t\t\tMapEntry: proto.Bool(m.IsMapEntry),\n\t\t},\n\t}\n\tfor idx, field := range m.Fields {\n\t\tvar (\n\t\t\ttypeName string\n\t\t\tlabel    = descriptorpb.FieldDescriptorProto_LABEL_OPTIONAL\n\t\t)\n\t\tif field.Type.Message != nil && field.Type.Message.IsMapEntry {\n\t\t\tmp := messageToDescriptor(field.Type.Message)\n\t\t\tif mp.GetName() == \"\" {\n\t\t\t\tmp.Name = proto.String(toMapEntryName(field.Name))\n\t\t\t}\n\t\t\tmsg.NestedType = append(msg.NestedType, mp)\n\t\t\ttypeName = m.FQDN() + \".\" + mp.GetName()\n\t\t\tlabel = descriptorpb.FieldDescriptorProto_LABEL_REPEATED\n\t\t} else if field.Type.Message != nil {\n\t\t\ttypeName = field.Type.Message.FQDN()\n\t\t}\n\t\tif field.Type.Enum != nil {\n\t\t\ttypeName = field.Type.Enum.FQDN()\n\t\t}\n\t\tif field.Type.Repeated {\n\t\t\tlabel = descriptorpb.FieldDescriptorProto_LABEL_REPEATED\n\t\t}\n\t\tkind := descriptorpb.FieldDescriptorProto_Type(field.Type.Kind) //nolint:gosec\n\t\tmsg.Field = append(msg.Field, &descriptorpb.FieldDescriptorProto{\n\t\t\tName:     proto.String(field.Name),\n\t\t\tNumber:   proto.Int32(int32(idx) + 1), //nolint:gosec\n\t\t\tType:     &kind,\n\t\t\tTypeName: proto.String(typeName),\n\t\t\tLabel:    &label,\n\t\t})\n\t}\n\treturn msg\n}\n\n// toMapEntryName normalize map message name.\n// To avoid this validation error, the message name of the map must be appropriately set.\n// https://github.com/protocolbuffers/protobuf-go/blob/9c8c2ddc6dd4a0de078404a4af1770e6b5320352/reflect/protodesc/desc_validate.go#L326-L327\n//\n// Here is the reference for this implementation: https://github.com/protocolbuffers/protobuf-go/blob/9c8c2ddc6dd4a0de078404a4af1770e6b5320352/internal/strs/strings.go#L125\nfunc toMapEntryName(s string) string {\n\tvar b []byte\n\tupperNext := true\n\tfor _, c := range s {\n\t\tswitch {\n\t\tcase c == '_':\n\t\t\tupperNext = true\n\t\tcase upperNext:\n\t\t\tb = append(b, byte(unicode.ToUpper(c)))\n\t\t\tupperNext = false\n\t\tdefault:\n\t\t\tb = append(b, byte(c))\n\t\t}\n\t}\n\tb = append(b, \"Entry\"...)\n\treturn string(b)\n}\n\nfunc (r *Resolver) resolveAutoBind(ctx *context, files []*File) {\n\tmsgs := r.allMessages(files)\n\tfor _, msg := range msgs {\n\t\tctx := ctx.withFile(msg.File).withMessage(msg)\n\t\tr.resolveAutoBindFields(ctx, msg, source.NewMessageBuilder(msg.File.Name, msg.Name))\n\t}\n}\n\n// resolveMessageRuleDependencies resolve dependencies for each message.\nfunc (r *Resolver) resolveMessageDependencies(ctx *context, files []*File) {\n\tmsgs := r.allMessages(files)\n\tfor _, msg := range msgs {\n\t\tif msg.Rule == nil {\n\t\t\tcontinue\n\t\t}\n\t\tsetupVariableDefinitionSet(ctx, msg, msg.Rule.DefSet)\n\t\tfor defIdx, def := range msg.Rule.DefSet.Definitions() {\n\t\t\tctx := ctx.withDefIndex(defIdx)\n\t\t\texpr := def.Expr\n\t\t\tif expr == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tswitch {\n\t\t\tcase expr.Call != nil:\n\t\t\t\tfor _, grpcErr := range expr.Call.Errors {\n\t\t\t\t\tr.resolveGRPCErrorMessageDependencies(ctx, msg, grpcErr)\n\t\t\t\t}\n\t\t\tcase expr.Switch != nil:\n\t\t\t\tfor _, cse := range expr.Switch.Cases {\n\t\t\t\t\tsetupVariableDefinitionSet(ctx, msg, cse.DefSet)\n\t\t\t\t}\n\t\t\t\tsetupVariableDefinitionSet(ctx, msg, expr.Switch.Default.DefSet)\n\t\t\tcase expr.Validation != nil:\n\t\t\t\tr.resolveGRPCErrorMessageDependencies(ctx, msg, expr.Validation.Error)\n\t\t\t}\n\t\t}\n\t\tfor _, field := range msg.Fields {\n\t\t\tif field.Rule == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif field.Rule.Oneof == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tsetupVariableDefinitionSet(ctx, msg, field.Rule.Oneof.DefSet)\n\t\t}\n\t}\n\tr.validateMessages(ctx, msgs)\n}\n\nfunc (r *Resolver) resolveGRPCErrorMessageDependencies(ctx *context, msg *Message, grpcErr *GRPCError) {\n\tif grpcErr == nil {\n\t\treturn\n\t}\n\tsetupVariableDefinitionSet(ctx, msg, grpcErr.DefSet)\n\tfor detIdx, detail := range grpcErr.Details {\n\t\tctx := ctx.withErrDetailIndex(detIdx)\n\t\tsetupVariableDefinitionSet(ctx, msg, detail.DefSet)\n\t\tsetupVariableDefinitionSet(ctx, msg, detail.Messages)\n\t}\n}\n\nfunc (r *Resolver) resolveValue(def *commonValueDef) (*Value, error) {\n\tconst (\n\t\tcustomResolverOpt = \"custom_resolver\"\n\t\taliasOpt          = \"alias\"\n\t\tbyOpt             = \"by\"\n\t\tinlineOpt         = \"inline\"\n\t)\n\tvar (\n\t\tvalue    *Value\n\t\toptNames []string\n\t)\n\tif def.CustomResolver != nil {\n\t\toptNames = append(optNames, customResolverOpt)\n\t}\n\tif def.Alias != nil {\n\t\toptNames = append(optNames, aliasOpt)\n\t}\n\tif def.By != nil {\n\t\tvalue = &Value{CEL: &CELValue{Expr: def.GetBy()}}\n\t\toptNames = append(optNames, byOpt)\n\t}\n\tif def.Inline != nil {\n\t\tvalue = &Value{Inline: true, CEL: &CELValue{Expr: def.GetInline()}}\n\t\toptNames = append(optNames, inlineOpt)\n\t}\n\tif len(optNames) == 0 {\n\t\treturn nil, fmt.Errorf(\"value must be specified\")\n\t}\n\tif len(optNames) != 1 {\n\t\treturn nil, fmt.Errorf(\"multiple values cannot be specified at the same time: %s\", strings.Join(optNames, \",\"))\n\t}\n\treturn value, nil\n}\n\nfunc (r *Resolver) lookupRequestMessageFromResponseMessage(resMsg *Message) *Message {\n\tfor _, method := range r.cachedMethodMap {\n\t\tif method.FederationResponse() == resMsg {\n\t\t\treturn method.Request\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (r *Resolver) splitMethodFullName(pkg *Package, name string) (string, string, string, error) {\n\tserviceWithPkgAndMethod := strings.Split(name, \"/\")\n\tif len(serviceWithPkgAndMethod) != 2 {\n\t\treturn \"\", \"\", \"\", fmt.Errorf(`invalid method format. required format is \"<package-name>.<service-name>/<method-name>\" but specified %q`, name)\n\t}\n\tserviceWithPkgName := serviceWithPkgAndMethod[0]\n\tmethodName := serviceWithPkgAndMethod[1]\n\tif !strings.Contains(serviceWithPkgName, \".\") {\n\t\treturn pkg.Name, serviceWithPkgName, methodName, nil\n\t}\n\tnames := strings.Split(serviceWithPkgName, \".\")\n\tif len(names) <= 1 {\n\t\treturn \"\", \"\", \"\", fmt.Errorf(`invalid method format. required package name but not specified: %q`, serviceWithPkgName)\n\t}\n\tpkgName := strings.Join(names[:len(names)-1], \".\")\n\tserviceName := names[len(names)-1]\n\treturn pkgName, serviceName, methodName, nil\n}\n\nfunc (r *Resolver) lookupMessage(pkg *Package, name string) (*File, *descriptorpb.DescriptorProto, error) {\n\tfiles, exists := r.protoPackageNameToFileDefs[pkg.Name]\n\tif !exists {\n\t\treturn nil, nil, fmt.Errorf(`%q package does not exist`, pkg.Name)\n\t}\n\tfor _, file := range files {\n\t\tfor _, msg := range file.GetMessageType() {\n\t\t\tif msg.GetName() == name {\n\t\t\t\treturn r.defToFileMap[file], msg, nil\n\t\t\t}\n\t\t\tparent := msg.GetName()\n\t\t\tfor _, msg := range msg.GetNestedType() {\n\t\t\t\tif found := r.lookupMessageRecursive(name, parent, msg); found != nil {\n\t\t\t\t\treturn r.defToFileMap[file], found, nil\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn nil, nil, fmt.Errorf(`\"%s.%s\" message does not exist`, pkg.Name, name)\n}\n\nfunc (r *Resolver) lookupEnum(pkg *Package, name string) (*File, *descriptorpb.EnumDescriptorProto, error) {\n\tfiles, exists := r.protoPackageNameToFileDefs[pkg.Name]\n\tif !exists {\n\t\treturn nil, nil, fmt.Errorf(`%q package does not exist`, pkg.Name)\n\t}\n\tfor _, file := range files {\n\t\tfor _, enum := range file.GetEnumType() {\n\t\t\tif enum.GetName() == name {\n\t\t\t\treturn r.defToFileMap[file], enum, nil\n\t\t\t}\n\t\t}\n\t\tfor _, msg := range file.GetMessageType() {\n\t\t\tmsgName := msg.GetName()\n\t\t\tfor _, enum := range msg.GetEnumType() {\n\t\t\t\tenumName := fmt.Sprintf(\"%s.%s\", msgName, enum.GetName())\n\t\t\t\tif enumName == name {\n\t\t\t\t\treturn r.defToFileMap[file], enum, nil\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor _, subMsg := range msg.GetNestedType() {\n\t\t\t\tif found := r.lookupEnumRecursive(name, msgName, subMsg); found != nil {\n\t\t\t\t\treturn r.defToFileMap[file], found, nil\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn nil, nil, fmt.Errorf(`\"%s.%s\" enum does not exist`, pkg.Name, name)\n}\n\nfunc (r *Resolver) lookupEnumRecursive(name, parent string, msg *descriptorpb.DescriptorProto) *descriptorpb.EnumDescriptorProto {\n\tprefix := fmt.Sprintf(\"%s.%s\", parent, msg.GetName())\n\tfor _, enum := range msg.GetEnumType() {\n\t\tenumName := fmt.Sprintf(\"%s.%s\", prefix, enum.GetName())\n\t\tif enumName == name {\n\t\t\treturn enum\n\t\t}\n\t}\n\tfor _, subMsg := range msg.GetNestedType() {\n\t\tenum := r.lookupEnumRecursive(name, prefix, subMsg)\n\t\tif enum != nil {\n\t\t\treturn enum\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (r *Resolver) lookupMessageRecursive(name, parent string, msg *descriptorpb.DescriptorProto) *descriptorpb.DescriptorProto {\n\tfullMsgName := fmt.Sprintf(\"%s.%s\", parent, msg.GetName())\n\tif fullMsgName == name {\n\t\treturn msg\n\t}\n\tfor _, nestedMsg := range msg.GetNestedType() {\n\t\tmsg := r.lookupMessageRecursive(name, fullMsgName, nestedMsg)\n\t\tif msg != nil {\n\t\t\treturn msg\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (r *Resolver) lookupService(pkg *Package, name string) (*File, *descriptorpb.ServiceDescriptorProto, error) {\n\tfiles, exists := r.protoPackageNameToFileDefs[pkg.Name]\n\tif !exists {\n\t\treturn nil, nil, fmt.Errorf(`%q package does not exist`, pkg.Name)\n\t}\n\tfor _, file := range files {\n\t\tfor _, svc := range file.GetService() {\n\t\t\tif svc.GetName() == name {\n\t\t\t\treturn r.defToFileMap[file], svc, nil\n\t\t\t}\n\t\t}\n\t}\n\treturn nil, nil, fmt.Errorf(`\"%s.%s\" service does not exist`, pkg.Name, name)\n}\n\nfunc (r *Resolver) lookupPackage(name string) (*Package, error) {\n\tname = strings.TrimPrefix(name, \".\")\n\tnames := strings.Split(name, \".\")\n\tif len(names) <= 1 {\n\t\treturn nil, fmt.Errorf(`unexpected package name %q`, name)\n\t}\n\tfor lastIdx := len(names) - 1; lastIdx > 0; lastIdx-- {\n\t\tpkgName := strings.Join(names[:lastIdx], \".\")\n\t\tpkg, exists := r.protoPackageNameToPackage[pkgName]\n\t\tif exists {\n\t\t\treturn pkg, nil\n\t\t}\n\t}\n\treturn nil, fmt.Errorf(`cannot find package from %q`, name)\n}\n\nfunc (r *Resolver) trimPackage(pkg *Package, name string) string {\n\tname = strings.TrimPrefix(name, \".\")\n\tif !strings.Contains(name, \".\") {\n\t\treturn name\n\t}\n\treturn strings.TrimPrefix(name, fmt.Sprintf(\"%s.\", pkg.Name))\n}\n\nfunc isDifferentType(from, to *Type) bool {\n\tif from == nil || to == nil {\n\t\treturn false\n\t}\n\tif from.IsNumber() && to.IsNumber() {\n\t\treturn false\n\t}\n\tif from.Kind == types.Enum && to.IsNumber() {\n\t\t// enum to number is OK.\n\t\treturn false\n\t}\n\tif from.IsNull && (to.Repeated || to.Kind == types.Message || to.Kind == types.Bytes) {\n\t\treturn false\n\t}\n\treturn from.Kind != to.Kind\n}\n\nfunc isDifferentArgumentType(from, to *Type) bool {\n\tif from == nil || to == nil {\n\t\treturn false\n\t}\n\tif from.IsNumber() && to.IsNumber() {\n\t\treturn false\n\t}\n\tif from.Kind == types.Enum && to.IsNumber() {\n\t\t// enum to number is OK.\n\t\treturn false\n\t}\n\tif from.IsNull && (to.Repeated || to.Kind == types.Message || to.Kind == types.Bytes) {\n\t\treturn false\n\t}\n\tif from.Kind == types.Message && to.Kind == types.Message {\n\t\tif from.FQDN() == to.FQDN() {\n\t\t\treturn false\n\t\t}\n\t\tif findMessageAliasName(from.Message, to.Message) {\n\t\t\treturn false\n\t\t}\n\t\tif findMessageAliasName(to.Message, from.Message) {\n\t\t\treturn false\n\t\t}\n\t\treturn true\n\t}\n\treturn from.Kind != to.Kind\n}\n\nfunc isExactlySameType(left, right *Type) bool {\n\tif left == nil || right == nil {\n\t\treturn false\n\t}\n\tif left.Kind != right.Kind {\n\t\treturn false\n\t}\n\tif left.Repeated != right.Repeated {\n\t\treturn false\n\t}\n\tif left.Message != nil || right.Message != nil {\n\t\tif left.Message == nil || right.Message == nil {\n\t\t\treturn false\n\t\t}\n\t\tif len(left.Message.Fields) != len(right.Message.Fields) {\n\t\t\treturn false\n\t\t}\n\t\tlfMap := map[string]*Field{}\n\t\tfor _, lf := range left.Message.Fields {\n\t\t\tlfMap[lf.Name] = lf\n\t\t}\n\t\tfor _, rf := range right.Message.Fields {\n\t\t\tlf, exists := lfMap[rf.Name]\n\t\t\tif !exists {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tif !isExactlySameType(lf.Type, rf.Type) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t}\n\treturn true\n}\n\nfunc toFieldBuilder(builder *source.MessageBuilder, field *Field) *source.FieldBuilder {\n\tif field.Oneof != nil {\n\t\treturn builder.WithOneof(field.Oneof.Name).WithField(field.Name)\n\t}\n\treturn builder.WithField(field.Name)\n}\n\nfunc newMessageBuilderFromMessage(message *Message) *source.MessageBuilder {\n\tif message.ParentMessage == nil {\n\t\treturn source.NewMessageBuilder(message.FileName(), message.Name)\n\t}\n\tbuilder := newMessageBuilderFromMessage(message.ParentMessage)\n\treturn builder.WithMessage(message.Name)\n}\n\nfunc splitGoPackageName(goPackage string) (string, string, error) {\n\timportPathAndPkgName := strings.Split(goPackage, \";\")\n\tif len(importPathAndPkgName) == 1 {\n\t\tpath := importPathAndPkgName[0]\n\t\tpaths := strings.Split(path, \"/\")\n\t\tif len(paths) == 0 {\n\t\t\treturn path, path, nil\n\t\t}\n\t\treturn path, paths[len(paths)-1], nil\n\t}\n\tif len(importPathAndPkgName) != 2 {\n\t\treturn \"\", \"\", fmt.Errorf(`go_package option %q is invalid`, goPackage)\n\t}\n\treturn importPathAndPkgName[0], importPathAndPkgName[1], nil\n}\n"
  },
  {
    "path": "resolver/resolver_test.go",
    "content": "package resolver_test\n\nimport (\n\t\"log/slog\"\n\t\"path/filepath\"\n\t\"strconv\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\texprv1 \"google.golang.org/genproto/googleapis/api/expr/v1alpha1\"\n\t\"google.golang.org/genproto/googleapis/rpc/code\"\n\n\t\"github.com/mercari/grpc-federation/internal/testutil\"\n\t\"github.com/mercari/grpc-federation/resolver\"\n\t\"github.com/mercari/grpc-federation/source\"\n)\n\nfunc TestSimpleAggregation(t *testing.T) {\n\tt.Parallel()\n\ttestdataDir := filepath.Join(testutil.RepoRoot(), \"testdata\")\n\tfileName := filepath.Join(testdataDir, \"simple_aggregation.proto\")\n\tfb := testutil.NewFileBuilder(fileName)\n\tref := testutil.NewBuilderReferenceManager(getUserProtoBuilder(t), getPostProtoBuilder(t), fb)\n\n\tfb.SetPackage(\"org.federation\").\n\t\tSetGoPackage(\"example/federation\", \"federation\").\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"Item\").\n\t\t\t\tAddEnum(\n\t\t\t\t\ttestutil.NewEnumBuilder(\"ItemType\").\n\t\t\t\t\t\tSetAlias(ref.Enum(t, \"org.user\", \"Item.ItemType\")).\n\t\t\t\t\t\tAddValueWithRule(\n\t\t\t\t\t\t\t\"ITEM_TYPE_1\",\n\t\t\t\t\t\t\ttestutil.NewEnumValueRuleBuilder().\n\t\t\t\t\t\t\t\tSetAlias(ref.EnumValue(t, \"org.user\", \"Item.ItemType\", \"ITEM_TYPE_1\")).\n\t\t\t\t\t\t\t\tSetAttr(&resolver.EnumValueAttribute{\n\t\t\t\t\t\t\t\t\tName:  \"en\",\n\t\t\t\t\t\t\t\t\tValue: \"item type 1\",\n\t\t\t\t\t\t\t\t}).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddValueWithRule(\n\t\t\t\t\t\t\t\"ITEM_TYPE_2\",\n\t\t\t\t\t\t\ttestutil.NewEnumValueRuleBuilder().\n\t\t\t\t\t\t\t\tSetAlias(ref.EnumValue(t, \"org.user\", \"Item.ItemType\", \"ITEM_TYPE_2\")).\n\t\t\t\t\t\t\t\tSetAttr(&resolver.EnumValueAttribute{\n\t\t\t\t\t\t\t\t\tName:  \"en\",\n\t\t\t\t\t\t\t\t\tValue: \"item type 2\",\n\t\t\t\t\t\t\t\t}).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddValueWithRule(\n\t\t\t\t\t\t\t\"ITEM_TYPE_3\",\n\t\t\t\t\t\t\ttestutil.NewEnumValueRuleBuilder().\n\t\t\t\t\t\t\t\tSetAlias(ref.EnumValue(t, \"org.user\", \"Item.ItemType\", \"ITEM_TYPE_3\")).\n\t\t\t\t\t\t\t\tSetAttr(&resolver.EnumValueAttribute{\n\t\t\t\t\t\t\t\t\tName:  \"en\",\n\t\t\t\t\t\t\t\t\tValue: \"item type 3\",\n\t\t\t\t\t\t\t\t}).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tAddFieldWithAlias(\"name\", resolver.StringType, ref.Field(t, \"org.user\", \"Item\", \"name\")).\n\t\t\t\tAddFieldWithTypeNameAndAlias(t, \"type\", \"ItemType\", false, ref.Field(t, \"org.user\", \"Item\", \"type\")).\n\t\t\t\tAddFieldWithAlias(\"value\", resolver.Uint32Type, ref.Field(t, \"org.user\", \"Item\", \"value\")).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tSetAlias(ref.Message(t, \"org.user\", \"Item\")).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddEnum(\n\t\t\ttestutil.NewEnumBuilder(\"UserType\").\n\t\t\t\tSetAlias(ref.Enum(t, \"org.user\", \"UserType\")).\n\t\t\t\tAddValueWithAlias(\"USER_TYPE_1\", ref.EnumValue(t, \"org.user\", \"UserType\", \"USER_TYPE_1\")).\n\t\t\t\tAddValueWithAlias(\"USER_TYPE_2\", ref.EnumValue(t, \"org.user\", \"UserType\", \"USER_TYPE_2\")).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"ZArgument\").\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"Z\").\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"foo\",\n\t\t\t\t\tresolver.StringType,\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(nil).SetMessageCustomResolver(true).Build(t),\n\t\t\t\t).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"ZArgument\")).\n\t\t\t\t\t\tSetCustomResolver(true).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"MArgument\").\n\t\t\t\tAddField(\"x\", resolver.Uint64Type).\n\t\t\t\tAddField(\"y\", ref.Type(t, \"org.user\", \"Item.ItemType\")).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"M\").\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"foo\",\n\t\t\t\t\tresolver.StringType,\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(newStringValue(\"foo\")).Build(t),\n\t\t\t\t).\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"bar\",\n\t\t\t\t\tresolver.Int64Type,\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(newInt64Value(1)).Build(t),\n\t\t\t\t).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"MArgument\")).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"PostArgument\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"UserArgument\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tAddField(\"title\", resolver.StringType).\n\t\t\t\tAddField(\"content\", resolver.StringType).\n\t\t\t\tAddField(\"user_id\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"User_AttrAArgument\").\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"User_AttrBArgument\").\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"User\").\n\t\t\t\tAddMessage(\n\t\t\t\t\ttestutil.NewMessageBuilder(\"ProfileEntry\").\n\t\t\t\t\t\tSetIsMapEntry(true).\n\t\t\t\t\t\tAddField(\"key\", resolver.StringType).\n\t\t\t\t\t\tAddField(\"value\", resolver.AnyType).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tAddMessage(\n\t\t\t\t\ttestutil.NewMessageBuilder(\"AttrA\").\n\t\t\t\t\t\tAddFieldWithAlias(\"foo\", resolver.StringType, ref.Field(t, \"org.user\", \"User.AttrA\", \"foo\")).\n\t\t\t\t\t\tSetRule(\n\t\t\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"User_AttrAArgument\")).\n\t\t\t\t\t\t\t\tSetAlias(ref.Message(t, \"org.user\", \"User.AttrA\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tAddMessage(\n\t\t\t\t\ttestutil.NewMessageBuilder(\"AttrB\").\n\t\t\t\t\t\tAddFieldWithAlias(\"bar\", resolver.BoolType, ref.Field(t, \"org.user\", \"User.AttrB\", \"bar\")).\n\t\t\t\t\t\tSetRule(\n\t\t\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"User_AttrBArgument\")).\n\t\t\t\t\t\t\t\tSetAlias(ref.Message(t, \"org.user\", \"User.AttrB\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tAddFieldWithAutoBind(\"id\", resolver.StringType, ref.Field(t, \"org.user\", \"User\", \"id\")).\n\t\t\t\tAddFieldWithAutoBind(\"type\", ref.Type(t, \"org.federation\", \"UserType\"), ref.Field(t, \"org.user\", \"User\", \"type\")).\n\t\t\t\tAddFieldWithAutoBind(\"name\", resolver.StringType, ref.Field(t, \"org.user\", \"User\", \"name\")).\n\t\t\t\tAddFieldWithRule(\"age\", resolver.Uint64Type, testutil.NewFieldRuleBuilder(nil).SetCustomResolver(true).Build(t)).\n\t\t\t\tAddFieldWithAutoBind(\"desc\", resolver.StringRepeatedType, ref.Field(t, \"org.user\", \"User\", \"desc\")).\n\t\t\t\tAddFieldWithAutoBind(\"main_item\", ref.Type(t, \"org.federation\", \"Item\"), ref.Field(t, \"org.user\", \"User\", \"main_item\")).\n\t\t\t\tAddFieldWithAutoBind(\"items\", ref.RepeatedType(t, \"org.federation\", \"Item\"), ref.Field(t, \"org.user\", \"User\", \"items\")).\n\t\t\t\tAddFieldWithTypeNameAndAutoBind(t, \"profile\", \"ProfileEntry\", false, ref.Field(t, \"org.user\", \"User\", \"profile\")).\n\t\t\t\tAddFieldWithTypeNameAndAutoBind(t, \"attr_a\", \"AttrA\", false, ref.Field(t, \"org.user\", \"User\", \"attr_a\")).\n\t\t\t\tAddFieldWithTypeNameAndAutoBind(t, \"b\", \"AttrB\", false, ref.Field(t, \"org.user\", \"User\", \"b\")).\n\t\t\t\tAddOneof(testutil.NewOneofBuilder(\"attr\").AddFieldNames(\"attr_a\", \"b\").Build(t)).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"res\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetCall(\n\t\t\t\t\t\t\t\t\ttestutil.NewCallExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMethod(ref.Method(t, \"org.user\", \"UserService\", \"GetUser\")).\n\t\t\t\t\t\t\t\t\t\tSetRequest(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewRequestBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAddField(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"id\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tresolver.StringType,\n\t\t\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageArgumentValueBuilder(resolver.StringType, resolver.StringType, \"user_id\").Build(t),\n\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tSetTimeout(\"20s\").\n\t\t\t\t\t\t\t\t\t\tSetRetryIf(\"error.code != google.rpc.Code.UNIMPLEMENTED\").\n\t\t\t\t\t\t\t\t\t\tSetRetryPolicyExponential(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewRetryPolicyExponentialBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tSetInitialInterval(\"1s\").\n\t\t\t\t\t\t\t\t\t\t\t\tSetRandomizationFactor(0.7).\n\t\t\t\t\t\t\t\t\t\t\t\tSetMultiplier(1.7).\n\t\t\t\t\t\t\t\t\t\t\t\tSetMaxInterval(\"30s\").\n\t\t\t\t\t\t\t\t\t\t\t\tSetMaxRetries(3).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"user\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetAutoBind(true).\n\t\t\t\t\t\t\t\tSetBy(testutil.NewCELValueBuilder(\"res.user\", ref.Type(t, \"org.user\", \"User\")).Build(t)).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"_def2\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"M\")).\n\t\t\t\t\t\t\t\t\t\tSetArgs(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageDependencyArgumentBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"x\", resolver.NewByValue(\"uint(2)\", resolver.Uint64Type)).\n\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"y\", resolver.NewByValue(\"org.user.Item.ItemType.value('ITEM_TYPE_2')\", ref.Type(t, \"org.user\", \"Item.ItemType\"))).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"UserArgument\")).\n\t\t\t\t\t\tSetDependencyGraph(\n\t\t\t\t\t\t\ttestutil.NewDependencyGraphBuilder().\n\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.federation\", \"M\")).\n\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.user\", \"GetUserResponse\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinitionGroup(testutil.NewVariableDefinitionGroupByName(\"_def2\")).\n\t\t\t\t\t\tAddVariableDefinitionGroup(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\tAddStart(testutil.NewVariableDefinitionGroupByName(\"res\")).\n\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"user\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"Post\").\n\t\t\t\tAddFieldWithAutoBind(\"id\", resolver.StringType, ref.Field(t, \"org.post\", \"Post\", \"id\")).\n\t\t\t\tAddFieldWithAutoBind(\"title\", resolver.StringType, ref.Field(t, \"org.post\", \"Post\", \"title\")).\n\t\t\t\tAddFieldWithAutoBind(\"content\", resolver.StringType, ref.Field(t, \"org.post\", \"Post\", \"content\")).\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"user\",\n\t\t\t\t\tref.Type(t, \"org.federation\", \"User\"),\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(\n\t\t\t\t\t\ttestutil.NewNameReferenceValueBuilder(\n\t\t\t\t\t\t\tref.Type(t, \"org.federation\", \"User\"),\n\t\t\t\t\t\t\tref.Type(t, \"org.federation\", \"User\"),\n\t\t\t\t\t\t\t\"user\",\n\t\t\t\t\t\t).Build(t),\n\t\t\t\t\t).Build(t),\n\t\t\t\t).\n\t\t\t\tAddFieldWithAutoBind(\"foo\", resolver.StringType, ref.Field(t, \"org.federation\", \"M\", \"foo\")).\n\t\t\t\tAddFieldWithAutoBind(\"bar\", resolver.Int64Type, ref.Field(t, \"org.federation\", \"M\", \"bar\")).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"res\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetCall(\n\t\t\t\t\t\t\t\t\ttestutil.NewCallExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMethod(ref.Method(t, \"org.post\", \"PostService\", \"GetPost\")).\n\t\t\t\t\t\t\t\t\t\tSetRequest(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewRequestBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAddField(\"id\", resolver.StringType, testutil.NewMessageArgumentValueBuilder(resolver.StringType, resolver.StringType, \"id\").Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tSetTimeout(\"10s\").\n\t\t\t\t\t\t\t\t\t\tSetRetryPolicyConstant(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewRetryPolicyConstantBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tSetInterval(\"2s\").\n\t\t\t\t\t\t\t\t\t\t\t\tSetMaxRetries(3).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"post\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetAutoBind(true).\n\t\t\t\t\t\t\t\tSetBy(testutil.NewCELValueBuilder(\"res.post\", ref.Type(t, \"org.post\", \"Post\")).Build(t)).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"user\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"User\")).\n\t\t\t\t\t\t\t\t\t\tSetArgs(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageDependencyArgumentBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tInline(testutil.NewNameReferenceValueBuilder(ref.Type(t, \"org.post\", \"GetPostResponse\"), ref.Type(t, \"org.post\", \"Post\"), \"post\").Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"z\").\n\t\t\t\t\t\t\t\tSetUsed(false).\n\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"Z\")).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"m\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetAutoBind(true).\n\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"M\")).\n\t\t\t\t\t\t\t\t\t\tSetArgs(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageDependencyArgumentBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"x\", resolver.NewByValue(\"10\", resolver.Int64Type)).\n\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"y\", resolver.NewByValue(\"1\", resolver.Int64Type)).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"PostArgument\")).\n\t\t\t\t\t\tSetDependencyGraph(\n\t\t\t\t\t\t\ttestutil.NewDependencyGraphBuilder().\n\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.federation\", \"M\")).\n\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.federation\", \"Z\")).\n\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.post\", \"GetPostResponse\"), ref.Message(t, \"org.federation\", \"User\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinitionGroup(testutil.NewVariableDefinitionGroupByName(\"m\")).\n\t\t\t\t\t\tAddVariableDefinitionGroup(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\tAddStart(\n\t\t\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\t\t\tAddStart(testutil.NewVariableDefinitionGroupByName(\"res\")).\n\t\t\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"post\")).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"user\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinitionGroup(testutil.NewVariableDefinitionGroupByName(\"z\")).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostRequest\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostResponseArgument\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostResponse\").\n\t\t\t\tAddMessage(\n\t\t\t\t\ttestutil.NewMessageBuilder(\"MapValueEntry\").\n\t\t\t\t\t\tSetIsMapEntry(true).\n\t\t\t\t\t\tAddField(\"key\", resolver.Int32Type).\n\t\t\t\t\t\tAddField(\"value\", resolver.StringType).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"post\",\n\t\t\t\t\tref.Type(t, \"org.federation\", \"Post\"),\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(\n\t\t\t\t\t\ttestutil.NewNameReferenceValueBuilder(\n\t\t\t\t\t\t\tref.Type(t, \"org.federation\", \"Post\"),\n\t\t\t\t\t\t\tref.Type(t, \"org.federation\", \"Post\"),\n\t\t\t\t\t\t\t\"post\",\n\t\t\t\t\t\t).Build(t),\n\t\t\t\t\t).Build(t),\n\t\t\t\t).\n\t\t\t\tAddFieldWithRule(\"const\", resolver.StringType, testutil.NewFieldRuleBuilder(newStringValue(\"foo\")).Build(t)).\n\t\t\t\tAddFieldWithRule(\"uuid\", resolver.StringType, testutil.NewFieldRuleBuilder(resolver.NewByValue(\"uuid.string()\", resolver.StringType)).Build(t)).\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"enum_name\",\n\t\t\t\t\tresolver.StringType,\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(\n\t\t\t\t\t\tresolver.NewByValue(\"org.federation.Item.ItemType.name(org.federation.Item.ItemType.ITEM_TYPE_1)\", resolver.StringType),\n\t\t\t\t\t).Build(t),\n\t\t\t\t).\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"enum_value\",\n\t\t\t\t\tresolver.Int32Type,\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(\n\t\t\t\t\t\tresolver.NewByValue(\"org.federation.Item.ItemType.value('ITEM_TYPE_1')\", resolver.Int32Type),\n\t\t\t\t\t).Build(t),\n\t\t\t\t).\n\t\t\t\tAddFieldWithTypeNameAndRule(\n\t\t\t\t\tt,\n\t\t\t\t\t\"map_value\",\n\t\t\t\t\t\"MapValueEntry\",\n\t\t\t\t\tfalse,\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(\n\t\t\t\t\t\tresolver.NewByValue(\"map_value')\", resolver.NewMessageType(&resolver.Message{\n\t\t\t\t\t\t\tIsMapEntry: true,\n\t\t\t\t\t\t\tFields: []*resolver.Field{\n\t\t\t\t\t\t\t\t{Name: \"key\", Type: resolver.Int32Type},\n\t\t\t\t\t\t\t\t{Name: \"value\", Type: resolver.StringType},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}, false)),\n\t\t\t\t\t).Build(t),\n\t\t\t\t).\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"item_type\",\n\t\t\t\t\tref.Type(t, \"org.federation\", \"Item.ItemType\"),\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(\n\t\t\t\t\t\ttestutil.NewNameReferenceValueBuilder(\n\t\t\t\t\t\t\tref.Type(t, \"org.federation\", \"Item.ItemType\"),\n\t\t\t\t\t\t\tref.Type(t, \"org.user\", \"Item.ItemType\"),\n\t\t\t\t\t\t\t\"e\",\n\t\t\t\t\t\t).Build(t),\n\t\t\t\t\t).Build(t),\n\t\t\t\t).\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"item_type_text\",\n\t\t\t\t\tresolver.StringType,\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(resolver.NewByValue(\"Item.ItemType.attr(e, 'en')\", resolver.StringType)).Build(t),\n\t\t\t\t).\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"different_type_id\",\n\t\t\t\t\tresolver.Int64Type,\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(resolver.NewByValue(\"id\", resolver.Int64Type)).Build(t),\n\t\t\t\t).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"post\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"Post\")).\n\t\t\t\t\t\t\t\t\t\tSetArgs(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageDependencyArgumentBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"id\", testutil.NewMessageArgumentValueBuilder(resolver.StringType, resolver.StringType, \"id\").Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"uuid\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetBy(testutil.NewCELValueBuilder(\"grpc.federation.uuid.newRandom()\", resolver.NewCELStandardLibraryMessageType(\"uuid\", \"UUID\")).Build(t)).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"map_value\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetBy(testutil.NewCELValueBuilder(\n\t\t\t\t\t\t\t\t\t\"{1:'a', 2:'b', 3:'c'}\",\n\t\t\t\t\t\t\t\t\tresolver.NewMessageType(&resolver.Message{\n\t\t\t\t\t\t\t\t\t\tIsMapEntry: true,\n\t\t\t\t\t\t\t\t\t\tFields: []*resolver.Field{\n\t\t\t\t\t\t\t\t\t\t\t{Name: \"key\", Type: resolver.Int64Type},\n\t\t\t\t\t\t\t\t\t\t\t{Name: \"value\", Type: resolver.StringType},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t}, false)).\n\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"e\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetEnum(\n\t\t\t\t\t\t\t\t\ttestutil.NewEnumExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetEnum(ref.Enum(t, \"org.federation\", \"Item.ItemType\")).\n\t\t\t\t\t\t\t\t\t\tSetBy(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewCELValueBuilder(\n\t\t\t\t\t\t\t\t\t\t\t\t\"org.user.Item.ItemType.value('ITEM_TYPE_2')\",\n\t\t\t\t\t\t\t\t\t\t\t\tresolver.NewEnumType(ref.Enum(t, \"org.user\", \"Item.ItemType\"), false),\n\t\t\t\t\t\t\t\t\t\t\t).Build(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"id\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetBy(testutil.NewCELValueBuilder(\"100\", resolver.Int64Type).Build(t)).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"GetPostResponseArgument\")).\n\t\t\t\t\t\tSetDependencyGraph(\n\t\t\t\t\t\t\ttestutil.NewDependencyGraphBuilder().\n\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.federation\", \"Post\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinitionGroup(testutil.NewVariableDefinitionGroupByName(\"e\")).\n\t\t\t\t\t\tAddVariableDefinitionGroup(testutil.NewVariableDefinitionGroupByName(\"id\")).\n\t\t\t\t\t\tAddVariableDefinitionGroup(testutil.NewVariableDefinitionGroupByName(\"map_value\")).\n\t\t\t\t\t\tAddVariableDefinitionGroup(testutil.NewVariableDefinitionGroupByName(\"post\")).\n\t\t\t\t\t\tAddVariableDefinitionGroup(testutil.NewVariableDefinitionGroupByName(\"uuid\")).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddService(\n\t\t\ttestutil.NewServiceBuilder(\"FederationService\").\n\t\t\t\tAddMethod(\n\t\t\t\t\t\"GetPost\",\n\t\t\t\t\tref.Message(t, \"org.federation\", \"GetPostRequest\"),\n\t\t\t\t\tref.Message(t, \"org.federation\", \"GetPostResponse\"),\n\t\t\t\t\ttestutil.NewMethodRuleBuilder().Timeout(\"1m\").Build(t),\n\t\t\t\t).\n\t\t\t\tSetRule(testutil.NewServiceRuleBuilder().Build(t)).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"GetPostResponse\"), ref.Message(t, \"org.federation\", \"GetPostResponseArgument\")).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"M\"), ref.Message(t, \"org.federation\", \"MArgument\")).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"Post\"), ref.Message(t, \"org.federation\", \"PostArgument\")).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"User\"), ref.Message(t, \"org.federation\", \"UserArgument\")).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"Z\"), ref.Message(t, \"org.federation\", \"ZArgument\")).\n\t\t\t\tBuild(t),\n\t\t)\n\n\tfederationFile := fb.Build(t)\n\tfederationService := federationFile.Services[0]\n\n\tr := resolver.New(testutil.Compile(t, fileName), resolver.ImportPathOption(testdataDir))\n\tresult, err := r.Resolve()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif len(result.Files) != 1 {\n\t\tt.Fatalf(\"failed to get files. expected 1 but got %d\", len(result.Files))\n\t}\n\tif len(result.Files[0].Services) != 1 {\n\t\tt.Fatalf(\"failed to get services. expected 1 but got %d\", len(result.Files[0].Services))\n\t}\n\tif diff := cmp.Diff(result.Files[0].Services[0], federationService, testutil.ResolverCmpOpts()...); diff != \"\" {\n\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t}\n\n\tt.Run(\"candidates\", func(t *testing.T) {\n\t\tcandidates := r.Candidates(&source.Location{\n\t\t\tFileName: fileName,\n\t\t\tMessage: &source.Message{\n\t\t\t\tName: \"Post\",\n\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\tCall: &source.CallExprOption{\n\t\t\t\t\t\t\tMethod: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t\tif diff := cmp.Diff(\n\t\t\tcandidates, []string{\n\t\t\t\t\"org.post.PostService/CreatePost\",\n\t\t\t\t\"org.post.PostService/GetPost\",\n\t\t\t\t\"org.post.PostService/GetPosts\",\n\t\t\t\t\"org.post.PostService/UpdatePost\",\n\t\t\t\t\"org.user.UserService/GetUser\",\n\t\t\t\t\"org.user.UserService/GetUsers\",\n\t\t\t},\n\t\t); diff != \"\" {\n\t\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t}\n\t})\n}\n\nfunc TestCreatePost(t *testing.T) {\n\tt.Parallel()\n\ttestdataDir := filepath.Join(testutil.RepoRoot(), \"testdata\")\n\tfileName := filepath.Join(testdataDir, \"create_post.proto\")\n\tfb := testutil.NewFileBuilder(fileName)\n\tref := testutil.NewBuilderReferenceManager(getUserProtoBuilder(t), getPostProtoBuilder(t), fb)\n\n\tfb.SetPackage(\"org.federation\").\n\t\tSetGoPackage(\"example/federation\", \"federation\").\n\t\tAddEnum(\n\t\t\ttestutil.NewEnumBuilder(\"PostType\").\n\t\t\t\tSetAlias(ref.Enum(t, \"org.post\", \"PostType\")).\n\t\t\t\tAddValueWithAlias(\n\t\t\t\t\t\"TYPE_UNKNOWN\",\n\t\t\t\t\tref.EnumValue(t, \"org.post\", \"PostType\", \"POST_TYPE_UNKNOWN\"),\n\t\t\t\t).\n\t\t\t\tAddValueWithAlias(\n\t\t\t\t\t\"TYPE_A\",\n\t\t\t\t\tref.EnumValue(t, \"org.post\", \"PostType\", \"POST_TYPE_A\"),\n\t\t\t\t).\n\t\t\t\tAddValueWithAlias(\n\t\t\t\t\t\"TYPE_B\",\n\t\t\t\t\tref.EnumValue(t, \"org.post\", \"PostType\", \"POST_TYPE_B\"),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"Post\").\n\t\t\t\tAddFieldWithAlias(\"id\", resolver.StringType, ref.Field(t, \"org.post\", \"Post\", \"id\")).\n\t\t\t\tAddFieldWithAlias(\"title\", resolver.StringType, ref.Field(t, \"org.post\", \"Post\", \"title\")).\n\t\t\t\tAddFieldWithAlias(\"content\", resolver.StringType, ref.Field(t, \"org.post\", \"Post\", \"content\")).\n\t\t\t\tAddFieldWithAlias(\"user_id\", resolver.StringType, ref.Field(t, \"org.post\", \"Post\", \"user_id\")).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tSetAlias(ref.Message(t, \"org.post\", \"Post\")).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"CreatePostArgument\").\n\t\t\t\tAddField(\"title\", resolver.StringType).\n\t\t\t\tAddField(\"content\", resolver.StringType).\n\t\t\t\tAddField(\"user_id\", resolver.StringType).\n\t\t\t\tAddField(\"type\", ref.Type(t, \"org.federation\", \"PostType\")).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"CreatePost\").\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"title\",\n\t\t\t\t\tresolver.StringType,\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(\n\t\t\t\t\t\ttestutil.NewMessageArgumentValueBuilder(resolver.StringType, resolver.StringType, \"title\").Build(t),\n\t\t\t\t\t).SetAlias(ref.Field(t, \"org.post\", \"CreatePost\", \"title\")).Build(t),\n\t\t\t\t).\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"content\",\n\t\t\t\t\tresolver.StringType,\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(\n\t\t\t\t\t\ttestutil.NewMessageArgumentValueBuilder(resolver.StringType, resolver.StringType, \"content\").Build(t),\n\t\t\t\t\t).SetAlias(ref.Field(t, \"org.post\", \"CreatePost\", \"content\")).Build(t),\n\t\t\t\t).\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"user_id\",\n\t\t\t\t\tresolver.StringType,\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(\n\t\t\t\t\t\ttestutil.NewMessageArgumentValueBuilder(resolver.StringType, resolver.StringType, \"user_id\").Build(t),\n\t\t\t\t\t).SetAlias(ref.Field(t, \"org.post\", \"CreatePost\", \"user_id\")).Build(t),\n\t\t\t\t).\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"type\",\n\t\t\t\t\tref.Type(t, \"org.federation\", \"PostType\"),\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(\n\t\t\t\t\t\tresolver.NewByValue(\"PostType.from($.type)\", ref.Type(t, \"org.federation\", \"PostType\")),\n\t\t\t\t\t).SetAlias(ref.Field(t, \"org.post\", \"CreatePost\", \"type\")).Build(t),\n\t\t\t\t).\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"post_type\",\n\t\t\t\t\tresolver.Int32Type,\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(\n\t\t\t\t\t\tresolver.NewByValue(\"PostType.TYPE_A\", resolver.Int32Type),\n\t\t\t\t\t).SetAlias(ref.Field(t, \"org.post\", \"CreatePost\", \"post_type\")).Build(t),\n\t\t\t\t).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tSetAlias(ref.Message(t, \"org.post\", \"CreatePost\")).\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"CreatePostArgument\")).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"CreatePostRequest\").\n\t\t\t\tAddField(\"title\", resolver.StringType).\n\t\t\t\tAddField(\"content\", resolver.StringType).\n\t\t\t\tAddField(\"user_id\", resolver.StringType).\n\t\t\t\tAddField(\"type\", ref.Type(t, \"org.federation\", \"PostType\")).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"CreatePostResponseArgument\").\n\t\t\t\tAddField(\"title\", resolver.StringType).\n\t\t\t\tAddField(\"content\", resolver.StringType).\n\t\t\t\tAddField(\"user_id\", resolver.StringType).\n\t\t\t\tAddField(\"type\", ref.Type(t, \"org.federation\", \"PostType\")).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"CreatePostResponse\").\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"post\",\n\t\t\t\t\tref.Type(t, \"org.federation\", \"Post\"),\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(\n\t\t\t\t\t\ttestutil.NewNameReferenceValueBuilder(\n\t\t\t\t\t\t\t// Ref type is not org.post.Post.\n\t\t\t\t\t\t\t// To use the original response type when creating the dependency graph,\n\t\t\t\t\t\t\t// leave Ref as it is and use Filtered to calculate the name reference.\n\t\t\t\t\t\t\tref.Type(t, \"org.post\", \"CreatePostResponse\"),\n\t\t\t\t\t\t\tref.Type(t, \"org.post\", \"Post\"),\n\t\t\t\t\t\t\t\"p\",\n\t\t\t\t\t\t).Build(t),\n\t\t\t\t\t).Build(t),\n\t\t\t\t).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"cp\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"CreatePost\")).\n\t\t\t\t\t\t\t\t\t\tSetArgs(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageDependencyArgumentBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"title\", testutil.NewMessageArgumentValueBuilder(resolver.StringType, resolver.StringType, \"title\").Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"content\", testutil.NewMessageArgumentValueBuilder(resolver.StringType, resolver.StringType, \"content\").Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"user_id\", testutil.NewMessageArgumentValueBuilder(resolver.StringType, resolver.StringType, \"user_id\").Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"type\", testutil.NewMessageArgumentValueBuilder(resolver.StringType, ref.Type(t, \"org.federation\", \"PostType\"), \"type\").Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"res\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetCall(\n\t\t\t\t\t\t\t\t\ttestutil.NewCallExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMethod(ref.Method(t, \"org.post\", \"PostService\", \"CreatePost\")).\n\t\t\t\t\t\t\t\t\t\tSetRequest(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewRequestBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAddField(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"post\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tref.Type(t, \"org.post\", \"CreatePost\"),\n\t\t\t\t\t\t\t\t\t\t\t\t\ttestutil.NewNameReferenceValueBuilder(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tref.Type(t, \"org.federation\", \"CreatePost\"),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tref.Type(t, \"org.federation\", \"CreatePost\"),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"cp\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t).Build(t),\n\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"p\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetBy(testutil.NewCELValueBuilder(\"res.post\", ref.Type(t, \"org.post\", \"Post\")).Build(t)).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"CreatePostResponseArgument\")).\n\t\t\t\t\t\tSetDependencyGraph(\n\t\t\t\t\t\t\ttestutil.NewDependencyGraphBuilder().\n\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.federation\", \"CreatePost\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinitionGroup(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\tAddStart(testutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\t\tAddStart(testutil.NewVariableDefinitionGroupByName(\"cp\")).\n\t\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"res\")).\n\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"p\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"UpdatePostRequest\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"UpdatePostResponseArgument\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"UpdatePostResponse\").\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"_def0\").\n\t\t\t\t\t\t\t\tSetCall(\n\t\t\t\t\t\t\t\t\ttestutil.NewCallExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMethod(ref.Method(t, \"org.post\", \"PostService\", \"UpdatePost\")).\n\t\t\t\t\t\t\t\t\t\tSetRequest(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewRequestBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAddField(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"id\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tresolver.StringType,\n\t\t\t\t\t\t\t\t\t\t\t\t\tresolver.NewByValue(\"$.id\", resolver.StringType),\n\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"UpdatePostResponseArgument\")).\n\t\t\t\t\t\tSetDependencyGraph(testutil.NewDependencyGraphBuilder().Build(t)).\n\t\t\t\t\t\tAddVariableDefinitionGroup(testutil.NewVariableDefinitionGroupByName(\"_def0\")).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddService(\n\t\t\ttestutil.NewServiceBuilder(\"FederationService\").\n\t\t\t\tAddMethod(\"CreatePost\", ref.Message(t, \"org.federation\", \"CreatePostRequest\"), ref.Message(t, \"org.federation\", \"CreatePostResponse\"), nil).\n\t\t\t\tAddMethod(\n\t\t\t\t\t\"UpdatePost\",\n\t\t\t\t\tref.Message(t, \"org.federation\", \"UpdatePostRequest\"),\n\t\t\t\t\tresolver.EmptyType.Message,\n\t\t\t\t\ttestutil.NewMethodRuleBuilder().Response(ref.Message(t, \"org.federation\", \"UpdatePostResponse\")).Build(t),\n\t\t\t\t).\n\t\t\t\tSetRule(testutil.NewServiceRuleBuilder().Build(t)).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"CreatePost\"), ref.Message(t, \"org.federation\", \"CreatePostArgument\")).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"CreatePostResponse\"), ref.Message(t, \"org.federation\", \"CreatePostResponseArgument\")).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"UpdatePostResponse\"), ref.Message(t, \"org.federation\", \"UpdatePostResponseArgument\")).\n\t\t\t\tBuild(t),\n\t\t)\n\n\tfederationFile := fb.Build(t)\n\tfederationService := federationFile.Services[0]\n\n\tr := resolver.New(testutil.Compile(t, fileName), resolver.ImportPathOption(testdataDir))\n\tresult, err := r.Resolve()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif len(result.Files) != 1 {\n\t\tt.Fatalf(\"failed to get files. expected 1 but got %d\", len(result.Files))\n\t}\n\tif len(result.Files[0].Services) != 1 {\n\t\tt.Fatalf(\"failed to get services. expected 1 but got %d\", len(result.Files[0].Services))\n\t}\n\tif diff := cmp.Diff(result.Files[0].Services[0], federationService, testutil.ResolverCmpOpts()...); diff != \"\" {\n\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t}\n}\n\nfunc TestMinimum(t *testing.T) {\n\tt.Parallel()\n\tfileName := filepath.Join(testutil.RepoRoot(), \"testdata\", \"minimum.proto\")\n\tr := resolver.New(testutil.Compile(t, fileName))\n\tresult, err := r.Resolve()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif len(result.Files) != 1 {\n\t\tt.Fatalf(\"failed to get files. expected 1 but got %d\", len(result.Files))\n\t}\n\tif len(result.Files[0].Services) != 1 {\n\t\tt.Fatalf(\"failed to get services. expected 1 but got %d\", len(result.Files[0].Services))\n\t}\n\n\tfb := testutil.NewFileBuilder(fileName)\n\tref := testutil.NewBuilderReferenceManager(fb)\n\n\tfb.SetPackage(\"org.federation\").\n\t\tSetGoPackage(\"example/federation\", \"federation\").\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"User\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tAddField(\"name\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"Post\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tAddField(\"title\", resolver.StringType).\n\t\t\t\tAddField(\"content\", resolver.StringType).\n\t\t\t\tAddField(\"user\", ref.Type(t, \"org.federation\", \"User\")).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddEnum(\n\t\t\ttestutil.NewEnumBuilder(\"PostType\").\n\t\t\t\tAddValue(\"POST_TYPE_1\").\n\t\t\t\tAddValue(\"POST_TYPE_2\").\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostRequest\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tAddField(\"type\", ref.Type(t, \"org.federation\", \"PostType\")).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostResponseArgument\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tAddField(\"type\", ref.Type(t, \"org.federation\", \"PostType\")).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostResponse\").\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"post\",\n\t\t\t\t\tref.Type(t, \"org.federation\", \"Post\"),\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(nil).SetMessageCustomResolver(true).Build(t),\n\t\t\t\t).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"GetPostResponseArgument\")).\n\t\t\t\t\t\tSetCustomResolver(true).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddService(\n\t\t\ttestutil.NewServiceBuilder(\"FederationService\").\n\t\t\t\tAddMethod(\"GetPost\", ref.Message(t, \"org.federation\", \"GetPostRequest\"), ref.Message(t, \"org.federation\", \"GetPostResponse\"), nil).\n\t\t\t\tSetRule(testutil.NewServiceRuleBuilder().Build(t)).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"GetPostResponse\"), ref.Message(t, \"org.federation\", \"GetPostResponseArgument\")).\n\t\t\t\tBuild(t),\n\t\t)\n\tfederationFile := fb.Build(t)\n\tservice := federationFile.Services[0]\n\tif diff := cmp.Diff(result.Files[0].Services[0], service, testutil.ResolverCmpOpts()...); diff != \"\" {\n\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t}\n}\n\nfunc TestCustomResolver(t *testing.T) {\n\tt.Parallel()\n\ttestdataDir := filepath.Join(testutil.RepoRoot(), \"testdata\")\n\tfileName := filepath.Join(testdataDir, \"custom_resolver.proto\")\n\tr := resolver.New(testutil.Compile(t, fileName), resolver.ImportPathOption(testdataDir))\n\tresult, err := r.Resolve()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif len(result.Files) != 1 {\n\t\tt.Fatalf(\"failed to get files. expected 1 but got %d\", len(result.Files))\n\t}\n\tif len(result.Files[0].Services) != 1 {\n\t\tt.Fatalf(\"failed to get services. expected 1 but got %d\", len(result.Files[0].Services))\n\t}\n\n\tfb := testutil.NewFileBuilder(fileName)\n\tref := testutil.NewBuilderReferenceManager(getUserProtoBuilder(t), getPostProtoBuilder(t), fb)\n\n\tfb.SetPackage(\"org.federation\").\n\t\tSetGoPackage(\"example/federation\", \"federation\").\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"PostArgument\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"UserArgument\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tAddField(\"title\", resolver.StringType).\n\t\t\t\tAddField(\"content\", resolver.StringType).\n\t\t\t\tAddField(\"user_id\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"User\").\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"id\",\n\t\t\t\t\tresolver.StringType,\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(nil).SetMessageCustomResolver(true).Build(t),\n\t\t\t\t).\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"name\",\n\t\t\t\t\tresolver.StringType,\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(nil).SetCustomResolver(true).Build(t),\n\t\t\t\t).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"res\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetCall(\n\t\t\t\t\t\t\t\t\ttestutil.NewCallExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMethod(ref.Method(t, \"org.user\", \"UserService\", \"GetUser\")).\n\t\t\t\t\t\t\t\t\t\tSetRequest(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewRequestBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAddField(\"id\", resolver.StringType, testutil.NewMessageArgumentValueBuilder(resolver.StringType, resolver.StringType, \"user_id\").Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"u\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetBy(testutil.NewCELValueBuilder(\"res.user\", ref.Type(t, \"org.user\", \"User\")).Build(t)).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"UserArgument\")).\n\t\t\t\t\t\tSetCustomResolver(true).\n\t\t\t\t\t\tSetDependencyGraph(\n\t\t\t\t\t\t\ttestutil.NewDependencyGraphBuilder().\n\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.user\", \"GetUserResponse\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinitionGroup(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\tAddStart(testutil.NewVariableDefinitionGroupByName(\"res\")).\n\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"u\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"Post\").\n\t\t\t\tAddFieldWithAutoBind(\"id\", resolver.StringType, ref.Field(t, \"org.post\", \"Post\", \"id\")).\n\t\t\t\tAddFieldWithAutoBind(\"title\", resolver.StringType, ref.Field(t, \"org.post\", \"Post\", \"title\")).\n\t\t\t\tAddFieldWithAutoBind(\"content\", resolver.StringType, ref.Field(t, \"org.post\", \"Post\", \"content\")).\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"user\",\n\t\t\t\t\tref.Type(t, \"org.federation\", \"User\"),\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(nil).SetCustomResolver(true).Build(t),\n\t\t\t\t).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"res\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetCall(\n\t\t\t\t\t\t\t\t\ttestutil.NewCallExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMethod(ref.Method(t, \"org.post\", \"PostService\", \"GetPost\")).\n\t\t\t\t\t\t\t\t\t\tSetRequest(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewRequestBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAddField(\"id\", resolver.StringType, testutil.NewMessageArgumentValueBuilder(resolver.StringType, resolver.StringType, \"id\").Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"post\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetAutoBind(true).\n\t\t\t\t\t\t\t\tSetBy(testutil.NewCELValueBuilder(\"res.post\", ref.Type(t, \"org.post\", \"Post\")).Build(t)).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"user\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"User\")).\n\t\t\t\t\t\t\t\t\t\tSetArgs(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageDependencyArgumentBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tInline(testutil.NewNameReferenceValueBuilder(ref.Type(t, \"org.post\", \"GetPostResponse\"), ref.Type(t, \"org.post\", \"Post\"), \"post\").Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"PostArgument\")).\n\t\t\t\t\t\tSetDependencyGraph(\n\t\t\t\t\t\t\ttestutil.NewDependencyGraphBuilder().\n\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.post\", \"GetPostResponse\"), ref.Message(t, \"org.federation\", \"User\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinitionGroup(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\tAddStart(testutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\t\tAddStart(testutil.NewVariableDefinitionGroupByName(\"res\")).\n\t\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"post\")).\n\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"user\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostRequest\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostResponseArgument\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostResponse\").\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"post\",\n\t\t\t\t\tref.Type(t, \"org.federation\", \"Post\"),\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(\n\t\t\t\t\t\ttestutil.NewNameReferenceValueBuilder(ref.Type(t, \"org.federation\", \"Post\"), ref.Type(t, \"org.federation\", \"Post\"), \"post\").\n\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t).Build(t),\n\t\t\t\t).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"post\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"Post\")).\n\t\t\t\t\t\t\t\t\t\tSetArgs(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageDependencyArgumentBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"id\", testutil.NewMessageArgumentValueBuilder(resolver.StringType, resolver.StringType, \"id\").Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"GetPostResponseArgument\")).\n\t\t\t\t\t\tSetDependencyGraph(\n\t\t\t\t\t\t\ttestutil.NewDependencyGraphBuilder().\n\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.federation\", \"Post\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinitionGroup(testutil.NewVariableDefinitionGroupByName(\"post\")).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddService(\n\t\t\ttestutil.NewServiceBuilder(\"FederationService\").\n\t\t\t\tAddMethod(\"GetPost\", ref.Message(t, \"org.federation\", \"GetPostRequest\"), ref.Message(t, \"org.federation\", \"GetPostResponse\"), nil).\n\t\t\t\tSetRule(testutil.NewServiceRuleBuilder().Build(t)).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"GetPostResponse\"), ref.Message(t, \"org.federation\", \"GetPostResponseArgument\")).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"Post\"), ref.Message(t, \"org.federation\", \"PostArgument\")).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"User\"), ref.Message(t, \"org.federation\", \"UserArgument\")).\n\t\t\t\tBuild(t),\n\t\t)\n\n\tfederationFile := fb.Build(t)\n\tservice := federationFile.Services[0]\n\tif diff := cmp.Diff(result.Files[0].Services[0], service, testutil.ResolverCmpOpts()...); diff != \"\" {\n\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t}\n}\n\nfunc TestAsync(t *testing.T) {\n\tt.Parallel()\n\tfileName := filepath.Join(testutil.RepoRoot(), \"testdata\", \"async.proto\")\n\tr := resolver.New(testutil.Compile(t, fileName))\n\tresult, err := r.Resolve()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif len(result.Files) != 1 {\n\t\tt.Fatalf(\"failed to get files. expected 1 but got %d\", len(result.Files))\n\t}\n\tif len(result.Files[0].Services) != 1 {\n\t\tt.Fatalf(\"failed to get services. expected 1 but got %d\", len(result.Files[0].Services))\n\t}\n\n\tfb := testutil.NewFileBuilder(fileName)\n\tref := testutil.NewBuilderReferenceManager(fb)\n\n\tfb.SetPackage(\"org.federation\").\n\t\tSetGoPackage(\"example/federation\", \"federation\").\n\t\tAddMessage(testutil.NewMessageBuilder(\"GetResponseArgument\").Build(t)).\n\t\tAddMessage(testutil.NewMessageBuilder(\"AArgument\").Build(t)).\n\t\tAddMessage(testutil.NewMessageBuilder(\"AAArgument\").Build(t)).\n\t\tAddMessage(testutil.NewMessageBuilder(\"ABArgument\").Build(t)).\n\t\tAddMessage(testutil.NewMessageBuilder(\"BArgument\").Build(t)).\n\t\tAddMessage(testutil.NewMessageBuilder(\"CArgument\").AddField(\"a\", resolver.StringType).Build(t)).\n\t\tAddMessage(testutil.NewMessageBuilder(\"DArgument\").AddField(\"b\", resolver.StringType).Build(t)).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"EArgument\").\n\t\t\t\tAddField(\"c\", resolver.StringType).\n\t\t\t\tAddField(\"d\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"FArgument\").\n\t\t\t\tAddField(\"c\", resolver.StringType).\n\t\t\t\tAddField(\"d\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(testutil.NewMessageBuilder(\"GArgument\").Build(t)).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"HArgument\").\n\t\t\t\tAddField(\"e\", resolver.StringType).\n\t\t\t\tAddField(\"f\", resolver.StringType).\n\t\t\t\tAddField(\"g\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(testutil.NewMessageBuilder(\"IArgument\").Build(t)).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"JArgument\").\n\t\t\t\tAddField(\"i\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"AA\").\n\t\t\t\tAddFieldWithRule(\"name\", resolver.StringType, testutil.NewFieldRuleBuilder(newStringValue(\"aa\")).Build(t)).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"AAArgument\")).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"AB\").\n\t\t\t\tAddFieldWithRule(\"name\", resolver.StringType, testutil.NewFieldRuleBuilder(newStringValue(\"ab\")).Build(t)).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"ABArgument\")).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"A\").\n\t\t\t\tAddFieldWithRule(\"name\", resolver.StringType, testutil.NewFieldRuleBuilder(newStringValue(\"a\")).Build(t)).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"aa\").\n\t\t\t\t\t\t\t\tSetUsed(false).\n\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"AA\")).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"ab\").\n\t\t\t\t\t\t\t\tSetUsed(false).\n\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"AB\")).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"AArgument\")).\n\t\t\t\t\t\tSetDependencyGraph(\n\t\t\t\t\t\t\ttestutil.NewDependencyGraphBuilder().\n\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.federation\", \"AA\")).\n\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.federation\", \"AB\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinitionGroup(testutil.NewVariableDefinitionGroupByName(\"aa\")).\n\t\t\t\t\t\tAddVariableDefinitionGroup(testutil.NewVariableDefinitionGroupByName(\"ab\")).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"B\").\n\t\t\t\tAddFieldWithRule(\"name\", resolver.StringType, testutil.NewFieldRuleBuilder(newStringValue(\"b\")).Build(t)).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"BArgument\")).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"C\").\n\t\t\t\tAddFieldWithRule(\"name\", resolver.StringType, testutil.NewFieldRuleBuilder(newStringValue(\"c\")).Build(t)).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"CArgument\")).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"D\").\n\t\t\t\tAddFieldWithRule(\"name\", resolver.StringType, testutil.NewFieldRuleBuilder(newStringValue(\"d\")).Build(t)).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"DArgument\")).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"E\").\n\t\t\t\tAddFieldWithRule(\"name\", resolver.StringType, testutil.NewFieldRuleBuilder(newStringValue(\"e\")).Build(t)).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"EArgument\")).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"F\").\n\t\t\t\tAddFieldWithRule(\"name\", resolver.StringType, testutil.NewFieldRuleBuilder(newStringValue(\"f\")).Build(t)).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"FArgument\")).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"G\").\n\t\t\t\tAddFieldWithRule(\"name\", resolver.StringType, testutil.NewFieldRuleBuilder(newStringValue(\"g\")).Build(t)).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"GArgument\")).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"H\").\n\t\t\t\tAddFieldWithRule(\"name\", resolver.StringType, testutil.NewFieldRuleBuilder(newStringValue(\"h\")).Build(t)).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"HArgument\")).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"I\").\n\t\t\t\tAddFieldWithRule(\"name\", resolver.StringType, testutil.NewFieldRuleBuilder(newStringValue(\"i\")).Build(t)).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"IArgument\")).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"J\").\n\t\t\t\tAddFieldWithRule(\"name\", resolver.StringType, testutil.NewFieldRuleBuilder(newStringValue(\"j\")).Build(t)).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"JArgument\")).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(testutil.NewMessageBuilder(\"GetRequest\").Build(t)).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetResponse\").\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"hname\",\n\t\t\t\t\tresolver.StringType,\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(testutil.NewNameReferenceValueBuilder(ref.Type(t, \"org.federation\", \"H\"), resolver.StringType, \"h.name\").Build(t)).Build(t),\n\t\t\t\t).\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"jname\",\n\t\t\t\t\tresolver.StringType,\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(testutil.NewNameReferenceValueBuilder(ref.Type(t, \"org.federation\", \"J\"), resolver.StringType, \"j.name\").Build(t)).Build(t),\n\t\t\t\t).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"a\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"A\")).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"b\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"B\")).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"c\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"C\")).\n\t\t\t\t\t\t\t\t\t\tSetArgs(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageDependencyArgumentBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"a\", testutil.NewNameReferenceValueBuilder(ref.Type(t, \"org.federation\", \"A\"), resolver.StringType, \"a.name\").Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"d\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"D\")).\n\t\t\t\t\t\t\t\t\t\tSetArgs(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageDependencyArgumentBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"b\", testutil.NewNameReferenceValueBuilder(ref.Type(t, \"org.federation\", \"B\"), resolver.StringType, \"b.name\").Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"e\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"E\")).\n\t\t\t\t\t\t\t\t\t\tSetArgs(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageDependencyArgumentBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"c\", testutil.NewNameReferenceValueBuilder(ref.Type(t, \"org.federation\", \"C\"), resolver.StringType, \"c.name\").Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"d\", testutil.NewNameReferenceValueBuilder(ref.Type(t, \"org.federation\", \"D\"), resolver.StringType, \"d.name\").Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"f\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"F\")).\n\t\t\t\t\t\t\t\t\t\tSetArgs(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageDependencyArgumentBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"c\", testutil.NewNameReferenceValueBuilder(ref.Type(t, \"org.federation\", \"C\"), resolver.StringType, \"c.name\").Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"d\", testutil.NewNameReferenceValueBuilder(ref.Type(t, \"org.federation\", \"D\"), resolver.StringType, \"d.name\").Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"g\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"G\")).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"h\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"H\")).\n\t\t\t\t\t\t\t\t\t\tSetArgs(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageDependencyArgumentBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"e\", testutil.NewNameReferenceValueBuilder(ref.Type(t, \"org.federation\", \"E\"), resolver.StringType, \"e.name\").Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"f\", testutil.NewNameReferenceValueBuilder(ref.Type(t, \"org.federation\", \"F\"), resolver.StringType, \"f.name\").Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"g\", testutil.NewNameReferenceValueBuilder(ref.Type(t, \"org.federation\", \"G\"), resolver.StringType, \"g.name\").Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"i\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"I\")).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"j\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"J\")).\n\t\t\t\t\t\t\t\t\t\tSetArgs(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageDependencyArgumentBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"i\", testutil.NewNameReferenceValueBuilder(ref.Type(t, \"org.federation\", \"I\"), resolver.StringType, \"i.name\").Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"GetResponseArgument\")).\n\t\t\t\t\t\tSetDependencyGraph(\n\t\t\t\t\t\t\ttestutil.NewDependencyGraphBuilder().\n\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.federation\", \"A\")).\n\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.federation\", \"B\")).\n\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.federation\", \"G\")).\n\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.federation\", \"I\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinitionGroup(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\tAddStart(\n\t\t\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\t\t\tAddStart(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAddStart(testutil.NewVariableDefinitionGroupByName(\"a\")).\n\t\t\t\t\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"c\")).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tAddStart(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAddStart(testutil.NewVariableDefinitionGroupByName(\"b\")).\n\t\t\t\t\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"d\")).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"e\")).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tAddStart(\n\t\t\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\t\t\tAddStart(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAddStart(testutil.NewVariableDefinitionGroupByName(\"a\")).\n\t\t\t\t\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"c\")).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tAddStart(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAddStart(testutil.NewVariableDefinitionGroupByName(\"b\")).\n\t\t\t\t\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"d\")).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"f\")).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tAddStart(testutil.NewVariableDefinitionGroupByName(\"g\")).\n\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"h\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinitionGroup(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\tAddStart(testutil.NewVariableDefinitionGroupByName(\"i\")).\n\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"j\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddService(\n\t\t\ttestutil.NewServiceBuilder(\"FederationService\").\n\t\t\t\tAddMethod(\"Get\", ref.Message(t, \"org.federation\", \"GetRequest\"), ref.Message(t, \"org.federation\", \"GetResponse\"), nil).\n\t\t\t\tSetRule(testutil.NewServiceRuleBuilder().Build(t)).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"A\"), ref.Message(t, \"org.federation\", \"AArgument\")).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"AA\"), ref.Message(t, \"org.federation\", \"AAArgument\")).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"AB\"), ref.Message(t, \"org.federation\", \"ABArgument\")).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"B\"), ref.Message(t, \"org.federation\", \"BArgument\")).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"C\"), ref.Message(t, \"org.federation\", \"CArgument\")).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"D\"), ref.Message(t, \"org.federation\", \"DArgument\")).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"E\"), ref.Message(t, \"org.federation\", \"EArgument\")).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"F\"), ref.Message(t, \"org.federation\", \"FArgument\")).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"G\"), ref.Message(t, \"org.federation\", \"GArgument\")).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"GetResponse\"), ref.Message(t, \"org.federation\", \"GetResponseArgument\")).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"H\"), ref.Message(t, \"org.federation\", \"HArgument\")).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"I\"), ref.Message(t, \"org.federation\", \"IArgument\")).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"J\"), ref.Message(t, \"org.federation\", \"JArgument\")).\n\t\t\t\tBuild(t),\n\t\t)\n\n\tfederationFile := fb.Build(t)\n\tservice := federationFile.Services[0]\n\tif diff := cmp.Diff(result.Files[0].Services[0], service, testutil.ResolverCmpOpts()...); diff != \"\" {\n\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t}\n}\n\nfunc TestAlias(t *testing.T) {\n\tt.Parallel()\n\ttestdataDir := filepath.Join(testutil.RepoRoot(), \"testdata\")\n\tfileName := filepath.Join(testdataDir, \"alias.proto\")\n\tr := resolver.New(testutil.Compile(t, fileName), resolver.ImportPathOption(testdataDir))\n\tresult, err := r.Resolve()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif len(result.Files) != 1 {\n\t\tt.Fatalf(\"failed to get files. expected 1 but got %d\", len(result.Files))\n\t}\n\tif len(result.Files[0].Services) != 1 {\n\t\tt.Fatalf(\"failed to get services. expected 1 but got %d\", len(result.Files[0].Services))\n\t}\n\n\tfb := testutil.NewFileBuilder(fileName)\n\tref := testutil.NewBuilderReferenceManager(getNestedPostProtoBuilder(t), fb)\n\n\tfb.SetPackage(\"org.federation\").\n\t\tSetGoPackage(\"example/federation\", \"federation\").\n\t\tAddEnum(\n\t\t\ttestutil.NewEnumBuilder(\"PostType\").\n\t\t\t\tSetAlias(ref.Enum(t, \"org.post\", \"PostDataType\")).\n\t\t\t\tAddValueWithDefault(\"POST_TYPE_UNKNOWN\").\n\t\t\t\tAddValueWithAlias(\n\t\t\t\t\t\"POST_TYPE_FOO\",\n\t\t\t\t\tref.EnumValue(t, \"org.post\", \"PostDataType\", \"POST_TYPE_A\"),\n\t\t\t\t).\n\t\t\t\tAddValueWithAlias(\n\t\t\t\t\t\"POST_TYPE_BAR\",\n\t\t\t\t\tref.EnumValue(t, \"org.post\", \"PostDataType\", \"POST_TYPE_B\"),\n\t\t\t\t\tref.EnumValue(t, \"org.post\", \"PostDataType\", \"POST_TYPE_C\"),\n\t\t\t\t).\n\t\t\t\tAddValueWithNoAlias(\"POST_TYPE_BAZ\").\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"PostContent\").\n\t\t\t\tAddEnum(\n\t\t\t\t\ttestutil.NewEnumBuilder(\"Category\").\n\t\t\t\t\t\tSetAlias(ref.Enum(t, \"org.post\", \"PostContent.Category\")).\n\t\t\t\t\t\tAddValueWithAlias(\"CATEGORY_A\", ref.EnumValue(t, \"org.post\", \"PostContent.Category\", \"CATEGORY_A\")).\n\t\t\t\t\t\tAddValueWithAlias(\"CATEGORY_B\", ref.EnumValue(t, \"org.post\", \"PostContent.Category\", \"CATEGORY_B\")).\n\t\t\t\t\t\tAddValueWithNoAlias(\"CATEGORY_C\").\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tAddMessage(\n\t\t\t\t\ttestutil.NewMessageBuilder(\"CountsEntry\").\n\t\t\t\t\t\tSetIsMapEntry(true).\n\t\t\t\t\t\tAddField(\"key\", resolver.Int32Type).\n\t\t\t\t\t\tAddField(\"value\", resolver.Int32Type).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tAddMessage(\n\t\t\t\t\ttestutil.NewMessageBuilder(\"CastCountsEntry\").\n\t\t\t\t\t\tSetIsMapEntry(true).\n\t\t\t\t\t\tAddField(\"key\", resolver.Int32Type).\n\t\t\t\t\t\tAddField(\"value\", resolver.Int32Type).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tAddFieldWithTypeNameAndAlias(t, \"category\", \"Category\", false, ref.Field(t, \"org.post\", \"PostContent\", \"category\")).\n\t\t\t\tAddFieldWithAlias(\"head\", resolver.StringType, ref.Field(t, \"org.post\", \"PostContent\", \"head\")).\n\t\t\t\tAddFieldWithAlias(\"body\", resolver.StringType, ref.Field(t, \"org.post\", \"PostContent\", \"body\")).\n\t\t\t\tAddFieldWithAlias(\"dup_body\", resolver.StringType, ref.Field(t, \"org.post\", \"PostContent\", \"body\")).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tSetAlias(ref.Message(t, \"org.post\", \"PostContent\")).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tAddFieldWithTypeNameAndAlias(t, \"counts\", \"CountsEntry\", false, ref.Field(t, \"org.post\", \"PostContent\", \"counts\")).\n\t\t\t\tAddFieldWithTypeNameAndAlias(t, \"cast_counts\", \"CastCountsEntry\", false, ref.Field(t, \"org.post\", \"PostContent\", \"cast_counts\")).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"PostData\").\n\t\t\t\tAddFieldWithAlias(\"type\", ref.Type(t, \"org.federation\", \"PostType\"), ref.Field(t, \"org.post\", \"PostData\", \"type\")).\n\t\t\t\tAddFieldWithAlias(\"title\", resolver.StringType, ref.Field(t, \"org.post\", \"PostData\", \"title\")).\n\t\t\t\tAddFieldWithAlias(\"content\", ref.Type(t, \"org.federation\", \"PostContent\"), ref.Field(t, \"org.post\", \"PostData\", \"content\")).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tSetAlias(ref.Message(t, \"org.post\", \"PostData\")).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostRequest\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tAddMessage(\n\t\t\t\t\ttestutil.NewMessageBuilder(\"ConditionA\").\n\t\t\t\t\t\tAddFieldWithAlias(\"prop\", resolver.StringType, ref.Field(t, \"org.post\", \"PostConditionA\", \"prop\")).\n\t\t\t\t\t\tSetRule(\n\t\t\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\t\t\tSetAlias(ref.Message(t, \"org.post\", \"PostConditionA\")).\n\t\t\t\t\t\t\t\tSetMessageArgument(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageBuilder(\"GetPostRequest_ConditionAArgument\").\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tAddMessage(\n\t\t\t\t\ttestutil.NewMessageBuilder(\"ConditionB\").\n\t\t\t\t\t\tSetRule(\n\t\t\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\t\t\tSetAlias(ref.Message(t, \"org.post\", \"PostConditionB\")).\n\t\t\t\t\t\t\t\tSetMessageArgument(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageBuilder(\"GetPostRequest_ConditionBArgument\").\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tAddFieldWithTypeName(t, \"a\", \"ConditionA\", false).\n\t\t\t\tAddFieldWithTypeName(t, \"b\", \"ConditionB\", false).\n\t\t\t\tAddOneof(testutil.NewOneofBuilder(\"condition\").AddFieldNames(\"a\", \"b\").Build(t)).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"PostArgument\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tAddField(\"a\", ref.Type(t, \"org.federation\", \"GetPostRequest.ConditionA\")).\n\t\t\t\tAddField(\"b\", ref.Type(t, \"org.federation\", \"GetPostRequest.ConditionB\")).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"Post\").\n\t\t\t\tAddFieldWithAutoBind(\"id\", resolver.StringType, ref.Field(t, \"org.post\", \"Post\", \"id\")).\n\t\t\t\tAddFieldWithAutoBind(\"data\", ref.Type(t, \"org.federation\", \"PostData\"), ref.Field(t, \"org.post\", \"Post\", \"data\")).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"res\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetCall(\n\t\t\t\t\t\t\t\t\ttestutil.NewCallExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMethod(ref.Method(t, \"org.post\", \"PostService\", \"GetPost\")).\n\t\t\t\t\t\t\t\t\t\tSetRequest(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewRequestBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAddField(\"id\", resolver.StringType, testutil.NewMessageArgumentValueBuilder(resolver.StringType, resolver.StringType, \"id\").Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\tAddFieldWithIf(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"a\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tref.Type(t, \"org.post\", \"PostConditionA\"),\n\t\t\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageArgumentValueBuilder(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tref.Type(t, \"org.federation\", \"GetPostRequest.ConditionA\"),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tref.Type(t, \"org.federation\", \"GetPostRequest.ConditionA\"),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"a\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t).Build(t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"$.a != null\",\n\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\tAddFieldWithIf(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"b\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tref.Type(t, \"org.post\", \"PostConditionB\"),\n\t\t\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageArgumentValueBuilder(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tref.Type(t, \"org.federation\", \"GetPostRequest.ConditionB\"),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tref.Type(t, \"org.federation\", \"GetPostRequest.ConditionB\"),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"b\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t).Build(t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"$.b != null\",\n\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"post\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetAutoBind(true).\n\t\t\t\t\t\t\t\tSetBy(testutil.NewCELValueBuilder(\"res.post\", ref.Type(t, \"org.post\", \"Post\")).Build(t)).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"PostArgument\")).\n\t\t\t\t\t\tSetDependencyGraph(\n\t\t\t\t\t\t\ttestutil.NewDependencyGraphBuilder().\n\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.post\", \"GetPostResponse\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinitionGroup(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\tAddStart(testutil.NewVariableDefinitionGroupByName(\"res\")).\n\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"post\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostResponseArgument\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tAddFieldWithOneof(\"a\", ref.Type(t, \"org.federation\", \"GetPostRequest.ConditionA\"), testutil.NewOneofBuilder(\"condition\").Build(t)).\n\t\t\t\tAddFieldWithOneof(\"b\", ref.Type(t, \"org.federation\", \"GetPostRequest.ConditionB\"), testutil.NewOneofBuilder(\"condition\").Build(t)).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostResponse\").\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"post\",\n\t\t\t\t\tref.Type(t, \"org.federation\", \"Post\"),\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(\n\t\t\t\t\t\ttestutil.NewNameReferenceValueBuilder(ref.Type(t, \"org.federation\", \"Post\"), ref.Type(t, \"org.federation\", \"Post\"), \"post\").\n\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t).Build(t),\n\t\t\t\t).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"post\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"Post\")).\n\t\t\t\t\t\t\t\t\t\tSetArgs(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageDependencyArgumentBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"id\", testutil.NewMessageArgumentValueBuilder(resolver.StringType, resolver.StringType, \"id\").Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"a\", testutil.NewMessageArgumentValueBuilder(ref.Type(t, \"org.post\", \"PostConditionA\"), ref.Type(t, \"org.post\", \"PostConditionA\"), \"a\").Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"b\", testutil.NewMessageArgumentValueBuilder(ref.Type(t, \"org.post\", \"PostConditionB\"), ref.Type(t, \"org.post\", \"PostConditionB\"), \"b\").Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"GetPostResponseArgument\")).\n\t\t\t\t\t\tSetDependencyGraph(\n\t\t\t\t\t\t\ttestutil.NewDependencyGraphBuilder().\n\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.federation\", \"Post\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinitionGroup(testutil.NewVariableDefinitionGroupByName(\"post\")).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddService(\n\t\t\ttestutil.NewServiceBuilder(\"FederationService\").\n\t\t\t\tAddMethod(\"GetPost\", ref.Message(t, \"org.federation\", \"GetPostRequest\"), ref.Message(t, \"org.federation\", \"GetPostResponse\"), nil).\n\t\t\t\tSetRule(testutil.NewServiceRuleBuilder().Build(t)).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"GetPostResponse\"), ref.Message(t, \"org.federation\", \"GetPostResponseArgument\")).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"Post\"), ref.Message(t, \"org.federation\", \"PostArgument\")).\n\t\t\t\tBuild(t),\n\t\t)\n\tfederationFile := fb.Build(t)\n\tfederationService := federationFile.Services[0]\n\n\tif diff := cmp.Diff(result.Files[0].Services[0], federationService, testutil.ResolverCmpOpts()...); diff != \"\" {\n\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t}\n}\n\nfunc TestAutobind(t *testing.T) {\n\tt.Parallel()\n\ttestdataDir := filepath.Join(testutil.RepoRoot(), \"testdata\")\n\tfileName := filepath.Join(testdataDir, \"autobind.proto\")\n\tr := resolver.New(testutil.Compile(t, fileName), resolver.ImportPathOption(testdataDir))\n\tresult, err := r.Resolve()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif len(result.Files) != 1 {\n\t\tt.Fatalf(\"failed to get files. expected 1 but got %d\", len(result.Files))\n\t}\n\tif len(result.Files[0].Services) != 1 {\n\t\tt.Fatalf(\"failed to get services. expected 1 but got %d\", len(result.Files[0].Services))\n\t}\n\n\tfb := testutil.NewFileBuilder(fileName)\n\tref := testutil.NewBuilderReferenceManager(getPostProtoBuilder(t), fb)\n\n\tfb.SetPackage(\"org.federation\").\n\t\tSetGoPackage(\"example/federation\", \"federation\").\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"UserArgument\").\n\t\t\t\tAddField(\"user_id\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"User\").\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"uid\",\n\t\t\t\t\tresolver.StringType,\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(\n\t\t\t\t\t\ttestutil.NewMessageArgumentValueBuilder(resolver.StringType, resolver.StringType, \"user_id\").Build(t),\n\t\t\t\t\t).Build(t),\n\t\t\t\t).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"UserArgument\")).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"PostArgument\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"Post\").\n\t\t\t\tAddFieldWithAutoBind(\"id\", resolver.StringType, ref.Field(t, \"org.post\", \"Post\", \"id\")).\n\t\t\t\tAddFieldWithAutoBind(\"title\", resolver.StringType, ref.Field(t, \"org.post\", \"Post\", \"title\")).\n\t\t\t\tAddFieldWithAutoBind(\"content\", resolver.StringType, ref.Field(t, \"org.post\", \"Post\", \"content\")).\n\t\t\t\tAddFieldWithAutoBind(\"uid\", resolver.StringType, ref.Field(t, \"org.federation\", \"User\", \"uid\")).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"res\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetCall(\n\t\t\t\t\t\t\t\t\ttestutil.NewCallExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMethod(ref.Method(t, \"org.post\", \"PostService\", \"GetPost\")).\n\t\t\t\t\t\t\t\t\t\tSetRequest(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewRequestBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAddField(\"id\", resolver.StringType, testutil.NewMessageArgumentValueBuilder(resolver.StringType, resolver.StringType, \"id\").Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"_def1\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetAutoBind(true).\n\t\t\t\t\t\t\t\tSetBy(testutil.NewCELValueBuilder(\"res.post\", ref.Type(t, \"org.post\", \"Post\")).Build(t)).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"_def2\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetAutoBind(true).\n\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"User\")).\n\t\t\t\t\t\t\t\t\t\tSetArgs(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageDependencyArgumentBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"user_id\", newStringValue(\"foo\")).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"PostArgument\")).\n\t\t\t\t\t\tSetDependencyGraph(\n\t\t\t\t\t\t\ttestutil.NewDependencyGraphBuilder().\n\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.federation\", \"User\")).\n\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.post\", \"GetPostResponse\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinitionGroup(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\tAddStart(testutil.NewVariableDefinitionGroupByName(\"res\")).\n\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"_def1\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinitionGroup(testutil.NewVariableDefinitionGroupByName(\"_def2\")).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostRequest\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostResponseArgument\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostResponse\").\n\t\t\t\tAddFieldWithAutoBind(\"id\", resolver.StringType, ref.Field(t, \"org.federation\", \"Post\", \"id\")).\n\t\t\t\tAddFieldWithAutoBind(\"title\", resolver.StringType, ref.Field(t, \"org.federation\", \"Post\", \"title\")).\n\t\t\t\tAddFieldWithAutoBind(\"content\", resolver.StringType, ref.Field(t, \"org.federation\", \"Post\", \"content\")).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"_def0\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetAutoBind(true).\n\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"Post\")).\n\t\t\t\t\t\t\t\t\t\tSetArgs(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageDependencyArgumentBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"id\", testutil.NewMessageArgumentValueBuilder(resolver.StringType, resolver.StringType, \"id\").Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"GetPostResponseArgument\")).\n\t\t\t\t\t\tSetDependencyGraph(\n\t\t\t\t\t\t\ttestutil.NewDependencyGraphBuilder().\n\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.federation\", \"Post\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinitionGroup(testutil.NewVariableDefinitionGroupByName(\"_def0\")).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddService(\n\t\t\ttestutil.NewServiceBuilder(\"FederationService\").\n\t\t\t\tAddMethod(\"GetPost\", ref.Message(t, \"org.federation\", \"GetPostRequest\"), ref.Message(t, \"org.federation\", \"GetPostResponse\"), nil).\n\t\t\t\tSetRule(testutil.NewServiceRuleBuilder().Build(t)).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"GetPostResponse\"), ref.Message(t, \"org.federation\", \"GetPostResponseArgument\")).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"Post\"), ref.Message(t, \"org.federation\", \"PostArgument\")).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"User\"), ref.Message(t, \"org.federation\", \"UserArgument\")).\n\t\t\t\tBuild(t),\n\t\t)\n\tfederationFile := fb.Build(t)\n\tfederationService := federationFile.Services[0]\n\n\tif diff := cmp.Diff(result.Files[0].Services[0], federationService, testutil.ResolverCmpOpts()...); diff != \"\" {\n\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t}\n}\n\nfunc TestMultiUser(t *testing.T) {\n\tt.Parallel()\n\ttestdataDir := filepath.Join(testutil.RepoRoot(), \"testdata\")\n\tfileName := filepath.Join(testdataDir, \"multi_user.proto\")\n\tfb := testutil.NewFileBuilder(fileName)\n\tref := testutil.NewBuilderReferenceManager(getUserProtoBuilder(t), fb)\n\n\tfb.SetPackage(\"org.federation\").\n\t\tSetGoPackage(\"example/federation\", \"federation\").\n\t\tAddMessage(testutil.NewMessageBuilder(\"SubArgument\").Build(t)).\n\t\tAddMessage(testutil.NewMessageBuilder(\"UserIDArgument\").Build(t)).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"Sub\").\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"SubArgument\")).\n\t\t\t\t\t\tSetCustomResolver(true).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"UserID\").\n\t\t\t\tAddFieldWithRule(\"value\", resolver.StringType, testutil.NewFieldRuleBuilder(newStringValue(\"xxx\")).Build(t)).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"UserIDArgument\")).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"_def0\").\n\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"Sub\")).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tSetDependencyGraph(\n\t\t\t\t\t\t\ttestutil.NewDependencyGraphBuilder().\n\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.federation\", \"Sub\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinitionGroup(testutil.NewVariableDefinitionGroupByName(\"_def0\")).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"UserArgument\").\n\t\t\t\tAddField(\"user_id\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"User\").\n\t\t\t\tAddFieldWithAutoBind(\"id\", resolver.StringType, ref.Field(t, \"org.user\", \"User\", \"id\")).\n\t\t\t\tAddFieldWithRule(\"name\", resolver.StringType, testutil.NewFieldRuleBuilder(nil).SetCustomResolver(true).Build(t)).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"res\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetCall(\n\t\t\t\t\t\t\t\t\ttestutil.NewCallExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMethod(ref.Method(t, \"org.user\", \"UserService\", \"GetUser\")).\n\t\t\t\t\t\t\t\t\t\tSetRequest(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewRequestBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAddField(\"id\", resolver.StringType, testutil.NewMessageArgumentValueBuilder(resolver.StringType, resolver.StringType, \"user_id\").Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"user\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetAutoBind(true).\n\t\t\t\t\t\t\t\tSetBy(testutil.NewCELValueBuilder(\"res.user\", ref.Type(t, \"org.user\", \"User\")).Build(t)).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"_def2\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"Sub\")).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"UserArgument\")).\n\t\t\t\t\t\tSetDependencyGraph(\n\t\t\t\t\t\t\ttestutil.NewDependencyGraphBuilder().\n\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.federation\", \"Sub\")).\n\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.user\", \"GetUserResponse\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinitionGroup(testutil.NewVariableDefinitionGroupByName(\"_def2\")).\n\t\t\t\t\t\tAddVariableDefinitionGroup(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\tAddStart(testutil.NewVariableDefinitionGroupByName(\"res\")).\n\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"user\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(testutil.NewMessageBuilder(\"GetRequest\").Build(t)).\n\t\tAddMessage(testutil.NewMessageBuilder(\"GetResponseArgument\").Build(t)).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetResponse\").\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"user\",\n\t\t\t\t\tref.Type(t, \"org.federation\", \"User\"),\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(\n\t\t\t\t\t\ttestutil.NewNameReferenceValueBuilder(\n\t\t\t\t\t\t\tref.Type(t, \"org.federation\", \"User\"),\n\t\t\t\t\t\t\tref.Type(t, \"org.federation\", \"User\"),\n\t\t\t\t\t\t\t\"user\",\n\t\t\t\t\t\t).Build(t),\n\t\t\t\t\t).Build(t),\n\t\t\t\t).\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"user2\",\n\t\t\t\t\tref.Type(t, \"org.federation\", \"User\"),\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(\n\t\t\t\t\t\ttestutil.NewNameReferenceValueBuilder(\n\t\t\t\t\t\t\tref.Type(t, \"org.federation\", \"User\"),\n\t\t\t\t\t\t\tref.Type(t, \"org.federation\", \"User\"),\n\t\t\t\t\t\t\t\"user2\",\n\t\t\t\t\t\t).Build(t),\n\t\t\t\t\t).Build(t),\n\t\t\t\t).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"uid\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"UserID\")).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"user\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"User\")).\n\t\t\t\t\t\t\t\t\t\tSetArgs(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageDependencyArgumentBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"user_id\", newStringValue(\"1\")).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"user2\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"User\")).\n\t\t\t\t\t\t\t\t\t\tSetArgs(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageDependencyArgumentBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"user_id\", newStringValue(\"2\")).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"GetResponseArgument\")).\n\t\t\t\t\t\tSetDependencyGraph(\n\t\t\t\t\t\t\ttestutil.NewDependencyGraphBuilder().\n\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.federation\", \"UserID\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinitionGroup(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\tAddStart(testutil.NewVariableDefinitionGroupByName(\"uid\")).\n\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"user\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinitionGroup(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\tAddStart(testutil.NewVariableDefinitionGroupByName(\"uid\")).\n\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"user2\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddService(\n\t\t\ttestutil.NewServiceBuilder(\"FederationService\").\n\t\t\t\tAddMethod(\"Get\", ref.Message(t, \"org.federation\", \"GetRequest\"), ref.Message(t, \"org.federation\", \"GetResponse\"), nil).\n\t\t\t\tSetRule(testutil.NewServiceRuleBuilder().Build(t)).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"GetResponse\"), ref.Message(t, \"org.federation\", \"GetResponseArgument\")).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"Sub\"), ref.Message(t, \"org.federation\", \"SubArgument\")).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"User\"), ref.Message(t, \"org.federation\", \"UserArgument\")).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"UserID\"), ref.Message(t, \"org.federation\", \"UserIDArgument\")).\n\t\t\t\tBuild(t),\n\t\t)\n\n\tfederationFile := fb.Build(t)\n\tfederationService := federationFile.Services[0]\n\n\tr := resolver.New(testutil.Compile(t, fileName), resolver.ImportPathOption(testdataDir))\n\tresult, err := r.Resolve()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif len(result.Files) != 1 {\n\t\tt.Fatalf(\"failed to get files. expected 1 but got %d\", len(result.Files))\n\t}\n\tif len(result.Files[0].Services) != 1 {\n\t\tt.Fatalf(\"failed to get services. expected 1 but got %d\", len(result.Files[0].Services))\n\t}\n\tif diff := cmp.Diff(result.Files[0].Services[0], federationService, testutil.ResolverCmpOpts()...); diff != \"\" {\n\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t}\n}\n\nfunc TestOneof(t *testing.T) {\n\tt.Parallel()\n\ttestdataDir := filepath.Join(testutil.RepoRoot(), \"testdata\")\n\tfileName := filepath.Join(testdataDir, \"oneof.proto\")\n\tfb := testutil.NewFileBuilder(fileName)\n\tref := testutil.NewBuilderReferenceManager(getUserProtoBuilder(t), fb)\n\n\tfb.SetPackage(\"org.federation\").\n\t\tSetGoPackage(\"example/federation\", \"federation\").\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"UserArgument\").\n\t\t\t\tAddField(\"user_id\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(testutil.NewMessageBuilder(\"MArgument\").Build(t)).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"UserSelectionArgument\").\n\t\t\t\tAddField(\"value\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"M\").\n\t\t\t\tAddFieldWithRule(\"value\", resolver.StringType, testutil.NewFieldRuleBuilder(newStringValue(\"foo\")).Build(t)).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"MArgument\")).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"User\").\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"id\",\n\t\t\t\t\tresolver.StringType,\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(testutil.NewMessageArgumentValueBuilder(resolver.StringType, resolver.StringType, \"user_id\").Build(t)).Build(t),\n\t\t\t\t).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"_def0\").\n\t\t\t\t\t\t\t\tSetCall(\n\t\t\t\t\t\t\t\t\ttestutil.NewCallExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMethod(ref.Method(t, \"org.user\", \"UserService\", \"GetUser\")).\n\t\t\t\t\t\t\t\t\t\tSetRequest(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewRequestBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAddField(\"id\", resolver.StringType, resolver.NewByValue(\"$.user_id\", resolver.StringType)).\n\t\t\t\t\t\t\t\t\t\t\t\tAddFieldWithIf(\"foo\", resolver.Int64Type, resolver.NewByValue(\"1\", resolver.Int64Type), \"false\").\n\t\t\t\t\t\t\t\t\t\t\t\tAddFieldWithIf(\"bar\", resolver.StringType, resolver.NewByValue(\"'hello'\", resolver.StringType), \"true\").\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"UserArgument\")).\n\t\t\t\t\t\tSetDependencyGraph(\n\t\t\t\t\t\t\ttestutil.NewDependencyGraphBuilder().\n\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.user\", \"GetUserResponse\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinitionGroup(testutil.NewVariableDefinitionGroupByName(\"_def0\")).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"UserSelection\").\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"user_a\",\n\t\t\t\t\tref.Type(t, \"org.federation\", \"User\"),\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(nil).\n\t\t\t\t\t\tSetOneof(\n\t\t\t\t\t\t\ttestutil.NewFieldOneofRuleBuilder().\n\t\t\t\t\t\t\t\tSetIf(\"m.value == $.value\", resolver.BoolType).\n\t\t\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\t\t\tSetName(\"ua\").\n\t\t\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"User\")).\n\t\t\t\t\t\t\t\t\t\t\t\tSetArgs(testutil.NewMessageDependencyArgumentBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"user_id\", newStringValue(\"a\")).\n\t\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tSetBy(\"ua\", ref.Type(t, \"org.federation\", \"User\")).\n\t\t\t\t\t\t\t\tSetDependencyGraph(\n\t\t\t\t\t\t\t\t\ttestutil.NewDependencyGraphBuilder().\n\t\t\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.federation\", \"User\")).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tAddVariableDefinitionGroup(testutil.NewVariableDefinitionGroupByName(\"ua\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"user_b\",\n\t\t\t\t\tref.Type(t, \"org.federation\", \"User\"),\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(nil).\n\t\t\t\t\t\tSetOneof(\n\t\t\t\t\t\t\ttestutil.NewFieldOneofRuleBuilder().\n\t\t\t\t\t\t\t\tSetIf(\"m.value != $.value\", resolver.BoolType).\n\t\t\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\t\t\tSetName(\"ub\").\n\t\t\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"User\")).\n\t\t\t\t\t\t\t\t\t\t\t\tSetArgs(testutil.NewMessageDependencyArgumentBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"user_id\", newStringValue(\"b\")).\n\t\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tSetBy(\"ub\", ref.Type(t, \"org.federation\", \"User\")).\n\t\t\t\t\t\t\t\tSetDependencyGraph(\n\t\t\t\t\t\t\t\t\ttestutil.NewDependencyGraphBuilder().\n\t\t\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.federation\", \"User\")).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tAddVariableDefinitionGroup(testutil.NewVariableDefinitionGroupByName(\"ub\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"user_c\",\n\t\t\t\t\tref.Type(t, \"org.federation\", \"User\"),\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(nil).\n\t\t\t\t\t\tSetOneof(\n\t\t\t\t\t\t\ttestutil.NewFieldOneofRuleBuilder().\n\t\t\t\t\t\t\t\tSetDefault(true).\n\t\t\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\t\t\tSetName(\"uc\").\n\t\t\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"User\")).\n\t\t\t\t\t\t\t\t\t\t\t\tSetArgs(testutil.NewMessageDependencyArgumentBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"user_id\", newStringValue(\"c\")).\n\t\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tSetBy(\"uc\", ref.Type(t, \"org.federation\", \"User\")).\n\t\t\t\t\t\t\t\tSetDependencyGraph(\n\t\t\t\t\t\t\t\t\ttestutil.NewDependencyGraphBuilder().\n\t\t\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.federation\", \"User\")).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tAddVariableDefinitionGroup(testutil.NewVariableDefinitionGroupByName(\"uc\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tAddOneof(testutil.NewOneofBuilder(\"user\").AddFieldNames(\"user_a\", \"user_b\", \"user_c\").Build(t)).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"m\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"M\")).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"UserSelectionArgument\")).\n\t\t\t\t\t\tSetDependencyGraph(\n\t\t\t\t\t\t\ttestutil.NewDependencyGraphBuilder().\n\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.federation\", \"M\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinitionGroup(testutil.NewVariableDefinitionGroupByName(\"m\")).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(testutil.NewMessageBuilder(\"GetRequest\").Build(t)).\n\t\tAddMessage(testutil.NewMessageBuilder(\"GetResponseArgument\").Build(t)).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetResponse\").\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"user\",\n\t\t\t\t\tref.Type(t, \"org.federation\", \"User\"),\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(\n\t\t\t\t\t\ttestutil.NewNameReferenceValueBuilder(\n\t\t\t\t\t\t\tref.Type(t, \"org.federation\", \"User\"),\n\t\t\t\t\t\t\tref.Type(t, \"org.federation\", \"User\"),\n\t\t\t\t\t\t\t\"sel.user\",\n\t\t\t\t\t\t).Build(t),\n\t\t\t\t\t).Build(t),\n\t\t\t\t).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"sel\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"UserSelection\")).\n\t\t\t\t\t\t\t\t\t\tSetArgs(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageDependencyArgumentBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"value\", newStringValue(\"foo\")).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"GetResponseArgument\")).\n\t\t\t\t\t\tSetDependencyGraph(\n\t\t\t\t\t\t\ttestutil.NewDependencyGraphBuilder().\n\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.federation\", \"UserSelection\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinitionGroup(testutil.NewVariableDefinitionGroupByName(\"sel\")).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddService(\n\t\t\ttestutil.NewServiceBuilder(\"FederationService\").\n\t\t\t\tAddMethod(\"Get\", ref.Message(t, \"org.federation\", \"GetRequest\"), ref.Message(t, \"org.federation\", \"GetResponse\"), nil).\n\t\t\t\tSetRule(testutil.NewServiceRuleBuilder().Build(t)).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"GetResponse\"), ref.Message(t, \"org.federation\", \"GetResponseArgument\")).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"M\"), ref.Message(t, \"org.federation\", \"MArgument\")).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"User\"), ref.Message(t, \"org.federation\", \"UserArgument\")).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"UserSelection\"), ref.Message(t, \"org.federation\", \"UserSelectionArgument\")).\n\t\t\t\tBuild(t),\n\t\t)\n\n\tfederationFile := fb.Build(t)\n\tfederationService := federationFile.Services[0]\n\n\tr := resolver.New(testutil.Compile(t, fileName), resolver.ImportPathOption(testdataDir))\n\tresult, err := r.Resolve()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif len(result.Files) != 1 {\n\t\tt.Fatalf(\"failed to get files. expected 1 but got %d\", len(result.Files))\n\t}\n\tif len(result.Files[0].Services) != 1 {\n\t\tt.Fatalf(\"failed to get services. expected 1 but got %d\", len(result.Files[0].Services))\n\t}\n\tif diff := cmp.Diff(result.Files[0].Services[0], federationService, testutil.ResolverCmpOpts()...); diff != \"\" {\n\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t}\n}\n\nfunc TestValidation(t *testing.T) {\n\tt.Parallel()\n\tfileName := filepath.Join(testutil.RepoRoot(), \"testdata\", \"validation.proto\")\n\tr := resolver.New(testutil.Compile(t, fileName))\n\tresult, err := r.Resolve()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif len(result.Files) != 1 {\n\t\tt.Fatalf(\"failed to get files. expected 1 but got %d\", len(result.Files))\n\t}\n\tif len(result.Files[0].Services) != 1 {\n\t\tt.Fatalf(\"failed to get services. expected 1 but got %d\", len(result.Files[0].Services))\n\t}\n\n\tfb := testutil.NewFileBuilder(fileName)\n\tref := testutil.NewBuilderReferenceManager(fb)\n\n\tfb.SetPackage(\"org.federation\").\n\t\tSetGoPackage(\"example/federation\", \"federation\").\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"PostArgument\").Build(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"Post\").\n\t\t\t\tAddFieldWithRule(\"id\", resolver.StringType, testutil.NewFieldRuleBuilder(newStringValue(\"some-id\")).Build(t)).\n\t\t\t\tAddFieldWithRule(\"title\", resolver.StringType, testutil.NewFieldRuleBuilder(newStringValue(\"some-title\")).Build(t)).\n\t\t\t\tAddFieldWithRule(\"content\", resolver.StringType, testutil.NewFieldRuleBuilder(newStringValue(\"some-content\")).Build(t)).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().SetMessageArgument(ref.Message(t, \"org.federation\", \"PostArgument\")).Build(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"CustomMessageArgument\").\n\t\t\t\tAddField(\"message\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"CustomMessage\").\n\t\t\t\tAddFieldWithRule(\"message\", resolver.StringType, testutil.NewFieldRuleBuilder(&resolver.Value{CEL: testutil.NewCELValueBuilder(\"$.message\", resolver.StringType).Build(t)}).Build(t)).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().SetMessageArgument(ref.Message(t, \"org.federation\", \"CustomMessageArgument\")).Build(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostRequest\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostResponseArgument\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostResponse\").\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"post\",\n\t\t\t\t\tref.Type(t, \"org.federation\", \"Post\"),\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(\n\t\t\t\t\t\ttestutil.NewNameReferenceValueBuilder(\n\t\t\t\t\t\t\tref.Type(t, \"org.federation\", \"Post\"),\n\t\t\t\t\t\t\tref.Type(t, \"org.federation\", \"Post\"),\n\t\t\t\t\t\t\t\"post\",\n\t\t\t\t\t\t).Build(t),\n\t\t\t\t\t).Build(t),\n\t\t\t\t).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"post\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"Post\")).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"_def1\").\n\t\t\t\t\t\t\t\tSetValidation(\n\t\t\t\t\t\t\t\t\ttestutil.NewValidationExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetError(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewGRPCErrorBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetName(\"a\").\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetBy(testutil.NewCELValueBuilder(\"73\", resolver.Int64Type).Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\tSetCode(code.Code_FAILED_PRECONDITION).\n\t\t\t\t\t\t\t\t\t\t\t\tSetMessage(\"'validation message 1'\").\n\t\t\t\t\t\t\t\t\t\t\t\tSetIf(\"post.id != 'some-id'\").\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"_def2\").\n\t\t\t\t\t\t\t\tSetValidation(\n\t\t\t\t\t\t\t\t\ttestutil.NewValidationExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetError(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewGRPCErrorBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tSetLogLevel(slog.LevelWarn).\n\t\t\t\t\t\t\t\t\t\t\t\tSetCode(code.Code_FAILED_PRECONDITION).\n\t\t\t\t\t\t\t\t\t\t\t\tSetMessage(\"'validation message 2'\").\n\t\t\t\t\t\t\t\t\t\t\t\tAddDetail(\n\t\t\t\t\t\t\t\t\t\t\t\t\ttestutil.NewGRPCErrorDetailBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tAddDef(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetName(\"b\").\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetBy(testutil.NewCELValueBuilder(\"'mackerel'\", resolver.StringType).Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetIf(\"post.title != 'some-title'\").\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tAddMessage(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetName(\"_def2_err_detail0_msg0\").\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"CustomMessage\")).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetArgs(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageDependencyArgumentBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"message\", testutil.NewMessageArgumentValueBuilder(resolver.StringType, resolver.StringType, \"message\").Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tAddMessage(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetName(\"_def2_err_detail0_msg1\").\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetIdx(1).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"CustomMessage\")).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetArgs(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageDependencyArgumentBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"message\", testutil.NewMessageArgumentValueBuilder(resolver.StringType, resolver.StringType, \"message\").Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tAddPreconditionFailure(&resolver.PreconditionFailure{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tViolations: []*resolver.PreconditionFailureViolation{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tType:        testutil.NewCELValueBuilder(\"'some-type'\", resolver.StringType).Build(t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSubject:     testutil.NewCELValueBuilder(\"'some-subject'\", resolver.StringType).Build(t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tDescription: testutil.NewCELValueBuilder(\"'some-description'\", resolver.StringType).Build(t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tAddBadRequest(&resolver.BadRequest{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tFieldViolations: []*resolver.BadRequestFieldViolation{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tField:       testutil.NewCELValueBuilder(\"'some-field'\", resolver.StringType).Build(t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tDescription: testutil.NewCELValueBuilder(\"'some-description'\", resolver.StringType).Build(t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tAddLocalizedMessage(&resolver.LocalizedMessage{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tLocale:  \"en-US\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tMessage: testutil.NewCELValueBuilder(\"'some-message'\", resolver.StringType).Build(t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"GetPostResponseArgument\")).\n\t\t\t\t\t\tSetDependencyGraph(\n\t\t\t\t\t\t\ttestutil.NewDependencyGraphBuilder().\n\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.federation\", \"Post\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinitionGroup(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\tAddStart(\n\t\t\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\t\t\tAddStart(testutil.NewVariableDefinitionGroupByName(\"post\")).\n\t\t\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"_def1\")).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"_def2\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddService(\n\t\t\ttestutil.NewServiceBuilder(\"FederationService\").\n\t\t\t\tAddMethod(\n\t\t\t\t\t\"GetPost\",\n\t\t\t\t\tref.Message(t, \"org.federation\", \"GetPostRequest\"),\n\t\t\t\t\tref.Message(t, \"org.federation\", \"GetPostResponse\"),\n\t\t\t\t\tnil,\n\t\t\t\t).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewServiceRuleBuilder().Build(t),\n\t\t\t\t).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"CustomMessage\"), ref.Message(t, \"org.federation\", \"CustomMessageArgument\")).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"GetPostResponse\"), ref.Message(t, \"org.federation\", \"GetPostResponseArgument\")).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"Post\"), ref.Message(t, \"org.federation\", \"PostArgument\")).\n\t\t\t\tBuild(t),\n\t\t)\n\tfederationFile := fb.Build(t)\n\tservice := federationFile.Services[0]\n\tif diff := cmp.Diff(result.Files[0].Services[0], service, testutil.ResolverCmpOpts()...); diff != \"\" {\n\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t}\n}\n\nfunc TestMap(t *testing.T) {\n\tt.Parallel()\n\ttestdataDir := filepath.Join(testutil.RepoRoot(), \"testdata\")\n\tfileName := filepath.Join(testdataDir, \"map.proto\")\n\tfb := testutil.NewFileBuilder(fileName)\n\tref := testutil.NewBuilderReferenceManager(getUserProtoBuilder(t), getPostProtoBuilder(t), fb)\n\n\tpostItemArg := testutil.NewMessageBuilder(\"Posts_PostItemArgument\").\n\t\tAddField(\"id\", resolver.StringType).\n\t\tBuild(t)\n\n\tpostItem := testutil.NewMessageBuilder(\"PostItem\").\n\t\tAddFieldWithRule(\n\t\t\t\"name\",\n\t\t\tresolver.StringType,\n\t\t\ttestutil.NewFieldRuleBuilder(resolver.NewByValue(\"'item_' + $.id\", resolver.StringType)).Build(t),\n\t\t).SetRule(\n\t\ttestutil.NewMessageRuleBuilder().\n\t\t\tSetMessageArgument(postItemArg).\n\t\t\tBuild(t),\n\t).Build(t)\n\trepeatedPostItemType := resolver.NewMessageType(postItem, true)\n\n\tfb.SetPackage(\"org.federation\").\n\t\tSetGoPackage(\"example/federation\", \"federation\").\n\t\tAddEnum(\n\t\t\ttestutil.NewEnumBuilder(\"UserType\").\n\t\t\t\tSetAlias(ref.Enum(t, \"org.user\", \"UserType\")).\n\t\t\t\tAddValueWithAlias(\"USER_TYPE_1\", ref.EnumValue(t, \"org.user\", \"UserType\", \"USER_TYPE_1\")).\n\t\t\t\tAddValueWithAlias(\"USER_TYPE_2\", ref.EnumValue(t, \"org.user\", \"UserType\", \"USER_TYPE_2\")).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"PostsArgument\").\n\t\t\t\tAddField(\"post_ids\", resolver.StringRepeatedType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(postItemArg).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"UserArgument\").\n\t\t\t\tAddField(\"user_id\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"User\").\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"id\",\n\t\t\t\t\tresolver.StringType,\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(nil).SetMessageCustomResolver(true).Build(t),\n\t\t\t\t).\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"name\",\n\t\t\t\t\tresolver.StringType,\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(nil).SetMessageCustomResolver(true).Build(t),\n\t\t\t\t).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"res\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetCall(\n\t\t\t\t\t\t\t\t\ttestutil.NewCallExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMethod(ref.Method(t, \"org.user\", \"UserService\", \"GetUser\")).\n\t\t\t\t\t\t\t\t\t\tSetRequest(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewRequestBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAddField(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"id\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tresolver.StringType,\n\t\t\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageArgumentValueBuilder(resolver.StringType, resolver.StringType, \"user_id\").Build(t),\n\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"user\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetAutoBind(true).\n\t\t\t\t\t\t\t\tSetBy(testutil.NewCELValueBuilder(\"res.user\", ref.Type(t, \"org.user\", \"User\")).Build(t)).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tSetCustomResolver(true).\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"UserArgument\")).\n\t\t\t\t\t\tAddVariableDefinitionGroup(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\tAddStart(testutil.NewVariableDefinitionGroupByName(\"res\")).\n\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"user\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tSetDependencyGraph(\n\t\t\t\t\t\t\ttestutil.NewDependencyGraphBuilder().\n\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.user\", \"GetUserResponse\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"Posts\").\n\t\t\t\tAddMessage(postItem).\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"ids\",\n\t\t\t\t\tresolver.StringRepeatedType,\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(resolver.NewByValue(\"ids\", resolver.StringRepeatedType)).Build(t),\n\t\t\t\t).\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"titles\",\n\t\t\t\t\tresolver.StringRepeatedType,\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(resolver.NewByValue(\"posts.map(post, post.title)\", resolver.StringRepeatedType)).Build(t),\n\t\t\t\t).\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"contents\",\n\t\t\t\t\tresolver.StringRepeatedType,\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(resolver.NewByValue(\"posts.map(post, post.content)\", resolver.StringRepeatedType)).Build(t),\n\t\t\t\t).\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"users\",\n\t\t\t\t\tref.RepeatedType(t, \"org.federation\", \"User\"),\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(resolver.NewByValue(\"users\", ref.RepeatedType(t, \"org.user\", \"User\"))).Build(t),\n\t\t\t\t).\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"items\",\n\t\t\t\t\trepeatedPostItemType,\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(resolver.NewByValue(\"items\", repeatedPostItemType)).Build(t),\n\t\t\t\t).\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"user_types\",\n\t\t\t\t\tref.RepeatedType(t, \"org.federation\", \"UserType\"),\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(resolver.NewByValue(\"user_types\", ref.RepeatedType(t, \"org.federation\", \"UserType\"))).Build(t),\n\t\t\t\t).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"res\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetCall(\n\t\t\t\t\t\t\t\t\ttestutil.NewCallExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMethod(ref.Method(t, \"org.post\", \"PostService\", \"GetPosts\")).\n\t\t\t\t\t\t\t\t\t\tSetRequest(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewRequestBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAddField(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"ids\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tresolver.StringRepeatedType,\n\t\t\t\t\t\t\t\t\t\t\t\t\tresolver.NewByValue(\"$.post_ids\", resolver.StringRepeatedType),\n\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"posts\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetBy(testutil.NewCELValueBuilder(\"res.posts\", ref.RepeatedType(t, \"org.post\", \"Post\")).Build(t)).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"ids\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetMap(\n\t\t\t\t\t\t\t\t\ttestutil.NewMapExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetIterator(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewIteratorBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tSetName(\"post\").\n\t\t\t\t\t\t\t\t\t\t\t\tSetSource(\"posts\").\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tSetExpr(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMapIteratorExprBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tSetBy(testutil.NewCELValueBuilder(\"post.id\", resolver.StringType).Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"users\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetMap(\n\t\t\t\t\t\t\t\t\ttestutil.NewMapExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetIterator(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewIteratorBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tSetName(\"iter\").\n\t\t\t\t\t\t\t\t\t\t\t\tSetSource(\"posts\").\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tSetExpr(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMapIteratorExprBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"User\")).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetArgs(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageDependencyArgumentBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"user_id\", resolver.NewByValue(\"iter.user_id\", resolver.StringType)).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"items\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetMap(\n\t\t\t\t\t\t\t\t\ttestutil.NewMapExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetIterator(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewIteratorBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tSetName(\"iter\").\n\t\t\t\t\t\t\t\t\t\t\t\tSetSource(\"posts\").\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tSetExpr(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMapIteratorExprBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetMessage(postItem).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetArgs(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageDependencyArgumentBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"id\", resolver.NewByValue(\"iter.id\", resolver.StringType)).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"source_user_types\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetBy(\n\t\t\t\t\t\t\t\t\ttestutil.NewCELValueBuilder(\n\t\t\t\t\t\t\t\t\t\t\"[org.user.UserType.value('USER_TYPE_1'), org.user.UserType.value('USER_TYPE_2')]\",\n\t\t\t\t\t\t\t\t\t\tref.RepeatedType(t, \"org.user\", \"UserType\"),\n\t\t\t\t\t\t\t\t\t).Build(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"user_types\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetMap(\n\t\t\t\t\t\t\t\t\ttestutil.NewMapExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetIterator(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewIteratorBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tSetName(\"typ\").\n\t\t\t\t\t\t\t\t\t\t\t\tSetSource(\"source_user_types\").\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tSetExpr(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMapIteratorExprBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tSetEnum(\n\t\t\t\t\t\t\t\t\t\t\t\t\ttestutil.NewEnumExprBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetEnum(ref.Enum(t, \"org.federation\", \"UserType\")).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetBy(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttestutil.NewCELValueBuilder(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"typ\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tresolver.NewEnumType(ref.Enum(t, \"org.user\", \"UserType\"), false),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t).Build(t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"PostsArgument\")).\n\t\t\t\t\t\tSetDependencyGraph(\n\t\t\t\t\t\t\ttestutil.NewDependencyGraphBuilder().\n\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.post\", \"GetPostsResponse\"), ref.Message(t, \"org.federation\", \"User\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinitionGroup(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\tAddStart(\n\t\t\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\t\t\tAddStart(testutil.NewVariableDefinitionGroupByName(\"res\")).\n\t\t\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"posts\")).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"ids\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinitionGroup(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\tAddStart(\n\t\t\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\t\t\tAddStart(testutil.NewVariableDefinitionGroupByName(\"res\")).\n\t\t\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"posts\")).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"items\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinitionGroup(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\tAddStart(testutil.NewVariableDefinitionGroupByName(\"source_user_types\")).\n\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"user_types\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinitionGroup(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\tAddStart(\n\t\t\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\t\t\tAddStart(testutil.NewVariableDefinitionGroupByName(\"res\")).\n\t\t\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"posts\")).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"users\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostsRequest\").\n\t\t\t\tAddField(\"ids\", resolver.StringRepeatedType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostsResponseArgument\").\n\t\t\t\tAddField(\"ids\", resolver.StringRepeatedType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostsResponse\").\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"posts\",\n\t\t\t\t\tref.Type(t, \"org.federation\", \"Posts\"),\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(resolver.NewByValue(\"posts\", ref.Type(t, \"org.federation\", \"Posts\"))).Build(t),\n\t\t\t\t).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"posts\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"Posts\")).\n\t\t\t\t\t\t\t\t\t\tSetArgs(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageDependencyArgumentBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"post_ids\", resolver.NewByValue(\"$.ids\", resolver.StringRepeatedType)).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"GetPostsResponseArgument\")).\n\t\t\t\t\t\tSetDependencyGraph(\n\t\t\t\t\t\t\ttestutil.NewDependencyGraphBuilder().\n\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.federation\", \"Posts\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinitionGroup(testutil.NewVariableDefinitionGroupByName(\"posts\")).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddService(\n\t\t\ttestutil.NewServiceBuilder(\"FederationService\").\n\t\t\t\tAddMethod(\n\t\t\t\t\t\"GetPosts\",\n\t\t\t\t\tref.Message(t, \"org.federation\", \"GetPostsRequest\"),\n\t\t\t\t\tref.Message(t, \"org.federation\", \"GetPostsResponse\"),\n\t\t\t\t\tnil,\n\t\t\t\t).\n\t\t\t\tSetRule(testutil.NewServiceRuleBuilder().Build(t)).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"GetPostsResponse\"), ref.Message(t, \"org.federation\", \"GetPostsResponseArgument\")).\n\t\t\t\tAddMessage(postItem, postItemArg).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"Posts\"), ref.Message(t, \"org.federation\", \"PostsArgument\")).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"User\"), ref.Message(t, \"org.federation\", \"UserArgument\")).\n\t\t\t\tBuild(t),\n\t\t)\n\n\tfederationFile := fb.Build(t)\n\tfederationService := federationFile.Services[0]\n\n\tr := resolver.New(testutil.Compile(t, fileName), resolver.ImportPathOption(testdataDir))\n\tresult, err := r.Resolve()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif len(result.Files) != 1 {\n\t\tt.Fatalf(\"failed to get files. expected 1 but got %d\", len(result.Files))\n\t}\n\tif len(result.Files[0].Services) != 1 {\n\t\tt.Fatalf(\"failed to get services. expected 1 but got %d\", len(result.Files[0].Services))\n\t}\n\tif diff := cmp.Diff(result.Files[0].Services[0], federationService, testutil.ResolverCmpOpts()...); diff != \"\" {\n\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t}\n}\n\nfunc TestCondition(t *testing.T) {\n\tt.Parallel()\n\ttestdataDir := filepath.Join(testutil.RepoRoot(), \"testdata\")\n\tfileName := filepath.Join(testdataDir, \"condition.proto\")\n\tfb := testutil.NewFileBuilder(fileName)\n\tref := testutil.NewBuilderReferenceManager(getPostProtoBuilder(t), fb)\n\n\tfb.SetPackage(\"org.federation\").\n\t\tSetGoPackage(\"example/federation\", \"federation\").\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"PostArgument\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"UserArgument\").\n\t\t\t\tAddField(\"user_id\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"User\").\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"id\",\n\t\t\t\t\tresolver.StringType,\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(resolver.NewByValue(\"$.user_id\", resolver.StringType)).Build(t),\n\t\t\t\t).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"UserArgument\")).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"Post\").\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"id\",\n\t\t\t\t\tresolver.StringType,\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(resolver.NewByValue(\"post.id\", resolver.StringType)).Build(t),\n\t\t\t\t).\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"title\",\n\t\t\t\t\tresolver.StringType,\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(resolver.NewByValue(\"post.title)\", resolver.StringType)).Build(t),\n\t\t\t\t).\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"user\",\n\t\t\t\t\tref.Type(t, \"org.federation\", \"User\"),\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(resolver.NewByValue(\"users[0]\", ref.Type(t, \"org.federation\", \"User\"))).Build(t),\n\t\t\t\t).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetIf(\"$.id != ''\").\n\t\t\t\t\t\t\t\tSetName(\"res\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetCall(\n\t\t\t\t\t\t\t\t\ttestutil.NewCallExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMethod(ref.Method(t, \"org.post\", \"PostService\", \"GetPost\")).\n\t\t\t\t\t\t\t\t\t\tSetRequest(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewRequestBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAddField(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"id\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tresolver.StringType,\n\t\t\t\t\t\t\t\t\t\t\t\t\tresolver.NewByValue(\"$.id\", resolver.StringType),\n\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetIf(\"res != null\").\n\t\t\t\t\t\t\t\tSetName(\"post\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetBy(testutil.NewCELValueBuilder(\"res.post\", ref.Type(t, \"org.post\", \"Post\")).Build(t)).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetIf(\"post != null\").\n\t\t\t\t\t\t\t\tSetName(\"user\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"User\")).\n\t\t\t\t\t\t\t\t\t\tSetArgs(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageDependencyArgumentBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"user_id\", resolver.NewByValue(\"post.user_id\", resolver.StringType)).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"posts\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetBy(testutil.NewCELValueBuilder(\"[post]\", ref.RepeatedType(t, \"org.post\", \"Post\")).Build(t)).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetIf(\"user != null\").\n\t\t\t\t\t\t\t\tSetName(\"users\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetMap(\n\t\t\t\t\t\t\t\t\ttestutil.NewMapExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetIterator(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewIteratorBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tSetName(\"iter\").\n\t\t\t\t\t\t\t\t\t\t\t\tSetSource(\"posts\").\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tSetExpr(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMapIteratorExprBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"User\")).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetArgs(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageDependencyArgumentBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"user_id\", resolver.NewByValue(\"iter.user_id\", resolver.StringType)).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetIf(\"users.size() > 0\").\n\t\t\t\t\t\t\t\tSetName(\"_def5\").\n\t\t\t\t\t\t\t\tSetValidation(\n\t\t\t\t\t\t\t\t\ttestutil.NewValidationExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetError(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewGRPCErrorBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tSetCode(code.Code_INVALID_ARGUMENT).\n\t\t\t\t\t\t\t\t\t\t\t\tSetIf(\"users[0].id == ''\").\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"PostArgument\")).\n\t\t\t\t\t\tSetDependencyGraph(\n\t\t\t\t\t\t\ttestutil.NewDependencyGraphBuilder().\n\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.post\", \"GetPostResponse\"), ref.Message(t, \"org.federation\", \"User\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinitionGroup(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\tAddStart(\n\t\t\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\t\t\tAddStart(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAddStart(\n\t\t\t\t\t\t\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tAddStart(testutil.NewVariableDefinitionGroupByName(\"res\")).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"post\")).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"posts\")).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tAddStart(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAddStart(\n\t\t\t\t\t\t\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tAddStart(testutil.NewVariableDefinitionGroupByName(\"res\")).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"post\")).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"user\")).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"users\")).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"_def5\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostRequest\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostResponseArgument\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostResponse\").\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"post\",\n\t\t\t\t\tref.Type(t, \"org.federation\", \"Post\"),\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(resolver.NewByValue(\"post\", ref.Type(t, \"org.federation\", \"Post\"))).Build(t),\n\t\t\t\t).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"post\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"Post\")).\n\t\t\t\t\t\t\t\t\t\tSetArgs(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageDependencyArgumentBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"id\", resolver.NewByValue(\"$.id\", resolver.StringType)).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"GetPostResponseArgument\")).\n\t\t\t\t\t\tSetDependencyGraph(\n\t\t\t\t\t\t\ttestutil.NewDependencyGraphBuilder().\n\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.federation\", \"Post\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinitionGroup(testutil.NewVariableDefinitionGroupByName(\"post\")).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddService(\n\t\t\ttestutil.NewServiceBuilder(\"FederationService\").\n\t\t\t\tAddMethod(\n\t\t\t\t\t\"GetPost\",\n\t\t\t\t\tref.Message(t, \"org.federation\", \"GetPostRequest\"),\n\t\t\t\t\tref.Message(t, \"org.federation\", \"GetPostResponse\"),\n\t\t\t\t\tnil,\n\t\t\t\t).\n\t\t\t\tSetRule(testutil.NewServiceRuleBuilder().Build(t)).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"GetPostResponse\"), ref.Message(t, \"org.federation\", \"GetPostResponseArgument\")).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"Post\"), ref.Message(t, \"org.federation\", \"PostArgument\")).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"User\"), ref.Message(t, \"org.federation\", \"UserArgument\")).\n\t\t\t\tBuild(t),\n\t\t)\n\n\tfederationFile := fb.Build(t)\n\tfederationService := federationFile.Services[0]\n\n\tr := resolver.New(testutil.Compile(t, fileName), resolver.ImportPathOption(testdataDir))\n\tresult, err := r.Resolve()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif len(result.Files) != 1 {\n\t\tt.Fatalf(\"failed to get files. expected 1 but got %d\", len(result.Files))\n\t}\n\tif len(result.Files[0].Services) != 1 {\n\t\tt.Fatalf(\"failed to get services. expected 1 but got %d\", len(result.Files[0].Services))\n\t}\n\tif diff := cmp.Diff(result.Files[0].Services[0], federationService, testutil.ResolverCmpOpts()...); diff != \"\" {\n\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t}\n}\n\nfunc TestErrorHandler(t *testing.T) {\n\tt.Parallel()\n\ttestdataDir := filepath.Join(testutil.RepoRoot(), \"testdata\")\n\tfileName := filepath.Join(testdataDir, \"error_handler.proto\")\n\tfb := testutil.NewFileBuilder(fileName)\n\tref := testutil.NewBuilderReferenceManager(getPostProtoBuilder(t), fb)\n\n\tfb.SetPackage(\"org.federation\").\n\t\tSetGoPackage(\"example/federation\", \"federation\").\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"CustomMessageArgument\").\n\t\t\t\tAddField(\"msg\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"CustomMessage\").\n\t\t\t\tAddFieldWithRule(\"msg\", resolver.StringType, testutil.NewFieldRuleBuilder(&resolver.Value{CEL: testutil.NewCELValueBuilder(\"'custom error message:' + $.msg\", resolver.StringType).Build(t)}).Build(t)).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().SetMessageArgument(ref.Message(t, \"org.federation\", \"CustomMessageArgument\")).Build(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"LocalizedMessageArgument\").\n\t\t\t\tAddField(\"value\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"LocalizedMessage\").\n\t\t\t\tAddFieldWithRule(\"value\", resolver.StringType, testutil.NewFieldRuleBuilder(&resolver.Value{CEL: testutil.NewCELValueBuilder(\"'localized value:' + $.value\", resolver.StringType).Build(t)}).Build(t)).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().SetMessageArgument(ref.Message(t, \"org.federation\", \"LocalizedMessageArgument\")).Build(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"PostArgument\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostResponseArgument\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"Post\").\n\t\t\t\tAddFieldWithAutoBind(\"id\", resolver.StringType, ref.Field(t, \"org.post\", \"Post\", \"id\")).\n\t\t\t\tAddFieldWithAutoBind(\"title\", resolver.StringType, ref.Field(t, \"org.post\", \"Post\", \"title\")).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"res\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetCall(\n\t\t\t\t\t\t\t\t\ttestutil.NewCallExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMethod(ref.Method(t, \"org.post\", \"PostService\", \"GetPost\")).\n\t\t\t\t\t\t\t\t\t\tSetRequest(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewRequestBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAddField(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"id\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tresolver.StringType,\n\t\t\t\t\t\t\t\t\t\t\t\t\tresolver.NewByValue(\"$.id\", resolver.StringType),\n\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tAddError(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewGRPCErrorBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetName(\"id\").\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetBy(testutil.NewCELValueBuilder(\"$.id\", resolver.StringType).Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\tSetIf(\"error.precondition_failures.map(f, f.violations[0]).first(v, v.subject == '').?subject == optional.of('')\").\n\t\t\t\t\t\t\t\t\t\t\t\tSetCode(code.Code_FAILED_PRECONDITION).\n\t\t\t\t\t\t\t\t\t\t\t\tSetMessage(\"'id must be not empty'\").\n\t\t\t\t\t\t\t\t\t\t\t\tAddDetail(\n\t\t\t\t\t\t\t\t\t\t\t\t\ttestutil.NewGRPCErrorDetailBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tAddDef(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetName(\"localized_msg\").\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"LocalizedMessage\")).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetArgs(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageDependencyArgumentBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"value\", testutil.NewMessageArgumentValueBuilder(resolver.StringType, resolver.StringType, \"id\").Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tAddBy(testutil.NewCELValueBuilder(\"org.post.Post{id: 'foo'}\", ref.Type(t, \"org.post\", \"Post\")).Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tAddBy(testutil.NewCELValueBuilder(\"org.post.CreatePost{title: 'bar'}\", ref.Type(t, \"org.post\", \"CreatePost\")).Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tAddMessage(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetName(\"_def0_err_detail0_msg0\").\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"CustomMessage\")).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSetArgs(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageDependencyArgumentBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"msg\", testutil.NewMessageArgumentValueBuilder(resolver.StringType, resolver.StringType, \"id\").Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tAddPreconditionFailure(&resolver.PreconditionFailure{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tViolations: []*resolver.PreconditionFailureViolation{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tType:        testutil.NewCELValueBuilder(\"'some-type'\", resolver.StringType).Build(t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSubject:     testutil.NewCELValueBuilder(\"'some-subject'\", resolver.StringType).Build(t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tDescription: testutil.NewCELValueBuilder(\"'some-description'\", resolver.StringType).Build(t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tAddLocalizedMessage(&resolver.LocalizedMessage{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tLocale:  \"en-US\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tMessage: testutil.NewCELValueBuilder(\"localized_msg.value\", resolver.StringType).Build(t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}).\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tAddError(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewGRPCErrorBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tSetIf(\"error.code == google.rpc.Code.UNIMPLEMENTED\").\n\t\t\t\t\t\t\t\t\t\t\t\tSetIgnoreAndResponse(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"org.post.GetPostResponse{post: org.post.Post{id: 'anonymous', title: 'none'}}\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tref.Type(t, \"org.post\", \"GetPostResponse\"),\n\t\t\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tAddError(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewGRPCErrorBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tSetIf(\"true\").\n\t\t\t\t\t\t\t\t\t\t\t\tSetIgnore(true).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"post\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetAutoBind(true).\n\t\t\t\t\t\t\t\tSetBy(testutil.NewCELValueBuilder(\"res.post\", ref.Type(t, \"org.post\", \"Post\")).Build(t)).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"PostArgument\")).\n\t\t\t\t\t\tSetDependencyGraph(\n\t\t\t\t\t\t\ttestutil.NewDependencyGraphBuilder().\n\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.post\", \"GetPostResponse\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinitionGroup(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\tAddStart(testutil.NewVariableDefinitionGroupByName(\"res\")).\n\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinition(\"post\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostRequest\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostResponse\").\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"post\",\n\t\t\t\t\tref.Type(t, \"org.federation\", \"Post\"),\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(resolver.NewByValue(\"post\", ref.Type(t, \"org.federation\", \"Post\"))).Build(t),\n\t\t\t\t).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"post\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"Post\")).\n\t\t\t\t\t\t\t\t\t\tSetArgs(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewMessageDependencyArgumentBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAdd(\"id\", resolver.NewByValue(\"$.id\", resolver.StringType)).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"GetPostResponseArgument\")).\n\t\t\t\t\t\tSetDependencyGraph(\n\t\t\t\t\t\t\ttestutil.NewDependencyGraphBuilder().\n\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.federation\", \"Post\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinitionGroup(testutil.NewVariableDefinitionGroupByName(\"post\")).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddService(\n\t\t\ttestutil.NewServiceBuilder(\"FederationService\").\n\t\t\t\tAddMethod(\n\t\t\t\t\t\"GetPost\",\n\t\t\t\t\tref.Message(t, \"org.federation\", \"GetPostRequest\"),\n\t\t\t\t\tref.Message(t, \"org.federation\", \"GetPostResponse\"),\n\t\t\t\t\tnil,\n\t\t\t\t).\n\t\t\t\tSetRule(testutil.NewServiceRuleBuilder().Build(t)).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"CustomMessage\"), ref.Message(t, \"org.federation\", \"CustomMessageArgument\")).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"GetPostResponse\"), ref.Message(t, \"org.federation\", \"GetPostResponseArgument\")).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"LocalizedMessage\"), ref.Message(t, \"org.federation\", \"LocalizedMessageArgument\")).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"Post\"), ref.Message(t, \"org.federation\", \"PostArgument\")).\n\t\t\t\tBuild(t),\n\t\t)\n\n\tfederationFile := fb.Build(t)\n\tfederationService := federationFile.Services[0]\n\n\tr := resolver.New(testutil.Compile(t, fileName), resolver.ImportPathOption(testdataDir))\n\tresult, err := r.Resolve()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif len(result.Files) != 1 {\n\t\tt.Fatalf(\"failed to get files. expected 1 but got %d\", len(result.Files))\n\t}\n\tif len(result.Files[0].Services) != 1 {\n\t\tt.Fatalf(\"failed to get services. expected 1 but got %d\", len(result.Files[0].Services))\n\t}\n\tif diff := cmp.Diff(result.Files[0].Services[0], federationService, testutil.ResolverCmpOpts()...); diff != \"\" {\n\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t}\n}\n\nfunc TestInlineEnv(t *testing.T) {\n\tt.Parallel()\n\tfileName := filepath.Join(testutil.RepoRoot(), \"testdata\", \"inline_env.proto\")\n\tfb := testutil.NewFileBuilder(fileName)\n\n\tfb.SetPackage(\"org.federation\").\n\t\tSetGoPackage(\"example/federation\", \"federation\").\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"Env\").\n\t\t\t\tAddField(\"aaa\", resolver.StringType).\n\t\t\t\tAddField(\"bbb\", resolver.Int64RepeatedType).\n\t\t\t\tAddField(\"ccc\", resolver.NewMapType(resolver.StringType, resolver.DurationType)).\n\t\t\t\tAddField(\"ddd\", resolver.DoubleType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"EnvArgument\").\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddService(\n\t\t\ttestutil.NewServiceBuilder(\"InlineEnvService\").\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewServiceRuleBuilder().\n\t\t\t\t\t\tSetEnv(\n\t\t\t\t\t\t\ttestutil.NewEnvBuilder().\n\t\t\t\t\t\t\t\tAddVar(\n\t\t\t\t\t\t\t\t\ttestutil.NewEnvVarBuilder().\n\t\t\t\t\t\t\t\t\t\tSetName(\"aaa\").\n\t\t\t\t\t\t\t\t\t\tSetType(resolver.StringType).\n\t\t\t\t\t\t\t\t\t\tSetOption(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewEnvVarOptionBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tSetDefault(\"xxx\").\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tAddVar(\n\t\t\t\t\t\t\t\t\ttestutil.NewEnvVarBuilder().\n\t\t\t\t\t\t\t\t\t\tSetName(\"bbb\").\n\t\t\t\t\t\t\t\t\t\tSetType(resolver.Int64RepeatedType).\n\t\t\t\t\t\t\t\t\t\tSetOption(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewEnvVarOptionBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tSetAlternate(\"yyy\").\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tAddVar(\n\t\t\t\t\t\t\t\t\ttestutil.NewEnvVarBuilder().\n\t\t\t\t\t\t\t\t\t\tSetName(\"ccc\").\n\t\t\t\t\t\t\t\t\t\tSetType(resolver.NewMapTypeWithName(\"CccEntry\", resolver.StringType, resolver.DurationType)).\n\t\t\t\t\t\t\t\t\t\tSetOption(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewEnvVarOptionBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tSetRequired(true).\n\t\t\t\t\t\t\t\t\t\t\t\tSetAlternate(\"c\").\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tAddVar(\n\t\t\t\t\t\t\t\t\ttestutil.NewEnvVarBuilder().\n\t\t\t\t\t\t\t\t\t\tSetName(\"ddd\").\n\t\t\t\t\t\t\t\t\t\tSetType(resolver.DoubleType).\n\t\t\t\t\t\t\t\t\t\tSetOption(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewEnvVarOptionBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tSetIgnored(true).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVar(\n\t\t\t\t\t\t\ttestutil.NewServiceVariableBuilder().\n\t\t\t\t\t\t\t\tSetName(\"x\").\n\t\t\t\t\t\t\t\tSetBy(testutil.NewCELValueBuilder(\"grpc.federation.env.aaa\", resolver.StringType).Build(t)).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVar(\n\t\t\t\t\t\t\ttestutil.NewServiceVariableBuilder().\n\t\t\t\t\t\t\t\tSetName(\"y\").\n\t\t\t\t\t\t\t\tSetSwitch(testutil.NewSwitchExprBuilder().\n\t\t\t\t\t\t\t\t\tSetType(resolver.Int64RepeatedType).\n\t\t\t\t\t\t\t\t\tAddCase(testutil.NewSwitchCaseExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetIf(testutil.NewCELValueBuilder(\"grpc.federation.env.aaa == 'xxx'\", resolver.BoolType).Build(t)).\n\t\t\t\t\t\t\t\t\t\tSetBy(testutil.NewCELValueBuilder(\"grpc.federation.env.bbb\", resolver.Int64RepeatedType).Build(t)).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\tSetDefault(testutil.NewSwitchDefaultExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetBy(testutil.NewCELValueBuilder(\"[0, 0]\", resolver.Int64RepeatedType).Build(t)).\n\t\t\t\t\t\t\t\t\t\tBuild(t)).\n\t\t\t\t\t\t\t\t\tBuild(t)).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVar(\n\t\t\t\t\t\t\ttestutil.NewServiceVariableBuilder().\n\t\t\t\t\t\t\t\tSetValidation(&resolver.ServiceVariableValidationExpr{\n\t\t\t\t\t\t\t\t\tIf:      testutil.NewCELValueBuilder(\"grpc.federation.env.bbb == 1\", resolver.BoolType).Build(t),\n\t\t\t\t\t\t\t\t\tMessage: testutil.NewCELValueBuilder(\"'error'\", resolver.StringType).Build(t),\n\t\t\t\t\t\t\t\t}).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t)\n\n\tfederationFile := fb.Build(t)\n\n\tr := resolver.New(testutil.Compile(t, fileName))\n\tresult, err := r.Resolve()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif len(result.Files) != 1 {\n\t\tt.Fatalf(\"faield to get files. expected 1 but got %d\", len(result.Files))\n\t}\n\tif len(result.Files[0].Services) != 1 {\n\t\tt.Fatalf(\"faield to get services. expected 1 but got %d\", len(result.Files[0].Services))\n\t}\n\tif diff := cmp.Diff(result.Files[0].Services[0], federationFile.Services[0], testutil.ResolverCmpOpts()...); diff != \"\" {\n\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t}\n}\n\nfunc TestRefEnv(t *testing.T) {\n\tt.Parallel()\n\tfileName := filepath.Join(testutil.RepoRoot(), \"testdata\", \"ref_env.proto\")\n\tfb := testutil.NewFileBuilder(fileName)\n\tref := testutil.NewBuilderReferenceManager(fb)\n\n\tfb.SetPackage(\"org.federation\").\n\t\tSetGoPackage(\"example/federation\", \"federation\").\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"Env\").\n\t\t\t\tAddField(\"aaa\", resolver.StringType).\n\t\t\t\tAddField(\"bbb\", resolver.Int64RepeatedType).\n\t\t\t\tAddField(\"ccc\", resolver.NewMapType(resolver.StringType, resolver.DurationType)).\n\t\t\t\tAddField(\"ddd\", resolver.DoubleType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"ConstantArgument\").\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"Constant\").\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"x\",\n\t\t\t\t\tresolver.StringType,\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(resolver.NewByValue(\"grpc.federation.env.aaa + 'xxx'\", resolver.StringType)).Build(t),\n\t\t\t\t).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"ConstantArgument\")).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"EnvArgument\").\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddService(\n\t\t\ttestutil.NewServiceBuilder(\"RefEnvService\").\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewServiceRuleBuilder().\n\t\t\t\t\t\tSetEnv(\n\t\t\t\t\t\t\ttestutil.NewEnvBuilder().\n\t\t\t\t\t\t\t\tAddVar(\n\t\t\t\t\t\t\t\t\ttestutil.NewEnvVarBuilder().\n\t\t\t\t\t\t\t\t\t\tSetName(\"aaa\").\n\t\t\t\t\t\t\t\t\t\tSetType(resolver.StringType).\n\t\t\t\t\t\t\t\t\t\tSetOption(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewEnvVarOptionBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tSetDefault(\"xxx\").\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tAddVar(\n\t\t\t\t\t\t\t\t\ttestutil.NewEnvVarBuilder().\n\t\t\t\t\t\t\t\t\t\tSetName(\"bbb\").\n\t\t\t\t\t\t\t\t\t\tSetType(resolver.Int64RepeatedType).\n\t\t\t\t\t\t\t\t\t\tSetOption(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewEnvVarOptionBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tSetAlternate(\"yyy\").\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tAddVar(\n\t\t\t\t\t\t\t\t\ttestutil.NewEnvVarBuilder().\n\t\t\t\t\t\t\t\t\t\tSetName(\"ccc\").\n\t\t\t\t\t\t\t\t\t\tSetType(resolver.NewMapTypeWithName(\"CccEntry\", resolver.StringType, resolver.DurationType)).\n\t\t\t\t\t\t\t\t\t\tSetOption(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewEnvVarOptionBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tSetRequired(true).\n\t\t\t\t\t\t\t\t\t\t\t\tSetAlternate(\"c\").\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tAddVar(\n\t\t\t\t\t\t\t\t\ttestutil.NewEnvVarBuilder().\n\t\t\t\t\t\t\t\t\t\tSetName(\"ddd\").\n\t\t\t\t\t\t\t\t\t\tSetType(resolver.DoubleType).\n\t\t\t\t\t\t\t\t\t\tSetOption(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewEnvVarOptionBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tSetIgnored(true).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVar(\n\t\t\t\t\t\t\ttestutil.NewServiceVariableBuilder().\n\t\t\t\t\t\t\t\tSetName(\"constant\").\n\t\t\t\t\t\t\t\tSetMessage(\n\t\t\t\t\t\t\t\t\ttestutil.NewMessageExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetMessage(ref.Message(t, \"org.federation\", \"Constant\")).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"Constant\"), ref.Message(t, \"org.federation\", \"ConstantArgument\")).\n\t\t\t\tBuild(t),\n\t\t)\n\n\tfederationFile := fb.Build(t)\n\n\tr := resolver.New(testutil.Compile(t, fileName))\n\tresult, err := r.Resolve()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif len(result.Files) != 1 {\n\t\tt.Fatalf(\"faield to get files. expected 1 but got %d\", len(result.Files))\n\t}\n\tif len(result.Files[0].Services) != 1 {\n\t\tt.Fatalf(\"faield to get services. expected 1 but got %d\", len(result.Files[0].Services))\n\t}\n\tif diff := cmp.Diff(result.Files[0].Services[0], federationFile.Services[0], testutil.ResolverCmpOpts()...); diff != \"\" {\n\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t}\n}\n\nfunc getUserProtoBuilder(t *testing.T) *testutil.FileBuilder {\n\tub := testutil.NewFileBuilder(\"user.proto\")\n\tref := testutil.NewBuilderReferenceManager(ub)\n\tub.SetPackage(\"org.user\").\n\t\tSetGoPackage(\"example/user\", \"user\").\n\t\tAddEnum(\n\t\t\ttestutil.NewEnumBuilder(\"UserType\").\n\t\t\t\tAddValue(\"USER_TYPE_1\").\n\t\t\t\tAddValue(\"USER_TYPE_2\").\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"Item\").\n\t\t\t\tAddEnum(\n\t\t\t\t\ttestutil.NewEnumBuilder(\"ItemType\").\n\t\t\t\t\t\tAddValue(\"ITEM_TYPE_1\").\n\t\t\t\t\t\tAddValue(\"ITEM_TYPE_2\").\n\t\t\t\t\t\tAddValue(\"ITEM_TYPE_3\").\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tAddField(\"name\", resolver.StringType).\n\t\t\t\tAddFieldWithTypeName(t, \"type\", \"ItemType\", false).\n\t\t\t\tAddField(\"value\", resolver.Int64Type).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"User\").\n\t\t\t\tAddMessage(\n\t\t\t\t\ttestutil.NewMessageBuilder(\"ProfileEntry\").\n\t\t\t\t\t\tSetIsMapEntry(true).\n\t\t\t\t\t\tAddField(\"key\", resolver.StringType).\n\t\t\t\t\t\tAddField(\"value\", resolver.AnyType).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tAddMessage(\n\t\t\t\t\ttestutil.NewMessageBuilder(\"AttrA\").\n\t\t\t\t\t\tAddField(\"foo\", resolver.StringType).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tAddMessage(\n\t\t\t\t\ttestutil.NewMessageBuilder(\"AttrB\").\n\t\t\t\t\t\tAddField(\"bar\", resolver.BoolType).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tAddField(\"type\", ref.Type(t, \"org.user\", \"UserType\")).\n\t\t\t\tAddField(\"name\", resolver.StringType).\n\t\t\t\tAddField(\"age\", resolver.Int64Type).\n\t\t\t\tAddField(\"desc\", resolver.StringRepeatedType).\n\t\t\t\tAddField(\"main_item\", ref.Type(t, \"org.user\", \"Item\")).\n\t\t\t\tAddField(\"items\", ref.RepeatedType(t, \"org.user\", \"Item\")).\n\t\t\t\tAddFieldWithTypeName(t, \"profile\", \"ProfileEntry\", false).\n\t\t\t\tAddFieldWithTypeName(t, \"attr_a\", \"AttrA\", false).\n\t\t\t\tAddFieldWithTypeName(t, \"b\", \"AttrB\", false).\n\t\t\t\tAddOneof(testutil.NewOneofBuilder(\"attr\").AddFieldNames(\"attr_a\", \"b\").Build(t)).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetUserRequest\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tAddField(\"foo\", resolver.Int64Type).\n\t\t\t\tAddField(\"bar\", resolver.StringType).\n\t\t\t\tAddOneof(\n\t\t\t\t\ttestutil.NewOneofBuilder(\"foobar\").\n\t\t\t\t\t\tAddFieldNames(\"foo\", \"bar\").\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetUserResponse\").\n\t\t\t\tAddField(\"user\", ref.Type(t, \"org.user\", \"User\")).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetUsersRequest\").\n\t\t\t\tAddField(\"ids\", resolver.StringRepeatedType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetUsersResponse\").\n\t\t\t\tAddField(\"users\", ref.RepeatedType(t, \"org.user\", \"User\")).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetUserResponseArgument\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetUsersResponseArgument\").\n\t\t\t\tAddField(\"ids\", resolver.StringRepeatedType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddService(\n\t\t\ttestutil.NewServiceBuilder(\"UserService\").\n\t\t\t\tAddMethod(\"GetUser\", ref.Message(t, \"org.user\", \"GetUserRequest\"), ref.Message(t, \"org.user\", \"GetUserResponse\"), nil).\n\t\t\t\tAddMethod(\"GetUsers\", ref.Message(t, \"org.user\", \"GetUsersRequest\"), ref.Message(t, \"org.user\", \"GetUsersResponse\"), nil).\n\t\t\t\tBuild(t),\n\t\t)\n\treturn ub\n}\n\nfunc getPostProtoBuilder(t *testing.T) *testutil.FileBuilder {\n\tpb := testutil.NewFileBuilder(\"post.proto\")\n\tref := testutil.NewBuilderReferenceManager(pb)\n\n\tpb.SetPackage(\"org.post\").\n\t\tSetGoPackage(\"example/post\", \"post\").\n\t\tAddEnum(\n\t\t\ttestutil.NewEnumBuilder(\"PostType\").\n\t\t\t\tAddValue(\"POST_TYPE_UNKNOWN\").\n\t\t\t\tAddValue(\"POST_TYPE_A\").\n\t\t\t\tAddValue(\"POST_TYPE_B\").\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"Post\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tAddField(\"title\", resolver.StringType).\n\t\t\t\tAddField(\"content\", resolver.StringType).\n\t\t\t\tAddField(\"user_id\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostRequest\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostResponse\").\n\t\t\t\tAddField(\"post\", ref.Type(t, \"org.post\", \"Post\")).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostsRequest\").\n\t\t\t\tAddField(\"ids\", resolver.StringRepeatedType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostsResponse\").\n\t\t\t\tAddField(\"posts\", ref.RepeatedType(t, \"org.post\", \"Post\")).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"CreatePost\").\n\t\t\t\tAddField(\"title\", resolver.StringType).\n\t\t\t\tAddField(\"content\", resolver.StringType).\n\t\t\t\tAddField(\"user_id\", resolver.StringType).\n\t\t\t\tAddField(\"type\", ref.Type(t, \"org.post\", \"PostType\")).\n\t\t\t\tAddField(\"post_type\", resolver.Int32Type).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"CreatePostRequest\").\n\t\t\t\tAddField(\"post\", ref.Type(t, \"org.post\", \"CreatePost\")).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"CreatePostResponse\").\n\t\t\t\tAddField(\"post\", ref.Type(t, \"org.post\", \"Post\")).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"UpdatePostRequest\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"UpdatePostResponse\").\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostResponseArgument\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostsResponseArgument\").\n\t\t\t\tAddField(\"ids\", resolver.StringRepeatedType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"CreatePostResponseArgument\").\n\t\t\t\tAddField(\"post\", ref.Type(t, \"org.post\", \"CreatePost\")).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"UpdatePostResponseArgument\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddService(\n\t\t\ttestutil.NewServiceBuilder(\"PostService\").\n\t\t\t\tAddMethod(\"GetPost\", ref.Message(t, \"org.post\", \"GetPostRequest\"), ref.Message(t, \"org.post\", \"GetPostResponse\"), nil).\n\t\t\t\tAddMethod(\"GetPosts\", ref.Message(t, \"org.post\", \"GetPostsRequest\"), ref.Message(t, \"org.post\", \"GetPostsResponse\"), nil).\n\t\t\t\tAddMethod(\"CreatePost\", ref.Message(t, \"org.post\", \"CreatePostRequest\"), ref.Message(t, \"org.post\", \"CreatePostResponse\"), nil).\n\t\t\t\tAddMethod(\"UpdatePost\", ref.Message(t, \"org.post\", \"UpdatePostRequest\"), ref.Message(t, \"org.post\", \"UpdatePostResponse\"), nil).\n\t\t\t\tBuild(t),\n\t\t)\n\treturn pb\n}\n\nfunc getNestedPostProtoBuilder(t *testing.T) *testutil.FileBuilder {\n\tt.Helper()\n\tpb := testutil.NewFileBuilder(\"nested_post.proto\")\n\tref := testutil.NewBuilderReferenceManager(pb)\n\n\tpb.SetPackage(\"org.post\").\n\t\tSetGoPackage(\"example/post\", \"post\").\n\t\tAddEnum(\n\t\t\ttestutil.NewEnumBuilder(\"PostDataType\").\n\t\t\t\tAddValue(\"POST_TYPE_A\").\n\t\t\t\tAddValue(\"POST_TYPE_B\").\n\t\t\t\tAddValue(\"POST_TYPE_C\").\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"PostContent\").\n\t\t\t\tAddMessage(\n\t\t\t\t\ttestutil.NewMessageBuilder(\"CountsEntry\").\n\t\t\t\t\t\tSetIsMapEntry(true).\n\t\t\t\t\t\tAddField(\"key\", resolver.Int32Type).\n\t\t\t\t\t\tAddField(\"value\", resolver.Int32Type).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tAddMessage(\n\t\t\t\t\ttestutil.NewMessageBuilder(\"CastCountsEntry\").\n\t\t\t\t\t\tSetIsMapEntry(true).\n\t\t\t\t\t\tAddField(\"key\", resolver.Int64Type).\n\t\t\t\t\t\tAddField(\"value\", resolver.Int64Type).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tAddEnum(\n\t\t\t\t\ttestutil.NewEnumBuilder(\"Category\").\n\t\t\t\t\t\tAddValue(\"CATEGORY_A\").\n\t\t\t\t\t\tAddValue(\"CATEGORY_B\").\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tAddFieldWithTypeName(t, \"category\", \"Category\", false).\n\t\t\t\tAddField(\"head\", resolver.StringType).\n\t\t\t\tAddField(\"body\", resolver.StringType).\n\t\t\t\tAddFieldWithTypeName(t, \"counts\", \"CountsEntry\", false).\n\t\t\t\tAddFieldWithTypeName(t, \"cast_counts\", \"CastCountsEntry\", false).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"PostData\").\n\t\t\t\tAddField(\"type\", ref.Type(t, \"org.post\", \"PostDataType\")).\n\t\t\t\tAddField(\"title\", resolver.StringType).\n\t\t\t\tAddField(\"content\", ref.Type(t, \"org.post\", \"PostContent\")).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"Post\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tAddField(\"data\", ref.Type(t, \"org.post\", \"PostData\")).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"PostConditionA\").\n\t\t\t\tAddField(\"prop\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"PostConditionB\").\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostRequest\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tAddField(\"a\", ref.Type(t, \"org.post\", \"PostConditionA\")).\n\t\t\t\tAddField(\"b\", ref.Type(t, \"org.post\", \"PostConditionB\")).\n\t\t\t\tAddOneof(testutil.NewOneofBuilder(\"condition\").AddFieldNames(\"a\", \"b\").Build(t)).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostResponse\").\n\t\t\t\tAddField(\"post\", ref.Type(t, \"org.post\", \"Post\")).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostResponseArgument\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddService(\n\t\t\ttestutil.NewServiceBuilder(\"PostService\").\n\t\t\t\tAddMethod(\"GetPost\", ref.Message(t, \"org.post\", \"GetPostRequest\"), ref.Message(t, \"org.post\", \"GetPostResponse\"), nil).\n\t\t\t\tBuild(t),\n\t\t)\n\treturn pb\n}\n\nfunc TestGRPCError_ReferenceNames(t *testing.T) {\n\tt.Parallel()\n\tv := &resolver.GRPCError{\n\t\tIf: &resolver.CELValue{\n\t\t\tCheckedExpr: &exprv1.CheckedExpr{\n\t\t\t\tReferenceMap: map[int64]*exprv1.Reference{\n\t\t\t\t\t0: {Name: \"name1\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tDetails: []*resolver.GRPCErrorDetail{\n\t\t\t{\n\t\t\t\tIf: &resolver.CELValue{\n\t\t\t\t\tCheckedExpr: &exprv1.CheckedExpr{\n\t\t\t\t\t\tReferenceMap: map[int64]*exprv1.Reference{\n\t\t\t\t\t\t\t0: {Name: \"name2\"},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tPreconditionFailures: []*resolver.PreconditionFailure{\n\t\t\t\t\t{\n\t\t\t\t\t\tViolations: []*resolver.PreconditionFailureViolation{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tType: &resolver.CELValue{\n\t\t\t\t\t\t\t\t\tCheckedExpr: &exprv1.CheckedExpr{\n\t\t\t\t\t\t\t\t\t\tReferenceMap: map[int64]*exprv1.Reference{\n\t\t\t\t\t\t\t\t\t\t\t0: {Name: \"name3\"},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tSubject: &resolver.CELValue{\n\t\t\t\t\t\t\t\t\tCheckedExpr: &exprv1.CheckedExpr{\n\t\t\t\t\t\t\t\t\t\tReferenceMap: map[int64]*exprv1.Reference{\n\t\t\t\t\t\t\t\t\t\t\t0: {Name: \"name4\"},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tDescription: &resolver.CELValue{\n\t\t\t\t\t\t\t\t\tCheckedExpr: &exprv1.CheckedExpr{\n\t\t\t\t\t\t\t\t\t\tReferenceMap: map[int64]*exprv1.Reference{\n\t\t\t\t\t\t\t\t\t\t\t0: {Name: \"name5\"},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tType: &resolver.CELValue{\n\t\t\t\t\t\t\t\t\tCheckedExpr: &exprv1.CheckedExpr{\n\t\t\t\t\t\t\t\t\t\tReferenceMap: map[int64]*exprv1.Reference{\n\t\t\t\t\t\t\t\t\t\t\t0: {Name: \"name3\"},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tSubject: &resolver.CELValue{\n\t\t\t\t\t\t\t\t\tCheckedExpr: &exprv1.CheckedExpr{\n\t\t\t\t\t\t\t\t\t\tReferenceMap: map[int64]*exprv1.Reference{\n\t\t\t\t\t\t\t\t\t\t\t0: {Name: \"name4\"},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tDescription: &resolver.CELValue{\n\t\t\t\t\t\t\t\t\tCheckedExpr: &exprv1.CheckedExpr{\n\t\t\t\t\t\t\t\t\t\tReferenceMap: map[int64]*exprv1.Reference{\n\t\t\t\t\t\t\t\t\t\t\t0: {Name: \"name6\"},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tBadRequests: []*resolver.BadRequest{\n\t\t\t\t\t{\n\t\t\t\t\t\tFieldViolations: []*resolver.BadRequestFieldViolation{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tField: &resolver.CELValue{\n\t\t\t\t\t\t\t\t\tCheckedExpr: &exprv1.CheckedExpr{\n\t\t\t\t\t\t\t\t\t\tReferenceMap: map[int64]*exprv1.Reference{\n\t\t\t\t\t\t\t\t\t\t\t0: {Name: \"name7\"},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tDescription: &resolver.CELValue{\n\t\t\t\t\t\t\t\t\tCheckedExpr: &exprv1.CheckedExpr{\n\t\t\t\t\t\t\t\t\t\tReferenceMap: map[int64]*exprv1.Reference{\n\t\t\t\t\t\t\t\t\t\t\t0: {Name: \"name8\"},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tLocalizedMessages: []*resolver.LocalizedMessage{\n\t\t\t\t\t{\n\t\t\t\t\t\tLocale: \"en-US\",\n\t\t\t\t\t\tMessage: &resolver.CELValue{\n\t\t\t\t\t\t\tCheckedExpr: &exprv1.CheckedExpr{\n\t\t\t\t\t\t\t\tReferenceMap: map[int64]*exprv1.Reference{\n\t\t\t\t\t\t\t\t\t0: {Name: \"name9\"},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\texpected := []string{\n\t\t\"name1\",\n\t\t\"name2\",\n\t\t\"name3\",\n\t\t\"name4\",\n\t\t\"name5\",\n\t\t\"name6\",\n\t\t\"name7\",\n\t\t\"name8\",\n\t\t\"name9\",\n\t}\n\tgot := v.ReferenceNames()\n\t// the map order is not guaranteed in Go\n\tif len(expected) != len(got) {\n\t\tt.Errorf(\"the number of reference names is different: expected: %d, got: %d\", len(expected), len(got))\n\t}\n\tfor _, e := range expected {\n\t\tvar found bool\n\t\tfor _, g := range got {\n\t\t\tif g == e {\n\t\t\t\tfound = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif !found {\n\t\t\tt.Errorf(\"%q does not exist in the received reference names: %v\", e, got)\n\t\t}\n\t}\n}\n\nfunc newStringValue(s string) *resolver.Value {\n\treturn &resolver.Value{\n\t\tCEL: &resolver.CELValue{\n\t\t\tExpr: s,\n\t\t\tOut:  resolver.StringType,\n\t\t},\n\t}\n}\n\nfunc newInt64Value(i int64) *resolver.Value {\n\treturn &resolver.Value{\n\t\tCEL: &resolver.CELValue{\n\t\t\tExpr: strconv.FormatInt(i, 10),\n\t\t\tOut:  resolver.Int64Type,\n\t\t},\n\t}\n}\n\n// TestDependencyDetection verifies that the dependency detection fixes\n// correctly identify package dependencies that were previously missed.\n// These tests ensure that imports are NOT incorrectly flagged as \"unused\".\nfunc TestDependencyDetection(t *testing.T) {\n\tt.Parallel()\n\ttestdataDir := filepath.Join(testutil.RepoRoot(), \"testdata\")\n\n\ttests := []struct {\n\t\tname     string\n\t\tfileName string\n\t}{\n\t\t{\n\t\t\t// Method.Rule.Response dependency detection.\n\t\t\tname:     \"method_response\",\n\t\t\tfileName: \"dependency_method_response.proto\",\n\t\t},\n\t\t{\n\t\t\tname:     \"oneof_if_and_defset\",\n\t\t\tfileName: \"dependency_oneof.proto\",\n\t\t},\n\t\t{\n\t\t\t// ServiceVariable message/enum expression dependency detection.\n\t\t\tname:     \"service_variable\",\n\t\t\tfileName: \"dependency_service_variable.proto\",\n\t\t},\n\t\t{\n\t\t\t// MessageArgument dependency detection.\n\t\t\t// When a child message receives an external package message as an argument,\n\t\t\t// the MessageArgument contains fields from the external package.\n\t\t\tname:     \"message_argument\",\n\t\t\tfileName: \"dependency_message_argument.proto\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\ttt := tt\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tfileName := filepath.Join(testdataDir, tt.fileName)\n\t\t\tr := resolver.New(testutil.Compile(t, fileName), resolver.ImportPathOption(testdataDir))\n\t\t\tresult, err := r.Resolve()\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Resolve failed: %v\", err)\n\t\t\t}\n\n\t\t\t// Verify dependency_base_message.proto is NOT reported as unused\n\t\t\tfor _, warning := range result.Warnings {\n\t\t\t\tif strings.Contains(warning.Message, \"is unused for the definition of grpc federation.\") {\n\t\t\t\t\tt.Errorf(\"%s: imported file incorrectly reported as unused\", tt.name)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestSwitch(t *testing.T) {\n\tt.Parallel()\n\ttestdataDir := filepath.Join(testutil.RepoRoot(), \"testdata\")\n\tfileName := filepath.Join(testdataDir, \"switch.proto\")\n\tfb := testutil.NewFileBuilder(fileName)\n\tref := testutil.NewBuilderReferenceManager(getUserProtoBuilder(t), getPostProtoBuilder(t), fb)\n\n\tfb.SetPackage(\"org.federation\").\n\t\tSetGoPackage(\"example/federation\", \"federation\").\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostRequest\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostResponseArgument\").\n\t\t\t\tAddField(\"id\", resolver.StringType).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddMessage(\n\t\t\ttestutil.NewMessageBuilder(\"GetPostResponse\").\n\t\t\t\tAddFieldWithRule(\n\t\t\t\t\t\"switch\",\n\t\t\t\t\tresolver.Int64Type,\n\t\t\t\t\ttestutil.NewFieldRuleBuilder(\n\t\t\t\t\t\ttestutil.NewNameReferenceValueBuilder(ref.Type(t, \"org.federation\", \"GetPostResponseArgument\"), resolver.Int64Type, \"switch\").Build(t),\n\t\t\t\t\t).Build(t),\n\t\t\t\t).\n\t\t\t\tSetRule(\n\t\t\t\t\ttestutil.NewMessageRuleBuilder().\n\t\t\t\t\t\tAddVariableDefinition(\n\t\t\t\t\t\t\ttestutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\tSetName(\"switch\").\n\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\tSetSwitch(testutil.NewSwitchExprBuilder().\n\t\t\t\t\t\t\t\t\tSetType(resolver.Int64Type).\n\t\t\t\t\t\t\t\t\tAddCase(testutil.NewSwitchCaseExprBuilder().\n\t\t\t\t\t\t\t\t\t\tAddDef(testutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\t\t\t\tSetName(\"blue\").\n\t\t\t\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\t\t\t\tSetBy(testutil.NewCELValueBuilder(\"73\", resolver.Int64Type).Build(t)).\n\t\t\t\t\t\t\t\t\t\t\tBuild(t)).\n\t\t\t\t\t\t\t\t\t\tAddVariableDefinitionGroup(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\t\tSetName(\"blue\").\n\t\t\t\t\t\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\t\t\t\t\t\tSetBy(testutil.NewCELValueBuilder(\"73\", resolver.Int64Type).Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\t\tBuild(t)).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t)).\n\t\t\t\t\t\t\t\t\t\tSetDependencyGraph(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewDependencyGraphBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.federation\", \"GetPostRequest\")).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tSetIf(testutil.NewCELValueBuilder(\"$.id == 'blue'\", resolver.BoolType).Build(t)).\n\t\t\t\t\t\t\t\t\t\tSetBy(testutil.NewCELValueBuilder(\"blue\", resolver.Int64Type).Build(t)).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\tAddCase(testutil.NewSwitchCaseExprBuilder().\n\t\t\t\t\t\t\t\t\t\tSetIf(testutil.NewCELValueBuilder(\"$.id == 'red'\", resolver.BoolType).Build(t)).\n\t\t\t\t\t\t\t\t\t\tSetBy(testutil.NewCELValueBuilder(\"2\", resolver.Int64Type).Build(t)).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\tSetDefault(testutil.NewSwitchDefaultExprBuilder().\n\t\t\t\t\t\t\t\t\t\tAddDef(testutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\t\t\t\tSetName(\"default\").\n\t\t\t\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\t\t\t\tSetBy(testutil.NewCELValueBuilder(\"3\", resolver.Int64Type).Build(t)).\n\t\t\t\t\t\t\t\t\t\t\tBuild(t)).\n\t\t\t\t\t\t\t\t\t\tAddVariableDefinitionGroup(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewVariableDefinitionGroupBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tSetEnd(testutil.NewVariableDefinitionBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\t\tSetName(\"default\").\n\t\t\t\t\t\t\t\t\t\t\t\t\tSetUsed(true).\n\t\t\t\t\t\t\t\t\t\t\t\t\tSetBy(testutil.NewCELValueBuilder(\"3\", resolver.Int64Type).Build(t)).\n\t\t\t\t\t\t\t\t\t\t\t\t\tBuild(t)).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t)).\n\t\t\t\t\t\t\t\t\t\tSetDependencyGraph(\n\t\t\t\t\t\t\t\t\t\t\ttestutil.NewDependencyGraphBuilder().\n\t\t\t\t\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.federation\", \"GetPostRequest\")).\n\t\t\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\t\tSetBy(testutil.NewCELValueBuilder(\"default\", resolver.Int64Type).Build(t)).\n\t\t\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t\t\t\t).\n\t\t\t\t\t\t\t\t\tBuild(t)).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tSetMessageArgument(ref.Message(t, \"org.federation\", \"GetPostResponseArgument\")).\n\t\t\t\t\t\tSetDependencyGraph(\n\t\t\t\t\t\t\ttestutil.NewDependencyGraphBuilder().\n\t\t\t\t\t\t\t\tAdd(ref.Message(t, \"org.federation\", \"GetPostRequest\")).\n\t\t\t\t\t\t\t\tBuild(t),\n\t\t\t\t\t\t).\n\t\t\t\t\t\tAddVariableDefinitionGroup(testutil.NewVariableDefinitionGroupByName(\"switch\")).\n\t\t\t\t\t\tBuild(t),\n\t\t\t\t).\n\t\t\t\tBuild(t),\n\t\t).\n\t\tAddService(\n\t\t\ttestutil.NewServiceBuilder(\"FederationService\").\n\t\t\t\tAddMethod(\"GetPost\", ref.Message(t, \"org.federation\", \"GetPostRequest\"), ref.Message(t, \"org.federation\", \"GetPostResponse\"), nil).\n\t\t\t\tSetRule(testutil.NewServiceRuleBuilder().Build(t)).\n\t\t\t\tAddMessage(ref.Message(t, \"org.federation\", \"GetPostResponse\"), ref.Message(t, \"org.federation\", \"GetPostResponseArgument\")).\n\t\t\t\tBuild(t),\n\t\t)\n\n\tfederationFile := fb.Build(t)\n\tfederationService := federationFile.Services[0]\n\n\tr := resolver.New(testutil.Compile(t, fileName), resolver.ImportPathOption(testdataDir))\n\tresult, err := r.Resolve()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif len(result.Files) != 1 {\n\t\tt.Fatalf(\"failed to get files. expected 1 but got %d\", len(result.Files))\n\t}\n\tif len(result.Files[0].Services) != 1 {\n\t\tt.Fatalf(\"failed to get services. expected 1 but got %d\", len(result.Files[0].Services))\n\t}\n\tif diff := cmp.Diff(result.Files[0].Services[0], federationService, testutil.ResolverCmpOpts()...); diff != \"\" {\n\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t}\n}\n"
  },
  {
    "path": "resolver/service.go",
    "content": "package resolver\n\nimport (\n\t\"fmt\"\n\t\"sort\"\n)\n\nfunc (s *Service) GoPackage() *GoPackage {\n\tif s == nil {\n\t\treturn nil\n\t}\n\tif s.File == nil {\n\t\treturn nil\n\t}\n\treturn s.File.GoPackage\n}\n\nfunc (s *Service) Package() *Package {\n\tif s == nil {\n\t\treturn nil\n\t}\n\tif s.File == nil {\n\t\treturn nil\n\t}\n\treturn s.File.Package\n}\n\nfunc (s *Service) PackageName() string {\n\tif s == nil {\n\t\treturn \"\"\n\t}\n\tpkg := s.Package()\n\tif pkg == nil {\n\t\treturn \"\"\n\t}\n\treturn pkg.Name\n}\n\nfunc (s *Service) Method(name string) *Method {\n\tif s == nil {\n\t\treturn nil\n\t}\n\tfor _, method := range s.Methods {\n\t\tif method.Name == name {\n\t\t\treturn method\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (s *Service) HasMessageInMethod(msg *Message) bool {\n\tif s == nil {\n\t\treturn false\n\t}\n\tfor _, mtd := range s.Methods {\n\t\tif mtd.Request == msg {\n\t\t\treturn true\n\t\t}\n\t\tif mtd.FederationResponse() == msg {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (s *Service) HasMessageInVariables(msg *Message) bool {\n\tif s.Rule == nil || len(s.Rule.Vars) == 0 {\n\t\treturn false\n\t}\n\tfor _, svcVar := range s.Rule.Vars {\n\t\tfor _, msgExpr := range svcVar.MessageExprs() {\n\t\t\tif msgExpr.Message == msg {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (s *Service) GoPackageDependencies() []*GoPackage {\n\tif s == nil {\n\t\treturn nil\n\t}\n\tpkgMap := map[*GoPackage]struct{}{}\n\tpkgMap[s.GoPackage()] = struct{}{}\n\tfor _, dep := range s.ServiceDependencies() {\n\t\tpkgMap[dep.Service.GoPackage()] = struct{}{}\n\t}\n\tpkgs := make([]*GoPackage, 0, len(pkgMap))\n\tfor pkg := range pkgMap {\n\t\tpkgs = append(pkgs, pkg)\n\t}\n\treturn pkgs\n}\n\ntype CustomResolver struct {\n\tMessage *Message\n\tField   *Field\n}\n\nfunc (r *CustomResolver) FQDN() string {\n\tif r == nil {\n\t\treturn \"\"\n\t}\n\tif r.Field != nil {\n\t\treturn fmt.Sprintf(\"%s.%s\", r.Message.FQDN(), r.Field.Name)\n\t}\n\treturn r.Message.FQDN()\n}\n\nfunc (s *Service) CustomResolvers() []*CustomResolver {\n\tif s == nil {\n\t\treturn nil\n\t}\n\tresolverMap := make(map[string]*CustomResolver)\n\tfor _, method := range s.Methods {\n\t\tfor _, resolver := range method.FederationResponse().CustomResolvers() {\n\t\t\tresolverMap[resolver.FQDN()] = resolver\n\t\t}\n\t}\n\tresolvers := make([]*CustomResolver, 0, len(resolverMap))\n\tfor _, resolver := range resolverMap {\n\t\tresolvers = append(resolvers, resolver)\n\t}\n\tsort.Slice(resolvers, func(i, j int) bool {\n\t\treturn resolvers[i].FQDN() < resolvers[j].FQDN()\n\t})\n\treturn resolvers\n}\n\nfunc (s *Service) ExistsCustomResolver() bool {\n\tif s == nil {\n\t\treturn false\n\t}\n\treturn len(s.CustomResolvers()) != 0\n}\n\nfunc (s *Service) ServiceDependencies() []*ServiceDependency {\n\tif s == nil {\n\t\treturn nil\n\t}\n\tuseServices := s.UseServices()\n\tdeps := make([]*ServiceDependency, 0, len(useServices))\n\tdepSvcMap := map[string]*ServiceDependency{}\n\tfor _, svc := range useServices {\n\t\tif _, exists := depSvcMap[svc.FQDN()]; !exists {\n\t\t\tdeps = append(deps, &ServiceDependency{Service: svc})\n\t\t}\n\t}\n\tsort.Slice(deps, func(i, j int) bool {\n\t\treturn deps[i].Service.FQDN() < deps[j].Service.FQDN()\n\t})\n\treturn deps\n}\n\nfunc (s *Service) UseServices() []*Service {\n\tif s == nil {\n\t\treturn nil\n\t}\n\tsvcMap := map[*Service]struct{}{}\n\tfor _, method := range s.Methods {\n\t\tfor _, svc := range method.Response.DependServices() {\n\t\t\tsvcMap[svc] = struct{}{}\n\t\t}\n\t}\n\tsvcs := make([]*Service, 0, len(svcMap))\n\tfor svc := range svcMap {\n\t\tsvcs = append(svcs, svc)\n\t}\n\tsort.Slice(svcs, func(i, j int) bool {\n\t\treturn svcs[i].FQDN() < svcs[j].FQDN()\n\t})\n\treturn svcs\n}\n\nfunc (sv *ServiceVariable) MessageExprs() []*MessageExpr {\n\tif sv.Expr == nil {\n\t\treturn nil\n\t}\n\texpr := sv.Expr\n\tswitch {\n\tcase expr.Map != nil:\n\t\treturn expr.Map.MessageExprs()\n\tcase expr.Message != nil:\n\t\treturn []*MessageExpr{expr.Message}\n\t}\n\treturn nil\n}\n\nfunc (sv *ServiceVariable) ToVariableDefinition() *VariableDefinition {\n\tdef := &VariableDefinition{\n\t\tName: sv.Name,\n\t\tIf:   sv.If,\n\t}\n\tif sv.Expr == nil {\n\t\treturn def\n\t}\n\texpr := sv.Expr\n\tvar validationExpr *ValidationExpr\n\tif expr.Validation != nil {\n\t\tvalidationExpr = &ValidationExpr{\n\t\t\tError: &GRPCError{\n\t\t\t\tIf:      expr.Validation.If,\n\t\t\t\tMessage: expr.Validation.Message,\n\t\t\t},\n\t\t}\n\t}\n\tdef.Expr = &VariableExpr{\n\t\tType:       expr.Type,\n\t\tBy:         expr.By,\n\t\tMap:        expr.Map,\n\t\tMessage:    expr.Message,\n\t\tEnum:       expr.Enum,\n\t\tSwitch:     expr.Switch,\n\t\tValidation: validationExpr,\n\t}\n\treturn def\n}\n"
  },
  {
    "path": "resolver/std_fd.go",
    "content": "package resolver\n\nimport (\n\t\"github.com/bufbuild/protocompile/protoutil\"\n\t\"google.golang.org/protobuf/reflect/protoregistry\"\n\t\"google.golang.org/protobuf/types/descriptorpb\"\n\n\t// link in packages that include the standard protos included with protoc.\n\t_ \"google.golang.org/protobuf/types/known/anypb\"\n\t_ \"google.golang.org/protobuf/types/known/apipb\"\n\t_ \"google.golang.org/protobuf/types/known/durationpb\"\n\t_ \"google.golang.org/protobuf/types/known/emptypb\"\n\t_ \"google.golang.org/protobuf/types/known/fieldmaskpb\"\n\t_ \"google.golang.org/protobuf/types/known/sourcecontextpb\"\n\t_ \"google.golang.org/protobuf/types/known/structpb\"\n\t_ \"google.golang.org/protobuf/types/known/timestamppb\"\n\t_ \"google.golang.org/protobuf/types/known/typepb\"\n\t_ \"google.golang.org/protobuf/types/known/wrapperspb\"\n\t_ \"google.golang.org/protobuf/types/pluginpb\"\n)\n\nfunc stdFileDescriptors() []*descriptorpb.FileDescriptorProto {\n\tstdFileNames := []string{\n\t\t\"google/protobuf/any.proto\",\n\t\t\"google/protobuf/api.proto\",\n\t\t\"google/protobuf/compiler/plugin.proto\",\n\t\t\"google/protobuf/descriptor.proto\",\n\t\t\"google/protobuf/duration.proto\",\n\t\t\"google/protobuf/empty.proto\",\n\t\t\"google/protobuf/field_mask.proto\",\n\t\t\"google/protobuf/source_context.proto\",\n\t\t\"google/protobuf/struct.proto\",\n\t\t\"google/protobuf/timestamp.proto\",\n\t\t\"google/protobuf/type.proto\",\n\t\t\"google/protobuf/wrappers.proto\",\n\t}\n\tstdFDs := make([]*descriptorpb.FileDescriptorProto, 0, len(stdFileNames))\n\tfor _, fn := range stdFileNames {\n\t\tfd, err := protoregistry.GlobalFiles.FindFileByPath(fn)\n\t\tif err != nil {\n\t\t\t// ignore if error occurred.\n\t\t\tcontinue\n\t\t}\n\t\tstdFDs = append(stdFDs, protoutil.ProtoFromFileDescriptor(fd))\n\t}\n\treturn stdFDs\n}\n"
  },
  {
    "path": "resolver/type_conversion.go",
    "content": "package resolver\n\nimport (\n\t\"sort\"\n\n\t\"github.com/mercari/grpc-federation/types\"\n)\n\nfunc (decl *TypeConversionDecl) FQDN() string {\n\treturn decl.From.FQDN() + decl.To.FQDN()\n}\n\nfunc typeConversionDecls(fromType, toType *Type, convertedFQDNMap map[string]struct{}) []*TypeConversionDecl {\n\tif fromType == nil || toType == nil {\n\t\treturn nil\n\t}\n\tif fromType.IsNull || toType.IsNull {\n\t\treturn nil\n\t}\n\tif !requiredTypeConversion(fromType, toType) {\n\t\treturn nil\n\t}\n\tdecl := &TypeConversionDecl{From: fromType, To: toType}\n\tfqdn := decl.FQDN()\n\tif _, exists := convertedFQDNMap[fqdn]; exists {\n\t\treturn nil\n\t}\n\tconvertedFQDNMap[fqdn] = struct{}{}\n\tif fromType.Kind == types.Message && fromType.Message != nil && toType.Message != nil && fromType.Message.IsMapEntry {\n\t\t// map type\n\t\tfromMap := fromType.Message\n\t\ttoMap := toType.Message\n\t\tfromKey := fromMap.Field(\"key\")\n\t\ttoKey := toMap.Field(\"key\")\n\t\tfromValue := fromMap.Field(\"value\")\n\t\ttoValue := toMap.Field(\"value\")\n\t\tdecls := []*TypeConversionDecl{decl}\n\t\tif fromKey != nil && toKey != nil {\n\t\t\tdecls = append(decls, typeConversionDecls(fromKey.Type, toKey.Type, convertedFQDNMap)...)\n\t\t}\n\t\tif fromValue != nil && toValue != nil {\n\t\t\tdecls = append(decls, typeConversionDecls(fromValue.Type, toValue.Type, convertedFQDNMap)...)\n\t\t}\n\t\treturn decls\n\t}\n\tdecls := []*TypeConversionDecl{}\n\tswitch {\n\tcase fromType.Repeated:\n\t\tft := fromType.Clone()\n\t\ttt := toType.Clone()\n\t\tft.Repeated = false\n\t\ttt.Repeated = false\n\t\tif ft.Message.IsEnumSelector() && tt.Kind == types.Enum {\n\t\t\tdecls = append(decls, enumSelectorTypeConversionDecls(ft.Message, tt, convertedFQDNMap)...)\n\t\t\treturn decls\n\t\t}\n\t\tdecls = append(decls, &TypeConversionDecl{From: fromType, To: toType})\n\t\tdecls = append(decls, typeConversionDecls(ft, tt, convertedFQDNMap)...)\n\tcase fromType.OneofField != nil:\n\t\tdecls = append(decls, &TypeConversionDecl{From: fromType, To: toType})\n\t\tft := fromType.Clone()\n\t\ttt := toType.Clone()\n\t\tft.OneofField = nil\n\t\ttt.OneofField = nil\n\t\tdecls = append(decls, typeConversionDecls(ft, tt, convertedFQDNMap)...)\n\tcase fromType.Kind == types.Message:\n\t\tif fromType.Message.IsEnumSelector() && toType.Kind == types.Enum {\n\t\t\tdecls = append(decls, enumSelectorTypeConversionDecls(fromType.Message, toType, convertedFQDNMap)...)\n\t\t\treturn decls\n\t\t}\n\t\tdecls = append(decls, &TypeConversionDecl{From: fromType, To: toType})\n\t\tfor _, field := range toType.Message.Fields {\n\t\t\tfromField := fromType.Message.Field(field.Name)\n\t\t\tif fromField == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tdecls = append(decls, typeConversionDecls(fromField.Type, field.Type, convertedFQDNMap)...)\n\t\t}\n\tdefault:\n\t\tdecls = append(decls, &TypeConversionDecl{From: fromType, To: toType})\n\t}\n\treturn decls\n}\n\nfunc enumSelectorTypeConversionDecls(msg *Message, toType *Type, convertedFQDNMap map[string]struct{}) []*TypeConversionDecl {\n\tvar decls []*TypeConversionDecl\n\tif msg.IsEnumSelector() {\n\t\tfor _, field := range msg.Fields {\n\t\t\tif field.Type.Kind == types.Message && field.Type.Message.IsEnumSelector() {\n\t\t\t\tdecls = append(decls, enumSelectorTypeConversionDecls(field.Type.Message, toType, convertedFQDNMap)...)\n\t\t\t} else {\n\t\t\t\tdecls = append(decls, typeConversionDecls(field.Type, toType, convertedFQDNMap)...)\n\t\t\t}\n\t\t}\n\t}\n\treturn decls\n}\n\nfunc uniqueTypeConversionDecls(decls []*TypeConversionDecl) []*TypeConversionDecl {\n\tdeclMap := make(map[string]*TypeConversionDecl)\n\tfor _, decl := range decls {\n\t\tdeclMap[decl.FQDN()] = decl\n\t}\n\tret := make([]*TypeConversionDecl, 0, len(declMap))\n\tfor _, decl := range declMap {\n\t\tret = append(ret, decl)\n\t}\n\treturn ret\n}\n\nfunc sortTypeConversionDecls(decls []*TypeConversionDecl) []*TypeConversionDecl {\n\tsort.Slice(decls, func(i, j int) bool {\n\t\treturn decls[i].FQDN() < decls[j].FQDN()\n\t})\n\treturn decls\n}\n\nfunc requiredTypeConversion(fromType, toType *Type) bool {\n\tif fromType == nil || toType == nil {\n\t\treturn false\n\t}\n\tif fromType.OneofField != toType.OneofField {\n\t\treturn true\n\t}\n\tif fromType.Kind == types.Message {\n\t\tif fromType.Message.IsMapEntry {\n\t\t\tfromKey := fromType.Message.Field(\"key\")\n\t\t\tfromValue := fromType.Message.Field(\"value\")\n\t\t\ttoKey := toType.Message.Field(\"key\")\n\t\t\ttoValue := toType.Message.Field(\"value\")\n\t\t\tif fromKey == nil || fromValue == nil || toKey == nil || toValue == nil {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn requiredTypeConversion(fromKey.Type, toKey.Type) || requiredTypeConversion(fromValue.Type, toValue.Type)\n\t\t}\n\t\treturn fromType.Message != toType.Message\n\t}\n\tif fromType.Kind == types.Enum {\n\t\treturn fromType.Enum != toType.Enum\n\t}\n\treturn fromType.Kind != toType.Kind\n}\n"
  },
  {
    "path": "resolver/types.go",
    "content": "package resolver\n\nimport (\n\t\"log/slog\"\n\t\"time\"\n\n\texprv1 \"google.golang.org/genproto/googleapis/api/expr/v1alpha1\"\n\t\"google.golang.org/genproto/googleapis/rpc/code\"\n\t\"google.golang.org/protobuf/types/descriptorpb\"\n\n\t\"github.com/mercari/grpc-federation/source\"\n\t\"github.com/mercari/grpc-federation/types\"\n)\n\ntype Package struct {\n\tName  string\n\tFiles Files\n}\n\ntype CELPlugin struct {\n\tName       string\n\tDesc       string\n\tFunctions  []*CELFunction\n\tCapability *CELPluginCapability\n}\n\ntype CELPluginCapability struct {\n\tEnv        *CELPluginEnvCapability\n\tFileSystem *CELPluginFileSystemCapability\n\tNetwork    *CELPluginNetworkCapability\n}\n\ntype CELPluginEnvCapability struct {\n\tAll   bool\n\tNames []string\n}\n\ntype CELPluginFileSystemCapability struct {\n\tMountPath string\n}\n\ntype CELPluginNetworkCapability struct {\n}\n\ntype CELFunction struct {\n\tName     string\n\tID       string\n\tArgs     []*Type\n\tReturn   *Type\n\tReceiver *Message\n}\n\ntype File struct {\n\tPackage     *Package\n\tGoPackage   *GoPackage\n\tName        string\n\tDesc        *descriptorpb.FileDescriptorProto\n\tImportFiles []*File\n\tServices    []*Service\n\tMessages    []*Message\n\tEnums       []*Enum\n\tCELPlugins  []*CELPlugin\n}\n\ntype Files []*File\n\ntype GoPackage struct {\n\tName       string\n\tImportPath string\n\tAliasName  string\n}\n\ntype Service struct {\n\tFile        *File\n\tName        string\n\tDesc        *descriptorpb.ServiceDescriptorProto\n\tMethods     []*Method\n\tRule        *ServiceRule\n\tMessages    []*Message\n\tMessageArgs []*Message\n\tCELPlugins  []*CELPlugin\n}\n\ntype Method struct {\n\tService  *Service\n\tName     string\n\tDesc     *descriptorpb.MethodDescriptorProto\n\tRequest  *Message\n\tResponse *Message\n\tRule     *MethodRule\n}\n\ntype ServiceRule struct {\n\tEnv  *Env\n\tVars []*ServiceVariable\n}\n\ntype Env struct {\n\tVars []*EnvVar\n}\n\ntype EnvVar struct {\n\tName   string\n\tType   *Type\n\tOption *EnvVarOption\n}\n\ntype EnvVarOption struct {\n\tAlternate string\n\tDefault   string\n\tRequired  bool\n\tIgnored   bool\n}\n\ntype ServiceVariable struct {\n\tName string\n\tIf   *CELValue\n\tExpr *ServiceVariableExpr\n}\n\ntype ServiceVariableExpr struct {\n\tType       *Type\n\tBy         *CELValue\n\tMap        *MapExpr\n\tMessage    *MessageExpr\n\tEnum       *EnumExpr\n\tSwitch     *SwitchExpr\n\tValidation *ServiceVariableValidationExpr\n}\n\ntype ServiceVariableValidationExpr struct {\n\tIf      *CELValue\n\tMessage *CELValue\n}\n\ntype ServiceDependency struct {\n\tName    string\n\tService *Service\n}\n\ntype MethodRule struct {\n\tTimeout  *time.Duration\n\tResponse *Message\n}\n\ntype Message struct {\n\tFile           *File\n\tName           string\n\tDesc           *descriptorpb.DescriptorProto\n\tIsMapEntry     bool\n\tParentMessage  *Message\n\tNestedMessages []*Message\n\tEnums          []*Enum\n\tFields         []*Field\n\tOneofs         []*Oneof\n\tRule           *MessageRule\n}\n\ntype Enum struct {\n\tFile    *File\n\tName    string\n\tValues  []*EnumValue\n\tMessage *Message\n\tRule    *EnumRule\n}\n\ntype EnumRule struct {\n\tAliases []*Enum\n}\n\ntype EnumValue struct {\n\tValue string\n\tEnum  *Enum\n\tRule  *EnumValueRule\n}\n\ntype EnumValueRule struct {\n\tDefault bool\n\tNoAlias bool\n\tAliases []*EnumValueAlias\n\tAttrs   []*EnumValueAttribute\n}\n\ntype EnumValueAlias struct {\n\tEnumAlias *Enum\n\tAliases   []*EnumValue\n}\n\ntype EnumValueAttribute struct {\n\tName  string\n\tValue string\n}\n\ntype MessageRule struct {\n\tMessageArgument *Message\n\tCustomResolver  bool\n\tAliases         []*Message\n\tDefSet          *VariableDefinitionSet\n}\n\ntype VariableDefinitionSet struct {\n\tDefs   VariableDefinitions\n\tGroups []VariableDefinitionGroup\n\tGraph  *MessageDependencyGraph\n}\n\ntype VariableDefinition struct {\n\tIdx      int\n\tName     string\n\tIf       *CELValue\n\tAutoBind bool\n\tUsed     bool\n\tExpr     *VariableExpr\n\tbuilder  *source.VariableDefinitionOptionBuilder\n}\n\ntype VariableDefinitions []*VariableDefinition\n\ntype VariableDefinitionGroupType string\n\nconst (\n\tSequentialVariableDefinitionGroupType VariableDefinitionGroupType = \"sequential\"\n\tConcurrentVariableDefinitionGroupType VariableDefinitionGroupType = \"concurrent\"\n)\n\ntype VariableDefinitionGroup interface {\n\tType() VariableDefinitionGroupType\n\tVariableDefinitions() VariableDefinitions\n\ttreeFormat(*variableDefinitionGroupTreeFormatContext) string\n\tsetTextMaxLength(*variableDefinitionGroupTreeFormatContext)\n}\n\ntype variableDefinitionGroupTreeFormatContext struct {\n\tdepth            int\n\tdepthToMaxLength map[int]int\n\tdepthToIndent    map[int]int\n\tlineDepth        map[int]struct{}\n}\n\ntype SequentialVariableDefinitionGroup struct {\n\tStart VariableDefinitionGroup\n\tEnd   *VariableDefinition\n}\n\nfunc (g *SequentialVariableDefinitionGroup) Type() VariableDefinitionGroupType {\n\treturn SequentialVariableDefinitionGroupType\n}\n\ntype ConcurrentVariableDefinitionGroup struct {\n\tStarts []VariableDefinitionGroup\n\tEnd    *VariableDefinition\n}\n\nfunc (g *ConcurrentVariableDefinitionGroup) Type() VariableDefinitionGroupType {\n\treturn ConcurrentVariableDefinitionGroupType\n}\n\ntype VariableExpr struct {\n\tType       *Type\n\tBy         *CELValue\n\tMap        *MapExpr\n\tCall       *CallExpr\n\tMessage    *MessageExpr\n\tEnum       *EnumExpr\n\tSwitch     *SwitchExpr\n\tValidation *ValidationExpr\n}\n\ntype CallExpr struct {\n\tMethod   *Method\n\tRequest  *Request\n\tTimeout  *time.Duration\n\tRetry    *RetryPolicy\n\tOption   *GRPCCallOption\n\tMetadata *CELValue\n\tErrors   []*GRPCError\n}\n\ntype GRPCCallOption struct {\n\tHeader             *VariableDefinition\n\tTrailer            *VariableDefinition\n\tContentSubtype     *string\n\tMaxCallRecvMsgSize *int64\n\tMaxCallSendMsgSize *int64\n\tStaticMethod       *bool\n\tWaitForReady       *bool\n}\n\ntype MapExpr struct {\n\tIterator *Iterator\n\tExpr     *MapIteratorExpr\n}\n\ntype Iterator struct {\n\tName   string\n\tSource *VariableDefinition\n}\n\ntype MapIteratorExpr struct {\n\tType    *Type\n\tBy      *CELValue\n\tMessage *MessageExpr\n\tEnum    *EnumExpr\n}\n\ntype MessageExpr struct {\n\tMessage *Message\n\tArgs    []*Argument\n}\n\ntype EnumExpr struct {\n\tEnum *Enum\n\tBy   *CELValue\n}\n\ntype ValidationExpr struct {\n\tName  string\n\tError *GRPCError\n}\n\ntype SwitchExpr struct {\n\tType    *Type\n\tCases   []*SwitchCaseExpr\n\tDefault *SwitchDefaultExpr\n}\n\ntype SwitchCaseExpr struct {\n\tDefSet *VariableDefinitionSet\n\tIf     *CELValue\n\tBy     *CELValue\n}\n\ntype SwitchDefaultExpr struct {\n\tDefSet *VariableDefinitionSet\n\tBy     *CELValue\n}\n\ntype GRPCError struct {\n\tDefSet            *VariableDefinitionSet\n\tIf                *CELValue\n\tCode              *code.Code\n\tMessage           *CELValue\n\tDetails           GRPCErrorDetails\n\tIgnore            bool\n\tIgnoreAndResponse *CELValue\n\tLogLevel          slog.Level\n}\n\ntype GRPCErrorDetails []*GRPCErrorDetail\n\ntype GRPCErrorDetail struct {\n\tIf                   *CELValue\n\tDefSet               *VariableDefinitionSet\n\tBy                   []*CELValue\n\tMessages             *VariableDefinitionSet\n\tPreconditionFailures []*PreconditionFailure\n\tBadRequests          []*BadRequest\n\tLocalizedMessages    []*LocalizedMessage\n}\n\ntype PreconditionFailure struct {\n\tViolations []*PreconditionFailureViolation\n}\n\ntype PreconditionFailureViolation struct {\n\tType        *CELValue\n\tSubject     *CELValue\n\tDescription *CELValue\n}\n\ntype BadRequest struct {\n\tFieldViolations []*BadRequestFieldViolation\n}\n\ntype BadRequestFieldViolation struct {\n\tField       *CELValue\n\tDescription *CELValue\n}\n\ntype LocalizedMessage struct {\n\tLocale  string\n\tMessage *CELValue\n}\n\ntype TypeConversionDecl struct {\n\tFrom *Type\n\tTo   *Type\n}\n\ntype Oneof struct {\n\tName    string\n\tMessage *Message\n\tFields  []*Field\n}\n\ntype Field struct {\n\tName    string\n\tDesc    *descriptorpb.FieldDescriptorProto\n\tType    *Type\n\tOneof   *Oneof\n\tRule    *FieldRule\n\tMessage *Message\n}\n\ntype OneofField struct {\n\t*Field\n}\n\ntype AutoBindField struct {\n\tVariableDefinition *VariableDefinition\n\tField              *Field\n}\n\ntype FieldRule struct {\n\t// Value value to bind to field.\n\tValue *Value\n\t// CustomResolver whether `custom_resolver = true` is set in grpc.federation.field option.\n\tCustomResolver bool\n\t// MessageCustomResolver whether `custom_resolver = true` is set in grpc.federation.message option.\n\tMessageCustomResolver bool\n\t// Aliases valid if `alias` is specified in grpc.federation.field option.\n\tAliases []*Field\n\t// AutoBindField valid if `autobind = true` is specified in resolver.response of grpc.federation.message option.\n\tAutoBindField *AutoBindField\n\t// Oneof represents oneof for field option.\n\tOneof *FieldOneofRule\n\t// Env option for environment variable.\n\tEnv *EnvVarOption\n}\n\n// FieldOneofRule represents grpc.federation.field.oneof.\ntype FieldOneofRule struct {\n\tIf      *CELValue\n\tDefault bool\n\tBy      *CELValue\n\tDefSet  *VariableDefinitionSet\n}\n\ntype AllMessageDependencyGraph struct {\n\tRoots []*AllMessageDependencyGraphNode\n}\n\ntype AllMessageDependencyGraphNode struct {\n\tParent   []*AllMessageDependencyGraphNode\n\tChildren []*AllMessageDependencyGraphNode\n\tMessage  *Message\n}\n\ntype MessageDependencyGraph struct {\n\tRoots []*MessageDependencyGraphNode\n}\n\ntype MessageDependencyGraphNode struct {\n\tParent             []*MessageDependencyGraphNode\n\tChildren           []*MessageDependencyGraphNode\n\tParentMap          map[*MessageDependencyGraphNode]struct{}\n\tChildrenMap        map[*MessageDependencyGraphNode]struct{}\n\tBaseMessage        *Message\n\tVariableDefinition *VariableDefinition\n}\n\ntype Type struct {\n\tKind       types.Kind\n\tIsNull     bool\n\tRepeated   bool\n\tMessage    *Message\n\tEnum       *Enum\n\tOneofField *OneofField\n}\n\nfunc (t *Type) Clone() *Type {\n\treturn &Type{\n\t\tKind:       t.Kind,\n\t\tRepeated:   t.Repeated,\n\t\tIsNull:     t.IsNull,\n\t\tMessage:    t.Message,\n\t\tEnum:       t.Enum,\n\t\tOneofField: t.OneofField,\n\t}\n}\n\nfunc (t *Type) IsNumber() bool {\n\tswitch t.Kind {\n\tcase types.Double,\n\t\ttypes.Float,\n\t\ttypes.Int64,\n\t\ttypes.Uint64,\n\t\ttypes.Int32,\n\t\ttypes.Fixed64,\n\t\ttypes.Fixed32,\n\t\ttypes.Uint32,\n\t\ttypes.Sfixed32,\n\t\ttypes.Sfixed64,\n\t\ttypes.Sint32,\n\t\ttypes.Sint64:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (t *Type) IsNumberWrapper() bool {\n\tif t == nil {\n\t\treturn false\n\t}\n\t_, exists := WrapperNumberTypeMap[t.FQDN()]\n\treturn exists\n}\n\nfunc (t *Type) IsEnumSelector() bool {\n\treturn t.Kind == types.Message && t.Message != nil && t.Message.IsEnumSelector()\n}\n\ntype MethodCall struct {\n\tMethod  *Method\n\tRequest *Request\n\tTimeout *time.Duration\n\tRetry   *RetryPolicy\n}\n\ntype RetryPolicy struct {\n\tIf          *CELValue\n\tConstant    *RetryPolicyConstant\n\tExponential *RetryPolicyExponential\n}\n\nfunc (p *RetryPolicy) MaxRetries() uint64 {\n\tif p.Constant != nil {\n\t\treturn p.Constant.MaxRetries\n\t}\n\tif p.Exponential != nil {\n\t\treturn p.Exponential.MaxRetries\n\t}\n\treturn 0\n}\n\ntype RetryPolicyConstant struct {\n\tInterval   time.Duration\n\tMaxRetries uint64\n}\n\ntype RetryPolicyExponential struct {\n\tInitialInterval     time.Duration\n\tRandomizationFactor float64\n\tMultiplier          float64\n\tMaxInterval         time.Duration\n\tMaxRetries          uint64\n\tMaxElapsedTime      time.Duration\n}\n\ntype Request struct {\n\tArgs []*Argument\n\tType *Message\n}\n\ntype GRPCErrorIndexes struct {\n\tDefIdx       int\n\tErrDetailIdx int\n}\n\ntype Argument struct {\n\tName  string\n\tType  *Type\n\tValue *Value\n\tIf    *CELValue\n}\n\ntype Value struct {\n\tInline bool\n\tCEL    *CELValue\n}\n\ntype CELValue struct {\n\tExpr        string\n\tOut         *Type\n\tCheckedExpr *exprv1.CheckedExpr\n}\n\ntype EnvKey string\n\nvar (\n\tDoubleType           = &Type{Kind: types.Double}\n\tFloatType            = &Type{Kind: types.Float}\n\tInt32Type            = &Type{Kind: types.Int32}\n\tInt64Type            = &Type{Kind: types.Int64}\n\tUint32Type           = &Type{Kind: types.Uint32}\n\tUint64Type           = &Type{Kind: types.Uint64}\n\tSint32Type           = &Type{Kind: types.Sint32}\n\tSint64Type           = &Type{Kind: types.Sint64}\n\tFixed32Type          = &Type{Kind: types.Fixed32}\n\tFixed64Type          = &Type{Kind: types.Fixed64}\n\tSfixed32Type         = &Type{Kind: types.Sfixed32}\n\tSfixed64Type         = &Type{Kind: types.Sfixed64}\n\tBoolType             = &Type{Kind: types.Bool}\n\tStringType           = &Type{Kind: types.String}\n\tBytesType            = &Type{Kind: types.Bytes}\n\tEnumType             = &Type{Kind: types.Enum}\n\tEnvType              = &Type{Kind: types.String}\n\tNullType             = &Type{IsNull: true}\n\tDoubleRepeatedType   = &Type{Kind: types.Double, Repeated: true}\n\tFloatRepeatedType    = &Type{Kind: types.Float, Repeated: true}\n\tInt32RepeatedType    = &Type{Kind: types.Int32, Repeated: true}\n\tInt64RepeatedType    = &Type{Kind: types.Int64, Repeated: true}\n\tUint32RepeatedType   = &Type{Kind: types.Uint32, Repeated: true}\n\tUint64RepeatedType   = &Type{Kind: types.Uint64, Repeated: true}\n\tSint32RepeatedType   = &Type{Kind: types.Sint32, Repeated: true}\n\tSint64RepeatedType   = &Type{Kind: types.Sint64, Repeated: true}\n\tFixed32RepeatedType  = &Type{Kind: types.Fixed32, Repeated: true}\n\tFixed64RepeatedType  = &Type{Kind: types.Fixed64, Repeated: true}\n\tSfixed32RepeatedType = &Type{Kind: types.Sfixed32, Repeated: true}\n\tSfixed64RepeatedType = &Type{Kind: types.Sfixed64, Repeated: true}\n\tBoolRepeatedType     = &Type{Kind: types.Bool, Repeated: true}\n\tStringRepeatedType   = &Type{Kind: types.String, Repeated: true}\n\tBytesRepeatedType    = &Type{Kind: types.Bytes, Repeated: true}\n\tEnumRepeatedType     = &Type{Kind: types.Enum, Repeated: true}\n\tEnvRepeatedType      = &Type{Kind: types.String, Repeated: true}\n)\n"
  },
  {
    "path": "resolver/value.go",
    "content": "package resolver\n\nimport (\n\t\"github.com/mercari/grpc-federation/grpc/federation\"\n)\n\nfunc (v *Value) Type() *Type {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tif v.CEL != nil {\n\t\treturn v.CEL.Out\n\t}\n\treturn nil\n}\n\nfunc (v *Value) ReferenceNames() []string {\n\tif v == nil {\n\t\treturn nil\n\t}\n\treturn v.CEL.ReferenceNames()\n}\n\nfunc (v *CELValue) ReferenceNames() []string {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tif v.CheckedExpr == nil {\n\t\treturn nil\n\t}\n\n\tvar refNames []string\n\titerVarMap := make(map[string]struct{})\n\tif cmp := v.CheckedExpr.GetExpr().GetComprehensionExpr(); cmp != nil {\n\t\tif iterVar := cmp.GetIterVar(); iterVar != \"\" {\n\t\t\titerVarMap[iterVar] = struct{}{}\n\t\t}\n\t\tif iterVar := cmp.GetIterVar2(); iterVar != \"\" {\n\t\t\titerVarMap[iterVar] = struct{}{}\n\t\t}\n\t}\n\tfor _, ref := range v.CheckedExpr.ReferenceMap {\n\t\tif ref.Name == federation.MessageArgumentVariableName {\n\t\t\tcontinue\n\t\t}\n\t\t// Name can be empty sting if the reference points to a function\n\t\tif ref.Name == \"\" {\n\t\t\tcontinue\n\t\t}\n\t\tif _, exists := iterVarMap[ref.Name]; exists {\n\t\t\tcontinue\n\t\t}\n\t\trefNames = append(refNames, ref.Name)\n\t}\n\treturn refNames\n}\n\ntype commonValueDef struct {\n\tCustomResolver *bool\n\tBy             *string\n\tInline         *string\n\tAlias          *string\n}\n\nfunc (def *commonValueDef) GetBy() string {\n\tif def != nil && def.By != nil {\n\t\treturn *def.By\n\t}\n\treturn \"\"\n}\n\nfunc (def *commonValueDef) GetInline() string {\n\tif def != nil && def.Inline != nil {\n\t\treturn *def.Inline\n\t}\n\treturn \"\"\n}\n\nfunc (def *commonValueDef) GetAlias() string {\n\tif def != nil && def.Alias != nil {\n\t\treturn *def.Alias\n\t}\n\treturn \"\"\n}\n\nfunc fieldRuleToCommonValueDef(def *federation.FieldRule) *commonValueDef {\n\treturn &commonValueDef{\n\t\tCustomResolver: def.CustomResolver,\n\t\tBy:             def.By,\n\t\tAlias:          def.Alias,\n\t}\n}\n\nfunc methodRequestToCommonValueDef(def *federation.MethodRequest) *commonValueDef {\n\treturn &commonValueDef{\n\t\tBy: def.By,\n\t}\n}\n\nfunc argumentToCommonValueDef(def *federation.Argument) *commonValueDef {\n\treturn &commonValueDef{\n\t\tBy:     def.By,\n\t\tInline: def.Inline,\n\t}\n}\n\nfunc NewByValue(expr string, out *Type) *Value {\n\treturn &Value{\n\t\tCEL: &CELValue{\n\t\t\tExpr: expr,\n\t\t\tOut:  out,\n\t\t},\n\t}\n}\n"
  },
  {
    "path": "resolver/wellknown_types.go",
    "content": "package resolver\n\nvar (\n\tAnyType              *Type\n\tTimestampType        *Type\n\tDurationType         *Type\n\tDurationRepeatedType *Type\n\tEmptyType            *Type\n\tInt64ValueType       *Type\n\tInt32ValueType       *Type\n\tUint64ValueType      *Type\n\tUint32ValueType      *Type\n\tDoubleValueType      *Type\n\tFloatValueType       *Type\n\tBytesValueType       *Type\n\tBoolValueType        *Type\n\tStringValueType      *Type\n\tWrapperNumberTypeMap map[string]struct{}\n)\n\nfunc init() {\n\tfiles, err := New(nil).ResolveWellknownFiles()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tfor _, file := range files.FindByPackageName(\"google.protobuf\") {\n\t\tif msg := file.Message(\"Any\"); msg != nil {\n\t\t\tAnyType = NewMessageType(msg, false)\n\t\t}\n\t\tif msg := file.Message(\"Timestamp\"); msg != nil {\n\t\t\tTimestampType = NewMessageType(msg, false)\n\t\t}\n\t\tif msg := file.Message(\"Duration\"); msg != nil {\n\t\t\tDurationType = NewMessageType(msg, false)\n\t\t\tDurationRepeatedType = NewMessageType(msg, true)\n\t\t}\n\t\tif msg := file.Message(\"Empty\"); msg != nil {\n\t\t\tEmptyType = NewMessageType(msg, false)\n\t\t}\n\t\tif msg := file.Message(\"Int64Value\"); msg != nil {\n\t\t\tInt64ValueType = NewMessageType(msg, false)\n\t\t}\n\t\tif msg := file.Message(\"UInt64Value\"); msg != nil {\n\t\t\tUint64ValueType = NewMessageType(msg, false)\n\t\t}\n\t\tif msg := file.Message(\"Int32Value\"); msg != nil {\n\t\t\tInt32ValueType = NewMessageType(msg, false)\n\t\t}\n\t\tif msg := file.Message(\"UInt32Value\"); msg != nil {\n\t\t\tUint32ValueType = NewMessageType(msg, false)\n\t\t}\n\t\tif msg := file.Message(\"BoolValue\"); msg != nil {\n\t\t\tBoolValueType = NewMessageType(msg, false)\n\t\t}\n\t\tif msg := file.Message(\"BytesValue\"); msg != nil {\n\t\t\tBytesValueType = NewMessageType(msg, false)\n\t\t}\n\t\tif msg := file.Message(\"FloatValue\"); msg != nil {\n\t\t\tFloatValueType = NewMessageType(msg, false)\n\t\t}\n\t\tif msg := file.Message(\"DoubleValue\"); msg != nil {\n\t\t\tDoubleValueType = NewMessageType(msg, false)\n\t\t}\n\t\tif msg := file.Message(\"StringValue\"); msg != nil {\n\t\t\tStringValueType = NewMessageType(msg, false)\n\t\t}\n\t}\n\tWrapperNumberTypeMap = map[string]struct{}{\n\t\tInt64ValueType.FQDN():  {},\n\t\tUint64ValueType.FQDN(): {},\n\t\tInt32ValueType.FQDN():  {},\n\t\tUint32ValueType.FQDN(): {},\n\t\tDoubleValueType.FQDN(): {},\n\t\tFloatValueType.FQDN():  {},\n\t}\n}\n"
  },
  {
    "path": "source/clone.go",
    "content": "package source\n\nfunc (loc *Location) Clone() *Location {\n\tif loc == nil {\n\t\treturn nil\n\t}\n\treturn &Location{\n\t\tFileName:  loc.FileName,\n\t\tExport:    loc.Export.Clone(),\n\t\tGoPackage: loc.GoPackage,\n\t\tService:   loc.Service.Clone(),\n\t\tMessage:   loc.Message.Clone(),\n\t\tEnum:      loc.Enum.Clone(),\n\t}\n}\n\nfunc (e *Export) Clone() *Export {\n\tif e == nil {\n\t\treturn nil\n\t}\n\treturn &Export{\n\t\tName:      e.Name,\n\t\tWasm:      e.Wasm.Clone(),\n\t\tTypes:     e.Types.Clone(),\n\t\tFunctions: e.Functions.Clone(),\n\t}\n}\n\nfunc (w *Wasm) Clone() *Wasm {\n\tif w == nil {\n\t\treturn nil\n\t}\n\treturn &Wasm{\n\t\tURL:    w.URL,\n\t\tSha256: w.Sha256,\n\t}\n}\n\nfunc (t *PluginType) Clone() *PluginType {\n\tif t == nil {\n\t\treturn nil\n\t}\n\treturn &PluginType{\n\t\tIdx:     t.Idx,\n\t\tName:    t.Name,\n\t\tMethods: t.Methods.Clone(),\n\t}\n}\n\nfunc (f *PluginFunction) Clone() *PluginFunction {\n\tif f == nil {\n\t\treturn nil\n\t}\n\treturn &PluginFunction{\n\t\tIdx:        f.Idx,\n\t\tName:       f.Name,\n\t\tArgs:       f.Args.Clone(),\n\t\tReturnType: f.ReturnType,\n\t}\n}\n\nfunc (a *PluginFunctionArgument) Clone() *PluginFunctionArgument {\n\tif a == nil {\n\t\treturn nil\n\t}\n\treturn &PluginFunctionArgument{\n\t\tIdx:  a.Idx,\n\t\tType: a.Type,\n\t}\n}\n\nfunc (s *Service) Clone() *Service {\n\tif s == nil {\n\t\treturn nil\n\t}\n\treturn &Service{\n\t\tName:   s.Name,\n\t\tMethod: s.Method.Clone(),\n\t\tOption: s.Option.Clone(),\n\t}\n}\n\nfunc (m *Method) Clone() *Method {\n\tif m == nil {\n\t\treturn nil\n\t}\n\treturn &Method{\n\t\tName:     m.Name,\n\t\tRequest:  m.Request,\n\t\tResponse: m.Response,\n\t\tOption:   m.Option.Clone(),\n\t}\n}\n\nfunc (o *ServiceOption) Clone() *ServiceOption {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn &ServiceOption{\n\t\tEnv: o.Env.Clone(),\n\t\tVar: o.Var.Clone(),\n\t}\n}\n\nfunc (e *Env) Clone() *Env {\n\tif e == nil {\n\t\treturn nil\n\t}\n\treturn &Env{\n\t\tMessage: e.Message,\n\t\tVar:     e.Var.Clone(),\n\t}\n}\n\nfunc (v *EnvVar) Clone() *EnvVar {\n\tif v == nil {\n\t\treturn nil\n\t}\n\treturn &EnvVar{\n\t\tIdx:    v.Idx,\n\t\tName:   v.Name,\n\t\tType:   v.Type,\n\t\tOption: v.Option.Clone(),\n\t}\n}\n\nfunc (o *EnvVarOption) Clone() *EnvVarOption {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn &EnvVarOption{\n\t\tAlternate: o.Alternate,\n\t\tDefault:   o.Default,\n\t\tRequired:  o.Required,\n\t\tIgnored:   o.Ignored,\n\t}\n}\n\nfunc (sv *ServiceVariable) Clone() *ServiceVariable {\n\tif sv == nil {\n\t\treturn nil\n\t}\n\treturn &ServiceVariable{\n\t\tIdx:        sv.Idx,\n\t\tName:       sv.Name,\n\t\tIf:         sv.If,\n\t\tBy:         sv.By,\n\t\tMap:        sv.Map.Clone(),\n\t\tMessage:    sv.Message.Clone(),\n\t\tEnum:       sv.Enum.Clone(),\n\t\tSwitch:     sv.Switch.Clone(),\n\t\tValidation: sv.Validation.Clone(),\n\t}\n}\n\nfunc (v *ServiceVariableValidationExpr) Clone() *ServiceVariableValidationExpr {\n\tif v == nil {\n\t\treturn nil\n\t}\n\treturn &ServiceVariableValidationExpr{\n\t\tIf:      v.If,\n\t\tMessage: v.Message,\n\t}\n}\n\nfunc (o *MethodOption) Clone() *MethodOption {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn &MethodOption{\n\t\tTimeout:  o.Timeout,\n\t\tResponse: o.Response,\n\t}\n}\n\nfunc (e *Enum) Clone() *Enum {\n\tif e == nil {\n\t\treturn nil\n\t}\n\treturn &Enum{\n\t\tName:   e.Name,\n\t\tOption: e.Option.Clone(),\n\t\tValue:  e.Value.Clone(),\n\t}\n}\n\nfunc (o *EnumOption) Clone() *EnumOption {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn &EnumOption{\n\t\tAlias: o.Alias,\n\t}\n}\n\nfunc (v *EnumValue) Clone() *EnumValue {\n\tif v == nil {\n\t\treturn nil\n\t}\n\treturn &EnumValue{\n\t\tValue:  v.Value,\n\t\tOption: v.Option.Clone(),\n\t}\n}\n\nfunc (o *EnumValueOption) Clone() *EnumValueOption {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn &EnumValueOption{\n\t\tAlias:   o.Alias,\n\t\tDefault: o.Default,\n\t\tAttr:    o.Attr.Clone(),\n\t}\n}\n\nfunc (a *EnumValueAttribute) Clone() *EnumValueAttribute {\n\tif a == nil {\n\t\treturn nil\n\t}\n\treturn &EnumValueAttribute{\n\t\tIdx:   a.Idx,\n\t\tName:  a.Name,\n\t\tValue: a.Value,\n\t}\n}\n\nfunc (m *Message) Clone() *Message {\n\tif m == nil {\n\t\treturn nil\n\t}\n\treturn &Message{\n\t\tName:          m.Name,\n\t\tOption:        m.Option.Clone(),\n\t\tField:         m.Field.Clone(),\n\t\tEnum:          m.Enum.Clone(),\n\t\tOneof:         m.Oneof.Clone(),\n\t\tNestedMessage: m.NestedMessage.Clone(),\n\t}\n}\n\nfunc (f *Field) Clone() *Field {\n\tif f == nil {\n\t\treturn nil\n\t}\n\treturn &Field{\n\t\tName:   f.Name,\n\t\tOption: f.Option.Clone(),\n\t}\n}\n\nfunc (o *FieldOption) Clone() *FieldOption {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn &FieldOption{\n\t\tBy:    o.By,\n\t\tAlias: o.Alias,\n\t\tOneof: o.Oneof.Clone(),\n\t}\n}\n\nfunc (o *FieldOneof) Clone() *FieldOneof {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn &FieldOneof{\n\t\tIf:      o.If,\n\t\tDefault: o.Default,\n\t\tDef:     o.Def.Clone(),\n\t\tBy:      o.By,\n\t}\n}\n\nfunc (o *Oneof) Clone() *Oneof {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn &Oneof{\n\t\tName:   o.Name,\n\t\tOption: o.Option,\n\t\tField:  o.Field.Clone(),\n\t}\n}\n\nfunc (o *OneofOption) Clone() *OneofOption {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn &OneofOption{}\n}\n\nfunc (o *MessageOption) Clone() *MessageOption {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn &MessageOption{\n\t\tDef:   o.Def.Clone(),\n\t\tAlias: o.Alias,\n\t}\n}\n\nfunc (o *VariableDefinitionOption) Clone() *VariableDefinitionOption {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn &VariableDefinitionOption{\n\t\tIdx:        o.Idx,\n\t\tName:       o.Name,\n\t\tIf:         o.If,\n\t\tBy:         o.By,\n\t\tMap:        o.Map.Clone(),\n\t\tCall:       o.Call.Clone(),\n\t\tMessage:    o.Message.Clone(),\n\t\tEnum:       o.Enum.Clone(),\n\t\tSwitch:     o.Switch.Clone(),\n\t\tValidation: o.Validation.Clone(),\n\t}\n}\n\nfunc (o *MapExprOption) Clone() *MapExprOption {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn &MapExprOption{\n\t\tIterator: o.Iterator.Clone(),\n\t\tBy:       o.By,\n\t\tMessage:  o.Message.Clone(),\n\t\tEnum:     o.Enum.Clone(),\n\t}\n}\n\nfunc (o *IteratorOption) Clone() *IteratorOption {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn &IteratorOption{\n\t\tName:   o.Name,\n\t\tSource: o.Source,\n\t}\n}\n\nfunc (o *CallExprOption) Clone() *CallExprOption {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn &CallExprOption{\n\t\tMethod:   o.Method,\n\t\tRequest:  o.Request.Clone(),\n\t\tTimeout:  o.Timeout,\n\t\tRetry:    o.Retry.Clone(),\n\t\tError:    o.Error.Clone(),\n\t\tOption:   o.Option.Clone(),\n\t\tMetadata: o.Metadata,\n\t}\n}\n\nfunc (o *GRPCCallOption) Clone() *GRPCCallOption {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn &GRPCCallOption{\n\t\tContentSubtype:     o.ContentSubtype,\n\t\tHeader:             o.Header,\n\t\tTrailer:            o.Trailer,\n\t\tMaxCallRecvMsgSize: o.MaxCallRecvMsgSize,\n\t\tMaxCallSendMsgSize: o.MaxCallSendMsgSize,\n\t\tStaticMethod:       o.StaticMethod,\n\t\tWaitForReady:       o.WaitForReady,\n\t}\n}\n\nfunc (o *MessageExprOption) Clone() *MessageExprOption {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn &MessageExprOption{\n\t\tName: o.Name,\n\t\tArgs: o.Args.Clone(),\n\t}\n}\n\nfunc (o *EnumExprOption) Clone() *EnumExprOption {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn &EnumExprOption{\n\t\tName: o.Name,\n\t\tBy:   o.By,\n\t}\n}\n\nfunc (o *RequestOption) Clone() *RequestOption {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn &RequestOption{\n\t\tIdx:   o.Idx,\n\t\tField: o.Field,\n\t\tBy:    o.By,\n\t}\n}\n\nfunc (o *RetryOption) Clone() *RetryOption {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn &RetryOption{\n\t\tConstant:    o.Constant.Clone(),\n\t\tExponential: o.Exponential.Clone(),\n\t}\n}\n\nfunc (o *RetryConstantOption) Clone() *RetryConstantOption {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn &RetryConstantOption{\n\t\tInterval:   o.Interval,\n\t\tMaxRetries: o.MaxRetries,\n\t}\n}\n\nfunc (o *RetryExponentialOption) Clone() *RetryExponentialOption {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn &RetryExponentialOption{\n\t\tInitialInterval:     o.InitialInterval,\n\t\tRandomizationFactor: o.RandomizationFactor,\n\t\tMultiplier:          o.Multiplier,\n\t\tMaxInterval:         o.MaxInterval,\n\t\tMaxRetries:          o.MaxRetries,\n\t}\n}\n\nfunc (o *ArgumentOption) Clone() *ArgumentOption {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn &ArgumentOption{\n\t\tIdx:    o.Idx,\n\t\tName:   o.Name,\n\t\tBy:     o.By,\n\t\tInline: o.Inline,\n\t}\n}\n\nfunc (o *ValidationExprOption) Clone() *ValidationExprOption {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn &ValidationExprOption{\n\t\tName:  o.Name,\n\t\tError: o.Error.Clone(),\n\t}\n}\n\nfunc (o *GRPCErrorOption) Clone() *GRPCErrorOption {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn &GRPCErrorOption{\n\t\tIdx:     o.Idx,\n\t\tDef:     o.Def.Clone(),\n\t\tIf:      o.If,\n\t\tCode:    o.Code,\n\t\tMessage: o.Message,\n\t\tIgnore:  o.Ignore,\n\t\tDetail:  o.Detail.Clone(),\n\t}\n}\n\nfunc (o *GRPCErrorDetailOption) Clone() *GRPCErrorDetailOption {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn &GRPCErrorDetailOption{\n\t\tIdx:                 o.Idx,\n\t\tDef:                 o.Def.Clone(),\n\t\tIf:                  o.If,\n\t\tMessage:             o.Message.Clone(),\n\t\tPreconditionFailure: o.PreconditionFailure.Clone(),\n\t\tBadRequest:          o.BadRequest.Clone(),\n\t\tLocalizedMessage:    o.LocalizedMessage.Clone(),\n\t}\n}\n\nfunc (o *GRPCErrorDetailPreconditionFailureOption) Clone() *GRPCErrorDetailPreconditionFailureOption {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn &GRPCErrorDetailPreconditionFailureOption{\n\t\tIdx:       o.Idx,\n\t\tViolation: o.Violation,\n\t}\n}\n\nfunc (o *GRPCErrorDetailBadRequestOption) Clone() *GRPCErrorDetailBadRequestOption {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn &GRPCErrorDetailBadRequestOption{\n\t\tIdx:            o.Idx,\n\t\tFieldViolation: o.FieldViolation,\n\t}\n}\n\nfunc (o *GRPCErrorDetailLocalizedMessageOption) Clone() *GRPCErrorDetailLocalizedMessageOption {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn &GRPCErrorDetailLocalizedMessageOption{\n\t\tIdx:       o.Idx,\n\t\tFieldName: o.FieldName,\n\t}\n}\n\nfunc (o *SwitchExprOption) Clone() *SwitchExprOption {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn &SwitchExprOption{\n\t\tCase:    o.Case.Clone(),\n\t\tDefault: o.Default.Clone(),\n\t}\n}\n\nfunc (o *SwitchCaseExprOption) Clone() *SwitchCaseExprOption {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn &SwitchCaseExprOption{\n\t\tIdx: o.Idx,\n\t\tDef: o.Def.Clone(),\n\t\tIf:  o.If,\n\t\tBy:  o.By,\n\t}\n}\n\nfunc (o *SwitchDefaultExprOption) Clone() *SwitchDefaultExprOption {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn &SwitchDefaultExprOption{\n\t\tDef: o.Def.Clone(),\n\t\tBy:  o.By,\n\t}\n}\n"
  },
  {
    "path": "source/file.go",
    "content": "package source\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/bufbuild/protocompile/ast\"\n\t\"github.com/bufbuild/protocompile/parser\"\n\t\"github.com/bufbuild/protocompile/reporter\"\n)\n\nconst (\n\tfileOptionName      = \"grpc.federation.file\"\n\tserviceOptionName   = \"grpc.federation.service\"\n\tmethodOptionName    = \"grpc.federation.method\"\n\tmsgOptionName       = \"grpc.federation.message\"\n\toneofOptionName     = \"grpc.federation.oneof\"\n\tfieldOptionName     = \"grpc.federation.field\"\n\tenumOptionName      = \"grpc.federation.enum\"\n\tenumValueOptionName = \"grpc.federation.enum_value\"\n)\n\nvar _ io.ReadCloser = new(File)\n\ntype File struct {\n\tpath     string\n\tcontent  []byte\n\tbuf      *bytes.Buffer\n\tfileNode *ast.FileNode\n}\n\ntype ignoreErrorReporter struct{}\n\nfunc (*ignoreErrorReporter) Error(pos reporter.ErrorWithPos) error { return nil }\nfunc (*ignoreErrorReporter) Warning(pos reporter.ErrorWithPos)     {}\n\nfunc NewFile(path string, content []byte) (*File, error) {\n\tfileName := filepath.Base(path)\n\n\tfileNode, err := func() (f *ast.FileNode, e error) {\n\t\tdefer func() {\n\t\t\tif err := recover(); err != nil {\n\t\t\t\te = fmt.Errorf(\"failed to parse %s: %v\", path, err)\n\t\t\t}\n\t\t}()\n\t\treturn parser.Parse(\n\t\t\tfileName,\n\t\t\tbytes.NewBuffer(content),\n\t\t\treporter.NewHandler(&ignoreErrorReporter{}),\n\t\t)\n\t}()\n\t// If fileNode is nil, an error is returned.\n\t// otherwise, no error is returned even if a syntax error occurs.\n\tif fileNode == nil {\n\t\treturn nil, err\n\t}\n\treturn &File{\n\t\tpath:     path,\n\t\tcontent:  content,\n\t\tbuf:      bytes.NewBuffer(content),\n\t\tfileNode: fileNode,\n\t}, nil\n}\n\nfunc (f *File) Read(b []byte) (int, error) {\n\treturn f.buf.Read(b)\n}\n\nfunc (f *File) Close() error {\n\treturn nil\n}\n\nfunc (f *File) AST() *ast.FileNode {\n\treturn f.fileNode\n}\n\nfunc (f *File) Path() string {\n\treturn f.path\n}\n\nfunc (f *File) Content() []byte {\n\treturn f.content\n}\n\nfunc (f *File) Imports() []string {\n\tvar imports []string\n\tfor _, decl := range f.fileNode.Decls {\n\t\tswitch declNode := decl.(type) {\n\t\tcase *ast.ImportNode:\n\t\t\timports = append(imports, declNode.Name.AsString())\n\t\t}\n\t}\n\treturn imports\n}\n\n// ImportsByImportRule returns import path defined in grpc.federation.file.import rule.\nfunc (f *File) ImportsByImportRule() []string {\n\tvar imports []string\n\tfor _, decl := range f.fileNode.Decls {\n\t\tswitch declNode := decl.(type) {\n\t\tcase *ast.OptionNode:\n\t\t\tfor _, value := range f.importPathValuesByImportRule(declNode) {\n\t\t\t\timports = append(imports, value.AsString())\n\t\t\t}\n\t\t}\n\t}\n\treturn imports\n}\n\n// FindLocationByPos returns the corresponding location information from the position in the source code.\nfunc (f *File) FindLocationByPos(pos Position) *Location {\n\tbuilder := NewLocationBuilder(f.Path())\n\tfor _, decl := range f.fileNode.Decls {\n\t\tswitch n := decl.(type) {\n\t\tcase *ast.ImportNode:\n\t\t\tif found := f.findImportByPos(\n\t\t\t\tbuilder.WithImportName(n.Name.AsString()),\n\t\t\t\tpos, n,\n\t\t\t); found != nil {\n\t\t\t\treturn found\n\t\t\t}\n\t\tcase *ast.OptionNode:\n\t\t\tif !f.matchOption(f.optionName(n), fileOptionName) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif found := f.findFileOptionByPos(\n\t\t\t\tbuilder,\n\t\t\t\tpos, n,\n\t\t\t); found != nil {\n\t\t\t\treturn found\n\t\t\t}\n\t\tcase *ast.MessageNode:\n\t\t\tif found := f.findMessageByPos(\n\t\t\t\tbuilder.WithMessage(string(n.Name.AsIdentifier())),\n\t\t\t\tpos, n,\n\t\t\t); found != nil {\n\t\t\t\treturn found\n\t\t\t}\n\t\tcase *ast.EnumNode:\n\t\t\tif found := f.findEnumByPos(\n\t\t\t\tbuilder.WithEnum(string(n.Name.AsIdentifier())),\n\t\t\t\tpos, n,\n\t\t\t); found != nil {\n\t\t\t\treturn found\n\t\t\t}\n\t\tcase *ast.ServiceNode:\n\t\t\tif found := f.findServiceByPos(\n\t\t\t\tbuilder.WithService(string(n.Name.AsIdentifier())),\n\t\t\t\tpos, n,\n\t\t\t); found != nil {\n\t\t\t\treturn found\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (f *File) findFileOptionByPos(builder *LocationBuilder, pos Position, node *ast.OptionNode) *Location {\n\tswitch n := node.Val.(type) {\n\tcase *ast.MessageLiteralNode:\n\t\tfor _, elem := range n.Elements {\n\t\t\toptName := elem.Name.Name.AsIdentifier()\n\t\t\tswitch optName {\n\t\t\tcase \"import\":\n\t\t\t\tswitch n := elem.Val.(type) {\n\t\t\t\tcase *ast.StringLiteralNode:\n\t\t\t\t\tif f.containsPos(n, pos) {\n\t\t\t\t\t\treturn builder.WithImportName(n.AsString()).Location()\n\t\t\t\t\t}\n\t\t\t\tcase *ast.ArrayLiteralNode:\n\t\t\t\t\tfor _, elem := range n.Elements {\n\t\t\t\t\t\tn, ok := elem.(*ast.StringLiteralNode)\n\t\t\t\t\t\tif !ok {\n\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif f.containsPos(n, pos) {\n\t\t\t\t\t\t\treturn builder.WithImportName(n.AsString()).Location()\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tif f.containsPos(node.Name, pos) {\n\t\treturn builder.Location()\n\t}\n\treturn nil\n}\n\nfunc (f *File) findImportByPos(builder *LocationBuilder, pos Position, node *ast.ImportNode) *Location {\n\tif f.containsPos(node.Name, pos) {\n\t\treturn builder.Location()\n\t}\n\treturn nil\n}\n\nfunc (f *File) findMessageByPos(builder *MessageBuilder, pos Position, node *ast.MessageNode) (loc *Location) {\n\tfor _, decl := range node.MessageBody.Decls {\n\t\tswitch n := decl.(type) {\n\t\tcase *ast.OptionNode:\n\t\t\tif !f.matchOption(f.optionName(n), msgOptionName) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif found := f.findMessageOptionByPos(\n\t\t\t\tbuilder.WithOption(),\n\t\t\t\tpos, n,\n\t\t\t); found != nil {\n\t\t\t\treturn found\n\t\t\t}\n\t\tcase *ast.FieldNode:\n\t\t\tif found := f.findFieldByPos(\n\t\t\t\tbuilder.WithField(string(n.Name.AsIdentifier())),\n\t\t\t\tpos, n,\n\t\t\t); found != nil {\n\t\t\t\treturn found\n\t\t\t}\n\t\tcase *ast.MessageNode:\n\t\t\tif found := f.findMessageByPos(\n\t\t\t\tbuilder.WithMessage(string(n.Name.AsIdentifier())),\n\t\t\t\tpos, n,\n\t\t\t); found != nil {\n\t\t\t\treturn found\n\t\t\t}\n\t\tcase *ast.EnumNode:\n\t\t\tif found := f.findEnumByPos(\n\t\t\t\tbuilder.WithEnum(string(n.Name.AsIdentifier())),\n\t\t\t\tpos, n,\n\t\t\t); found != nil {\n\t\t\t\treturn found\n\t\t\t}\n\t\tcase *ast.OneofNode:\n\t\t\tif found := f.findOneofByPos(\n\t\t\t\tbuilder.WithOneof(string(n.Name.AsIdentifier())),\n\t\t\t\tpos, n,\n\t\t\t); found != nil {\n\t\t\t\treturn found\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (f *File) findEnumByPos(builder *EnumBuilder, pos Position, node *ast.EnumNode) *Location {\n\tfor _, decl := range node.Decls {\n\t\tswitch n := decl.(type) {\n\t\tcase *ast.OptionNode:\n\t\t\tif !f.matchOption(f.optionName(n), enumOptionName) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif found := f.findEnumOptionByPos(\n\t\t\t\tbuilder.WithOption(),\n\t\t\t\tpos, n,\n\t\t\t); found != nil {\n\t\t\t\treturn found\n\t\t\t}\n\t\tcase *ast.EnumValueNode:\n\t\t\tif found := f.findEnumValueByPos(\n\t\t\t\tbuilder.WithValue(string(n.Name.AsIdentifier())),\n\t\t\t\tpos, n,\n\t\t\t); found != nil {\n\t\t\t\treturn found\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (f *File) findEnumOptionByPos(builder *EnumBuilder, pos Position, node *ast.OptionNode) *Location {\n\tswitch n := node.Val.(type) {\n\tcase *ast.MessageLiteralNode:\n\t\tfor _, elem := range n.Elements {\n\t\t\toptName := elem.Name.Name.AsIdentifier()\n\t\t\tswitch optName {\n\t\t\tcase \"alias\":\n\t\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\t\treturn builder.Location()\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\tcase *ast.StringLiteralNode:\n\t\tif strings.HasSuffix(f.optionName(node), \"alias\") {\n\t\t\tif f.containsPos(n, pos) {\n\t\t\t\treturn builder.Location()\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (f *File) findEnumValueByPos(builder *EnumValueBuilder, pos Position, node *ast.EnumValueNode) *Location {\n\tif node.Options != nil {\n\t\tfor _, opt := range node.Options.Options {\n\t\t\tif !f.matchOption(f.optionName(opt), enumValueOptionName) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif found := f.findEnumValueOptionByPos(\n\t\t\t\tbuilder.WithOption(),\n\t\t\t\tpos, opt,\n\t\t\t); found != nil {\n\t\t\t\treturn found\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (f *File) findEnumValueOptionByPos(builder *EnumValueOptionBuilder, pos Position, node *ast.OptionNode) *Location {\n\tvar attrs []*ast.MessageLiteralNode\n\tswitch n := node.Val.(type) {\n\tcase *ast.MessageLiteralNode:\n\t\tfor _, elem := range n.Elements {\n\t\t\toptName := elem.Name.Name.AsIdentifier()\n\t\t\tswitch optName {\n\t\t\tcase \"alias\":\n\t\t\t\tswitch value := elem.Val.(type) {\n\t\t\t\tcase *ast.StringLiteralNode:\n\t\t\t\t\tif f.containsPos(value, pos) {\n\t\t\t\t\t\treturn builder.WithAlias().Location()\n\t\t\t\t\t}\n\t\t\t\tcase *ast.ArrayLiteralNode:\n\t\t\t\t\tfor _, elem := range value.Elements {\n\t\t\t\t\t\tif f.containsPos(elem, pos) {\n\t\t\t\t\t\t\treturn builder.WithAlias().Location()\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\tcase \"noalias\":\n\t\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\t\treturn builder.WithNoAlias().Location()\n\t\t\t\t}\n\t\t\tcase \"default\":\n\t\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\t\treturn builder.WithDefault().Location()\n\t\t\t\t}\n\t\t\tcase \"attr\":\n\t\t\t\tattrs = append(attrs, f.getMessageListFromNode(elem.Val)...)\n\t\t\t}\n\t\t}\n\tcase *ast.StringLiteralNode:\n\t\tif strings.HasSuffix(f.optionName(node), \"alias\") {\n\t\t\tif f.containsPos(n, pos) {\n\t\t\t\treturn builder.WithAlias().Location()\n\t\t\t}\n\t\t}\n\tcase *ast.IdentNode:\n\t\tif strings.HasSuffix(f.optionName(node), \"noalias\") {\n\t\t\tif f.containsPos(n, pos) {\n\t\t\t\treturn builder.WithNoAlias().Location()\n\t\t\t}\n\t\t}\n\t\tif strings.HasSuffix(f.optionName(node), \"default\") {\n\t\t\tif f.containsPos(n, pos) {\n\t\t\t\treturn builder.WithDefault().Location()\n\t\t\t}\n\t\t}\n\t}\n\tfor idx, n := range attrs {\n\t\tif found := f.findAttrByPos(\n\t\t\tbuilder.WithAttr(idx),\n\t\t\tpos, n,\n\t\t); found != nil {\n\t\t\treturn found\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (f *File) findAttrByPos(builder *EnumValueAttributeBuilder, pos Position, node *ast.MessageLiteralNode) *Location {\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch fieldName {\n\t\tcase \"name\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithName().Location()\n\t\t\t}\n\t\tcase \"value\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithValue().Location()\n\t\t\t}\n\t\t}\n\t}\n\tif f.containsPos(node, pos) {\n\t\treturn builder.Location()\n\t}\n\treturn nil\n}\n\nfunc (f *File) findOneofByPos(builder *OneofBuilder, pos Position, node *ast.OneofNode) *Location {\n\tif node == nil {\n\t\treturn nil\n\t}\n\tfor _, elem := range node.Decls {\n\t\tswitch n := elem.(type) {\n\t\tcase *ast.FieldNode:\n\t\t\tif found := f.findFieldByPos(\n\t\t\t\tbuilder.WithField(string(n.Name.AsIdentifier())),\n\t\t\t\tpos, n,\n\t\t\t); found != nil {\n\t\t\t\treturn found\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (f *File) findFieldByPos(builder *FieldBuilder, pos Position, node *ast.FieldNode) *Location {\n\topts := node.GetOptions()\n\tif opts != nil {\n\t\tfor _, opt := range opts.Options {\n\t\t\tif !f.matchOption(f.optionName(opt), fieldOptionName) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif found := f.findFieldOptionByPos(\n\t\t\t\tbuilder.WithOption(),\n\t\t\t\tpos, opt,\n\t\t\t); found != nil {\n\t\t\t\treturn found\n\t\t\t}\n\t\t}\n\t}\n\tif f.containsPos(node.FldType, pos) {\n\t\treturn builder.WithType().Location()\n\t}\n\treturn nil\n}\n\nfunc (f *File) findFieldOptionByPos(builder *FieldOptionBuilder, pos Position, node *ast.OptionNode) *Location {\n\tswitch n := node.Val.(type) {\n\tcase *ast.StringLiteralNode:\n\t\tif strings.HasSuffix(f.optionName(node), \"by\") {\n\t\t\tif f.containsPos(n, pos) {\n\t\t\t\treturn builder.WithBy().Location()\n\t\t\t}\n\t\t}\n\tcase *ast.MessageLiteralNode:\n\t\tswitch {\n\t\tcase strings.HasSuffix(f.optionName(node), \"oneof\"):\n\t\t\tif found := f.findFieldOneofByPos(\n\t\t\t\tbuilder.WithOneOf(),\n\t\t\t\tpos, n,\n\t\t\t); found != nil {\n\t\t\t\treturn found\n\t\t\t}\n\t\t}\n\t\tfor _, elem := range n.Elements {\n\t\t\toptName := elem.Name.Name.AsIdentifier()\n\t\t\tswitch optName {\n\t\t\tcase \"by\":\n\t\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\t\treturn builder.WithBy().Location()\n\t\t\t\t}\n\t\t\tcase \"oneof\":\n\t\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tif found := f.findFieldOneofByPos(\n\t\t\t\t\tbuilder.WithOneOf(),\n\t\t\t\t\tpos, value,\n\t\t\t\t); found != nil {\n\t\t\t\t\treturn found\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (f *File) findFieldOneofByPos(builder *FieldOneofBuilder, pos Position, node *ast.MessageLiteralNode) *Location {\n\tvar defs []*ast.MessageLiteralNode\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch fieldName {\n\t\tcase \"if\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithIf().Location()\n\t\t\t}\n\t\tcase \"default\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithDefault().Location()\n\t\t\t}\n\t\tcase \"def\":\n\t\t\tdefs = append(defs, f.getMessageListFromNode(elem.Val)...)\n\t\tcase \"by\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithBy().Location()\n\t\t\t}\n\t\t}\n\t}\n\tfor idx, n := range defs {\n\t\tif found := f.findDefByPos(\n\t\t\tbuilder.WithDef(idx),\n\t\t\tpos, n,\n\t\t); found != nil {\n\t\t\treturn found\n\t\t}\n\t}\n\tif f.containsPos(node, pos) {\n\t\treturn builder.Location()\n\t}\n\treturn nil\n}\n\nfunc (f *File) findMessageOptionByPos(builder *MessageOptionBuilder, pos Position, node *ast.OptionNode) *Location {\n\tvar defs []*ast.MessageLiteralNode\n\tswitch n := node.Val.(type) {\n\tcase *ast.MessageLiteralNode:\n\t\tfor _, elem := range n.Elements {\n\t\t\toptName := elem.Name.Name.AsIdentifier()\n\t\t\tswitch optName {\n\t\t\tcase \"alias\":\n\t\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\t\treturn builder.WithAlias().Location()\n\t\t\t\t}\n\t\t\tcase \"def\":\n\t\t\t\tdefs = append(defs, f.getMessageListFromNode(elem.Val)...)\n\t\t\t}\n\t\t}\n\tcase *ast.StringLiteralNode:\n\t\tif strings.HasSuffix(f.optionName(node), \"alias\") {\n\t\t\tif f.containsPos(n, pos) {\n\t\t\t\treturn builder.WithAlias().Location()\n\t\t\t}\n\t\t}\n\t}\n\tfor idx, n := range defs {\n\t\tif found := f.findDefByPos(\n\t\t\tbuilder.WithDef(idx),\n\t\t\tpos, n,\n\t\t); found != nil {\n\t\t\treturn found\n\t\t}\n\t}\n\tif f.containsPos(node.Val, pos) {\n\t\treturn builder.Location()\n\t}\n\treturn nil\n}\n\nfunc (f *File) findDefByPos(builder *VariableDefinitionOptionBuilder, pos Position, node *ast.MessageLiteralNode) *Location {\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch fieldName {\n\t\tcase \"name\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithName().Location()\n\t\t\t}\n\t\tcase \"if\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithIf().Location()\n\t\t\t}\n\t\tcase \"by\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithBy().Location()\n\t\t\t}\n\t\tcase \"call\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tif found := f.findCallExprByPos(\n\t\t\t\tbuilder.WithCall(),\n\t\t\t\tpos, value,\n\t\t\t); found != nil {\n\t\t\t\treturn found\n\t\t\t}\n\t\tcase \"message\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tif found := f.findMessageExprByPos(\n\t\t\t\tbuilder.WithMessage(),\n\t\t\t\tpos, value,\n\t\t\t); found != nil {\n\t\t\t\treturn found\n\t\t\t}\n\t\tcase \"enum\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tif found := f.findEnumExprByPos(\n\t\t\t\tbuilder.WithEnum(),\n\t\t\t\tpos, value,\n\t\t\t); found != nil {\n\t\t\t\treturn found\n\t\t\t}\n\t\tcase \"switch\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tswitchBuilder := builder.WithSwitch()\n\t\t\tif found := f.findSwitchExprByPos(\n\t\t\t\tswitchBuilder,\n\t\t\t\tpos, value,\n\t\t\t); found != nil {\n\t\t\t\treturn found\n\t\t\t}\n\t\t\t// Position is on \"switch\" field name or inside switch block but not in a case/default\n\t\t\tif f.containsPos(elem, pos) {\n\t\t\t\treturn switchBuilder.Location()\n\t\t\t}\n\t\tcase \"validation\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tif found := f.findValidationExprByPos(\n\t\t\t\tbuilder.WithValidation(),\n\t\t\t\tpos, value,\n\t\t\t); found != nil {\n\t\t\t\treturn found\n\t\t\t}\n\t\tcase \"map\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tif found := f.findMapExprByPos(\n\t\t\t\tbuilder.WithMap(),\n\t\t\t\tpos, value,\n\t\t\t); found != nil {\n\t\t\t\treturn found\n\t\t\t}\n\t\t}\n\t}\n\tif f.containsPos(node, pos) {\n\t\treturn builder.Location()\n\t}\n\treturn nil\n}\n\nfunc (f *File) findMessageExprByPos(builder *MessageExprOptionBuilder, pos Position, node *ast.MessageLiteralNode) *Location {\n\tvar args []*ast.MessageLiteralNode\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch fieldName {\n\t\tcase \"name\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithName().Location()\n\t\t\t}\n\t\tcase \"args\":\n\t\t\targs = append(args, f.getMessageListFromNode(elem.Val)...)\n\t\t}\n\t}\n\tfor idx, n := range args {\n\t\tif found := f.findMessageArgumentByPos(\n\t\t\tbuilder.WithArgs(idx),\n\t\t\tpos, n,\n\t\t); found != nil {\n\t\t\treturn found\n\t\t}\n\t}\n\tif f.containsPos(node, pos) {\n\t\treturn builder.Location()\n\t}\n\treturn nil\n}\n\nfunc (f *File) findEnumExprByPos(builder *EnumExprOptionBuilder, pos Position, node *ast.MessageLiteralNode) *Location {\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch fieldName {\n\t\tcase \"name\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithName().Location()\n\t\t\t}\n\t\tcase \"by\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithBy().Location()\n\t\t\t}\n\t\t}\n\t}\n\tif f.containsPos(node, pos) {\n\t\treturn builder.Location()\n\t}\n\treturn nil\n}\n\nfunc (f *File) findSwitchExprByPos(builder *SwitchExprOptionBuilder, pos Position, node *ast.MessageLiteralNode) *Location {\n\tvar cases []*ast.MessageLiteralNode\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch fieldName {\n\t\tcase \"case\":\n\t\t\tcases = append(cases, f.getMessageListFromNode(elem.Val)...)\n\t\tcase \"default\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tif found := f.findSwitchDefaultExprByPos(\n\t\t\t\tbuilder.WithDefault(),\n\t\t\t\tpos, value,\n\t\t\t); found != nil {\n\t\t\t\treturn found\n\t\t\t}\n\t\t}\n\t}\n\tfor idx, n := range cases {\n\t\tif found := f.findSwitchCaseExprByPos(\n\t\t\tbuilder.WithCase(idx),\n\t\t\tpos, n,\n\t\t); found != nil {\n\t\t\treturn found\n\t\t}\n\t}\n\n\tif f.containsPos(node, pos) {\n\t\treturn builder.Location()\n\t}\n\treturn nil\n}\n\nfunc (f *File) findSwitchCaseExprByPos(builder *SwitchCaseExprOptionBuilder, pos Position, node *ast.MessageLiteralNode) *Location {\n\tvar defs []*ast.MessageLiteralNode\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch fieldName {\n\t\tcase \"def\":\n\t\t\tdefs = append(defs, f.getMessageListFromNode(elem.Val)...)\n\t\tcase \"if\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithIf().Location()\n\t\t\t}\n\t\tcase \"by\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithBy().Location()\n\t\t\t}\n\t\t}\n\t}\n\tfor idx, n := range defs {\n\t\tif found := f.findDefByPos(\n\t\t\tbuilder.WithDef(idx),\n\t\t\tpos, n,\n\t\t); found != nil {\n\t\t\treturn found\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (f *File) findSwitchDefaultExprByPos(builder *SwitchDefaultExprOptionBuilder, pos Position, node *ast.MessageLiteralNode) *Location {\n\tvar defs []*ast.MessageLiteralNode\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch fieldName {\n\t\tcase \"def\":\n\t\t\tdefs = append(defs, f.getMessageListFromNode(elem.Val)...)\n\t\tcase \"by\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithBy().Location()\n\t\t\t}\n\t\t}\n\t}\n\tfor idx, n := range defs {\n\t\tif found := f.findDefByPos(\n\t\t\tbuilder.WithDef(idx),\n\t\t\tpos, n,\n\t\t); found != nil {\n\t\t\treturn found\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (f *File) findMessageArgumentByPos(builder *ArgumentOptionBuilder, pos Position, node *ast.MessageLiteralNode) *Location {\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch fieldName {\n\t\tcase \"name\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithName().Location()\n\t\t\t}\n\t\tcase \"by\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithBy().Location()\n\t\t\t}\n\t\tcase \"inline\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithInline().Location()\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (f *File) findCallExprByPos(builder *CallExprOptionBuilder, pos Position, node *ast.MessageLiteralNode) *Location {\n\tvar (\n\t\trequests []*ast.MessageLiteralNode\n\t\tgrpcErrs []*ast.MessageLiteralNode\n\t)\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch fieldName {\n\t\tcase \"method\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithMethod().Location()\n\t\t\t}\n\t\tcase \"timeout\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithTimeout().Location()\n\t\t\t}\n\t\tcase \"metadata\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithMetadata().Location()\n\t\t\t}\n\t\tcase \"retry\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tif found := f.findRetryOptionByPos(\n\t\t\t\tbuilder.WithRetry(),\n\t\t\t\tpos, value,\n\t\t\t); found != nil {\n\t\t\t\treturn found\n\t\t\t}\n\t\tcase \"option\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tif found := f.findGRPCCallOptionByPos(\n\t\t\t\tbuilder.WithOption(),\n\t\t\t\tpos, value,\n\t\t\t); found != nil {\n\t\t\t\treturn found\n\t\t\t}\n\t\tcase \"request\":\n\t\t\trequests = append(requests, f.getMessageListFromNode(elem.Val)...)\n\t\tcase \"error\":\n\t\t\tgrpcErrs = append(grpcErrs, f.getMessageListFromNode(elem.Val)...)\n\t\t}\n\t}\n\tfor idx, n := range requests {\n\t\tif found := f.findMethodRequestByPos(\n\t\t\tbuilder.WithRequest(idx),\n\t\t\tpos, n,\n\t\t); found != nil {\n\t\t\treturn found\n\t\t}\n\t}\n\tfor idx, n := range grpcErrs {\n\t\tif found := f.findGRPCErrorByPos(\n\t\t\tbuilder.WithError(idx),\n\t\t\tpos, n,\n\t\t); found != nil {\n\t\t\treturn found\n\t\t}\n\t}\n\tif f.containsPos(node, pos) {\n\t\treturn builder.Location()\n\t}\n\treturn nil\n}\n\nfunc (f *File) findRetryOptionByPos(builder *RetryOptionBuilder, pos Position, node *ast.MessageLiteralNode) *Location {\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch fieldName {\n\t\tcase \"if\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithIf().Location()\n\t\t\t}\n\t\tcase \"constant\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tfor _, subElem := range value.Elements {\n\t\t\t\tfieldName := subElem.Name.Name.AsIdentifier()\n\t\t\t\tswitch fieldName {\n\t\t\t\tcase \"interval\":\n\t\t\t\t\tif f.containsPos(subElem.Val, pos) {\n\t\t\t\t\t\treturn builder.WithConstantInterval().Location()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\tcase \"exponential\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tfor _, subElem := range value.Elements {\n\t\t\t\tfieldName := subElem.Name.Name.AsIdentifier()\n\t\t\t\tswitch fieldName {\n\t\t\t\tcase \"initial_interval\":\n\t\t\t\t\tif f.containsPos(subElem.Val, pos) {\n\t\t\t\t\t\treturn builder.WithExponentialInitialInterval().Location()\n\t\t\t\t\t}\n\t\t\t\tcase \"max_interval\":\n\t\t\t\t\tif f.containsPos(subElem.Val, pos) {\n\t\t\t\t\t\treturn builder.WithExponentialMaxInterval().Location()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tif f.containsPos(node, pos) {\n\t\treturn builder.Location()\n\t}\n\treturn nil\n}\n\nfunc (f *File) findGRPCCallOptionByPos(builder *GRPCCallOptionBuilder, pos Position, node *ast.MessageLiteralNode) *Location {\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch fieldName {\n\t\tcase \"content_subtype\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithContentSubtype().Location()\n\t\t\t}\n\t\tcase \"header\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithHeader().Location()\n\t\t\t}\n\t\tcase \"max_call_recv_msg_size\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithMaxCallRecvMsgSize().Location()\n\t\t\t}\n\t\tcase \"max_call_send_msg_size\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithMaxCallSendMsgSize().Location()\n\t\t\t}\n\t\tcase \"static_method\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithStaticMethod().Location()\n\t\t\t}\n\t\tcase \"trailer\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithTrailer().Location()\n\t\t\t}\n\t\tcase \"wait_for_ready\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithWaitForReady().Location()\n\t\t\t}\n\t\t}\n\t}\n\tif f.containsPos(node, pos) {\n\t\treturn builder.Location()\n\t}\n\treturn nil\n}\n\nfunc (f *File) findMethodRequestByPos(builder *RequestOptionBuilder, pos Position, node *ast.MessageLiteralNode) *Location {\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch fieldName {\n\t\tcase \"field\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithField().Location()\n\t\t\t}\n\t\tcase \"by\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithBy().Location()\n\t\t\t}\n\t\tcase \"if\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithIf().Location()\n\t\t\t}\n\t\t}\n\t}\n\tif f.containsPos(node, pos) {\n\t\treturn builder.Location()\n\t}\n\treturn nil\n}\n\nfunc (f *File) findGRPCErrorByPos(builder *GRPCErrorOptionBuilder, pos Position, node *ast.MessageLiteralNode) *Location {\n\tvar (\n\t\tdefs    []*ast.MessageLiteralNode\n\t\tdetails []*ast.MessageLiteralNode\n\t)\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch fieldName {\n\t\tcase \"def\":\n\t\t\tdefs = append(defs, f.getMessageListFromNode(elem.Val)...)\n\t\tcase \"if\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithIf().Location()\n\t\t\t}\n\t\tcase \"message\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithMessage().Location()\n\t\t\t}\n\t\tcase \"ignore\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithIgnore().Location()\n\t\t\t}\n\t\tcase \"ignore_and_Response\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithIgnoreAndResponse().Location()\n\t\t\t}\n\t\tcase \"details\":\n\t\t\tdetails = append(details, f.getMessageListFromNode(elem.Val)...)\n\t\t}\n\t}\n\tfor idx, n := range defs {\n\t\tif found := f.findDefByPos(\n\t\t\tbuilder.WithDef(idx),\n\t\t\tpos, n,\n\t\t); found != nil {\n\t\t\treturn found\n\t\t}\n\t}\n\tfor idx, n := range details {\n\t\tif found := f.findGRPCErrorDetailByPos(\n\t\t\tbuilder.WithDetail(idx),\n\t\t\tpos, n,\n\t\t); found != nil {\n\t\t\treturn found\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (f *File) findGRPCErrorDetailByPos(builder *GRPCErrorDetailOptionBuilder, pos Position, node *ast.MessageLiteralNode) *Location {\n\tvar (\n\t\tdefs []*ast.MessageLiteralNode\n\t\tmsgs []*ast.MessageLiteralNode\n\t)\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch fieldName {\n\t\tcase \"def\":\n\t\t\tdefs = append(defs, f.getMessageListFromNode(elem.Val)...)\n\t\tcase \"message\":\n\t\t\tmsgs = append(msgs, f.getMessageListFromNode(elem.Val)...)\n\t\tcase \"if\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithIf().Location()\n\t\t\t}\n\t\tcase \"by\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithBy().Location()\n\t\t\t}\n\t\t}\n\t}\n\tfor idx, n := range defs {\n\t\tif found := f.findDefByPos(\n\t\t\tbuilder.WithDef(idx),\n\t\t\tpos, n,\n\t\t); found != nil {\n\t\t\treturn found\n\t\t}\n\t}\n\tfor idx, n := range msgs {\n\t\tif found := f.findDefByPos(\n\t\t\tbuilder.WithMessage(idx),\n\t\t\tpos, n,\n\t\t); found != nil {\n\t\t\treturn found\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (f *File) findValidationExprByPos(builder *ValidationExprOptionBuilder, pos Position, node *ast.MessageLiteralNode) *Location {\n\tvar grpcErrs []*ast.MessageLiteralNode\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch fieldName {\n\t\tcase \"name\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithName().Location()\n\t\t\t}\n\t\tcase \"error\":\n\t\t\tgrpcErrs = append(grpcErrs, f.getMessageListFromNode(elem.Val)...)\n\t\t}\n\t}\n\tfor _, n := range grpcErrs {\n\t\tif found := f.findGRPCErrorByPos(\n\t\t\tbuilder.WithError(),\n\t\t\tpos, n,\n\t\t); found != nil {\n\t\t\treturn found\n\t\t}\n\t}\n\tif f.containsPos(node, pos) {\n\t\treturn builder.Location()\n\t}\n\treturn nil\n}\n\nfunc (f *File) findMapExprByPos(builder *MapExprOptionBuilder, pos Position, node *ast.MessageLiteralNode) *Location {\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch fieldName {\n\t\tcase \"by\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithBy().Location()\n\t\t\t}\n\t\tcase \"message\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tif found := f.findMessageExprByPos(\n\t\t\t\tbuilder.WithMessage(),\n\t\t\t\tpos, value,\n\t\t\t); found != nil {\n\t\t\t\treturn found\n\t\t\t}\n\t\tcase \"enum\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tif found := f.findEnumExprByPos(\n\t\t\t\tbuilder.WithEnum(),\n\t\t\t\tpos, value,\n\t\t\t); found != nil {\n\t\t\t\treturn found\n\t\t\t}\n\t\t}\n\t}\n\tif f.containsPos(node, pos) {\n\t\treturn builder.Location()\n\t}\n\treturn nil\n}\n\nfunc (f *File) findServiceByPos(builder *ServiceBuilder, pos Position, node *ast.ServiceNode) *Location {\n\tfor _, decl := range node.Decls {\n\t\tswitch n := decl.(type) {\n\t\tcase *ast.OptionNode:\n\t\t\tif !f.matchOption(f.optionName(n), serviceOptionName) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif found := f.findServiceOptionByPos(builder.WithOption(), pos, n); found != nil {\n\t\t\t\treturn found\n\t\t\t}\n\t\tcase *ast.RPCNode:\n\t\t\tif found := f.findMethodByPos(\n\t\t\t\tbuilder.WithMethod(string(n.Name.AsIdentifier())),\n\t\t\t\tpos, n,\n\t\t\t); found != nil {\n\t\t\t\treturn found\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (f *File) findServiceOptionByPos(builder *ServiceOptionBuilder, pos Position, node *ast.OptionNode) *Location {\n\tvar vars []*ast.MessageLiteralNode\n\tswitch n := node.Val.(type) {\n\tcase *ast.MessageLiteralNode:\n\t\tfor _, elem := range n.Elements {\n\t\t\toptName := elem.Name.Name.AsIdentifier()\n\t\t\tswitch optName {\n\t\t\tcase \"env\":\n\t\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tif found := f.findEnvByPos(builder.WithEnv(), pos, value); found != nil {\n\t\t\t\t\treturn found\n\t\t\t\t}\n\t\t\tcase \"var\":\n\t\t\t\tvars = append(vars, f.getMessageListFromNode(elem.Val)...)\n\t\t\t}\n\t\t}\n\t}\n\tfor idx, n := range vars {\n\t\tif found := f.findServiceVariableByPos(\n\t\t\tbuilder.WithVar(idx),\n\t\t\tpos, n,\n\t\t); found != nil {\n\t\t\treturn found\n\t\t}\n\t}\n\tif f.containsPos(node.Val, pos) {\n\t\treturn builder.Location()\n\t}\n\treturn nil\n}\n\nfunc (f *File) findServiceVariableByPos(builder *ServiceVariableBuilder, pos Position, node *ast.MessageLiteralNode) *Location {\n\tfor _, elem := range node.Elements {\n\t\toptName := elem.Name.Name.AsIdentifier()\n\t\tswitch optName {\n\t\tcase \"name\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithName().Location()\n\t\t\t}\n\t\tcase \"if\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithIf().Location()\n\t\t\t}\n\t\tcase \"by\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithBy().Location()\n\t\t\t}\n\t\tcase \"map\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tif found := f.findMapExprByPos(\n\t\t\t\tbuilder.WithMap(),\n\t\t\t\tpos, value,\n\t\t\t); found != nil {\n\t\t\t\treturn found\n\t\t\t}\n\t\tcase \"message\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tif found := f.findMessageExprByPos(\n\t\t\t\tbuilder.WithMessage(),\n\t\t\t\tpos, value,\n\t\t\t); found != nil {\n\t\t\t\treturn found\n\t\t\t}\n\t\tcase \"enum\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tif found := f.findEnumExprByPos(\n\t\t\t\tbuilder.WithEnum(),\n\t\t\t\tpos, value,\n\t\t\t); found != nil {\n\t\t\t\treturn found\n\t\t\t}\n\t\tcase \"switch\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tswitchBuilder := builder.WithSwitch()\n\t\t\tif found := f.findSwitchExprByPos(\n\t\t\t\tswitchBuilder,\n\t\t\t\tpos, value,\n\t\t\t); found != nil {\n\t\t\t\treturn found\n\t\t\t}\n\t\t\tif f.containsPos(elem, pos) {\n\t\t\t\treturn switchBuilder.Location()\n\t\t\t}\n\t\tcase \"validation\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tif found := f.findServiceVariableValidationExprByPos(\n\t\t\t\tbuilder.WithValidation(),\n\t\t\t\tpos, value,\n\t\t\t); found != nil {\n\t\t\t\treturn found\n\t\t\t}\n\t\t}\n\t}\n\tif f.containsPos(node, pos) {\n\t\treturn builder.Location()\n\t}\n\treturn nil\n}\n\nfunc (f *File) findServiceVariableValidationExprByPos(builder *ServiceVariableValidationExprBuilder, pos Position, node *ast.MessageLiteralNode) *Location {\n\tfor _, elem := range node.Elements {\n\t\toptName := elem.Name.Name.AsIdentifier()\n\t\tswitch optName {\n\t\tcase \"if\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithIf().Location()\n\t\t\t}\n\t\tcase \"message\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithMessage().Location()\n\t\t\t}\n\t\t}\n\t}\n\tif f.containsPos(node, pos) {\n\t\treturn builder.Location()\n\t}\n\treturn nil\n}\n\nfunc (f *File) findEnvByPos(builder *EnvBuilder, pos Position, node *ast.MessageLiteralNode) *Location {\n\tvar vars []*ast.MessageLiteralNode\n\tfor _, elem := range node.Elements {\n\t\toptName := elem.Name.Name.AsIdentifier()\n\t\tswitch optName {\n\t\tcase \"message\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithMessage().Location()\n\t\t\t}\n\t\tcase \"var\":\n\t\t\tvars = append(vars, f.getMessageListFromNode(elem.Val)...)\n\t\t}\n\t}\n\tfor idx, n := range vars {\n\t\tif found := f.findEnvVarByPos(\n\t\t\tbuilder.WithVar(idx),\n\t\t\tpos, n,\n\t\t); found != nil {\n\t\t\treturn found\n\t\t}\n\t}\n\tif f.containsPos(node, pos) {\n\t\treturn builder.Location()\n\t}\n\treturn nil\n}\n\nfunc (f *File) findEnvVarByPos(builder *EnvVarBuilder, pos Position, node *ast.MessageLiteralNode) *Location {\n\tfor _, elem := range node.Elements {\n\t\toptName := elem.Name.Name.AsIdentifier()\n\t\tswitch optName {\n\t\tcase \"name\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithName().Location()\n\t\t\t}\n\t\tcase \"type\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithType().Location()\n\t\t\t}\n\t\tcase \"option\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tif found := f.findEnvVarOptionByPos(\n\t\t\t\tbuilder.WithOption(),\n\t\t\t\tpos, value,\n\t\t\t); found != nil {\n\t\t\t\treturn found\n\t\t\t}\n\t\t}\n\t}\n\tif f.containsPos(node, pos) {\n\t\treturn builder.Location()\n\t}\n\treturn nil\n}\n\nfunc (f *File) findEnvVarOptionByPos(builder *EnvVarOptionBuilder, pos Position, node *ast.MessageLiteralNode) *Location {\n\tfor _, elem := range node.Elements {\n\t\toptName := elem.Name.Name.AsIdentifier()\n\t\tswitch optName {\n\t\tcase \"alternate\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithAlternate().Location()\n\t\t\t}\n\t\tcase \"default\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithDefault().Location()\n\t\t\t}\n\t\tcase \"required\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithRequired().Location()\n\t\t\t}\n\t\tcase \"ignored\":\n\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\treturn builder.WithIgnored().Location()\n\t\t\t}\n\t\t}\n\t}\n\tif f.containsPos(node, pos) {\n\t\treturn builder.Location()\n\t}\n\treturn nil\n}\n\nfunc (f *File) findMethodByPos(builder *MethodBuilder, pos Position, node *ast.RPCNode) *Location {\n\tfor _, decl := range node.Decls {\n\t\tswitch n := decl.(type) {\n\t\tcase *ast.OptionNode:\n\t\t\tif !f.matchOption(f.optionName(n), methodOptionName) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif found := f.findMethodOptionByPos(\n\t\t\t\tbuilder.WithOption(),\n\t\t\t\tpos, n,\n\t\t\t); found != nil {\n\t\t\t\treturn found\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (f *File) findMethodOptionByPos(builder *MethodOptionBuilder, pos Position, node *ast.OptionNode) *Location {\n\tswitch n := node.Val.(type) {\n\tcase *ast.StringLiteralNode:\n\t\tif strings.HasSuffix(f.optionName(node), \"timeout\") {\n\t\t\tif f.containsPos(n, pos) {\n\t\t\t\treturn builder.WithTimeout().Location()\n\t\t\t}\n\t\t}\n\tcase *ast.MessageLiteralNode:\n\t\tfor _, elem := range n.Elements {\n\t\t\toptName := elem.Name.Name.AsIdentifier()\n\t\t\tswitch optName {\n\t\t\tcase \"timeout\":\n\t\t\t\tif f.containsPos(elem.Val, pos) {\n\t\t\t\t\treturn builder.WithTimeout().Location()\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (f *File) getMessageListFromNode(node ast.Node) []*ast.MessageLiteralNode {\n\tswitch value := node.(type) {\n\tcase *ast.MessageLiteralNode:\n\t\treturn []*ast.MessageLiteralNode{value}\n\tcase *ast.ArrayLiteralNode:\n\t\tvalues := make([]*ast.MessageLiteralNode, 0, len(value.Elements))\n\t\tfor _, elem := range value.Elements {\n\t\t\tliteral, ok := elem.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tvalues = append(values, literal)\n\t\t}\n\t\treturn values\n\t}\n\treturn nil\n}\n\nfunc (f *File) containsPos(node ast.Node, pos Position) bool {\n\tinfo := f.fileNode.NodeInfo(node)\n\tstartPos := info.Start()\n\tendPos := info.End()\n\tif startPos.Line > pos.Line {\n\t\treturn false\n\t}\n\tif startPos.Line == pos.Line {\n\t\tif startPos.Col > pos.Col {\n\t\t\treturn false\n\t\t}\n\t}\n\tif endPos.Line < pos.Line {\n\t\treturn false\n\t}\n\tif endPos.Line == pos.Line {\n\t\tif endPos.Col < pos.Col {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\nfunc (f *File) optionName(node *ast.OptionNode) string {\n\tparts := make([]string, 0, len(node.Name.Parts))\n\tfor _, part := range node.Name.Parts {\n\t\tparts = append(parts, string(part.Name.AsIdentifier()))\n\t}\n\treturn strings.Join(parts, \".\")\n}\n\nfunc (f *File) importPathValuesByImportRule(node *ast.OptionNode) []*ast.StringLiteralNode {\n\toptName := f.optionName(node)\n\tif !f.matchOption(optName, \"grpc.federation.file\") {\n\t\treturn nil\n\t}\n\n\t// option (grpc.federation.file).import = \"example.proto\";\n\tif strings.HasSuffix(optName, \".import\") {\n\t\tif n, ok := node.GetValue().(*ast.StringLiteralNode); ok {\n\t\t\treturn []*ast.StringLiteralNode{n}\n\t\t}\n\t\treturn nil\n\t}\n\n\tvar ret []*ast.StringLiteralNode\n\tswitch n := node.Val.(type) {\n\tcase *ast.MessageLiteralNode:\n\t\tfor _, elem := range n.Elements {\n\t\t\toptName := elem.Name.Name.AsIdentifier()\n\t\t\tswitch optName {\n\t\t\tcase \"import\":\n\t\t\t\tswitch n := elem.Val.(type) {\n\t\t\t\tcase *ast.StringLiteralNode:\n\t\t\t\t\t// option (grpc.federation.file) = {\n\t\t\t\t\t//   import: \"example.proto\"\n\t\t\t\t\t// };\n\t\t\t\t\tret = append(ret, n)\n\t\t\t\tcase *ast.ArrayLiteralNode:\n\t\t\t\t\t// option (grpc.federation.file) = {\n\t\t\t\t\t//   import: [\"example.proto\"]\n\t\t\t\t\t// };\n\t\t\t\t\tfor _, elem := range n.Elements {\n\t\t\t\t\t\tn, ok := elem.(*ast.StringLiteralNode)\n\t\t\t\t\t\tif !ok {\n\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t}\n\t\t\t\t\t\tret = append(ret, n)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn ret\n}\n\n// NodeInfoByLocation returns information about the node at the position specified by location in the AST of the Protocol Buffers.\nfunc (f *File) NodeInfoByLocation(loc *Location) *ast.NodeInfo {\n\tif loc.FileName == \"\" {\n\t\treturn nil\n\t}\n\tif f.fileNode.Name() != filepath.Base(loc.FileName) {\n\t\treturn nil\n\t}\n\tfor _, decl := range f.fileNode.Decls {\n\t\tswitch n := decl.(type) {\n\t\tcase *ast.ImportNode:\n\t\t\tif loc.ImportName == n.Name.AsString() {\n\t\t\t\treturn f.nodeInfo(n.Name)\n\t\t\t}\n\t\tcase *ast.OptionNode:\n\t\t\tif f.matchOption(f.optionName(n), \"go_package\") && loc.GoPackage {\n\t\t\t\treturn f.nodeInfo(n.Val)\n\t\t\t}\n\t\t\tif f.matchOption(f.optionName(n), \"grpc.federation.file\") {\n\t\t\t\tfor _, v := range f.importPathValuesByImportRule(n) {\n\t\t\t\t\tif v.AsString() == loc.ImportName {\n\t\t\t\t\t\treturn f.nodeInfo(v)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\tcase *ast.MessageNode:\n\t\t\tif loc.Message != nil {\n\t\t\t\tif string(n.Name.AsIdentifier()) == loc.Message.Name {\n\t\t\t\t\treturn f.nodeInfoByMessage(n, loc.Message)\n\t\t\t\t}\n\t\t\t}\n\t\tcase *ast.EnumNode:\n\t\t\tif loc.Enum != nil {\n\t\t\t\tif string(n.Name.AsIdentifier()) == loc.Enum.Name {\n\t\t\t\t\treturn f.nodeInfoByEnum(n, loc.Enum)\n\t\t\t\t}\n\t\t\t}\n\t\tcase *ast.ServiceNode:\n\t\t\tif loc.Service != nil {\n\t\t\t\tif string(n.Name.AsIdentifier()) == loc.Service.Name {\n\t\t\t\t\treturn f.nodeInfoByService(n, loc.Service)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (f *File) nodeInfoByMessage(node *ast.MessageNode, msg *Message) *ast.NodeInfo {\n\tif string(node.Name.AsIdentifier()) != msg.Name {\n\t\treturn nil\n\t}\n\tfor _, decl := range node.MessageBody.Decls {\n\t\tswitch n := decl.(type) {\n\t\tcase *ast.OptionNode:\n\t\t\tif !f.matchOption(f.optionName(n), msgOptionName) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif msg.Option != nil {\n\t\t\t\treturn f.nodeInfoByMessageOption(n, msg.Option)\n\t\t\t}\n\t\tcase *ast.FieldNode:\n\t\t\tif msg.Field != nil {\n\t\t\t\tif string(n.Name.AsIdentifier()) != msg.Field.Name {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\treturn f.nodeInfoByField(n, msg.Field)\n\t\t\t}\n\t\tcase *ast.OneofNode:\n\t\t\tif msg.Oneof != nil {\n\t\t\t\tif info := f.nodeInfoByOneof(n, msg.Oneof); info != nil {\n\t\t\t\t\treturn info\n\t\t\t\t}\n\t\t\t}\n\t\tcase *ast.MessageNode:\n\t\t\tif msg.NestedMessage != nil {\n\t\t\t\tif info := f.nodeInfoByMessage(n, msg.NestedMessage); info != nil {\n\t\t\t\t\treturn info\n\t\t\t\t}\n\t\t\t}\n\t\tcase *ast.EnumNode:\n\t\t\tif msg.Enum != nil {\n\t\t\t\tif string(n.Name.AsIdentifier()) == msg.Enum.Name {\n\t\t\t\t\treturn f.nodeInfoByEnum(n, msg.Enum)\n\t\t\t\t}\n\t\t\t}\n\t\tcase *ast.MapFieldNode:\n\t\t\tif msg.Field != nil {\n\t\t\t\tif string(n.Name.AsIdentifier()) != msg.Field.Name {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\treturn f.nodeInfoByField(n, msg.Field)\n\t\t\t}\n\t\t}\n\t}\n\treturn f.nodeInfo(node)\n}\n\nfunc (f *File) nodeInfoByOneof(node *ast.OneofNode, oneof *Oneof) *ast.NodeInfo {\n\tfor _, decl := range node.Decls {\n\t\tswitch n := decl.(type) {\n\t\tcase *ast.OptionNode:\n\t\t\tif !f.matchOption(f.optionName(n), oneofOptionName) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif oneof.Option != nil {\n\t\t\t\treturn nil\n\t\t\t}\n\t\tcase *ast.FieldNode:\n\t\t\tif oneof.Field != nil {\n\t\t\t\tif string(n.Name.AsIdentifier()) != oneof.Field.Name {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\treturn f.nodeInfoByField(n, oneof.Field)\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (f *File) nodeInfoByEnum(node *ast.EnumNode, enum *Enum) *ast.NodeInfo {\n\tfor _, decl := range node.Decls {\n\t\tswitch n := decl.(type) {\n\t\tcase *ast.OptionNode:\n\t\t\tif !f.matchOption(f.optionName(n), enumOptionName) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif enum.Option != nil {\n\t\t\t\treturn f.nodeInfoByEnumOption(n, enum.Option)\n\t\t\t}\n\t\tcase *ast.EnumValueNode:\n\t\t\tif enum.Value != nil {\n\t\t\t\tif string(n.Name.AsIdentifier()) != enum.Value.Value {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\treturn f.nodeInfoByEnumValue(n, enum.Value)\n\t\t\t}\n\t\t}\n\t}\n\treturn f.nodeInfo(node)\n}\n\nfunc (f *File) nodeInfoByEnumOption(node *ast.OptionNode, opt *EnumOption) *ast.NodeInfo {\n\tswitch n := node.Val.(type) {\n\tcase *ast.StringLiteralNode:\n\t\tif opt.Alias && strings.HasSuffix(f.optionName(node), \"alias\") {\n\t\t\treturn f.nodeInfo(n)\n\t\t}\n\tcase *ast.MessageLiteralNode:\n\t\tfor _, elem := range n.Elements {\n\t\t\toptName := elem.Name.Name.AsIdentifier()\n\t\t\tswitch {\n\t\t\tcase opt.Alias && optName == \"alias\":\n\t\t\t\treturn f.nodeInfo(elem.Val)\n\t\t\t}\n\t\t}\n\t}\n\treturn f.nodeInfo(node)\n}\n\nfunc (f *File) nodeInfoByEnumValue(node *ast.EnumValueNode, value *EnumValue) *ast.NodeInfo {\n\topts := node.Options\n\tif value.Option != nil && opts != nil {\n\t\tfor _, opt := range opts.Options {\n\t\t\tif !f.matchOption(f.optionName(opt), enumValueOptionName) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\treturn f.nodeInfoByEnumValueOption(opt, value.Option)\n\t\t}\n\t}\n\treturn f.nodeInfo(node)\n}\n\nfunc (f *File) nodeInfoByEnumValueOption(node *ast.OptionNode, opt *EnumValueOption) *ast.NodeInfo {\n\tswitch n := node.Val.(type) {\n\tcase *ast.IdentNode:\n\t\tif opt.Default && strings.HasSuffix(f.optionName(node), \"default\") {\n\t\t\treturn f.nodeInfo(n)\n\t\t}\n\tcase *ast.StringLiteralNode:\n\t\tif opt.Alias && strings.HasSuffix(f.optionName(node), \"alias\") {\n\t\t\treturn f.nodeInfo(n)\n\t\t}\n\tcase *ast.MessageLiteralNode:\n\t\tvar attrs []*ast.MessageLiteralNode\n\t\tfor _, elem := range n.Elements {\n\t\t\toptName := elem.Name.Name.AsIdentifier()\n\t\t\tswitch {\n\t\t\tcase opt.Default && optName == \"default\":\n\t\t\t\treturn f.nodeInfo(elem.Val)\n\t\t\tcase opt.NoAlias && optName == \"noalias\":\n\t\t\t\treturn f.nodeInfo(elem.Val)\n\t\t\tcase opt.Alias && optName == \"alias\":\n\t\t\t\treturn f.nodeInfo(elem.Val)\n\t\t\tcase opt.Attr != nil && optName == \"attr\":\n\t\t\t\tattrs = append(attrs, f.getMessageListFromNode(elem.Val)...)\n\t\t\t}\n\t\t}\n\t\tif len(attrs) != 0 {\n\t\t\treturn f.nodeInfoByEnumValueAttribute(attrs, opt.Attr)\n\t\t}\n\t}\n\treturn f.nodeInfo(node)\n}\n\nfunc (f *File) nodeInfoByEnumValueAttribute(list []*ast.MessageLiteralNode, attr *EnumValueAttribute) *ast.NodeInfo {\n\tif attr.Idx >= len(list) {\n\t\treturn nil\n\t}\n\tnode := list[attr.Idx]\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch {\n\t\tcase attr.Name && fieldName == \"name\":\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\tcase attr.Value && fieldName == \"value\":\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\t}\n\t}\n\treturn f.nodeInfo(node)\n}\n\nfunc (f *File) nodeInfoByMessageOption(node *ast.OptionNode, opt *MessageOption) *ast.NodeInfo {\n\tswitch n := node.Val.(type) {\n\tcase *ast.StringLiteralNode:\n\t\tif opt.Alias && strings.HasSuffix(f.optionName(node), \"alias\") {\n\t\t\treturn f.nodeInfo(n)\n\t\t}\n\tcase *ast.MessageLiteralNode:\n\t\tvar defs []*ast.MessageLiteralNode\n\t\tfor _, elem := range n.Elements {\n\t\t\toptName := elem.Name.Name.AsIdentifier()\n\t\t\tswitch {\n\t\t\tcase opt.Def != nil && optName == \"def\":\n\t\t\t\tdefs = append(defs, f.getMessageListFromNode(elem.Val)...)\n\t\t\tcase opt.Alias && optName == \"alias\":\n\t\t\t\treturn f.nodeInfo(elem.Val)\n\t\t\t}\n\t\t}\n\t\tif len(defs) != 0 {\n\t\t\treturn f.nodeInfoByDef(defs, opt.Def)\n\t\t}\n\t}\n\treturn f.nodeInfo(node)\n}\n\nfunc (f *File) nodeInfoByDef(list []*ast.MessageLiteralNode, def *VariableDefinitionOption) *ast.NodeInfo {\n\tif def.Idx >= len(list) {\n\t\treturn nil\n\t}\n\tnode := list[def.Idx]\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch {\n\t\tcase def.Name && fieldName == \"name\":\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\tcase def.If && fieldName == \"if\":\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\tcase def.By && fieldName == \"by\":\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\tcase def.Map != nil && fieldName == \"map\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfoByMapExpr(value, def.Map)\n\t\tcase def.Call != nil && fieldName == \"call\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfoByCallExpr(value, def.Call)\n\t\tcase def.Message != nil && fieldName == \"message\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfoByMessageExpr(value, def.Message)\n\t\tcase def.Enum != nil && fieldName == \"enum\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfoByEnumExpr(value, def.Enum)\n\t\tcase def.Switch != nil && fieldName == \"switch\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfoBySwitchExpr(value, def.Switch)\n\t\tcase def.Validation != nil && fieldName == \"validation\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfoByValidationExpr(value, def.Validation)\n\t\t}\n\t}\n\treturn f.nodeInfo(node)\n}\n\nfunc (f *File) nodeInfoByMapExpr(node *ast.MessageLiteralNode, opt *MapExprOption) *ast.NodeInfo {\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch {\n\t\tcase opt.Iterator != nil && fieldName == \"iterator\":\n\t\t\tn, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tfor _, elem := range n.Elements {\n\t\t\t\toptName := elem.Name.Name.AsIdentifier()\n\t\t\t\tswitch {\n\t\t\t\tcase opt.Iterator.Name && optName == \"name\":\n\t\t\t\t\treturn f.nodeInfo(elem.Val)\n\t\t\t\tcase opt.Iterator.Source && optName == \"src\":\n\t\t\t\t\treturn f.nodeInfo(elem.Val)\n\t\t\t\t}\n\t\t\t}\n\t\tcase opt.By && fieldName == \"by\":\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\tcase opt.Message != nil && fieldName == \"message\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfoByMessageExpr(value, opt.Message)\n\t\tcase opt.Enum != nil && fieldName == \"enum\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfoByEnumExpr(value, opt.Enum)\n\t\t}\n\t}\n\treturn f.nodeInfo(node)\n}\n\nfunc (f *File) nodeInfoByCallExpr(node *ast.MessageLiteralNode, call *CallExprOption) *ast.NodeInfo {\n\tvar (\n\t\trequests []*ast.MessageLiteralNode\n\t\tgrpcErrs []*ast.MessageLiteralNode\n\t)\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch {\n\t\tcase call.Method && fieldName == \"method\":\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\tcase call.Request != nil && fieldName == \"request\":\n\t\t\trequests = append(requests, f.getMessageListFromNode(elem.Val)...)\n\t\tcase call.Timeout && fieldName == \"timeout\":\n\t\t\treturn f.nodeInfo(elem.Val)\n\t\tcase call.Retry != nil && fieldName == \"retry\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfoByRetry(value, call.Retry)\n\t\tcase call.Error != nil && fieldName == \"error\":\n\t\t\tgrpcErrs = append(grpcErrs, f.getMessageListFromNode(elem.Val)...)\n\t\tcase call.Option != nil && fieldName == \"option\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfoByGRPCCallOption(value, call.Option)\n\t\tcase call.Metadata && fieldName == \"metadata\":\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\t}\n\t}\n\tif len(requests) != 0 {\n\t\treturn f.nodeInfoByMethodRequest(requests, call.Request)\n\t}\n\tif len(grpcErrs) != 0 {\n\t\treturn f.nodeInfoByGRPCError(grpcErrs, call.Error)\n\t}\n\treturn f.nodeInfo(node)\n}\n\nfunc (f *File) nodeInfoByGRPCCallOption(node *ast.MessageLiteralNode, opt *GRPCCallOption) *ast.NodeInfo {\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch {\n\t\tcase opt.ContentSubtype && fieldName == \"content_subtype\":\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\tcase opt.Header && fieldName == \"header\":\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\tcase opt.Trailer && fieldName == \"trailer\":\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\tcase opt.MaxCallRecvMsgSize && fieldName == \"max_call_recv_msg_size\":\n\t\t\treturn f.nodeInfo(elem.Val)\n\t\tcase opt.MaxCallSendMsgSize && fieldName == \"max_call_send_msg_size\":\n\t\t\treturn f.nodeInfo(elem.Val)\n\t\tcase opt.StaticMethod && fieldName == \"static_method\":\n\t\t\tvalue, ok := elem.Val.(*ast.IdentNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\tcase opt.WaitForReady && fieldName == \"wait_for_ready\":\n\t\t\tvalue, ok := elem.Val.(*ast.IdentNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\t}\n\t}\n\treturn f.nodeInfo(node)\n}\n\nfunc (f *File) nodeInfoByMethodRequest(list []*ast.MessageLiteralNode, req *RequestOption) *ast.NodeInfo {\n\tif req.Idx >= len(list) {\n\t\treturn nil\n\t}\n\tliteral := list[req.Idx]\n\tfor _, elem := range literal.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch {\n\t\tcase req.Field && fieldName == \"field\":\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\tcase req.By && fieldName == \"by\":\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\tcase req.If && fieldName == \"if\":\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\t}\n\t}\n\treturn f.nodeInfo(literal)\n}\n\nfunc (f *File) nodeInfoByRetry(node *ast.MessageLiteralNode, retry *RetryOption) *ast.NodeInfo {\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch {\n\t\tcase retry.If && fieldName == \"if\":\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\tcase retry.Constant != nil && fieldName == \"constant\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfoByRetryConstant(value, retry.Constant)\n\t\tcase retry.Exponential != nil && fieldName == \"exponential\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfoByRetryExponential(value, retry.Exponential)\n\t\t}\n\t}\n\treturn f.nodeInfo(node)\n}\n\nfunc (f *File) nodeInfoByRetryConstant(node *ast.MessageLiteralNode, constant *RetryConstantOption) *ast.NodeInfo {\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch {\n\t\tcase constant.Interval && fieldName == \"interval\":\n\t\t\treturn f.nodeInfo(elem.Val)\n\t\tcase constant.MaxRetries && fieldName == \"max_retries\":\n\t\t\treturn f.nodeInfo(elem.Val)\n\t\t}\n\t}\n\treturn f.nodeInfo(node)\n}\n\nfunc (f *File) nodeInfoByRetryExponential(node *ast.MessageLiteralNode, exp *RetryExponentialOption) *ast.NodeInfo {\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch {\n\t\tcase exp.InitialInterval && fieldName == \"initial_interval\":\n\t\t\treturn f.nodeInfo(elem.Val)\n\t\tcase exp.RandomizationFactor && fieldName == \"randomization_factor\":\n\t\t\treturn f.nodeInfo(elem.Val)\n\t\tcase exp.Multiplier && fieldName == \"multiplier\":\n\t\t\treturn f.nodeInfo(elem.Val)\n\t\tcase exp.MaxInterval && fieldName == \"max_interval\":\n\t\t\treturn f.nodeInfo(elem.Val)\n\t\tcase exp.MaxRetries && fieldName == \"max_retries\":\n\t\t\treturn f.nodeInfo(elem.Val)\n\t\t}\n\t}\n\treturn f.nodeInfo(node)\n}\n\nfunc (f *File) nodeInfoByMessageExpr(node *ast.MessageLiteralNode, msg *MessageExprOption) *ast.NodeInfo {\n\tvar args []*ast.MessageLiteralNode\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch {\n\t\tcase msg.Name && fieldName == \"name\":\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\tcase msg.Args != nil && fieldName == \"args\":\n\t\t\targs = append(args, f.getMessageListFromNode(elem.Val)...)\n\t\t}\n\t}\n\tif len(args) != 0 {\n\t\treturn f.nodeInfoByArgument(args, msg.Args)\n\t}\n\treturn f.nodeInfo(node)\n}\n\nfunc (f *File) nodeInfoByEnumExpr(node *ast.MessageLiteralNode, expr *EnumExprOption) *ast.NodeInfo {\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch {\n\t\tcase expr.Name && fieldName == \"name\":\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\tcase expr.By && fieldName == \"by\":\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\t}\n\t}\n\treturn f.nodeInfo(node)\n}\n\nfunc (f *File) nodeInfoByValidationExpr(node *ast.MessageLiteralNode, opt *ValidationExprOption) *ast.NodeInfo {\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch {\n\t\tcase opt.Name && fieldName == \"name\":\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\tcase fieldName == \"error\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfoByGRPCError([]*ast.MessageLiteralNode{value}, opt.Error)\n\t\t}\n\t}\n\treturn f.nodeInfo(node)\n}\n\nfunc (f *File) nodeInfoByGRPCError(list []*ast.MessageLiteralNode, opt *GRPCErrorOption) *ast.NodeInfo {\n\tif opt.Idx >= len(list) {\n\t\treturn nil\n\t}\n\tnode := list[opt.Idx]\n\tvar (\n\t\tdefs       []*ast.MessageLiteralNode\n\t\terrDetails []*ast.MessageLiteralNode\n\t)\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch {\n\t\tcase opt.If && fieldName == \"if\":\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\tcase opt.Ignore && fieldName == \"ignore\":\n\t\t\tvalue, ok := elem.Val.(*ast.IdentNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\tcase opt.IgnoreAndResponse && fieldName == \"ignore_and_response\":\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\tcase opt.Def != nil && fieldName == \"def\":\n\t\t\tdefs = append(defs, f.getMessageListFromNode(elem.Val)...)\n\t\tcase opt.Detail != nil && fieldName == \"details\":\n\t\t\terrDetails = append(errDetails, f.getMessageListFromNode(elem.Val)...)\n\t\t}\n\t}\n\tif len(defs) != 0 {\n\t\treturn f.nodeInfoByDef(defs, opt.Def)\n\t}\n\tif len(errDetails) != 0 {\n\t\treturn f.nodeInfoByGRPCErrorDetail(errDetails, opt.Detail)\n\t}\n\treturn f.nodeInfo(node)\n}\n\nfunc (f *File) nodeInfoByGRPCErrorDetail(list []*ast.MessageLiteralNode, detail *GRPCErrorDetailOption) *ast.NodeInfo {\n\tif detail.Idx >= len(list) {\n\t\treturn nil\n\t}\n\tnode := list[detail.Idx]\n\tvar (\n\t\tdefs                 []*ast.MessageLiteralNode\n\t\tmessages             []*ast.MessageLiteralNode\n\t\tpreconditionFailures []*ast.MessageLiteralNode\n\t\tbadRequests          []*ast.MessageLiteralNode\n\t\tlocalizedMessages    []*ast.MessageLiteralNode\n\t)\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch {\n\t\tcase detail.Def != nil && fieldName == \"def\":\n\t\t\tdefs = append(defs, f.getMessageListFromNode(elem.Val)...)\n\t\tcase detail.If && fieldName == \"if\":\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\tcase detail.By && fieldName == \"by\":\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\tcase detail.Message != nil && fieldName == \"message\":\n\t\t\tmessages = append(messages, f.getMessageListFromNode(elem.Val)...)\n\t\tcase detail.PreconditionFailure != nil && fieldName == \"precondition_failure\":\n\t\t\tpreconditionFailures = append(preconditionFailures, f.getMessageListFromNode(elem.Val)...)\n\t\tcase detail.BadRequest != nil && fieldName == \"bad_request\":\n\t\t\tbadRequests = append(badRequests, f.getMessageListFromNode(elem.Val)...)\n\t\tcase detail.LocalizedMessage != nil && fieldName == \"localized_message\":\n\t\t\tlocalizedMessages = append(localizedMessages, f.getMessageListFromNode(elem.Val)...)\n\t\t}\n\t}\n\tif len(defs) != 0 {\n\t\treturn f.nodeInfoByDef(defs, detail.Def)\n\t}\n\tif len(messages) != 0 {\n\t\treturn f.nodeInfoByDef(messages, detail.Message)\n\t}\n\tif len(preconditionFailures) != 0 {\n\t\treturn f.nodeInfoByPreconditionFailure(preconditionFailures, detail.PreconditionFailure)\n\t}\n\tif len(badRequests) != 0 {\n\t\treturn f.nodeInfoByBadRequest(badRequests, detail.BadRequest)\n\t}\n\tif len(localizedMessages) != 0 {\n\t\treturn f.nodeInfoByLocalizedMessage(localizedMessages, detail.LocalizedMessage)\n\t}\n\n\treturn f.nodeInfo(node)\n}\n\nfunc (f *File) nodeInfoBySwitchExpr(node *ast.MessageLiteralNode, opt *SwitchExprOption) *ast.NodeInfo {\n\tcaseCount := 0\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch {\n\t\tcase opt.Case != nil && fieldName == \"case\":\n\t\t\tif caseCount == opt.Case.Idx {\n\t\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\treturn f.nodeInfoBySwitchCaseExpr(value, opt.Case)\n\t\t\t}\n\t\t\tcaseCount++\n\t\tcase opt.Default != nil && fieldName == \"default\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfoBySwitchDefaultExpr(value, opt.Default)\n\t\t}\n\t}\n\treturn f.nodeInfo(node)\n}\n\nfunc (f *File) nodeInfoBySwitchCaseExpr(node *ast.MessageLiteralNode, opt *SwitchCaseExprOption) *ast.NodeInfo {\n\tvar defs []*ast.MessageLiteralNode\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch {\n\t\tcase opt.Def != nil && fieldName == \"def\":\n\t\t\tdefs = append(defs, f.getMessageListFromNode(elem.Val)...)\n\t\tcase opt.If && fieldName == \"if\":\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\tcase opt.By && fieldName == \"by\":\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\t}\n\t}\n\tif len(defs) != 0 {\n\t\treturn f.nodeInfoByDef(defs, opt.Def)\n\t}\n\treturn f.nodeInfo(node)\n}\n\nfunc (f *File) nodeInfoBySwitchDefaultExpr(node *ast.MessageLiteralNode, opt *SwitchDefaultExprOption) *ast.NodeInfo {\n\tvar defs []*ast.MessageLiteralNode\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch {\n\t\tcase opt.Def != nil && fieldName == \"def\":\n\t\t\tdefs = append(defs, f.getMessageListFromNode(elem.Val)...)\n\t\tcase opt.By && fieldName == \"by\":\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\t}\n\t}\n\tif len(defs) != 0 {\n\t\treturn f.nodeInfoByDef(defs, opt.Def)\n\t}\n\treturn f.nodeInfo(node)\n}\n\nfunc (f *File) nodeInfoByPreconditionFailure(list []*ast.MessageLiteralNode, failure *GRPCErrorDetailPreconditionFailureOption) *ast.NodeInfo {\n\tif failure.Idx >= len(list) {\n\t\treturn nil\n\t}\n\tnode := list[failure.Idx]\n\tvar violations []*ast.MessageLiteralNode\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tif fieldName == \"violations\" {\n\t\t\tviolations = append(violations, f.getMessageListFromNode(elem.Val)...)\n\t\t}\n\t}\n\tif len(violations) != 0 {\n\t\treturn f.nodeInfoByPreconditionFailureViolations(violations, failure.Violation)\n\t}\n\treturn f.nodeInfo(node)\n}\n\nfunc (f *File) nodeInfoByPreconditionFailureViolations(list []*ast.MessageLiteralNode, violation GRPCErrorDetailPreconditionFailureViolationOption) *ast.NodeInfo {\n\tif violation.Idx >= len(list) {\n\t\treturn nil\n\t}\n\tnode := list[violation.Idx]\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tif string(fieldName) == violation.FieldName {\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\t}\n\t}\n\treturn f.nodeInfo(node)\n}\n\nfunc (f *File) nodeInfoByBadRequest(list []*ast.MessageLiteralNode, req *GRPCErrorDetailBadRequestOption) *ast.NodeInfo {\n\tif req.Idx >= len(list) {\n\t\treturn nil\n\t}\n\tnode := list[req.Idx]\n\tvar violations []*ast.MessageLiteralNode\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tif fieldName == \"field_violations\" {\n\t\t\tviolations = append(violations, f.getMessageListFromNode(elem.Val)...)\n\t\t}\n\t}\n\tif len(violations) != 0 {\n\t\treturn f.nodeInfoByBadRequestFieldViolations(violations, req.FieldViolation)\n\t}\n\treturn f.nodeInfo(node)\n}\n\nfunc (f *File) nodeInfoByLocalizedMessage(list []*ast.MessageLiteralNode, msg *GRPCErrorDetailLocalizedMessageOption) *ast.NodeInfo {\n\tif msg.Idx >= len(list) {\n\t\treturn nil\n\t}\n\tnode := list[msg.Idx]\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tif string(fieldName) == msg.FieldName {\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\t}\n\t}\n\treturn f.nodeInfo(node)\n}\n\nfunc (f *File) nodeInfoByBadRequestFieldViolations(list []*ast.MessageLiteralNode, violation GRPCErrorDetailBadRequestFieldViolationOption) *ast.NodeInfo {\n\tif violation.Idx >= len(list) {\n\t\treturn nil\n\t}\n\tnode := list[violation.Idx]\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tif string(fieldName) == violation.FieldName {\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\t}\n\t}\n\treturn f.nodeInfo(node)\n}\n\nfunc (f *File) nodeInfoByArgument(list []*ast.MessageLiteralNode, arg *ArgumentOption) *ast.NodeInfo {\n\tif arg.Idx >= len(list) {\n\t\treturn nil\n\t}\n\tliteral := list[arg.Idx]\n\tfor _, elem := range literal.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch {\n\t\tcase arg.By && fieldName == \"by\":\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\tcase arg.Inline && fieldName == \"inline\":\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\t}\n\t}\n\treturn f.nodeInfo(literal)\n}\n\nfunc (f *File) nodeInfoByField(node ast.FieldDeclNode, field *Field) *ast.NodeInfo {\n\topts := node.GetOptions()\n\tif field.Option != nil && opts != nil {\n\t\tfor _, opt := range opts.Options {\n\t\t\tif !f.matchOption(f.optionName(opt), fieldOptionName) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\treturn f.nodeInfoByFieldOption(opt, field.Option)\n\t\t}\n\t}\n\tif field.Type && node.FieldType() != nil {\n\t\treturn f.nodeInfo(node.FieldType())\n\t}\n\treturn f.nodeInfo(node)\n}\n\nfunc (f *File) nodeInfoByFieldOption(node *ast.OptionNode, opt *FieldOption) *ast.NodeInfo {\n\tswitch n := node.Val.(type) {\n\tcase *ast.StringLiteralNode:\n\t\tif opt.By && strings.HasSuffix(f.optionName(node), \"by\") {\n\t\t\treturn f.nodeInfo(n)\n\t\t}\n\tcase *ast.MessageLiteralNode:\n\t\tif opt.Oneof != nil && strings.HasSuffix(f.optionName(node), \"oneof\") {\n\t\t\treturn f.nodeInfoByFieldOneof(n, opt.Oneof)\n\t\t}\n\t\tfor _, elem := range n.Elements {\n\t\t\toptName := elem.Name.Name.AsIdentifier()\n\t\t\tswitch {\n\t\t\tcase opt.By && optName == \"by\":\n\t\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\treturn f.nodeInfo(value)\n\t\t\tcase opt.Oneof != nil && optName == \"oneof\":\n\t\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\treturn f.nodeInfoByFieldOneof(value, opt.Oneof)\n\t\t\t}\n\t\t}\n\t}\n\treturn f.nodeInfo(node)\n}\n\nfunc (f *File) nodeInfoByFieldOneof(node *ast.MessageLiteralNode, opt *FieldOneof) *ast.NodeInfo {\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch {\n\t\tcase opt.If && fieldName == \"if\":\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\tcase opt.Default && fieldName == \"default\":\n\t\t\treturn f.nodeInfo(elem.Val)\n\t\tcase opt.Def != nil && fieldName == \"def\":\n\t\t\treturn f.nodeInfoByDef(f.getMessageListFromNode(elem.Val), opt.Def)\n\t\tcase opt.By && fieldName == \"by\":\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\t}\n\t}\n\treturn f.nodeInfo(node)\n}\n\nfunc (f *File) nodeInfoByService(node *ast.ServiceNode, svc *Service) *ast.NodeInfo {\n\tfor _, decl := range node.Decls {\n\t\tswitch n := decl.(type) {\n\t\tcase *ast.OptionNode:\n\t\t\tif !f.matchOption(f.optionName(n), serviceOptionName) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif svc.Option != nil {\n\t\t\t\treturn f.nodeInfoByServiceOption(n, svc.Option)\n\t\t\t}\n\t\tcase *ast.RPCNode:\n\t\t\tif svc.Method == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif n.Name.Val != svc.Method.Name {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\treturn f.nodeInfoByMethod(n, svc.Method)\n\t\t}\n\t}\n\treturn f.nodeInfo(node)\n}\n\nfunc (f *File) nodeInfoByServiceOption(node *ast.OptionNode, opt *ServiceOption) *ast.NodeInfo {\n\tswitch n := node.Val.(type) {\n\tcase *ast.MessageLiteralNode:\n\t\tvar vars []*ast.MessageLiteralNode\n\t\tfor _, elem := range n.Elements {\n\t\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\t\tswitch {\n\t\t\tcase opt.Env != nil && fieldName == \"env\":\n\t\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\treturn f.nodeInfoByEnv(value, opt.Env)\n\t\t\tcase opt.Var != nil && fieldName == \"var\":\n\t\t\t\tvars = append(vars, f.getMessageListFromNode(elem.Val)...)\n\t\t\t}\n\t\t}\n\t\tif len(vars) != 0 {\n\t\t\treturn f.nodeInfoByServiceVariable(vars, opt.Var)\n\t\t}\n\t}\n\treturn f.nodeInfo(node)\n}\n\nfunc (f *File) nodeInfoByEnv(node *ast.MessageLiteralNode, env *Env) *ast.NodeInfo {\n\tvar vars []*ast.MessageLiteralNode\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch {\n\t\tcase env.Message && fieldName == \"message\":\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\tcase env.Var != nil && fieldName == \"var\":\n\t\t\tvars = append(vars, f.getMessageListFromNode(elem.Val)...)\n\t\t}\n\t}\n\tif len(vars) != 0 {\n\t\treturn f.nodeInfoByEnvVar(vars, env.Var)\n\t}\n\treturn f.nodeInfo(node)\n}\n\nfunc (f *File) nodeInfoByEnvVar(list []*ast.MessageLiteralNode, v *EnvVar) *ast.NodeInfo {\n\tif v.Idx >= len(list) {\n\t\treturn nil\n\t}\n\tnode := list[v.Idx]\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch {\n\t\tcase v.Name && fieldName == \"name\":\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\t}\n\t}\n\treturn f.nodeInfo(node)\n}\n\nfunc (f *File) nodeInfoByServiceVariable(list []*ast.MessageLiteralNode, svcVar *ServiceVariable) *ast.NodeInfo {\n\tif svcVar.Idx >= len(list) {\n\t\treturn nil\n\t}\n\tnode := list[svcVar.Idx]\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch {\n\t\tcase svcVar.Name && fieldName == \"name\":\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\tcase svcVar.If && fieldName == \"if\":\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\tcase svcVar.By && fieldName == \"by\":\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\tcase svcVar.Map != nil && fieldName == \"map\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfoByMapExpr(value, svcVar.Map)\n\t\tcase svcVar.Message != nil && fieldName == \"message\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfoByMessageExpr(value, svcVar.Message)\n\t\tcase svcVar.Enum != nil && fieldName == \"enum\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfoByEnumExpr(value, svcVar.Enum)\n\t\tcase svcVar.Switch != nil && fieldName == \"switch\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfoBySwitchExpr(value, svcVar.Switch)\n\t\tcase svcVar.Validation != nil && fieldName == \"validation\":\n\t\t\tvalue, ok := elem.Val.(*ast.MessageLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfoByServiceVariableValidationExpr(value, svcVar.Validation)\n\t\t}\n\t}\n\treturn f.nodeInfo(node)\n}\n\nfunc (f *File) nodeInfoByServiceVariableValidationExpr(node *ast.MessageLiteralNode, expr *ServiceVariableValidationExpr) *ast.NodeInfo {\n\tfor _, elem := range node.Elements {\n\t\tfieldName := elem.Name.Name.AsIdentifier()\n\t\tswitch {\n\t\tcase expr.If && fieldName == \"if\":\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\tcase expr.Message && fieldName == \"message\":\n\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn f.nodeInfo(value)\n\t\t}\n\t}\n\treturn f.nodeInfo(node)\n}\n\nfunc (f *File) nodeInfoByMethod(node *ast.RPCNode, mtd *Method) *ast.NodeInfo {\n\tfor _, decl := range node.Decls {\n\t\tswitch n := decl.(type) {\n\t\tcase *ast.OptionNode:\n\t\t\tif !f.matchOption(f.optionName(n), methodOptionName) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif mtd.Option != nil {\n\t\t\t\treturn f.nodeInfoByMethodOption(n, mtd.Option)\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (f *File) nodeInfoByMethodOption(node *ast.OptionNode, opt *MethodOption) *ast.NodeInfo {\n\tswitch n := node.Val.(type) {\n\tcase *ast.StringLiteralNode:\n\t\tif opt.Timeout && strings.HasSuffix(f.optionName(node), \"timeout\") {\n\t\t\treturn f.nodeInfo(n)\n\t\t}\n\t\tif opt.Response && strings.HasSuffix(f.optionName(node), \"response\") {\n\t\t\treturn f.nodeInfo(n)\n\t\t}\n\tcase *ast.MessageLiteralNode:\n\t\tfor _, elem := range n.Elements {\n\t\t\toptName := elem.Name.Name.AsIdentifier()\n\t\t\tswitch {\n\t\t\tcase opt.Timeout && optName == \"timeout\":\n\t\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\treturn f.nodeInfo(value)\n\t\t\tcase opt.Response && optName == \"response\":\n\t\t\t\tvalue, ok := elem.Val.(*ast.StringLiteralNode)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\treturn f.nodeInfo(value)\n\t\t\t}\n\t\t}\n\t}\n\treturn f.nodeInfo(node)\n}\n\nfunc (f *File) nodeInfo(node ast.Node) *ast.NodeInfo {\n\tif node == nil {\n\t\treturn nil\n\t}\n\tn := f.fileNode.NodeInfo(node)\n\treturn &n\n}\n\nfunc (f *File) matchOption(target, opt string) bool {\n\treturn strings.HasPrefix(strings.TrimPrefix(target, \".\"), opt)\n}\n"
  },
  {
    "path": "source/file_test.go",
    "content": "package source_test\n\nimport (\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\n\t\"github.com/mercari/grpc-federation/source\"\n)\n\nfunc TestFile_FindLocationByPos(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tdesc     string\n\t\tfile     string\n\t\tpos      source.Position\n\t\texpected *source.Location\n\t}{\n\t\t{\n\t\t\tdesc: \"find nothing\",\n\t\t\tfile: \"service.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 21,\n\t\t\t\tCol:  1,\n\t\t\t},\n\t\t\texpected: nil,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find a MethodOption string timeout\",\n\t\t\tfile: \"service.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 19,\n\t\t\t\tCol:  47,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/service.proto\",\n\t\t\t\tService: &source.Service{\n\t\t\t\t\tName: \"FederationService\",\n\t\t\t\t\tMethod: &source.Method{\n\t\t\t\t\t\tName:   \"GetPost\",\n\t\t\t\t\t\tOption: &source.MethodOption{Timeout: true},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"find a MethodOption message timeout\",\n\t\t\tfile: \"service.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 23,\n\t\t\t\tCol:  16,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/service.proto\",\n\t\t\t\tService: &source.Service{\n\t\t\t\t\tName: \"FederationService\",\n\t\t\t\t\tMethod: &source.Method{\n\t\t\t\t\t\tName:   \"GetPost2\",\n\t\t\t\t\t\tOption: &source.MethodOption{Timeout: true},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"find a CallExprOption method\",\n\t\t\tfile: \"service.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 51,\n\t\t\t\tCol:  20,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/service.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"Post\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx:  0,\n\t\t\t\t\t\t\tCall: &source.CallExprOption{Method: true},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"find a CallExprOption request field\",\n\t\t\tfile: \"service.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 52,\n\t\t\t\tCol:  29,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/service.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"Post\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tCall: &source.CallExprOption{\n\t\t\t\t\t\t\t\tRequest: &source.RequestOption{Field: true},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"find a CallExprOption request by\",\n\t\t\tfile: \"service.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 52,\n\t\t\t\tCol:  39,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/service.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"Post\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tCall: &source.CallExprOption{\n\t\t\t\t\t\t\t\tRequest: &source.RequestOption{By: true},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"find a FieldOption by\",\n\t\t\tfile: \"service.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 42,\n\t\t\t\tCol:  47,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/service.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"GetPostResponse\",\n\t\t\t\t\tField: &source.Field{\n\t\t\t\t\t\tName:   \"post\",\n\t\t\t\t\t\tOption: &source.FieldOption{By: true},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"find a MessageExprOption message\",\n\t\t\tfile: \"service.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 37,\n\t\t\t\tCol:  15,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/service.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"GetPostResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tMessage: &source.MessageExprOption{\n\t\t\t\t\t\t\t\tName: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"find a MessageExprOption arg name\",\n\t\t\tfile: \"service.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 38,\n\t\t\t\tCol:  24,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/service.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"GetPostResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tMessage: &source.MessageExprOption{\n\t\t\t\t\t\t\t\tArgs: &source.ArgumentOption{Name: true},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"find a MessageExprOption arg by\",\n\t\t\tfile: \"service.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 38,\n\t\t\t\tCol:  34,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/service.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"GetPostResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tMessage: &source.MessageExprOption{\n\t\t\t\t\t\t\t\tArgs: &source.ArgumentOption{By: true},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"find a MessageExprOption arg inline\",\n\t\t\tfile: \"service.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 60,\n\t\t\t\tCol:  26,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/service.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"Post\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 2,\n\t\t\t\t\t\t\tMessage: &source.MessageExprOption{\n\t\t\t\t\t\t\t\tArgs: &source.ArgumentOption{Inline: true},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t// Additional coverage tests for various FindLocationByPos scenarios\n\t\t// Service-related tests to cover 0% functions\n\t\t{\n\t\t\tdesc: \"find service env message\",\n\t\t\tfile: \"coverage.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 15,\n\t\t\t\tCol:  19,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tService: &source.Service{\n\t\t\t\t\tName: \"CoverageService\",\n\t\t\t\t\tOption: &source.ServiceOption{\n\t\t\t\t\t\tEnv: &source.Env{Message: true},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"find service variable name\",\n\t\t\tfile: \"coverage.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 38,\n\t\t\t\tCol:  16,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tService: &source.Service{\n\t\t\t\t\tName: \"CoverageService\",\n\t\t\t\t\tOption: &source.ServiceOption{\n\t\t\t\t\t\tVar: &source.ServiceVariable{\n\t\t\t\t\t\t\tIdx:  0,\n\t\t\t\t\t\t\tName: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"find service variable if condition\",\n\t\t\tfile: \"coverage.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 39,\n\t\t\t\tCol:  14,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tService: &source.Service{\n\t\t\t\t\tName: \"CoverageService\",\n\t\t\t\t\tOption: &source.ServiceOption{\n\t\t\t\t\t\tVar: &source.ServiceVariable{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tIf:  true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"find service variable by expression\",\n\t\t\tfile: \"coverage.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 40,\n\t\t\t\tCol:  15,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tService: &source.Service{\n\t\t\t\t\tName: \"CoverageService\",\n\t\t\t\t\tOption: &source.ServiceOption{\n\t\t\t\t\t\tVar: &source.ServiceVariable{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tBy:  true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"find service variable validation if\",\n\t\t\tfile: \"coverage.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 42,\n\t\t\t\tCol:  17,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tService: &source.Service{\n\t\t\t\t\tName: \"CoverageService\",\n\t\t\t\t\tOption: &source.ServiceOption{\n\t\t\t\t\t\tVar: &source.ServiceVariable{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tValidation: &source.ServiceVariableValidationExpr{\n\t\t\t\t\t\t\t\tIf: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"find service variable validation message\",\n\t\t\tfile: \"coverage.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 43,\n\t\t\t\tCol:  22,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tService: &source.Service{\n\t\t\t\t\tName: \"CoverageService\",\n\t\t\t\t\tOption: &source.ServiceOption{\n\t\t\t\t\t\tVar: &source.ServiceVariable{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tValidation: &source.ServiceVariableValidationExpr{\n\t\t\t\t\t\t\t\tMessage: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t// Additional advanced coverage tests that successfully passed\n\t\t{\n\t\t\tdesc: \"find file option import single value\",\n\t\t\tfile: \"coverage.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 9,\n\t\t\t\tCol:  22,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName:   \"testdata/coverage.proto\",\n\t\t\t\tImportName: \"multiple_import.proto\",\n\t\t\t},\n\t\t},\n\t\t// Enum-related test cases\n\t\t{\n\t\t\tdesc: \"find enum option alias\",\n\t\t\tfile: \"coverage.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 226,\n\t\t\t\tCol:  12,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tEnum: &source.Enum{\n\t\t\t\t\tName:   \"ItemType\",\n\t\t\t\t\tOption: &source.EnumOption{Alias: true},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"find enum value option alias\",\n\t\t\tfile: \"coverage.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 229,\n\t\t\t\tCol:  19,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tEnum: &source.Enum{\n\t\t\t\t\tName: \"ItemType\",\n\t\t\t\t\tValue: &source.EnumValue{\n\t\t\t\t\t\tValue: \"UNKNOWN\",\n\t\t\t\t\t\tOption: &source.EnumValueOption{\n\t\t\t\t\t\t\tAlias: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"find enum value option default\",\n\t\t\tfile: \"coverage.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 231,\n\t\t\t\tCol:  14,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tEnum: &source.Enum{\n\t\t\t\t\tName: \"ItemType\",\n\t\t\t\t\tValue: &source.EnumValue{\n\t\t\t\t\t\tValue: \"UNKNOWN\",\n\t\t\t\t\t\tOption: &source.EnumValueOption{\n\t\t\t\t\t\t\tDefault: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"find enum value attribute name\",\n\t\t\tfile: \"coverage.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 233,\n\t\t\t\tCol:  20,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tEnum: &source.Enum{\n\t\t\t\t\tName: \"ItemType\",\n\t\t\t\t\tValue: &source.EnumValue{\n\t\t\t\t\t\tValue: \"UNKNOWN\",\n\t\t\t\t\t\tOption: &source.EnumValueOption{\n\t\t\t\t\t\t\tAttr: &source.EnumValueAttribute{\n\t\t\t\t\t\t\t\tIdx:  0,\n\t\t\t\t\t\t\t\tName: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"find enum value attribute value\",\n\t\t\tfile: \"coverage.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 233,\n\t\t\t\tCol:  35,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tEnum: &source.Enum{\n\t\t\t\t\tName: \"ItemType\",\n\t\t\t\t\tValue: &source.EnumValue{\n\t\t\t\t\t\tValue: \"UNKNOWN\",\n\t\t\t\t\t\tOption: &source.EnumValueOption{\n\t\t\t\t\t\t\tAttr: &source.EnumValueAttribute{\n\t\t\t\t\t\t\t\tIdx:   0,\n\t\t\t\t\t\t\t\tValue: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t// Oneof field test cases\n\t\t{\n\t\t\tdesc: \"find oneof field option\",\n\t\t\tfile: \"coverage.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 365,\n\t\t\t\tCol:  13,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"NestedMessage\",\n\t\t\t\t\tOneof: &source.Oneof{\n\t\t\t\t\t\tName: \"choice\",\n\t\t\t\t\t\tField: &source.Field{\n\t\t\t\t\t\t\tName: \"text\",\n\t\t\t\t\t\t\tOption: &source.FieldOption{\n\t\t\t\t\t\t\t\tOneof: &source.FieldOneof{\n\t\t\t\t\t\t\t\t\tIf: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"find oneof field default\",\n\t\t\tfile: \"coverage.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 366,\n\t\t\t\tCol:  18,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"NestedMessage\",\n\t\t\t\t\tOneof: &source.Oneof{\n\t\t\t\t\t\tName: \"choice\",\n\t\t\t\t\t\tField: &source.Field{\n\t\t\t\t\t\t\tName: \"text\",\n\t\t\t\t\t\t\tOption: &source.FieldOption{\n\t\t\t\t\t\t\t\tOneof: &source.FieldOneof{\n\t\t\t\t\t\t\t\t\tDefault: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t// Validation expression test cases\n\t\t{\n\t\t\tdesc: \"find validation expr name\",\n\t\t\tfile: \"coverage.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 282,\n\t\t\t\tCol:  18,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"User\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tValidation: &source.ValidationExprOption{\n\t\t\t\t\t\t\t\tName: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"find validation expr error if\",\n\t\t\tfile: \"coverage.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 285,\n\t\t\t\tCol:  23,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"User\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tValidation: &source.ValidationExprOption{\n\t\t\t\t\t\t\t\tError: &source.GRPCErrorOption{\n\t\t\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\t\t\tIf:  true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t// Map expression test cases\n\t\t{\n\t\t\tdesc: \"find map expr enum name\",\n\t\t\tfile: \"coverage.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 324,\n\t\t\t\tCol:  19,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"User\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 1,\n\t\t\t\t\t\t\tMap: &source.MapExprOption{\n\t\t\t\t\t\t\t\tEnum: &source.EnumExprOption{\n\t\t\t\t\t\t\t\t\tName: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"find map expr enum by\",\n\t\t\tfile: \"coverage.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 325,\n\t\t\t\tCol:  17,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"User\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 1,\n\t\t\t\t\t\t\tMap: &source.MapExprOption{\n\t\t\t\t\t\t\t\tEnum: &source.EnumExprOption{\n\t\t\t\t\t\t\t\t\tBy: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"find map expr message name\",\n\t\t\tfile: \"coverage.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 334,\n\t\t\t\tCol:  19,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"User\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 2,\n\t\t\t\t\t\t\tMap: &source.MapExprOption{\n\t\t\t\t\t\t\t\tMessage: &source.MessageExprOption{\n\t\t\t\t\t\t\t\t\tName: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t// Message argument test cases\n\t\t{\n\t\t\tdesc: \"find message arg name\",\n\t\t\tfile: \"coverage.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 346,\n\t\t\t\tCol:  22,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"User\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 3,\n\t\t\t\t\t\t\tMessage: &source.MessageExprOption{\n\t\t\t\t\t\t\t\tArgs: &source.ArgumentOption{\n\t\t\t\t\t\t\t\t\tIdx:  0,\n\t\t\t\t\t\t\t\t\tName: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"find message arg by\",\n\t\t\tfile: \"coverage.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 346,\n\t\t\t\tCol:  32,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"User\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 3,\n\t\t\t\t\t\t\tMessage: &source.MessageExprOption{\n\t\t\t\t\t\t\t\tArgs: &source.ArgumentOption{\n\t\t\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\t\t\tBy:  true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"find message arg inline\",\n\t\t\tfile: \"coverage.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 347,\n\t\t\t\tCol:  60,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"User\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 3,\n\t\t\t\t\t\t\tMessage: &source.MessageExprOption{\n\t\t\t\t\t\t\t\tArgs: &source.ArgumentOption{\n\t\t\t\t\t\t\t\t\tIdx:    1,\n\t\t\t\t\t\t\t\t\tInline: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t// Retry option test cases\n\t\t{\n\t\t\tdesc: \"find retry constant interval\",\n\t\t\tfile: \"coverage.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 103,\n\t\t\t\tCol:  25,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"ComplexResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tCall: &source.CallExprOption{\n\t\t\t\t\t\t\t\tRetry: &source.RetryOption{\n\t\t\t\t\t\t\t\t\tConstant: &source.RetryConstantOption{\n\t\t\t\t\t\t\t\t\t\tInterval: true,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"find retry exponential initial_interval\",\n\t\t\tfile: \"coverage.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 115,\n\t\t\t\tCol:  33,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"ComplexResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 1,\n\t\t\t\t\t\t\tCall: &source.CallExprOption{\n\t\t\t\t\t\t\t\tRetry: &source.RetryOption{\n\t\t\t\t\t\t\t\t\tExponential: &source.RetryExponentialOption{\n\t\t\t\t\t\t\t\t\t\tInitialInterval: true,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t// Environment variable option test cases\n\t\t{\n\t\t\tdesc: \"find env var alternate\",\n\t\t\tfile: \"coverage.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 22,\n\t\t\t\tCol:  24,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tService: &source.Service{\n\t\t\t\t\tName: \"CoverageService\",\n\t\t\t\t\tOption: &source.ServiceOption{\n\t\t\t\t\t\tEnv: &source.Env{\n\t\t\t\t\t\t\tVar: &source.EnvVar{\n\t\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\t\tOption: &source.EnvVarOption{\n\t\t\t\t\t\t\t\t\tAlternate: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"find env var required\",\n\t\t\tfile: \"coverage.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 23,\n\t\t\t\tCol:  23,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tService: &source.Service{\n\t\t\t\t\tName: \"CoverageService\",\n\t\t\t\t\tOption: &source.ServiceOption{\n\t\t\t\t\t\tEnv: &source.Env{\n\t\t\t\t\t\t\tVar: &source.EnvVar{\n\t\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\t\tOption: &source.EnvVarOption{\n\t\t\t\t\t\t\t\t\tRequired: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t// Switch expression option test cases (using testdata/switch.proto)\n\t\t{\n\t\t\tdesc: \"find def with switch (switch keyword)\",\n\t\t\tfile: \"switch.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 22,\n\t\t\t\tCol:  7,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/switch.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"GetPostResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx:    0,\n\t\t\t\t\t\t\tSwitch: &source.SwitchExprOption{},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"find first case if condition\",\n\t\t\tfile: \"switch.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 25,\n\t\t\t\tCol:  16,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/switch.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"GetPostResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tSwitch: &source.SwitchExprOption{\n\t\t\t\t\t\t\t\tCase: &source.SwitchCaseExprOption{\n\t\t\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\t\t\tIf:  true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"find first case by expression\",\n\t\t\tfile: \"switch.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 25,\n\t\t\t\tCol:  36,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/switch.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"GetPostResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tSwitch: &source.SwitchExprOption{\n\t\t\t\t\t\t\t\tCase: &source.SwitchCaseExprOption{\n\t\t\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\t\t\tBy:  true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"find first case def\",\n\t\t\tfile: \"switch.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 24,\n\t\t\t\tCol:  18,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/switch.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"GetPostResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tSwitch: &source.SwitchExprOption{\n\t\t\t\t\t\t\t\tCase: &source.SwitchCaseExprOption{\n\t\t\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\t\t\tDef: &source.VariableDefinitionOption{Idx: 0},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"find default by expression\",\n\t\t\tfile: \"switch.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 30,\n\t\t\t\tCol:  15,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/switch.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"GetPostResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tSwitch: &source.SwitchExprOption{\n\t\t\t\t\t\t\t\tDefault: &source.SwitchDefaultExprOption{\n\t\t\t\t\t\t\t\t\tBy: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdesc: \"find default def\",\n\t\t\tfile: \"switch.proto\",\n\t\t\tpos: source.Position{\n\t\t\t\tLine: 29,\n\t\t\t\tCol:  18,\n\t\t\t},\n\t\t\texpected: &source.Location{\n\t\t\t\tFileName: \"testdata/switch.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"GetPostResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tSwitch: &source.SwitchExprOption{\n\t\t\t\t\t\t\t\tDefault: &source.SwitchDefaultExprOption{\n\t\t\t\t\t\t\t\t\tDef: &source.VariableDefinitionOption{Idx: 0},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.desc, func(t *testing.T) {\n\t\t\tpath := filepath.Join(\"testdata\", tc.file)\n\t\t\tcontent, err := os.ReadFile(path)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tsourceFile, err := source.NewFile(path, content)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tgot := sourceFile.FindLocationByPos(tc.pos)\n\t\t\tif diff := cmp.Diff(got, tc.expected); diff != \"\" {\n\t\t\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestFile_NodeInfoByLocation(t *testing.T) {\n\tt.Parallel()\n\n\t// First read the proto file content\n\tpath := filepath.Join(\"testdata\", \"coverage.proto\")\n\tcontent, err := os.ReadFile(path)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tsourceFile, err := source.NewFile(path, content)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\ttests := []struct {\n\t\tdesc     string\n\t\tlocation *source.Location\n\t\twantNil  bool\n\t}{\n\t\t{\n\t\t\tdesc: \"find service option env message\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tService: &source.Service{\n\t\t\t\t\tName: \"CoverageService\",\n\t\t\t\t\tOption: &source.ServiceOption{\n\t\t\t\t\t\tEnv: &source.Env{Message: true},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find service option env var name\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tService: &source.Service{\n\t\t\t\t\tName: \"CoverageService\",\n\t\t\t\t\tOption: &source.ServiceOption{\n\t\t\t\t\t\tEnv: &source.Env{\n\t\t\t\t\t\t\tVar: &source.EnvVar{\n\t\t\t\t\t\t\t\tIdx:  0,\n\t\t\t\t\t\t\t\tName: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find service variable name\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tService: &source.Service{\n\t\t\t\t\tName: \"CoverageService\",\n\t\t\t\t\tOption: &source.ServiceOption{\n\t\t\t\t\t\tVar: &source.ServiceVariable{\n\t\t\t\t\t\t\tIdx:  0,\n\t\t\t\t\t\t\tName: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find service variable if condition\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tService: &source.Service{\n\t\t\t\t\tName: \"CoverageService\",\n\t\t\t\t\tOption: &source.ServiceOption{\n\t\t\t\t\t\tVar: &source.ServiceVariable{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tIf:  true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find service variable by expression\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tService: &source.Service{\n\t\t\t\t\tName: \"CoverageService\",\n\t\t\t\t\tOption: &source.ServiceOption{\n\t\t\t\t\t\tVar: &source.ServiceVariable{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tBy:  true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find service variable validation if\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tService: &source.Service{\n\t\t\t\t\tName: \"CoverageService\",\n\t\t\t\t\tOption: &source.ServiceOption{\n\t\t\t\t\t\tVar: &source.ServiceVariable{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tValidation: &source.ServiceVariableValidationExpr{\n\t\t\t\t\t\t\t\tIf: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find service variable validation message\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tService: &source.Service{\n\t\t\t\t\tName: \"CoverageService\",\n\t\t\t\t\tOption: &source.ServiceOption{\n\t\t\t\t\t\tVar: &source.ServiceVariable{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tValidation: &source.ServiceVariableValidationExpr{\n\t\t\t\t\t\t\t\tMessage: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find method option timeout\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tService: &source.Service{\n\t\t\t\t\tName: \"CoverageService\",\n\t\t\t\t\tMethod: &source.Method{\n\t\t\t\t\t\tName:   \"GetData\",\n\t\t\t\t\t\tOption: &source.MethodOption{Timeout: true},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find call expr method\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"DataResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx:  0,\n\t\t\t\t\t\t\tCall: &source.CallExprOption{Method: true},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find call expr timeout\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"DataResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx:  0,\n\t\t\t\t\t\t\tCall: &source.CallExprOption{Timeout: true},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find call expr metadata\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"DataResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx:  0,\n\t\t\t\t\t\t\tCall: &source.CallExprOption{Metadata: true},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find call expr retry if\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"DataResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tCall: &source.CallExprOption{\n\t\t\t\t\t\t\t\tRetry: &source.RetryOption{If: true},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find grpc call option content subtype\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"DataResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tCall: &source.CallExprOption{\n\t\t\t\t\t\t\t\tOption: &source.GRPCCallOption{\n\t\t\t\t\t\t\t\t\tContentSubtype: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find grpc call option header\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"DataResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tCall: &source.CallExprOption{\n\t\t\t\t\t\t\t\tOption: &source.GRPCCallOption{\n\t\t\t\t\t\t\t\t\tHeader: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find grpc call option trailer\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"DataResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tCall: &source.CallExprOption{\n\t\t\t\t\t\t\t\tOption: &source.GRPCCallOption{\n\t\t\t\t\t\t\t\t\tTrailer: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find grpc call option static method\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"DataResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tCall: &source.CallExprOption{\n\t\t\t\t\t\t\t\tOption: &source.GRPCCallOption{\n\t\t\t\t\t\t\t\t\tStaticMethod: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find method request field\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"DataResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tCall: &source.CallExprOption{\n\t\t\t\t\t\t\t\tRequest: &source.RequestOption{\n\t\t\t\t\t\t\t\t\tIdx:   0,\n\t\t\t\t\t\t\t\t\tField: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find method request by\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"DataResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tCall: &source.CallExprOption{\n\t\t\t\t\t\t\t\tRequest: &source.RequestOption{\n\t\t\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\t\t\tBy:  true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find method request if\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"DataResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tCall: &source.CallExprOption{\n\t\t\t\t\t\t\t\tRequest: &source.RequestOption{\n\t\t\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\t\t\tIf:  true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find validation expr name\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"User\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tValidation: &source.ValidationExprOption{\n\t\t\t\t\t\t\t\tName: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find field by option\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"DataItem\",\n\t\t\t\t\tField: &source.Field{\n\t\t\t\t\t\tName:   \"value\",\n\t\t\t\t\t\tOption: &source.FieldOption{By: true},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find oneof option\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"NestedMessage\",\n\t\t\t\t\tOneof: &source.Oneof{\n\t\t\t\t\t\tName:   \"choice\",\n\t\t\t\t\t\tOption: &source.OneofOption{},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false, // Oneof option returns node info\n\t\t},\n\t\t{\n\t\t\tdesc: \"find enum option alias\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tEnum: &source.Enum{\n\t\t\t\t\tName:   \"ItemType\",\n\t\t\t\t\tOption: &source.EnumOption{Alias: true},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find enum value alias\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tEnum: &source.Enum{\n\t\t\t\t\tName: \"Status\",\n\t\t\t\t\tValue: &source.EnumValue{\n\t\t\t\t\t\tValue:  \"STATUS_ACTIVE\",\n\t\t\t\t\t\tOption: &source.EnumValueOption{Alias: true},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find enum value default\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tEnum: &source.Enum{\n\t\t\t\t\tName: \"ItemType\",\n\t\t\t\t\tValue: &source.EnumValue{\n\t\t\t\t\t\tValue:  \"UNKNOWN\",\n\t\t\t\t\t\tOption: &source.EnumValueOption{Default: true},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find enum value attr name\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tEnum: &source.Enum{\n\t\t\t\t\tName: \"ItemType\",\n\t\t\t\t\tValue: &source.EnumValue{\n\t\t\t\t\t\tValue: \"UNKNOWN\",\n\t\t\t\t\t\tOption: &source.EnumValueOption{\n\t\t\t\t\t\t\tAttr: &source.EnumValueAttribute{\n\t\t\t\t\t\t\t\tIdx:  0,\n\t\t\t\t\t\t\t\tName: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find enum value attr value\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tEnum: &source.Enum{\n\t\t\t\t\tName: \"ItemType\",\n\t\t\t\t\tValue: &source.EnumValue{\n\t\t\t\t\t\tValue: \"UNKNOWN\",\n\t\t\t\t\t\tOption: &source.EnumValueOption{\n\t\t\t\t\t\t\tAttr: &source.EnumValueAttribute{\n\t\t\t\t\t\t\t\tIdx:   0,\n\t\t\t\t\t\t\t\tValue: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find import by name\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName:   \"coverage.proto\",\n\t\t\t\tImportName: \"federation.proto\",\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t// Additional tests for complex message expression locations\n\t\t{\n\t\t\tdesc: \"find map expr message args\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"User\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 2,\n\t\t\t\t\t\t\tMap: &source.MapExprOption{\n\t\t\t\t\t\t\t\tMessage: &source.MessageExprOption{\n\t\t\t\t\t\t\t\t\tArgs: &source.ArgumentOption{\n\t\t\t\t\t\t\t\t\t\tIdx:  0,\n\t\t\t\t\t\t\t\t\t\tName: true,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find retry constant max_retries\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"ComplexResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tCall: &source.CallExprOption{\n\t\t\t\t\t\t\t\tRetry: &source.RetryOption{\n\t\t\t\t\t\t\t\t\tConstant: &source.RetryConstantOption{\n\t\t\t\t\t\t\t\t\t\tMaxRetries: true,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find retry exponential randomization_factor\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"ComplexResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 1,\n\t\t\t\t\t\t\tCall: &source.CallExprOption{\n\t\t\t\t\t\t\t\tRetry: &source.RetryOption{\n\t\t\t\t\t\t\t\t\tExponential: &source.RetryExponentialOption{\n\t\t\t\t\t\t\t\t\t\tRandomizationFactor: true,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find retry exponential multiplier\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"ComplexResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 1,\n\t\t\t\t\t\t\tCall: &source.CallExprOption{\n\t\t\t\t\t\t\t\tRetry: &source.RetryOption{\n\t\t\t\t\t\t\t\t\tExponential: &source.RetryExponentialOption{\n\t\t\t\t\t\t\t\t\t\tMultiplier: true,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find retry exponential max_interval\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"ComplexResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 1,\n\t\t\t\t\t\t\tCall: &source.CallExprOption{\n\t\t\t\t\t\t\t\tRetry: &source.RetryOption{\n\t\t\t\t\t\t\t\t\tExponential: &source.RetryExponentialOption{\n\t\t\t\t\t\t\t\t\t\tMaxInterval: true,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find retry exponential max_retries\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"ComplexResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 1,\n\t\t\t\t\t\t\tCall: &source.CallExprOption{\n\t\t\t\t\t\t\t\tRetry: &source.RetryOption{\n\t\t\t\t\t\t\t\t\tExponential: &source.RetryExponentialOption{\n\t\t\t\t\t\t\t\t\t\tMaxRetries: true,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find grpc call option max_call_recv_msg_size\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"DataResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tCall: &source.CallExprOption{\n\t\t\t\t\t\t\t\tOption: &source.GRPCCallOption{\n\t\t\t\t\t\t\t\t\tMaxCallRecvMsgSize: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find grpc call option max_call_send_msg_size\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"DataResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tCall: &source.CallExprOption{\n\t\t\t\t\t\t\t\tOption: &source.GRPCCallOption{\n\t\t\t\t\t\t\t\t\tMaxCallSendMsgSize: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find grpc call option wait_for_ready\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"DataResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tCall: &source.CallExprOption{\n\t\t\t\t\t\t\t\tOption: &source.GRPCCallOption{\n\t\t\t\t\t\t\t\t\tWaitForReady: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find grpc error option ignore\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"DataResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tCall: &source.CallExprOption{\n\t\t\t\t\t\t\t\tError: &source.GRPCErrorOption{\n\t\t\t\t\t\t\t\t\tIdx:    0,\n\t\t\t\t\t\t\t\t\tIgnore: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find grpc error option ignore_and_response\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"DataResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tCall: &source.CallExprOption{\n\t\t\t\t\t\t\t\tError: &source.GRPCErrorOption{\n\t\t\t\t\t\t\t\t\tIdx:               0,\n\t\t\t\t\t\t\t\t\tIgnoreAndResponse: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find grpc error def name\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"DataResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tCall: &source.CallExprOption{\n\t\t\t\t\t\t\t\tError: &source.GRPCErrorOption{\n\t\t\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\t\t\t\tIdx:  0,\n\t\t\t\t\t\t\t\t\t\tName: true,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find grpc error def by\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"DataResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tCall: &source.CallExprOption{\n\t\t\t\t\t\t\t\tError: &source.GRPCErrorOption{\n\t\t\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\t\t\t\tBy:  true,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"nodeInfoByEnumExpr\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"User\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 1,\n\t\t\t\t\t\t\tMap: &source.MapExprOption{\n\t\t\t\t\t\t\t\tEnum: &source.EnumExprOption{\n\t\t\t\t\t\t\t\t\tName: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"nodeInfoByEnumExpr\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"User\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 1,\n\t\t\t\t\t\t\tMap: &source.MapExprOption{\n\t\t\t\t\t\t\t\tEnum: &source.EnumExprOption{\n\t\t\t\t\t\t\t\t\tBy: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"nodeInfoByArgument with inline\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"User\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 3,\n\t\t\t\t\t\t\tMessage: &source.MessageExprOption{\n\t\t\t\t\t\t\t\tArgs: &source.ArgumentOption{\n\t\t\t\t\t\t\t\t\tIdx:    0,\n\t\t\t\t\t\t\t\t\tInline: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find grpc error detail by\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"DataResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tCall: &source.CallExprOption{\n\t\t\t\t\t\t\t\tError: &source.GRPCErrorOption{\n\t\t\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\t\t\tDetail: &source.GRPCErrorDetailOption{\n\t\t\t\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\t\t\t\tBy:  true,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find grpc error detail message\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"DataResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tCall: &source.CallExprOption{\n\t\t\t\t\t\t\t\tError: &source.GRPCErrorOption{\n\t\t\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\t\t\tDetail: &source.GRPCErrorDetailOption{\n\t\t\t\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\t\t\t\tLocalizedMessage: &source.GRPCErrorDetailLocalizedMessageOption{\n\t\t\t\t\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find grpc error detail precondition failure\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"DataResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tCall: &source.CallExprOption{\n\t\t\t\t\t\t\t\tError: &source.GRPCErrorOption{\n\t\t\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\t\t\tDetail: &source.GRPCErrorDetailOption{\n\t\t\t\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\t\t\t\tPreconditionFailure: &source.GRPCErrorDetailPreconditionFailureOption{\n\t\t\t\t\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find grpc error detail bad request\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"DataResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tCall: &source.CallExprOption{\n\t\t\t\t\t\t\t\tError: &source.GRPCErrorOption{\n\t\t\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\t\t\tDetail: &source.GRPCErrorDetailOption{\n\t\t\t\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\t\t\t\tBadRequest: &source.GRPCErrorDetailBadRequestOption{\n\t\t\t\t\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find field oneof option\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"DataResponse\",\n\t\t\t\t\tField: &source.Field{\n\t\t\t\t\t\tName: \"user\",\n\t\t\t\t\t\tOption: &source.FieldOption{\n\t\t\t\t\t\t\tOneof: &source.FieldOneof{\n\t\t\t\t\t\t\t\tIf: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find field oneof by\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"DataResponse\",\n\t\t\t\t\tField: &source.Field{\n\t\t\t\t\t\tName: \"user\",\n\t\t\t\t\t\tOption: &source.FieldOption{\n\t\t\t\t\t\t\tOneof: &source.FieldOneof{\n\t\t\t\t\t\t\t\tBy: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"find field oneof def name\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"DataResponse\",\n\t\t\t\t\tField: &source.Field{\n\t\t\t\t\t\tName: \"user\",\n\t\t\t\t\t\tOption: &source.FieldOption{\n\t\t\t\t\t\t\tOneof: &source.FieldOneof{\n\t\t\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\t\t\tIdx:  0,\n\t\t\t\t\t\t\t\t\tName: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twantNil: false,\n\t\t},\n\t}\n\tfor _, tc := range tests {\n\t\tt.Run(tc.desc, func(t *testing.T) {\n\t\t\tnodeInfo := sourceFile.NodeInfoByLocation(tc.location)\n\t\t\tif tc.wantNil {\n\t\t\t\tif nodeInfo != nil {\n\t\t\t\t\tt.Errorf(\"expected nil but got %+v\", nodeInfo)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif nodeInfo == nil {\n\t\t\t\t\tt.Errorf(\"expected non-nil nodeInfo but got nil\")\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestFile_UtilityMethods(t *testing.T) {\n\tt.Parallel()\n\n\t// Test basic file utility methods for coverage\n\tpath := filepath.Join(\"testdata\", \"coverage.proto\")\n\tcontent, err := os.ReadFile(path)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tsourceFile, err := source.NewFile(path, content)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\t// Test Read method\n\tbuffer := make([]byte, 10)\n\tn, err := sourceFile.Read(buffer)\n\tif err != nil && err != io.EOF {\n\t\tt.Errorf(\"unexpected error from Read: %v\", err)\n\t}\n\tif n == 0 {\n\t\tt.Error(\"expected to read some bytes\")\n\t}\n\n\t// Test Close method\n\terr = sourceFile.Close()\n\tif err != nil {\n\t\tt.Errorf(\"unexpected error from Close: %v\", err)\n\t}\n\n\t// Test Path method\n\tif sourceFile.Path() != path {\n\t\tt.Errorf(\"expected path %s, got %s\", path, sourceFile.Path())\n\t}\n\n\t// Test Content method\n\tcontentFromFile := sourceFile.Content()\n\tif len(contentFromFile) != len(content) {\n\t\tt.Errorf(\"expected content length %d, got %d\", len(content), len(contentFromFile))\n\t}\n\n\t// Test AST method\n\tast := sourceFile.AST()\n\tif ast == nil {\n\t\tt.Error(\"expected non-nil AST\")\n\t}\n\n\t// Test Imports method\n\timports := sourceFile.Imports()\n\tif len(imports) == 0 {\n\t\tt.Error(\"expected at least one import\")\n\t}\n\n\t// Test ImportsByImportRule method\n\timportsByRule := sourceFile.ImportsByImportRule()\n\tif len(importsByRule) == 0 {\n\t\tt.Error(\"expected at least one import by rule\")\n\t}\n}\n\nfunc TestFile_ErrorCoverage(t *testing.T) {\n\tt.Parallel()\n\n\t// Test NewFile with invalid content to trigger error recovery\n\tinvalidPath := \"testdata/nonexistent.proto\"\n\t_, err := source.NewFile(invalidPath, []byte(\"invalid proto content\"))\n\t// This should not return an error because the parser has error recovery\n\tif err != nil {\n\t\tt.Logf(\"NewFile with invalid content returned error: %v\", err)\n\t}\n\n\t// Test with nil fileNode condition\n\temptyPath := \"testdata/empty.proto\"\n\t_, err = source.NewFile(emptyPath, []byte(\"\"))\n\t// This should not return an error as empty content should still parse\n\tif err != nil {\n\t\tt.Logf(\"NewFile with empty content returned error: %v\", err)\n\t}\n}\n"
  },
  {
    "path": "source/location.go",
    "content": "package source\n\n// Location represents semantic location information for grpc federation option.\ntype Location struct {\n\tFileName   string\n\tImportName string\n\tExport     *Export\n\tGoPackage  bool\n\tService    *Service\n\tMessage    *Message\n\tEnum       *Enum\n}\n\ntype Export struct {\n\tName      string\n\tWasm      *Wasm\n\tTypes     *PluginType\n\tFunctions *PluginFunction\n}\n\ntype Wasm struct {\n\tURL    bool\n\tSha256 bool\n}\n\ntype PluginType struct {\n\tIdx     int\n\tName    bool\n\tMethods *PluginFunction\n}\n\ntype PluginFunction struct {\n\tIdx        int\n\tName       bool\n\tArgs       *PluginFunctionArgument\n\tReturnType bool\n}\n\ntype PluginFunctionArgument struct {\n\tIdx  int\n\tType bool\n}\n\n// Service represents service location.\ntype Service struct {\n\tName   string\n\tMethod *Method\n\tOption *ServiceOption\n}\n\n// Method represents service's method location.\ntype Method struct {\n\tName     string\n\tRequest  bool\n\tResponse bool\n\tOption   *MethodOption\n}\n\n// ServiceOption represents grpc.federation.service option location.\ntype ServiceOption struct {\n\tEnv *Env\n\tVar *ServiceVariable\n}\n\n// Env represents grpc.federation.service.env location.\ntype Env struct {\n\tMessage bool\n\tVar     *EnvVar\n}\n\n// EnvVar represents grpc.federation.service.env.var location.\ntype EnvVar struct {\n\tIdx    int\n\tName   bool\n\tType   bool\n\tOption *EnvVarOption\n}\n\n// EnvVarOption represents grpc.federation.service.env.var.option location.\ntype EnvVarOption struct {\n\tAlternate bool\n\tDefault   bool\n\tRequired  bool\n\tIgnored   bool\n}\n\n// ServiceVariable represents grpc.federation.service.var option location.\ntype ServiceVariable struct {\n\tIdx        int\n\tName       bool\n\tIf         bool\n\tBy         bool\n\tMap        *MapExprOption\n\tMessage    *MessageExprOption\n\tEnum       *EnumExprOption\n\tSwitch     *SwitchExprOption\n\tValidation *ServiceVariableValidationExpr\n}\n\n// ServiceVariableValidationExpr represents grpc.federation.service.var.validation option location.\ntype ServiceVariableValidationExpr struct {\n\tIf      bool\n\tMessage bool\n}\n\n// MethodOption represents grpc.federation.method option location.\ntype MethodOption struct {\n\tTimeout  bool\n\tResponse bool\n}\n\n// Enum represents enum location.\ntype Enum struct {\n\tName   string\n\tOption *EnumOption\n\tValue  *EnumValue\n}\n\n// EnumOption represents grpc.federation.enum option location.\ntype EnumOption struct {\n\tAlias bool\n}\n\n// EnumValue represents enum value location.\ntype EnumValue struct {\n\tValue  string\n\tOption *EnumValueOption\n}\n\n// EnumValueOption represents grpc.federation.enum_value option location.\ntype EnumValueOption struct {\n\tAlias   bool\n\tNoAlias bool\n\tDefault bool\n\tAttr    *EnumValueAttribute\n}\n\n// EnumValueAttribute represents grpc.federation.enum_value.attr location.\ntype EnumValueAttribute struct {\n\tIdx   int\n\tName  bool\n\tValue bool\n}\n\n// Message represents message location.\ntype Message struct {\n\tName          string\n\tOption        *MessageOption\n\tField         *Field\n\tEnum          *Enum\n\tOneof         *Oneof\n\tNestedMessage *Message\n}\n\nfunc (m *Message) MessageNames() []string {\n\tret := []string{m.Name}\n\tif m.NestedMessage != nil {\n\t\tret = append(ret, m.NestedMessage.MessageNames()...)\n\t}\n\treturn ret\n}\n\nfunc (m *Message) LastNestedMessage() *Message {\n\tif m.NestedMessage != nil {\n\t\treturn m.NestedMessage.LastNestedMessage()\n\t}\n\treturn m\n}\n\n// Field represents message field location.\ntype Field struct {\n\tType   bool\n\tName   string\n\tOption *FieldOption\n}\n\n// FieldOption represents grpc.federation.field option location.\ntype FieldOption struct {\n\tBy    bool\n\tAlias bool\n\tOneof *FieldOneof\n}\n\n// FieldOneof represents grpc.federation.field.oneof location.\ntype FieldOneof struct {\n\tIf      bool\n\tDefault bool\n\tDef     *VariableDefinitionOption\n\tBy      bool\n}\n\n// Oneof represents oneof field location.\ntype Oneof struct {\n\tName   string\n\tField  *Field\n\tOption *OneofOption\n}\n\ntype OneofOption struct {\n}\n\n// MessageOption represents grpc.federation.message option location.\ntype MessageOption struct {\n\tDef   *VariableDefinitionOption\n\tAlias bool\n}\n\n// VariableDefinitionOption represents def location of grpc.federation.message option.\ntype VariableDefinitionOption struct {\n\tIdx        int\n\tName       bool\n\tIf         bool\n\tBy         bool\n\tMap        *MapExprOption\n\tCall       *CallExprOption\n\tMessage    *MessageExprOption\n\tEnum       *EnumExprOption\n\tSwitch     *SwitchExprOption\n\tValidation *ValidationExprOption\n}\n\n// MapExprOption represents def.map location of grpc.federation.message option.\ntype MapExprOption struct {\n\tIterator *IteratorOption\n\tBy       bool\n\tMessage  *MessageExprOption\n\tEnum     *EnumExprOption\n}\n\n// IteratorOption represents def.map.iterator location of grpc.federation.message option.\ntype IteratorOption struct {\n\tName   bool\n\tSource bool\n}\n\n// CallExprOption represents def.call location of grpc.federation.message option.\ntype CallExprOption struct {\n\tMethod   bool\n\tRequest  *RequestOption\n\tTimeout  bool\n\tRetry    *RetryOption\n\tError    *GRPCErrorOption\n\tOption   *GRPCCallOption\n\tMetadata bool\n}\n\n// GRPCCallOption represents def.call.option of grpc.federation.message option.\ntype GRPCCallOption struct {\n\tContentSubtype     bool\n\tHeader             bool\n\tTrailer            bool\n\tMaxCallRecvMsgSize bool\n\tMaxCallSendMsgSize bool\n\tStaticMethod       bool\n\tWaitForReady       bool\n}\n\n// MessageExprOption represents def.message location of grpc.federation.message option.\ntype MessageExprOption struct {\n\tName bool\n\tArgs *ArgumentOption\n}\n\n// EnumExprOption represents def.enum location of grpc.federation.message option.\ntype EnumExprOption struct {\n\tName bool\n\tBy   bool\n}\n\n// RequestOption represents resolver.request location of grpc.federation.message option.\ntype RequestOption struct {\n\tIdx   int\n\tField bool\n\tBy    bool\n\tIf    bool\n}\n\n// RetryOption represents resolver.retry location of grpc.federation.message option.\ntype RetryOption struct {\n\tIf          bool\n\tConstant    *RetryConstantOption\n\tExponential *RetryExponentialOption\n}\n\n// RetryConstantOption represents resolver.retry.constant location of grpc.federation.message option.\ntype RetryConstantOption struct {\n\tInterval   bool\n\tMaxRetries bool\n}\n\n// RetryExponentialOption represents resolver.retry.exponential location of grpc.federation.message option.\ntype RetryExponentialOption struct {\n\tInitialInterval     bool\n\tRandomizationFactor bool\n\tMultiplier          bool\n\tMaxInterval         bool\n\tMaxRetries          bool\n}\n\n// ArgumentOption represents message argument location of grpc.federation.message option.\ntype ArgumentOption struct {\n\tIdx    int\n\tName   bool\n\tBy     bool\n\tInline bool\n}\n\ntype ValidationExprOption struct {\n\tName  bool\n\tError *GRPCErrorOption\n}\n\ntype GRPCErrorOption struct {\n\tIdx               int\n\tDef               *VariableDefinitionOption\n\tIf                bool\n\tCode              bool\n\tMessage           bool\n\tIgnore            bool\n\tIgnoreAndResponse bool\n\tDetail            *GRPCErrorDetailOption\n}\n\ntype GRPCErrorDetailOption struct {\n\tIdx                 int\n\tDef                 *VariableDefinitionOption\n\tIf                  bool\n\tBy                  bool\n\tMessage             *VariableDefinitionOption\n\tPreconditionFailure *GRPCErrorDetailPreconditionFailureOption\n\tBadRequest          *GRPCErrorDetailBadRequestOption\n\tLocalizedMessage    *GRPCErrorDetailLocalizedMessageOption\n}\n\ntype GRPCErrorDetailPreconditionFailureOption struct {\n\tIdx       int\n\tViolation GRPCErrorDetailPreconditionFailureViolationOption\n}\n\ntype GRPCErrorDetailPreconditionFailureViolationOption struct {\n\tIdx       int\n\tFieldName string\n}\n\ntype GRPCErrorDetailBadRequestOption struct {\n\tIdx            int\n\tFieldViolation GRPCErrorDetailBadRequestFieldViolationOption\n}\n\ntype GRPCErrorDetailBadRequestFieldViolationOption struct {\n\tIdx       int\n\tFieldName string\n}\n\ntype GRPCErrorDetailLocalizedMessageOption struct {\n\tIdx       int\n\tFieldName string\n}\n\ntype SwitchExprOption struct {\n\tCase    *SwitchCaseExprOption\n\tDefault *SwitchDefaultExprOption\n}\n\ntype SwitchCaseExprOption struct {\n\tIdx int\n\tDef *VariableDefinitionOption\n\tIf  bool\n\tBy  bool\n}\n\ntype SwitchDefaultExprOption struct {\n\tDef *VariableDefinitionOption\n\tBy  bool\n}\n\n// Position represents source position in proto file.\ntype Position struct {\n\tLine int\n\tCol  int\n}\n"
  },
  {
    "path": "source/location_builder.go",
    "content": "package source\n\ntype Locationer interface {\n\tLocation() *Location\n}\n\nfunc NewLocationBuilder(fileName string) *LocationBuilder {\n\treturn &LocationBuilder{\n\t\tlocation: &Location{FileName: fileName},\n\t}\n}\n\nfunc NewServiceBuilder(fileName, svcName string) *ServiceBuilder {\n\treturn NewLocationBuilder(fileName).WithService(svcName)\n}\n\nfunc NewMessageBuilder(fileName, msgName string) *MessageBuilder {\n\treturn NewLocationBuilder(fileName).WithMessage(msgName)\n}\n\nfunc NewEnumBuilder(fileName, msgName, enumName string) *EnumBuilder {\n\tbuilder := NewLocationBuilder(fileName)\n\tif msgName == \"\" {\n\t\treturn builder.WithEnum(enumName)\n\t}\n\treturn builder.WithMessage(msgName).WithEnum(enumName)\n}\n\ntype LocationBuilder struct {\n\tlocation *Location\n}\n\nfunc (b *LocationBuilder) WithGoPackage() *LocationBuilder {\n\tloc := b.location.Clone()\n\tloc.GoPackage = true\n\treturn &LocationBuilder{\n\t\tlocation: loc,\n\t}\n}\n\nfunc (b *LocationBuilder) WithImportName(name string) *LocationBuilder {\n\tloc := b.location.Clone()\n\tloc.ImportName = name\n\treturn &LocationBuilder{\n\t\tlocation: loc,\n\t}\n}\n\nfunc (b *LocationBuilder) WithExport(name string) *ExportBuilder {\n\troot := b.location.Clone()\n\troot.Export = &Export{Name: name}\n\treturn &ExportBuilder{\n\t\troot: root,\n\t\texport: func(loc *Location) *Export {\n\t\t\treturn loc.Export\n\t\t},\n\t}\n}\n\nfunc (b *LocationBuilder) WithService(name string) *ServiceBuilder {\n\troot := b.location.Clone()\n\troot.Service = &Service{Name: name}\n\treturn &ServiceBuilder{\n\t\troot: root,\n\t\tservice: func(loc *Location) *Service {\n\t\t\treturn loc.Service\n\t\t},\n\t}\n}\n\nfunc (b *LocationBuilder) WithEnum(name string) *EnumBuilder {\n\troot := b.location.Clone()\n\troot.Enum = &Enum{Name: name}\n\treturn &EnumBuilder{\n\t\troot: root,\n\t\tenum: func(loc *Location) *Enum {\n\t\t\treturn loc.Enum\n\t\t},\n\t}\n}\n\nfunc (b *LocationBuilder) WithMessage(name string) *MessageBuilder {\n\troot := b.location.Clone()\n\troot.Message = &Message{Name: name}\n\treturn &MessageBuilder{\n\t\troot: root,\n\t\tmessage: func(loc *Location) *Message {\n\t\t\treturn loc.Message\n\t\t},\n\t}\n}\n\nfunc (b *LocationBuilder) Location() *Location {\n\treturn b.location\n}\n\ntype ExportBuilder struct {\n\troot   *Location\n\texport func(*Location) *Export\n}\n\nfunc (b *ExportBuilder) WithWasm() *WasmBuilder {\n\troot := b.root.Clone()\n\texport := b.export(root)\n\texport.Wasm = &Wasm{}\n\treturn &WasmBuilder{\n\t\troot: root,\n\t\twasm: func(loc *Location) *Wasm {\n\t\t\treturn b.export(loc).Wasm\n\t\t},\n\t}\n}\n\nfunc (b *ExportBuilder) WithTypes(idx int) *PluginTypeBuilder {\n\troot := b.root.Clone()\n\texport := b.export(root)\n\texport.Types = &PluginType{Idx: idx}\n\treturn &PluginTypeBuilder{\n\t\troot: root,\n\t\ttyp: func(loc *Location) *PluginType {\n\t\t\treturn b.export(loc).Types\n\t\t},\n\t}\n}\n\nfunc (b *ExportBuilder) WithFunctions(idx int) *PluginFunctionBuilder {\n\troot := b.root.Clone()\n\texport := b.export(root)\n\texport.Functions = &PluginFunction{Idx: idx}\n\treturn &PluginFunctionBuilder{\n\t\troot: root,\n\t\tfn: func(loc *Location) *PluginFunction {\n\t\t\treturn b.export(loc).Functions\n\t\t},\n\t}\n}\n\nfunc (b *ExportBuilder) Location() *Location {\n\treturn b.root\n}\n\ntype WasmBuilder struct {\n\troot *Location\n\twasm func(*Location) *Wasm\n}\n\nfunc (b *WasmBuilder) WithURL() *WasmBuilder {\n\troot := b.root.Clone()\n\twasm := b.wasm(root)\n\twasm.URL = true\n\treturn &WasmBuilder{\n\t\troot: root,\n\t\twasm: b.wasm,\n\t}\n}\n\nfunc (b *WasmBuilder) WithSha256() *WasmBuilder {\n\troot := b.root.Clone()\n\twasm := b.wasm(root)\n\twasm.Sha256 = true\n\treturn &WasmBuilder{\n\t\troot: root,\n\t\twasm: b.wasm,\n\t}\n}\n\nfunc (b *WasmBuilder) Location() *Location {\n\treturn b.root\n}\n\ntype PluginTypeBuilder struct {\n\troot *Location\n\ttyp  func(*Location) *PluginType\n}\n\nfunc (b *PluginTypeBuilder) WithName() *PluginTypeBuilder {\n\troot := b.root.Clone()\n\ttyp := b.typ(root)\n\ttyp.Name = true\n\treturn &PluginTypeBuilder{\n\t\troot: root,\n\t\ttyp:  b.typ,\n\t}\n}\n\nfunc (b *PluginTypeBuilder) WithMethods(idx int) *PluginFunctionBuilder {\n\troot := b.root.Clone()\n\ttyp := b.typ(root)\n\ttyp.Methods = &PluginFunction{Idx: idx}\n\treturn &PluginFunctionBuilder{\n\t\troot: root,\n\t\tfn: func(loc *Location) *PluginFunction {\n\t\t\treturn b.typ(loc).Methods\n\t\t},\n\t}\n}\n\nfunc (b *PluginTypeBuilder) Location() *Location {\n\treturn b.root\n}\n\ntype PluginFunctionBuilder struct {\n\troot *Location\n\tfn   func(*Location) *PluginFunction\n}\n\nfunc (b *PluginFunctionBuilder) WithName() *PluginFunctionBuilder {\n\troot := b.root.Clone()\n\tfn := b.fn(root)\n\tfn.Name = true\n\treturn &PluginFunctionBuilder{\n\t\troot: root,\n\t\tfn:   b.fn,\n\t}\n}\n\nfunc (b *PluginFunctionBuilder) WithReturnType() *PluginFunctionBuilder {\n\troot := b.root.Clone()\n\tfn := b.fn(root)\n\tfn.ReturnType = true\n\treturn &PluginFunctionBuilder{\n\t\troot: root,\n\t\tfn:   b.fn,\n\t}\n}\n\nfunc (b *PluginFunctionBuilder) WithArgs(idx int) *PluginFunctionArgumentBuilder {\n\troot := b.root.Clone()\n\tfn := b.fn(root)\n\tfn.Args = &PluginFunctionArgument{Idx: idx}\n\treturn &PluginFunctionArgumentBuilder{\n\t\troot: root,\n\t\targ: func(loc *Location) *PluginFunctionArgument {\n\t\t\treturn b.fn(loc).Args\n\t\t},\n\t}\n}\n\nfunc (b *PluginFunctionBuilder) Location() *Location {\n\treturn b.root\n}\n\ntype PluginFunctionArgumentBuilder struct {\n\troot *Location\n\targ  func(*Location) *PluginFunctionArgument\n}\n\nfunc (b *PluginFunctionArgumentBuilder) WithType() *PluginFunctionArgumentBuilder {\n\troot := b.root.Clone()\n\targ := b.arg(root)\n\targ.Type = true\n\treturn &PluginFunctionArgumentBuilder{\n\t\troot: root,\n\t\targ:  b.arg,\n\t}\n}\n\nfunc (b *PluginFunctionArgumentBuilder) Location() *Location {\n\treturn b.root\n}\n\ntype ServiceBuilder struct {\n\troot    *Location\n\tservice func(*Location) *Service\n}\n\nfunc (b *ServiceBuilder) WithMethod(name string) *MethodBuilder {\n\troot := b.root.Clone()\n\tsvc := b.service(root)\n\tsvc.Method = &Method{Name: name}\n\treturn &MethodBuilder{\n\t\troot: root,\n\t\tmethod: func(loc *Location) *Method {\n\t\t\treturn b.service(loc).Method\n\t\t},\n\t}\n}\n\nfunc (b *ServiceBuilder) WithOption() *ServiceOptionBuilder {\n\troot := b.root.Clone()\n\tsvc := b.service(root)\n\tsvc.Option = &ServiceOption{}\n\treturn &ServiceOptionBuilder{\n\t\troot: root,\n\t\toption: func(loc *Location) *ServiceOption {\n\t\t\treturn b.service(loc).Option\n\t\t},\n\t}\n}\n\nfunc (b *ServiceBuilder) Location() *Location {\n\treturn b.root\n}\n\ntype MethodBuilder struct {\n\troot   *Location\n\tmethod func(*Location) *Method\n}\n\nfunc (b *MethodBuilder) WithRequest() *MethodBuilder {\n\troot := b.root.Clone()\n\tmethod := b.method(root)\n\tmethod.Request = true\n\treturn &MethodBuilder{\n\t\troot:   root,\n\t\tmethod: b.method,\n\t}\n}\n\nfunc (b *MethodBuilder) WithResponse() *MethodBuilder {\n\troot := b.root.Clone()\n\tmethod := b.method(root)\n\tmethod.Response = true\n\treturn &MethodBuilder{\n\t\troot:   root,\n\t\tmethod: b.method,\n\t}\n}\n\nfunc (b *MethodBuilder) WithOption() *MethodOptionBuilder {\n\troot := b.root.Clone()\n\tmethod := b.method(root)\n\tmethod.Option = &MethodOption{}\n\treturn &MethodOptionBuilder{\n\t\troot: root,\n\t\toption: func(loc *Location) *MethodOption {\n\t\t\treturn b.method(loc).Option\n\t\t},\n\t}\n}\n\nfunc (b *MethodBuilder) Location() *Location {\n\treturn b.root\n}\n\ntype MethodOptionBuilder struct {\n\troot   *Location\n\toption func(*Location) *MethodOption\n}\n\nfunc (b *MethodOptionBuilder) WithTimeout() *MethodOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Timeout = true\n\treturn &MethodOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *MethodOptionBuilder) WithResponse() *MethodOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Response = true\n\treturn &MethodOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *MethodOptionBuilder) Location() *Location {\n\treturn b.root\n}\n\ntype ServiceOptionBuilder struct {\n\troot   *Location\n\toption func(*Location) *ServiceOption\n}\n\nfunc (b *ServiceOptionBuilder) WithEnv() *EnvBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Env = &Env{}\n\treturn &EnvBuilder{\n\t\troot: root,\n\t\tenv: func(loc *Location) *Env {\n\t\t\treturn b.option(loc).Env\n\t\t},\n\t}\n}\n\nfunc (b *ServiceOptionBuilder) WithVar(idx int) *ServiceVariableBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Var = &ServiceVariable{Idx: idx}\n\treturn &ServiceVariableBuilder{\n\t\troot: root,\n\t\tsvcvar: func(loc *Location) *ServiceVariable {\n\t\t\treturn b.option(loc).Var\n\t\t},\n\t}\n}\n\nfunc (b *ServiceOptionBuilder) Location() *Location {\n\treturn b.root\n}\n\ntype EnvBuilder struct {\n\troot *Location\n\tenv  func(*Location) *Env\n}\n\nfunc (b *EnvBuilder) WithMessage() *EnvBuilder {\n\troot := b.root.Clone()\n\tenv := b.env(root)\n\tenv.Message = true\n\treturn &EnvBuilder{\n\t\troot: root,\n\t\tenv:  b.env,\n\t}\n}\n\nfunc (b *EnvBuilder) WithVar(idx int) *EnvVarBuilder {\n\troot := b.root.Clone()\n\tenv := b.env(root)\n\tenv.Var = &EnvVar{Idx: idx}\n\treturn &EnvVarBuilder{\n\t\troot: root,\n\t\tenvVar: func(loc *Location) *EnvVar {\n\t\t\treturn b.env(loc).Var\n\t\t},\n\t}\n}\n\nfunc (b *EnvBuilder) Location() *Location {\n\treturn b.root\n}\n\ntype EnvVarBuilder struct {\n\troot   *Location\n\tenvVar func(*Location) *EnvVar\n}\n\nfunc (b *EnvVarBuilder) WithName() *EnvVarBuilder {\n\troot := b.root.Clone()\n\tenvVar := b.envVar(root)\n\tenvVar.Name = true\n\treturn &EnvVarBuilder{\n\t\troot:   root,\n\t\tenvVar: b.envVar,\n\t}\n}\n\nfunc (b *EnvVarBuilder) WithType() *EnvVarBuilder {\n\troot := b.root.Clone()\n\tenvVar := b.envVar(root)\n\tenvVar.Type = true\n\treturn &EnvVarBuilder{\n\t\troot:   root,\n\t\tenvVar: b.envVar,\n\t}\n}\n\nfunc (b *EnvVarBuilder) WithOption() *EnvVarOptionBuilder {\n\troot := b.root.Clone()\n\tenvVar := b.envVar(root)\n\tenvVar.Option = &EnvVarOption{}\n\treturn &EnvVarOptionBuilder{\n\t\troot: root,\n\t\toption: func(loc *Location) *EnvVarOption {\n\t\t\treturn b.envVar(loc).Option\n\t\t},\n\t}\n}\n\nfunc (b *EnvVarBuilder) Location() *Location {\n\treturn b.root\n}\n\ntype EnvVarOptionBuilder struct {\n\troot   *Location\n\toption func(*Location) *EnvVarOption\n}\n\nfunc (b *EnvVarOptionBuilder) WithAlternate() *EnvVarOptionBuilder {\n\troot := b.root.Clone()\n\topt := b.option(root)\n\topt.Alternate = true\n\treturn &EnvVarOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *EnvVarOptionBuilder) WithDefault() *EnvVarOptionBuilder {\n\troot := b.root.Clone()\n\topt := b.option(root)\n\topt.Default = true\n\treturn &EnvVarOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *EnvVarOptionBuilder) WithRequired() *EnvVarOptionBuilder {\n\troot := b.root.Clone()\n\topt := b.option(root)\n\topt.Required = true\n\treturn &EnvVarOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *EnvVarOptionBuilder) WithIgnored() *EnvVarOptionBuilder {\n\troot := b.root.Clone()\n\topt := b.option(root)\n\topt.Ignored = true\n\treturn &EnvVarOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *EnvVarOptionBuilder) Location() *Location {\n\treturn b.root\n}\n\ntype ServiceVariableBuilder struct {\n\troot   *Location\n\tsvcvar func(*Location) *ServiceVariable\n}\n\nfunc (b *ServiceVariableBuilder) WithName() *ServiceVariableBuilder {\n\troot := b.root.Clone()\n\tsvcvar := b.svcvar(root)\n\tsvcvar.Name = true\n\treturn &ServiceVariableBuilder{\n\t\troot:   root,\n\t\tsvcvar: b.svcvar,\n\t}\n}\n\nfunc (b *ServiceVariableBuilder) WithIf() *ServiceVariableBuilder {\n\troot := b.root.Clone()\n\tsvcvar := b.svcvar(root)\n\tsvcvar.If = true\n\treturn &ServiceVariableBuilder{\n\t\troot:   root,\n\t\tsvcvar: b.svcvar,\n\t}\n}\n\nfunc (b *ServiceVariableBuilder) WithBy() *ServiceVariableBuilder {\n\troot := b.root.Clone()\n\tsvcvar := b.svcvar(root)\n\tsvcvar.By = true\n\treturn &ServiceVariableBuilder{\n\t\troot:   root,\n\t\tsvcvar: b.svcvar,\n\t}\n}\n\nfunc (b *ServiceVariableBuilder) WithMap() *MapExprOptionBuilder {\n\troot := b.root.Clone()\n\tsvcvar := b.svcvar(root)\n\tsvcvar.Map = &MapExprOption{}\n\treturn &MapExprOptionBuilder{\n\t\troot: root,\n\t\toption: func(loc *Location) *MapExprOption {\n\t\t\treturn b.svcvar(loc).Map\n\t\t},\n\t}\n}\n\nfunc (b *ServiceVariableBuilder) WithMessage() *MessageExprOptionBuilder {\n\troot := b.root.Clone()\n\tsvcvar := b.svcvar(root)\n\tsvcvar.Message = &MessageExprOption{}\n\treturn &MessageExprOptionBuilder{\n\t\troot: root,\n\t\toption: func(loc *Location) *MessageExprOption {\n\t\t\treturn b.svcvar(loc).Message\n\t\t},\n\t}\n}\n\nfunc (b *ServiceVariableBuilder) WithEnum() *EnumExprOptionBuilder {\n\troot := b.root.Clone()\n\tsvcvar := b.svcvar(root)\n\tsvcvar.Enum = &EnumExprOption{}\n\treturn &EnumExprOptionBuilder{\n\t\troot: root,\n\t\toption: func(loc *Location) *EnumExprOption {\n\t\t\treturn b.svcvar(loc).Enum\n\t\t},\n\t}\n}\n\nfunc (b *ServiceVariableBuilder) WithSwitch() *SwitchExprOptionBuilder {\n\troot := b.root.Clone()\n\tsvcvar := b.svcvar(root)\n\tsvcvar.Switch = &SwitchExprOption{}\n\treturn &SwitchExprOptionBuilder{\n\t\troot: root,\n\t\toption: func(loc *Location) *SwitchExprOption {\n\t\t\treturn b.svcvar(loc).Switch\n\t\t},\n\t}\n}\n\nfunc (b *ServiceVariableBuilder) WithValidation() *ServiceVariableValidationExprBuilder {\n\troot := b.root.Clone()\n\tsvcvar := b.svcvar(root)\n\tsvcvar.Validation = &ServiceVariableValidationExpr{}\n\treturn &ServiceVariableValidationExprBuilder{\n\t\troot: root,\n\t\toption: func(loc *Location) *ServiceVariableValidationExpr {\n\t\t\treturn b.svcvar(loc).Validation\n\t\t},\n\t}\n}\n\nfunc (b *ServiceVariableBuilder) Location() *Location {\n\treturn b.root\n}\n\ntype ServiceVariableValidationExprBuilder struct {\n\troot   *Location\n\toption func(*Location) *ServiceVariableValidationExpr\n}\n\nfunc (b *ServiceVariableValidationExprBuilder) WithIf() *ServiceVariableValidationExprBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.If = true\n\treturn &ServiceVariableValidationExprBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *ServiceVariableValidationExprBuilder) WithMessage() *ServiceVariableValidationExprBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Message = true\n\treturn &ServiceVariableValidationExprBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *ServiceVariableValidationExprBuilder) Location() *Location {\n\treturn b.root\n}\n\ntype EnumBuilder struct {\n\troot *Location\n\tenum func(*Location) *Enum\n}\n\nfunc (b *EnumBuilder) WithOption() *EnumBuilder {\n\troot := b.root.Clone()\n\tenum := b.enum(root)\n\tenum.Option = &EnumOption{Alias: true}\n\treturn &EnumBuilder{\n\t\troot: root,\n\t\tenum: b.enum,\n\t}\n}\n\nfunc (b *EnumBuilder) WithValue(value string) *EnumValueBuilder {\n\troot := b.root.Clone()\n\tenum := b.enum(root)\n\tenum.Value = &EnumValue{Value: value}\n\treturn &EnumValueBuilder{\n\t\troot: root,\n\t\tvalue: func(loc *Location) *EnumValue {\n\t\t\treturn b.enum(loc).Value\n\t\t},\n\t}\n}\n\nfunc (b *EnumBuilder) Location() *Location {\n\treturn b.root\n}\n\ntype EnumValueBuilder struct {\n\troot  *Location\n\tvalue func(*Location) *EnumValue\n}\n\nfunc (b *EnumValueBuilder) WithOption() *EnumValueOptionBuilder {\n\troot := b.root.Clone()\n\tvalue := b.value(root)\n\tvalue.Option = &EnumValueOption{}\n\treturn &EnumValueOptionBuilder{\n\t\troot: root,\n\t\toption: func(loc *Location) *EnumValueOption {\n\t\t\treturn b.value(loc).Option\n\t\t},\n\t}\n}\n\nfunc (b *EnumValueBuilder) Location() *Location {\n\treturn b.root\n}\n\ntype EnumValueOptionBuilder struct {\n\troot   *Location\n\toption func(*Location) *EnumValueOption\n}\n\nfunc (b *EnumValueOptionBuilder) WithAlias() *EnumValueOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Alias = true\n\treturn &EnumValueOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *EnumValueOptionBuilder) WithNoAlias() *EnumValueOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.NoAlias = true\n\treturn &EnumValueOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *EnumValueOptionBuilder) WithDefault() *EnumValueOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Default = true\n\treturn &EnumValueOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *EnumValueOptionBuilder) WithAttr(idx int) *EnumValueAttributeBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Attr = &EnumValueAttribute{Idx: idx}\n\treturn &EnumValueAttributeBuilder{\n\t\troot: root,\n\t\tattr: func(loc *Location) *EnumValueAttribute {\n\t\t\treturn b.option(loc).Attr\n\t\t},\n\t}\n}\n\nfunc (b *EnumValueOptionBuilder) Location() *Location {\n\treturn b.root\n}\n\ntype EnumValueAttributeBuilder struct {\n\troot *Location\n\tattr func(*Location) *EnumValueAttribute\n}\n\nfunc (b *EnumValueAttributeBuilder) WithName() *EnumValueAttributeBuilder {\n\troot := b.root.Clone()\n\tattr := b.attr(root)\n\tattr.Name = true\n\treturn &EnumValueAttributeBuilder{\n\t\troot: root,\n\t\tattr: b.attr,\n\t}\n}\n\nfunc (b *EnumValueAttributeBuilder) WithValue() *EnumValueAttributeBuilder {\n\troot := b.root.Clone()\n\tattr := b.attr(root)\n\tattr.Value = true\n\treturn &EnumValueAttributeBuilder{\n\t\troot: root,\n\t\tattr: b.attr,\n\t}\n}\n\nfunc (b *EnumValueAttributeBuilder) Location() *Location {\n\treturn b.root\n}\n\ntype MessageBuilder struct {\n\troot    *Location\n\tmessage func(*Location) *Message\n}\n\nfunc (b *MessageBuilder) WithMessage(name string) *MessageBuilder {\n\troot := b.root.Clone()\n\tmessage := b.message(root)\n\tmessage.NestedMessage = &Message{Name: name}\n\treturn &MessageBuilder{\n\t\troot: root,\n\t\tmessage: func(loc *Location) *Message {\n\t\t\treturn b.message(loc).NestedMessage\n\t\t},\n\t}\n}\n\nfunc (b *MessageBuilder) WithEnum(name string) *EnumBuilder {\n\troot := b.root.Clone()\n\tmessage := b.message(root)\n\tmessage.Enum = &Enum{Name: name}\n\treturn &EnumBuilder{\n\t\troot: root,\n\t\tenum: func(loc *Location) *Enum {\n\t\t\treturn b.message(loc).Enum\n\t\t},\n\t}\n}\n\nfunc (b *MessageBuilder) WithField(name string) *FieldBuilder {\n\troot := b.root.Clone()\n\tmessage := b.message(root)\n\tmessage.Field = &Field{Name: name}\n\treturn &FieldBuilder{\n\t\troot: root,\n\t\tfield: func(loc *Location) *Field {\n\t\t\treturn b.message(loc).Field\n\t\t},\n\t}\n}\n\nfunc (b *MessageBuilder) WithOption() *MessageOptionBuilder {\n\troot := b.root.Clone()\n\tmessage := b.message(root)\n\tmessage.Option = &MessageOption{}\n\treturn &MessageOptionBuilder{\n\t\troot: root,\n\t\toption: func(loc *Location) *MessageOption {\n\t\t\treturn b.message(loc).Option\n\t\t},\n\t}\n}\n\nfunc (b *MessageBuilder) WithOneof(name string) *OneofBuilder {\n\troot := b.root.Clone()\n\tmessage := b.message(root)\n\tmessage.Oneof = &Oneof{Name: name}\n\treturn &OneofBuilder{\n\t\troot: root,\n\t\toneof: func(loc *Location) *Oneof {\n\t\t\treturn b.message(loc).Oneof\n\t\t},\n\t}\n}\n\nfunc (b *MessageBuilder) Location() *Location {\n\treturn b.root\n}\n\n// ToLazyMessageBuilder sets new Message to the root lazily to return the original Location\n// unless MessageBuilder's methods are called afterword.\nfunc ToLazyMessageBuilder(l Locationer, name string) *MessageBuilder {\n\troot := l.Location().Clone()\n\treturn &MessageBuilder{\n\t\troot: root,\n\t\tmessage: func(loc *Location) *Message {\n\t\t\tloc.Message = &Message{Name: name}\n\t\t\treturn loc.Message\n\t\t},\n\t}\n}\n\n// ToLazyEnumBuilder sets new Enum to the root lazily to return the original Location\n// unless EnumBuilder's methods are called afterword.\nfunc ToLazyEnumBuilder(l Locationer, name string) *EnumBuilder {\n\troot := l.Location().Clone()\n\treturn &EnumBuilder{\n\t\troot: root,\n\t\tenum: func(loc *Location) *Enum {\n\t\t\tloc.Enum = &Enum{Name: name}\n\t\t\treturn loc.Enum\n\t\t},\n\t}\n}\n\ntype FieldBuilder struct {\n\troot  *Location\n\tfield func(*Location) *Field\n}\n\nfunc (b *FieldBuilder) Location() *Location {\n\treturn b.root\n}\n\nfunc (b *FieldBuilder) WithType() *FieldBuilder {\n\troot := b.root.Clone()\n\tfield := b.field(root)\n\tfield.Type = true\n\treturn &FieldBuilder{\n\t\troot:  root,\n\t\tfield: b.field,\n\t}\n}\n\nfunc (b *FieldBuilder) WithOption() *FieldOptionBuilder {\n\troot := b.root.Clone()\n\tfield := b.field(root)\n\tfield.Option = &FieldOption{}\n\treturn &FieldOptionBuilder{\n\t\troot: root,\n\t\toption: func(loc *Location) *FieldOption {\n\t\t\treturn b.field(loc).Option\n\t\t},\n\t}\n}\n\ntype FieldOptionBuilder struct {\n\troot   *Location\n\toption func(*Location) *FieldOption\n}\n\nfunc (b *FieldOptionBuilder) WithBy() *FieldOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.By = true\n\treturn &FieldOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *FieldOptionBuilder) WithAlias() *FieldOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Alias = true\n\treturn &FieldOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *FieldOptionBuilder) WithOneOf() *FieldOneofBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Oneof = &FieldOneof{}\n\treturn &FieldOneofBuilder{\n\t\troot: root,\n\t\toneof: func(loc *Location) *FieldOneof {\n\t\t\treturn b.option(loc).Oneof\n\t\t},\n\t}\n}\n\nfunc (b *FieldOptionBuilder) Location() *Location {\n\treturn b.root\n}\n\ntype FieldOneofBuilder struct {\n\troot  *Location\n\toneof func(*Location) *FieldOneof\n}\n\nfunc (b *FieldOneofBuilder) WithIf() *FieldOneofBuilder {\n\troot := b.root.Clone()\n\toneof := b.oneof(root)\n\toneof.If = true\n\treturn &FieldOneofBuilder{\n\t\troot:  root,\n\t\toneof: b.oneof,\n\t}\n}\n\nfunc (b *FieldOneofBuilder) WithDefault() *FieldOneofBuilder {\n\troot := b.root.Clone()\n\toneof := b.oneof(root)\n\toneof.Default = true\n\treturn &FieldOneofBuilder{\n\t\troot:  root,\n\t\toneof: b.oneof,\n\t}\n}\n\nfunc (b *FieldOneofBuilder) WithBy() *FieldOneofBuilder {\n\troot := b.root.Clone()\n\toneof := b.oneof(root)\n\toneof.By = true\n\treturn &FieldOneofBuilder{\n\t\troot:  root,\n\t\toneof: b.oneof,\n\t}\n}\n\nfunc (b *FieldOneofBuilder) WithDef(idx int) *VariableDefinitionOptionBuilder {\n\troot := b.root.Clone()\n\toneof := b.oneof(root)\n\toneof.Def = &VariableDefinitionOption{Idx: idx}\n\treturn &VariableDefinitionOptionBuilder{\n\t\troot: root,\n\t\toption: func(loc *Location) *VariableDefinitionOption {\n\t\t\treturn b.oneof(loc).Def\n\t\t},\n\t}\n}\n\nfunc (b *FieldOneofBuilder) Location() *Location {\n\treturn b.root\n}\n\ntype VariableDefinitionOptionBuilder struct {\n\troot   *Location\n\toption func(*Location) *VariableDefinitionOption\n}\n\nfunc (b *VariableDefinitionOptionBuilder) WithName() *VariableDefinitionOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Name = true\n\treturn &VariableDefinitionOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *VariableDefinitionOptionBuilder) WithIf() *VariableDefinitionOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.If = true\n\treturn &VariableDefinitionOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *VariableDefinitionOptionBuilder) WithBy() *VariableDefinitionOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.By = true\n\treturn &VariableDefinitionOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *VariableDefinitionOptionBuilder) WithMessage() *MessageExprOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Message = &MessageExprOption{}\n\treturn &MessageExprOptionBuilder{\n\t\troot: root,\n\t\toption: func(loc *Location) *MessageExprOption {\n\t\t\treturn b.option(loc).Message\n\t\t},\n\t}\n}\n\nfunc (b *VariableDefinitionOptionBuilder) WithEnum() *EnumExprOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Enum = &EnumExprOption{}\n\treturn &EnumExprOptionBuilder{\n\t\troot: root,\n\t\toption: func(loc *Location) *EnumExprOption {\n\t\t\treturn b.option(loc).Enum\n\t\t},\n\t}\n}\n\nfunc (b *VariableDefinitionOptionBuilder) WithCall() *CallExprOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Call = &CallExprOption{}\n\treturn &CallExprOptionBuilder{\n\t\troot: root,\n\t\toption: func(loc *Location) *CallExprOption {\n\t\t\treturn b.option(loc).Call\n\t\t},\n\t}\n}\n\nfunc (b *VariableDefinitionOptionBuilder) WithValidation() *ValidationExprOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Validation = &ValidationExprOption{}\n\treturn &ValidationExprOptionBuilder{\n\t\troot: root,\n\t\toption: func(loc *Location) *ValidationExprOption {\n\t\t\treturn b.option(loc).Validation\n\t\t},\n\t}\n}\n\nfunc (b *VariableDefinitionOptionBuilder) WithMap() *MapExprOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Map = &MapExprOption{}\n\treturn &MapExprOptionBuilder{\n\t\troot: root,\n\t\toption: func(loc *Location) *MapExprOption {\n\t\t\treturn b.option(loc).Map\n\t\t},\n\t}\n}\n\nfunc (b *VariableDefinitionOptionBuilder) WithSwitch() *SwitchExprOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Switch = &SwitchExprOption{}\n\treturn &SwitchExprOptionBuilder{\n\t\troot: root,\n\t\toption: func(loc *Location) *SwitchExprOption {\n\t\t\treturn b.option(loc).Switch\n\t\t},\n\t}\n}\n\nfunc (b *VariableDefinitionOptionBuilder) Location() *Location {\n\treturn b.root\n}\n\ntype MessageExprOptionBuilder struct {\n\troot   *Location\n\toption func(*Location) *MessageExprOption\n}\n\nfunc (b *MessageExprOptionBuilder) WithName() *MessageExprOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Name = true\n\treturn &MessageExprOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *MessageExprOptionBuilder) WithArgs(idx int) *ArgumentOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Args = &ArgumentOption{Idx: idx}\n\treturn &ArgumentOptionBuilder{\n\t\troot: root,\n\t\toption: func(loc *Location) *ArgumentOption {\n\t\t\treturn b.option(loc).Args\n\t\t},\n\t}\n}\n\nfunc (b *MessageExprOptionBuilder) Location() *Location {\n\treturn b.root\n}\n\ntype EnumExprOptionBuilder struct {\n\troot   *Location\n\toption func(*Location) *EnumExprOption\n}\n\nfunc (b *EnumExprOptionBuilder) WithName() *EnumExprOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Name = true\n\treturn &EnumExprOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *EnumExprOptionBuilder) WithBy() *EnumExprOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.By = true\n\treturn &EnumExprOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *EnumExprOptionBuilder) Location() *Location {\n\treturn b.root\n}\n\ntype ArgumentOptionBuilder struct {\n\troot   *Location\n\toption func(*Location) *ArgumentOption\n}\n\nfunc (b *ArgumentOptionBuilder) WithName() *ArgumentOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Name = true\n\treturn &ArgumentOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *ArgumentOptionBuilder) WithBy() *ArgumentOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.By = true\n\treturn &ArgumentOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *ArgumentOptionBuilder) WithInline() *ArgumentOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Inline = true\n\treturn &ArgumentOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *ArgumentOptionBuilder) Location() *Location {\n\treturn b.root\n}\n\ntype MessageOptionBuilder struct {\n\troot   *Location\n\toption func(*Location) *MessageOption\n}\n\nfunc (b *MessageOptionBuilder) WithAlias() *MessageOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Alias = true\n\treturn &MessageOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *MessageOptionBuilder) WithDef(idx int) *VariableDefinitionOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Def = &VariableDefinitionOption{Idx: idx}\n\treturn &VariableDefinitionOptionBuilder{\n\t\troot: root,\n\t\toption: func(loc *Location) *VariableDefinitionOption {\n\t\t\treturn b.option(loc).Def\n\t\t},\n\t}\n}\n\nfunc (b *MessageOptionBuilder) Location() *Location {\n\treturn b.root\n}\n\ntype OneofBuilder struct {\n\troot  *Location\n\toneof func(*Location) *Oneof\n}\n\nfunc (b *OneofBuilder) WithField(name string) *FieldBuilder {\n\troot := b.root.Clone()\n\toneof := b.oneof(root)\n\toneof.Field = &Field{Name: name}\n\treturn &FieldBuilder{\n\t\troot: root,\n\t\tfield: func(loc *Location) *Field {\n\t\t\treturn b.oneof(loc).Field\n\t\t},\n\t}\n}\n\nfunc (b *OneofBuilder) Location() *Location {\n\treturn b.root\n}\n\ntype CallExprOptionBuilder struct {\n\troot   *Location\n\toption func(*Location) *CallExprOption\n}\n\nfunc (b *CallExprOptionBuilder) WithMethod() *CallExprOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Method = true\n\treturn &CallExprOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *CallExprOptionBuilder) WithTimeout() *CallExprOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Timeout = true\n\treturn &CallExprOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *CallExprOptionBuilder) WithRetry() *RetryOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Retry = &RetryOption{}\n\treturn &RetryOptionBuilder{\n\t\troot: root,\n\t\toption: func(loc *Location) *RetryOption {\n\t\t\treturn b.option(loc).Retry\n\t\t},\n\t}\n}\n\nfunc (b *CallExprOptionBuilder) WithRequest(idx int) *RequestOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Request = &RequestOption{Idx: idx}\n\treturn &RequestOptionBuilder{\n\t\troot: root,\n\t\toption: func(loc *Location) *RequestOption {\n\t\t\treturn b.option(loc).Request\n\t\t},\n\t}\n}\n\nfunc (b *CallExprOptionBuilder) WithError(idx int) *GRPCErrorOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Error = &GRPCErrorOption{Idx: idx}\n\treturn &GRPCErrorOptionBuilder{\n\t\troot: root,\n\t\toption: func(loc *Location) *GRPCErrorOption {\n\t\t\treturn b.option(loc).Error\n\t\t},\n\t}\n}\n\nfunc (b *CallExprOptionBuilder) WithOption() *GRPCCallOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Option = &GRPCCallOption{}\n\treturn &GRPCCallOptionBuilder{\n\t\troot: root,\n\t\toption: func(loc *Location) *GRPCCallOption {\n\t\t\treturn b.option(loc).Option\n\t\t},\n\t}\n}\n\nfunc (b *CallExprOptionBuilder) WithMetadata() *CallExprOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Metadata = true\n\treturn &CallExprOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *CallExprOptionBuilder) Location() *Location {\n\treturn b.root\n}\n\ntype RetryOptionBuilder struct {\n\troot   *Location\n\toption func(*Location) *RetryOption\n}\n\nfunc (b *RetryOptionBuilder) WithIf() *RetryOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.If = true\n\treturn &RetryOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *RetryOptionBuilder) WithConstantInterval() *RetryOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Constant = &RetryConstantOption{Interval: true}\n\treturn &RetryOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *RetryOptionBuilder) WithExponentialInitialInterval() *RetryOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Exponential = &RetryExponentialOption{InitialInterval: true}\n\treturn &RetryOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *RetryOptionBuilder) WithExponentialMaxInterval() *RetryOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Exponential = &RetryExponentialOption{MaxInterval: true}\n\treturn &RetryOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *RetryOptionBuilder) Location() *Location {\n\treturn b.root\n}\n\ntype RequestOptionBuilder struct {\n\troot   *Location\n\toption func(*Location) *RequestOption\n}\n\nfunc (b *RequestOptionBuilder) WithField() *RequestOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Field = true\n\treturn &RequestOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *RequestOptionBuilder) WithBy() *RequestOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.By = true\n\treturn &RequestOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *RequestOptionBuilder) WithIf() *RequestOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.If = true\n\treturn &RequestOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *RequestOptionBuilder) Location() *Location {\n\treturn b.root\n}\n\ntype ValidationExprOptionBuilder struct {\n\troot   *Location\n\toption func(*Location) *ValidationExprOption\n}\n\nfunc (b *ValidationExprOptionBuilder) WithName() *ValidationExprOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Name = true\n\treturn &ValidationExprOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *ValidationExprOptionBuilder) WithError() *GRPCErrorOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Error = &GRPCErrorOption{Idx: 0}\n\treturn &GRPCErrorOptionBuilder{\n\t\troot: root,\n\t\toption: func(loc *Location) *GRPCErrorOption {\n\t\t\treturn b.option(loc).Error\n\t\t},\n\t}\n}\n\nfunc (b *ValidationExprOptionBuilder) Location() *Location {\n\treturn b.root\n}\n\ntype GRPCErrorOptionBuilder struct {\n\troot   *Location\n\toption func(*Location) *GRPCErrorOption\n}\n\nfunc (b *GRPCErrorOptionBuilder) WithDef(idx int) *VariableDefinitionOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Def = &VariableDefinitionOption{Idx: idx}\n\treturn &VariableDefinitionOptionBuilder{\n\t\troot: root,\n\t\toption: func(loc *Location) *VariableDefinitionOption {\n\t\t\treturn b.option(loc).Def\n\t\t},\n\t}\n}\n\nfunc (b *GRPCErrorOptionBuilder) WithIf() *GRPCErrorOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.If = true\n\treturn &GRPCErrorOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *GRPCErrorOptionBuilder) WithCode() *GRPCErrorOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Code = true\n\treturn &GRPCErrorOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *GRPCErrorOptionBuilder) WithMessage() *GRPCErrorOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Message = true\n\treturn &GRPCErrorOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *GRPCErrorOptionBuilder) WithIgnore() *GRPCErrorOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Ignore = true\n\treturn &GRPCErrorOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *GRPCErrorOptionBuilder) WithIgnoreAndResponse() *GRPCErrorOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.IgnoreAndResponse = true\n\treturn &GRPCErrorOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *GRPCErrorOptionBuilder) WithDetail(idx int) *GRPCErrorDetailOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Detail = &GRPCErrorDetailOption{Idx: idx}\n\treturn &GRPCErrorDetailOptionBuilder{\n\t\troot: root,\n\t\toption: func(loc *Location) *GRPCErrorDetailOption {\n\t\t\treturn b.option(loc).Detail\n\t\t},\n\t}\n}\n\nfunc (b *GRPCErrorOptionBuilder) Location() *Location {\n\treturn b.root\n}\n\ntype GRPCErrorDetailOptionBuilder struct {\n\troot   *Location\n\toption func(*Location) *GRPCErrorDetailOption\n}\n\nfunc (b *GRPCErrorDetailOptionBuilder) WithDef(idx int) *VariableDefinitionOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Def = &VariableDefinitionOption{Idx: idx}\n\treturn &VariableDefinitionOptionBuilder{\n\t\troot: root,\n\t\toption: func(loc *Location) *VariableDefinitionOption {\n\t\t\treturn b.option(loc).Def\n\t\t},\n\t}\n}\n\nfunc (b *GRPCErrorDetailOptionBuilder) WithMessage(idx int) *VariableDefinitionOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Message = &VariableDefinitionOption{Idx: idx}\n\treturn &VariableDefinitionOptionBuilder{\n\t\troot: root,\n\t\toption: func(loc *Location) *VariableDefinitionOption {\n\t\t\treturn b.option(loc).Message\n\t\t},\n\t}\n}\n\nfunc (b *GRPCErrorDetailOptionBuilder) WithIf() *GRPCErrorDetailOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.If = true\n\treturn &GRPCErrorDetailOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *GRPCErrorDetailOptionBuilder) WithBy() *GRPCErrorDetailOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.By = true\n\treturn &GRPCErrorDetailOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *GRPCErrorDetailOptionBuilder) WithPreconditionFailure(i1, i2 int, fieldName string) *GRPCErrorDetailOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.PreconditionFailure = &GRPCErrorDetailPreconditionFailureOption{\n\t\tIdx: i1,\n\t\tViolation: GRPCErrorDetailPreconditionFailureViolationOption{\n\t\t\tIdx:       i2,\n\t\t\tFieldName: fieldName,\n\t\t},\n\t}\n\treturn &GRPCErrorDetailOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *GRPCErrorDetailOptionBuilder) WithBadRequest(i1, i2 int, fieldName string) *GRPCErrorDetailOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.BadRequest = &GRPCErrorDetailBadRequestOption{\n\t\tIdx: i1,\n\t\tFieldViolation: GRPCErrorDetailBadRequestFieldViolationOption{\n\t\t\tIdx:       i2,\n\t\t\tFieldName: fieldName,\n\t\t},\n\t}\n\treturn &GRPCErrorDetailOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *GRPCErrorDetailOptionBuilder) WithLocalizedMessage(idx int, fieldName string) *GRPCErrorDetailOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.LocalizedMessage = &GRPCErrorDetailLocalizedMessageOption{\n\t\tIdx:       idx,\n\t\tFieldName: fieldName,\n\t}\n\treturn &GRPCErrorDetailOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *GRPCErrorDetailOptionBuilder) Location() *Location {\n\treturn b.root\n}\n\ntype GRPCCallOptionBuilder struct {\n\troot   *Location\n\toption func(*Location) *GRPCCallOption\n}\n\nfunc (b *GRPCCallOptionBuilder) WithContentSubtype() *GRPCCallOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.ContentSubtype = true\n\treturn &GRPCCallOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *GRPCCallOptionBuilder) WithHeader() *GRPCCallOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Header = true\n\treturn &GRPCCallOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *GRPCCallOptionBuilder) WithTrailer() *GRPCCallOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Trailer = true\n\treturn &GRPCCallOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *GRPCCallOptionBuilder) WithMaxCallRecvMsgSize() *GRPCCallOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.MaxCallRecvMsgSize = true\n\treturn &GRPCCallOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *GRPCCallOptionBuilder) WithMaxCallSendMsgSize() *GRPCCallOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.MaxCallSendMsgSize = true\n\treturn &GRPCCallOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *GRPCCallOptionBuilder) WithStaticMethod() *GRPCCallOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.StaticMethod = true\n\treturn &GRPCCallOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *GRPCCallOptionBuilder) WithWaitForReady() *GRPCCallOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.WaitForReady = true\n\treturn &GRPCCallOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *GRPCCallOptionBuilder) Location() *Location {\n\treturn b.root\n}\n\ntype MapExprOptionBuilder struct {\n\troot   *Location\n\toption func(*Location) *MapExprOption\n}\n\nfunc (b *MapExprOptionBuilder) WithBy() *MapExprOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.By = true\n\treturn &MapExprOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *MapExprOptionBuilder) WithIteratorName() *MapExprOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Iterator = &IteratorOption{Name: true}\n\treturn &MapExprOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *MapExprOptionBuilder) WithIteratorSource() *MapExprOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Iterator = &IteratorOption{Source: true}\n\treturn &MapExprOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *MapExprOptionBuilder) WithMessage() *MessageExprOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Message = &MessageExprOption{}\n\treturn &MessageExprOptionBuilder{\n\t\troot: root,\n\t\toption: func(loc *Location) *MessageExprOption {\n\t\t\treturn b.option(loc).Message\n\t\t},\n\t}\n}\n\nfunc (b *MapExprOptionBuilder) WithEnum() *EnumExprOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Enum = &EnumExprOption{}\n\treturn &EnumExprOptionBuilder{\n\t\troot: root,\n\t\toption: func(loc *Location) *EnumExprOption {\n\t\t\treturn b.option(loc).Enum\n\t\t},\n\t}\n}\n\nfunc (b *MapExprOptionBuilder) Location() *Location {\n\treturn b.root\n}\n\ntype SwitchExprOptionBuilder struct {\n\troot   *Location\n\toption func(*Location) *SwitchExprOption\n}\n\nfunc (b *SwitchExprOptionBuilder) WithCase(idx int) *SwitchCaseExprOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Case = &SwitchCaseExprOption{Idx: idx}\n\treturn &SwitchCaseExprOptionBuilder{\n\t\troot: root,\n\t\toption: func(loc *Location) *SwitchCaseExprOption {\n\t\t\treturn b.option(loc).Case\n\t\t},\n\t}\n}\n\nfunc (b *SwitchExprOptionBuilder) WithDefault() *SwitchDefaultExprOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Default = &SwitchDefaultExprOption{}\n\treturn &SwitchDefaultExprOptionBuilder{\n\t\troot: root,\n\t\toption: func(loc *Location) *SwitchDefaultExprOption {\n\t\t\treturn b.option(loc).Default\n\t\t},\n\t}\n}\n\nfunc (b *SwitchExprOptionBuilder) Location() *Location {\n\treturn b.root\n}\n\ntype SwitchCaseExprOptionBuilder struct {\n\troot   *Location\n\toption func(*Location) *SwitchCaseExprOption\n}\n\nfunc (b *SwitchCaseExprOptionBuilder) WithDef(idx int) *VariableDefinitionOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Def = &VariableDefinitionOption{Idx: idx}\n\treturn &VariableDefinitionOptionBuilder{\n\t\troot: root,\n\t\toption: func(loc *Location) *VariableDefinitionOption {\n\t\t\treturn b.option(loc).Def\n\t\t},\n\t}\n}\n\nfunc (b *SwitchCaseExprOptionBuilder) WithIf() *SwitchCaseExprOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.If = true\n\treturn &SwitchCaseExprOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *SwitchCaseExprOptionBuilder) WithBy() *SwitchCaseExprOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.By = true\n\treturn &SwitchCaseExprOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *SwitchCaseExprOptionBuilder) Location() *Location {\n\treturn b.root\n}\n\ntype SwitchDefaultExprOptionBuilder struct {\n\troot   *Location\n\toption func(*Location) *SwitchDefaultExprOption\n}\n\nfunc (b *SwitchDefaultExprOptionBuilder) WithDef(idx int) *VariableDefinitionOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.Def = &VariableDefinitionOption{Idx: idx}\n\treturn &VariableDefinitionOptionBuilder{\n\t\troot: root,\n\t\toption: func(loc *Location) *VariableDefinitionOption {\n\t\t\treturn b.option(loc).Def\n\t\t},\n\t}\n}\n\nfunc (b *SwitchDefaultExprOptionBuilder) WithBy() *SwitchDefaultExprOptionBuilder {\n\troot := b.root.Clone()\n\toption := b.option(root)\n\toption.By = true\n\treturn &SwitchDefaultExprOptionBuilder{\n\t\troot:   root,\n\t\toption: b.option,\n\t}\n}\n\nfunc (b *SwitchDefaultExprOptionBuilder) Location() *Location {\n\treturn b.root\n}\n"
  },
  {
    "path": "source/location_test.go",
    "content": "package source_test\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/mercari/grpc-federation/source\"\n)\n\nfunc TestFile(t *testing.T) {\n\tpath := filepath.Join(\"testdata\", \"service.proto\")\n\tcontent, err := os.ReadFile(path)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tsourceFile, err := source.NewFile(path, content)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tloc := &source.Location{\n\t\tFileName: filepath.Base(path),\n\t\tMessage: &source.Message{\n\t\t\tName: \"GetPostResponse\",\n\t\t\tOption: &source.MessageOption{\n\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\tIdx: 0,\n\t\t\t\t\tMessage: &source.MessageExprOption{\n\t\t\t\t\t\tName: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\tt.Run(\"filter\", func(t *testing.T) {\n\t\tn := sourceFile.NodeInfoByLocation(loc)\n\t\tif n == nil {\n\t\t\tt.Fatal(\"failed to get node info\")\n\t\t}\n\t\tif n.RawText() != `\"Post\"` {\n\t\t\tt.Fatalf(\"failed to get text %s\", n.RawText())\n\t\t}\n\t})\n}\n"
  },
  {
    "path": "source/testdata/coverage.proto",
    "content": "syntax = \"proto3\";\n\npackage coverage;\n\nimport \"federation.proto\";\n\noption go_package = \"example/coverage;coverage\";\noption (grpc.federation.file) = {\n  import: [\"multiple_import.proto\", \"another_import.proto\"]\n};\n\nservice CoverageService {\n  option (grpc.federation.service) = {\n    env {\n      message: \"EnvMessage\"\n      var [\n        {\n          name: \"TEST_VAR\"\n          type: STRING\n          option {\n            default: \"test_value\"\n            alternate: \"alt_value\"\n            required: true\n            ignored: false\n          }\n        },\n        {\n          name: \"ANOTHER_VAR\"\n          type: INT64\n          option {\n            required: false\n          }\n        }\n      ]\n    }\n    var [\n      {\n        name: \"service_var\"\n        if: \"true\"\n        by: \"$.data\"\n        validation {\n          if: \"validation_needed\"\n          message: \"Validation error\"\n        }\n      },\n      {\n        name: \"mapped_var\"\n        map {\n          by: \"$.items\"\n          message {\n            name: \"ItemMapper\"\n            args [\n              { name: \"id\", by: \"$.item_id\" },\n              { name: \"value\", by: \"$.item_value\", inline: \"inline_data\" }\n            ]\n          }\n        }\n      },\n      {\n        name: \"enum_mapped_var\"\n        enum {\n          name: \"StatusMapper\"\n          by: \"$.status_code\"\n        }\n      }\n    ]\n  };\n  \n  rpc GetData(DataRequest) returns (DataResponse) {\n    option (grpc.federation.method) = {\n      timeout: \"30s\"\n    };\n  };\n\n  rpc GetComplexData(ComplexRequest) returns (ComplexResponse) {\n    option (grpc.federation.method) = {\n      timeout: { seconds: 60 }\n      response: \"complex_response_data\"\n    };\n  };\n}\n\nmessage DataRequest {\n  string query = 1 [(grpc.federation.field) = { by: \"$.input_query\" }];\n  int32 limit = 2;\n}\n\nmessage ComplexRequest {\n  string filter = 1;\n  repeated string tags = 2;\n}\n\nmessage ComplexResponse {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"retry_call\"\n        call {\n          method: \"service.RetryService/Process\"\n          retry {\n            if: \"error.code == 'UNAVAILABLE'\"\n            constant {\n              interval: \"1s\"\n              max_retries: 3\n            }\n          }\n        }\n      },\n      {\n        name: \"exponential_retry\"\n        call {\n          method: \"service.ExponentialService/Process\"\n          retry {\n            exponential {\n              initial_interval: \"100ms\"\n              randomization_factor: 0.5\n              multiplier: 2.0\n              max_interval: \"10s\"\n              max_retries: 5\n            }\n          }\n        }\n      }\n    ]\n  };\n  string result = 1 [(grpc.federation.field) = { by: \"retry_call.result\" }];\n}\n\nmessage DataResponse {\n  option (grpc.federation.message) = {\n    alias: \"Response\"\n    def [\n      {\n        name: \"api_result\"\n        call {\n          method: \"api.DataService/GetData\"\n          timeout: \"10s\"\n          metadata: \"authorization: Bearer token\"\n          retry {\n            if: \"error.code == 'UNAVAILABLE'\"\n          }\n          option {\n            content_subtype: \"json\"\n            header: \"x-request-id: uuid()\"\n            trailer: \"x-response-time: timestamp()\"\n            max_call_recv_msg_size: 1024\n            max_call_send_msg_size: 512\n            static_method: true\n            wait_for_ready: false\n          }\n          request [\n            { field: \"query\", by: \"$.query\", if: \"$.query != ''\" }\n          ]\n          error [\n            {\n              if: \"error.code == 'NOT_FOUND'\"\n              message: \"Data not found\"\n              ignore: false\n              ignore_and_response: \"empty_response\"\n              def [\n                { name: \"error_var\", by: \"error.message\" }\n              ]\n              details [\n                {\n                  if: \"error.has_details\"\n                  by: \"error_detail\"\n                  def [\n                    { name: \"detail_var\", by: \"detail.info\" }\n                  ]\n                  message [\n                    { name: \"detail_msg\", by: \"detail_var\" }\n                  ]\n                  precondition_failure [\n                    {\n                      violations [\n                        { type: \"field_error\", subject: \"user_id\", description: \"Invalid user ID\" }\n                      ]\n                    }\n                  ]\n                  bad_request [\n                    {\n                      field_violations [\n                        { field: \"email\", description: \"Invalid email format\" }\n                      ]\n                    }\n                  ]\n                  localized_message [\n                    { locale: \"en\", message: \"Error occurred\" }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      }\n    ]\n  };\n  repeated DataItem items = 1 [(grpc.federation.field) = {\n    by: \"api_result.items\"\n    oneof {\n      if: \"condition\"\n      default: \"default_value\"\n      def [\n        { name: \"oneof_var\", by: \"$.data\" }\n      ]\n      by: \"oneof_result\"\n    }\n  }];\n  \n  User user = 2 [(grpc.federation.field) = {\n    oneof {\n      if: \"has_user\"\n      by: \"user_data\"\n    }\n  }];\n}\n\nmessage DataItem {\n  string id = 1;\n  string value = 2 [(grpc.federation.field).by = \"$.item_value\"];\n  ItemType type = 3;\n}\n\nenum ItemType {\n  option (grpc.federation.enum) = {\n    alias: \"Type\"\n  };\n  UNKNOWN = 0 [(grpc.federation.enum_value) = {\n    alias: [\"unknown\", \"default\"]\n    noalias: true\n    default: true\n    attr [\n      { name: \"display\", value: \"Unknown Type\" },\n      { name: \"code\", value: \"0\" },\n      { name: \"description\", value: \"Default unknown type\" }\n    ]\n  }];\n  TYPE_A = 1 [(grpc.federation.enum_value) = {\n    alias: \"type_a\"\n    attr [\n      { name: \"category\", value: \"primary\" }\n    ]\n  }];\n  TYPE_B = 2 [(grpc.federation.enum_value) = {\n    alias: [\"type_b\", \"secondary\"]\n    noalias: false\n    attr [\n      { name: \"category\", value: \"secondary\" },\n      { name: \"priority\", value: \"high\" }\n    ]\n  }];\n}\n\nenum ProcessingStatus {\n  option (grpc.federation.enum) = {\n    alias: \"Status\"\n  };\n  PROCESSING_UNKNOWN = 0;\n  PROCESSING_PENDING = 1 [(grpc.federation.enum_value) = {\n    alias: \"pending\"\n    default: false\n  }];\n  PROCESSING_ACTIVE = 2 [(grpc.federation.enum_value) = {\n    alias: \"active\"\n    noalias: true\n    attr [\n      { name: \"state\", value: \"running\" }\n    ]\n  }];\n}\n\nmessage EnvMessage {\n  string name = 1;\n}\n\nmessage User {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"validated_data\"\n        validation {\n          name: \"user_validator\"\n          error [\n            {\n              if: \"validation_failed\"\n              message: \"User validation failed\"\n              ignore: false\n              def [\n                { name: \"error_details\", by: \"validation.error_info\" }\n              ]\n              details [\n                {\n                  if: \"has_error_details\"\n                  by: \"error_details\"\n                  precondition_failure [\n                    {\n                      violations [\n                        { type: \"required_field\", subject: \"user_id\", description: \"User ID is required\" }\n                      ]\n                    }\n                  ]\n                  bad_request [\n                    {\n                      field_violations [\n                        { field: \"email\", description: \"Invalid email format\" }\n                      ]\n                    }\n                  ]\n                  localized_message [\n                    { locale: \"en\", message: \"Validation failed\" },\n                    { locale: \"ja\", message: \"検証に失敗しました\" }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      },\n      {\n        name: \"mapped_statuses\"\n        map {\n          by: \"status_list\"\n          enum {\n            name: \"StatusEnum\"\n            by: \"$.status\"\n          }\n        }\n      },\n      {\n        name: \"message_mapped\"\n        map {\n          by: \"message_list\"\n          message {\n            name: \"MessageMapper\"\n            args [\n              { name: \"content\", by: \"$.message_content\" }\n            ]\n          }\n        }\n      },\n      {\n        name: \"user_profile\"\n        message {\n          name: \"UserProfile\" \n          args [\n            { name: \"id\", by: \"$.user_id\" },\n            { name: \"name\", by: \"$.username\", inline: \"profile_data\" },\n            { name: \"metadata\", by: \"$.user_metadata\", inline: \"meta_info\" }\n          ]\n        }\n      }\n    ]\n  };\n  string id = 1;\n  string name = 2;\n  ProcessingStatus status = 3;\n}\n\nmessage NestedMessage {\n  oneof choice {\n    option (grpc.federation.oneof) = {};\n    string text = 1 [(grpc.federation.field) = {\n      by: \"choice_text\"\n      oneof {\n        if: \"has_text\"\n        default: \"default_text\"\n        by: \"text_value\"\n        def [\n          { name: \"text_processor\", by: \"$.process_text\" }\n        ]\n      }\n    }];\n    int32 number = 2 [(grpc.federation.field) = {\n      by: \"choice_number\"\n      oneof {\n        if: \"has_number\"\n        by: \"number_value\"\n        def [\n          { name: \"num_validator\", by: \"$.validate_number\" }\n        ]\n      }\n    }];\n    NestedData data = 3 [(grpc.federation.field) = {\n      by: \"nested_data\"\n    }];\n  }\n  \n  message NestedData {\n    string value = 1 [(grpc.federation.field).by = \"$.data_value\"];\n    ItemType type = 2;\n  }\n}\n\nenum Status {\n  option (grpc.federation.enum) = {\n    alias: \"UserStatus\"\n  };\n  STATUS_UNKNOWN = 0 [(grpc.federation.enum_value) = {\n    alias: \"unknown_status\"\n    default: true\n  }];\n  STATUS_ACTIVE = 1 [(grpc.federation.enum_value) = {\n    alias: [\"active\", \"enabled\"]\n    noalias: false\n    attr [\n      { name: \"color\", value: \"green\" },\n      { name: \"priority\", value: \"high\" }\n    ]\n  }];\n}"
  },
  {
    "path": "source/testdata/post.proto",
    "content": "syntax = \"proto3\";\n\npackage post;\n\noption go_package = \"example/post;post\";\n\nservice PostService {\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n  rpc GetPosts(GetPostsRequest) returns (GetPostsResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  Post post = 1;\n}\n\nmessage GetPostsRequest {\n  repeated string ids = 1;\n}\n\nmessage GetPostsResponse {\n  repeated Post posts = 1;\n}\n\nmessage Post {\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  string user_id = 4;\n}\n"
  },
  {
    "path": "source/testdata/service.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"federation.proto\";\nimport \"post.proto\";\nimport \"user.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {\n    go_package: \"grpc;grpc\"\n    dependencies: [\n      { name: \"post\", service: \"post.PostService\" }\n    ]\n  };\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {\n    option (grpc.federation.method).timeout = \"1s\";\n  };\n  rpc GetPost2(GetPostRequest) returns (GetPostResponse) {\n    option (grpc.federation.method) = {\n      timeout: \"1s\",\n    };\n  };\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args: [{ name: \"id\", by: \"$.id\" }]\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"res\"\n        call {\n          method: \"post.PostService/GetPost\"\n          request { field: \"id\", by: \"$.id\" }\n        }\n      },\n      { name: \"post\", by: \"res.post\", autobind: true },\n      {\n        name: \"user\"\n        message {\n          name: \"User\"\n          args { inline: \"post\" }\n        }\n      }\n    ]\n  };\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  User user = 4 [(grpc.federation.field) = { by: \"user\" }];\n}\n\nmessage User {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"user.UserService/GetUser\"\n        request [{ field: \"id\", by: \"$.user_id\" }]\n      }\n    }\n    def {\n      name: \"user\"\n      by: \"res.user\"\n      autobind: true\n    }\n  };\n  string id = 1;\n  string name = 2;\n}\n"
  },
  {
    "path": "source/testdata/switch.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (.grpc.federation.message) = {\n    def {\n      name: \"switch\"\n      switch {\n        case {\n          def { name: \"unused\" by: \"73\" }\n          if: \"$.id == 'blue'\" by: \"1\"\n        }\n        case { if: \"$.id == 'red'\" by: \"2\" }\n        default {\n          def { name: \"unused2\" by: \"'mackerel'\" }\n          by: \"3\"\n        }\n      }\n    }\n  };\n  int64 switch = 1 [(grpc.federation.field).by = \"switch\"];\n}\n"
  },
  {
    "path": "source/testdata/user.proto",
    "content": "syntax = \"proto3\";\n\npackage user;\n\noption go_package = \"example/user;user\";\n\nservice UserService {\n  rpc GetUser(GetUserRequest) returns (GetUserResponse) {};\n  rpc GetUsers(GetUsersRequest) returns (GetUsersResponse) {};\n}\n\nmessage GetUserRequest {\n  string id = 1;\n}\n\nmessage GetUserResponse {\n  User user = 1;\n}\n\nmessage GetUsersRequest {\n  repeated string ids = 1;\n}\n\nmessage GetUsersResponse {\n  repeated User users = 1;\n}\n\nmessage User {\n  string id = 1;\n  string name = 2;\n}\n"
  },
  {
    "path": "source/type_helper.go",
    "content": "package source\n\nfunc (loc *Location) IsDefinedTypeName() bool {\n\treturn loc.Message.IsDefinedTypeName()\n}\n\nfunc (loc *Location) IsDefinedFieldType() bool {\n\treturn loc.Message.IsDefinedFieldType()\n}\n\nfunc (loc *Location) IsDefinedTypeAlias() bool {\n\tswitch {\n\tcase loc.Message != nil:\n\t\treturn loc.Message.IsDefinedTypeAlias()\n\tcase loc.Enum != nil:\n\t\treturn loc.Enum.IsDefinedTypeAlias()\n\t}\n\treturn false\n}\n\nfunc (m *Message) IsDefinedTypeName() bool {\n\tif m == nil {\n\t\treturn false\n\t}\n\tswitch {\n\tcase m.NestedMessage != nil:\n\t\treturn m.NestedMessage.IsDefinedTypeName()\n\tcase m.Option != nil:\n\t\treturn m.Option.IsDefinedTypeName()\n\tcase m.Oneof != nil:\n\t\treturn m.Oneof.IsDefinedTypeName()\n\tcase m.Field != nil:\n\t\treturn m.Field.IsDefinedTypeName()\n\t}\n\treturn false\n}\n\nfunc (o *Oneof) IsDefinedTypeName() bool {\n\tif o == nil {\n\t\treturn false\n\t}\n\treturn o.Field.IsDefinedTypeName()\n}\n\nfunc (f *Field) IsDefinedTypeName() bool {\n\tif f == nil {\n\t\treturn false\n\t}\n\treturn f.Option.IsDefinedTypeName()\n}\n\nfunc (o *FieldOption) IsDefinedTypeName() bool {\n\tif o == nil {\n\t\treturn false\n\t}\n\treturn o.Oneof.IsDefinedTypeName()\n}\n\nfunc (o *FieldOneof) IsDefinedTypeName() bool {\n\tif o == nil {\n\t\treturn false\n\t}\n\treturn o.Def.IsDefinedTypeName()\n}\n\nfunc (o *MessageOption) IsDefinedTypeName() bool {\n\tif o == nil {\n\t\treturn false\n\t}\n\treturn o.Def.IsDefinedTypeName()\n}\n\nfunc (o *VariableDefinitionOption) IsDefinedTypeName() bool {\n\tif o == nil {\n\t\treturn false\n\t}\n\tswitch {\n\tcase o.Map != nil:\n\t\treturn o.Map.IsDefinedTypeName()\n\tcase o.Call != nil:\n\t\treturn o.Call.IsDefinedTypeName()\n\tcase o.Message != nil:\n\t\treturn o.Message.IsDefinedTypeName()\n\tcase o.Enum != nil:\n\t\treturn o.Enum.IsDefinedTypeName()\n\tcase o.Validation != nil:\n\t\treturn o.Validation.IsDefinedTypeName()\n\t}\n\treturn false\n}\n\nfunc (o *MapExprOption) IsDefinedTypeName() bool {\n\tif o == nil {\n\t\treturn false\n\t}\n\tswitch {\n\tcase o.Message != nil:\n\t\treturn o.Message.IsDefinedTypeName()\n\tcase o.Enum != nil:\n\t\treturn o.Enum.IsDefinedTypeName()\n\t}\n\treturn false\n}\n\nfunc (o *CallExprOption) IsDefinedTypeName() bool {\n\tif o == nil {\n\t\treturn false\n\t}\n\treturn o.Error.IsDefinedTypeName()\n}\n\nfunc (o *MessageExprOption) IsDefinedTypeName() bool {\n\tif o == nil {\n\t\treturn false\n\t}\n\treturn o.Name\n}\n\nfunc (o *EnumExprOption) IsDefinedTypeName() bool {\n\tif o == nil {\n\t\treturn false\n\t}\n\treturn o.Name\n}\n\nfunc (o *ValidationExprOption) IsDefinedTypeName() bool {\n\tif o == nil {\n\t\treturn false\n\t}\n\treturn o.Error.IsDefinedTypeName()\n}\n\nfunc (o *GRPCErrorOption) IsDefinedTypeName() bool {\n\tif o == nil {\n\t\treturn false\n\t}\n\tswitch {\n\tcase o.Def != nil:\n\t\treturn o.Def.IsDefinedTypeName()\n\tcase o.Detail != nil:\n\t\treturn o.Detail.IsDefinedTypeName()\n\t}\n\treturn false\n}\n\nfunc (o *GRPCErrorDetailOption) IsDefinedTypeName() bool {\n\tif o == nil {\n\t\treturn false\n\t}\n\tswitch {\n\tcase o.Def != nil:\n\t\treturn o.Def.IsDefinedTypeName()\n\tcase o.Message != nil:\n\t\treturn o.Message.IsDefinedTypeName()\n\t}\n\treturn false\n}\n\nfunc (m *Message) IsDefinedFieldType() bool {\n\tif m == nil {\n\t\treturn false\n\t}\n\tswitch {\n\tcase m.NestedMessage != nil:\n\t\treturn m.NestedMessage.IsDefinedFieldType()\n\tcase m.Field != nil:\n\t\treturn m.Field.IsDefinedFieldType()\n\tcase m.Oneof != nil:\n\t\treturn m.Oneof.IsDefinedFieldType()\n\t}\n\treturn false\n}\n\nfunc (f *Field) IsDefinedFieldType() bool {\n\tif f == nil {\n\t\treturn false\n\t}\n\treturn f.Type\n}\n\nfunc (o *Oneof) IsDefinedFieldType() bool {\n\tif o == nil {\n\t\treturn false\n\t}\n\treturn o.Field.IsDefinedFieldType()\n}\n\nfunc (m *Message) IsDefinedTypeAlias() bool {\n\tif m == nil {\n\t\treturn false\n\t}\n\tswitch {\n\tcase m.Enum != nil:\n\t\treturn m.Enum.IsDefinedTypeAlias()\n\tcase m.NestedMessage != nil:\n\t\treturn m.NestedMessage.IsDefinedTypeAlias()\n\tcase m.Option != nil:\n\t\treturn m.Option.IsDefinedTypeAlias()\n\tcase m.Oneof != nil:\n\t\treturn m.Oneof.IsDefinedTypeAlias()\n\tcase m.Field != nil:\n\t\treturn m.Field.IsDefinedTypeAlias()\n\t}\n\treturn false\n}\n\nfunc (o *MessageOption) IsDefinedTypeAlias() bool {\n\tif o == nil {\n\t\treturn false\n\t}\n\treturn o.Alias\n}\n\nfunc (o *Oneof) IsDefinedTypeAlias() bool {\n\tif o == nil {\n\t\treturn false\n\t}\n\treturn o.Field.IsDefinedTypeAlias()\n}\n\nfunc (f *Field) IsDefinedTypeAlias() bool {\n\tif f == nil {\n\t\treturn false\n\t}\n\treturn f.Option.IsDefinedTypeAlias()\n}\n\nfunc (o *FieldOption) IsDefinedTypeAlias() bool {\n\tif o == nil {\n\t\treturn false\n\t}\n\treturn o.Alias\n}\n\nfunc (e *Enum) IsDefinedTypeAlias() bool {\n\tif e == nil {\n\t\treturn false\n\t}\n\tswitch {\n\tcase e.Option != nil:\n\t\treturn e.Option.IsDefinedTypeAlias()\n\tcase e.Value != nil:\n\t\treturn e.Value.IsDefinedTypeAlias()\n\t}\n\treturn false\n}\n\nfunc (o *EnumOption) IsDefinedTypeAlias() bool {\n\tif o == nil {\n\t\treturn false\n\t}\n\treturn o.Alias\n}\n\nfunc (v *EnumValue) IsDefinedTypeAlias() bool {\n\tif v == nil {\n\t\treturn false\n\t}\n\treturn v.Option.IsDefinedTypeAlias()\n}\n\nfunc (o *EnumValueOption) IsDefinedTypeAlias() bool {\n\tif o == nil {\n\t\treturn false\n\t}\n\treturn o.Alias\n}\n"
  },
  {
    "path": "source/type_helper_test.go",
    "content": "package source_test\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/mercari/grpc-federation/source\"\n)\n\nfunc TestLocation_IsDefinedTypeName(t *testing.T) {\n\tt.Parallel()\n\n\tpath := filepath.Join(\"testdata\", \"coverage.proto\")\n\tcontent, err := os.ReadFile(path)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tsourceFile, err := source.NewFile(path, content)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\ttests := []struct {\n\t\tdesc     string\n\t\tlocation *source.Location\n\t\twant     bool\n\t}{\n\t\t{\n\t\t\tdesc: \"IsDefinedTypeName returns true for MessageExprOption with Name=true\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"User\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 3,\n\t\t\t\t\t\t\tMessage: &source.MessageExprOption{\n\t\t\t\t\t\t\t\tName: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tdesc: \"IsDefinedTypeName returns true for EnumExprOption with Name=true\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"User\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 1,\n\t\t\t\t\t\t\tMap: &source.MapExprOption{\n\t\t\t\t\t\t\t\tEnum: &source.EnumExprOption{\n\t\t\t\t\t\t\t\t\tName: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tdesc: \"IsDefinedTypeName returns false for MessageExprOption with Name=false\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"User\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 3,\n\t\t\t\t\t\t\tMessage: &source.MessageExprOption{\n\t\t\t\t\t\t\t\tName: false,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"IsDefinedTypeName returns false for EnumExprOption with Name=false\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"User\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 1,\n\t\t\t\t\t\t\tMap: &source.MapExprOption{\n\t\t\t\t\t\t\t\tEnum: &source.EnumExprOption{\n\t\t\t\t\t\t\t\t\tName: false,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"IsDefinedTypeName returns false for EnumExprOption with By=true but Name=false\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"User\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 1,\n\t\t\t\t\t\t\tMap: &source.MapExprOption{\n\t\t\t\t\t\t\t\tEnum: &source.EnumExprOption{\n\t\t\t\t\t\t\t\t\tName: false,\n\t\t\t\t\t\t\t\t\tBy:   true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"IsDefinedTypeName returns false for unrelated location\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"User\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\tValidation: &source.ValidationExprOption{\n\t\t\t\t\t\t\t\tName: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"IsDefinedTypeName returns false for FieldOneof with Name=false\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"NestedMessage\",\n\t\t\t\t\tOneof: &source.Oneof{\n\t\t\t\t\t\tName: \"choice\",\n\t\t\t\t\t\tField: &source.Field{\n\t\t\t\t\t\t\tName: \"value\",\n\t\t\t\t\t\t\tOption: &source.FieldOption{\n\t\t\t\t\t\t\t\tOneof: &source.FieldOneof{\n\t\t\t\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\t\t\t\tMessage: &source.MessageExprOption{\n\t\t\t\t\t\t\t\t\t\t\tName: false,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"IsDefinedTypeName returns true for FieldOneof with MessageExprOption Name=true\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"NestedMessage\",\n\t\t\t\t\tOneof: &source.Oneof{\n\t\t\t\t\t\tName: \"choice\",\n\t\t\t\t\t\tField: &source.Field{\n\t\t\t\t\t\t\tName: \"value\",\n\t\t\t\t\t\t\tOption: &source.FieldOption{\n\t\t\t\t\t\t\t\tOneof: &source.FieldOneof{\n\t\t\t\t\t\t\t\t\tDef: &source.VariableDefinitionOption{\n\t\t\t\t\t\t\t\t\t\tIdx: 0,\n\t\t\t\t\t\t\t\t\t\tMessage: &source.MessageExprOption{\n\t\t\t\t\t\t\t\t\t\t\tName: true,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: true,\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.desc, func(t *testing.T) {\n\t\t\tnodeInfo := sourceFile.NodeInfoByLocation(tc.location)\n\t\t\tif nodeInfo == nil {\n\t\t\t\tt.Fatalf(\"nodeInfo is nil for location: %+v\", tc.location)\n\t\t\t}\n\n\t\t\tgot := tc.location.IsDefinedTypeName()\n\t\t\tif got != tc.want {\n\t\t\t\tt.Errorf(\"IsDefinedTypeName() = %v, want %v\", got, tc.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestLocation_IsDefinedFieldType(t *testing.T) {\n\tt.Parallel()\n\n\tpath := filepath.Join(\"testdata\", \"coverage.proto\")\n\tcontent, err := os.ReadFile(path)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\t_, err = source.NewFile(path, content)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\ttests := []struct {\n\t\tdesc     string\n\t\tlocation *source.Location\n\t\twant     bool\n\t}{\n\t\t{\n\t\t\tdesc: \"IsDefinedFieldType returns true for Field with Type=true\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"User\",\n\t\t\t\t\tField: &source.Field{\n\t\t\t\t\t\tName: \"id\",\n\t\t\t\t\t\tType: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tdesc: \"IsDefinedFieldType returns false for Field with Type=false\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"User\",\n\t\t\t\t\tField: &source.Field{\n\t\t\t\t\t\tName: \"id\",\n\t\t\t\t\t\tType: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"IsDefinedFieldType returns true for Oneof Field with Type=true\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"NestedMessage\",\n\t\t\t\t\tOneof: &source.Oneof{\n\t\t\t\t\t\tName: \"choice\",\n\t\t\t\t\t\tField: &source.Field{\n\t\t\t\t\t\t\tName: \"value\",\n\t\t\t\t\t\t\tType: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tdesc: \"IsDefinedFieldType returns false for Oneof Field with Type=false\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"NestedMessage\",\n\t\t\t\t\tOneof: &source.Oneof{\n\t\t\t\t\t\tName: \"choice\",\n\t\t\t\t\t\tField: &source.Field{\n\t\t\t\t\t\t\tName: \"value\",\n\t\t\t\t\t\t\tType: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: false,\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.desc, func(t *testing.T) {\n\t\t\tgot := tc.location.IsDefinedFieldType()\n\t\t\tif got != tc.want {\n\t\t\t\tt.Errorf(\"IsDefinedFieldType() = %v, want %v\", got, tc.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestLocation_IsDefinedTypeAlias(t *testing.T) {\n\tt.Parallel()\n\n\tpath := filepath.Join(\"testdata\", \"coverage.proto\")\n\tcontent, err := os.ReadFile(path)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\t_, err = source.NewFile(path, content)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\ttests := []struct {\n\t\tdesc     string\n\t\tlocation *source.Location\n\t\twant     bool\n\t}{\n\t\t{\n\t\t\tdesc: \"IsDefinedTypeAlias returns true for MessageOption with Alias=true\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"ComplexResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tAlias: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tdesc: \"IsDefinedTypeAlias returns false for MessageOption with Alias=false\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"ComplexResponse\",\n\t\t\t\t\tOption: &source.MessageOption{\n\t\t\t\t\t\tAlias: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"IsDefinedTypeAlias returns true for FieldOption with Alias=true\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"DataItem\",\n\t\t\t\t\tField: &source.Field{\n\t\t\t\t\t\tName: \"id\",\n\t\t\t\t\t\tOption: &source.FieldOption{\n\t\t\t\t\t\t\tAlias: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tdesc: \"IsDefinedTypeAlias returns false for FieldOption with Alias=false\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tMessage: &source.Message{\n\t\t\t\t\tName: \"DataItem\",\n\t\t\t\t\tField: &source.Field{\n\t\t\t\t\t\tName: \"id\",\n\t\t\t\t\t\tOption: &source.FieldOption{\n\t\t\t\t\t\t\tAlias: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: false,\n\t\t},\n\t\t{\n\t\t\tdesc: \"IsDefinedTypeAlias returns true for EnumOption with Alias=true\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tEnum: &source.Enum{\n\t\t\t\t\tName: \"Status\",\n\t\t\t\t\tOption: &source.EnumOption{\n\t\t\t\t\t\tAlias: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tdesc: \"IsDefinedTypeAlias returns false for EnumOption with Alias=false\",\n\t\t\tlocation: &source.Location{\n\t\t\t\tFileName: \"testdata/coverage.proto\",\n\t\t\t\tEnum: &source.Enum{\n\t\t\t\t\tName: \"Status\",\n\t\t\t\t\tOption: &source.EnumOption{\n\t\t\t\t\t\tAlias: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: false,\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.desc, func(t *testing.T) {\n\t\t\tgot := tc.location.IsDefinedTypeAlias()\n\t\t\tif got != tc.want {\n\t\t\t\tt.Errorf(\"IsDefinedTypeAlias() = %v, want %v\", got, tc.want)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "testdata/alias.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\noption (grpc.federation.file)= {\n  import: [\"nested_post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n\n  message ConditionA {\n    option (grpc.federation.message).alias = \"org.post.PostConditionA\";\n    string prop = 1;\n  }\n  message ConditionB {\n    option (grpc.federation.message).alias = \"org.post.PostConditionB\";\n  }\n  oneof condition {\n    ConditionA a = 2;\n    ConditionB b = 3;\n  }\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\" message {\n        name: \"Post\"\n        args [\n          { name: \"id\" by: \"$.id\" },\n          { name: \"a\" by: \"$.a\" },\n          { name: \"b\" by: \"$.b\" }\n        ]\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"res\"\n        call {\n          method: \"org.post.PostService/GetPost\"\n          request [\n            { field: \"id\", by: \"$.id\" },\n            { field: \"a\", by: \"$.a\", if: \"$.a != null\" },\n            { field: \"b\", by: \"$.b\", if: \"$.b != null\" }\n          ]\n        }\n      },\n      { name: \"post\" by: \"res.post\" autobind: true  }\n    ]\n  };\n  string id = 1;\n  PostData data = 4;\n}\n\nenum PostType {\n  option (grpc.federation.enum).alias = \"org.post.PostDataType\";\n\n  POST_TYPE_UNKNOWN = 0 [(grpc.federation.enum_value).default = true];\n  POST_TYPE_FOO = 1 [(grpc.federation.enum_value) = { alias: [\"POST_TYPE_A\"] }];\n  POST_TYPE_BAR = 2 [(grpc.federation.enum_value) = { alias: [\"POST_TYPE_B\", \"POST_TYPE_C\"] }];\n  POST_TYPE_BAZ = 3 [(grpc.federation.enum_value).noalias = true];\n}\n\nmessage PostData {\n  option (grpc.federation.message).alias = \"org.post.PostData\";\n\n  PostType type = 1;\n  string title = 2;\n  PostContent content = 3;\n}\n\nmessage PostContent {\n  option (grpc.federation.message).alias = \"org.post.PostContent\";\n\n  enum Category {\n    option (grpc.federation.enum).alias = \"org.post.PostContent.Category\";\n  \n    CATEGORY_A = 0;\n    CATEGORY_B = 1;\n    CATEGORY_C = 2 [(grpc.federation.enum_value).noalias = true];\n  };\n\n  Category category = 1;\n  string head = 2;\n  string body = 3;\n  string dup_body = 4 [(grpc.federation.field).alias = \"body\"];\n  map<int32, int32> counts = 5;\n  map<int32, int32> cast_counts = 6;\n}\n"
  },
  {
    "path": "testdata/alias_multifile.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\n// The v2 package spans two proto files (post_v2.proto and post_v2_extra.proto)\n// which share the same go_package. This tests that the code generator correctly\n// assigns the same import alias to both files.\n\noption (grpc.federation.file)= {\n  import: [\"nested_post.proto\", \"post_v2.proto\", \"post_v2_extra.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\" message {\n        name: \"Post\"\n        args [\n          { name: \"id\" by: \"$.id\" }\n        ]\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"org.post.PostService/GetPost\"\n        request { field: \"id\", by: \"$.id\" }\n      }\n    }\n    def { name: \"post\" by: \"res.post\" autobind: true }\n    def {\n      name: \"res2\"\n      call {\n        method: \"org.post.v2.PostService/GetPost\"\n        request { field: \"id\", by: \"$.id\" }\n      }\n    }\n    def { name: \"v2post\", by: \"res2.post\" }\n    def { name: \"v2data\", by: \"v2post.data\" }\n  };\n  string id = 1;\n  PostData data = 4;\n  PostData v2data = 5 [(grpc.federation.field).by = \"v2data\"];\n}\n\nenum PostType {\n  option (grpc.federation.enum) = {\n    alias: [ \"org.post.PostDataType\", \"org.post.v2.PostDataType\" ]\n  };\n\n  POST_TYPE_UNKNOWN = 0 [(grpc.federation.enum_value).default = true];\n  POST_TYPE_FOO = 1 [(grpc.federation.enum_value) = { alias: [\"POST_TYPE_A\"] }];\n  POST_TYPE_BAR = 2 [(grpc.federation.enum_value) = {\n    alias: [\n      \"org.post.PostDataType.POST_TYPE_B\",\n      \"org.post.PostDataType.POST_TYPE_C\",\n      \"org.post.v2.PostDataType.POST_V2_TYPE_B\",\n      \"org.post.v2.PostDataType.POST_V2_TYPE_C\"\n    ]\n  }];\n}\n\n// Alias for ExtraType from the second v2 proto file.\n// This is the key test: ExtraType comes from post_v2_extra.proto which has a\n// different *GoPackage pointer than post_v2.proto, but the same import path.\nenum ExtraKind {\n  option (grpc.federation.enum).alias = \"org.post.v2.ExtraType\";\n\n  EXTRA_KIND_UNKNOWN = 0 [(grpc.federation.enum_value).default = true];\n  EXTRA_KIND_A = 1 [(grpc.federation.enum_value) = { alias: [\"EXTRA_TYPE_A\"] }];\n  EXTRA_KIND_B = 2 [(grpc.federation.enum_value) = { alias: [\"EXTRA_TYPE_B\"] }];\n}\n\nmessage PostData {\n  option (grpc.federation.message) = {\n    alias: [ \"org.post.PostData\", \"org.post.v2.PostData\" ]\n  };\n\n  PostType type = 1;\n  string title = 2;\n  PostContent content = 3;\n}\n\nmessage PostContent {\n  option (grpc.federation.message) = {\n    alias: [ \"org.post.PostContent\", \"org.post.v2.PostContent\" ]\n  };\n\n  enum Category {\n    option (grpc.federation.enum) = {\n      alias: [ \"org.post.PostContent.Category\", \"org.post.v2.PostContent.Category\" ]\n    };\n\n    CATEGORY_A = 0;\n    CATEGORY_B = 1;\n  };\n\n  Category category = 1;\n  string head = 2;\n  string body = 3;\n}\n"
  },
  {
    "path": "testdata/async.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc Get(GetRequest) returns (GetResponse) {};\n}\n\nmessage GetRequest {}\n\nmessage GetResponse {\n  option (grpc.federation.message) = {\n    def [\n      { name: \"a\" message { name: \"A\" } },\n      { name: \"b\" message { name: \"B\" } },\n      { name: \"c\" message { name: \"C\" args { name: \"a\" by: \"a.name\" } } },\n      { name: \"d\" message { name: \"D\" args { name: \"b\" by: \"b.name\" } } },\n      { name: \"e\" message { name: \"E\" args [ { name: \"c\" by: \"c.name\" }, { name: \"d\" by: \"d.name\" } ] } },\n      { name: \"f\" message { name: \"F\" args [ { name: \"c\" by: \"c.name\" }, { name: \"d\" by: \"d.name\" } ] } },\n      { name: \"g\" message { name: \"G\" } },\n      { name: \"h\" message { name: \"H\" args [ { name: \"e\", by: \"e.name\" }, { name: \"f\", by: \"f.name\" }, { name: \"g\", by: \"g.name\"} ] } },\n      { name: \"i\" message { name: \"I\" } },\n      { name: \"j\" message { name: \"J\" args { name: \"i\", by: \"i.name\" } } }\n    ]\n  };\n  string hname = 1 [(grpc.federation.field).by = \"h.name\"];\n  string jname = 2 [(grpc.federation.field).by = \"j.name\"];\n}\n\nmessage A {\n  option (grpc.federation.message) = {\n    def [\n      { name: \"aa\", message { name: \"AA\" } },\n      { name: \"ab\", message { name: \"AB\" } }\n    ]\n  };\n  string name = 1 [(grpc.federation.field).by = \"'a'\"];\n}\n\nmessage AA {\n  string name = 1 [(grpc.federation.field).by = \"'aa'\"];\n}\n\nmessage AB {\n  string name = 1 [(grpc.federation.field).by = \"'ab'\"];\n}\n\nmessage B {\n  string name = 1 [(grpc.federation.field).by = \"'b'\"];\n}\n\nmessage C {\n  string name = 1 [(grpc.federation.field).by = \"'c'\"];\n}\n\nmessage D {\n  string name = 1 [(grpc.federation.field).by = \"'d'\"];\n}\n\nmessage E {\n  string name = 1 [(grpc.federation.field).by = \"'e'\"];\n}\n\nmessage F {\n  string name = 1 [(grpc.federation.field).by = \"'f'\"];\n}\n\nmessage G {\n  string name = 1 [(grpc.federation.field).by = \"'g'\"];\n}\n\nmessage H {\n  string name = 1 [(grpc.federation.field).by = \"'h'\"];\n}\n\nmessage I {\n  string name = 1 [(grpc.federation.field).by = \"'i'\"];\n}\n\nmessage J {\n  string name = 1 [(grpc.federation.field).by = \"'j'\"];\n}"
  },
  {
    "path": "testdata/autobind.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"google/protobuf/any.proto\";\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\noption (grpc.federation.file)= {\n  import: [\"post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      message { name: \"Post\" args { name: \"id\", by: \"$.id\" } }\n      autobind: true\n    }\n  };\n  string id = 1;\n  string title = 2;\n  string content = 3;\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"res\"\n        call {\n          method: \"org.post.PostService/GetPost\"\n          request { field: \"id\", by: \"$.id\" }\n        }\n      },\n      { by: \"res.post\" autobind: true },\n      {\n        message {\n          name: \"User\"\n          args { name: \"user_id\", by: \"'foo'\" }\n        }\n        autobind: true\n      }\n    ]\n  };\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  string uid = 4;\n}\n\nmessage User {\n  string uid = 1 [(grpc.federation.field).by = \"$.user_id\"];\n}"
  },
  {
    "path": "testdata/condition.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"google/protobuf/any.proto\";\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\noption (grpc.federation.file)= {\n  import: [\"post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n    \nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def [\n      {\n        if: \"$.id != ''\"\n        name: \"res\"\n        call {\n          method: \"org.post.PostService/GetPost\"\n          request { field: \"id\" by: \"$.id\" }\n         }\n      },\n      {\n        if: \"res != null\"\n        name: \"post\"\n        by: \"res.post\"\n      },\n      {\n        if: \"post != null\"\n        name: \"user\"\n        message {\n          name: \"User\"\n          args {\n            name: \"user_id\"\n            by: \"post.user_id\"\n          }\n        }\n      },\n      { name: \"posts\", by: \"[post]\" },\n      {\n        if: \"user != null\"\n        name: \"users\"\n        map {\n          iterator {\n            name: \"iter\"\n            src: \"posts\"\n          }\n          message {\n            name: \"User\"\n            args {\n              name: \"user_id\"\n              by: \"iter.user_id\"\n            }\n          }\n        }\n      },\n      {\n        if: \"users.size() > 0\"\n        validation {\n          error {\n            code: INVALID_ARGUMENT\n            if: \"users[0].id == ''\"\n          }\n        }\n      }\n    ]\n  };\n  string id = 1 [(grpc.federation.field).by = \"post.id\"];\n  string title = 2 [(grpc.federation.field).by = \"post.title\"];\n  User user = 4 [(grpc.federation.field).by = \"users[0]\"];\n}\n\nmessage User {\n  string id = 1 [(grpc.federation.field).by = \"$.user_id\"];\n}\n"
  },
  {
    "path": "testdata/content.proto",
    "content": "syntax = \"proto3\";\n\npackage content;\n\noption go_package = \"example/content;content\";\n\nservice ContentService {\n  rpc GetContent(GetContentRequest) returns (GetContentResponse) {};\n}\n\nmessage GetContentRequest {\n  string by_field                   = 1;\n  double double_field               = 2;\n  repeated double doubles_field     = 3;\n  float float_field                 = 4;\n  repeated float floats_field       = 5;\n  int32 int32_field                 = 6;\n  repeated int32 int32s_field       = 7;\n  int64 int64_field                 = 8;\n  repeated int64 int64s_field       = 9;\n  uint32 uint32_field               = 10;\n  repeated uint32 uint32s_field     = 11;\n  uint64 uint64_field               = 12;\n  repeated uint64 uint64s_field     = 13;\n  sint32 sint32_field               = 14;\n  repeated sint32 sint32s_field     = 15;\n  sint64 sint64_field               = 16;\n  repeated sint64 sint64s_field     = 17;\n  fixed32 fixed32_field             = 18;\n  repeated fixed32 fixed32s_field   = 19;\n  fixed64 fixed64_field             = 20;\n  repeated fixed64 fixed64s_field   = 21;\n  sfixed32 sfixed32_field           = 22;\n  repeated sfixed32 sfixed32s_field = 23;\n  sfixed64 sfixed64_field           = 24;\n  repeated sfixed64 sfixed64s_field = 25;\n  bool bool_field                   = 26;\n  repeated bool bools_field         = 27;\n  string string_field               = 28;\n  repeated string strings_field     = 29;\n  bytes byte_string_field           = 30;\n  repeated bytes byte_strings_field = 31;\n  ContentType enum_field            = 32;\n  repeated ContentType enums_field  = 33;\n  string env_field                  = 34;\n  repeated string envs_field        = 35;\n  Content message_field           = 36;\n  repeated Content messages_field = 37;\n}\n\nmessage GetContentResponse {\n  Content content = 1;\n}\n\nenum ContentType {\n  CONTENT_TYPE_1 = 0;\n  CONTENT_TYPE_2 = 1;\n  CONTENT_TYPE_3 = 2;\n}\n\nmessage Content {\n  string by_field                   = 1;\n  double double_field               = 2;\n  repeated double doubles_field     = 3;\n  float float_field                 = 4;\n  repeated float floats_field       = 5;\n  int32 int32_field                 = 6;\n  repeated int32 int32s_field       = 7;\n  int64 int64_field                 = 8;\n  repeated int64 int64s_field       = 9;\n  uint32 uint32_field               = 10;\n  repeated uint32 uint32s_field     = 11;\n  uint64 uint64_field               = 12;\n  repeated uint64 uint64s_field     = 13;\n  sint32 sint32_field               = 14;\n  repeated sint32 sint32s_field     = 15;\n  sint64 sint64_field               = 16;\n  repeated sint64 sint64s_field     = 17;\n  fixed32 fixed32_field             = 18;\n  repeated fixed32 fixed32s_field   = 19;\n  fixed64 fixed64_field             = 20;\n  repeated fixed64 fixed64s_field   = 21;\n  sfixed32 sfixed32_field           = 22;\n  repeated sfixed32 sfixed32s_field = 23;\n  sfixed64 sfixed64_field           = 24;\n  repeated sfixed64 sfixed64s_field = 25;\n  bool bool_field                   = 26;\n  repeated bool bools_field         = 27;\n  string string_field               = 28;\n  repeated string strings_field     = 29;\n  bytes byte_string_field           = 30;\n  repeated bytes byte_strings_field = 31;\n  ContentType enum_field            = 32;\n  repeated ContentType enums_field  = 33;\n  string env_field                  = 34;\n  repeated string envs_field        = 35;\n  Content message_field           = 36;\n  repeated Content messages_field = 37;\n}\n"
  },
  {
    "path": "testdata/create_post.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\nimport \"google/protobuf/empty.proto\";\n\noption go_package = \"example/federation;federation\";\n\noption (grpc.federation.file)= {\n  import: [\"post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc CreatePost(CreatePostRequest) returns (CreatePostResponse) {};\n  rpc UpdatePost(UpdatePostRequest) returns (google.protobuf.Empty) {\n    option (grpc.federation.method).response = \"UpdatePostResponse\";\n  };\n}\n\nenum PostType {\n  option (grpc.federation.enum).alias = \"org.post.PostType\";\n\n  TYPE_UNKNOWN = 0 [(grpc.federation.enum_value).alias = \"POST_TYPE_UNKNOWN\"];\n  TYPE_A = 1 [(grpc.federation.enum_value).alias = \"POST_TYPE_A\"];\n  TYPE_B = 2 [(grpc.federation.enum_value).alias = \"POST_TYPE_B\"];\n}\n\nmessage CreatePostRequest {\n  string title = 1;\n  string content = 2;\n  string user_id = 3;\n  PostType type = 4;\n}\n\nmessage CreatePostResponse {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"cp\"\n        message {\n          name: \"CreatePost\"\n          args: [\n            { name: \"title\", by: \"$.title\" },\n            { name: \"content\", by: \"$.content\" },\n            { name: \"user_id\", by: \"$.user_id\" },\n            { name: \"type\" by: \"$.type\" }\n          ]\n        }\n      },\n      {\n        name: \"res\"\n        call {\n          method: \"org.post.PostService/CreatePost\"\n          request { field: \"post\" by: \"cp\" }\n        }\n      },\n      { name: \"p\" by: \"res.post\" }\n    ]\n  };\n  Post post = 1 [(grpc.federation.field).by = \"p\"];\n}\n\nmessage CreatePost {\n  option (grpc.federation.message).alias = \"org.post.CreatePost\";\n\n  string title = 1 [(grpc.federation.field).by = \"$.title\"];\n  string content = 2 [(grpc.federation.field).by = \"$.content\"];\n  string user_id = 3 [(grpc.federation.field).by = \"$.user_id\"];\n  PostType type = 4 [(grpc.federation.field).by = \"PostType.from($.type)\"];\n  int32 post_type = 5 [(grpc.federation.field).by = \"PostType.TYPE_A\"];\n}\n\nmessage Post {\n  option (grpc.federation.message).alias = \"org.post.Post\";\n\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  string user_id = 4;\n}\n\nmessage UpdatePostRequest {\n  string id = 1;\n}\n\nmessage UpdatePostResponse {\n  option (grpc.federation.message) = {\n    def {\n      call {\n        method: \"org.post.PostService/UpdatePost\"\n        request { field: \"id\" by: \"$.id\" }\n      }\n    }\n  };\n}"
  },
  {
    "path": "testdata/custom_resolver.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\noption (grpc.federation.file)= {\n  import: [\"post.proto\", \"user.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\" by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"res\"\n        call {\n          method: \"org.post.PostService/GetPost\"\n          request { field: \"id\" by: \"$.id\" }\n        }\n      },\n      { name: \"post\" by: \"res.post\" autobind: true },\n      { name: \"user\" message { name: \"User\" args { inline: \"post\" } } }\n    ]\n  };\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  User user = 4 [(grpc.federation.field).custom_resolver = true];\n}\n\nmessage User {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"res\"\n        call {\n          method: \"org.user.UserService/GetUser\"\n          request { field: \"id\", by: \"$.user_id\" }\n        }\n      },\n      { name: \"u\" by: \"res.user\" }\n    ]\n    custom_resolver: true\n  };\n  string id = 1;\n  string name = 2 [(grpc.federation.field).custom_resolver = true];\n}\n"
  },
  {
    "path": "testdata/dependency_base_message.proto",
    "content": "syntax = \"proto3\";\n\npackage org.dep.base;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/dep/base;base\";\n\nmessage SimpleMessage {\n  option (grpc.federation.message) = {\n    def {\n      name: \"value\"\n      by: \"'test'\"\n    }\n  };\n\n  string value = 1 [(grpc.federation.field).by = \"value\"];\n}"
  },
  {
    "path": "testdata/dependency_child_message.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation.test;\n\nimport \"grpc/federation/federation.proto\";\nimport \"dependency_base_message.proto\";\n\noption go_package = \"example/federation;federation\";\n\noption (grpc.federation.file) = {\n  import: [\"dependency_base_message.proto\"]\n};\n\n// ChildMessage is defined in a separate file\n// Its MessageArgument will contain org.dep.base.SimpleMessage type\n// When this file is processed independently, the dependency detection\n// must recursively analyze MessageArgument to find the external package dependency\nmessage ChildMessage {\n  option (grpc.federation.message) = {\n    def {\n      name: \"value\"\n      // Access external package field via MessageArgument\n      by: \"$.nested_ext.value\"\n    }\n  };\n  string value = 1 [(grpc.federation.field).by = \"value\"];\n}"
  },
  {
    "path": "testdata/dependency_message_argument.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation.test;\n\nimport \"grpc/federation/federation.proto\";\nimport \"dependency_base_message.proto\";\nimport \"dependency_child_message.proto\";\n\noption go_package = \"example/federation;federation\";\n\noption (grpc.federation.file) = {\n  import: [\"dependency_base_message.proto\", \"dependency_child_message.proto\"]\n};\n\n// This service tests MessageArgument dependency detection across files\n// ChildMessage is defined in dependency_child_message.proto (separate file)\n// When ChildMessage's file is processed, it must detect the dependency on\n// org.dep.base.SimpleMessage through its MessageArgument's field types\n// Before the fix: dependency_base_message.proto would be incorrectly reported as \"unused\"\n//                 in dependency_child_message.proto\n// After the fix: dependency_base_message.proto dependency is correctly detected\n//                through MessageArgument field type analysis\nservice MessageArgumentTestService {\n  option (grpc.federation.service) = {};\n  rpc Get(GetRequest) returns (GetResponse);\n}\n\nmessage GetRequest {}\n\nmessage GetResponse {\n  option (grpc.federation.message) = {\n    // Create external message\n    def {\n      name: \"external\"\n      message {\n        name: \"org.dep.base.SimpleMessage\"\n      }\n    }\n    // Pass external message to ChildMessage (defined in separate file)\n    def {\n      name: \"child\"\n      message {\n        name: \"ChildMessage\"\n        args { name: \"nested_ext\" by: \"external\" }\n      }\n    }\n  };\n  ChildMessage result = 1 [(grpc.federation.field).by = \"child\"];\n}"
  },
  {
    "path": "testdata/dependency_method_response.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation.test;\n\nimport \"grpc/federation/federation.proto\";\nimport \"dependency_base_message.proto\";\n\noption go_package = \"example/federation;federation\";\n\noption (grpc.federation.file) = {\n  import: [\"dependency_base_message.proto\"]\n};\n\n// This service uses Method.Rule.Response to specify custom response type\n// Before the fix: dependency_base_message.proto would be incorrectly reported as \"unused\"\n// After the fix: dependency_base_message.proto dependency is correctly detected\nservice MethodResponseTestService {\n  option (grpc.federation.service) = {};\n\n  rpc GetMessage(GetMessageRequest) returns (GetMessageResponse) {\n    option (grpc.federation.method) = {\n      response: \"org.dep.base.SimpleMessage\"\n    };\n  }\n}\n\nmessage GetMessageRequest {}\n\nmessage GetMessageResponse {\n  string value = 1;\n}"
  },
  {
    "path": "testdata/dependency_oneof.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation.test;\n\nimport \"grpc/federation/federation.proto\";\nimport \"dependency_base_message.proto\";\n\noption go_package = \"example/federation;federation\";\n\noption (grpc.federation.file) = {\n  import: [\"dependency_base_message.proto\"]\n};\n\n// This service uses FieldOneofRule with If condition and DefSet\n// Before the fix: dependency_base_message.proto would be incorrectly reported as \"unused\"\n// After the fix: dependency_base_message.proto dependency is correctly detected\nservice OneofTestService {\n  option (grpc.federation.service) = {};\n  rpc Get(GetRequest) returns (GetResponse);\n}\n\nmessage GetRequest {\n  bool use_message = 1;\n}\n\nmessage GetResponse {\n  option (grpc.federation.message) = {};\n\n  oneof result {\n    string error = 1 [\n      (grpc.federation.field).oneof = {\n        if: \"!$.use_message\"\n        by: \"'no message requested'\"\n      }\n    ];\n\n    MessageResult message_result = 2 [\n      (grpc.federation.field).oneof = {\n        // If condition references external package\n        if: \"$.use_message\"\n        // DefSet creates message from external package (org.dep.base.SimpleMessage)\n        def {\n          name: \"msg\"\n          message {\n            name: \"org.dep.base.SimpleMessage\"\n          }\n        }\n        by: \"msg\"\n      }\n    ];\n  }\n}\n\nmessage MessageResult {\n  option (grpc.federation.message) = {\n    def {\n      name: \"value\"\n      by: \"'result from oneof'\"\n    }\n  };\n\n  string value = 1 [(grpc.federation.field).by = \"value\"];\n}"
  },
  {
    "path": "testdata/dependency_service_variable.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation.test;\n\nimport \"grpc/federation/federation.proto\";\nimport \"dependency_base_message.proto\";\n\noption go_package = \"example/federation;federation\";\n\noption (grpc.federation.file) = {\n  import: [\"dependency_base_message.proto\"]\n};\n\n// This service uses ServiceVariable with message/enum expressions from external packages\n// Before the fix: dependency_base_message.proto would be incorrectly reported as \"unused\"\n// After the fix: dependency_base_message.proto dependency is correctly detected\nservice ServiceVariableTestService {\n  option (grpc.federation.service) = {\n    // ServiceVariable referencing external message\n    var {\n      name: \"external_msg\"\n      message {\n        name: \"org.dep.base.SimpleMessage\"\n      }\n    }\n  };\n  rpc Get(GetRequest) returns (GetResponse);\n}\n\nmessage GetRequest {}\n\nmessage GetResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"value\"\n      by: \"grpc.federation.var.external_msg.value\"\n    }\n  };\n\n  string value = 1 [(grpc.federation.field).by = \"value\"];\n}"
  },
  {
    "path": "testdata/error_handler.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\noption (grpc.federation.file)= {\n  import: [\"post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  org.federation.Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"res\"\n        call {\n          method: \"org.post.PostService/GetPost\"\n          request { field: \"id\" by: \"$.id\" }\n          error {\n            def { name: \"id\" by: \"$.id\" }\n            if: \"error.precondition_failures.map(f, f.violations[0]).first(v, v.subject == '').?subject == optional.of('')\"\n            code: FAILED_PRECONDITION\n            message: \"'id must be not empty'\"\n            details {\n              def { name: \"localized_msg\" message { name: \"LocalizedMessage\" args { name: \"value\" by: \"id\" } } }\n              message { name: \"CustomMessage\" args { name: \"msg\" by: \"id\" } }\n              by: [ \"org.post.Post{id: 'foo'}\", \"org.post.CreatePost{title: 'bar'}\" ]\n              precondition_failure {\n                violations {\n                  type: \"'some-type'\"\n                  subject: \"'some-subject'\"\n                  description: \"'some-description'\"\n                }\n              }\n              localized_message {\n                locale: \"en-US\"\n                message: \"localized_msg.value\"\n              }\n            }\n          }\n          error {\n            if: \"error.code == google.rpc.Code.UNIMPLEMENTED\"\n            ignore_and_response: \"org.post.GetPostResponse{post: org.post.Post{id: 'anonymous', title: 'none'}}\"\n          }\n          error {\n            ignore: true\n          }\n        }\n      },\n      { name: \"post\" by: \"res.post\" autobind: true }\n    ]\n  };\n  string id = 1;\n  string title = 2;\n}\n\nmessage LocalizedMessage {\n  string value = 1 [(grpc.federation.field).by = \"'localized value:' + $.value\"];\n}\n\nmessage CustomMessage {\n  string msg = 1 [(grpc.federation.field).by = \"'custom error message:' + $.msg\"];\n}"
  },
  {
    "path": "testdata/inline_env.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\nimport \"google/protobuf/duration.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice InlineEnvService {\n  option (grpc.federation.service) = {\n    env {\n      var {\n        name: \"aaa\"\n        type { kind: STRING }\n        option {\n          default: \"xxx\"\n        }\n      }\n      var {\n        name: \"bbb\"\n        type { repeated { kind: INT64 } }\n        option {\n          alternate: \"yyy\"\n        }\n      }\n      var {\n        name: \"ccc\"\n        type { map { key { kind: STRING } value { kind: DURATION } } }\n        option {\n          required: true\n          alternate: \"c\"\n        }\n      }\n      var {\n        name: \"ddd\"\n        type { kind: DOUBLE }\n        option {\n          ignored: true\n        }\n      }\n    }\n    var [\n      { name: \"x\" by: \"grpc.federation.env.aaa\" },\n      {\n        name: \"y\"\n        switch {\n          case { if: \"grpc.federation.env.aaa == 'xxx'\" by: \"grpc.federation.env.bbb\" }\n          default { by: \"[0, 0]\" }\n        }\n      },\n      { validation { if: \"grpc.federation.env.bbb == 1\" message: \"'error'\" } }\n    ]\n  };\n}\n"
  },
  {
    "path": "testdata/map.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"google/protobuf/any.proto\";\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\noption (grpc.federation.file)= {\n  import: [\"post.proto\", \"user.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPosts(GetPostsRequest) returns (GetPostsResponse) {};\n}\n\nmessage GetPostsRequest {\n  repeated string ids = 1;\n}\n    \nmessage GetPostsResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"posts\"\n      message {\n        name: \"Posts\"\n        args { name: \"post_ids\", by: \"$.ids\" }\n      }\n    }\n  };\n  Posts posts = 1 [(grpc.federation.field).by = \"posts\"];\n}\n\nmessage Posts {\n  option (grpc.federation.message) = {\n    def [\n      {\n         name: \"res\"\n         call {\n          method: \"org.post.PostService/GetPosts\"\n          request { field: \"ids\" by: \"$.post_ids\" }\n         }\n      },\n      { name: \"posts\", by: \"res.posts\" },\n      {\n        name: \"ids\"\n        map {\n          iterator {\n            name: \"post\"\n            src: \"posts\"\n          }\n          by: \"post.id\"\n        }\n      },\n      {\n        name: \"users\"\n        map {\n          iterator {\n            name: \"iter\"\n            src: \"posts\"\n          }\n          message {\n            name: \"User\"\n            args { name: \"user_id\", by: \"iter.user_id\" }\n          }\n        }\n      },\n      {\n        name: \"items\"\n        map {\n          iterator {\n            name: \"iter\"\n            src: \"posts\"\n          }\n          message {\n            name: \"Posts.PostItem\"\n            args { name: \"id\" by: \"iter.id\" }\n          }\n        }\n      },\n      {\n        name: \"source_user_types\"\n        by: \"[org.user.UserType.value('USER_TYPE_1'), org.user.UserType.value('USER_TYPE_2')]\"\n      },\n      {\n        name: \"user_types\"\n        map {\n          iterator {\n            name: \"typ\"\n            src: \"source_user_types\"\n          }\n          enum {\n            name: \"UserType\"\n            by: \"typ\"\n          }\n        }\n      }\n    ]\n  };\n\n  message PostItem {\n    string name = 1 [(grpc.federation.field).by = \"'item_' + $.id\"];\n  };\n\n  repeated string ids = 1 [(grpc.federation.field).by = \"ids\"];\n  repeated string titles = 2 [(grpc.federation.field).by = \"posts.map(post, post.title)\"];\n  repeated string contents = 3 [(grpc.federation.field).by = \"posts.map(post, post.content)\"];\n  repeated User users = 4 [(grpc.federation.field).by = \"users\"];\n  repeated PostItem items = 5 [(grpc.federation.field).by = \"items\"];\n  repeated UserType user_types = 6 [(grpc.federation.field).by = \"user_types\"];\n}\n\nmessage User {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"org.user.UserService/GetUser\"\n        request { field: \"id\" by: \"$.user_id\" }\n      }\n    }\n    def { name: \"user\" by: \"res.user\" autobind: true }\n    custom_resolver: true\n  };\n  string id = 1;\n  string name = 2;\n}\n\nenum UserType {\n  option (grpc.federation.enum).alias = \"org.user.UserType\";\n\n  USER_TYPE_1 = 0;\n  USER_TYPE_2 = 1;\n}\n"
  },
  {
    "path": "testdata/minimum.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n  PostType type = 2;\n}\n\nenum PostType {\n  POST_TYPE_1 = 0;\n  POST_TYPE_2 = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message).custom_resolver = true;\n  Post post = 1;\n}\n\nmessage Post {\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  User user = 4;\n}\n\nmessage User {\n  string id = 1;\n  string name = 2;\n}\n"
  },
  {
    "path": "testdata/multi_user.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\noption (grpc.federation.file)= {\n  import: [\"user.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc Get(GetRequest) returns (GetResponse) {};\n}\n\nmessage GetRequest {}\n\nmessage GetResponse {\n  option (grpc.federation.message) = {\n    def [\n      { name: \"uid\" message { name: \"UserID\" } },\n      { name: \"user\" message { name: \"User\" args { name: \"user_id\" by: \"uid.value\" } } },\n      { name: \"user2\" message { name: \"User\" args { name: \"user_id\" by: \"uid.value\" } } }\n    ]\n  };\n  User user = 1 [(grpc.federation.field).by = \"user\"];\n  User user2 = 2 [(grpc.federation.field).by = \"user2\"];\n}\n\nmessage User {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"res\"\n        call {\n          method: \"org.user.UserService/GetUser\"\n          request { field: \"id\", by: \"$.user_id\" }\n        }\n      },\n      { name: \"user\" by: \"res.user\" autobind: true  },\n      { message { name: \"Sub\" } }\n    ]\n  };\n  string id = 1;\n  string name = 3 [(grpc.federation.field).custom_resolver = true];\n}\n\nmessage UserID {\n  option (grpc.federation.message) = {\n    def { message { name: \"Sub\" } }\n  };\n\n  string value = 1 [(grpc.federation.field).by = \"'xxx'\"];\n}\n\nmessage Sub {\n  option (grpc.federation.message).custom_resolver = true;\n}\n"
  },
  {
    "path": "testdata/nested_post.proto",
    "content": "syntax = \"proto3\";\n\npackage org.post;\n\noption go_package = \"example/post;post\";\n\nservice PostService {\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n  oneof condition {\n    PostConditionA a = 2;\n    PostConditionB b = 3;\n  }\n}\n\nmessage GetPostResponse {\n  Post post = 1;\n}\n\nmessage Post {\n  string id = 1;\n  PostData data = 2;\n}\n\nenum PostDataType {\n  POST_TYPE_A = 0;\n  POST_TYPE_B = 1;\n  POST_TYPE_C = 2;\n}\n  \nmessage PostData {\n  PostDataType type = 1;\n  string title = 2;\n  PostContent content = 3;\n}\n  \nmessage PostContent {\n  enum Category {\n    CATEGORY_A = 0;\n    CATEGORY_B = 1;\n  }\n  Category category = 1;\n  string head = 2;\n  string body = 3;\n  map<int32, int32> counts = 5;\n  map<int64, int64> cast_counts = 6;\n}\n\nmessage PostConditionA {\n  string prop = 1;\n}\n\nmessage PostConditionB {}\n"
  },
  {
    "path": "testdata/oneof.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\noption (grpc.federation.file)= {\n  import: [\"user.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc Get(GetRequest) returns (GetResponse) {};\n}\n\nmessage GetRequest {}\n\nmessage GetResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"sel\"\n      message {\n        name: \"UserSelection\"\n        args { name: \"value\", by: \"'foo'\" }\n      }\n    }\n  };\n  User user = 1 [(grpc.federation.field).by = \"sel.user\"];\n}\n\nmessage UserSelection {\n  option (grpc.federation.message) = {\n    def {\n      name: \"m\"\n      message { name: \"M\" }\n    }\n  };\n  oneof user {\n    User user_a = 1 [\n      (grpc.federation.field).oneof = {\n        if: \"m.value == $.value\"\n        def {\n          name: \"ua\"\n          message {\n            name: \"User\"\n            args { name: \"user_id\", by: \"'a'\" }\n          }\n        }\n        by: \"ua\"\n      }\n    ];\n\n    User user_b = 2 [\n      (grpc.federation.field).oneof = {\n        if: \"m.value != $.value\"\n        def {\n          name: \"ub\"\n          message {\n            name: \"User\"\n            args { name: \"user_id\", by: \"'b'\" }\n          }\n        }\n        by: \"ub\"\n      }\n    ];\n\n    User user_c = 3 [\n      (grpc.federation.field).oneof = {\n        default: true\n        def {\n          name: \"uc\"\n          message {\n            name: \"User\"\n            args { name: \"user_id\", by: \"$.value\" }\n          }\n        }\n        by: \"uc\"\n      }\n    ];\n\n  }\n}\n\nmessage M {\n  string value = 1 [(grpc.federation.field).by = \"'foo'\"];\n}\n\nmessage User {\n  option (grpc.federation.message) = {\n    def {\n      call {\n        method: \"org.user.UserService/GetUser\"\n        request [\n          { field: \"id\", by: \"$.user_id\" },\n          { field: \"foo\" by: \"1\" if: \"false\" },\n          { field: \"bar\" by: \"'hello'\" if: \"true\" }\n        ]\n      }\n    }\n  };\n\n  string id = 1 [(grpc.federation.field).by = \"$.user_id\"];\n}\n"
  },
  {
    "path": "testdata/post.proto",
    "content": "syntax = \"proto3\";\n\npackage org.post;\n\noption go_package = \"example/post;post\";\n\nservice PostService {\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n  rpc GetPosts(GetPostsRequest) returns (GetPostsResponse) {};\n  rpc CreatePost(CreatePostRequest) returns (CreatePostResponse) {};\n  rpc UpdatePost(UpdatePostRequest) returns (UpdatePostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  Post post = 1;\n}\n\nmessage GetPostsRequest {\n  repeated string ids = 1;\n}\n\nmessage GetPostsResponse {\n  repeated Post posts = 1;\n}\n\nmessage CreatePostRequest {\n  CreatePost post = 1;\n}\n\nmessage CreatePostResponse {\n  Post post = 1;\n}\n\nenum PostType {\n  POST_TYPE_UNKNOWN = 0;\n  POST_TYPE_A = 1;\n  POST_TYPE_B = 2;\n}\n\nmessage CreatePost {\n  string title = 1;\n  string content = 2;\n  string user_id = 3;\n  PostType type = 4;\n  int32 post_type = 5;\n}\n\nmessage Post {\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  string user_id = 4;\n}\n\nmessage UpdatePostRequest {\n  string id = 1;\n}\n\nmessage UpdatePostResponse {\n}"
  },
  {
    "path": "testdata/post_v2.proto",
    "content": "syntax = \"proto3\";\n\npackage org.post.v2;\n\noption go_package = \"example/post/v2;post\";\n\nservice PostService {\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  Post post = 1;\n}\n\nmessage Post {\n  string id = 1;\n  PostData data = 2;\n}\n\nenum PostDataType {\n  POST_TYPE_A = 0;\n  POST_V2_TYPE_B = 1;\n  POST_V2_TYPE_C = 2;\n}\n\nmessage PostData {\n  PostDataType type = 1;\n  string title = 2;\n  PostContent content = 3;\n}\n\nmessage PostContent {\n  enum Category {\n    CATEGORY_A = 0;\n    CATEGORY_B = 1;\n  }\n  Category category = 1;\n  string head = 2;\n  string body = 3;\n}\n"
  },
  {
    "path": "testdata/post_v2_extra.proto",
    "content": "syntax = \"proto3\";\n\npackage org.post.v2;\n\noption go_package = \"example/post/v2;post\";\n\n// This enum is defined in a separate proto file within the same v2 package.\n// It tests that the code generator correctly handles multiple GoPackage pointers\n// for the same import path when generating import aliases.\nenum ExtraType {\n  EXTRA_TYPE_UNKNOWN = 0;\n  EXTRA_TYPE_A = 1;\n  EXTRA_TYPE_B = 2;\n}\n"
  },
  {
    "path": "testdata/ref_env.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\nimport \"google/protobuf/duration.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice RefEnvService {\n  option (grpc.federation.service) = {\n    env { message: \"Env\" }\n    var { name: \"constant\" message { name: \"Constant\" } }\n  };\n}\n  \nmessage Env {\n  string aaa = 1 [(grpc.federation.field).env.default = \"xxx\"];\n  repeated int64 bbb = 2 [(grpc.federation.field).env.alternate = \"yyy\"];\n  map<string, google.protobuf.Duration> ccc = 3 [(grpc.federation.field).env = {\n    required: true\n    alternate: \"c\"\n  }];\n  double ddd = 4 [(grpc.federation.field).env.ignored = true];\n}\n\nmessage Constant {\n  string x = 1 [(grpc.federation.field).by = \"grpc.federation.env.aaa + 'xxx'\"];\n}"
  },
  {
    "path": "testdata/resolver_overlaps.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\noption (grpc.federation.file)= {\n  import: [\"nested_post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost1(GetPostRequest) returns (GetPostResponse1) {};\n  rpc GetPost2(GetPostRequest) returns (GetPostResponse2) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse1 {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message { name: \"Post\" args { name: \"id\" by: \"$.id\" } }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage GetPostResponse2 {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message { name: \"Post\" args { name: \"id\" by: \"$.id\" } }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"org.post.PostService/GetPost\"\n        request { field: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  string id = 1 [(grpc.federation.field).by = \"res.post.id\"];\n}\n"
  },
  {
    "path": "testdata/simple_aggregation.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"google/protobuf/any.proto\";\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\noption (grpc.federation.file)= {\n  import: [\"post.proto\", \"user.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {\n    option (grpc.federation.method).timeout = \"1m\";\n  };\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n    def { name: \"uuid\" by: \"grpc.federation.uuid.newRandom()\" }\n    def { name: \"map_value\" by: \"{1:'a', 2:'b', 3:'c'}\" }\n    def { name: \"e\" enum { name: \"Item.ItemType\" by: \"org.user.Item.ItemType.value('ITEM_TYPE_2')\" }}\n    def { name: \"id\" by: \"100\" }\n  };\n  org.federation.Post post = 1 [(grpc.federation.field).by = \"post\"];\n  string const = 2 [(grpc.federation.field).by = \"'foo'\"];\n  string uuid = 3 [(grpc.federation.field).by = \"uuid.string()\"];\n  string enum_name = 4 [(grpc.federation.field).by = \"org.federation.Item.ItemType.name(org.federation.Item.ItemType.ITEM_TYPE_1)\"];\n  int32 enum_value = 5 [(grpc.federation.field).by = \"org.federation.Item.ItemType.value('ITEM_TYPE_1')\"];\n  map<int32, string> map_value = 6 [(grpc.federation.field).by = \"map_value\"];\n  Item.ItemType item_type = 7 [(grpc.federation.field).by = \"e\"];\n  string item_type_text = 8 [(grpc.federation.field).by = \"Item.ItemType.attr(e, 'en')\"];\n  int64 different_type_id = 9 [(grpc.federation.field).by = \"id\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def [\n      {\n         name: \"res\"\n         call {\n          method: \"org.post.PostService/GetPost\"\n          request { field: \"id\" by: \"$.id\" }\n          timeout: \"10s\"\n          retry {\n            constant {\n              interval: \"2s\"\n              max_retries: 3\n            }\n          }\n         }\n      },\n      { name: \"post\" by: \"res.post\" autobind: true },\n      { name: \"user\" message { name: \"User\" args { inline: \"post\" } } },\n      { name: \"z\" message { name: \"Z\" } },\n      {\n        name: \"m\"\n        message {\n          name: \"M\"\n          args [\n            { name: \"x\" by: \"10\" },\n            { name: \"y\" by: \"1\" }\n          ]\n        }\n        autobind: true\n      }\n    ]\n  };\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  User user = 4 [(grpc.federation.field).by = \"user\"];\n  string foo = 5;\n  int64 bar = 6;\n}\n\nenum UserType {\n  option (grpc.federation.enum).alias = \"org.user.UserType\";\n\n  USER_TYPE_1 = 0;\n  USER_TYPE_2 = 1;\n}\n\nmessage User {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"org.user.UserService/GetUser\"\n        request { field: \"id\" by: \"$.user_id\" }\n        timeout: \"20s\"\n        retry {\n          if: \"error.code != google.rpc.Code.UNIMPLEMENTED\"\n          exponential {\n            initial_interval: \"1s\"\n            randomization_factor: 0.7\n            multiplier: 1.7\n            max_interval: \"30s\"\n            max_retries: 3\n          }\n        }\n      }\n    }\n    def { name: \"user\" by: \"res.user\" autobind: true }\n    def {\n      message {\n        name: \"M\"\n        args [\n          { name: \"x\" by: \"uint(2)\" },\n          { name: \"y\" by: \"org.user.Item.ItemType.value('ITEM_TYPE_2')\" }\n        ]\n      }\n    }\n  };\n  string id = 1;\n  UserType type = 2;\n  string name = 3;\n  uint64 age = 4 [(grpc.federation.field).custom_resolver = true];\n  repeated string desc = 5;\n  Item main_item = 6;\n  repeated Item items = 7;\n  map<string,google.protobuf.Any> profile = 8;\n  oneof attr {\n    AttrA attr_a = 9;\n    AttrB b = 10;\n  }\n  message AttrA {\n    option (grpc.federation.message).alias = \"org.user.User.AttrA\";\n    string foo = 1;\n  }\n  message AttrB {\n    option (grpc.federation.message).alias = \"org.user.User.AttrB\";\n    bool bar = 2;\n  }\n}\n\nmessage Item {\n  option (grpc.federation.message).alias = \"org.user.Item\";\n\n  enum ItemType {\n    option (grpc.federation.enum).alias = \"org.user.Item.ItemType\";\n\n    ITEM_TYPE_1 = 0 [(grpc.federation.enum_value) = {\n      attr {\n        name: \"en\"\n        value: \"item type 1\"\n      }\n    }];\n    ITEM_TYPE_2 = 1 [(grpc.federation.enum_value) = {\n      attr {\n        name: \"en\"\n        value: \"item type 2\"\n      }\n    }];\n    ITEM_TYPE_3 = 2 [(grpc.federation.enum_value) = {\n      attr {\n        name: \"en\"\n        value: \"item type 3\"\n      }\n    }];\n  };\n\n  string name = 1;\n  ItemType type = 2;\n  uint32 value = 3;\n}\n\nmessage Z {\n  option (grpc.federation.message).custom_resolver = true;\n\n  string foo = 1;\n}\n\nmessage M {\n  string foo = 1 [(grpc.federation.field).by = \"'foo'\"];\n  int64 bar = 2 [(grpc.federation.field).by = \"1\"];\n}\n\nmessage N {\n  option (grpc.federation.message) = {\n    def { by: \"$.foo\" }\n  };\n\n  string foo = 1 [(grpc.federation.field).by = \"$.foo\"];\n}"
  },
  {
    "path": "testdata/switch.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (.grpc.federation.message) = {\n    def {\n      name: \"switch\"\n      switch {\n        case {\n          def { name: \"blue\" by: \"73\" }\n          if: \"$.id == 'blue'\" by: \"blue\"\n        }\n        case { if: \"$.id == 'red'\" by: \"2\" }\n        default {\n          def { name: \"default\" by: \"3\" }\n          by: \"default\"\n        }\n      }\n    }\n  };\n  int64 switch = 1 [(grpc.federation.field).by = \"switch\"];\n}"
  },
  {
    "path": "testdata/user.proto",
    "content": "syntax = \"proto3\";\n\nimport \"google/protobuf/any.proto\";\n\npackage org.user;\n\noption go_package = \"example/user;user\";\n\nservice UserService {\n  rpc GetUser(GetUserRequest) returns (GetUserResponse) {};\n  rpc GetUsers(GetUsersRequest) returns (GetUsersResponse) {};\n}\n\nmessage GetUserRequest {\n  string id = 1;\n  oneof foobar {\n    int64 foo = 2;\n    string bar = 3;\n  }\n}\n\nmessage GetUserResponse {\n  User user = 1;\n}\n\nmessage GetUsersRequest {\n  repeated string ids = 1;\n}\n\nmessage GetUsersResponse {\n  repeated User users = 1;\n}\n\nenum UserType {\n  USER_TYPE_1 = 0;\n  USER_TYPE_2 = 1;\n}\n\nmessage User {\n  string id = 1;\n  UserType type = 2;\n  string name = 3;\n  int64 age = 4;\n  repeated string desc = 5;\n  Item main_item = 6;\n  repeated Item items = 7;\n  map<string,google.protobuf.Any> profile = 8;\n  oneof attr {\n    AttrA attr_a = 9;\n    AttrB b = 10;\n  }\n  message AttrA {\n    string foo = 1;\n  }\n  message AttrB {\n    bool bar = 2;\n  }\n}\n\nmessage Item {\n  enum ItemType {\n    ITEM_TYPE_1 = 0;\n    ITEM_TYPE_2 = 1;\n    ITEM_TYPE_3 = 2;\n  };\n  string name = 1;\n  ItemType type = 2;\n  int64 value = 3;\n}\n"
  },
  {
    "path": "testdata/validation.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"google/protobuf/any.proto\";\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def [\n      { name: \"post\" message { name: \"Post\" } },\n      {\n        validation {\n          error {\n            code: FAILED_PRECONDITION\n            message: \"'validation message 1'\"\n            def { name: \"a\" by: \"73\" }\n            if: \"post.id != 'some-id'\"\n          }\n        }\n      },\n      {\n        validation {\n          error {\n            log_level: WARN\n            code: FAILED_PRECONDITION\n            message: \"'validation message 2'\"\n            details {\n              def { name: \"b\" by: \"'mackerel'\" }\n              if: \"post.title != 'some-title'\"\n              message: [\n                {\n                  name: \"CustomMessage\",\n                  args: {\n                    name: \"message\",\n                    by: \"'message1'\"\n                  }\n                },\n                {\n                  name: \"CustomMessage\",\n                  args: {\n                    name: \"message\",\n                    by: \"'message2'\"\n                  }\n                }\n              ]\n              precondition_failure {\n                violations {\n                  type: \"'some-type'\"\n                  subject: \"'some-subject'\"\n                  description: \"'some-description'\"\n                }\n              }\n              bad_request {\n                field_violations {\n                  field: \"'some-field'\"\n                  description: \"'some-description'\"\n                }\n              }\n              localized_message {\n                locale: \"en-US\"\n                message: \"'some-message'\"\n              }\n            }\n          }\n        }\n      }\n    ]\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  string id = 1 [(grpc.federation.field).by = \"'some-id'\"];\n  string title = 2 [(grpc.federation.field).by = \"'some-title'\"];\n  string content = 3 [(grpc.federation.field).by = \"'some-content'\"];\n}\n\nmessage CustomMessage {\n  string message = 1 [(grpc.federation.field).by = \"$.message\"];\n}\n"
  },
  {
    "path": "types/types.go",
    "content": "package types\n\nimport \"google.golang.org/protobuf/types/descriptorpb\"\n\ntype Kind int\n\nvar (\n\tUnknown  Kind = -1\n\tDouble        = Kind(descriptorpb.FieldDescriptorProto_TYPE_DOUBLE)\n\tFloat         = Kind(descriptorpb.FieldDescriptorProto_TYPE_FLOAT)\n\tInt64         = Kind(descriptorpb.FieldDescriptorProto_TYPE_INT64)\n\tUint64        = Kind(descriptorpb.FieldDescriptorProto_TYPE_UINT64)\n\tInt32         = Kind(descriptorpb.FieldDescriptorProto_TYPE_INT32)\n\tFixed64       = Kind(descriptorpb.FieldDescriptorProto_TYPE_FIXED64)\n\tFixed32       = Kind(descriptorpb.FieldDescriptorProto_TYPE_FIXED32)\n\tBool          = Kind(descriptorpb.FieldDescriptorProto_TYPE_BOOL)\n\tString        = Kind(descriptorpb.FieldDescriptorProto_TYPE_STRING)\n\tGroup         = Kind(descriptorpb.FieldDescriptorProto_TYPE_GROUP)\n\tMessage       = Kind(descriptorpb.FieldDescriptorProto_TYPE_MESSAGE)\n\tBytes         = Kind(descriptorpb.FieldDescriptorProto_TYPE_BYTES)\n\tUint32        = Kind(descriptorpb.FieldDescriptorProto_TYPE_UINT32)\n\tEnum          = Kind(descriptorpb.FieldDescriptorProto_TYPE_ENUM)\n\tSfixed32      = Kind(descriptorpb.FieldDescriptorProto_TYPE_SFIXED32)\n\tSfixed64      = Kind(descriptorpb.FieldDescriptorProto_TYPE_SFIXED64)\n\tSint32        = Kind(descriptorpb.FieldDescriptorProto_TYPE_SINT32)\n\tSint64        = Kind(descriptorpb.FieldDescriptorProto_TYPE_SINT64)\n)\n\nfunc (k Kind) IsInt() bool {\n\tswitch k {\n\tcase Int64, Int32, Sfixed32, Sfixed64, Sint32, Sint64:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (k Kind) IsUint() bool {\n\tswitch k {\n\tcase Uint64, Uint32, Fixed32, Fixed64:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (k Kind) IsFloat() bool {\n\tswitch k {\n\tcase Double, Float:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (k Kind) ToString() string {\n\tswitch k {\n\tcase Double:\n\t\treturn \"double\"\n\tcase Float:\n\t\treturn \"float\"\n\tcase Int64:\n\t\treturn \"int64\"\n\tcase Uint64:\n\t\treturn \"uint64\"\n\tcase Int32:\n\t\treturn \"int32\"\n\tcase Fixed64:\n\t\treturn \"fixed64\"\n\tcase Fixed32:\n\t\treturn \"fixed32\"\n\tcase Bool:\n\t\treturn \"bool\"\n\tcase String:\n\t\treturn \"string\"\n\tcase Group:\n\t\treturn \"group\"\n\tcase Message:\n\t\treturn \"message\"\n\tcase Bytes:\n\t\treturn \"bytes\"\n\tcase Uint32:\n\t\treturn \"uint32\"\n\tcase Enum:\n\t\treturn \"enum\"\n\tcase Sfixed32:\n\t\treturn \"sfixed32\"\n\tcase Sfixed64:\n\t\treturn \"sfixed64\"\n\tcase Sint32:\n\t\treturn \"sint32\"\n\tcase Sint64:\n\t\treturn \"sint64\"\n\t}\n\treturn \"null\"\n}\n\nfunc ToKind(s string) Kind {\n\tswitch s {\n\tcase \"double\":\n\t\treturn Double\n\tcase \"float\":\n\t\treturn Float\n\tcase \"int64\":\n\t\treturn Int64\n\tcase \"uint64\":\n\t\treturn Uint64\n\tcase \"int32\":\n\t\treturn Int32\n\tcase \"fixed64\":\n\t\treturn Fixed64\n\tcase \"fixed32\":\n\t\treturn Fixed32\n\tcase \"bool\":\n\t\treturn Bool\n\tcase \"string\":\n\t\treturn String\n\tcase \"group\":\n\t\treturn Group\n\tcase \"bytes\":\n\t\treturn Bytes\n\tcase \"uint32\":\n\t\treturn Uint32\n\tcase \"sfixed32\":\n\t\treturn Sfixed32\n\tcase \"sfixed64\":\n\t\treturn Sfixed64\n\tcase \"sint32\":\n\t\treturn Sint32\n\tcase \"sint64\":\n\t\treturn Sint64\n\t}\n\treturn Unknown\n}\n"
  },
  {
    "path": "util/name.go",
    "content": "package util\n\nimport (\n\t\"strings\"\n\n\t_ \"unsafe\"\n)\n\n//go:linkname GoCamelCase google.golang.org/protobuf/internal/strs.GoCamelCase\nfunc GoCamelCase(string) string\n\nfunc ToPublicGoVariable(name string) string {\n\treturn ToPublicVariable(ToGoVariable(name))\n}\n\nfunc ToPrivateGoVariable(name string) string {\n\treturn ToPrivateVariable(ToGoVariable(name))\n}\n\nfunc ToGoVariable(v string) string {\n\treturn GoCamelCase(v)\n}\n\nfunc ToPublicVariable(name string) string {\n\tif len(name) <= 1 {\n\t\treturn strings.ToUpper(name)\n\t}\n\treturn strings.ToUpper(string(name[0])) + name[1:]\n}\n\nfunc ToPrivateVariable(name string) string {\n\tif len(name) <= 1 {\n\t\treturn strings.ToLower(name)\n\t}\n\treturn strings.ToLower(string(name[0])) + name[1:]\n}\n"
  },
  {
    "path": "validator/testdata/conflict_service_variable.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FooService {\n  option (grpc.federation.service) = {\n    var {\n      name: \"foo\"\n      by: \"1\"\n    }\n    var {\n      name: \"bar\"\n      by: \"2\"\n    }\n  };\n  rpc Get(GetRequest) returns (GetResponse) {};\n}\n\nservice BarService {\n  option (grpc.federation.service) = {\n    var {\n      name: \"foo\"\n      by: \"1\"\n    }\n    var {\n      name: \"bar\"\n      by: \"'hello'\"\n    }\n    var {\n      name: \"baz\"\n      by: \"2\"\n    }\n  };\n  rpc Get(GetRequest) returns (GetResponse) {};\n}\n\nmessage GetRequest {\n}\n\nmessage GetResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"foo\"\n      by: \"grpc.federation.var.foo\"\n    }\n    def {\n      name: \"bar\"\n      by: \"grpc.federation.var.bar\"\n    }\n    def {\n      name: \"baz\"\n      by: \"grpc.federation.var.baz\"\n    }\n  };\n}"
  },
  {
    "path": "validator/testdata/conflict_switch_case_variable.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (.grpc.federation.message) = {\n    def { name: \"a\" by: \"20\" }\n    def {\n      name: \"switch\"\n      switch {\n        case {\n          def { name: \"a\" by: \"1\" }\n          if: \"$.id == 'blue'\"\n          by: \"1\"\n        }\n        case { if: \"$.id == 'red'\" by: \"2\" }\n        default { by: \"3\" }\n      }\n    }\n  };\n}"
  },
  {
    "path": "validator/testdata/conflict_switch_default_variable.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (.grpc.federation.message) = {\n    def { name: \"a\" by: \"20\" }\n    def {\n      name: \"switch\"\n      switch {\n        case { if: \"$.id == 'blue'\" by: \"1\" }\n        case { if: \"$.id == 'red'\" by: \"2\" }\n        default {\n          def { name: \"a\" by: \"1\" }\n          by: \"3\"\n        }\n      }\n    }\n  };\n}"
  },
  {
    "path": "validator/testdata/different_message_argument_type.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc Get(GetRequest) returns (GetResponse) {};\n}\n\nmessage GetRequest {\n}\n\nmessage GetResponse {\n  option (grpc.federation.message) = {\n    def {\n      message {\n        name: \"Foo\"\n        args { name: \"id\" by: \"'foo'\" }\n      }\n    }\n    def {\n      message {\n        name: \"Foo\"\n        args { name: \"id\" by: \"1\" }\n      }\n    }\n  };\n}\n\nmessage Foo {\n  string id = 1 [(grpc.federation.field).by = \"$.id\"];\n}"
  },
  {
    "path": "validator/testdata/duplicated_variable_name.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"echo.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc Get(GetRequest) returns (GetResponse) {};\n}\n\nmessage GetRequest {}\n\nmessage GetResponse {\n  option (grpc.federation.message) = {\n    def [\n      { name: \"a\" by: \"0\" },\n      {\n        validation {\n          name: \"a\"\n          error {\n            def { name: \"a\" by: \"1\" }\n            details {\n              def { name: \"a\" by: \"2\" }\n            }\n          }\n        }\n      },\n      {\n        call {\n          method: \"echo.EchoService/Echo\"\n          error {\n            def { name: \"a\" by: \"3\" }\n            details {\n              def { name: \"a\" by: \"4\" }\n            }\n          }\n        }\n      }\n    ]\n  };\n  oneof o {\n    string foo = 1 [(grpc.federation.field).oneof = {\n      default: true\n      def { name: \"a\" by: \"5\" }\n      by: \"'foo'\"\n    }];\n  }\n}"
  },
  {
    "path": "validator/testdata/echo.proto",
    "content": "syntax = \"proto3\";\n\npackage echo;\n\noption go_package = \"example/echo;echo\";\n\nservice EchoService {\n  rpc Echo(EchoRequest) returns (EchoResponse) {};\n}\n\nmessage EchoRequest {\n  string id = 1;\n  string body = 2;\n}\n\nmessage EchoResponse {\n  string id = 1;\n  string body = 2;\n}\n"
  },
  {
    "path": "validator/testdata/empty_response_field.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"echo.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc Echo(EchoRequest) returns (EchoResponse) {};\n}\n\nmessage EchoRequest {\n  string id = 1;\n  string body = 2;\n}\n\nmessage EchoResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"echo\"\n      call {\n        method: \"echo.EchoService/Echo\"\n        request: [\n          { field: \"id\", by: \"$.id\" },\n          { field: \"body\", by: \"$.body\" }\n        ]\n      }\n      autobind: true\n    }\n  };\n  string id = 1;\n  string body = 2;\n}\n"
  },
  {
    "path": "validator/testdata/invalid_autobind.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc Get(GetRequest) returns (GetResponse) {};\n}\n\nmessage GetRequest {}\n\nmessage GetResponse {\n  option (grpc.federation.message) = {\n    def [\n      { name: \"a\", message { name: \"A\" }, autobind: true },\n      { name: \"b\", message { name: \"B\" }, autobind: true }\n    ]\n  };\n  string id = 1;\n  string name = 2;\n}\n\nmessage A {\n  string id = 1 [(grpc.federation.field).by = \"'a-id'\"];\n  string name = 2 [(grpc.federation.field).by = \"'a-name'\"];\n}\n\nmessage B {\n  string id = 1 [(grpc.federation.field).by = \"'b-id'\"];\n}\n"
  },
  {
    "path": "validator/testdata/invalid_call_error_handler.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  org.federation.Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"res\"\n        call {\n          method: \"post.PostService/GetPost\"\n          request { field: \"id\" by: \"$.id\" }\n          error {\n            if: \"false\"\n            ignore: true\n            ignore_and_response: \"post.GetPostResponse{}\"\n          }\n          error {\n            details {\n              by: \"1\"\n            }\n          }\n          error {\n            ignore_and_response: \"10\"\n          }\n        }\n      },\n      { name: \"post\" by: \"res.post\" autobind: true }\n    ]\n  };\n  string id = 1;\n  string title = 2;\n}\n"
  },
  {
    "path": "validator/testdata/invalid_call_metadata.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n       call {\n        method: \"post.PostService/GetPost\"\n        metadata: \"{'foo': 'bar'}\"\n        request { field: \"id\" by: \"$.id\" }\n      }\n    }\n  };\n}"
  },
  {
    "path": "validator/testdata/invalid_call_option.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def { name: \"tlr\" by: \"[1, 2, 3]\" }\n    def {\n       call {\n        method: \"post.PostService/GetPost\"\n        request { field: \"id\" by: \"$.id\" }\n        option {\n          header: \"hdr\"\n          trailer: \"tlr\"\n        }\n      }\n    }\n  };\n}"
  },
  {
    "path": "validator/testdata/invalid_condition_type.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n    \nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def [\n      {\n        if: \"$.id\"\n        name: \"res\"\n        call {\n          method: \"post.PostService/GetPost\"\n          request { field: \"id\" by: \"$.id\" }\n         }\n      }\n    ]\n  };\n  string id = 1 [(grpc.federation.field).by = \"$.id\"];\n}\n"
  },
  {
    "path": "validator/testdata/invalid_enum_alias_target.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"nested_post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"org.post.PostService/GetPost\"\n        request { field: \"id\", by: \"$.id\" }\n      }\n    }\n    def { name: \"post\", by: \"res.post\", autobind: true  }\n  };\n  string id = 1;\n  PostData data = 4;\n}\n\nenum PostType {\n  option (grpc.federation.enum).alias = \"org.post.FakePostDataType\";\n\n  POST_TYPE_UNKNOWN = 0 [(grpc.federation.enum_value).default = true];\n  POST_TYPE_FOO = 1 [(grpc.federation.enum_value) = { alias: [\"FAKE_POST_TYPE_A\"] }];\n  POST_TYPE_BAR = 2 [(grpc.federation.enum_value) = { alias: [\"FAKE_POST_TYPE_B\", \"FAKE_POST_TYPE_C\"] }];\n}\n\nmessage PostData {\n  option (grpc.federation.message).alias = \"org.post.PostData\";\n\n  PostType type = 1;\n  string title = 2;\n  PostContent content = 3;\n}\n\nmessage PostContent {\n  option (grpc.federation.message).alias = \"org.post.PostContent\";\n\n  enum Category {\n    option (grpc.federation.enum).alias = \"org.post.FakePostContent.FakeCategory\";\n  \n    CATEGORY_A = 0;\n    CATEGORY_B = 1;\n  };\n\n  Category category = 1;\n  string head = 2;\n  string body = 3;\n  string dup_body = 4 [(grpc.federation.field).alias = \"body\"];\n  map<int32, int32> counts = 5;\n}\n"
  },
  {
    "path": "validator/testdata/invalid_enum_attribute.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {};\n}\n\nenum Type {\n  TYPE_UNKNOWN = 0 [(grpc.federation.enum_value) = {\n    attr {\n      name: \"\"\n    }\n  }];\n  TYPE_FOO = 1 [(grpc.federation.enum_value) = {\n    attr {\n      name: \"xxx\"\n      value: \"foo\"\n    }\n  }];\n  TYPE_BAR = 2 [(grpc.federation.enum_value) = {\n    attr {\n      name: \"yyy\"\n      value: \"bar\"\n    }\n  }];\n}\n"
  },
  {
    "path": "validator/testdata/invalid_enum_conversion.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"nested_post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"e\"\n      enum {\n        name: \"PostType\"\n        by: \"org.post.PostContent.Category.value('CATEGORY_B')\"\n      }\n    }\n    def {\n      enum {\n        name: \"PostType\"\n        by: \"1\"\n      }\n    }\n    def {\n      name: \"post_types\"\n      by: \"[org.post.PostContent.Category.value('CATEGORY_A'), org.post.PostContent.Category.value('CATEGORY_B')]\"\n    }\n    def {\n      name: \"types\"\n      map {\n        iterator {\n          name: \"typ\"\n          src: \"post_types\"\n        }\n        enum {\n          name: \"PostType\"\n          by: \"typ\"\n        }\n      }\n    }\n  };\n}\n\nenum PostType {\n  option (grpc.federation.enum).alias = \"org.post.FakePostDataType\";\n\n  POST_TYPE_UNKNOWN = 0 [(grpc.federation.enum_value).default = true];\n  POST_TYPE_FOO = 1 [(grpc.federation.enum_value) = { alias: [\"FAKE_POST_TYPE_A\"] }];\n  POST_TYPE_BAR = 2 [(grpc.federation.enum_value) = { alias: [\"FAKE_POST_TYPE_B\", \"FAKE_POST_TYPE_C\"] }];\n}\n"
  },
  {
    "path": "validator/testdata/invalid_enum_selector.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"nested_post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def { by: \"grpc.federation.enum.select(true, org.post.PostDataType.POST_TYPE_B, 'foo')\" }\n  };\n\n  PostDataType type = 1 [(grpc.federation.field).by = \"grpc.federation.enum.select(true, org.post.PostDataType.value('POST_TYPE_B'), org.post.PostContent.Category.value('CATEGORY_A'))\"];\n}\n\nenum PostDataType {\n  option (grpc.federation.enum) = {\n    alias: [\n      \"org.post.PostDataType\",\n      \"org.post.FakePostDataType\"\n    ]\n  };\n\n  POST_TYPE_A = 0 [(grpc.federation.enum_value) = {\n    alias: [\n      \"org.post.PostDataType.POST_TYPE_A\",\n      \"org.post.FakePostDataType.FAKE_POST_TYPE_A\"\n    ]\n  }];\n  POST_TYPE_B = 1 [(grpc.federation.enum_value) = {\n    alias: [\n      \"org.post.PostDataType.POST_TYPE_B\",\n      \"org.post.FakePostDataType.FAKE_POST_TYPE_B\"\n    ]\n  }];\n  POST_TYPE_C = 2 [(grpc.federation.enum_value) = {\n    alias: [\n      \"org.post.PostDataType.POST_TYPE_C\",\n      \"org.post.FakePostDataType.FAKE_POST_TYPE_C\"\n    ]\n  }];\n}"
  },
  {
    "path": "validator/testdata/invalid_enum_value_noalias.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"nested_post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"org.post.PostService/GetPost\"\n        request { field: \"id\", by: \"$.id\" }\n      }\n    }\n    def { name: \"post\", by: \"res.post\", autobind: true  }\n  };\n  string id = 1;\n  PostData data = 4;\n}\n\nenum PostType {\n  option (grpc.federation.enum).alias = \"org.post.PostDataType\";\n\n  POST_TYPE_A = 0 [(grpc.federation.enum_value) = { default: true, noalias: true }];\n  POST_TYPE_B = 1 [(grpc.federation.enum_value) = { noalias: true, alias: [\"POST_TYPE_B\"] }];\n}\n\nmessage PostData {\n  option (grpc.federation.message).alias = \"org.post.PostData\";\n\n  PostType type = 1;\n  string title = 2;\n}\n"
  },
  {
    "path": "validator/testdata/invalid_env.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice AService {\n  option (grpc.federation.service) = {\n    env {\n      message: \"Env\"\n      var {\n        name: \"foo\"\n        type { kind: STRING }\n      }\n    }\n  };\n}\n\nservice BService {\n  option (grpc.federation.service) = {\n    env {\n      message: \"Invalid\"\n    }\n  };\n}\n\nmessage Env {\n  string foo = 1;\n}"
  },
  {
    "path": "validator/testdata/invalid_error_variable.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def { name: \"error\" by: \"'foo'\" }\n    def { name: \"e\" by: \"error\" }\n    def {\n      validation {\n        error {\n          if: \"error.code == 0\"\n        }\n      }\n    }\n  };\n  string id = 1 [(grpc.federation.field).by = \"'foo'\"];\n}\n"
  },
  {
    "path": "validator/testdata/invalid_field_option.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field) = { by: \"post.invalid\" }];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"post.PostService/GetPost\"\n        request { field: \"id\", by: \"$.id\" }\n      }\n    }\n    def { name: \"post\", by: \"res.post\", autobind: true  }\n  };\n  string id = 1;\n  string title = 2;\n  string content = 3;\n}\n"
  },
  {
    "path": "validator/testdata/invalid_field_type.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc Get(GetRequest) returns (GetResponse) {};\n}\n\nmessage GetRequest {\n}\n\nmessage GetResponse {\n  string a = 1 [(grpc.federation.field).by = \"1\"];\n  int32 b = 2 [(grpc.federation.field).by = \"uint(2)\"];\n  uint32 c = 3 [(grpc.federation.field).by = \"int(3)\"];\n}\n"
  },
  {
    "path": "validator/testdata/invalid_field_type_by_switch.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (.grpc.federation.message) = {\n    def {\n      name: \"switch\"\n      switch {\n        case { if: \"$.id == 'blue'\" by: \"1\" }\n        case { if: \"$.id == 'red'\" by: \"2\" }\n        default { by: \"3\" }\n      }\n    }\n  };\n  string switch = 1 [(grpc.federation.field).by = \"switch\"];\n}"
  },
  {
    "path": "validator/testdata/invalid_file_import.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"grpc/federation/federation.proto\";\nimport \"post.proto\";\n\noption go_package = \"example/federation;federation\";\n\noption (grpc.federation.file)= {\n  import: [\n    \"user.proto\"\n  ]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc Get(GetRequest) returns (GetResponse) {};\n}\n\nmessage GetRequest {\n  string id = 1;\n}\n\nmessage GetResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"post.PostService/GetPost\"\n        request { field: \"id\", by: \"$.id\" }\n      }\n    }\n    def { name: \"post\", by: \"res.post\", autobind: true  }\n  };\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  string user_id = 4;\n}\n"
  },
  {
    "path": "validator/testdata/invalid_go_package.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"federation.proto\";\nimport \"post.proto\";\nimport \"user.proto\";\n\noption go_package = \"a;b;c;d\";\n"
  },
  {
    "path": "validator/testdata/invalid_list_sort.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPosts(GetPostsRequest) returns (GetPostsResponse) {};\n}\n\nmessage GetPostsRequest {\n  repeated string ids = 1;\n}\n    \nmessage GetPostsResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"posts\"\n      message {\n        name: \"Posts\"\n        args { name: \"ids\", by: \"$.ids\" }\n      }\n    }\n  };\n  Posts posts = 1 [(grpc.federation.field).by = \"posts\"];\n}\n\nmessage Posts {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"ids\"\n        by: \"$.ids\"\n      },\n      {\n        name: \"users\"\n        map {\n          iterator {\n            name: \"iter\"\n            src: \"ids\"\n          }\n          message {\n            name: \"User\"\n            args { name: \"user_id\", by: \"iter\" }\n          }\n        }\n      }\n    ]\n  };\n  repeated string ids = 1 [(grpc.federation.field).by = \"$.ids.sortAsc(v, v)\"];\n  repeated User users = 2 [(grpc.federation.field).by = \"users.sortAsc(v, v.id)\"];\n  repeated User invalid = 3 [(grpc.federation.field).by = \"users.sortAsc(v, v).sortDesc(v, v).sortStableAsc(v, v).sortStableDesc(v, v)\"];\n}\n\nmessage User {\n  string id = 1 [(grpc.federation.field).by = \"$.user_id\"];\n}\n"
  },
  {
    "path": "validator/testdata/invalid_map_iterator_src.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPosts(GetPostsRequest) returns (GetPostsResponse) {};\n}\n\nmessage GetPostsRequest {\n  repeated string ids = 1;\n}\n    \nmessage GetPostsResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"posts\"\n      message {\n        name: \"Posts\"\n        args { name: \"ids\", by: \"$.ids\" }\n      }\n    }\n  };\n  Posts posts = 1 [(grpc.federation.field).by = \"posts\"];\n}\n\nmessage Posts {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"users\"\n        map {\n          iterator {\n            name: \"iter\"\n            src: \"posts\"\n          }\n          message {\n            name: \"User\"\n            args { name: \"user_id\", by: \"iter.id\" }\n          }\n        }\n      }\n    ]\n  };\n  repeated string ids = 1 [(grpc.federation.field).by = \"$.ids\"];\n  repeated User users = 4 [(grpc.federation.field).by = \"users\"];\n}\n\nmessage User {\n  string id = 1 [(grpc.federation.field).by = \"$.user_id\"];\n}\n"
  },
  {
    "path": "validator/testdata/invalid_map_iterator_src_type.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPosts(GetPostsRequest) returns (GetPostsResponse) {};\n}\n\nmessage GetPostsRequest {\n  repeated string ids = 1;\n}\n    \nmessage GetPostsResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"posts\"\n      message {\n        name: \"Posts\"\n        args { name: \"ids\", by: \"$.ids\" }\n      }\n    }\n  };\n  Posts posts = 1 [(grpc.federation.field).by = \"posts\"];\n}\n\nmessage Posts {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"post_ids\"\n        by: \"'foo'\"\n      },\n      {\n        name: \"users\"\n        map {\n          iterator {\n            name: \"iter\"\n            src: \"post_ids\"\n          }\n          message {\n            name: \"User\"\n            args { name: \"user_id\", by: \"'foo'\" }\n          }\n        }\n      }\n    ]\n  };\n  repeated string ids = 1 [(grpc.federation.field).by = \"$.ids\"];\n  repeated User users = 4 [(grpc.federation.field).by = \"users\"];\n}\n\nmessage User {\n  string id = 1 [(grpc.federation.field).by = \"$.user_id\"];\n}\n"
  },
  {
    "path": "validator/testdata/invalid_message_alias.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"nested_post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"org.post.PostService/GetPost\"\n        request { field: \"id\", by: \"$.id\" }\n      }\n    }\n    def { name: \"post\", by: \"res.post\", autobind: true  }\n  };\n  string id = 1;\n  PostData data = 4;\n}\n\nenum PostType {\n  POST_TYPE_UNKNOWN = 0;\n  POST_TYPE_FOO = 1;\n  POST_TYPE_BAR = 2;\n}\n\nmessage PostData {\n  option (grpc.federation.message).alias = \"invalid.Invalid\";\n \n  PostType type = 1;\n  string title = 2;\n  PostContent content = 3;\n}\n\nmessage PostContent {\n  enum Category {\n    CATEGORY_A = 0;\n    CATEGORY_B = 1;\n  };\n\n  Category category = 1;\n  string head = 2;\n  string body = 3;\n}\n\nmessage User {\n  option (grpc.federation.message).alias = \"SomeUser\";\n\n  string name = 1;\n}\n\nmessage Comment {\n  option (grpc.federation.message).alias = \"google.protobuf.Comment\";\n\n  string body = 1;\n}\n"
  },
  {
    "path": "validator/testdata/invalid_message_alias_target.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"nested_post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"org.post.PostService/GetPost\"\n        request { field: \"id\", by: \"$.id\" }\n      }\n    }\n    def { name: \"post\", by: \"res.post\", autobind: true  }\n  };\n  string id = 1;\n  PostData data = 4;\n}\n\nenum PostType {\n  option (grpc.federation.enum).alias = \"org.post.PostDataType\";\n\n  POST_TYPE_UNKNOWN = 0 [(grpc.federation.enum_value).default = true];\n  POST_TYPE_FOO = 1 [(grpc.federation.enum_value) = { alias: [\"POST_TYPE_A\"] }];\n  POST_TYPE_BAR = 2 [(grpc.federation.enum_value) = { alias: [\"POST_TYPE_B\", \"POST_TYPE_C\"] }];\n}\n\nmessage PostData {\n  option (grpc.federation.message).alias = \"org.post.FakePostData\";\n\n  PostType type = 1;\n  string title = 2;\n  PostContent content = 3;\n}\n\nmessage PostContent {\n  option (grpc.federation.message).alias = \"org.post.PostContent\";\n\n  enum Category {\n    option (grpc.federation.enum).alias = \"org.post.PostContent.Category\";\n  \n    CATEGORY_A = 0;\n    CATEGORY_B = 1;\n  };\n\n  Category category = 1;\n  string head = 2;\n  string body = 3;\n  string dup_body = 4 [(grpc.federation.field).alias = \"body\"];\n  map<int32, int32> counts = 5;\n}\n"
  },
  {
    "path": "validator/testdata/invalid_message_argument.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"post.proto\", \"user.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n  rpc Foo(FooRequest) returns (FooResponse) {}\n  rpc Bar(BarRequest) returns (BarResponse) {}\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n    def {\n      message {\n        name: \"Z\"\n        args [\n          { name: \"x\" by: \"Post{}\" }\n        ]\n      }\n    }\n    def {\n      message {\n        name: \"Z\"\n        args [\n          { name: \"x\" by: \"User{}\" }\n        ]\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Z {\n  option (grpc.federation.message) = {};\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"res\"\n        call {\n          method: \"post.PostService/GetPost\"\n          request { field: \"id\", by: \"$.id\" }\n        }\n      },\n      { name: \"post\", by: \"res.post\", autobind: true },\n      {\n        name: \"user\"\n        message {\n          name: \"User\"\n          args [\n            { by: \"$.id.invalid\" },\n            { inline: \"post.id\" },\n            { by: \"....\" },\n            { inline: \"....\" }\n          ]\n        }\n      }\n    ]\n  };\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  User user = 4 [(grpc.federation.field).by = \"user\"];\n}\n\nmessage User {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"user.UserService/GetUser\"\n        request { field: \"id\", by: \"$.user_id\" }\n      }\n    }\n    def { name: \"user\", by: \"res.user\", autobind: true  }\n  };\n  string id = 1;\n  string name = 2;\n}\n\nmessage FooRequest {}\nmessage FooResponse {\n  option (grpc.federation.message) = {\n    def {\n      message {\n        name: \"M\"\n        args { name: \"x\" by: \"true\" }\n      }\n      autobind: true\n    }\n  };\n  string x = 1;\n}\n\n\nmessage BarRequest {}\nmessage BarResponse {\n  option (grpc.federation.message) = {\n    def {\n      message {\n        name: \"M\"\n        args { name: \"x\" by: \"'foo'\" }\n      }\n      autobind: true\n    }\n  };\n  string x = 1;\n}\n\nmessage M {\n  string x = 1 [(grpc.federation.field).by = \"'hello'\"];\n}"
  },
  {
    "path": "validator/testdata/invalid_message_field_alias.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"nested_post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"org.post.PostService/GetPost\"\n        request { field: \"id\", by: \"$.id\" }\n      }\n    }\n    def { name: \"post\", by: \"res.post\", autobind: true  }\n  };\n  string id = 1;\n  PostData data = 4;\n}\n\nenum PostType {\n  option (grpc.federation.enum).alias = \"org.post.PostDataType\";\n\n  POST_TYPE_UNKNOWN = 0 [(grpc.federation.enum_value).default = true];\n  POST_TYPE_FOO = 1 [(grpc.federation.enum_value) = { alias: [\"POST_TYPE_A\"] }];\n  POST_TYPE_BAR = 2 [(grpc.federation.enum_value) = { alias: [\"POST_TYPE_B\", \"POST_TYPE_C\"] }];\n}\n\nmessage PostData {\n  option (grpc.federation.message).alias = \"org.post.PostData\";\n\n  PostType type = 1;\n  int64 title = 2;\n  PostContent content = 3;\n}\n\nmessage PostData2 {\n  option (grpc.federation.message) = {\n    alias: \"org.post.PostData\"\n    custom_resolver: true\n  };\n\n  PostType type = 1 [(grpc.federation.field).by = \"org.federation.PostType.POST_TYPE_FOO\"];\n  string title = 2;\n  PostContent content = 3;\n}\n\nmessage PostContent {\n  option (grpc.federation.message).alias = \"org.post.PostContent\";\n\n  enum Category {\n    option (grpc.federation.enum).alias = \"org.post.PostContent.Category\";\n  \n    CATEGORY_A = 0;\n    CATEGORY_B = 1;\n  };\n\n  Category category = 1;\n  string head = 2;\n  int64 body = 3;\n  string dup_body = 4 [(grpc.federation.field).alias = \"body\"];\n  map<int32, int32> counts = 5;\n}\n"
  },
  {
    "path": "validator/testdata/invalid_message_map.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  map<int32, int32> ids = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"ids\", by: \"$.ids\" }\n      }\n    }\n    def { name: \"map_value\" by: \"{'a': 'aa', 'b': 'bb', 'c': 'cc'}\" }\n  };\n  map<int32, int32> map_value = 1 [(grpc.federation.field).by = \"map_value\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"res\"\n        call {\n          method: \"post.PostService/GetPostMap\"\n          request { field: \"ids\", by: \"$.ids\" }\n          timeout: \"10s\"\n        }\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "validator/testdata/invalid_message_map_alias.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"federation.proto\";\nimport \"post.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"nested_post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {};\n}\n\nmessage PostContent {\n  option (grpc.federation.message) = { alias: \"org.post.PostContent\" };\n\n  enum Category {\n    option (grpc.federation.enum) = { alias: \"org.post.PostContent.Category\" };\n\n    CATEGORY_A = 0;\n    CATEGORY_B = 1;\n  };\n\n  Category category = 1;\n  string head = 2;\n  string body = 3;\n  map<string, string> counts = 4;\n}\n"
  },
  {
    "path": "validator/testdata/invalid_message_name.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"federation.proto\";\nimport \"user.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"res\"\n        call {\n          method: \"post.PostService/GetPost\"\n          request { field: \"id\", by: \"$.id\" }\n        }\n      },\n      { name: \"post\", by: \"res.post\", autobind: true  },\n      {\n        name: \"user1\"\n        message {\n          name: \"Invalid\"\n          args { inline: \"post\" }\n        }\n      },\n      {\n        name: \"user2\"\n        message {\n          name: \"post.Invalid\"\n          args { inline: \"post\" }\n        }\n      }\n    ]\n  };\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  User user = 4 [(grpc.federation.field).by = \"user1\"];\n}\n\nmessage User {\n  string id = 1 [(grpc.federation.field).by = \"'id'\"];\n  string name = 2 [(grpc.federation.field).by = \"'name'\"];\n}\n"
  },
  {
    "path": "validator/testdata/invalid_method.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"user.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def [\n      { call { method: \"\" } },\n      {\n        name: \"user\"\n        message {\n          name: \"User\"\n          args { inline: \"invalid\" }\n        }\n      }\n    ]\n  };\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  User user = 4 [(grpc.federation.field).by = \"user\"];\n}\n\nmessage User {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"user.UserService/GetUser\"\n        request { field: \"id\", by: \"$.user_id\" }\n      }\n    }\n    def { name: \"user\", by: \"res.user\", autobind: true }\n  };\n  string id = 1;\n  string name = 2;\n}\n"
  },
  {
    "path": "validator/testdata/invalid_method_name.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"post.proto\", \"user.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def [\n      { call { method: \"post.PostService/invalid\" } },\n      {\n        name: \"user\"\n        message {\n          name: \"User\"\n          args { name: \"user_id\", by: \"$.id\" }\n        }\n      }\n    ]\n  };\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  User user = 4 [(grpc.federation.field).by = \"user\"];\n}\n\nmessage User {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"user.UserService/GetUser\"\n        request { field: \"id\", by: \"$.user_id\" }\n      }\n    }\n    def { name: \"user\", by: \"res.user\", autobind: true  }\n  };\n  string id = 1;\n  string name = 2;\n}\n"
  },
  {
    "path": "validator/testdata/invalid_method_request.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"federation.proto\";\nimport \"post.proto\";\nimport \"user.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"post.proto\", \"user.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"res\"\n        call {\n          method: \"post.PostService/GetPost\"\n          request { field: \"invalid\", by: \"$.invalid\" }\n        }\n      },\n      { name: \"post\", by: \"res.post\", autobind: true  },\n      {\n        name: \"user\"\n        message {\n          name: \"User\"\n          args { inline: \"post\" }\n        }\n      }\n    ]\n  };\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  User user = 4 [(grpc.federation.field).by = \"user\"];\n}\n\nmessage User {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"user.UserService/GetUser\"\n        request { field: \"id\", by: \"$.user_id\" }\n      }\n    }\n    def { name: \"user\", by: \"res.user\", autobind: true }\n  };\n  string id = 1;\n  string name = 2;\n}\n"
  },
  {
    "path": "validator/testdata/invalid_method_response.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"post.proto\", \"user.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def [\n      {\n        call {\n          method: \"post.PostService/GetPost\"\n          request { field: \"id\", by: \"$.id\" }\n        }\n      },\n      { name: \"post\", by: \"invalid\", autobind: true  },\n      {\n        name: \"user\"\n        message {\n          name: \"User\"\n          args { inline: \"post\" }\n        }\n      }\n    ]\n  };\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  User user = 4 [(grpc.federation.field).by = \"user\"];\n}\n\nmessage User {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"user.UserService/GetUser\"\n        request { field: \"id\", by: \"$.user_id\" }\n      }\n    }\n    def { name: \"user\", by: \"res.user\", autobind: true  }\n  };\n  string id = 1;\n  string name = 2;\n}\n"
  },
  {
    "path": "validator/testdata/invalid_method_response_option.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"federation.proto\";\nimport \"google/protobuf/empty.proto\";\nimport \"google/protobuf/timestamp.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc UpdatePost(UpdatePostRequest) returns (google.protobuf.Empty) {\n    option (grpc.federation.method).response = \"Invalid\";\n  };\n  rpc DeletePost(DeletePostRequest) returns (google.protobuf.Timestamp) {\n    option (grpc.federation.method).response = \"DeletePostResponse\";\n  };\n}\n\nmessage UpdatePostRequest {}\n\nmessage DeletePostRequest {}\n\nmessage DeletePostResponse {\n  string seconds = 1 [(grpc.federation.field).by = \"'foo'\"];\n}\n"
  },
  {
    "path": "validator/testdata/invalid_method_service_name.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"post.proto\", \"user.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def [\n      { call { method: \"post.InvalidService/method\" } },\n      {\n        name: \"user\"\n        message {\n          name: \"User\"\n          args { name: \"user_id\", by: \"$.id\" }\n        }\n      }\n    ]\n  };\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  User user = 4 [(grpc.federation.field).by = \"user\"];\n}\n\nmessage User {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"user.UserService/GetUser\"\n        request { field: \"id\", by: \"$.user_id\" }\n      }\n    }\n    def { name: \"user\", by: \"res.user\", autobind: true  }\n  };\n  string id = 1;\n  string name = 2;\n}\n"
  },
  {
    "path": "validator/testdata/invalid_method_timeout_format.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {\n    option (grpc.federation.method).timeout = \"1p\";\n  };\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message).custom_resolver = true;\n  Post post = 1;\n}\n\nmessage Post {\n  string id = 1;\n  string title = 2;\n  string content = 3;\n}\n"
  },
  {
    "path": "validator/testdata/invalid_multi_alias.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"nested_post.proto\", \"nested_post2.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"org.post.PostService/GetPost\"\n        request { field: \"id\", by: \"$.id\" }\n      }\n    }\n    def { name: \"post\", by: \"res.post\", autobind: true }\n    def {\n      name: \"res2\"\n      call {\n        method: \"org.post.v2.PostService/GetPost\"\n        request { field: \"id\", by: \"$.id\" }\n      }\n    }\n    def { name: \"data2\", by: \"res2.post.data\" }\n  };\n  string id = 1;\n  PostData data = 2;\n  PostData data2 = 3 [(grpc.federation.field).by = \"data2\"];\n  PostType post_type = 4 [(grpc.federation.field).by = \"org.post.PostDataType.POST_TYPE_A\"];\n}\n\nenum PostType {\n  option (grpc.federation.enum) = {\n    alias: [ \"org.post.PostDataType\", \"org.post.v2.PostDataType\" ]\n  };\n\n  POST_TYPE_UNKNOWN = 0 [(grpc.federation.enum_value).default = true];\n  POST_TYPE_FOO = 1 [(grpc.federation.enum_value) = { alias: [\"POST_TYPE_A\"] }];\n  POST_TYPE_BAR = 2 [(grpc.federation.enum_value) = { alias: [\"org.post.v2.PostDataType.POST_TYPE_B\", \"POST_TYPE_C\"] }];\n}\n\nmessage PostData {\n  option (grpc.federation.message) = {\n    alias: [ \"org.post.PostData\", \"org.post.v2.PostData\" ]\n  };\n\n  PostType type = 1;\n  string title = 2;\n  PostContent content = 3;\n  int64 dummy = 4;\n}\n\nmessage PostContent {\n  option (grpc.federation.message) = {\n    alias: [ \"org.post.PostContent\" ]\n  };\n\n  enum Category {\n    option (grpc.federation.enum) = {\n      alias: [ \"org.post.PostContent.Category\" ]\n    };\n  \n    CATEGORY_A = 0;\n    CATEGORY_B = 1;\n  };\n\n  Category category = 1;\n  string head = 2;\n  string body = 3;\n  string dup_body = 4 [(grpc.federation.field).alias = \"body\"];\n  map<int32, int32> counts = 5;\n}\n"
  },
  {
    "path": "validator/testdata/invalid_multiple_env.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\nimport \"google/protobuf/duration.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice InlineEnvService {\n  option (grpc.federation.service) = {\n    env {\n      var {\n        name: \"aaa\"\n        type { kind: STRING }\n      }\n      var {\n        name: \"bbb\"\n        type { repeated { kind: INT64 } }\n      }\n      var {\n        name: \"ccc\"\n        type { kind: INT64 }\n      }\n      var {\n        name: \"ddd\"\n        type { map { key { kind: STRING } value { kind: DURATION } } }\n      }\n      var {\n        name: \"eee\"\n        type { map { key { kind: STRING } value { kind: INT64 } } }\n      }\n    }\n  };\n  rpc GetName(GetNameRequest) returns (GetNameResponse) {};\n}\n\nservice RefEnvService {\n  option (grpc.federation.service) = {\n    env { message: \"Env\" }\n  };\n  rpc GetName(GetNameRequest) returns (GetNameResponse) {};\n}\n\nmessage Env {\n  string aaa = 1;\n  repeated int64 bbb = 2;\n  repeated int64 ccc = 3;\n  map<string, google.protobuf.Duration> ddd = 4;\n  map<string, google.protobuf.Duration> eee = 5;\n}\n\nmessage GetNameRequest {\n}\n\nmessage GetNameResponse {\n  string aaa = 1 [(grpc.federation.field).by = \"grpc.federation.env.aaa\"];\n}"
  },
  {
    "path": "validator/testdata/invalid_nested_message_field.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"federation.proto\";\nimport \"post.proto\";\nimport \"user.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetARequest) returns (GetAResponse) {};\n}\n\nmessage GetARequest {\n  string id = 1;\n}\n\nmessage GetAResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"a\"\n      message {\n        name: \"A\"\n      }\n    }\n  };\n  A post = 1 [(grpc.federation.field).by = \"a\"];\n}\n\nmessage A {\n  option (grpc.federation.message) = {\n    def {\n      name: \"b\"\n      message {\n        name: \"A.B\"\n      }\n    }\n  };\n  message B {\n    option (grpc.federation.message) = {\n      def {\n        name: \"c\"\n        message {\n          name: \"A.B.C\"\n        }\n      }\n    };\n    message C {\n      option (grpc.federation.message) = {};\n      string body = 1;\n    }\n    C c = 1 [(grpc.federation.field).by = \"c\"];\n  }\n  B b = 1 [(grpc.federation.field).by = \"b\"];\n}\n"
  },
  {
    "path": "validator/testdata/invalid_nested_message_name.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"federation.proto\";\nimport \"post.proto\";\nimport \"user.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetARequest) returns (GetAResponse) {};\n}\n\nmessage GetARequest {\n  string id = 1;\n}\n\nmessage GetAResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"a\"\n      message {\n        name: \"A\"\n      }\n    }\n  };\n  A post = 1 [(grpc.federation.field).by = \"a\"];\n}\n\nmessage A {\n  message B {\n    option (grpc.federation.message) = {\n      def [\n        { name: \"b1\" message: { name: \"Invalid1\" } }\n      ]\n    };\n    message C {\n      option (grpc.federation.message) = {\n        def [\n          { name: \"c1\" message: { name: \"Invalid2\" } }\n        ]\n      };\n      string c1 = 1 [(grpc.federation.field).by = \"c1\"];\n    }\n    string b1 = 1 [(grpc.federation.field).by = \"b1\"];\n  }\n  option (grpc.federation.message) = {\n    def { name: \"b\" message { name: \"A.B\" } }\n  };\n  B b = 1 [(grpc.federation.field).by = \"b\"];\n}\n"
  },
  {
    "path": "validator/testdata/invalid_oneof.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"federation.proto\";\nimport \"user.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"user.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc Get(GetRequest) returns (GetResponse) {};\n}\n\nmessage GetRequest {}\n\nmessage GetResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"sel\"\n      message {\n        name: \"UserSelection\"\n        args { name: \"value\", by: \"'foo'\" }\n      }\n    }\n  };\n  User user = 1 [(grpc.federation.field).by = \"sel.user\"];\n}\n\nmessage UserSelection {\n  option (grpc.federation.message) = {\n    def {\n      name: \"m\"\n      message { name: \"M\" }\n    }\n  };\n  oneof user {\n    User user_a = 1 [\n      (grpc.federation.field).oneof = {\n        if: \"1\"\n        def {\n          name: \"ua\"\n          message {\n            name: \"User\"\n            args { name: \"user_id\", by: \"'a'\" }\n          }\n        }\n        by: \"ua\"\n      }\n    ];\n\n    User user_b = 2 [\n      (grpc.federation.field).oneof = {\n        def {\n          name: \"ub\"\n          message {\n            name: \"User\"\n            args { name: \"user_id\", by: \"'b'\" }\n          }\n        }\n        by: \"ub\"\n      }\n    ];\n\n    User user_c = 3 [\n      (grpc.federation.field).oneof = {\n        default: true\n        def {\n          name: \"uc\"\n          message {\n            name: \"User\"\n            args { name: \"user_id\", by: \"'c'\" }\n          }\n        }\n      }\n    ];\n\n    User user_d = 4 [\n      (grpc.federation.field).oneof = {\n        default: true\n        def {\n          name: \"ud\"\n          message {\n            name: \"User\"\n            args { name: \"user_id\", by: \"'d'\" }\n          }\n        }\n        by: \"ud\"\n      }\n    ];\n  }\n  bool foo = 5 [(grpc.federation.field).oneof = {\n    if: \"true\"\n    by: \"true\"\n  }];\n}\n\nmessage M {\n  string value = 1 [(grpc.federation.field).by = \"'foo'\"];\n}\n\nmessage User {\n  option (grpc.federation.message) = {\n    def {\n      call {\n        method: \"user.UserService/GetUser\"\n        request [\n          { field: \"id\" by: \"'id'\" },\n          { field: \"foo\" by: \"1\" },\n          { field: \"bar\" by: \"'hello'\" }\n        ]\n      }\n    }\n  };\n  string id = 1 [(grpc.federation.field).by = \"$.user_id\"];\n}\n"
  },
  {
    "path": "validator/testdata/invalid_oneof_selection.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc Get(GetRequest) returns (GetResponse) {};\n}\n\nmessage GetRequest {}\n\nmessage GetResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"sel\"\n      message {\n        name: \"UserSelection\"\n        args { name: \"value\", by: \"'foo'\" }\n      }\n    }\n  };\n  User user = 1 [(grpc.federation.field).by = \"sel.user\"];\n}\n\nmessage UserSelection {\n  option (grpc.federation.message) = {\n    def {\n      name: \"m\"\n      message { name: \"M\" }\n    }\n  };\n  oneof user {\n    User user_a = 1 [\n      (grpc.federation.field).oneof = {\n        if: \"true\"\n        def {\n          name: \"ua\"\n          message {\n            name: \"User\"\n            args { name: \"user_id\", by: \"'a'\" }\n          }\n        }\n        by: \"ua\"\n      }\n    ];\n\n    int64 user_b = 2 [\n      (grpc.federation.field).oneof = {\n        default: true\n        by: \"1\"\n      }\n    ];\n  }\n}\n\nmessage M {\n  string value = 1 [(grpc.federation.field).by = \"'foo'\"];\n}\n\nmessage User {\n  string id = 1 [(grpc.federation.field).by = \"$.user_id\"];\n}\n"
  },
  {
    "path": "validator/testdata/invalid_retry.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def [\n      { message { name: \"A\" } },\n      { message { name: \"B\" } },\n      { message { name: \"C\" } }\n    ]\n  };\n}\n\nmessage A {\n  option (grpc.federation.message) = {\n    def {\n      call {\n        method: \"post.PostService/GetPost\"\n        request { field: \"id\", by: \"'foo'\" }\n        retry {\n          if: \"foo\"\n          constant {\n            interval: \"1\"\n          }\n        }\n      }\n    }\n  };\n}\n\nmessage B {\n  option (grpc.federation.message) = {\n    def {\n      call {\n        method: \"post.PostService/GetPost\"\n        request { field: \"id\", by: \"'foo'\" }\n        retry {\n          if: \"1\"\n          exponential {\n            initial_interval: \"2\"\n          }\n        }\n      }\n    }\n  };\n}\n\nmessage C {\n  option (grpc.federation.message) = {\n    def {\n      call {\n        method: \"post.PostService/GetPost\"\n        request { field: \"id\", by: \"'foo'\" }\n        retry {\n          exponential {\n            max_interval: \"3\"\n          }\n        }\n      }\n    }\n  };\n}"
  },
  {
    "path": "validator/testdata/invalid_service_variable_switch.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {\n    var {\n      name: \"svar\"\n      switch {\n        case { if: \"true\" by: \"1\" }\n        default { by: \"true\" }\n      }\n    }\n  };\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  int64 svar = 1 [(grpc.federation.field).by = \"grpc.federation.var.svar\"];\n}"
  },
  {
    "path": "validator/testdata/invalid_switch_case_by_type.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (.grpc.federation.message) = {\n    def {\n      name: \"switch\"\n      switch {\n        case { if: \"$.id == 'blue'\" by: \"1\" }\n        case { if: \"$.id == 'red'\" by: \"'mackerel'\" }\n        default { by: \"3\" }\n      }\n    }\n  };\n}"
  },
  {
    "path": "validator/testdata/invalid_switch_case_if_type.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (.grpc.federation.message) = {\n    def {\n      name: \"switch\"\n      switch {\n        case { if: \"$.id\" by: \"1\" }\n        case { if: \"$.id == 'red'\" by: \"2\" }\n        default { by: \"3\" }\n      }\n    }\n  };\n}"
  },
  {
    "path": "validator/testdata/invalid_switch_default_by_type.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (.grpc.federation.message) = {\n    def {\n      name: \"switch\"\n      switch {\n        case { if: \"$.id == 'blue'\" by: \"1\" }\n        case { if: \"$.id == 'red'\" by: \"2\" }\n        default { by: \"'mackerel'\" }\n      }\n    }\n  };\n}"
  },
  {
    "path": "validator/testdata/invalid_validation_bad_request.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"res\"\n        call {\n          method: \"post.PostService/GetPost\"\n          request { field: \"id\", by: \"$.id\" }\n        }\n      },\n      { name: \"post\", by: \"res.post\", autobind: true },\n      {\n        validation {\n          name: \"invalid_bad_request\",\n          error {\n            code: FAILED_PRECONDITION\n            details: {\n              if: \"post.id != 'correct-id'\"\n              bad_request {\n                field_violations {\n                  field: \"1\",\n                  description: \"2\",\n                }\n              }\n            }\n          }\n        }\n      }\n    ]\n  };\n  string id = 1;\n  string title = 2;\n  string content = 3;\n}\n"
  },
  {
    "path": "validator/testdata/invalid_validation_code.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def [\n      {\n        validation {\n          error {\n            if: \"true\"\n            message: \"'error'\"\n          }\n        }\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "validator/testdata/invalid_validation_details_return_type.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"res\"\n        call {\n          method: \"post.PostService/GetPost\"\n          request { field: \"id\", by: \"$.id\" }\n        }\n      },\n      { name: \"post\", by: \"res.post\", autobind: true },\n      {\n        validation {\n          name: \"invalid_detail_rule\",\n          error {\n            code: FAILED_PRECONDITION\n            details: {\n              if: \"'string'\"\n            }\n          }\n        }\n      }\n    ]\n  };\n  string id = 1;\n  string title = 2;\n  string content = 3;\n}\n"
  },
  {
    "path": "validator/testdata/invalid_validation_localized_message.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"res\"\n        call {\n          method: \"post.PostService/GetPost\"\n          request { field: \"id\", by: \"$.id\" }\n        }\n      },\n      { name: \"post\", by: \"res.post\", autobind: true },\n      {\n        validation {\n          name: \"invalid_localized_message\",\n          error {\n            code: FAILED_PRECONDITION\n            details: {\n              if: \"post.id != 'correct-id'\"\n              localized_message {\n                locale: \"en-US\",\n                message: \"1\"\n              }\n            }\n          }\n        }\n      }\n    ]\n  };\n  string id = 1;\n  string title = 2;\n  string content = 3;\n}\n"
  },
  {
    "path": "validator/testdata/invalid_validation_message_argument.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"res\"\n        call {\n          method: \"post.PostService/GetPost\"\n          request { field: \"id\", by: \"$.id\" }\n        }\n      },\n      { name: \"post\", by: \"res.post\", autobind: true },\n      {\n        validation {\n          name: \"invalid_message_argument\",\n          error {\n            code: FAILED_PRECONDITION\n            details: {\n              if: \"post.id != 'correct-id'\"\n              message {\n                name: \"CustomMessage\",\n                args: {\n                  name: \"wrong\",\n                  by: \"'message1'\"\n                }\n              }\n            }\n          }\n        }\n      }\n    ]\n  };\n  string id = 1;\n  string title = 2;\n  string content = 3;\n}\n\nmessage CustomMessage {\n  string message = 1 [(grpc.federation.field).by = \"$.message\"];\n}\n"
  },
  {
    "path": "validator/testdata/invalid_validation_precondition_failure.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"res\"\n        call {\n          method: \"post.PostService/GetPost\"\n          request { field: \"id\", by: \"$.id\" }\n        }\n      },\n      { name: \"post\", by: \"res.post\", autobind: true },\n      {\n        validation {\n          name: \"invalid_failed_precondition\",\n          error {\n            code: FAILED_PRECONDITION\n            details: {\n              if: \"post.id != 'correct-id'\"\n              precondition_failure {\n                violations {\n                  type: \"1\",\n                  subject: \"2\",\n                  description: \"3\",\n                }\n              }\n            }\n          }\n        }\n      }\n    ]\n  };\n  string id = 1;\n  string title = 2;\n  string content = 3;\n}\n"
  },
  {
    "path": "validator/testdata/invalid_validation_return_type.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"res\"\n        call {\n          method: \"post.PostService/GetPost\"\n          request { field: \"id\", by: \"$.id\" }\n        }\n      },\n      { name: \"post\", by: \"res.post\", autobind: true },\n      {\n        validation {\n          name: \"invalid_return_type\",\n          error {\n            code: FAILED_PRECONDITION\n            if: \"post.id\"\n          }\n        }\n      }\n    ]\n  };\n  string id = 1;\n  string title = 2;\n  string content = 3;\n}\n"
  },
  {
    "path": "validator/testdata/invalid_validation_with_ignore.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      validation {\n        error {\n          if: \"true\"\n          ignore: true\n        }\n      }\n    }\n    def {\n      validation {\n        error {\n          if: \"true\"\n          ignore_and_response: \"'foo'\"\n        }\n      }\n    }\n  };\n}\n"
  },
  {
    "path": "validator/testdata/invalid_variable_name.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"echo.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc Get(GetRequest) returns (GetResponse) {};\n}\n\nmessage GetRequest {}\n\nmessage GetResponse {\n  option (grpc.federation.message) = {\n    def [\n      { name: \"_def0\" by: \"0\" },\n      {\n        validation {\n          error {\n            def { name: \"_def1\" by: \"1\" }\n            details {\n              def { name: \"_def2\" by: \"2\" }\n            }\n          }\n        }\n      },\n      {\n        call {\n          method: \"echo.EchoService/Echo\"\n          error {\n            def { name: \"_def3\" by: \"3\" }\n            details {\n              def { name: \"_def4\" by: \"4\" }\n            }\n          }\n        }\n      }\n    ]\n  };\n  oneof o {\n    string foo = 1 [(grpc.federation.field).oneof = {\n      default: true\n      def { name: \"_def5\" by: \"5\" }\n      by: \"'foo'\"\n    }];\n  }\n}"
  },
  {
    "path": "validator/testdata/invalid_wrapper_type_conversion.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"google/protobuf/wrappers.proto\";\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  double double_value = 1 [(grpc.federation.field).by = \"google.protobuf.DoubleValue{value: 1.23}\"];\n  float float_value = 2 [(grpc.federation.field).by = \"google.protobuf.FloatValue{value: 3.45}\"];\n  int64 i64_value = 3 [(grpc.federation.field).by = \"google.protobuf.Int64Value{value: 1}\"];\n  uint64 u64_value = 4 [(grpc.federation.field).by = \"google.protobuf.UInt64Value{value: uint(2)}\"];\n  int32 i32_value = 5 [(grpc.federation.field).by = \"google.protobuf.Int32Value{value: 3}\"];\n  uint32 u32_value = 6 [(grpc.federation.field).by = \"google.protobuf.UInt32Value{value: uint(4)}\"];\n  bool bool_value = 7 [(grpc.federation.field).by = \"google.protobuf.BoolValue{value: true}\"];\n  string string_value = 8 [(grpc.federation.field).by = \"google.protobuf.StringValue{value: 'hello'}\"];\n  bytes bytes_value = 9 [(grpc.federation.field).by = \"google.protobuf.BytesValue{value: bytes('world')}\"];\n\n  google.protobuf.DoubleValue double_wrapper_value = 10 [(grpc.federation.field).by = \"google.protobuf.DoubleValue{value: 1.23}\"];\n  google.protobuf.FloatValue float_wrapper_value = 11 [(grpc.federation.field).by = \"google.protobuf.FloatValue{value: 3.45}\"];\n  google.protobuf.Int64Value i64_wrapper_value = 12 [(grpc.federation.field).by = \"google.protobuf.Int64Value{value: 1}\"];\n  google.protobuf.UInt64Value u64_wrapper_value = 13 [(grpc.federation.field).by = \"google.protobuf.UInt64Value{value: uint(2)}\"];\n  google.protobuf.Int32Value i32_wrapper_value = 14 [(grpc.federation.field).by = \"google.protobuf.Int32Value{value: 3}\"];\n  google.protobuf.UInt32Value u32_wrapper_value = 15 [(grpc.federation.field).by = \"google.protobuf.UInt32Value{value: uint(4)}\"];\n  google.protobuf.BoolValue bool_wrapper_value = 16 [(grpc.federation.field).by = \"google.protobuf.BoolValue{value: true}\"];\n  google.protobuf.StringValue string_wrapper_value = 17 [(grpc.federation.field).by = \"google.protobuf.StringValue{value: 'hello'}\"];\n  google.protobuf.BytesValue bytes_wrapper_value = 18 [(grpc.federation.field).by = \"google.protobuf.BytesValue{value: bytes('world')}\"];\n\n  google.protobuf.DoubleValue double_wrapper_value2 = 19 [(grpc.federation.field).by = \"1.23\"];\n  google.protobuf.FloatValue float_wrapper_value2 = 20 [(grpc.federation.field).by = \"3.45\"];\n  google.protobuf.Int64Value i64_wrapper_value2 = 21 [(grpc.federation.field).by = \"1\"];\n  google.protobuf.UInt64Value u64_wrapper_value2 = 22 [(grpc.federation.field).by = \"uint(2)\"];\n  google.protobuf.Int32Value i32_wrapper_value2 = 23 [(grpc.federation.field).by = \"3\"];\n  google.protobuf.UInt32Value u32_wrapper_value2 = 24 [(grpc.federation.field).by = \"uint(4)\"];\n  google.protobuf.BoolValue bool_wrapper_value2 = 25 [(grpc.federation.field).by = \"true\"];\n  google.protobuf.StringValue string_wrapper_value2 = 26 [(grpc.federation.field).by = \"'hello'\"];\n  google.protobuf.BytesValue bytes_wrapper_value2 = 27 [(grpc.federation.field).by = \"bytes('world')\"];\n}\n"
  },
  {
    "path": "validator/testdata/message_cyclic_dependency.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc Get(GetRequest) returns (GetResponse) {};\n}\n\nmessage GetRequest {}\n\nmessage GetResponse {\n  option (grpc.federation.message) = {\n    def [\n      { name: \"a\", message { name: \"A\" } },\n      { name: \"b\", message { name: \"B\" } }\n    ]\n  };\n  string aaaname = 1 [(grpc.federation.field).by = \"a.aaaname\"];\n  string bname = 2 [(grpc.federation.field).by = \"b.name\"];\n}\n\nmessage A {\n  option (grpc.federation.message) = {\n    def [\n      { name: \"aa\", message { name: \"AA\" } },\n      { name: \"ab\", message { name: \"AB\" } }\n    ]\n  };\n  string aaaname = 1 [(grpc.federation.field).by = \"aa.aaaname\"];\n  string abname = 2 [(grpc.federation.field).by = \"ab.name\"];\n}\n\nmessage AA {\n  option (grpc.federation.message) = {\n    def { name: \"aaa\", message { name: \"AAA\" } }\n  };\n  string aaaname = 1 [(grpc.federation.field).by = \"aaa.name\"];\n}\n\nmessage AB {\n  string name = 1 [(grpc.federation.field).by = \"'ab'\"];\n}\n\nmessage AAA {\n  option (grpc.federation.message) = {\n    def { name: \"a\", message { name: \"A\" } }\n  };\n  string name = 1 [(grpc.federation.field).by = \"a.aaaname\"];\n}\n\nmessage B {\n  string name = 1 [(grpc.federation.field).by = \"'b'\"];\n}\n"
  },
  {
    "path": "validator/testdata/missing_enum_alias.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"nested_post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"org.post.PostService/GetPost\"\n        request { field: \"id\", by: \"$.id\" }\n      }\n    }\n    def { name: \"post\", by: \"res.post\", autobind: true }\n  };\n  string id = 1;\n  PostData data = 4;\n}\n\nenum PostType {\n  POST_TYPE_UNKNOWN = 0 [(grpc.federation.enum_value).default = true];\n  POST_TYPE_FOO = 1 [(grpc.federation.enum_value) = { alias: [\"POST_TYPE_A\"] }];\n  POST_TYPE_BAR = 2 [(grpc.federation.enum_value) = { alias: [\"POST_TYPE_B\", \"POST_TYPE_C\"] }];\n}\n\nmessage PostData {\n  option (grpc.federation.message).alias = \"org.post.PostData\";\n\n  PostType type = 1;\n  string title = 2;\n  PostContent content = 3;\n}\n\nmessage PostContent {\n  option (grpc.federation.message).alias = \"org.post.PostContent\";\n\n  enum Category {\n    CATEGORY_A = 0;\n    CATEGORY_B = 1;\n  };\n\n  Category category = 1;\n  string head = 2;\n  string body = 3;\n  map<int32, int32> counts = 4;\n}\n"
  },
  {
    "path": "validator/testdata/missing_enum_value.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"nested_post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"org.post.PostService/GetPost\"\n        request { field: \"id\", by: \"$.id\" }\n      }\n    }\n    def { name: \"post\", by: \"res.post\", autobind: true }\n  };\n  string id = 1;\n  PostData data = 4;\n}\n\nenum PostType {\n  option (grpc.federation.enum).alias = \"org.post.PostDataType\";\n\n  FOO = 0;\n}\n\nmessage PostData {\n  option (grpc.federation.message).alias = \"org.post.PostData\";\n\n  string title = 2;\n  PostContent content = 3;\n}\n\nmessage PostContent {\n  option (grpc.federation.message).alias = \"org.post.PostContent\";\n\n  enum Category {\n    option (grpc.federation.enum).alias = \"org.post.PostContent.Category\";\n    CATEGORY_A = 0;\n    CATEGORY_B = 1;\n    CATEGORY_C = 2;\n  };\n\n  Category category = 1;\n  string head = 2;\n  string body = 3;\n  map<int32, int32> counts = 4;\n}\n"
  },
  {
    "path": "validator/testdata/missing_enum_value_alias.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"nested_post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"org.post.PostService/GetPost\"\n        request { field: \"id\", by: \"$.id\" }\n      }\n    }\n    def { name: \"post\", by: \"res.post\", autobind: true }\n  };\n  string id = 1;\n  PostData data = 4;\n}\n\nenum PostType {\n  option (grpc.federation.enum).alias = \"org.post.PostDataType\";\n\n  POST_TYPE_UNKNOWN = 0;\n  POST_TYPE_FOO = 1;\n  POST_TYPE_BAR = 2;\n}\n\nmessage PostData {\n  option (grpc.federation.message).alias = \"org.post.PostData\";\n\n  PostType type = 1;\n  string title = 2;\n  PostContent content = 3;\n}\n\nmessage PostContent {\n  option (grpc.federation.message).alias = \"org.post.PostContent\";\n \n  enum Category {\n    option (grpc.federation.enum).alias = \"org.post.PostContent.Category\";\n\n    CATEGORY_A = 0;\n    CATEGORY_B = 1;\n  };\n\n  Category category = 1;\n  string head = 2;\n  string body = 3;\n  map<int32, int32> counts = 4;\n}\n"
  },
  {
    "path": "validator/testdata/missing_field_option.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"post.proto\", \"user.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"res\"\n        call {\n          method: \"post.PostService/GetPost\"\n          request { field: \"id\", by: \"$.id\" }\n        }\n      },\n      { name: \"post\", by: \"res.post\", autobind: true },\n      {\n        name: \"user\"\n        message {\n          name: \"User\"\n          args { inline: \"post\" }\n        }\n      }\n    ]\n  };\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  User user = 4;\n}\n\nmessage User {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"user.UserService/GetUser\"\n        request { field: \"id\", by: \"$.user_id\" }\n      }\n    }\n    def { name: \"user\", by: \"res.user\", autobind: true }\n  };\n  string id = 1;\n  string name = 2;\n}\n"
  },
  {
    "path": "validator/testdata/missing_file_import.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"grpc/federation/federation.proto\";\nimport \"post.proto\";\n\noption go_package = \"example/federation;federation\";\n\noption (grpc.federation.file)= {\n  import: [\n    \"user.proto\",\n    \"unknown.proto\"\n  ]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc Get(GetRequest) returns (GetResponse) {};\n}\n\nmessage GetRequest {\n  string id = 1;\n}\n\nmessage GetResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"post.PostService/GetPost\"\n        request { field: \"id\", by: \"$.id\" }\n      }\n    }\n    def { name: \"post\", by: \"res.post\", autobind: true  }\n  };\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  string user_id = 4;\n}\n"
  },
  {
    "path": "validator/testdata/missing_map_iterator.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPosts(GetPostsRequest) returns (GetPostsResponse) {};\n}\n\nmessage GetPostsRequest {\n  repeated string ids = 1;\n}\n    \nmessage GetPostsResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"posts\"\n      message {\n        name: \"Posts\"\n        args { name: \"ids\", by: \"$.ids\" }\n      }\n    }\n  };\n  Posts posts = 1 [(grpc.federation.field).by = \"posts\"];\n}\n\nmessage Posts {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"users\"\n        map {\n          message {\n            name: \"User\"\n            args { name: \"user_id\", by: \"'foo'\" }\n          }\n        }\n      }\n    ]\n  };\n  repeated string ids = 1 [(grpc.federation.field).by = \"$.ids\"];\n  repeated User users = 4 [(grpc.federation.field).by = \"users\"];\n}\n\nmessage User {\n  string id = 1 [(grpc.federation.field).by = \"$.user_id\"];\n}\n"
  },
  {
    "path": "validator/testdata/missing_message_alias.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"nested_post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"org.post.PostService/GetPost\"\n        request { field: \"id\", by: \"$.id\" }\n      }\n    }\n    def { name: \"post\", by: \"res.post\", autobind: true }\n  };\n  string id = 1;\n  PostData data = 4;\n}\n\nenum PostType {\n  POST_TYPE_UNKNOWN = 0;\n  POST_TYPE_FOO = 1;\n  POST_TYPE_BAR = 2;\n}\n\nmessage PostData {\n  PostType type = 1;\n  string title = 2;\n  PostContent content = 3 [(grpc.federation.field).alias = \"content\"];\n}\n\nmessage PostContent {\n  enum Category {\n    CATEGORY_A = 0;\n    CATEGORY_B = 1;\n  };\n\n  Category category = 1;\n  string head = 2;\n  string body = 3;\n}\n"
  },
  {
    "path": "validator/testdata/missing_message_field_alias.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"nested_post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"org.post.PostService/GetPost\"\n        request { field: \"id\", by: \"$.id\" }\n      }\n    }\n    def { name: \"post\", by: \"res.post\", autobind: true }\n  };\n  string id = 1;\n  PostData data = 4;\n}\n\nenum PostType {\n  option (grpc.federation.enum).alias = \"org.post.PostDataType\";\n\n  POST_TYPE_UNKNOWN = 0 [(grpc.federation.enum_value).default = true];\n  POST_TYPE_FOO = 1 [(grpc.federation.enum_value) = { alias: [\"POST_TYPE_A\"] }];\n  POST_TYPE_BAR = 2 [(grpc.federation.enum_value) = { alias: [\"POST_TYPE_B\", \"POST_TYPE_C\"] }];\n}\n\nmessage PostData {\n  option (grpc.federation.message).alias = \"org.post.PostData\";\n\n  PostType type = 1;\n  string title = 2;\n  PostContent content = 3;\n}\n\nmessage PostContent {\n  option (grpc.federation.message).alias = \"org.post.PostContent\";\n \n  enum Category {\n    option (grpc.federation.enum).alias = \"org.post.PostContent.Category\";\n\n    CATEGORY_A = 0;\n    CATEGORY_B = 1;\n  };\n\n  Category category = 1;\n  string head = 2;\n  string body = 3;\n  string dup_body = 4;\n  map<int32, int32> counts = 5;\n}\n"
  },
  {
    "path": "validator/testdata/missing_message_option.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"res\"\n        call {\n          method: \"post.PostService/GetPost\"\n          request { field: \"id\", by: \"$.id\" }\n        }\n      },\n      { name: \"post\", by: \"res.post\", autobind: true },\n      {\n        name: \"user\"\n        message {\n          name: \"User\"\n          args { inline: \"post\" }\n        }\n      }\n    ]\n  };\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  User user = 4 [(grpc.federation.field).by = \"user\"];\n}\n\nmessage User {\n  string id = 1;\n  string name = 2;\n}\n"
  },
  {
    "path": "validator/testdata/missing_method_request_value.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"post.proto\", \"user.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"res\"\n        call {\n          method: \"post.PostService/GetPost\"\n          request { field: \"id\" }\n        }\n      },\n      { name: \"post\", by: \"res.post\", autobind: true },\n      {\n        name: \"user\"\n        message {\n          name: \"User\"\n          args { inline: \"post\" }\n        }\n      }\n    ]\n  };\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  User user = 4 [(grpc.federation.field).by = \"user\"];\n}\n\nmessage User {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"user.UserService/GetUser\"\n        request { field: \"id\", by: \"$.user_id\" }\n      }\n    }\n    def { name: \"user\", by: \"res.user\", autobind: true }\n  };\n  string id = 1;\n  string name = 2;\n}\n"
  },
  {
    "path": "validator/testdata/missing_response_message_option.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  string foo = 1;\n}\n"
  },
  {
    "path": "validator/testdata/missing_service_variable.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {\n    var {\n      name: \"foo\"\n      by: \"1\"\n    }\n    var {\n      name: \"bar\"\n      by: \"foo + 1\"\n    }\n    var {\n      name: \"baz\"\n      by: \"foo2 + 1\"\n    }\n  };\n  rpc Get(GetRequest) returns (GetResponse) {};\n}\n\nmessage GetRequest {\n\n}\n\nmessage GetResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"foo\"\n      by: \"grpc.federation.var.foo + 1\"\n    }\n    def {\n      name: \"bar\"\n      by: \"grpc.federation.var.unknown\"\n    }\n  };\n}"
  },
  {
    "path": "validator/testdata/missing_switch_case.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (.grpc.federation.message) = {\n    def {\n      name: \"switch\"\n      switch {\n        default { by: \"3\" }\n      }\n    }\n  };\n}"
  },
  {
    "path": "validator/testdata/missing_switch_default.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (.grpc.federation.message) = {\n    def {\n      name: \"switch\"\n      switch {\n        case { if: \"$.id == 'blue'\" by: \"1\" }\n        case { if: \"$.id == 'red'\" by: \"2\" }\n      }\n    }\n  };\n}"
  },
  {
    "path": "validator/testdata/nested_list.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (.grpc.federation.message) = {\n    def { name: \"nested_list\" by: \"[[1]]\" }\n  };\n}\n"
  },
  {
    "path": "validator/testdata/nested_message_cyclic_dependency.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"federation.proto\";\nimport \"post.proto\";\nimport \"user.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetARequest) returns (GetAResponse) {};\n}\n\nmessage GetARequest {\n  string id = 1;\n}\n\nmessage GetAResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"a\"\n      message {\n        name: \"A\"\n      }\n    }\n  };\n  A post = 1 [(grpc.federation.field).by = \"a\"];\n}\n\nmessage A {\n  option (grpc.federation.message) = {\n    def {\n      name: \"b\"\n      message {\n        name: \"A.B\"\n      }\n    }\n  };\n  message B {\n    option (grpc.federation.message) = {\n      def {\n        name: \"c\"\n        message {\n          name: \"A.B.C\"\n        }\n      }\n    };\n    message C {\n      option (grpc.federation.message) = {\n        def {\n          name: \"c\"\n          message {\n            name: \"A.B.C\"\n          }\n        }\n      };\n      C c = 1 [(grpc.federation.field).by = \"c\"];\n    }\n    C c = 1 [(grpc.federation.field).by = \"c\"];\n  }\n  B b = 1 [(grpc.federation.field).by = \"b\"];\n}\n"
  },
  {
    "path": "validator/testdata/nested_post.proto",
    "content": "syntax = \"proto3\";\n\npackage org.post;\n\noption go_package = \"example/post;post\";\n\nservice PostService {\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  Post post = 1;\n}\n\nmessage Post {\n  string id = 1;\n  PostData data = 2;\n}\n\nenum PostDataType {\n  POST_TYPE_A = 0;\n  POST_TYPE_B = 1;\n  POST_TYPE_C = 2;\n}\n\nenum FakePostDataType {\n  FAKE_POST_TYPE_A = 0;\n  FAKE_POST_TYPE_B = 1;\n  FAKE_POST_TYPE_C = 2;\n}\n  \nmessage PostData {\n  PostDataType type = 1;\n  string title = 2;\n  PostContent content = 3;\n}\n\nmessage FakePostData {\n  PostDataType type = 1;\n  string title = 2;\n  PostContent content = 3;\n}\n  \nmessage PostContent {\n  enum Category {\n    CATEGORY_A = 0;\n    CATEGORY_B = 1;\n  }\n  Category category = 1;\n  string head = 2;\n  string body = 3;\n  map<int32, int32> counts = 4;\n}\n\nmessage FakePostContent {\n  enum FakeCategory {\n    CATEGORY_A = 0;\n    CATEGORY_B = 1;\n  }\n  FakeCategory category = 1;\n  string head = 2;\n  string body = 3;\n}"
  },
  {
    "path": "validator/testdata/nested_post2.proto",
    "content": "syntax = \"proto3\";\n\npackage org.post.v2;\n\noption go_package = \"example/post/v2;postv2\";\n\nservice PostService {\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  Post post = 1;\n}\n\nmessage Post {\n  string id = 1;\n  PostData data = 2;\n}\n\nenum PostDataType {\n  POST_V2_TYPE_A = 0;\n  POST_V2_TYPE_B = 1;\n  POST_V2_TYPE_C = 2;\n}\n\nenum FakePostDataType {\n  FAKE_POST_TYPE_A = 0;\n  FAKE_POST_TYPE_B = 1;\n  FAKE_POST_TYPE_C = 2;\n}\n  \nmessage PostData {\n  PostDataType type = 1;\n  int64 title = 2;\n  PostContent content = 3;\n  int64 dummy = 4;\n}\n\nmessage FakePostData {\n  PostDataType type = 1;\n  string title = 2;\n  PostContent content = 3;\n}\n  \nmessage PostContent {\n  enum Category {\n    CATEGORY_A = 0;\n    CATEGORY_B = 1;\n  }\n  Category category = 1;\n  string head = 2;\n  string body = 3;\n}\n\nmessage FakePostContent {\n  enum FakeCategory {\n    CATEGORY_A = 0;\n    CATEGORY_B = 1;\n  }\n  FakeCategory category = 1;\n  string head = 2;\n  string body = 3;\n}"
  },
  {
    "path": "validator/testdata/post.proto",
    "content": "syntax = \"proto3\";\n\npackage post;\n\noption go_package = \"example/post;post\";\n\nservice PostService {\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n  rpc GetPosts(GetPostsRequest) returns (GetPostsResponse) {};\n  rpc GetPostMap(GetPostMapRequest) returns (GetPostMapResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  Post post = 1;\n}\n\nmessage GetPostsRequest {\n  repeated string ids = 1;\n}\n\nmessage GetPostsResponse {\n  repeated Post posts = 1;\n}\n\nmessage GetPostMapRequest {\n  map<string, string> ids = 1;\n}\n\nmessage GetPostMapResponse {\n  map<string, Post> posts = 1;\n}\n\nmessage Post {\n  string id = 1;\n  string title = 2;\n  string content = 3;\n  string user_id = 4;\n}\n"
  },
  {
    "path": "validator/testdata/recursive_message_name.proto",
    "content": "syntax = \"proto3\";\n\npackage federation;\n\nimport \"federation.proto\";\nimport \"post.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def [\n      {\n        name: \"res\"\n        call {\n          method: \"post.PostService/GetPost\"\n          request { field: \"id\", by: \"$.id\" }\n        }\n      },\n      { name: \"post\", by: \"res.post\", autobind: true },\n      { name: \"self\", message { name: \"Post\" } }\n    ]\n  };\n  string id = 1;\n  string title = 2;\n  string content = 3;\n}\n"
  },
  {
    "path": "validator/testdata/repeated_switch_default.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"grpc/federation/federation.proto\";\n\noption go_package = \"example/federation;federation\";\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (.grpc.federation.message) = {\n    def {\n      name: \"switch\"\n      switch {\n        case { if: \"$.id == 'blue'\" by: \"1\" }\n        case { if: \"$.id == 'red'\" by: \"2\" }\n        default { by: \"3\" }\n        default { by: \"4\" }\n      }\n    }\n  };\n}"
  },
  {
    "path": "validator/testdata/user.proto",
    "content": "syntax = \"proto3\";\n\npackage user;\n\noption go_package = \"example/user;user\";\n\nservice UserService {\n  rpc GetUser(GetUserRequest) returns (GetUserResponse) {};\n  rpc GetUsers(GetUsersRequest) returns (GetUsersResponse) {};\n}\n\nmessage GetUserRequest {\n  string id = 1;\n  oneof foobar {\n    int64 foo = 2;\n    string bar = 3;\n  }\n}\n\nmessage GetUserResponse {\n  User user = 1;\n}\n\nmessage GetUsersRequest {\n  repeated string ids = 1;\n}\n\nmessage GetUsersResponse {\n  repeated User users = 1;\n}\n\nmessage User {\n  string id = 1;\n  string name = 2;\n}\n"
  },
  {
    "path": "validator/testdata/valid_enum_value_reference.proto",
    "content": "syntax = \"proto3\";\n\npackage org.federation;\n\nimport \"federation.proto\";\n\noption go_package = \"example/federation;federation\";\noption (grpc.federation.file) = {\n  import: [\"nested_post.proto\"]\n};\n\nservice FederationService {\n  option (grpc.federation.service) = {};\n  rpc GetPost(GetPostRequest) returns (GetPostResponse) {};\n}\n\nmessage GetPostRequest {\n  string id = 1;\n}\n\nmessage GetPostResponse {\n  option (grpc.federation.message) = {\n    def {\n      name: \"post\"\n      message {\n        name: \"Post\"\n        args { name: \"id\", by: \"$.id\" }\n      }\n    }\n  };\n  Post post = 1 [(grpc.federation.field).by = \"post\"];\n}\n\nmessage Post {\n  option (grpc.federation.message) = {\n    def {\n      name: \"res\"\n      call {\n        method: \"org.post.PostService/GetPost\"\n        request { field: \"id\", by: \"$.id\" }\n      }\n    }\n    def { name: \"post\", by: \"res.post\", autobind: true }\n  };\n  string id = 1;\n  PostType type = 2 [(grpc.federation.field).by = \"PostType.value('FICTION')\"];\n}\n\nenum PostType {\n  UNKNOWN = 0;\n  FICTION = 1;\n}\n"
  },
  {
    "path": "validator/validator.go",
    "content": "package validator\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sort\"\n\t\"strings\"\n\n\t\"github.com/bufbuild/protocompile/ast\"\n\n\t\"github.com/mercari/grpc-federation/compiler\"\n\t\"github.com/mercari/grpc-federation/resolver\"\n\t\"github.com/mercari/grpc-federation/source\"\n)\n\ntype Validator struct {\n\tcompiler      *compiler.Compiler\n\timportPaths   []string\n\tmanualImport  bool\n\tpathToFileMap map[string]*source.File\n}\n\nfunc New() *Validator {\n\treturn &Validator{\n\t\tcompiler:      compiler.New(),\n\t\tpathToFileMap: map[string]*source.File{},\n\t}\n}\n\ntype ValidationOutput struct {\n\tIsWarning  bool\n\tPath       string\n\tStart      ast.SourcePos\n\tEnd        ast.SourcePos\n\tMessage    string\n\tSourceLine string\n}\n\ntype ValidatorOption func(v *Validator)\n\nfunc ImportPathOption(path ...string) ValidatorOption {\n\treturn func(v *Validator) {\n\t\tv.importPaths = append(v.importPaths, path...)\n\t}\n}\n\nfunc ManualImportOption() ValidatorOption {\n\treturn func(v *Validator) {\n\t\tv.manualImport = true\n\t}\n}\n\nfunc (v *Validator) applyOptions(opts ...ValidatorOption) {\n\tv.pathToFileMap = map[string]*source.File{}\n\tv.importPaths = []string{}\n\tfor _, opt := range opts {\n\t\topt(v)\n\t}\n}\n\nfunc (v *Validator) Validate(ctx context.Context, file *source.File, opts ...ValidatorOption) []*ValidationOutput {\n\tv.applyOptions(opts...)\n\tvar compilerOpts []compiler.Option\n\tcompilerOpts = append(compilerOpts, compiler.ImportPathOption(v.importPaths...))\n\tif v.manualImport {\n\t\tcompilerOpts = append(compilerOpts, compiler.ManualImportOption())\n\t}\n\tprotos, err := v.compiler.Compile(ctx, file, compilerOpts...)\n\tif err != nil {\n\t\tcompilerErr, ok := err.(*compiler.CompilerError)\n\t\tif !ok {\n\t\t\t// unknown compile error\n\t\t\treturn nil\n\t\t}\n\t\treturn v.compilerErrorToValidationOutputs(compilerErr)\n\t}\n\tr := resolver.New(protos, resolver.ImportPathOption(v.importPaths...))\n\tresult, err := r.Resolve()\n\treturn v.ToValidationOutputByResolverResult(result, err, opts...)\n}\n\nfunc (v *Validator) ToValidationOutputByResolverResult(result *resolver.Result, err error, opts ...ValidatorOption) []*ValidationOutput {\n\tv.applyOptions(opts...)\n\tvar outs []*ValidationOutput\n\tif result != nil {\n\t\touts = v.toValidationOutputByWarnings(result.Warnings)\n\t}\n\tfor _, e := range resolver.ExtractIndividualErrors(err) {\n\t\touts = append(outs, v.toValidationOutputByError(e))\n\t}\n\tsort.SliceStable(outs, func(i, j int) bool {\n\t\treturn outs[i].Start.Col < outs[j].Start.Col\n\t})\n\tsort.SliceStable(outs, func(i, j int) bool {\n\t\treturn outs[i].Start.Line < outs[j].Start.Line\n\t})\n\treturn outs\n}\n\nfunc (v *Validator) compilerErrorToValidationOutputs(err *compiler.CompilerError) []*ValidationOutput {\n\tif len(err.ErrWithPos) == 0 {\n\t\treturn []*ValidationOutput{{Message: err.Error()}}\n\t}\n\tvar outs []*ValidationOutput\n\tfor _, e := range err.ErrWithPos {\n\t\tmsg := e.Error()\n\t\tstart := e.GetPosition()\n\t\touts = append(outs, &ValidationOutput{\n\t\t\tStart:   start,\n\t\t\tEnd:     start,\n\t\t\tMessage: msg,\n\t\t})\n\t}\n\treturn outs\n}\n\nfunc (v *Validator) toValidationOutputByWarnings(warnings []*resolver.Warning) []*ValidationOutput {\n\touts := make([]*ValidationOutput, 0, len(warnings))\n\tfor _, warn := range warnings {\n\t\tout := v.toValidationOutput(warn.Location, warn.Message)\n\t\tout.IsWarning = true\n\t\touts = append(outs, out)\n\t}\n\treturn outs\n}\n\nfunc (v *Validator) toValidationOutputByError(err error) *ValidationOutput {\n\tlocErr := resolver.ToLocationError(err)\n\tif locErr == nil {\n\t\treturn &ValidationOutput{Message: err.Error()}\n\t}\n\treturn v.toValidationOutput(locErr.Location, locErr.Message)\n}\n\nfunc (v *Validator) toValidationOutput(loc *source.Location, msg string) *ValidationOutput {\n\tpath := loc.FileName\n\tfile := v.getFile(path)\n\tif file == nil {\n\t\treturn &ValidationOutput{\n\t\t\tPath:    path,\n\t\t\tMessage: msg,\n\t\t}\n\t}\n\tnodeInfo := file.NodeInfoByLocation(loc)\n\tif nodeInfo == nil {\n\t\treturn &ValidationOutput{\n\t\t\tPath:    path,\n\t\t\tMessage: msg,\n\t\t}\n\t}\n\tvar sourceLine string\n\tstartLine := nodeInfo.Start().Line\n\tcontents := strings.Split(string(file.Content()), \"\\n\")\n\tif len(contents) > startLine && startLine > 0 {\n\t\tsourceLine = contents[startLine-1]\n\t}\n\treturn &ValidationOutput{\n\t\tPath:       path,\n\t\tStart:      nodeInfo.Start(),\n\t\tEnd:        nodeInfo.End(),\n\t\tMessage:    msg,\n\t\tSourceLine: sourceLine,\n\t}\n}\n\nfunc (v *Validator) getFile(path string) *source.File {\n\tfile, exists := v.pathToFileMap[path]\n\tif exists {\n\t\treturn file\n\t}\n\tfor _, importPath := range append([]string{\"\"}, v.importPaths...) {\n\t\tcontent, err := os.ReadFile(filepath.Join(importPath, path))\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t}\n\t\tf, err := source.NewFile(path, content)\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t}\n\t\tv.pathToFileMap[path] = f\n\t\treturn f\n\t}\n\treturn nil\n}\n\nfunc ExistsError(outs []*ValidationOutput) bool {\n\tfor _, out := range outs {\n\t\tif out.IsWarning {\n\t\t\tcontinue\n\t\t}\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc Format(outs []*ValidationOutput) string {\n\tvar b strings.Builder\n\tfor _, out := range outs {\n\t\tvar msg string\n\t\tif out.IsWarning {\n\t\t\tmsg = fmt.Sprintf(\"[WARN] %s\", out.Message)\n\t\t} else {\n\t\t\tmsg = out.Message\n\t\t}\n\t\tif out.Path == \"\" {\n\t\t\tfmt.Fprintf(&b, \"%s\\n\", msg)\n\t\t\tcontinue\n\t\t}\n\t\tstartPos := out.Start\n\t\tif startPos.Line == 0 {\n\t\t\tfmt.Fprintf(&b, \"%s: %s\\n\", out.Path, msg)\n\t\t} else {\n\t\t\tfmt.Fprintf(&b, \"%s:%d:%d: %s\\n\", out.Path, startPos.Line, startPos.Col, msg)\n\t\t}\n\t\tif out.SourceLine != \"\" {\n\t\t\theader := fmt.Sprintf(\"%d: \", startPos.Line)\n\t\t\tfmt.Fprintf(&b, \"%s %s\\n\", header, out.SourceLine)\n\t\t\tfmt.Fprintf(&b, \"%s^\\n\", strings.Repeat(\" \", len(header)+startPos.Col))\n\t\t}\n\t}\n\treturn b.String()\n}\n"
  },
  {
    "path": "validator/validator_test.go",
    "content": "package validator_test\n\nimport (\n\t\"context\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\n\t\"github.com/mercari/grpc-federation/source\"\n\t\"github.com/mercari/grpc-federation/validator\"\n)\n\nfunc TestValidator(t *testing.T) {\n\tt.Parallel()\n\ttests := []struct {\n\t\tfile     string\n\t\texpected string\n\t}{\n\t\t{file: \"conflict_service_variable.proto\", expected: `\nconflict_service_variable.proto:44:1: service variable \"bar\" has different types across services: BarService, FooService\n44:  message GetResponse {\n     ^\nconflict_service_variable.proto:56:11: ERROR: <input>:1:20: undefined field 'baz'\n | grpc.federation.var.baz\n | ...................^\n56:        by: \"grpc.federation.var.baz\"\n               ^\n`},\n\t\t{file: \"empty_response_field.proto\", expected: `\n`},\n\t\t{file: \"different_message_argument_type.proto\", expected: `\ndifferent_message_argument_type.proto:28:14: \"id\" argument name is declared with a different type. found \"string\" and \"int64\" type\n28:          args { name: \"id\" by: \"1\" }\n                  ^\n`},\n\t\t{file: \"duplicated_variable_name.proto\", expected: `\nduplicated_variable_name.proto:26:17: \"code\" field is required in validation\n26:            error {\n                     ^\nduplicated_variable_name.proto:27:25: found duplicated variable name \"a\"\n27:              def { name: \"a\" by: \"1\" }\n                             ^\nduplicated_variable_name.proto:29:27: found duplicated variable name \"a\"\n29:                def { name: \"a\" by: \"2\" }\n                               ^\nduplicated_variable_name.proto:38:25: found duplicated variable name \"a\"\n38:              def { name: \"a\" by: \"3\" }\n                             ^\nduplicated_variable_name.proto:40:27: found duplicated variable name \"a\"\n40:                def { name: \"a\" by: \"4\" }\n                               ^\nduplicated_variable_name.proto:50:19: found duplicated variable name \"a\"\n50:        def { name: \"a\" by: \"5\" }\n                       ^\n`},\n\t\t{file: \"invalid_autobind.proto\", expected: `\ninvalid_autobind.proto:23:3: \"id\" field found multiple times in the message specified by autobind. since it is not possible to determine one, please use \"grpc.federation.field\" to explicitly bind it. found message names are \"a\" name at def and \"b\" name at def\n23:    string id = 1;\n       ^\ninvalid_autobind.proto:23:3: \"id\" field in \"org.federation.GetResponse\" message needs to specify \"grpc.federation.field\" option\n23:    string id = 1;\n       ^\n`},\n\t\t{file: \"invalid_call_error_handler.proto\", expected: `\ninvalid_call_error_handler.proto:44:21: cannot set both \"ignore\" and \"ignore_and_response\"\n44:              ignore: true\n                         ^\ninvalid_call_error_handler.proto:45:34: cannot set both \"ignore\" and \"ignore_and_response\"\n45:              ignore_and_response: \"post.GetPostResponse{}\"\n                                      ^\ninvalid_call_error_handler.proto:49:19: \"by\" must always return a message value\n49:                by: \"1\"\n                       ^\ninvalid_call_error_handler.proto:53:34: value must be \"post.GetPostResponse\" type\n53:              ignore_and_response: \"10\"\n                                      ^\n`},\n\t\t{file: \"invalid_call_metadata.proto\", expected: `\ninvalid_call_metadata.proto:26:19: gRPC Call metadata's value type must be map<string, repeated string> type\n26:          metadata: \"{'foo': 'bar'}\"\n                       ^\n`},\n\t\t{file: \"invalid_call_option.proto\", expected: `\ninvalid_call_option.proto:29:19: \"hdr\" variable is not defined\n29:            header: \"hdr\"\n                       ^\ninvalid_call_option.proto:30:20: gRPC Call option trailer's value type must be map<string, repeated string> type\n30:            trailer: \"tlr\"\n                        ^\n`},\n\t\t{file: \"invalid_condition_type.proto\", expected: `\ninvalid_condition_type.proto:38:13: return value of \"if\" must be bool type but got string type\n38:          if: \"$.id\"\n                 ^\n`},\n\t\t{file: \"invalid_field_option.proto\", expected: `\ninvalid_field_option.proto:31:50: ERROR: <input>:1:5: undefined field 'invalid'\n | post.invalid\n | ....^\n31:    Post post = 1 [(grpc.federation.field) = { by: \"post.invalid\" }];\n                                                      ^\n`},\n\t\t{file: \"invalid_field_type.proto\", expected: `\ninvalid_field_type.proto:18:3: cannot convert type automatically: field type is \"string\" but specified value type is \"int64\"\n18:    string a = 1 [(grpc.federation.field).by = \"1\"];\n       ^\n`},\n\t\t{file: \"invalid_go_package.proto\", expected: `\ninvalid_go_package.proto:9:21: go_package option \"a;b;c;d\" is invalid\n9:  option go_package = \"a;b;c;d\";\n                        ^\n`},\n\t\t{file: \"invalid_enum_alias_target.proto\", expected: `\ninvalid_enum_alias_target.proto:49:1: required specify alias = \"org.post.PostDataType\" in grpc.federation.enum option for the \"org.federation.PostType\" type to automatically assign a value to the \"PostData.type\" field via autobind\n49:  enum PostType {\n     ^\ninvalid_enum_alias_target.proto:68:3: required specify alias = \"org.post.PostContent.Category\" in grpc.federation.enum option for the \"org.federation.PostContent.Category\" type to automatically assign a value to the \"PostContent.category\" field via autobind\n68:    enum Category {\n       ^\n`},\n\t\t{file: \"invalid_enum_attribute.proto\", expected: `\ninvalid_enum_attribute.proto:25:13: attribute name is required\n25:        name: \"\"\n                 ^\ninvalid_enum_attribute.proto:30:13: \"xxx\" attribute must be defined for all enum values, but it is only defined for 1/3 of them\n30:        name: \"xxx\"\n                 ^\ninvalid_enum_attribute.proto:36:13: \"yyy\" attribute must be defined for all enum values, but it is only defined for 1/3 of them\n36:        name: \"yyy\"\n                 ^\n`},\n\t\t{file: \"invalid_enum_conversion.proto\", expected: `\ninvalid_enum_conversion.proto:27:13: required specify alias = \"org.federation.PostType\" in grpc.federation.enum option for the \"org.post.PostContent.Category\" type to automatically assign a value\n27:          by: \"org.post.PostContent.Category.value('CATEGORY_B')\"\n                 ^\ninvalid_enum_conversion.proto:33:13: enum must always return a enum value, but got \"int64\" type\n33:          by: \"1\"\n                 ^\ninvalid_enum_conversion.proto:49:15: required specify alias = \"org.federation.PostType\" in grpc.federation.enum option for the \"org.post.PostContent.Category\" type to automatically assign a value\n49:            by: \"typ\"\n                   ^\n`},\n\t\t{file: \"invalid_enum_selector.proto\", expected: `\ninvalid_enum_selector.proto:22:15: ERROR: <input>:1:56: cannot specify an int type. if you are directly specifying an enum value, you need to explicitly use \"pkg.EnumName.value('ENUM_VALUE')\" function to use the enum type\n | grpc.federation.enum.select(true, org.post.PostDataType.POST_TYPE_B, 'foo')\n | .......................................................^\n22:      def { by: \"grpc.federation.enum.select(true, org.post.PostDataType.POST_TYPE_B, 'foo')\" }\n                   ^\ninvalid_enum_selector.proto:28:1: required specify alias = \"org.post.PostContent.Category\" in grpc.federation.enum option for the \"org.federation.PostDataType\" type to automatically assign a value to the \"GetPostResponse.type\" field via autobind\n28:  enum PostDataType {\n     ^\n`},\n\t\t{file: \"invalid_enum_value_noalias.proto\", expected: `\ninvalid_enum_value_noalias.proto:52:77: \"noalias\" cannot be specified simultaneously with \"default\" or \"alias\"\n52:    POST_TYPE_A = 0 [(grpc.federation.enum_value) = { default: true, noalias: true }];\n                                                                                 ^\ninvalid_enum_value_noalias.proto:53:62: \"noalias\" cannot be specified simultaneously with \"default\" or \"alias\"\n53:    POST_TYPE_B = 1 [(grpc.federation.enum_value) = { noalias: true, alias: [\"POST_TYPE_B\"] }];\n                                                                  ^\n`},\n\t\t{file: \"invalid_env.proto\", expected: `\ninvalid_env.proto:11:9: \"message\" and \"var\" cannot be used simultaneously\n11:      env {\n             ^\ninvalid_env.proto:24:16: \"org.federation.Invalid\" message does not exist\n24:        message: \"Invalid\"\n                    ^\n`},\n\t\t{file: \"invalid_multiple_env.proto\", expected: `\ninvalid_multiple_env.proto:56:1: environment variable \"ccc\" has different types across services: InlineEnvService, RefEnvService\n56:  message GetNameResponse {\n     ^\ninvalid_multiple_env.proto:56:1: environment variable \"eee\" has different types across services: InlineEnvService, RefEnvService\n56:  message GetNameResponse {\n     ^\n`},\n\t\t{file: \"invalid_error_variable.proto\", expected: `\ninvalid_error_variable.proto:20:17: \"error\" is the reserved keyword. this name is not available\n20:      def { name: \"error\" by: \"'foo'\" }\n                     ^\ninvalid_error_variable.proto:21:25: ERROR: <input>:1:1: undeclared reference to 'error' (in container 'org.federation')\n | error\n | ^\n21:      def { name: \"e\" by: \"error\" }\n                             ^\ninvalid_error_variable.proto:24:15: \"code\" field is required in validation\n24:          error {\n                   ^\ninvalid_error_variable.proto:25:15: ERROR: <input>:1:1: undeclared reference to 'error' (in container 'org.federation')\n | error.code == 0\n | ^\n25:            if: \"error.code == 0\"\n                   ^\n`},\n\t\t{file: \"invalid_map_iterator_src_type.proto\", expected: `\ninvalid_map_iterator_src_type.proto:43:18: map iterator's src value type must be repeated type\n43:              src: \"post_ids\"\n                      ^\ninvalid_map_iterator_src_type.proto:54:57: ERROR: <input>:1:1: undeclared reference to 'users' (in container 'org.federation')\n | users\n | ^\n54:    repeated User users = 4 [(grpc.federation.field).by = \"users\"];\n                                                             ^\ninvalid_map_iterator_src_type.proto:58:47: ERROR: <input>:1:8: undefined field 'user_id'\n | __ARG__.user_id\n | .......^\n58:    string id = 1 [(grpc.federation.field).by = \"$.user_id\"];\n                                                   ^\n`},\n\t\t{file: \"invalid_map_iterator_src.proto\", expected: `\ninvalid_map_iterator_src.proto:39:18: \"posts\" variable is not defined\n39:              src: \"posts\"\n                      ^\ninvalid_map_iterator_src.proto:43:41: ERROR: <input>:1:1: undeclared reference to 'iter' (in container 'org.federation')\n | iter.id\n | ^\n43:              args { name: \"user_id\", by: \"iter.id\" }\n                                             ^\ninvalid_map_iterator_src.proto:54:47: ERROR: <input>:1:8: undefined field 'user_id'\n | __ARG__.user_id\n | .......^\n54:    string id = 1 [(grpc.federation.field).by = \"$.user_id\"];\n                                                   ^\n`},\n\t\t{file: \"invalid_message_alias_target.proto\", expected: `\ninvalid_message_alias_target.proto:46:3: required specify alias = \"org.post.PostData\" in grpc.federation.message option for the \"org.federation.PostData\" type to automatically assign a value to the \"Post.data\" field via autobind\n46:    PostData data = 4;\n       ^\n`},\n\t\t{file: \"invalid_message_alias.proto\", expected: `\ninvalid_message_alias.proto:46:3: required specify alias = \"org.post.PostData\" in grpc.federation.message option for the \"org.federation.PostData\" type to automatically assign a value to the \"Post.data\" field via autobind\n46:    PostData data = 4;\n       ^\ninvalid_message_alias.proto:56:44: cannot find package from \"invalid.Invalid\"\n56:    option (grpc.federation.message).alias = \"invalid.Invalid\";\n                                                ^\ninvalid_message_alias.proto:58:3: \"type\" field in \"org.federation.PostData\" message needs to specify \"grpc.federation.field\" option\n58:    PostType type = 1;\n       ^\ninvalid_message_alias.proto:59:3: \"title\" field in \"org.federation.PostData\" message needs to specify \"grpc.federation.field\" option\n59:    string title = 2;\n       ^\ninvalid_message_alias.proto:60:3: \"content\" field in \"org.federation.PostData\" message needs to specify \"grpc.federation.field\" option\n60:    PostContent content = 3;\n       ^\ninvalid_message_alias.proto:75:3: \"org.federation.SomeUser\" message does not exist\n75:    option (grpc.federation.message).alias = \"SomeUser\";\n       ^\ninvalid_message_alias.proto:77:3: \"name\" field in \"org.federation.User\" message needs to specify \"grpc.federation.field\" option\n77:    string name = 1;\n       ^\ninvalid_message_alias.proto:81:3: \"google.protobuf.Comment\" message does not exist\n81:    option (grpc.federation.message).alias = \"google.protobuf.Comment\";\n       ^\ninvalid_message_alias.proto:83:3: \"body\" field in \"org.federation.Comment\" message needs to specify \"grpc.federation.field\" option\n83:    string body = 1;\n       ^\n`},\n\t\t{file: \"invalid_nested_message_field.proto\", expected: `\ninvalid_nested_message_field.proto:52:7: \"body\" field in \"federation.A.B.C\" message needs to specify \"grpc.federation.field\" option\n52:        string body = 1;\n           ^\n`},\n\t\t{file: \"invalid_method.proto\", expected: `\ninvalid_method.proto:37:24: invalid method format. required format is \"<package-name>.<service-name>/<method-name>\" but specified \"\"\n37:        { call { method: \"\" } },\n                            ^\ninvalid_method.proto:42:26: ERROR: <input>:1:1: undeclared reference to 'invalid' (in container 'federation')\n | invalid\n | ^\n42:            args { inline: \"invalid\" }\n                              ^\ninvalid_method.proto:47:3: \"id\" field in \"federation.Post\" message needs to specify \"grpc.federation.field\" option\n47:    string id = 1;\n       ^\ninvalid_method.proto:48:3: \"title\" field in \"federation.Post\" message needs to specify \"grpc.federation.field\" option\n48:    string title = 2;\n       ^\ninvalid_method.proto:49:3: \"content\" field in \"federation.Post\" message needs to specify \"grpc.federation.field\" option\n49:    string content = 3;\n       ^\ninvalid_method.proto:59:36: ERROR: <input>:1:8: undefined field 'user_id'\n | __ARG__.user_id\n | .......^\n59:          request { field: \"id\", by: \"$.user_id\" }\n                                        ^\n`},\n\t\t{file: \"invalid_multi_alias.proto\", expected: `\ninvalid_multi_alias.proto:56:3: if multiple aliases are specified, you must use grpc.federation.enum.select function to bind\n56:    PostType post_type = 4 [(grpc.federation.field).by = \"org.post.PostDataType.POST_TYPE_A\"];\n       ^\ninvalid_multi_alias.proto:65:3: \"POST_TYPE_A\" value must be present in all enums, but it is missing in \"org.post.PostDataType\", \"org.post.v2.PostDataType\" enum\n65:    POST_TYPE_FOO = 1 [(grpc.federation.enum_value) = { alias: [\"POST_TYPE_A\"] }];\n       ^\ninvalid_multi_alias.proto:66:3: \"org.post.v2.PostDataType.POST_TYPE_B\" value does not exist in \"org.post.PostDataType\", \"org.post.v2.PostDataType\" enum\n66:    POST_TYPE_BAR = 2 [(grpc.federation.enum_value) = { alias: [\"org.post.v2.PostDataType.POST_TYPE_B\", \"POST_TYPE_C\"] }];\n       ^\ninvalid_multi_alias.proto:66:3: \"POST_TYPE_C\" value must be present in all enums, but it is missing in \"org.post.PostDataType\", \"org.post.v2.PostDataType\" enum\n66:    POST_TYPE_BAR = 2 [(grpc.federation.enum_value) = { alias: [\"org.post.v2.PostDataType.POST_TYPE_B\", \"POST_TYPE_C\"] }];\n       ^\ninvalid_multi_alias.proto:75:3: The types of \"org.federation.PostData\"'s \"title\" field (\"string\") and \"org.post.v2.PostData\"'s field (\"int64\") are different. This field cannot be resolved automatically, so you must use the \"grpc.federation.field\" option to bind it yourself\n75:    string title = 2;\n       ^\ninvalid_multi_alias.proto:75:3: \"title\" field in \"org.federation.PostData\" message needs to specify \"grpc.federation.field\" option\n75:    string title = 2;\n       ^\ninvalid_multi_alias.proto:76:3: required specify alias = \"org.post.v2.PostContent\" in grpc.federation.message option for the \"org.federation.PostContent\" type to automatically assign a value to the \"PostData.content\" field via autobind\n76:    PostContent content = 3;\n       ^\ninvalid_multi_alias.proto:77:3: specified \"alias\" in grpc.federation.message option, but \"dummy\" field does not exist in \"org.post.PostData\" message\n77:    int64 dummy = 4;\n       ^\ninvalid_multi_alias.proto:77:3: \"dummy\" field in \"org.federation.PostData\" message needs to specify \"grpc.federation.field\" option\n77:    int64 dummy = 4;\n       ^\n`},\n\t\t{file: \"invalid_oneof_selection.proto\", expected: `\ninvalid_oneof_selection.proto:26:47: \"org.federation.UserSelection\" type has \"user\" as oneof name, but \"user\" has a difference type and cannot be accessed directly, so \"user\" becomes an undefined field\nERROR: <input>:1:4: undefined field 'user'\n | sel.user\n | ...^\n26:    User user = 1 [(grpc.federation.field).by = \"sel.user\"];\n                                                   ^\n`},\n\t\t{file: \"invalid_oneof.proto\", expected: `\ninvalid_oneof.proto:43:13: return value of \"if\" must be bool type but got int64 type\n43:          if: \"1\"\n                 ^\ninvalid_oneof.proto:56:39: \"if\" or \"default\" must be specified in \"grpc.federation.field.oneof\"\n56:        (grpc.federation.field).oneof = {\n                                           ^\ninvalid_oneof.proto:69:39: \"by\" must be specified in \"grpc.federation.field.oneof\"\n69:        (grpc.federation.field).oneof = {\n                                           ^\ninvalid_oneof.proto:83:18: \"default\" found multiple times in the \"grpc.federation.field.oneof\". \"default\" can only be specified once per oneof\n83:          default: true\n                      ^\ninvalid_oneof.proto:95:3: \"oneof\" feature can only be used for fields within oneof\n95:    bool foo = 5 [(grpc.federation.field).oneof = {\n       ^\ninvalid_oneof.proto:95:3: value must be specified\n95:    bool foo = 5 [(grpc.federation.field).oneof = {\n       ^\ninvalid_oneof.proto:95:3: \"foo\" field in \"org.federation.UserSelection\" message needs to specify \"grpc.federation.field\" option\n95:    bool foo = 5 [(grpc.federation.field).oneof = {\n       ^\ninvalid_oneof.proto:112:20: \"foo\" field is a oneof field, so you need to specify an \"if\" expression\n112:            { field: \"foo\" by: \"1\" },\n                         ^\ninvalid_oneof.proto:113:20: \"bar\" field is a oneof field, so you need to specify an \"if\" expression\n113:            { field: \"bar\" by: \"'hello'\" }\n                         ^\n`},\n\t\t{file: \"invalid_retry.proto\", expected: `\ninvalid_retry.proto:38:15: ERROR: <input>:1:1: undeclared reference to 'foo' (in container 'org.federation')\n | foo\n | ^\n38:            if: \"foo\"\n                   ^\ninvalid_retry.proto:40:23: time: missing unit in duration \"1\"\n40:              interval: \"1\"\n                           ^\ninvalid_retry.proto:55:15: if must always return a boolean value\n55:            if: \"1\"\n                   ^\ninvalid_retry.proto:57:31: time: missing unit in duration \"2\"\n57:              initial_interval: \"2\"\n                                   ^\ninvalid_retry.proto:73:27: time: missing unit in duration \"3\"\n73:              max_interval: \"3\"\n                               ^\n`},\n\t\t{file: \"invalid_method_service_name.proto\", expected: `\ninvalid_method_service_name.proto: \"post.InvalidService\" service does not exist\ninvalid_method_service_name.proto:37:24: cannot find \"method\" method because the service to which the method belongs does not exist\n37:        { call { method: \"post.InvalidService/method\" } },\n                            ^\ninvalid_method_service_name.proto:47:3: \"id\" field in \"federation.Post\" message needs to specify \"grpc.federation.field\" option\n47:    string id = 1;\n       ^\ninvalid_method_service_name.proto:48:3: \"title\" field in \"federation.Post\" message needs to specify \"grpc.federation.field\" option\n48:    string title = 2;\n       ^\ninvalid_method_service_name.proto:49:3: \"content\" field in \"federation.Post\" message needs to specify \"grpc.federation.field\" option\n49:    string content = 3;\n       ^\n`},\n\t\t{file: \"invalid_method_name.proto\", expected: `\ninvalid_method_name.proto:37:24: \"invalid\" method does not exist in PostService service\n37:        { call { method: \"post.PostService/invalid\" } },\n                            ^\ninvalid_method_name.proto:47:3: \"id\" field in \"federation.Post\" message needs to specify \"grpc.federation.field\" option\n47:    string id = 1;\n       ^\ninvalid_method_name.proto:48:3: \"title\" field in \"federation.Post\" message needs to specify \"grpc.federation.field\" option\n48:    string title = 2;\n       ^\ninvalid_method_name.proto:49:3: \"content\" field in \"federation.Post\" message needs to specify \"grpc.federation.field\" option\n49:    string content = 3;\n       ^\n`},\n\t\t{file: \"invalid_method_timeout_format.proto\", expected: `\ninvalid_method_timeout_format.proto:12:47: time: unknown unit \"p\" in duration \"1p\"\n12:      option (grpc.federation.method).timeout = \"1p\";\n                                                   ^\n`},\n\n\t\t{file: \"invalid_method_request.proto\", expected: `\ninvalid_method_request.proto:43:28: \"invalid\" field does not exist in \"post.GetPostRequest\" message for method request\n43:            request { field: \"invalid\", by: \"$.invalid\" }\n                                ^\ninvalid_method_request.proto:43:43: ERROR: <input>:1:8: undefined field 'invalid'\n | __ARG__.invalid\n | .......^\n43:            request { field: \"invalid\", by: \"$.invalid\" }\n                                               ^\n`},\n\t\t{file: \"missing_field_option.proto\", expected: `\nmissing_field_option.proto:57:3: \"user\" field in \"federation.Post\" message needs to specify \"grpc.federation.field\" option\n57:    User user = 4;\n       ^\n`},\n\t\t{file: \"missing_file_import.proto\", expected: `\nmissing_file_import.proto:13:5: unknown.proto: no such file or directory\n13:      \"unknown.proto\"\n         ^\n`},\n\t\t{file: \"missing_map_iterator.proto\", expected: `\nmissing_map_iterator.proto:36:13: map iterator name must be specified\n36:          map {\n                 ^\nmissing_map_iterator.proto:36:13: map iterator src must be specified\n36:          map {\n                 ^\n`},\n\t\t{file: \"missing_message_alias.proto\", expected: `\nmissing_message_alias.proto:46:3: required specify alias = \"org.post.PostData\" in grpc.federation.message option for the \"org.federation.PostData\" type to automatically assign a value to the \"Post.data\" field via autobind\n46:    PostData data = 4;\n       ^\nmissing_message_alias.proto:56:3: \"type\" field in \"org.federation.PostData\" message needs to specify \"grpc.federation.field\" option\n56:    PostType type = 1;\n       ^\nmissing_message_alias.proto:57:3: \"title\" field in \"org.federation.PostData\" message needs to specify \"grpc.federation.field\" option\n57:    string title = 2;\n       ^\nmissing_message_alias.proto:58:3: use \"alias\" in \"grpc.federation.field\" option, but \"alias\" is not defined in \"grpc.federation.message\" option\n58:    PostContent content = 3 [(grpc.federation.field).alias = \"content\"];\n       ^\n`},\n\t\t{file: \"missing_enum_alias.proto\", expected: `\nmissing_enum_alias.proto:49:1: required specify alias = \"org.post.PostDataType\" in grpc.federation.enum option for the \"org.federation.PostType\" type to automatically assign a value to the \"PostData.type\" field via autobind\n49:  enum PostType {\n     ^\nmissing_enum_alias.proto:51:62: use \"alias\" in \"grpc.federation.enum_value\" option, but \"alias\" is not defined in \"grpc.federation.enum\" option\n51:    POST_TYPE_FOO = 1 [(grpc.federation.enum_value) = { alias: [\"POST_TYPE_A\"] }];\n                                                                  ^\nmissing_enum_alias.proto:52:62: use \"alias\" in \"grpc.federation.enum_value\" option, but \"alias\" is not defined in \"grpc.federation.enum\" option\n52:    POST_TYPE_BAR = 2 [(grpc.federation.enum_value) = { alias: [\"POST_TYPE_B\", \"POST_TYPE_C\"] }];\n                                                                  ^\nmissing_enum_alias.proto:66:3: required specify alias = \"org.post.PostContent.Category\" in grpc.federation.enum option for the \"org.federation.PostContent.Category\" type to automatically assign a value to the \"PostContent.category\" field via autobind\n66:    enum Category {\n       ^\n`},\n\t\t{file: \"missing_enum_value.proto\", expected: `\nmissing_enum_value.proto:52:3: specified \"alias\" in grpc.federation.enum option, but \"FOO\" value does not exist in \"org.post.PostDataType\" enum\n52:    FOO = 0;\n       ^\nmissing_enum_value.proto:69:5: specified \"alias\" in grpc.federation.enum option, but \"CATEGORY_C\" value does not exist in \"org.post.PostContent.Category\" enum\n69:      CATEGORY_C = 2;\n         ^\n`},\n\t\t{file: \"missing_enum_value_alias.proto\", expected: `\nmissing_enum_value_alias.proto:52:3: specified \"alias\" in grpc.federation.enum option, but \"POST_TYPE_UNKNOWN\" value does not exist in \"org.post.PostDataType\" enum\n52:    POST_TYPE_UNKNOWN = 0;\n       ^\nmissing_enum_value_alias.proto:53:3: specified \"alias\" in grpc.federation.enum option, but \"POST_TYPE_FOO\" value does not exist in \"org.post.PostDataType\" enum\n53:    POST_TYPE_FOO = 1;\n       ^\nmissing_enum_value_alias.proto:54:3: specified \"alias\" in grpc.federation.enum option, but \"POST_TYPE_BAR\" value does not exist in \"org.post.PostDataType\" enum\n54:    POST_TYPE_BAR = 2;\n       ^\n`},\n\t\t{file: \"valid_enum_value_reference.proto\", expected: \"\"},\n\t\t{file: \"missing_message_field_alias.proto\", expected: `\nmissing_message_field_alias.proto:78:3: specified \"alias\" in grpc.federation.message option, but \"dup_body\" field does not exist in \"org.post.PostContent\" message\n78:    string dup_body = 4;\n       ^\nmissing_message_field_alias.proto:78:3: \"dup_body\" field in \"org.federation.PostContent\" message needs to specify \"grpc.federation.field\" option\n78:    string dup_body = 4;\n       ^\n`},\n\t\t{file: \"missing_message_option.proto\", expected: `\nmissing_message_option.proto:48:17: \"federation.User\" message does not specify \"grpc.federation.message\" option\n48:            name: \"User\"\n                     ^\n`},\n\t\t{file: \"missing_method_request_value.proto\", expected: `\nmissing_method_request_value.proto:41:19: value must be specified\n41:            request { field: \"id\" }\n                       ^\n`},\n\t\t{file: \"missing_response_message_option.proto\", expected: `\nmissing_response_message_option.proto:18:1: \"federation.GetPostResponse\" message needs to specify \"grpc.federation.message\" option\n18:  message GetPostResponse {\n     ^\n`},\n\t\t{file: \"missing_service_variable.proto\", expected: `\nmissing_service_variable.proto:21:11: ERROR: <input>:1:1: undeclared reference to 'foo2' (in container 'org.federation')\n | foo2 + 1\n | ^\n21:        by: \"foo2 + 1\"\n               ^\nmissing_service_variable.proto:39:11: ERROR: <input>:1:20: undefined field 'unknown'\n | grpc.federation.var.unknown\n | ...................^\n39:        by: \"grpc.federation.var.unknown\"\n               ^\n`},\n\t\t{file: \"invalid_method_response_option.proto\", expected: `\ninvalid_method_response_option.proto: \"google.protobuf.Empty\" message needs to specify \"grpc.federation.message\" option\ninvalid_method_response_option.proto:14:48: \"federation.Invalid\" message does not exist\n14:      option (grpc.federation.method).response = \"Invalid\";\n                                                    ^\ninvalid_method_response_option.proto:17:48: \"federation.DeletePostResponse\" message must contain fields with the same names and types as the \"seconds\", \"nanos\" fields in the \"google.protobuf.Timestamp\" message\n17:      option (grpc.federation.method).response = \"DeletePostResponse\";\n                                                    ^\n`},\n\t\t{file: \"invalid_method_response.proto\", expected: `\ninvalid_method_response.proto:43:27: ERROR: <input>:1:1: undeclared reference to 'invalid' (in container 'federation')\n | invalid\n | ^\n43:        { name: \"post\", by: \"invalid\", autobind: true  },\n                               ^\ninvalid_method_response.proto:48:26: ERROR: <input>:1:1: undeclared reference to 'post' (in container 'federation')\n | post\n | ^\n48:            args { inline: \"post\" }\n                              ^\ninvalid_method_response.proto:53:3: \"id\" field in \"federation.Post\" message needs to specify \"grpc.federation.field\" option\n53:    string id = 1;\n       ^\ninvalid_method_response.proto:54:3: \"title\" field in \"federation.Post\" message needs to specify \"grpc.federation.field\" option\n54:    string title = 2;\n       ^\ninvalid_method_response.proto:55:3: \"content\" field in \"federation.Post\" message needs to specify \"grpc.federation.field\" option\n55:    string content = 3;\n       ^\ninvalid_method_response.proto:65:36: ERROR: <input>:1:8: undefined field 'user_id'\n | __ARG__.user_id\n | .......^\n65:          request { field: \"id\", by: \"$.user_id\" }\n                                        ^\n`},\n\t\t{file: \"invalid_message_name.proto\", expected: `\ninvalid_message_name.proto:48:17: \"federation.Invalid\" message does not exist\n48:          message {\n                     ^\ninvalid_message_name.proto:49:17: undefined message specified\n49:            name: \"Invalid\"\n                     ^\ninvalid_message_name.proto:55:17: \"post.Invalid\" message does not exist\n55:          message {\n                     ^\ninvalid_message_name.proto:56:17: undefined message specified\n56:            name: \"post.Invalid\"\n                     ^\n`},\n\t\t{file: \"invalid_nested_message_name.proto\", expected: `\ninvalid_nested_message_name.proto:36:31: \"federation.Invalid1\" message does not exist\n36:          { name: \"b1\" message: { name: \"Invalid1\" } }\n                                   ^\ninvalid_nested_message_name.proto:36:39: undefined message specified\n36:          { name: \"b1\" message: { name: \"Invalid1\" } }\n                                           ^\ninvalid_nested_message_name.proto:42:33: \"federation.Invalid2\" message does not exist\n42:            { name: \"c1\" message: { name: \"Invalid2\" } }\n                                     ^\ninvalid_nested_message_name.proto:42:41: undefined message specified\n42:            { name: \"c1\" message: { name: \"Invalid2\" } }\n                                             ^\ninvalid_nested_message_name.proto:45:7: cannot convert type automatically: field type is \"string\" but specified value type is \"null\"\n45:        string c1 = 1 [(grpc.federation.field).by = \"c1\"];\n           ^\ninvalid_nested_message_name.proto:47:5: cannot convert type automatically: field type is \"string\" but specified value type is \"null\"\n47:      string b1 = 1 [(grpc.federation.field).by = \"b1\"];\n         ^\n`},\n\t\t{file: \"invalid_message_argument.proto\", expected: `\ninvalid_message_argument.proto:44:11: \"x\" argument name is declared with a different type. found \"federation.Post\" and \"federation.User\" type\n44:            { name: \"x\" by: \"User{}\" }\n               ^\ninvalid_message_argument.proto:72:19: ERROR: <input>:1:11: type 'string' does not support field selection\n | __ARG__.id.invalid\n | ..........^\n72:              { by: \"$.id.invalid\" },\n                       ^\ninvalid_message_argument.proto:73:23: inline value is not message type\n73:              { inline: \"post.id\" },\n                           ^\ninvalid_message_argument.proto:74:19: ERROR: <input>:1:2: Syntax error: no viable alternative at input '..'\n | ....\n | .^\n74:              { by: \"....\" },\n                       ^\ninvalid_message_argument.proto:75:23: ERROR: <input>:1:2: Syntax error: no viable alternative at input '..'\n | ....\n | .^\n75:              { inline: \"....\" }\n                           ^\ninvalid_message_argument.proto:93:36: ERROR: <input>:1:8: undefined field 'user_id'\n | __ARG__.user_id\n | .......^\n93:          request { field: \"id\", by: \"$.user_id\" }\n                                        ^\ninvalid_message_argument.proto:108:14: \"x\" argument name is declared with a different type. found \"string\" and \"bool\" type\n108:          args { name: \"x\" by: \"true\" }\n                   ^\n`},\n\t\t{file: \"invalid_message_field_alias.proto\", expected: `\ninvalid_message_field_alias.proto:61:3: The types of \"org.federation.PostData\"'s \"title\" field (\"int64\") and \"org.post.PostData\"'s field (\"string\") are different. This field cannot be resolved automatically, so you must use the \"grpc.federation.field\" option to bind it yourself\n61:    int64 title = 2;\n       ^\ninvalid_message_field_alias.proto:61:3: \"title\" field in \"org.federation.PostData\" message needs to specify \"grpc.federation.field\" option\n61:    int64 title = 2;\n       ^\ninvalid_message_field_alias.proto:71:3: cannot convert type automatically: field type is \"enum\" but specified value type is \"int64\"\n71:    PostType type = 1 [(grpc.federation.field).by = \"org.federation.PostType.POST_TYPE_FOO\"];\n       ^\ninvalid_message_field_alias.proto:88:3: The types of \"org.federation.PostContent\"'s \"body\" field (\"int64\") and \"org.post.PostContent\"'s field (\"string\") are different. This field cannot be resolved automatically, so you must use the \"grpc.federation.field\" option to bind it yourself\n88:    int64 body = 3;\n       ^\ninvalid_message_field_alias.proto:88:3: \"body\" field in \"org.federation.PostContent\" message needs to specify \"grpc.federation.field\" option\n88:    int64 body = 3;\n       ^\n`},\n\t\t{file: \"recursive_message_name.proto\", expected: `\nrecursive_message_name.proto:35:1: found cyclic dependency in \"federation.Post\" message. dependency path: GetPostResponse => Post => Post\n35:  message Post {\n     ^\nrecursive_message_name.proto:46:39: recursive definition: \"Post\" is own message name\n46:        { name: \"self\", message { name: \"Post\" } }\n                                           ^\nrecursive_message_name.proto:49:3: \"id\" field in \"federation.Post\" message needs to specify \"grpc.federation.field\" option\n49:    string id = 1;\n       ^\nrecursive_message_name.proto:50:3: \"title\" field in \"federation.Post\" message needs to specify \"grpc.federation.field\" option\n50:    string title = 2;\n       ^\nrecursive_message_name.proto:51:3: \"content\" field in \"federation.Post\" message needs to specify \"grpc.federation.field\" option\n51:    string content = 3;\n       ^\n`},\n\t\t{file: \"message_cyclic_dependency.proto\", expected: `\nmessage_cyclic_dependency.proto:27:1: found cyclic dependency in \"org.federation.A\" message. dependency path: GetResponse => A => AA => AAA => A\n27:  message A {\n     ^\n`},\n\t\t{file: \"nested_message_cyclic_dependency.proto\", expected: `\nnested_message_cyclic_dependency.proto:50:5: found cyclic dependency in \"federation.C\" message. dependency path: GetAResponse => A => B => C => C\n50:      message C {\n         ^\nnested_message_cyclic_dependency.proto:55:19: recursive definition: \"C\" is own message name\n55:              name: \"A.B.C\"\n                       ^\n`},\n\t\t{file: \"invalid_variable_name.proto\", expected: `\ninvalid_variable_name.proto:22:15: \"_def0\" is invalid name. name should be in the following pattern: ^[a-zA-Z][a-zA-Z0-9_]*$\n22:        { name: \"_def0\" by: \"0\" },\n                   ^\ninvalid_variable_name.proto:25:17: \"code\" field is required in validation\n25:            error {\n                     ^\ninvalid_variable_name.proto:26:25: \"_def1\" is invalid name. name should be in the following pattern: ^[a-zA-Z][a-zA-Z0-9_]*$\n26:              def { name: \"_def1\" by: \"1\" }\n                             ^\ninvalid_variable_name.proto:28:27: \"_def2\" is invalid name. name should be in the following pattern: ^[a-zA-Z][a-zA-Z0-9_]*$\n28:                def { name: \"_def2\" by: \"2\" }\n                               ^\ninvalid_variable_name.proto:37:25: \"_def3\" is invalid name. name should be in the following pattern: ^[a-zA-Z][a-zA-Z0-9_]*$\n37:              def { name: \"_def3\" by: \"3\" }\n                             ^\ninvalid_variable_name.proto:39:27: \"_def4\" is invalid name. name should be in the following pattern: ^[a-zA-Z][a-zA-Z0-9_]*$\n39:                def { name: \"_def4\" by: \"4\" }\n                               ^\ninvalid_variable_name.proto:49:19: \"_def5\" is invalid name. name should be in the following pattern: ^[a-zA-Z][a-zA-Z0-9_]*$\n49:        def { name: \"_def5\" by: \"5\" }\n                       ^\n`},\n\t\t{file: \"invalid_wrapper_type_conversion.proto\", expected: `\ninvalid_wrapper_type_conversion.proto:20:3: cannot convert message to \"double\"\n20:    double double_value = 1 [(grpc.federation.field).by = \"google.protobuf.DoubleValue{value: 1.23}\"];\n       ^\ninvalid_wrapper_type_conversion.proto:21:3: cannot convert message to \"float\"\n21:    float float_value = 2 [(grpc.federation.field).by = \"google.protobuf.FloatValue{value: 3.45}\"];\n       ^\ninvalid_wrapper_type_conversion.proto:22:3: cannot convert message to \"int64\"\n22:    int64 i64_value = 3 [(grpc.federation.field).by = \"google.protobuf.Int64Value{value: 1}\"];\n       ^\ninvalid_wrapper_type_conversion.proto:23:3: cannot convert message to \"uint64\"\n23:    uint64 u64_value = 4 [(grpc.federation.field).by = \"google.protobuf.UInt64Value{value: uint(2)}\"];\n       ^\ninvalid_wrapper_type_conversion.proto:24:3: cannot convert message to \"int32\"\n24:    int32 i32_value = 5 [(grpc.federation.field).by = \"google.protobuf.Int32Value{value: 3}\"];\n       ^\ninvalid_wrapper_type_conversion.proto:25:3: cannot convert message to \"uint32\"\n25:    uint32 u32_value = 6 [(grpc.federation.field).by = \"google.protobuf.UInt32Value{value: uint(4)}\"];\n       ^\ninvalid_wrapper_type_conversion.proto:26:3: cannot convert message to \"bool\"\n26:    bool bool_value = 7 [(grpc.federation.field).by = \"google.protobuf.BoolValue{value: true}\"];\n       ^\ninvalid_wrapper_type_conversion.proto:27:3: cannot convert message to \"string\"\n27:    string string_value = 8 [(grpc.federation.field).by = \"google.protobuf.StringValue{value: 'hello'}\"];\n       ^\ninvalid_wrapper_type_conversion.proto:28:3: cannot convert message to \"bytes\"\n28:    bytes bytes_value = 9 [(grpc.federation.field).by = \"google.protobuf.BytesValue{value: bytes('world')}\"];\n       ^\ninvalid_wrapper_type_conversion.proto:40:3: cannot convert type automatically: field type is \"message\" but specified value type is \"double\"\n40:    google.protobuf.DoubleValue double_wrapper_value2 = 19 [(grpc.federation.field).by = \"1.23\"];\n       ^\ninvalid_wrapper_type_conversion.proto:41:3: cannot convert type automatically: field type is \"message\" but specified value type is \"double\"\n41:    google.protobuf.FloatValue float_wrapper_value2 = 20 [(grpc.federation.field).by = \"3.45\"];\n       ^\ninvalid_wrapper_type_conversion.proto:42:3: cannot convert type automatically: field type is \"message\" but specified value type is \"int64\"\n42:    google.protobuf.Int64Value i64_wrapper_value2 = 21 [(grpc.federation.field).by = \"1\"];\n       ^\ninvalid_wrapper_type_conversion.proto:43:3: cannot convert type automatically: field type is \"message\" but specified value type is \"uint64\"\n43:    google.protobuf.UInt64Value u64_wrapper_value2 = 22 [(grpc.federation.field).by = \"uint(2)\"];\n       ^\ninvalid_wrapper_type_conversion.proto:44:3: cannot convert type automatically: field type is \"message\" but specified value type is \"int64\"\n44:    google.protobuf.Int32Value i32_wrapper_value2 = 23 [(grpc.federation.field).by = \"3\"];\n       ^\ninvalid_wrapper_type_conversion.proto:45:3: cannot convert type automatically: field type is \"message\" but specified value type is \"uint64\"\n45:    google.protobuf.UInt32Value u32_wrapper_value2 = 24 [(grpc.federation.field).by = \"uint(4)\"];\n       ^\ninvalid_wrapper_type_conversion.proto:46:3: cannot convert type automatically: field type is \"message\" but specified value type is \"bool\"\n46:    google.protobuf.BoolValue bool_wrapper_value2 = 25 [(grpc.federation.field).by = \"true\"];\n       ^\ninvalid_wrapper_type_conversion.proto:47:3: cannot convert type automatically: field type is \"message\" but specified value type is \"string\"\n47:    google.protobuf.StringValue string_wrapper_value2 = 26 [(grpc.federation.field).by = \"'hello'\"];\n       ^\ninvalid_wrapper_type_conversion.proto:48:3: cannot convert type automatically: field type is \"message\" but specified value type is \"bytes\"\n48:    google.protobuf.BytesValue bytes_wrapper_value2 = 27 [(grpc.federation.field).by = \"bytes('world')\"];\n       ^\n`},\n\t\t{file: \"invalid_validation_code.proto\", expected: `\ninvalid_validation_code.proto:23:17: \"code\" field is required in validation\n23:            error {\n                     ^\n`},\n\t\t{file: \"invalid_validation_return_type.proto\", expected: `\ninvalid_validation_return_type.proto:50:17: if must always return a boolean value\n50:              if: \"post.id\"\n                     ^\n`},\n\t\t{file: \"invalid_validation_details_return_type.proto\", expected: `\ninvalid_validation_details_return_type.proto:51:19: if must always return a boolean value\n51:                if: \"'string'\"\n                       ^\n`},\n\t\t{file: \"invalid_validation_message_argument.proto\", expected: `\ninvalid_validation_message_argument.proto:71:52: ERROR: <input>:1:8: undefined field 'message'\n | __ARG__.message\n | .......^\n71:    string message = 1 [(grpc.federation.field).by = \"$.message\"];\n                                                        ^\n`},\n\t\t{file: \"invalid_validation_precondition_failure.proto\", expected: `\ninvalid_validation_precondition_failure.proto:54:25: type must always return a string value\n54:                    type: \"1\",\n                             ^\ninvalid_validation_precondition_failure.proto:55:28: subject must always return a string value\n55:                    subject: \"2\",\n                                ^\ninvalid_validation_precondition_failure.proto:56:32: description must always return a string value\n56:                    description: \"3\",\n                                    ^\n`},\n\t\t{file: \"invalid_validation_bad_request.proto\", expected: `\ninvalid_validation_bad_request.proto:54:26: field must always return a string value\n54:                    field: \"1\",\n                              ^\ninvalid_validation_bad_request.proto:55:32: description must always return a string value\n55:                    description: \"2\",\n                                    ^\n`},\n\t\t{file: \"invalid_validation_localized_message.proto\", expected: `\ninvalid_validation_localized_message.proto:54:26: message must always return a string value\n54:                  message: \"1\"\n                              ^\n`},\n\t\t{file: \"invalid_validation_with_ignore.proto\", expected: `\ninvalid_validation_with_ignore.proto:22:15: \"code\" field is required in validation\n22:          error {\n                   ^\ninvalid_validation_with_ignore.proto:24:19: validation doesn't support \"ignore\" feature\n24:            ignore: true\n                       ^\ninvalid_validation_with_ignore.proto:30:15: \"code\" field is required in validation\n30:          error {\n                   ^\ninvalid_validation_with_ignore.proto:32:32: validation doesn't support \"ignore_and_response\" feature\n32:            ignore_and_response: \"'foo'\"\n                                    ^\n`},\n\t\t{file: \"invalid_list_sort.proto\", expected: `\ninvalid_list_sort.proto:55:59: ERROR: <input>:1:14: list(org.federation.User) is not comparable\n | users.sortAsc(v, v).sortDesc(v, v).sortStableAsc(v, v).sortStableDesc(v, v)\n | .............^\nERROR: <input>:1:29: list(org.federation.User) is not comparable\n | users.sortAsc(v, v).sortDesc(v, v).sortStableAsc(v, v).sortStableDesc(v, v)\n | ............................^\nERROR: <input>:1:49: list(org.federation.User) is not comparable\n | users.sortAsc(v, v).sortDesc(v, v).sortStableAsc(v, v).sortStableDesc(v, v)\n | ................................................^\nERROR: <input>:1:70: list(org.federation.User) is not comparable\n | users.sortAsc(v, v).sortDesc(v, v).sortStableAsc(v, v).sortStableDesc(v, v)\n | .....................................................................^\n55:    repeated User invalid = 3 [(grpc.federation.field).by = \"users.sortAsc(v, v).sortDesc(v, v).sortStableAsc(v, v).sortStableDesc(v, v)\"];\n                                                               ^\n`},\n\t\t{file: \"invalid_message_map.proto\", expected: `\ninvalid_message_map.proto:32:3: cannot convert type automatically: map key type is \"int32\" but specified map key type is \"string\"\n32:    map<int32, int32> map_value = 1 [(grpc.federation.field).by = \"map_value\"];\n       ^\ninvalid_message_map.proto:32:3: cannot convert type automatically: map value type is \"int32\" but specified map value type is \"string\"\n32:    map<int32, int32> map_value = 1 [(grpc.federation.field).by = \"map_value\"];\n       ^\ninvalid_message_map.proto:42:19: cannot convert type automatically: map key type is \"string\" but specified map key type is \"int64\"\n42:            request { field: \"ids\", by: \"$.ids\" }\n                       ^\ninvalid_message_map.proto:42:19: cannot convert type automatically: map value type is \"string\" but specified map value type is \"int64\"\n42:            request { field: \"ids\", by: \"$.ids\" }\n                       ^\n`},\n\t\t{file: \"invalid_message_map_alias.proto\", expected: `\ninvalid_message_map_alias.proto:39:3: cannot convert type automatically: map key type is \"string\" but specified map key type is \"int32\"\n39:    map<string, string> counts = 4;\n       ^\ninvalid_message_map_alias.proto:39:3: cannot convert type automatically: map value type is \"string\" but specified map value type is \"int32\"\n39:    map<string, string> counts = 4;\n       ^\n`},\n\t\t{file: \"invalid_file_import.proto\", expected: `\ninvalid_file_import.proto:6:8: [WARN] Import post.proto is used only for the definition of grpc federation. You can use grpc.federation.file.import instead.\n6:  import \"post.proto\";\n           ^\ninvalid_file_import.proto:12:5: [WARN] Import user.proto is unused for the definition of grpc federation.\n12:      \"user.proto\"\n         ^\n`},\n\t\t{file: \"nested_list.proto\", expected: `\nnested_list.proto:20:35: nested list is unsupported\n20:      def { name: \"nested_list\" by: \"[[1]]\" }\n                                       ^\n`},\n\t\t{file: \"invalid_service_variable_switch.proto\", expected: `\ninvalid_service_variable_switch.proto:15:23: default: all cases must return the same type, by must return a \"int64\" type, but got \"bool\" type\n15:          default { by: \"true\" }\n                           ^\n`},\n\t\t{file: \"missing_switch_case.proto\", expected: `\nmissing_switch_case.proto:22:14: at least one \"case\" must be defined\n22:        switch {\n                  ^\n`},\n\t\t{file: \"missing_switch_default.proto\", expected: `\nmissing_switch_default.proto:22:14: \"default\" must be defined\n22:        switch {\n                  ^\nmissing_switch_default.proto:22:14: ERROR: <input>:1:0: Syntax error: mismatched input '<EOF>' expecting {'[', '{', '(', '.', '-', '!', 'true', 'false', 'null', NUM_FLOAT, NUM_INT, NUM_UINT, STRING, BYTES, IDENTIFIER}\n22:        switch {\n                  ^\n`},\n\t\t{file: \"repeated_switch_default.proto\", expected: `\nrepeated_switch_default.proto:26:9: message org.federation.GetPostResponse: option (grpc.federation.message): non-repeated option field default already set\n`},\n\t\t{file: \"invalid_switch_case_if_type.proto\", expected: `\ninvalid_switch_case_if_type.proto:23:20: if must always return a boolean value\n23:          case { if: \"$.id\" by: \"1\" }\n                        ^\n`},\n\t\t{file: \"invalid_switch_case_by_type.proto\", expected: `\ninvalid_switch_case_by_type.proto:24:40: case 1: all cases must return the same type, by must return a \"int64\" type, but got \"string\" type\n24:          case { if: \"$.id == 'red'\" by: \"'mackerel'\" }\n                                            ^\n`},\n\t\t{file: \"invalid_switch_default_by_type.proto\", expected: `\ninvalid_switch_default_by_type.proto:25:23: default: all cases must return the same type, by must return a \"int64\" type, but got \"string\" type\n25:          default { by: \"'mackerel'\" }\n                           ^\n`},\n\t\t{file: \"invalid_field_type_by_switch.proto\", expected: `\ninvalid_field_type_by_switch.proto:29:3: cannot convert type automatically: field type is \"string\" but specified value type is \"int64\"\n29:    string switch = 1 [(grpc.federation.field).by = \"switch\"];\n       ^\n`},\n\t\t{file: \"conflict_switch_case_variable.proto\", expected: `\nconflict_switch_case_variable.proto:25:23: found duplicated variable name \"a\"\n25:            def { name: \"a\" by: \"1\" }\n                           ^\n`},\n\t\t{file: \"conflict_switch_default_variable.proto\", expected: `\nconflict_switch_default_variable.proto:27:23: found duplicated variable name \"a\"\n27:            def { name: \"a\" by: \"1\" }\n                           ^\n`},\n\t}\n\tfor _, test := range tests {\n\t\ttest := test\n\t\tt.Run(test.file, func(t *testing.T) {\n\t\t\tt.Parallel()\n\t\t\tctx := context.Background()\n\t\t\tv := validator.New()\n\t\t\tpath := filepath.Join(\"testdata\", test.file)\n\t\t\tf, err := os.ReadFile(path)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tfile, err := source.NewFile(path, f)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tgot := validator.Format(v.Validate(ctx, file, validator.ImportPathOption(\"testdata\")))\n\t\t\tif test.expected == \"\" {\n\t\t\t\tif got != \"\" {\n\t\t\t\t\tt.Errorf(\"expected to receive no validation error but got: %s\", got)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif diff := cmp.Diff(\"\\n\"+got, test.expected); diff != \"\" {\n\t\t\t\tt.Errorf(\"(-got, +want)\\n%s\", diff)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  }
]