|
|
|
@ -1223,6 +1223,25 @@ const (
|
|
|
|
|
// the application via the WhoIs API.
|
|
|
|
|
type PeerCapMap map[PeerCapability][]json.RawMessage
|
|
|
|
|
|
|
|
|
|
// UnmarshalCapJSON unmarshals each JSON value in cm[cap] as T.
|
|
|
|
|
// If cap does not exist in cm, it returns (nil, nil).
|
|
|
|
|
// It returns an error if the values cannot be unmarshaled into the provided type.
|
|
|
|
|
func UnmarshalCapJSON[T any](cm PeerCapMap, cap PeerCapability) ([]T, error) {
|
|
|
|
|
vals, ok := cm[cap]
|
|
|
|
|
if !ok {
|
|
|
|
|
return nil, nil
|
|
|
|
|
}
|
|
|
|
|
out := make([]T, 0, len(vals))
|
|
|
|
|
for _, v := range vals {
|
|
|
|
|
var t T
|
|
|
|
|
if err := json.Unmarshal(v, &t); err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
out = append(out, t)
|
|
|
|
|
}
|
|
|
|
|
return out, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// HasCapability reports whether c has the capability cap.
|
|
|
|
|
// This is used to test for the existence of a capability, especially
|
|
|
|
|
// when the capability has no values.
|
|
|
|
|