// assignEventMetric updates the "Metric" fields of the underlying protobuf Event type based on the type of value provided func assignEventMetric(e *proto.Event, v interface{}) error { switch x := v.(type) { case nil: // do nothing; an event without a metric is legitimate case int: i := int64(x) e.MetricSint64 = &i case int32: i := int64(x) e.MetricSint64 = &i case int64: e.MetricSint64 = &x case float32: e.MetricF = &x case float64: e.MetricD = &x default: return fmt.Errorf("Metric of invalid type (type %T)", v) } return nil }