public static async Task <FdbSystemStatus> GetStatusAsync([NotNull] IFdbReadOnlyTransaction trans)
            {
                Contract.NotNull(trans, nameof(trans));

                Slice data = await trans.GetAsync(StatusJsonKey).ConfigureAwait(false);

                if (data.IsNullOrEmpty)
                {
                    return(null);
                }

                string jsonText = data.ToUnicode();

                var doc = TinyJsonParser.ParseObject(jsonText);

                if (doc == null)
                {
                    return(null);
                }

                long rv = 0;

                if (doc.ContainsKey("cluster"))
                {
                    rv = await trans.GetReadVersionAsync();
                }

                return(new FdbSystemStatus(doc, rv, jsonText));
            }
        //TODO: values will vary depending on the "Role" !

        public static ProcessRoleMetrics Create(Dictionary <string, object?>?data)
        {
            string?role = TinyJsonParser.GetStringField(data, "role");

            switch (role)
            {
            case null:
                return(null !);                       //invalid!

            case "master":
                return(new MasterRoleMetrics(data));

            case "proxy":
                return(new ProxyRoleMetrics(data));

            case "resolver":
                return(new ResolverRoleMetrics(data));

            case "cluster_controller":
                return(new ClusterControllerRoleMetrics(data));

            case "log":
                return(new LogRoleMetrics(data));

            case "storage":
                return(new StorageRoleMetrics(data));

            default:
                return(new ProcessRoleMetrics(data, role));
            }
        }
            public static async Task <FdbSystemStatus?> GetStatusAsync(IFdbReadOnlyTransaction trans)
            {
                Contract.NotNull(trans);

                var data = await trans.GetAsync(StatusJsonKey).ConfigureAwait(false);

                if (data.IsNullOrEmpty)
                {
                    return(null);
                }

                var doc = TinyJsonParser.ParseObject(data);

                if (doc == null)
                {
                    return(null);
                }

                long rv = 0;

                if (doc.ContainsKey("cluster"))
                {
                    rv = await trans.GetReadVersionAsync();
                }

                return(new FdbSystemStatus(doc, rv, data));
            }
 internal FdbSystemStatus(Dictionary <string, object?>?doc, long readVersion, Slice raw)
     : base(doc)
 {
     this.Client      = new ClientStatus(TinyJsonParser.GetMapField(doc, "client"));
     this.Cluster     = new ClusterStatus(TinyJsonParser.GetMapField(doc, "cluster"));
     this.ReadVersion = readVersion;
     this.RawData     = raw;
 }
 internal FdbSystemStatus(Dictionary <string, object> doc, long readVersion, string raw)
     : base(doc)
 {
     m_client      = new ClientStatus(TinyJsonParser.GetMapField(doc, "client"));
     m_cluster     = new ClusterStatus(TinyJsonParser.GetMapField(doc, "cluster"));
     m_readVersion = readVersion;
     m_raw         = raw;
 }
        internal static LoadCounter From(Dictionary <string, object> data, string field)
        {
            var obj = TinyJsonParser.GetMapField(data, field);

            return(new LoadCounter(
                       (long)(TinyJsonParser.GetNumberField(obj, "counter") ?? 0),
                       TinyJsonParser.GetNumberField(obj, "hz") ?? 0,
                       TinyJsonParser.GetNumberField(obj, "roughness") ?? 0
                       ));
        }
        internal static        Message[] FromArray(Dictionary <string, object?>?data, string field)
        {
            var array = TinyJsonParser.GetArrayField(data, field);
            var res   = new Message[array.Count];

            for (int i = 0; i < res.Length; i++)
            {
                var obj = (Dictionary <string, object?>?)array[i];
                (var key, var value) = TinyJsonParser.GetStringPair(obj, "name", "description");
                res[i] = new Message(key !, value !);
            }
            return(res);
        }
        //TODO: values will vary depending on the "Role" !

        public static ProcessRoleMetrics Create(Dictionary <string, object?>?data)
        {
            string?role = TinyJsonParser.GetStringField(data, "role");

            return(role switch
            {
                null => null !,                //invalid!
                "master" => new MasterRoleMetrics(data),
                "proxy" => new ProxyRoleMetrics(data),
                "commit_proxy" => new CommitProxyRoleMetrics(data),
                "grv_proxy" => new GrvProxyRoleMetrics(data),
                "resolver" => new ResolverRoleMetrics(data),
                "cluster_controller" => new ClusterControllerRoleMetrics(data),
                "log" => new LogRoleMetrics(data),
                "storage" => new StorageRoleMetrics(data),
                "ratekeeper" => new RateKeeperRoleMetrics(data),
                "data_distributor" => new DataDistributorRoleMetrics(data),
                _ => new ProcessRoleMetrics(data, role)
            });
 protected string?GetString(string field1, string field2)
 {
     return(TinyJsonParser.GetStringField(TinyJsonParser.GetMapField(m_data, field1), field2));
 }
 internal static Message From(Dictionary <string, object?>?data, string field)
 {
     (var key, var value) = TinyJsonParser.GetStringPair(TinyJsonParser.GetMapField(data, field), "name", "description");
     return(new Message(key ?? string.Empty, value ?? string.Empty));
 }
 protected bool?GetBoolean(string field1, string field2)
 {
     return(TinyJsonParser.GetBooleanField(TinyJsonParser.GetMapField(m_data, field1), field2));
 }
        internal static Message From(Dictionary <string, object> data, string field)
        {
            var kvp = TinyJsonParser.GetStringPair(TinyJsonParser.GetMapField(data, field), "name", "description");

            return(new Message(kvp.Key ?? String.Empty, kvp.Value ?? String.Empty));
        }
 protected double?GetDouble(string field1, string field2)
 {
     return(TinyJsonParser.GetNumberField(TinyJsonParser.GetMapField(m_data, field1), field2));
 }
 protected bool?GetBoolean(string field)
 {
     return(TinyJsonParser.GetBooleanField(m_data, field));
 }
 protected double?GetDouble(string field)
 {
     return(TinyJsonParser.GetNumberField(m_data, field));
 }
        protected long?GetInt64(string field1, string field2)
        {
            var x = TinyJsonParser.GetNumberField(TinyJsonParser.GetMapField(m_data, field1), field2);

            return(x.HasValue ? (long?)x.Value : null);
        }
 protected Dictionary <string, object?>?GetMap(string field)
 {
     return(TinyJsonParser.GetMapField(m_data, field));
 }
 protected string?GetString(string field)
 {
     return(TinyJsonParser.GetStringField(m_data, field));
 }
 protected List <object?>?GetArray(string field)
 {
     return(TinyJsonParser.GetArrayField(m_data, field));
 }