Change ICloudEventFormatter into an abstract class

Obviously the name is then inappropriate, but that will be changed in a subsequent commit.

Signed-off-by: Jon Skeet <jonskeet@google.com>
This commit is contained in:
Jon Skeet 2021-02-15 10:49:46 +00:00 committed by Jon Skeet
parent 8b63348296
commit c3495d0a55
3 changed files with 25 additions and 20 deletions

View File

@ -40,10 +40,10 @@ namespace CloudNative.CloudEvents
DecodeStructuredEvent(data, (IEnumerable<CloudEventAttribute>)extensionAttributes); DecodeStructuredEvent(data, (IEnumerable<CloudEventAttribute>)extensionAttributes);
// FIXME: We shouldn't use synchronous stream methods... // FIXME: We shouldn't use synchronous stream methods...
public Task<CloudEvent> DecodeStructuredEventAsync(Stream data, IEnumerable<CloudEventAttribute> extensionAttributes) => public override Task<CloudEvent> DecodeStructuredEventAsync(Stream data, IEnumerable<CloudEventAttribute> extensionAttributes) =>
Task.FromResult(DecodeStructuredEvent(data, extensionAttributes)); Task.FromResult(DecodeStructuredEvent(data, extensionAttributes));
public CloudEvent DecodeStructuredEvent(Stream data, IEnumerable<CloudEventAttribute> extensionAttributes) public override CloudEvent DecodeStructuredEvent(Stream data, IEnumerable<CloudEventAttribute> extensionAttributes)
{ {
var decoder = new Avro.IO.BinaryDecoder(data); var decoder = new Avro.IO.BinaryDecoder(data);
var rawEvent = avroReader.Read<GenericRecord>(null, decoder); var rawEvent = avroReader.Read<GenericRecord>(null, decoder);
@ -53,7 +53,7 @@ namespace CloudNative.CloudEvents
public CloudEvent DecodeStructuredEvent(byte[] data, params CloudEventAttribute[] extensionAttributes) => public CloudEvent DecodeStructuredEvent(byte[] data, params CloudEventAttribute[] extensionAttributes) =>
DecodeStructuredEvent(data, (IEnumerable<CloudEventAttribute>) extensionAttributes); DecodeStructuredEvent(data, (IEnumerable<CloudEventAttribute>) extensionAttributes);
public CloudEvent DecodeStructuredEvent(byte[] data, IEnumerable<CloudEventAttribute> extensionAttributes) => public override CloudEvent DecodeStructuredEvent(byte[] data, IEnumerable<CloudEventAttribute> extensionAttributes) =>
DecodeStructuredEvent(new MemoryStream(data), extensionAttributes); DecodeStructuredEvent(new MemoryStream(data), extensionAttributes);
public CloudEvent DecodeGenericRecord(GenericRecord record, IEnumerable<CloudEventAttribute> extensionAttributes) public CloudEvent DecodeGenericRecord(GenericRecord record, IEnumerable<CloudEventAttribute> extensionAttributes)
@ -106,7 +106,7 @@ namespace CloudNative.CloudEvents
return cloudEvent; return cloudEvent;
} }
public byte[] EncodeStructuredEvent(CloudEvent cloudEvent, out ContentType contentType) public override byte[] EncodeStructuredEvent(CloudEvent cloudEvent, out ContentType contentType)
{ {
contentType = new ContentType(CloudEvent.MediaType+AvroEventFormatter.MediaTypeSuffix); contentType = new ContentType(CloudEvent.MediaType+AvroEventFormatter.MediaTypeSuffix);
@ -148,10 +148,10 @@ namespace CloudNative.CloudEvents
} }
// TODO: Validate that this is correct... // TODO: Validate that this is correct...
public byte[] EncodeData(object value) => public override byte[] EncodeData(object value) =>
throw new NotSupportedException("The Avro event formatter does not support binary content mode"); throw new NotSupportedException("The Avro event formatter does not support binary content mode");
public object DecodeData(byte[] value, string contentType) => public override object DecodeData(byte[] value, string contentType) =>
throw new NotSupportedException("The Avro event formatter does not support binary content mode"); throw new NotSupportedException("The Avro event formatter does not support binary content mode");
} }
} }

View File

@ -25,7 +25,7 @@ namespace CloudNative.CloudEvents.NewtonsoftJson
public CloudEvent DecodeStructuredEvent(Stream data, params CloudEventAttribute[] extensionAttributes) => public CloudEvent DecodeStructuredEvent(Stream data, params CloudEventAttribute[] extensionAttributes) =>
DecodeStructuredEvent(data, (IEnumerable<CloudEventAttribute>) extensionAttributes); DecodeStructuredEvent(data, (IEnumerable<CloudEventAttribute>) extensionAttributes);
public async Task<CloudEvent> DecodeStructuredEventAsync(Stream data, IEnumerable<CloudEventAttribute> extensionAttributes) public override async Task<CloudEvent> DecodeStructuredEventAsync(Stream data, IEnumerable<CloudEventAttribute> extensionAttributes)
{ {
var jsonReader = new JsonTextReader(new StreamReader(data, Encoding.UTF8, true, 8192, true)) var jsonReader = new JsonTextReader(new StreamReader(data, Encoding.UTF8, true, 8192, true))
{ {
@ -35,7 +35,7 @@ namespace CloudNative.CloudEvents.NewtonsoftJson
return DecodeJObject(jObject, extensionAttributes); return DecodeJObject(jObject, extensionAttributes);
} }
public CloudEvent DecodeStructuredEvent(Stream data, IEnumerable<CloudEventAttribute> extensionAttributes = null) public override CloudEvent DecodeStructuredEvent(Stream data, IEnumerable<CloudEventAttribute> extensionAttributes = null)
{ {
var jsonReader = new JsonTextReader(new StreamReader(data, Encoding.UTF8, true, 8192, true)) var jsonReader = new JsonTextReader(new StreamReader(data, Encoding.UTF8, true, 8192, true))
{ {
@ -48,7 +48,7 @@ namespace CloudNative.CloudEvents.NewtonsoftJson
public CloudEvent DecodeStructuredEvent(byte[] data, params CloudEventAttribute[] extensionAttributes) => public CloudEvent DecodeStructuredEvent(byte[] data, params CloudEventAttribute[] extensionAttributes) =>
DecodeStructuredEvent(data, (IEnumerable<CloudEventAttribute>)extensionAttributes); DecodeStructuredEvent(data, (IEnumerable<CloudEventAttribute>)extensionAttributes);
public CloudEvent DecodeStructuredEvent(byte[] data, IEnumerable<CloudEventAttribute> extensionAttributes = null) => public override CloudEvent DecodeStructuredEvent(byte[] data, IEnumerable<CloudEventAttribute> extensionAttributes = null) =>
DecodeStructuredEvent(new MemoryStream(data), extensionAttributes); DecodeStructuredEvent(new MemoryStream(data), extensionAttributes);
// TODO: If we make this private, we'll have significantly more control over what token types we see. // TODO: If we make this private, we'll have significantly more control over what token types we see.
@ -117,7 +117,7 @@ namespace CloudNative.CloudEvents.NewtonsoftJson
return cloudEvent; return cloudEvent;
} }
public byte[] EncodeStructuredEvent(CloudEvent cloudEvent, out ContentType contentType) public override byte[] EncodeStructuredEvent(CloudEvent cloudEvent, out ContentType contentType)
{ {
contentType = new ContentType("application/cloudevents+json") contentType = new ContentType("application/cloudevents+json")
{ {
@ -157,7 +157,7 @@ namespace CloudNative.CloudEvents.NewtonsoftJson
} }
// TODO: How should the caller know whether the result is "raw" or should be stored in data_base64? // TODO: How should the caller know whether the result is "raw" or should be stored in data_base64?
public byte[] EncodeData(object value) public override byte[] EncodeData(object value)
{ {
// TODO: Check this is what we want. // TODO: Check this is what we want.
// In particular, if this is just other text or binary data, rather than JSON, what does it // In particular, if this is just other text or binary data, rather than JSON, what does it
@ -173,7 +173,7 @@ namespace CloudNative.CloudEvents.NewtonsoftJson
return json is null ? new byte[0] : Encoding.UTF8.GetBytes(json); return json is null ? new byte[0] : Encoding.UTF8.GetBytes(json);
} }
public object DecodeData(byte[] value, string contentType) public override object DecodeData(byte[] value, string contentType)
{ {
if (contentType == "application/json") if (contentType == "application/json")
{ {

View File

@ -2,6 +2,7 @@
// Licensed under the Apache 2.0 license. // Licensed under the Apache 2.0 license.
// See LICENSE file in the project root for full license information. // See LICENSE file in the project root for full license information.
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Net.Mime; using System.Net.Mime;
@ -12,7 +13,7 @@ namespace CloudNative.CloudEvents
/// <summary> /// <summary>
/// Implemented by formatters /// Implemented by formatters
/// </summary> /// </summary>
public interface ICloudEventFormatter public abstract class ICloudEventFormatter
{ {
/// <summary> /// <summary>
/// Decode a structured event from a stream /// Decode a structured event from a stream
@ -20,7 +21,8 @@ namespace CloudNative.CloudEvents
/// <param name="data"></param> /// <param name="data"></param>
/// <param name="extensions"></param> /// <param name="extensions"></param>
/// <returns></returns> /// <returns></returns>
CloudEvent DecodeStructuredEvent(Stream data, IEnumerable<CloudEventAttribute> extensionAttributes); public virtual CloudEvent DecodeStructuredEvent(Stream data, IEnumerable<CloudEventAttribute> extensionAttributes) =>
throw new NotImplementedException();
/// <summary> /// <summary>
/// Decode a structured event from a stream asynchonously /// Decode a structured event from a stream asynchonously
@ -28,7 +30,8 @@ namespace CloudNative.CloudEvents
/// <param name="data"></param> /// <param name="data"></param>
/// <param name="extensions"></param> /// <param name="extensions"></param>
/// <returns></returns> /// <returns></returns>
Task<CloudEvent> DecodeStructuredEventAsync(Stream data, IEnumerable<CloudEventAttribute> extensionAttributes); public virtual Task<CloudEvent> DecodeStructuredEventAsync(Stream data, IEnumerable<CloudEventAttribute> extensionAttributes) =>
throw new NotImplementedException();
// TODO: Remove either this one or the stream one? It seems unnecessary to have both. // TODO: Remove either this one or the stream one? It seems unnecessary to have both.
@ -38,7 +41,8 @@ namespace CloudNative.CloudEvents
/// <param name="data"></param> /// <param name="data"></param>
/// <param name="extensions"></param> /// <param name="extensions"></param>
/// <returns></returns> /// <returns></returns>
CloudEvent DecodeStructuredEvent(byte[] data, IEnumerable<CloudEventAttribute> extensionAttributes); public virtual CloudEvent DecodeStructuredEvent(byte[] data, IEnumerable<CloudEventAttribute> extensionAttributes) =>
throw new NotImplementedException();
/// <summary> /// <summary>
/// Encode an structured event into a byte array /// Encode an structured event into a byte array
@ -46,11 +50,12 @@ namespace CloudNative.CloudEvents
/// <param name="cloudEvent"></param> /// <param name="cloudEvent"></param>
/// <param name="contentType"></param> /// <param name="contentType"></param>
/// <returns></returns> /// <returns></returns>
byte[] EncodeStructuredEvent(CloudEvent cloudEvent, out ContentType contentType); public virtual byte[] EncodeStructuredEvent(CloudEvent cloudEvent, out ContentType contentType) =>
throw new NotImplementedException();
// TODO: Work out whether this is what we want, and whether to potentially // TODO: Work out whether this is what we want, and whether to potentially
// separate it into a separate interface. // separate it into a separate interface.
byte[] EncodeData(object value); public virtual byte[] EncodeData(object value) => throw new NotImplementedException();
object DecodeData(byte[] value, string contentType); public virtual object DecodeData(byte[] value, string contentType) => throw new NotImplementedException();
} }
} }