53 lines
1.7 KiB
Python
53 lines
1.7 KiB
Python
from pyasn1 import error
|
|
|
|
class TagMap:
|
|
def __init__(self, posMap={}, negMap={}, defType=None):
|
|
self.__posMap = posMap.copy()
|
|
self.__negMap = negMap.copy()
|
|
self.__defType = defType
|
|
|
|
def __contains__(self, tagSet):
|
|
return tagSet in self.__posMap or \
|
|
self.__defType is not None and tagSet not in self.__negMap
|
|
|
|
def __getitem__(self, tagSet):
|
|
if tagSet in self.__posMap:
|
|
return self.__posMap[tagSet]
|
|
elif tagSet in self.__negMap:
|
|
raise error.PyAsn1Error('Key in negative map')
|
|
elif self.__defType is not None:
|
|
return self.__defType
|
|
else:
|
|
raise KeyError()
|
|
|
|
def __repr__(self):
|
|
s = '%r/%r' % (self.__posMap, self.__negMap)
|
|
if self.__defType is not None:
|
|
s = s + '/%r' % (self.__defType,)
|
|
return s
|
|
|
|
def clone(self, parentType, tagMap, uniq=False):
|
|
if self.__defType is not None and tagMap.getDef() is not None:
|
|
raise error.PyAsn1Error('Duplicate default value at %s' % (self,))
|
|
if tagMap.getDef() is not None:
|
|
defType = tagMap.getDef()
|
|
else:
|
|
defType = self.__defType
|
|
|
|
posMap = self.__posMap.copy()
|
|
for k in tagMap.getPosMap():
|
|
if uniq and k in posMap:
|
|
raise error.PyAsn1Error('Duplicate positive key %s' % (k,))
|
|
posMap[k] = parentType
|
|
|
|
negMap = self.__negMap.copy()
|
|
negMap.update(tagMap.getNegMap())
|
|
|
|
return self.__class__(
|
|
posMap, negMap, defType,
|
|
)
|
|
|
|
def getPosMap(self): return self.__posMap.copy()
|
|
def getNegMap(self): return self.__negMap.copy()
|
|
def getDef(self): return self.__defType
|