checking in- needs some refinement then done
This commit is contained in:
65
netsplit/funcs_ianaprefix.go
Normal file
65
netsplit/funcs_ianaprefix.go
Normal file
@@ -0,0 +1,65 @@
|
||||
package netsplit
|
||||
|
||||
import (
|
||||
`encoding/xml`
|
||||
`errors`
|
||||
`fmt`
|
||||
`io`
|
||||
`net/netip`
|
||||
`strings`
|
||||
)
|
||||
|
||||
// UnmarshalXML conforms an IANAPrefix to (encoding/xml).Unmarshaler.
|
||||
func (i *IANAPrefix) UnmarshalXML(d *xml.Decoder, start xml.StartElement) (err error) {
|
||||
|
||||
var tok xml.Token
|
||||
var nextRefIdx int
|
||||
var ref *IANARef
|
||||
var pfxStr []string
|
||||
var sb *strings.Builder = new(strings.Builder)
|
||||
|
||||
for {
|
||||
if tok, err = d.Token(); err != nil {
|
||||
if errors.Is(err, io.EOF) {
|
||||
err = nil
|
||||
break
|
||||
}
|
||||
return
|
||||
}
|
||||
switch t := tok.(type) {
|
||||
case xml.CharData:
|
||||
sb.Write(t)
|
||||
case xml.StartElement:
|
||||
switch t.Name.Local {
|
||||
case "xref":
|
||||
ref = new(IANARef)
|
||||
if err = d.DecodeElement(ref, &t); err != nil {
|
||||
return
|
||||
}
|
||||
if i.References == nil {
|
||||
i.References = make([]*IANARef, 0)
|
||||
}
|
||||
i.References = append(i.References, ref)
|
||||
// No reference for these; they should be only network addrs.
|
||||
// fmt.Fprintf(sb, "[REF %d]", nextRefIdx)
|
||||
nextRefIdx++
|
||||
default:
|
||||
fmt.Println(t.Name.Local)
|
||||
continue
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pfxStr = strings.Split(sb.String(), ",")
|
||||
i.Prefixes = make([]*netip.Prefix, len(pfxStr))
|
||||
for idx, p := range pfxStr {
|
||||
i.Prefixes[idx] = new(netip.Prefix)
|
||||
if *i.Prefixes[idx], err = netip.ParsePrefix(
|
||||
strings.TrimSpace(p),
|
||||
); err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
Reference in New Issue
Block a user