tgstation-server 5.12.7
The /tg/station 13 server suite
Loading...
Searching...
No Matches
VersionConverter.cs
Go to the documentation of this file.
1using System;
2
3using Newtonsoft.Json;
4
6
7using YamlDotNet.Core;
8using YamlDotNet.Core.Events;
9using YamlDotNet.Serialization;
10
12{
17 {
24 static bool CheckSupportsType(Type type, bool validate)
25 {
26 ArgumentNullException.ThrowIfNull(type);
27
28 var supported = type == typeof(global::System.Version);
29 if (!supported && validate)
30 throw new NotSupportedException($"{nameof(VersionConverter)} does not convert {type}s!");
31
32 return supported;
33 }
34
36 public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
37 {
38 if (value == null)
39 {
40 writer.WriteNull();
41 }
42 else if (value is global::System.Version version)
43 {
44 writer.WriteValue(version.Semver().ToString());
45 }
46 else
47 {
48 throw new ArgumentException("Expected Version object!", nameof(value));
49 }
50 }
51
53 public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
54 {
55 ArgumentNullException.ThrowIfNull(reader);
56
57 CheckSupportsType(objectType, true);
58
59 if (reader.TokenType == JsonToken.Null)
60 return null;
61
62 if (reader.TokenType == JsonToken.String)
63 {
64 try
65 {
66 var v = global::System.Version.Parse((string)reader.Value);
67 return v.Semver();
68 }
69 catch (Exception ex)
70 {
71 throw new JsonSerializationException($"Error parsing version string: {reader.Value}", ex);
72 }
73 }
74
75 throw new JsonSerializationException(
76 $"Unexpected token or value when parsing version. Token: {reader.TokenType}, Value: {reader.Value}");
77 }
78
80 public override bool CanConvert(Type objectType) => CheckSupportsType(objectType, false);
81
83 public bool Accepts(Type type) => CheckSupportsType(type, false);
84
86 public object ReadYaml(IParser parser, Type type) => throw new NotSupportedException("Deserialization not supported!"); // The default implementation is fine at handling this
87
89 public void WriteYaml(IEmitter emitter, object value, Type type)
90 {
91 ArgumentNullException.ThrowIfNull(emitter);
92
93 CheckSupportsType(type, true);
94
95 if (value == null)
96 throw new NotSupportedException("Null values not supported!");
97
98 var version = (global::System.Version)value;
99 emitter.Emit(
100 new Scalar(
101 version
102 .Semver()
103 .ToString()));
104 }
105 }
106}
JsonConverter and IYamlTypeConverter for serializing global::System.Versions in semver format.
static bool CheckSupportsType(Type type, bool validate)
Check if the VersionConverter supports (de)serializing a given type .
override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
void WriteYaml(IEmitter emitter, object value, Type type)