def parse
return @dn if @dn
rdns = []
scanner = StringScanner.new(@source)
scanner.scan(%r\s*/)
raise rdn_is_missing if scanner.scan(%r\s*\+\s*/)
raise name_component_is_missing if scanner.scan(%r\s*,\s*/)
rdn = {}
until scanner.eos?
type = scan_attribute_type(scanner)
skip_attribute_type_and_value_separator(scanner)
value = scan_attribute_value(scanner)
rdn[type] = value
if scanner.scan(%r\s*\+\s*/)
raise rdn_is_missing if scanner.eos?
elsif scanner.scan(%r\s*\,\s*/)
rdns << rdn
rdn = {}
raise name_component_is_missing if scanner.eos?
else
scanner.scan(%r\s*/)
rdns << rdn if scanner.eos?
end
end
@dn = DN.new(*rdns)
@dn
end