# Copyright (C) 2023-2024 IBM Corp.
# SPDX-License-Identifier: Apache-2.0
from enum import auto, Flag
from typing import NoReturn, Optional, Union
from .kif_object import KIF_Object, TCallable
from .value import Property, Value
at_property = property
TSnakMask = Union['SnakMask', int]
[docs]
class SnakMask(Flag):
"""Mask representing concrete snak classes."""
#: Mask representing ValueSnak's.
VALUE_SNAK = auto()
#: Mask representing SomeValueSnak's.
SOME_VALUE_SNAK = auto()
#: Mask representing NoValueSnak's.
NO_VALUE_SNAK = auto()
#: Mask representing all snak classes.
ALL = (VALUE_SNAK | SOME_VALUE_SNAK | NO_VALUE_SNAK)
[docs]
class Snak(KIF_Object):
"""Abstract base class for snaks."""
#: Alias for :attr:`SnakMask.VALUE_SNAK`.
VALUE_SNAK = SnakMask.VALUE_SNAK
#: Alias for :attr:`SnakMask.SOME_VALUE_SNAK`.
SOME_VALUE_SNAK = SnakMask.SOME_VALUE_SNAK
#: Alias for :attr:`SnakMask.NO_VALUE_SNAK`.
NO_VALUE_SNAK = SnakMask.NO_VALUE_SNAK
#: Alias for :attr:`SnakMask.ALL`.
ALL = SnakMask.ALL
@classmethod
def _check_arg_snak_mask(
cls,
arg: TSnakMask,
function: Optional[Union[TCallable, str]] = None,
name: Optional[str] = None,
position: Optional[int] = None
) -> Union[SnakMask, NoReturn]:
return SnakMask(cls._check_arg_isinstance(
arg, (SnakMask, int), function, name, position))
@classmethod
def _check_optional_arg_snak_mask(
cls,
arg: Optional[TSnakMask],
default: Optional[SnakMask] = None,
function: Optional[Union[TCallable, str]] = None,
name: Optional[str] = None,
position: Optional[int] = None
) -> Union[Optional[SnakMask], NoReturn]:
if arg is None:
return default
else:
return cls._check_arg_snak_mask(
arg, function, name, position)
@classmethod
def _preprocess_arg_snak_mask(
cls,
arg: TSnakMask,
i: int,
function: Optional[Union[TCallable, str]] = None
) -> Union[SnakMask, NoReturn]:
return cls._check_arg_snak_mask(arg, function or cls, None, i)
@classmethod
def _preprocess_optional_arg_snak_mask(
cls,
arg,
i: int,
default: Optional[SnakMask] = None,
function: Optional[Union[TCallable, str]] = None
) -> Union[Optional[SnakMask], NoReturn]:
return cls._check_optional_arg_snak_mask(
arg, default, function or cls, None, i)
@property
def property(self) -> Property:
"""Snak property."""
return self.get_property()
[docs]
def get_property(self) -> Property:
"""Gets snak property.
Returns:
Snak property.
"""
return self.args[0]
_snak_mask = SnakMask.ALL
@at_property
def snak_mask(self) -> SnakMask:
"""The most specific snak mask for snak."""
return self.get_snak_mask()
[docs]
def get_snak_mask(self) -> SnakMask:
"""Gets the most specific snak mask for snak.
Returns:
The most specific snak mask for snak.
"""
return self._snak_mask
[docs]
class ValueSnak(Snak):
"""Snak associating a property to a value.
Parameters:
arg1: Property.
arg2: Value.
"""
_snak_mask = SnakMask.VALUE_SNAK
[docs]
def __init__(self, arg1: Property, arg2: Value):
return super().__init__(arg1, arg2)
def _preprocess_arg(self, arg, i):
if i == 1:
return self._preprocess_arg_property(arg, i)
elif i == 2:
return self._preprocess_arg_value(arg, i)
else:
raise self._should_not_get_here()
@property
def value(self) -> Value:
"""Snak value."""
return self.get_value()
[docs]
def get_value(self) -> Value:
"""Gets snak value.
Returns:
Snak value.
"""
return self.args[1]
[docs]
class SomeValueSnak(Snak):
"""Snak associating a property to some unspecified value.
Parameters:
arg1: Property.
"""
_snak_mask = SnakMask.SOME_VALUE_SNAK
[docs]
def __init__(self, arg1: Property):
return super().__init__(arg1)
def _preprocess_arg(self, arg, i):
if i == 1:
return self._preprocess_arg_property(arg, i)
else:
raise self._should_not_get_here()
[docs]
class NoValueSnak(Snak):
"""Snak associating a property to no value.
Parameters:
arg1: Property.
"""
_snak_mask = SnakMask.NO_VALUE_SNAK
[docs]
def __init__(self, arg1: Property):
return super().__init__(arg1)
def _preprocess_arg(self, arg, i):
if i == 1:
return self._preprocess_arg_property(arg, i)
else:
raise self._should_not_get_here()