"""paypalserversdk.

This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ).
"""

# ruff: noqa: E501

class PatchOp(object):
    """Implementation of the 'Patch Op' enum.

    The operation.

    Attributes:
        ADD: Depending on the target location reference, completes one of these
            functions: The target location is an array index. Inserts a new value
            into the array at the specified index. The target location is an object
            parameter that does not already exist. Adds a new parameter to the
            object. The target location is an object parameter that does exist.
            Replaces that parameter's value. The value parameter defines the value to
            add. For more information, see 4.1. add.
        REMOVE: Removes the value at the target location. For the operation to
            succeed, the target location must exist. For more information, see 4.2.
            remove.
        REPLACE: Replaces the value at the target location with a new value. The
            operation object must contain a value parameter that defines the
            replacement value. For the operation to succeed, the target location must
            exist. For more information, see 4.3. replace.
        MOVE: Removes the value at a specified location and adds it to the target
            location. The operation object must contain a from parameter, which is a
            string that contains a JSON pointer value that references the location in
            the target document from which to move the value. For the operation to
            succeed, the from location must exist. For more information, see 4.4.
            move.
        COPY: Copies the value at a specified location to the target location. The
            operation object must contain a from parameter, which is a string that
            contains a JSON pointer value that references the location in the target
            document from which to copy the value. For the operation to succeed, the
            from location must exist. For more information, see 4.5. copy.
        TEST: Tests that a value at the target location is equal to a specified
            value. The operation object must contain a value parameter that defines
            the value to compare to the target location's value. For the operation to
            succeed, the target location must be equal to the value value. For test,
            equal indicates that the value at the target location and the value that
            value defines are of the same JSON type. The data type of the value
            determines how equality is defined: Type Considered equal if both values
            strings Contain the same number of Unicode characters and their code
            points are byte-by-byte equal. numbers Are numerically equal. arrays
            Contain the same number of values, and each value is equal to the value
            at the corresponding position in the other array, by using these
            type-specific rules. objects Contain the same number of parameters, and
            each parameter is equal to a parameter in the other object, by comparing
            their keys (as strings) and their values (by using these type-specific
            rules). literals (false, true, and null) Are the same. The comparison is
            a logical comparison. For example, whitespace between the parameter
            values of an array is not significant. Also, ordering of the
            serialization of object parameters is not significant. For more
            information, see 4.6. test.

    """

    ADD = "add"

    REMOVE = "remove"

    REPLACE = "replace"

    MOVE = "move"

    COPY = "copy"

    TEST = "test"

    @classmethod
    def from_value(cls, value, default=None):
        """Return the matching enum value for the given input."""
        if value is None:
            return default

        # If numeric and matches directly
        if isinstance(value, int):
            for name, val in cls.__dict__.items():
                if not name.startswith("_") and val == value:
                    return val

        # If string, perform case-insensitive match
        if isinstance(value, str):
            value_lower = value.lower()
            for name, val in cls.__dict__.items():
                if not name.startswith("_") and (
                    name.lower() == value_lower or str(val).lower() == value_lower
                ):
                    return val

        # Fallback to default
        return default
