41 lines
1.4 KiB
Python
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)
|