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] )