rainbowadn/rainbowadn/hashing/resolverorigin.py

41 lines
1.4 KiB
Python

from typing import Generic, TypeVar
from rainbowadn.hashing.hashpoint import HashPoint
from rainbowadn.hashing.hashresolver import HashResolver
from rainbowadn.hashing.mentionable import Mentionable
from rainbowadn.hashing.origin import Origin
from rainbowadn.hashing.rainbow_factory import RainbowFactory
__all__ = ('ResolverOrigin',)
Mentioned = TypeVar('Mentioned')
class ResolverOrigin(Origin[Mentioned], Generic[Mentioned]):
def __init__(
self,
factory: RainbowFactory[Mentioned],
point: bytes,
resolver: HashResolver
):
assert isinstance(factory, RainbowFactory)
assert isinstance(point, bytes)
assert isinstance(resolver, HashResolver)
self.factory = factory
self.point = point
self.resolver = resolver
super().__init__(factory)
def resolve(self) -> Mentioned:
resolved, resolver = self.resolver.resolve(self.point)
assert isinstance(resolved, bytes)
assert isinstance(resolver, HashResolver)
mentioned: Mentioned = self.factory.from_bytes(resolved[HashPoint.HASH_LENGTH:], resolver)
assert isinstance(mentioned, Mentionable)
assert mentioned.__topology_hash__() == resolved[:HashPoint.HASH_LENGTH]
assert self.point == HashPoint.hash(HashPoint.bytes_of_mentioned(mentioned))
return mentioned
def hash_point(self) -> HashPoint[Mentioned]:
return HashPoint(self.point, self)