summaryrefslogtreecommitdiffstats
path: root/generator/plugins/dotnet/custom/LSPAnyConverter.cs
blob: 28781cb4a73bf2af0fa67bab8fffe4bb70224139 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
using Newtonsoft.Json;

public class LSPAnyConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(LSPAny);
    }

    public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer)
    {
        reader = reader ?? throw new ArgumentNullException(nameof(reader));
        switch (reader.TokenType)
        {
            case JsonToken.Null:
                return null;

            case JsonToken.Integer:
                return new LSPAny(serializer.Deserialize<long>(reader));

            case JsonToken.Float:
                return new LSPAny(serializer.Deserialize<float>(reader));

            case JsonToken.Boolean:
                return new LSPAny(serializer.Deserialize<bool>(reader));

            case JsonToken.String:
                return new LSPAny(serializer.Deserialize<string>(reader));

            case JsonToken.StartArray:
                List<object>? l = serializer.Deserialize<List<object>>(reader);
                if (l == null)
                {
                    return null;
                }
                return new LSPAny(new LSPArray(l));

            case JsonToken.StartObject:
                Dictionary<string, object?>? o = serializer.Deserialize<Dictionary<string, object?>>(reader);
                if (o == null)
                {
                    return null;
                }
                return new LSPAny(new LSPObject(o));
        }

        throw new JsonSerializationException($"Unexpected token type '{reader.TokenType}' while deserializing '{objectType.Name}'.");
    }

    public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
    {
        if (value is null)
        {
            writer.WriteNull();
        }
        else
        {
            serializer.Serialize(writer, ((LSPAny)value).Value);
        }
    }
}