| | | 1 | | using System.Text.Json; |
| | | 2 | | using System.Text.Json.Serialization; |
| | | 3 | | |
| | | 4 | | namespace Elsa.Secrets.Models; |
| | | 5 | | |
| | | 6 | | public class OrdinalIgnoreCaseDictionaryConverter : JsonConverter<IDictionary<string, string>> |
| | | 7 | | { |
| | | 8 | | public override IDictionary<string, string> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOption |
| | | 9 | | { |
| | 1 | 10 | | if (reader.TokenType == JsonTokenType.Null) |
| | 0 | 11 | | return new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); |
| | | 12 | | |
| | 1 | 13 | | if (reader.TokenType != JsonTokenType.StartObject) |
| | 0 | 14 | | throw new JsonException("Expected an object of string metadata values."); |
| | | 15 | | |
| | 1 | 16 | | var values = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); |
| | 2 | 17 | | while (reader.Read()) |
| | | 18 | | { |
| | 2 | 19 | | if (reader.TokenType == JsonTokenType.EndObject) |
| | 1 | 20 | | return values; |
| | | 21 | | |
| | 1 | 22 | | if (reader.TokenType != JsonTokenType.PropertyName) |
| | 0 | 23 | | throw new JsonException("Expected a metadata property name."); |
| | | 24 | | |
| | 1 | 25 | | var key = reader.GetString()!; |
| | 1 | 26 | | if (!reader.Read()) |
| | 0 | 27 | | throw new JsonException("Unexpected end of JSON while reading secret metadata."); |
| | | 28 | | |
| | 1 | 29 | | if (reader.TokenType == JsonTokenType.Null) |
| | | 30 | | continue; |
| | | 31 | | |
| | 1 | 32 | | if (reader.TokenType != JsonTokenType.String) |
| | 0 | 33 | | throw new JsonException("Expected a string metadata value."); |
| | | 34 | | |
| | 1 | 35 | | var value = reader.GetString(); |
| | 1 | 36 | | if (value != null) |
| | 1 | 37 | | values[key] = value; |
| | | 38 | | } |
| | | 39 | | |
| | 0 | 40 | | throw new JsonException("Unexpected end of JSON while reading secret metadata."); |
| | | 41 | | } |
| | | 42 | | |
| | | 43 | | public override void Write(Utf8JsonWriter writer, IDictionary<string, string> value, JsonSerializerOptions options) |
| | | 44 | | { |
| | 2 | 45 | | writer.WriteStartObject(); |
| | 10 | 46 | | foreach (var item in value.OrderBy(x => x.Key, StringComparer.OrdinalIgnoreCase)) |
| | 2 | 47 | | writer.WriteString(item.Key, item.Value); |
| | 2 | 48 | | writer.WriteEndObject(); |
| | 2 | 49 | | } |
| | | 50 | | } |