class ElasticAPM::TraceContext::Traceparent

@api private

def self.parse(header)

def self.parse(header)
  raise_invalid(header) unless header.length == 55
  raise_invalid(header) unless header[0..1] == VERSION
  new.tap do |t|
    t.version, t.trace_id, t.parent_id, t.flags =
      header.split('-').tap do |values|
        values[-1] = Util.hex_to_bits(values[-1])
      end
    raise_invalid(header) if NON_HEX_REGEX.match?(t.trace_id)
    raise_invalid(header) if NON_HEX_REGEX.match?(t.parent_id)
  end
end

def child

def child
  dup.tap do |copy|
    copy.parent_id = id
    copy.id = hex(ID_LENGTH)
  end
end

def ensure_parent_id

def ensure_parent_id
  @parent_id ||= hex(ID_LENGTH)
end

def flags

def flags
  format('0000000%d', recorded? ? 1 : 0)
end

def flags=(flags)

def flags=(flags)
  @flags = flags
  self.recorded = flags[7] == '1'
end

def hex(len)

def hex(len)
  SecureRandom.hex(len)
end

def hex_flags

def hex_flags
  format('%02x', flags.to_i(2))
end

def initialize(

def initialize(
  version: VERSION,
  trace_id: nil,
  parent_id: nil,
  id: nil,
  recorded: true
)
  @version = version
  @trace_id = trace_id || hex(TRACE_ID_LENGTH)
  @parent_id = parent_id
  @id = id || hex(ID_LENGTH)
  @recorded = recorded
end

def raise_invalid(header)

def raise_invalid(header)
  raise InvalidTraceparentHeader,
    "Couldn't parse invalid traceparent header: #{header.inspect}"
end

def to_header

def to_header
  format('%s-%s-%s-%s', version, trace_id, id, hex_flags)
end