DeviceBridge/Models/DeviceSubscriptionType.cs (82 lines of code) (raw):
// Copyright (c) Microsoft Corporation. All rights reserved.
using System.Text.Json.Serialization;
using DeviceBridge.Common.Exceptions;
using Microsoft.OpenApi.Models;
namespace DeviceBridge.Models
{
[JsonConverter(typeof(DeviceSubscriptionTypeConverter))]
public class DeviceSubscriptionType
{
public static readonly OpenApiSchema Schema = new OpenApiSchema
{
Type = "string",
};
public static readonly DeviceSubscriptionType DesiredProperties = new DeviceSubscriptionType(DesiredPropertiesSubscriptionType);
public static readonly DeviceSubscriptionType Methods = new DeviceSubscriptionType(MethodsSubscriptionType);
public static readonly DeviceSubscriptionType C2DMessages = new DeviceSubscriptionType(C2DSubscriptionType);
public static readonly DeviceSubscriptionType ConnectionStatus = new DeviceSubscriptionType(ConnectionStatusSubscriptionType);
private const string DesiredPropertiesSubscriptionType = "DesiredProperties";
private const string MethodsSubscriptionType = "Methods";
private const string C2DSubscriptionType = "C2DMessages";
private const string ConnectionStatusSubscriptionType = "ConnectionStatus";
private string value;
private DeviceSubscriptionType(string value)
{
switch (value)
{
case DesiredPropertiesSubscriptionType:
case MethodsSubscriptionType:
case C2DSubscriptionType:
case ConnectionStatusSubscriptionType:
this.value = value;
break;
default:
throw new UnknownDeviceSubscriptionTypeException(value);
}
}
public static bool operator ==(DeviceSubscriptionType lhs, DeviceSubscriptionType rhs)
{
return (ReferenceEquals(lhs, null) && ReferenceEquals(rhs, null)) || (!ReferenceEquals(lhs, null) && lhs.Equals(rhs));
}
public static bool operator !=(DeviceSubscriptionType lhs, DeviceSubscriptionType rhs)
{
return !(lhs == rhs);
}
/// <summary>
/// Returns the corresponding singleton for a give subscription type.
/// </summary>
/// <exception cref="UnknownDeviceSubscriptionTypeException">If the given value is not a valid subscription type.</exception>
/// <param name="value">The string representation subscription type.</param>
/// <returns>The corresponding singleton for the subscription type.</returns>
public static DeviceSubscriptionType FromString(string value)
{
switch (value)
{
case DesiredPropertiesSubscriptionType:
return DesiredProperties;
case MethodsSubscriptionType:
return Methods;
case C2DSubscriptionType:
return C2DMessages;
case ConnectionStatusSubscriptionType:
return ConnectionStatus;
default:
throw new UnknownDeviceSubscriptionTypeException(value);
}
}
/// <summary>
/// A data subscription deals with events that depend on a device connection (properties, methods, C2D messages).
/// A connection status subscription, in the other hand, is just a subscription to engine events that is always active and doesn't depend on a connection.
/// </summary>
/// <returns>Whether this is a data subscription or not.</returns>
public bool IsDataSubscription()
{
return (this == DesiredProperties) || (this == Methods) || (this == C2DMessages);
}
public override string ToString()
{
return value;
}
public override bool Equals(object type)
{
if (ReferenceEquals(type, null))
{
return false;
}
return ReferenceEquals(this, type) || (value == (type as DeviceSubscriptionType).value);
}
public override int GetHashCode()
{
return value.GetHashCode();
}
}
}