Skip to content
24 changes: 23 additions & 1 deletion discord/commands/options.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,9 @@

import inspect
import logging
import types
from enum import Enum
from typing import TYPE_CHECKING, Literal, Optional, Type, Union
from typing import TYPE_CHECKING, Literal, Optional, Type, Union, get_args

from ..abc import GuildChannel, Mentionable
from ..channel import (
Expand Down Expand Up @@ -196,6 +197,7 @@ def __init__(
if self.name is not None:
self.name = str(self.name)
self._parameter_name = self.name # default
input_type = self._strip_none_type(input_type)
self._raw_type: InputType | tuple = input_type

enum_choices = []
Expand Down Expand Up @@ -365,6 +367,26 @@ def __init__(
if input_type is None:
raise TypeError("input_type cannot be NoneType.")

@staticmethod
def _strip_none_type(input_type):
if input_type is type(None):
raise TypeError("Option type cannot be only NoneType")

if isinstance(input_type, (types.UnionType, tuple)):
args = (
get_args(input_type)
if isinstance(input_type, types.UnionType)
else input_type
)
filtered = tuple(t for t in args if t is not type(None))
if not filtered:
raise TypeError("Option type cannot be only NoneType")
if len(filtered) == 1:
return filtered[0]
return filtered

return input_type

def to_dict(self) -> dict:
as_dict = {
"name": self.name,
Expand Down
Loading