Jelajahi Sumber

Got LogiKal Interface Talking!

Frank van den Bos 9 bulan lalu
induk
melakukan
a6949e52f1

+ 2 - 2
InABox.Logikal/Classes/ILogikalElevation.cs

@@ -2,7 +2,7 @@ using System;
 
 namespace InABox.Logikal
 {
-    public interface ILogikalElevation
+    public interface ILogikalElevation<T> where T : ILogikalPart
     {
         Guid ID { get; set; }
         string Name { get; set; }
@@ -10,6 +10,6 @@ namespace InABox.Logikal
         byte[] Thumbnail { get; set; }
         byte[] Drawing { get; set; }
         
-        ILogikalPart[] Parts { get; set; }
+        T[] Parts { get; set; }
     }
 }

+ 6 - 2
InABox.Logikal/Classes/ILogikalProject.cs

@@ -2,12 +2,16 @@ using System;
 
 namespace InABox.Logikal
 {
-    public interface ILogikalProject
+    public interface ILogikalProject<TElevation,TPart> 
+        where TElevation : ILogikalElevation<TPart>
+        where TPart : ILogikalPart
     {
         Guid ID { get; set; }
         string Name { get; set; }
         string PersonInCharge { get; set; }
         string Path { get; set; }
-        ILogikalElevation[] Elevations { get; set; }
+        DateTime Created { get; set; }
+        DateTime LastUpdated { get; set; }
+        TElevation[] Elevations { get; set; }
     }
 }

+ 6 - 3
InABox.Logikal/LogikalObject.cs

@@ -1,18 +1,21 @@
 using Newtonsoft.Json;
+using System;
 
 namespace InABox.Logikal
 {
     public abstract class LogikalObject
     {
         public abstract LogikalMethod Method();
-        
-        public LogikalMessage ToMessage()
+
+        public LogikalMessage ToMessage(Guid messageID)
         {
-            return new LogikalMessage()
+            var _result = new LogikalMessage()
             {
+                ID = messageID,
                 Method = Method(),
                 Payload = JsonConvert.SerializeObject(this)
             };
+            return _result;
         }
 
     }

+ 2 - 15
InABox.Logikal/LogikalRequest.cs

@@ -1,24 +1,11 @@
 using System;
+using System.Collections.Generic;
 using Newtonsoft.Json;
 
 namespace InABox.Logikal
 {
     public abstract class LogikalRequest : LogikalObject
     {
-        
-        public static LogikalRequest FromMessage(LogikalMessage message)
-        {
-            if (message.Method == LogikalMethod.Connect)
-                return JsonConvert.DeserializeObject<LogikalConnectRequest>(message.Payload);
-            if (message.Method == LogikalMethod.Login)
-                return JsonConvert.DeserializeObject<LogikalLoginRequest>(message.Payload);
-            if (message.Method == LogikalMethod.Logout)
-                return JsonConvert.DeserializeObject<LogikalLogoutRequest>(message.Payload);
-            if (message.Method == LogikalMethod.Disconnect)
-                return JsonConvert.DeserializeObject<LogikalDisconnectRequest>(message.Payload);
-            throw new Exception($"Invalid Message Method: {message.Method}: {message.Payload}");
-        }
-        
-        
+
     }
 }

+ 28 - 23
InABox.Logikal/LogikalResponse.cs

@@ -1,38 +1,43 @@
 using System;
+using System.Collections.Generic;
 using Newtonsoft.Json;
 
 namespace InABox.Logikal
 {
     public abstract class LogikalResponse : LogikalObject
     {
-        public LogikalStatus Status { get; set; } = LogikalStatus.Unknown;
-        
-        public static LogikalResponse FromMessage(LogikalMessage message)
+
+
+        public new abstract string ToString();
+
+        public LogikalResponse Always(Action<LogikalResponse> handler)
         {
-            if (message.Method == LogikalMethod.Connect)
-                return JsonConvert.DeserializeObject<LogikalConnectResponse>(message.Payload);
-            if (message.Method == LogikalMethod.Login)
-                return JsonConvert.DeserializeObject<LogikalLoginResponse>(message.Payload);
-            if (message.Method == LogikalMethod.Logout)
-                return JsonConvert.DeserializeObject<LogikalLogoutResponse>(message.Payload);
-            if (message.Method == LogikalMethod.Disconnect)
-                return JsonConvert.DeserializeObject<LogikalDisconnectResponse>(message.Payload);
-            if (message.Method == LogikalMethod.Error)
-                return JsonConvert.DeserializeObject<LogikalErrorResponse>(message.Payload);
-            throw new Exception("Unknown Message ID");
+            handler?.Invoke(this);
+            return this;
         }
-        
-    }
 
-    public class LogikalErrorResponse : LogikalResponse
-    {
-        public override LogikalMethod Method() => LogikalMethod.Error;
-        
-        public String Message { get; set; }
+        public LogikalResponse Error(Action<LogikalErrorResponse> handler, LogikalStatus status = LogikalStatus.IsError)
+        {
+            if (this is LogikalErrorResponse error && status.HasFlag(error.Status))
+            {
+                handler?.Invoke(error);
+                return null;
+            }
+            return this;
+        }
 
-        public LogikalErrorResponse()
+        public T Success<T>(Action<T> handler) where T : LogikalResponse
         {
-            Status = LogikalStatus.Error;
+            if (this is T response)
+            {
+                handler?.Invoke(response);
+                return response;
+            }
+            return null;
         }
+
+
+
+
     }
 }

+ 25 - 6
InABox.Logikal/LogikalStatus.cs

@@ -1,11 +1,30 @@
+using System;
+
 namespace InABox.Logikal
 {
+
+    [Flags]
     public enum LogikalStatus
     {
-        Ok,
-        Restricted,
-        Error,
-        Failed,
-        Unknown,
+        Ok = 1,
+
+        NotRunning = 2,
+        CannotConnect = 4,
+        Disconnected = 8,
+        Restricted = 16,
+        Error = 32,
+        Failed = 64,
+        Unknown = 128,
+        NoProjectCenter = 256,
+        NotLoggedIn = 512,
+        InvalidProjectID = 1024,
+        InvalidElevationID = 2048,
+        ElevationNotFound = 4096,
+
+        IsError = ~Ok,
+
     }
-}
+
+
+
+}

+ 3 - 1
InABox.Logikal/Requests/LogikalConnectResponse.cs

@@ -3,6 +3,8 @@ namespace InABox.Logikal
     public class LogikalConnectResponse : LogikalResponse
     {
         public override LogikalMethod Method() => LogikalMethod.Connect;
-        
+
+        public override string ToString() => $"Connection Successful";
+    
     }
 }

+ 2 - 0
InABox.Logikal/Requests/LogikalDisconnectResponse.cs

@@ -3,5 +3,7 @@ namespace InABox.Logikal
     public class LogikalDisconnectResponse : LogikalResponse
     {
         public override LogikalMethod Method() => LogikalMethod.Disconnect;
+        public override string ToString() => $"Disconnect Successful";
+
     }
 }

+ 6 - 2
InABox.Logikal/Requests/LogikalElevationResponse.cs

@@ -1,9 +1,13 @@
 namespace InABox.Logikal
 {
-    public class LogikalElevationResponse : LogikalResponse
+    public class LogikalElevationResponse<TElevation, TPart> : LogikalResponse
+        where TElevation : ILogikalElevation<TPart>
+        where TPart : ILogikalPart
     {
         public override LogikalMethod Method() => LogikalMethod.Elevation;
         
-        public ILogikalElevation Elevation { get; set; }
+        public TElevation Elevation { get; set; }
+
+        public override string ToString() => Elevation?.Name ?? "";
     }
 }

+ 17 - 0
InABox.Logikal/Requests/LogikalErrorRequest.cs

@@ -0,0 +1,17 @@
+using System;
+
+namespace InABox.Logikal
+{
+    public class LogikalErrorRequest : LogikalRequest
+    {
+        public override LogikalMethod Method() => LogikalMethod.Error;
+
+        public LogikalStatus Status { get; set; }
+        public string Message { get; set; }
+
+        public override string ToString() => $"{Status}: {Message}";
+
+    }
+
+
+}

+ 18 - 0
InABox.Logikal/Requests/LogikalErrorResponse.cs

@@ -0,0 +1,18 @@
+using System;
+
+namespace InABox.Logikal
+{
+
+    public class LogikalErrorResponse : LogikalResponse
+    {
+        public override LogikalMethod Method() => LogikalMethod.Error;
+
+        public LogikalStatus Status { get; set; }
+        public string Message { get; set; }
+
+        public override string ToString() => $"{Status}: {Message}";
+
+    }
+
+
+}

+ 1 - 4
InABox.Logikal/Requests/LogikalLoginRequest.cs

@@ -5,9 +5,6 @@ namespace InABox.Logikal
     public class LogikalLoginRequest : LogikalRequest
     {
         public override LogikalMethod Method() => LogikalMethod.Login;
-        
-        public IntPtr WindowHandle { get; set; }
-        //public string UserID { get; set; }
-        //public string Password { get; set; }
+       
     }
 }

+ 1 - 1
InABox.Logikal/Requests/LogikalLoginResponse.cs

@@ -3,6 +3,6 @@ namespace InABox.Logikal
     public class LogikalLoginResponse : LogikalResponse
     {
         public override LogikalMethod Method() => LogikalMethod.Login;
-        
+        public override string ToString() => $"Login OK";
     }
 }

+ 1 - 1
InABox.Logikal/Requests/LogikalLogoutResponse.cs

@@ -3,6 +3,6 @@ namespace InABox.Logikal
     public class LogikalLogoutResponse : LogikalResponse
     {
         public override LogikalMethod Method() => LogikalMethod.Logout;
-        
+        public override string ToString() => $"Logout OK";
     }
 }

+ 7 - 2
InABox.Logikal/Requests/LogikalProjectResponse.cs

@@ -1,9 +1,14 @@
 namespace InABox.Logikal
 {
-    public class LogikalProjectResponse : LogikalResponse
+    public class LogikalProjectResponse<TProject, TElevation, TPart> : LogikalResponse
+        where TProject : ILogikalProject<TElevation, TPart>
+        where TElevation : ILogikalElevation<TPart>
+        where TPart : ILogikalPart
     {
         public override LogikalMethod Method() => LogikalMethod.Project;
         
-        public ILogikalProject Project { get; set; }
+        public TProject Project { get; set; }
+
+        public override string ToString() => Project.Name ?? "";
     }
 }

+ 12 - 3
InABox.Logikal/Requests/LogikalProjectsResponse.cs

@@ -1,9 +1,18 @@
+using InABox.Logikal;
+using Newtonsoft.Json;
+
 namespace InABox.Logikal
 {
-    public class LogikalProjectsResponse : LogikalResponse
+    public class LogikalProjectsResponse<TProject,TElevation,TPart> : LogikalResponse
+        where TProject : ILogikalProject<TElevation,TPart>
+        where TElevation : ILogikalElevation<TPart>
+        where TPart : ILogikalPart
     {
         public override LogikalMethod Method() => LogikalMethod.Projects;
-        
-        public ILogikalProject[] Projects { get; set; }
+
+        public TProject[] Projects { get; set; }
+
+        public override string ToString() => $"{Projects?.Length ?? 0} Projects found";
     }
+
 }