Ignore:
Timestamp:
May 17, 2023, 11:05:59 PM (20 months ago)
Author:
alloc
Message:

Added permission management APIs

Location:
binary-improvements2/WebServer/src/WebAPI
Files:
8 added
10 edited

Legend:

Unmodified
Added
Removed
  • binary-improvements2/WebServer/src/WebAPI/APIs/Command.cs

    r426 r434  
    9191
    9292                protected override void HandleRestPost (RequestContext _context, IDictionary<string, object> _jsonInput, byte[] _jsonInputData) {
    93                         if (!TryGetJsonField (_jsonInput, "command", out string commandString)) {
    94                                 SendErrorResult (_context, HttpStatusCode.BadRequest, _jsonInputData, "NO_COMMAND");
     93                        if (!JsonCommons.TryGetJsonField (_jsonInput, "command", out string commandString)) {
     94                                SendEmptyResponse (_context, HttpStatusCode.BadRequest, _jsonInputData, "NO_COMMAND");
    9595                                return;
    9696                        }
     
    9898                        WebCommandResult.ResultType responseType = WebCommandResult.ResultType.Full;
    9999
    100                         if (TryGetJsonField (_jsonInput, "format", out string formatString)) {
     100                        if (JsonCommons.TryGetJsonField (_jsonInput, "format", out string formatString)) {
    101101                                if (formatString.EqualsCaseInsensitive ("raw")) {
    102102                                        responseType = WebCommandResult.ResultType.Raw;
     
    115115
    116116                        if (command == null) {
    117                                 SendErrorResult (_context, HttpStatusCode.NotFound, _jsonInputData, "UNKNOWN_COMMAND");
     117                                SendEmptyResponse (_context, HttpStatusCode.NotFound, _jsonInputData, "UNKNOWN_COMMAND");
    118118                                return;
    119119                        }
     
    122122
    123123                        if (_context.PermissionLevel > commandPermissionLevel) {
    124                                 SendErrorResult (_context, HttpStatusCode.Forbidden, _jsonInputData, "NO_PERMISSION");
     124                                SendEmptyResponse (_context, HttpStatusCode.Forbidden, _jsonInputData, "NO_PERMISSION");
    125125                                return;
    126126                        }
  • binary-improvements2/WebServer/src/WebAPI/APIs/GameData/Item.cs

    r433 r434  
    33using Webserver.Permissions;
    44
    5 namespace Webserver.WebAPI.APIs {
     5namespace Webserver.WebAPI.APIs.GameData {
    66        [UsedImplicitly]
    77        internal class Item : AbsRestApi {
  • binary-improvements2/WebServer/src/WebAPI/APIs/GameData/Mods.cs

    r433 r434  
    33using Webserver.Permissions;
    44
    5 namespace Webserver.WebAPI.APIs {
     5namespace Webserver.WebAPI.APIs.GameData {
    66        [UsedImplicitly]
    77        public class Mods : AbsRestApi {
     
    1212                        writer.WriteBeginArray ();
    1313
    14                         for (int i = 0; i < _parent.webMods.Count; i++) {
    15                                 WebMod webMod = _parent.webMods [i];
     14                        for (int i = 0; i < _parent.WebMods.Count; i++) {
     15                                WebMod webMod = _parent.WebMods [i];
    1616
    1717                                if (i > 0) {
     
    6262                        _writer.WriteValueSeparator ();
    6363                        _writer.WritePropertyName ("displayName");
    64                         JsonCommons.WriteStringOrNull (ref _writer, _webMod.ParentMod.DisplayName);
     64                        _writer.WriteString (_webMod.ParentMod.DisplayName);
    6565
    6666                        _writer.WriteValueSeparator ();
    6767                        _writer.WritePropertyName ("description");
    68                         JsonCommons.WriteStringOrNull (ref _writer, _webMod.ParentMod.Description);
     68                        _writer.WriteString (_webMod.ParentMod.Description);
    6969
    7070                        _writer.WriteValueSeparator ();
    7171                        _writer.WritePropertyName ("author");
    72                         JsonCommons.WriteStringOrNull (ref _writer, _webMod.ParentMod.Author);
     72                        _writer.WriteString (_webMod.ParentMod.Author);
    7373
    7474                        _writer.WriteValueSeparator ();
    7575                        _writer.WritePropertyName ("version");
    76                         JsonCommons.WriteStringOrNull (ref _writer, _webMod.ParentMod.VersionString);
     76                        _writer.WriteString (_webMod.ParentMod.VersionString);
    7777
    7878                        _writer.WriteValueSeparator ();
    7979                        _writer.WritePropertyName ("website");
    80                         JsonCommons.WriteStringOrNull (ref _writer, _webMod.ParentMod.Website);
     80                        _writer.WriteString (_webMod.ParentMod.Website);
    8181                }
    8282
  • binary-improvements2/WebServer/src/WebAPI/APIs/Log.cs

    r408 r434  
    5555
    5656                                writer.WriteRaw (jsonMsgKey);
    57                                 writer.WriteString (logEntry.message);
     57                                writer.WriteString (logEntry.Message);
    5858
    5959                                writer.WriteRaw (jsonTypeKey);
    60                                 writer.WriteString (logEntry.type.ToStringCached ());
     60                                writer.WriteString (logEntry.Type.ToStringCached ());
    6161
    6262                                writer.WriteRaw (jsonTraceKey);
    63                                 writer.WriteString (logEntry.trace);
     63                                writer.WriteString (logEntry.Trace);
    6464
    6565                                writer.WriteRaw (jsonIsotimeKey);
    66                                 writer.WriteString (logEntry.isoTime);
     66                                writer.WriteString (logEntry.IsoTime);
    6767
    6868                                writer.WriteRaw (jsonUptimeKey);
    69                                 writer.WriteString (logEntry.uptime.ToString ());
     69                                writer.WriteString (logEntry.Uptime.ToString ());
    7070
    7171                                writer.WriteEndObject ();
  • binary-improvements2/WebServer/src/WebAPI/APIs/Permissions/RegisterUser.cs

    r433 r434  
    99using Webserver.UrlHandlers;
    1010
    11 namespace Webserver.WebAPI.APIs {
     11namespace Webserver.WebAPI.APIs.Permissions {
    1212        [UsedImplicitly]
    1313        public class RegisterUser : AbsRestApi {
     
    2727
    2828                        if (string.IsNullOrEmpty (token)) {
    29                                 SendErrorResult (_context, HttpStatusCode.BadRequest, null, "NO_TOKEN");
     29                                SendEmptyResponse (_context, HttpStatusCode.BadRequest, null, "NO_TOKEN");
    3030                                return;
    3131                        }
    3232
    3333                        if (!UserRegistrationTokens.TryValidate (token, out UserRegistrationTokens.RegistrationData regData)) {
    34                                 SendErrorResult (_context, HttpStatusCode.NotFound, null, "INVALID_OR_EXPIRED_TOKEN");
     34                                SendEmptyResponse (_context, HttpStatusCode.NotFound, null, "INVALID_OR_EXPIRED_TOKEN");
    3535                                return;
    3636                        }
     
    5050
    5151                protected override void HandleRestPost (RequestContext _context, IDictionary<string, object> _jsonInput, byte[] _jsonInputData) {
    52                         if (!TryGetJsonField (_jsonInput, "token", out string token)) {
    53                                 SendErrorResult (_context, HttpStatusCode.BadRequest, _jsonInputData, "MISSING_TOKEN");
     52                        if (!JsonCommons.TryGetJsonField (_jsonInput, "token", out string token)) {
     53                                SendEmptyResponse (_context, HttpStatusCode.BadRequest, _jsonInputData, "MISSING_TOKEN");
    5454                                return;
    5555                        }
    5656
    57                         if (!TryGetJsonField (_jsonInput, "username", out string username)) {
    58                                 SendErrorResult (_context, HttpStatusCode.BadRequest, _jsonInputData, "MISSING_USERNAME");
     57                        if (!JsonCommons.TryGetJsonField (_jsonInput, "username", out string username)) {
     58                                SendEmptyResponse (_context, HttpStatusCode.BadRequest, _jsonInputData, "MISSING_USERNAME");
    5959                                return;
    6060                        }
    6161
    62                         if (!TryGetJsonField (_jsonInput, "password", out string password)) {
    63                                 SendErrorResult (_context, HttpStatusCode.BadRequest, _jsonInputData, "MISSING_PASSWORD");
     62                        if (!JsonCommons.TryGetJsonField (_jsonInput, "password", out string password)) {
     63                                SendEmptyResponse (_context, HttpStatusCode.BadRequest, _jsonInputData, "MISSING_PASSWORD");
    6464                                return;
    6565                        }
    6666
    6767                        if (!UserRegistrationTokens.TryValidate (token, out UserRegistrationTokens.RegistrationData regData)) {
    68                                 SendErrorResult (_context, HttpStatusCode.Unauthorized, null, "INVALID_OR_EXPIRED_TOKEN");
     68                                SendEmptyResponse (_context, HttpStatusCode.Unauthorized, null, "INVALID_OR_EXPIRED_TOKEN");
    6969                                return;
    7070                        }
    7171
    7272                        if (!userValidationRegex.IsMatch (username)) {
    73                                 SendErrorResult (_context, HttpStatusCode.Unauthorized, _jsonInputData, "INVALID_USERNAME");
     73                                SendEmptyResponse (_context, HttpStatusCode.Unauthorized, _jsonInputData, "INVALID_USERNAME");
    7474                                return;
    7575                        }
    7676                       
    7777                        if (!passValidationRegex.IsMatch (password)) {
    78                                 SendErrorResult (_context, HttpStatusCode.Unauthorized, _jsonInputData, "INVALID_PASSWORD");
     78                                SendEmptyResponse (_context, HttpStatusCode.Unauthorized, _jsonInputData, "INVALID_PASSWORD");
    7979                                return;
    8080                        }
     
    8686                                    !PlatformUserIdentifierAbs.Equals (existingMapping.CrossPlatformUser, regData.CrossPlatformUserId)) {
    8787                                        // Username already in use by another player
    88                                         SendErrorResult (_context, HttpStatusCode.Unauthorized, _jsonInputData, "DUPLICATE_USERNAME");
     88                                        SendEmptyResponse (_context, HttpStatusCode.Unauthorized, _jsonInputData, "DUPLICATE_USERNAME");
    8989                                        return;
    9090                                }
  • binary-improvements2/WebServer/src/WebAPI/APIs/WorldState/Animal.cs

    r433 r434  
    44using Webserver.LiveData;
    55
    6 namespace Webserver.WebAPI.APIs {
     6namespace Webserver.WebAPI.APIs.WorldState {
    77        [UsedImplicitly]
    88        internal class Animal : AbsRestApi {
  • binary-improvements2/WebServer/src/WebAPI/APIs/WorldState/Hostile.cs

    r433 r434  
    44using Webserver.LiveData;
    55
    6 namespace Webserver.WebAPI.APIs {
     6namespace Webserver.WebAPI.APIs.WorldState {
    77        [UsedImplicitly]
    88        internal class Hostile : AbsRestApi {
  • binary-improvements2/WebServer/src/WebAPI/APIs/WorldState/Player.cs

    r433 r434  
    66using Webserver.Permissions;
    77
    8 namespace Webserver.WebAPI.APIs {
     8namespace Webserver.WebAPI.APIs.WorldState {
    99        [UsedImplicitly]
    1010        public class Player : AbsRestApi {
     
    216216
    217217                protected override void HandleRestPost (RequestContext _context, IDictionary<string, object> _jsonInput, byte[] _jsonInputData) {
    218                         if (!TryGetJsonField (_jsonInput, "command", out string commandString)) {
    219                                 SendErrorResult (_context, HttpStatusCode.BadRequest, _jsonInputData, "NO_COMMAND");
     218                        if (!JsonCommons.TryGetJsonField (_jsonInput, "command", out string commandString)) {
     219                                SendEmptyResponse (_context, HttpStatusCode.BadRequest, _jsonInputData, "NO_COMMAND");
    220220                                return;
    221221                        }
     
    223223                        WebCommandResult.ResultType responseType = WebCommandResult.ResultType.Full;
    224224
    225                         if (TryGetJsonField (_jsonInput, "format", out string formatString)) {
     225                        if (JsonCommons.TryGetJsonField (_jsonInput, "format", out string formatString)) {
    226226                                if (formatString.EqualsCaseInsensitive ("raw")) {
    227227                                        responseType = WebCommandResult.ResultType.Raw;
     
    240240
    241241                        if (command == null) {
    242                                 SendErrorResult (_context, HttpStatusCode.NotFound, _jsonInputData, "UNKNOWN_COMMAND");
     242                                SendEmptyResponse (_context, HttpStatusCode.NotFound, _jsonInputData, "UNKNOWN_COMMAND");
    243243                                return;
    244244                        }
     
    247247
    248248                        if (_context.PermissionLevel > commandPermissionLevel) {
    249                                 SendErrorResult (_context, HttpStatusCode.Forbidden, _jsonInputData, "NO_PERMISSION");
     249                                SendEmptyResponse (_context, HttpStatusCode.Forbidden, _jsonInputData, "NO_PERMISSION");
    250250                                return;
    251251                        }
  • binary-improvements2/WebServer/src/WebAPI/AbsRestApi.cs

    r426 r434  
    4444                                        jsonDeserializeSampler.End ();
    4545
    46                                         SendErrorResult (_context, HttpStatusCode.BadRequest, null, "INVALID_BODY", e);
     46                                        SendEmptyResponse (_context, HttpStatusCode.BadRequest, null, "INVALID_BODY", e);
    4747                                        return;
    4848                                }
     
    5353                                        case ERequestMethod.GET:
    5454                                                if (inputJson != null) {
    55                                                         SendErrorResult (_context, HttpStatusCode.BadRequest, jsonInputData, "GET_WITH_BODY");
     55                                                        SendEmptyResponse (_context, HttpStatusCode.BadRequest, jsonInputData, "GET_WITH_BODY");
    5656                                                        return;
    5757                                                }
     
    6060                                                return;
    6161                                        case ERequestMethod.POST:
    62                                                 if (!string.IsNullOrEmpty (_context.RequestPath)) {
    63                                                         SendErrorResult (_context, HttpStatusCode.BadRequest, jsonInputData, "POST_WITH_ID");
     62                                                if (!AllowPostWithId && !string.IsNullOrEmpty (_context.RequestPath)) {
     63                                                        SendEmptyResponse (_context, HttpStatusCode.BadRequest, jsonInputData, "POST_WITH_ID");
    6464                                                        return;
    6565                                                }
    6666
    6767                                                if (inputJson == null) {
    68                                                         SendErrorResult (_context, HttpStatusCode.BadRequest, null, "POST_WITHOUT_BODY");
     68                                                        SendEmptyResponse (_context, HttpStatusCode.BadRequest, null, "POST_WITHOUT_BODY");
    6969                                                        return;
    7070                                                }
     
    7474                                        case ERequestMethod.PUT:
    7575                                                if (string.IsNullOrEmpty (_context.RequestPath)) {
    76                                                         SendErrorResult (_context, HttpStatusCode.BadRequest, jsonInputData, "PUT_WITHOUT_ID");
     76                                                        SendEmptyResponse (_context, HttpStatusCode.BadRequest, jsonInputData, "PUT_WITHOUT_ID");
    7777                                                        return;
    7878                                                }
    7979
    8080                                                if (inputJson == null) {
    81                                                         SendErrorResult (_context, HttpStatusCode.BadRequest, null, "PUT_WITHOUT_BODY");
     81                                                        SendEmptyResponse (_context, HttpStatusCode.BadRequest, null, "PUT_WITHOUT_BODY");
    8282                                                        return;
    8383                                                }
     
    8787                                        case ERequestMethod.DELETE:
    8888                                                if (string.IsNullOrEmpty (_context.RequestPath)) {
    89                                                         SendErrorResult (_context, HttpStatusCode.BadRequest, jsonInputData, "DELETE_WITHOUT_ID");
     89                                                        SendEmptyResponse (_context, HttpStatusCode.BadRequest, jsonInputData, "DELETE_WITHOUT_ID");
    9090                                                        return;
    9191                                                }
    9292
    9393                                                if (inputJson != null) {
    94                                                         SendErrorResult (_context, HttpStatusCode.BadRequest, null, "DELETE_WITH_BODY");
     94                                                        SendEmptyResponse (_context, HttpStatusCode.BadRequest, null, "DELETE_WITH_BODY");
    9595                                                        return;
    9696                                                }
     
    9999                                                return;
    100100                                        default:
    101                                                 SendErrorResult (_context, HttpStatusCode.BadRequest, null, "INVALID_METHOD");
     101                                                SendEmptyResponse (_context, HttpStatusCode.BadRequest, null, "INVALID_METHOD");
    102102                                                return;
    103103                                }
    104104                        } catch (Exception e) {
    105                                 SendErrorResult (_context, HttpStatusCode.InternalServerError, jsonInputData, "ERROR_PROCESSING", e);
     105                                SendEmptyResponse (_context, HttpStatusCode.InternalServerError, jsonInputData, "ERROR_PROCESSING", e);
    106106                        }
    107107                }
    108108
    109109                protected virtual void HandleRestGet (RequestContext _context) {
    110                         SendErrorResult (_context, HttpStatusCode.MethodNotAllowed, null, "Unsupported");
     110                        SendEmptyResponse (_context, HttpStatusCode.MethodNotAllowed, null, "Unsupported");
    111111                }
    112112
    113113                protected virtual void HandleRestPost (RequestContext _context, IDictionary<string, object> _jsonInput, byte[] _jsonInputData) {
    114                         SendErrorResult (_context, HttpStatusCode.MethodNotAllowed, _jsonInputData, "Unsupported");
     114                        SendEmptyResponse (_context, HttpStatusCode.MethodNotAllowed, _jsonInputData, "Unsupported");
    115115                }
    116116
    117117                protected virtual void HandleRestPut (RequestContext _context, IDictionary<string, object> _jsonInput, byte[] _jsonInputData) {
    118                         SendErrorResult (_context, HttpStatusCode.MethodNotAllowed, _jsonInputData, "Unsupported");
     118                        SendEmptyResponse (_context, HttpStatusCode.MethodNotAllowed, _jsonInputData, "Unsupported");
    119119                }
    120120
    121121                protected virtual void HandleRestDelete (RequestContext _context) {
    122                         SendErrorResult (_context, HttpStatusCode.MethodNotAllowed, null, "Unsupported");
     122                        SendEmptyResponse (_context, HttpStatusCode.MethodNotAllowed, null, "Unsupported");
    123123                }
    124124
     
    126126                        AdminWebModules.WebModule module = AdminWebModules.Instance.GetModule (CachedApiModuleName);
    127127
    128                         if (module.LevelPerMethod != null) {
    129                                 int perMethodLevel = module.LevelPerMethod [(int)_context.Method];
    130                                 if (perMethodLevel == AdminWebModules.MethodLevelNotSupported) {
    131                                         return false;
    132                                 }
     128                        if (module.LevelPerMethod == null) {
     129                                return module.LevelGlobal >= _context.PermissionLevel;
     130                        }
    133131
    134                                 if (perMethodLevel != AdminWebModules.MethodLevelInheritGlobal) {
    135                                         return perMethodLevel >= _context.PermissionLevel;
    136                                 }
     132                        int perMethodLevel = module.LevelPerMethod [(int)_context.Method];
     133                        if (perMethodLevel == AdminWebModules.MethodLevelNotSupported) {
     134                                return false;
     135                        }
     136
     137                        if (perMethodLevel != AdminWebModules.MethodLevelInheritGlobal) {
     138                                return perMethodLevel >= _context.PermissionLevel;
    137139                        }
    138140
    139141                        return module.LevelGlobal >= _context.PermissionLevel;
    140142                }
     143
     144                protected virtual bool AllowPostWithId => false;
    141145
    142146                /// <summary>
     
    154158#region Helpers
    155159
    156                 protected static readonly byte[] JsonEmptyData;
    157                
    158                 static AbsRestApi () {
    159                         JsonWriter writer = new JsonWriter ();
    160                         writer.WriteBeginArray ();
    161                         writer.WriteEndArray ();
    162                         JsonEmptyData = writer.ToUtf8ByteArray ();
    163                 }
    164 
    165160                protected static void PrepareEnvelopedResult (out JsonWriter _writer) {
    166161                        WebUtils.PrepareEnvelopedResult (out _writer);
     
    173168                }
    174169
    175                 protected static void SendErrorResult (RequestContext _context, HttpStatusCode _statusCode, byte[] _jsonInputData = null, string _errorCode = null, Exception _exception = null) {
     170                protected static void SendEmptyResponse (RequestContext _context, HttpStatusCode _statusCode = HttpStatusCode.OK, byte[] _jsonInputData = null, string _errorCode = null, Exception _exception = null) {
    176171                        PrepareEnvelopedResult (out JsonWriter writer);
    177                         writer.WriteRaw (JsonEmptyData);
     172                        writer.WriteRaw (WebUtils.JsonEmptyData);
    178173                        SendEnvelopedResult (_context, ref writer, _statusCode, _jsonInputData, _errorCode, _exception);
    179174                }
    180 
    181                 protected static bool TryGetJsonField (IDictionary<string, object> _jsonObject, string _fieldName, out int _value) {
    182                         _value = default;
    183                        
    184                         if (!_jsonObject.TryGetValue (_fieldName, out object fieldNode)) {
    185                                 return false;
    186                         }
    187 
    188                         if (fieldNode is not double value) {
    189                                 return false;
    190                         }
    191 
    192                         try {
    193                                 _value = (int)value;
    194                                 return true;
    195                         } catch (Exception) {
    196                                 return false;
    197                         }
    198                 }
    199 
    200                 protected static bool TryGetJsonField (IDictionary<string, object> _jsonObject, string _fieldName, out double _value) {
    201                         _value = default;
    202                        
    203                         if (!_jsonObject.TryGetValue (_fieldName, out object fieldNode)) {
    204                                 return false;
    205                         }
    206 
    207                         if (fieldNode is not double value) {
    208                                 return false;
    209                         }
    210 
    211                         try {
    212                                 _value = value;
    213                                 return true;
    214                         } catch (Exception) {
    215                                 return false;
    216                         }
    217                 }
    218 
    219                 protected static bool TryGetJsonField (IDictionary<string, object> _jsonObject, string _fieldName, out string _value) {
    220                         _value = default;
    221                        
    222                         if (!_jsonObject.TryGetValue (_fieldName, out object fieldNode)) {
    223                                 return false;
    224                         }
    225 
    226                         if (fieldNode is not string value) {
    227                                 return false;
    228                         }
    229 
    230                         try {
    231                                 _value = value;
    232                                 return true;
    233                         } catch (Exception) {
    234                                 return false;
    235                         }
    236                 }
    237                
    238175
    239176#endregion
  • binary-improvements2/WebServer/src/WebAPI/JsonCommons.cs

    r426 r434  
    11using System;
     2using System.Collections.Generic;
     3using System.Globalization;
    24using UnityEngine;
    35using Utf8Json;
     
    5759                }
    5860
     61                public static bool TryReadPlatformUserIdentifier (IDictionary<string, object> _jsonInput, out PlatformUserIdentifierAbs _userIdentifier) {
     62                        if (TryGetJsonField (_jsonInput, "combinedString", out string combinedString)) {
     63                                _userIdentifier = PlatformUserIdentifierAbs.FromCombinedString (combinedString, false);
     64                                if (_userIdentifier != null) {
     65                                        return true;
     66                                }
     67                        }
     68                       
     69                        if (!TryGetJsonField (_jsonInput, "platformId", out string platformId)) {
     70                                _userIdentifier = default;
     71                                return false;
     72                        }
     73
     74                        if (!TryGetJsonField (_jsonInput, "userId", out string userId)) {
     75                                _userIdentifier = default;
     76                                return false;
     77                        }
     78
     79                        _userIdentifier = PlatformUserIdentifierAbs.FromPlatformAndId (platformId, userId, false);
     80                        return _userIdentifier != null;
     81                }
     82
    5983                public static void WriteDateTime (ref JsonWriter _writer, DateTime _dateTime) {
    6084                        _writer.WriteString (_dateTime.ToString ("o"));
    6185                }
    6286
    63                 public static void WriteStringOrNull (ref JsonWriter _writer, string _string) {
    64                         if (_string == null) {
    65                                 _writer.WriteNull ();
    66                         } else {
    67                                 _writer.WriteString (_string);
     87                public static bool TryReadDateTime (IDictionary<string, object> _jsonInput, string _fieldName, out DateTime _result) {
     88                        _result = default;
     89                       
     90                        if (!TryGetJsonField (_jsonInput, _fieldName, out string dateTimeString)) {
     91                                return false;
     92                        }
     93
     94                        return DateTime.TryParse (dateTimeString, null, DateTimeStyles.RoundtripKind, out _result);
     95                }
     96
     97
     98                public static bool TryGetJsonField (IDictionary<string, object> _jsonObject, string _fieldName, out int _value) {
     99                        _value = default;
     100                       
     101                        if (!_jsonObject.TryGetValue (_fieldName, out object fieldNode)) {
     102                                return false;
     103                        }
     104
     105                        if (fieldNode is not double value) {
     106                                return false;
     107                        }
     108
     109                        try {
     110                                _value = (int)value;
     111                                return true;
     112                        } catch (Exception) {
     113                                return false;
     114                        }
     115                }
     116
     117                public static bool TryGetJsonField (IDictionary<string, object> _jsonObject, string _fieldName, out double _value) {
     118                        _value = default;
     119                       
     120                        if (!_jsonObject.TryGetValue (_fieldName, out object fieldNode)) {
     121                                return false;
     122                        }
     123
     124                        if (fieldNode is not double value) {
     125                                return false;
     126                        }
     127
     128                        try {
     129                                _value = value;
     130                                return true;
     131                        } catch (Exception) {
     132                                return false;
     133                        }
     134                }
     135
     136                public static bool TryGetJsonField (IDictionary<string, object> _jsonObject, string _fieldName, out string _value) {
     137                        _value = default;
     138                       
     139                        if (!_jsonObject.TryGetValue (_fieldName, out object fieldNode)) {
     140                                return false;
     141                        }
     142
     143                        if (fieldNode is not string value) {
     144                                return false;
     145                        }
     146
     147                        try {
     148                                _value = value;
     149                                return true;
     150                        } catch (Exception) {
     151                                return false;
     152                        }
     153                }
     154
     155                public static bool TryGetJsonField (IDictionary<string, object> _jsonObject, string _fieldName,
     156                        out IDictionary<string, object> _value) {
     157                        _value = default;
     158                       
     159                        if (!_jsonObject.TryGetValue (_fieldName, out object fieldNode)) {
     160                                return false;
     161                        }
     162
     163                        if (fieldNode is not IDictionary<string, object> value) {
     164                                return false;
     165                        }
     166
     167                        try {
     168                                _value = value;
     169                                return true;
     170                        } catch (Exception) {
     171                                return false;
    68172                        }
    69173                }
Note: See TracChangeset for help on using the changeset viewer.