private void ValidateTokenTypeForAttribute(CloudEventAttribute attribute, JsonValueKind valueKind) { // We can't validate unknown attributes, don't check for extension attributes, // and null values will be ignored anyway. if (attribute is null || attribute.IsExtension || valueKind == JsonValueKind.Null) { return; } // This is deliberately written so that if a new attribute type is added without this being updated, we "fail valid". // (That should only happen in major versions anyway, but it's worth being somewhat forgiving here.) var valid = CloudEventAttributeTypes.GetOrdinal(attribute.Type) switch { CloudEventAttributeTypeOrdinal.Binary => valueKind == JsonValueKind.String, CloudEventAttributeTypeOrdinal.Boolean => valueKind == JsonValueKind.True || valueKind == JsonValueKind.False, CloudEventAttributeTypeOrdinal.Integer => valueKind == JsonValueKind.Number, CloudEventAttributeTypeOrdinal.String => valueKind == JsonValueKind.String, CloudEventAttributeTypeOrdinal.Timestamp => valueKind == JsonValueKind.String, CloudEventAttributeTypeOrdinal.Uri => valueKind == JsonValueKind.String, CloudEventAttributeTypeOrdinal.UriReference => valueKind == JsonValueKind.String, _ => true }; if (!valid) { throw new ArgumentException($"Invalid token type '{valueKind}' for CloudEvent attribute '{attribute.Name}' with type '{attribute.Type}'"); } }
private void WriteCloudEventForBatchOrStructuredMode(Utf8JsonWriter writer, CloudEvent cloudEvent) { Validation.CheckCloudEventArgument(cloudEvent, nameof(cloudEvent)); writer.WriteStartObject(); writer.WritePropertyName(CloudEventsSpecVersion.SpecVersionAttribute.Name); writer.WriteStringValue(cloudEvent.SpecVersion.VersionId); var attributes = cloudEvent.GetPopulatedAttributes(); foreach (var keyValuePair in attributes) { var attribute = keyValuePair.Key; var value = keyValuePair.Value; writer.WritePropertyName(attribute.Name); switch (CloudEventAttributeTypes.GetOrdinal(attribute.Type)) { case CloudEventAttributeTypeOrdinal.Integer: writer.WriteNumberValue((int)value); break; case CloudEventAttributeTypeOrdinal.Boolean: writer.WriteBooleanValue((bool)value); break; default: writer.WriteStringValue(attribute.Type.Format(value)); break; } } if (cloudEvent.Data is object) { EncodeStructuredModeData(cloudEvent, writer); } writer.WriteEndObject(); }
public void GetOrdinal_NonNullInput(CloudEventAttributeType type) => Assert.Equal(type.Ordinal, CloudEventAttributeTypes.GetOrdinal(type));
public void GetOrdinal_NullInput() => Assert.Throws <ArgumentNullException>(() => CloudEventAttributeTypes.GetOrdinal(null));