SetExtension sets an extension field in m to the provided value.
(m Message, xt *ExtensionDesc, v interface{})
| 221 | |
| 222 | // SetExtension sets an extension field in m to the provided value. |
| 223 | func SetExtension(m Message, xt *ExtensionDesc, v interface{}) error { |
| 224 | mr := MessageReflect(m) |
| 225 | if mr == nil || !mr.IsValid() || mr.Descriptor().ExtensionRanges().Len() == 0 { |
| 226 | return errNotExtendable |
| 227 | } |
| 228 | |
| 229 | rv := reflect.ValueOf(v) |
| 230 | if reflect.TypeOf(v) != reflect.TypeOf(xt.ExtensionType) { |
| 231 | return fmt.Errorf("proto: bad extension value type. got: %T, want: %T", v, xt.ExtensionType) |
| 232 | } |
| 233 | if rv.Kind() == reflect.Ptr { |
| 234 | if rv.IsNil() { |
| 235 | return fmt.Errorf("proto: SetExtension called with nil value of type %T", v) |
| 236 | } |
| 237 | if isScalarKind(rv.Elem().Kind()) { |
| 238 | v = rv.Elem().Interface() |
| 239 | } |
| 240 | } |
| 241 | |
| 242 | xtd := xt.TypeDescriptor() |
| 243 | if !isValidExtension(mr.Descriptor(), xtd) { |
| 244 | return fmt.Errorf("proto: bad extended type; %T does not extend %T", xt.ExtendedType, m) |
| 245 | } |
| 246 | mr.Set(xtd, xt.ValueOf(v)) |
| 247 | clearUnknown(mr, fieldNum(xt.Field)) |
| 248 | return nil |
| 249 | } |
| 250 | |
| 251 | // SetRawExtension inserts b into the unknown fields of m. |
| 252 | // |