< Summary

Information
Class: Elsa.Api.Client.Extensions.JsonObjectExtensions
Assembly: Elsa.Api.Client
File(s): /home/runner/work/elsa-core/elsa-core/src/clients/Elsa.Api.Client/Extensions/JsonObjectExtensions.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 52
Coverable lines: 52
Total lines: 212
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 44
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
IsActivity(...)0%2040%
SerializeToNode(...)0%620%
SerializeToArray(...)0%620%
SerializeToArray(...)0%620%
Deserialize(...)0%342180%
SetProperty(...)0%620%
SetProperty(...)0%620%
SetProperty(...)100%210%
GetProperty(...)0%2040%
TryGetProperty(...)100%210%
GetProperty(...)0%620%
GetProperty(...)0%620%
GetPropertyContainer(...)0%2040%

File(s)

/home/runner/work/elsa-core/elsa-core/src/clients/Elsa.Api.Client/Extensions/JsonObjectExtensions.cs

#LineLine coverage
 1using System.Text.Json;
 2using System.Text.Json.Nodes;
 3using System.Text.Json.Serialization;
 4
 5namespace Elsa.Api.Client.Extensions;
 6
 7/// <summary>
 8/// Provides extension methods for <see cref="JsonObject"/>.
 9/// </summary>
 10public static class JsonObjectExtensions
 11{
 12    /// <summary>
 13    /// Returns true if the specified <see cref="JsonObject"/> represents an activity.
 14    /// </summary>
 15    public static bool IsActivity(this JsonObject obj)
 16    {
 017        return obj.ContainsKey("type") && obj.ContainsKey("id") && obj.ContainsKey("version");
 18    }
 19
 20    /// <summary>
 21    /// Serializes the specified value to a <see cref="JsonObject"/>.
 22    /// </summary>
 23    /// <param name="value">The value to serialize.</param>
 24    /// <param name="options">The <see cref="JsonSerializerOptions"/> to use.</param>
 25    /// <returns>A <see cref="JsonObject"/> representing the specified value.</returns>
 26    public static JsonNode SerializeToNode(this object value, JsonSerializerOptions? options = null)
 27    {
 028        options ??= (new JsonSerializerOptions
 029        {
 030            PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
 031
 032        }).WithConverters(new JsonStringEnumConverter());
 33
 034        return JsonSerializer.SerializeToNode(value, options)!;
 35    }
 36
 37    /// <summary>
 38    /// Serializes the specified value to a <see cref="JsonArray"/>.
 39    /// </summary>
 40    /// <param name="value">The value to serialize.</param>
 41    /// <param name="options">The <see cref="JsonSerializerOptions"/> to use.</param>
 42    /// <returns>A <see cref="JsonObject"/> representing the specified value.</returns>
 43    public static JsonArray SerializeToArray(this object value, JsonSerializerOptions? options = null)
 44    {
 045        options ??= new() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase };
 46
 047        return JsonSerializer.SerializeToNode(value, options)!.AsArray();
 48    }
 49
 50    /// <summary>
 51    /// Serializes the specified value to a <see cref="JsonArray"/>.
 52    /// </summary>
 53    /// <param name="value">The value to serialize.</param>
 54    /// <param name="options">The <see cref="JsonSerializerOptions"/> to use.</param>
 55    /// <returns>A <see cref="JsonObject"/> representing the specified value.</returns>
 56    public static JsonArray SerializeToArray<T>(this IEnumerable<T> value, JsonSerializerOptions? options = null)
 57    {
 058        options ??= new() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase };
 59
 060        return JsonSerializer.SerializeToNode(value, options)!.AsArray();
 61    }
 62
 63    /// <summary>
 64    /// Deserializes the specified <see cref="JsonNode"/> to the specified type.
 65    /// </summary>
 66    /// <param name="value">The <see cref="JsonNode"/> to deserialize.</param>
 67    /// <param name="options">The <see cref="JsonSerializerOptions"/> to use.</param>
 68    /// <typeparam name="T">The type to deserialize to.</typeparam>
 69    /// <returns>The deserialized value.</returns>
 70    public static T Deserialize<T>(this JsonNode value, JsonSerializerOptions? options = null)
 71    {
 072        options ??= new() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase };
 73
 074        if (value is JsonObject jsonObject)
 075            return JsonSerializer.Deserialize<T>(jsonObject, options)!;
 76
 077        if (value is JsonArray jsonArray)
 078            return JsonSerializer.Deserialize<T>(jsonArray, options)!;
 79
 080        if (typeof(T).IsEnum || (Nullable.GetUnderlyingType(typeof(T))?.IsEnum ?? false))
 81        {
 082            if (value.GetValueKind() == JsonValueKind.Null)
 083                return default!;
 084            return (T)Enum.Parse(Nullable.GetUnderlyingType(typeof(T)) ?? typeof(T), value.ToString());
 85        }
 86
 087        if (value is JsonValue jsonValue)
 088            return jsonValue.GetValue<T>();
 89
 090        throw new NotSupportedException($"Cannot deserialize {value.GetType()} to {typeof(T)}.");
 91    }
 92
 93    /// <summary>
 94    /// Sets the property value of the specified model.
 95    /// </summary>
 96    /// <param name="model">The model to set the property value on.</param>
 97    /// <param name="value">The value to set.</param>
 98    /// <param name="path">The path to the property.</param>
 99    public static void SetProperty(this JsonObject model, JsonNode? value, params string[] path)
 100    {
 0101        model = GetPropertyContainer(model, path);
 0102        model[path.Last()] = value?.SerializeToNode();
 0103    }
 104
 105    /// <summary>
 106    /// Sets the property value of the specified model.
 107    /// </summary>
 108    /// <param name="model">The model to set the property value on.</param>
 109    /// <param name="value">The value to set.</param>
 110    /// <param name="path">The path to the property.</param>
 111    public static void SetProperty(this JsonObject model, JsonArray? value, params string[] path)
 112    {
 0113        model = GetPropertyContainer(model, path);
 0114        model[path.Last()] = value?.SerializeToNode();
 0115    }
 116
 117    /// <summary>
 118    /// Sets the property value of the specified model.
 119    /// </summary>
 120    /// <param name="model">The model to set the property value on.</param>
 121    /// <param name="value">The value to set.</param>
 122    /// <param name="path">The path to the property.</param>
 123    public static void SetProperty(this JsonObject model, IEnumerable<JsonNode> value, params string[] path)
 124    {
 0125        model = GetPropertyContainer(model, path);
 0126        model[path.Last()] = new JsonArray(value.Select(x => x.SerializeToNode()).ToArray());
 0127    }
 128
 129    /// <summary>
 130    /// Gets the property value of the specified model.
 131    /// </summary>
 132    /// <param name="model">The model to get the property value from.</param>
 133    /// <param name="path">The path to the property.</param>
 134    /// <returns>The property value.</returns>
 135    public static JsonNode? GetProperty(this JsonObject model, params string[] path)
 136    {
 0137        var currentModel = model;
 138
 0139        foreach (var prop in path.SkipLast(1))
 140        {
 0141            if (currentModel[prop] is not JsonObject value)
 0142                return null;
 143
 0144            currentModel = value;
 145        }
 146
 0147        return currentModel[path.Last()];
 0148    }
 149
 150    /// <summary>
 151    /// Gets the property value of the specified model.
 152    /// </summary>
 153    /// <param name="model">The model to get the property value from.</param>
 154    /// <param name="path">The path to the property.</param>
 155    /// <typeparam name="T">The type to deserialize to.</typeparam>
 156    /// <returns>The property value.</returns>
 157    public static T? TryGetProperty<T>(this JsonObject model, params string[] path)
 158    {
 159        try
 160        {
 0161            return model.GetProperty<T>(path);
 162        }
 0163        catch (Exception)
 164        {
 0165            return default;
 166        }
 0167    }
 168
 169    /// <summary>
 170    /// Gets the property value of the specified model.
 171    /// </summary>
 172    /// <param name="model">The model to get the property value from.</param>
 173    /// <param name="path">The path to the property.</param>
 174    /// <typeparam name="T">The type to deserialize to.</typeparam>
 175    /// <returns>The property value.</returns>
 176    public static T? GetProperty<T>(this JsonObject model, params string[] path)
 177    {
 0178        var property = GetProperty(model, path);
 0179        return property != null ? property.Deserialize<T>() : default;
 180    }
 181
 182    /// <summary>
 183    /// Gets the property value of the specified model.
 184    /// </summary>
 185    /// <param name="model">The model to get the property value from.</param>
 186    /// <param name="options">The <see cref="JsonSerializerOptions"/> to use when deserializing.</param>
 187    /// <param name="path">The path to the property.</param>
 188    /// <typeparam name="T">The type to deserialize to.</typeparam>
 189    /// <returns>The property value.</returns>
 190    public static T? GetProperty<T>(this JsonObject model, JsonSerializerOptions options, params string[] path)
 191    {
 0192        var property = GetProperty(model, path);
 0193        return property != null ? property.Deserialize<T>(options) : default;
 194    }
 195
 196    /// <summary>
 197    /// Returns the property container of the specified model.
 198    /// </summary>
 199    /// <param name="model">The model to set the property value on.</param>
 200    /// <param name="path">The path to the property.</param>
 201    private static JsonObject GetPropertyContainer(this JsonObject model, params string[] path)
 202    {
 0203        foreach (var prop in path.SkipLast(1))
 204        {
 0205            var property = model[prop] as JsonObject ?? new JsonObject();
 0206            model[prop] = property;
 0207            model = property;
 208        }
 209
 0210        return model;
 211    }
 212}