40 lines
888 B
Go
40 lines
888 B
Go
package main
|
|
|
|
import (
|
|
"encoding"
|
|
"fmt"
|
|
"isle/nebula"
|
|
"net/netip"
|
|
)
|
|
|
|
type textUnmarshaler[T any] interface {
|
|
encoding.TextUnmarshaler
|
|
*T
|
|
}
|
|
|
|
type textUnmarshalerFlag[T encoding.TextMarshaler, P textUnmarshaler[T]] struct {
|
|
V T
|
|
}
|
|
|
|
func (f *textUnmarshalerFlag[T, P]) Set(v string) error {
|
|
return P(&(f.V)).UnmarshalText([]byte(v))
|
|
}
|
|
|
|
func (f *textUnmarshalerFlag[T, P]) String() string {
|
|
b, err := f.V.MarshalText()
|
|
if err != nil {
|
|
panic(fmt.Sprintf("calling MarshalText on %#v: %v", f.V, err))
|
|
}
|
|
return string(b)
|
|
}
|
|
|
|
func (f *textUnmarshalerFlag[T, P]) Type() string { return "string" }
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
type (
|
|
hostNameFlag = textUnmarshalerFlag[nebula.HostName, *nebula.HostName]
|
|
ipNetFlag = textUnmarshalerFlag[nebula.IPNet, *nebula.IPNet]
|
|
ipFlag = textUnmarshalerFlag[netip.Addr, *netip.Addr]
|
|
)
|