about summary refs log tree commit diff
path: root/LibMatrix.EventTypes.Abstractions
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--LibMatrix.EventTypes.Abstractions/BaseMatrixEventContent.cs (renamed from LibMatrix.EventTypes/MatrixEventContent.cs)24
-rw-r--r--LibMatrix.EventTypes.Abstractions/Converters/EventConverterFactory.cs112
-rw-r--r--LibMatrix.EventTypes.Abstractions/Converters/EventJsonSerializerContext.cs10
-rw-r--r--LibMatrix.EventTypes.Abstractions/LibMatrix.EventTypes.Abstractions.csproj (renamed from LibMatrix.EventTypes/LibMatrix.EventTypes.csproj)2
-rw-r--r--LibMatrix.EventTypes.Abstractions/MatrixEvent.cs9
-rw-r--r--LibMatrix.EventTypes.Abstractions/MatrixEventAttribute.cs9
-rw-r--r--LibMatrix.EventTypes.Abstractions/MatrixEventCollection.cs (renamed from LibMatrix.EventTypes/MatrixEventCollection.cs)0
7 files changed, 150 insertions, 16 deletions
diff --git a/LibMatrix.EventTypes/MatrixEventContent.cs b/LibMatrix.EventTypes.Abstractions/BaseMatrixEventContent.cs
index 81b8c52..eba50a5 100644
--- a/LibMatrix.EventTypes/MatrixEventContent.cs
+++ b/LibMatrix.EventTypes.Abstractions/BaseMatrixEventContent.cs
@@ -12,21 +12,18 @@ namespace LibMatrix.EventTypes;
 ///     <seealso cref="System.Text.Json.Nodes.JsonNode"/>
 ///     <seealso cref="System.Text.Json.Nodes.JsonObject"/>
 /// </summary>
-[JsonConverter(typeof(MatrixEventContentConverter<MatrixEventContent>))]
-public class MatrixEventContent {
-
-    [JsonExtensionData, JsonInclude]
+[JsonConverter(typeof(MatrixEventContentConverter<BaseMatrixEventContent>))]
+// [JsonSerializable(typeof(MatrixEventContent))]
+public class BaseMatrixEventContent {
     public JsonObject InternalJson { get; set; } = new();
 
-    
-
-    public MatrixEventContent() { }
+    public BaseMatrixEventContent() { }
 
-    public MatrixEventContent(JsonNode json) {
+    public BaseMatrixEventContent(JsonNode json) {
         InternalJson = json.AsObject();
     }
 
-    public static implicit operator MatrixEventContent(JsonNode json) => new(json);
+    public static implicit operator BaseMatrixEventContent(JsonNode json) => new(json);
 
     // public static implicit operator JsonNode(MatrixEventContent content) => content.InternalJson;
 
@@ -41,20 +38,17 @@ public class MatrixEventContent {
     public string ToJson() => InternalJson.ToJson();
 
 
-    public class MatrixEventContentConverter<T> : JsonConverter<T> where T : MatrixEventContent, new() {
+    public class MatrixEventContentConverter<T> : JsonConverter<T> where T : BaseMatrixEventContent, new() {
         public override T? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {
             // read entire object into a JsonObject
+            // Console.WriteLine($"MatrixEventContentConverter<T>: Reading {typeToConvert}");
             var json = JsonNode.Parse(ref reader);
             return new T { InternalJson = json.AsObject() };
         }
 
         public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options) {
+            // Console.WriteLine($"MatrixEventContentConverter<T>: Writing {value.GetType()}");
             value.InternalJson.WriteTo(writer);
         }
     }
-}
-
-public class MatrixEventAttribute(string eventType, bool deprecated = false) : Attribute {
-    public string EventType { get; } = eventType;
-    public bool Deprecated { get; } = deprecated;
 }
\ No newline at end of file
diff --git a/LibMatrix.EventTypes.Abstractions/Converters/EventConverterFactory.cs b/LibMatrix.EventTypes.Abstractions/Converters/EventConverterFactory.cs
new file mode 100644
index 0000000..3b4c493
--- /dev/null
+++ b/LibMatrix.EventTypes.Abstractions/Converters/EventConverterFactory.cs
@@ -0,0 +1,112 @@
+/*namespace LibMatrix.EventTypes.Converters;
+
+using System.Reflection;
+using System.Text.Json;
+using System.Text.Json.Serialization;
+
+public class MatrixEventConverter : JsonConverterFactory {
+    public override bool CanConvert(Type typeToConvert) {
+        Console.WriteLine(typeToConvert);
+        if (!typeToConvert.IsGenericType) {
+            return false;
+        }
+
+        if (typeToConvert.GetGenericTypeDefinition() != typeof(MatrixEvent<>)) {
+            return false;
+        }
+
+        return typeToConvert.GetGenericArguments()[0].IsAssignableTo(typeof(MatrixEventContent));
+    }
+
+    public override JsonConverter CreateConverter(
+        Type type,
+        JsonSerializerOptions options) {
+        Type[] typeArguments = type.GetGenericArguments();
+        Type keyType = typeArguments[0];
+        Type valueType = typeArguments[1];
+
+        JsonConverter converter = (JsonConverter)Activator.CreateInstance(
+            typeof(DictionaryEnumConverterInner<,>).MakeGenericType(
+                [keyType, valueType]),
+            BindingFlags.Instance | BindingFlags.Public,
+            binder: null,
+            args: [options],
+            culture: null)!;
+
+        return converter;
+    }
+
+    private class DictionaryEnumConverterInner<TKey, TValue> :
+        JsonConverter<Dictionary<TKey, TValue>> where TKey : struct, Enum {
+        private readonly JsonConverter<TValue> _valueConverter;
+        private readonly Type _keyType;
+        private readonly Type _valueType;
+
+        public DictionaryEnumConverterInner(JsonSerializerOptions options) {
+            // For performance, use the existing converter.
+            _valueConverter = (JsonConverter<TValue>)options
+                .GetConverter(typeof(TValue));
+
+            // Cache the key and value types.
+            _keyType = typeof(TKey);
+            _valueType = typeof(TValue);
+        }
+
+        public override Dictionary<TKey, TValue> Read(
+            ref Utf8JsonReader reader,
+            Type typeToConvert,
+            JsonSerializerOptions options) {
+            if (reader.TokenType != JsonTokenType.StartObject) {
+                throw new JsonException();
+            }
+
+            var dictionary = new Dictionary<TKey, TValue>();
+
+            while (reader.Read()) {
+                if (reader.TokenType == JsonTokenType.EndObject) {
+                    return dictionary;
+                }
+
+                // Get the key.
+                if (reader.TokenType != JsonTokenType.PropertyName) {
+                    throw new JsonException();
+                }
+
+                string? propertyName = reader.GetString();
+
+                // For performance, parse with ignoreCase:false first.
+                if (!Enum.TryParse(propertyName, ignoreCase: false, out TKey key) &&
+                    !Enum.TryParse(propertyName, ignoreCase: true, out key)) {
+                    throw new JsonException(
+                        $"Unable to convert \"{propertyName}\" to Enum \"{_keyType}\".");
+                }
+
+                // Get the value.
+                reader.Read();
+                TValue value = _valueConverter.Read(ref reader, _valueType, options)!;
+
+                // Add to dictionary.
+                dictionary.Add(key, value);
+            }
+
+            throw new JsonException();
+        }
+
+        public override void Write(
+            Utf8JsonWriter writer,
+            Dictionary<TKey, TValue> dictionary,
+            JsonSerializerOptions options) {
+            writer.WriteStartObject();
+
+            foreach ((TKey key, TValue value) in dictionary) {
+                string propertyName = key.ToString();
+                writer.WritePropertyName
+                    (options.PropertyNamingPolicy?.ConvertName(propertyName) ?? propertyName);
+
+                _valueConverter.Write(writer, value, options);
+            }
+
+            writer.WriteEndObject();
+        }
+    }
+}*/
\ No newline at end of file
diff --git a/LibMatrix.EventTypes.Abstractions/Converters/EventJsonSerializerContext.cs b/LibMatrix.EventTypes.Abstractions/Converters/EventJsonSerializerContext.cs
new file mode 100644
index 0000000..5b8e2dc
--- /dev/null
+++ b/LibMatrix.EventTypes.Abstractions/Converters/EventJsonSerializerContext.cs
@@ -0,0 +1,10 @@
+// using System.Text.Json;
+// using System.Text.Json.Serialization;
+// using System.Text.Json.Serialization.Metadata;
+//
+// namespace LibMatrix.EventTypes.Converters;
+//
+// [JsonSourceGenerationOptions(GenerationMode = JsonSourceGenerationMode.Serialization)]
+// [JsonSerializable(typeof(MatrixEvent<>))]
+// internal partial class EventJsonSerializerContext : JsonSerializerContext {
+// }
\ No newline at end of file
diff --git a/LibMatrix.EventTypes/LibMatrix.EventTypes.csproj b/LibMatrix.EventTypes.Abstractions/LibMatrix.EventTypes.Abstractions.csproj
index bd33993..dce51ea 100644
--- a/LibMatrix.EventTypes/LibMatrix.EventTypes.csproj
+++ b/LibMatrix.EventTypes.Abstractions/LibMatrix.EventTypes.Abstractions.csproj
@@ -4,7 +4,7 @@
         <TargetFramework>net8.0</TargetFramework>
         <ImplicitUsings>enable</ImplicitUsings>
         <Nullable>enable</Nullable>
-        <OutputType>Exe</OutputType>
+        <LangVersion>preview</LangVersion>
     </PropertyGroup>
 
     <ItemGroup>
diff --git a/LibMatrix.EventTypes.Abstractions/MatrixEvent.cs b/LibMatrix.EventTypes.Abstractions/MatrixEvent.cs
new file mode 100644
index 0000000..0e548c6
--- /dev/null
+++ b/LibMatrix.EventTypes.Abstractions/MatrixEvent.cs
@@ -0,0 +1,9 @@
+using System.Text.Json.Serialization;
+
+namespace LibMatrix.EventTypes;
+
+public interface IMatrixEvent<out T> where T : BaseMatrixEventContent;
+public class MatrixEvent<T> : IMatrixEvent<T> where T : BaseMatrixEventContent {
+    [JsonPropertyName("content")]
+    public T? Content { get; set; }
+}
\ No newline at end of file
diff --git a/LibMatrix.EventTypes.Abstractions/MatrixEventAttribute.cs b/LibMatrix.EventTypes.Abstractions/MatrixEventAttribute.cs
new file mode 100644
index 0000000..aface6d
--- /dev/null
+++ b/LibMatrix.EventTypes.Abstractions/MatrixEventAttribute.cs
@@ -0,0 +1,9 @@
+using System.Text.Json.Serialization;
+
+namespace LibMatrix.EventTypes;
+
+[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
+public class MatrixEventAttribute(string eventType, bool deprecated = false) : Attribute {
+    public string EventType { get; } = eventType;
+    public bool Deprecated { get; } = deprecated;
+}
\ No newline at end of file
diff --git a/LibMatrix.EventTypes/MatrixEventCollection.cs b/LibMatrix.EventTypes.Abstractions/MatrixEventCollection.cs
index 78886d9..78886d9 100644
--- a/LibMatrix.EventTypes/MatrixEventCollection.cs
+++ b/LibMatrix.EventTypes.Abstractions/MatrixEventCollection.cs