module Puppet::Pops
module Serialization
module Extension
# 0x00 - 0x0F are reserved for low-level serialization / tabulation extensions
# Tabulation internal to the low level protocol reader/writer
INNER_TABULATION = 0x00
# Tabulation managed by the serializer / deserializer
TABULATION = 0x01
# 0x10 - 0x1F are reserved for structural extensions
ARRAY_START = 0x10
MAP_START = 0x11
PCORE_OBJECT_START = 0x12
OBJECT_START = 0x13
SENSITIVE_START = 0x14
# 0x20 - 0x2f reserved for special extension objects
DEFAULT = 0x20
COMMENT = 0x21
# 0x30 - 0x7f reserved for mapping of specific runtime classes
REGEXP = 0x30
TYPE_REFERENCE = 0x31
SYMBOL = 0x32
TIME = 0x33
TIMESPAN = 0x34
VERSION = 0x35
VERSION_RANGE = 0x36
BINARY = 0x37
BASE64 = 0x38
URI = 0x39
# Marker module indicating whether or not an instance is tabulated or not
module NotTabulated; end
# Marker module for objects that starts a sequence, i.e. ArrayStart, MapStart, and PcoreObjectStart
module SequenceStart; end
# The class that triggers the use of the DEFAULT extension. It doesn't have any payload
class Default
include NotTabulated
INSTANCE = Default.new
end
# The class that triggers the use of the TABULATION extension. The payload is the tabulation index
class Tabulation
include NotTabulated
attr_reader :index
def initialize(index)
@index = index
end
end
# Tabulation internal to the protocol reader/writer
class InnerTabulation < Tabulation
end
# The class that triggers the use of the MAP_START extension. The payload is the map size (number of entries)
class MapStart
include NotTabulated
include SequenceStart
attr_reader :size
def initialize(size)
@size = size
end
# Sequence size is twice the map size since each entry is written as key and value
def sequence_size
@size * 2
end
end
# The class that triggers the use of the ARRAY_START extension. The payload is the array size
class ArrayStart
include NotTabulated
include SequenceStart
attr_reader :size
def initialize(size)
@size = size
end
def sequence_size
@size
end
end
# The class that triggers the use of the SENSITIVE_START extension. It has no payload
class SensitiveStart
include NotTabulated
INSTANCE = SensitiveStart.new
end
# The class that triggers the use of the PCORE_OBJECT_START extension. The payload is the name of the object type
# and the number of attributes in the instance.
class PcoreObjectStart
include SequenceStart
attr_reader :type_name, :attribute_count
def initialize(type_name, attribute_count)
@type_name = type_name
@attribute_count = attribute_count
end
def hash
@type_name.hash * 29 + attribute_count.hash
end
def eql?(o)
o.is_a?(PcoreObjectStart) && o.type_name == @type_name && o.attribute_count == @attribute_count
end
alias == eql?
def sequence_size
@attribute_count
end
end
class ObjectStart
include SequenceStart
attr_reader :attribute_count
def initialize(attribute_count)
@attribute_count = attribute_count
end
def hash
attribute_count.hash
end
def eql?(o)
o.is_a?(ObjectStart) && o.attribute_count == @attribute_count
end
alias == eql?
def sequence_size
@attribute_count
end
end
# The class that triggers the use of the COMMENT extension. The payload is comment text
class Comment
attr_reader :comment
def initialize(comment)
@comment = comment
end
def hash
@comment.hash
end
def eql?(o)
o.is_a?(Comment) && o.comment == @comment
end
alias == eql?
end
end
end
end
Copyright 2K16 - 2K18 Indonesian Hacker Rulez