# Copyright (c) 2025-2026 Buf Technologies, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Generated from google/protobuf/api.proto. DO NOT EDIT.
# Generated by protoc-gen-py v0.1.1 with parameter "no_fmt_off".
# ruff: noqa: PGH004
# ruff: noqa

from __future__ import annotations

from typing import Literal, TYPE_CHECKING, TypeAlias

from protobuf import Message
from protobuf._codegen import file_desc

from . import source_context_pb, type_pb

if TYPE_CHECKING:
    from protobuf import DescFile

    from .source_context_pb import SourceContext
    from .type_pb import Option, Syntax


_ApiFields: TypeAlias = Literal[
    "name",
    "methods",
    "options",
    "version",
    "source_context",
    "mixins",
    "syntax",
    "edition",
]


class Api(Message[_ApiFields]):
    """
    Api is a light-weight descriptor for an API Interface.

    Interfaces are also described as "protocol buffer services" in some contexts,
    such as by the "service" keyword in a .proto file, but they are different
    from API Services, which represent a concrete implementation of an interface
    as opposed to simply a description of methods and bindings. They are also
    sometimes simply referred to as "APIs" in other contexts, such as the name of
    this message itself. See https://cloud.google.com/apis/design/glossary for
    detailed terminology.

    New usages of this message as an alternative to ServiceDescriptorProto are
    strongly discouraged. This message does not reliability preserve all
    information necessary to model the schema and preserve semantics. Instead
    make use of FileDescriptorSet which preserves the necessary information.

    ```proto
    message google.protobuf.Api
    ```

    Attributes:
        name:
            The fully qualified name of this interface, including package name
            followed by the interface's simple name.

            ```proto
            string name = 1;
            ```
        methods:
            The methods of this interface, in unspecified order.

            ```proto
            repeated google.protobuf.Method methods = 2;
            ```
        options:
            Any metadata attached to the interface.

            ```proto
            repeated google.protobuf.Option options = 3;
            ```
        version:
            A version string for this interface. If specified, must have the form
            `major-version.minor-version`, as in `1.10`. If the minor version is
            omitted, it defaults to zero. If the entire version field is empty, the
            major version is derived from the package name, as outlined below. If the
            field is not empty, the version in the package name will be verified to be
            consistent with what is provided here.

            The versioning schema uses [semantic
            versioning](http://semver.org) where the major version number
            indicates a breaking change and the minor version an additive,
            non-breaking change. Both version numbers are signals to users
            what to expect from different versions, and should be carefully
            chosen based on the product plan.

            The major version is also reflected in the package name of the
            interface, which must end in `v<major-version>`, as in
            `google.feature.v1`. For major versions 0 and 1, the suffix can
            be omitted. Zero major versions must only be used for
            experimental, non-GA interfaces.


            ```proto
            string version = 4;
            ```
        source_context:
            Source context for the protocol buffer service represented by this
            message.

            ```proto
            optional google.protobuf.SourceContext source_context = 5;
            ```
        mixins:
            Included interfaces. See [Mixin][].

            ```proto
            repeated google.protobuf.Mixin mixins = 6;
            ```
        syntax:
            The source syntax of the service.

            ```proto
            google.protobuf.Syntax syntax = 7;
            ```
        edition:
            The source edition string, only valid when syntax is SYNTAX_EDITIONS.

            ```proto
            string edition = 8;
            ```
    """

    __slots__ = (
        "name",
        "methods",
        "options",
        "version",
        "source_context",
        "mixins",
        "syntax",
        "edition",
    )

    if TYPE_CHECKING:

        def __init__(
            self,
            *,
            name: str = "",
            methods: list[Method] | None = None,
            options: list[Option] | None = None,
            version: str = "",
            source_context: SourceContext | None = None,
            mixins: list[Mixin] | None = None,
            syntax: Syntax | None = None,
            edition: str = "",
        ) -> None:
            pass

        name: str
        methods: list[Method]
        options: list[Option]
        version: str
        source_context: SourceContext | None
        mixins: list[Mixin]
        syntax: Syntax
        edition: str


_MethodFields: TypeAlias = Literal[
    "name",
    "request_type_url",
    "request_streaming",
    "response_type_url",
    "response_streaming",
    "options",
    "syntax",
    "edition",
]


class Method(Message[_MethodFields]):
    """
    Method represents a method of an API interface.

    New usages of this message as an alternative to MethodDescriptorProto are
    strongly discouraged. This message does not reliability preserve all
    information necessary to model the schema and preserve semantics. Instead
    make use of FileDescriptorSet which preserves the necessary information.

    ```proto
    message google.protobuf.Method
    ```

    Attributes:
        name:
            The simple name of this method.

            ```proto
            string name = 1;
            ```
        request_type_url:
            A URL of the input message type.

            ```proto
            string request_type_url = 2;
            ```
        request_streaming:
            If true, the request is streamed.

            ```proto
            bool request_streaming = 3;
            ```
        response_type_url:
            The URL of the output message type.

            ```proto
            string response_type_url = 4;
            ```
        response_streaming:
            If true, the response is streamed.

            ```proto
            bool response_streaming = 5;
            ```
        options:
            Any metadata attached to the method.

            ```proto
            repeated google.protobuf.Option options = 6;
            ```
        syntax:
            The source syntax of this method.

            This field should be ignored, instead the syntax should be inherited from
            Api. This is similar to Field and EnumValue.

            ```proto
            google.protobuf.Syntax syntax = 7 [deprecated = true];
            ```
        edition:
            The source edition string, only valid when syntax is SYNTAX_EDITIONS.

            This field should be ignored, instead the edition should be inherited from
            Api. This is similar to Field and EnumValue.

            ```proto
            string edition = 8 [deprecated = true];
            ```
    """

    __slots__ = (
        "name",
        "request_type_url",
        "request_streaming",
        "response_type_url",
        "response_streaming",
        "options",
        "syntax",
        "edition",
    )

    if TYPE_CHECKING:

        def __init__(
            self,
            *,
            name: str = "",
            request_type_url: str = "",
            request_streaming: bool = False,
            response_type_url: str = "",
            response_streaming: bool = False,
            options: list[Option] | None = None,
            syntax: Syntax | None = None,
            edition: str = "",
        ) -> None:
            pass

        name: str
        request_type_url: str
        request_streaming: bool
        response_type_url: str
        response_streaming: bool
        options: list[Option]
        syntax: Syntax
        edition: str


_MixinFields: TypeAlias = Literal["name", "root"]


class Mixin(Message[_MixinFields]):
    """
    Declares an API Interface to be included in this interface. The including
    interface must redeclare all the methods from the included interface, but
    documentation and options are inherited as follows:

    - If after comment and whitespace stripping, the documentation
      string of the redeclared method is empty, it will be inherited
      from the original method.

    - Each annotation belonging to the service config (http,
      visibility) which is not set in the redeclared method will be
      inherited.

    - If an http annotation is inherited, the path pattern will be
      modified as follows. Any version prefix will be replaced by the
      version of the including interface plus the [root][] path if
      specified.

    Example of a simple mixin:

        package google.acl.v1;
        service AccessControl {
          // Get the underlying ACL object.
          rpc GetAcl(GetAclRequest) returns (Acl) {
            option (google.api.http).get = "/v1/{resource=**}:getAcl";
          }
        }

        package google.storage.v2;
        service Storage {
          rpc GetAcl(GetAclRequest) returns (Acl);

          // Get a data record.
          rpc GetData(GetDataRequest) returns (Data) {
            option (google.api.http).get = "/v2/{resource=**}";
          }
        }

    Example of a mixin configuration:

        apis:
        - name: google.storage.v2.Storage
          mixins:
          - name: google.acl.v1.AccessControl

    The mixin construct implies that all methods in `AccessControl` are
    also declared with same name and request/response types in
    `Storage`. A documentation generator or annotation processor will
    see the effective `Storage.GetAcl` method after inheriting
    documentation and annotations as follows:

        service Storage {
          // Get the underlying ACL object.
          rpc GetAcl(GetAclRequest) returns (Acl) {
            option (google.api.http).get = "/v2/{resource=**}:getAcl";
          }
          ...
        }

    Note how the version in the path pattern changed from `v1` to `v2`.

    If the `root` field in the mixin is specified, it should be a
    relative path under which inherited HTTP paths are placed. Example:

        apis:
        - name: google.storage.v2.Storage
          mixins:
          - name: google.acl.v1.AccessControl
            root: acls

    This implies the following inherited HTTP annotation:

        service Storage {
          // Get the underlying ACL object.
          rpc GetAcl(GetAclRequest) returns (Acl) {
            option (google.api.http).get = "/v2/acls/{resource=**}:getAcl";
          }
          ...
        }

    ```proto
    message google.protobuf.Mixin
    ```

    Attributes:
        name:
            The fully qualified name of the interface which is included.

            ```proto
            string name = 1;
            ```
        root:
            If non-empty specifies a path under which inherited HTTP paths
            are rooted.

            ```proto
            string root = 2;
            ```
    """

    __slots__ = ("name", "root")

    if TYPE_CHECKING:

        def __init__(self, *, name: str = "", root: str = "") -> None:
            pass

        name: str
        root: str


_DESC = file_desc(
    b'\n\x19google/protobuf/api.proto\x12\x0fgoogle.protobuf\x1a$google/protobuf/source_context.proto\x1a\x1agoogle/protobuf/type.proto"\xdb\x02\n\x03Api\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x121\n\x07methods\x18\x02 \x03(\x0b2\x17.google.protobuf.MethodR\x07methods\x121\n\x07options\x18\x03 \x03(\x0b2\x17.google.protobuf.OptionR\x07options\x12\x18\n\x07version\x18\x04 \x01(\tR\x07version\x12E\n\x0esource_context\x18\x05 \x01(\x0b2\x1e.google.protobuf.SourceContextR\rsourceContext\x12.\n\x06mixins\x18\x06 \x03(\x0b2\x16.google.protobuf.MixinR\x06mixins\x12/\n\x06syntax\x18\x07 \x01(\x0e2\x17.google.protobuf.SyntaxR\x06syntax\x12\x18\n\x07edition\x18\x08 \x01(\tR\x07edition"\xd4\x02\n\x06Method\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12(\n\x10request_type_url\x18\x02 \x01(\tR\x0erequestTypeUrl\x12+\n\x11request_streaming\x18\x03 \x01(\x08R\x10requestStreaming\x12*\n\x11response_type_url\x18\x04 \x01(\tR\x0fresponseTypeUrl\x12-\n\x12response_streaming\x18\x05 \x01(\x08R\x11responseStreaming\x121\n\x07options\x18\x06 \x03(\x0b2\x17.google.protobuf.OptionR\x07options\x123\n\x06syntax\x18\x07 \x01(\x0e2\x17.google.protobuf.SyntaxR\x06syntaxB\x02\x18\x01\x12\x1c\n\x07edition\x18\x08 \x01(\tR\x07editionB\x02\x18\x01"/\n\x05Mixin\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x12\n\x04root\x18\x02 \x01(\tR\x04rootBv\n\x13com.google.protobufB\x08ApiProtoP\x01Z,google.golang.org/protobuf/types/known/apipb\xa2\x02\x03GPB\xaa\x02\x1eGoogle.Protobuf.WellKnownTypesb\x06proto3',
    [source_context_pb.desc(), type_pb.desc()],
    {"Api": Api, "Method": Method, "Mixin": Mixin},
)


def desc() -> DescFile:
    """Returns the descriptor for the file `google/protobuf/api.proto`."""
    return _DESC
