private IConfigurationEntry RebuildConfigurationEntry(MongoDbConfigurationDocument doc)
        {
            var entry = new ConfigurationEntry
            {
                Component      = doc.Component,
                Path           = doc.Path,
                Label          = doc.Label ?? doc.Path,
                ValueMeaning   = Enum.TryParse(doc.Meaning, out ConfigurationValueMeaning meaning) ? meaning : ConfigurationValueMeaning.String,
                ValueType      = Enum.TryParse(doc.ValueType, out ConfigurationValueType type) ? type : ConfigurationValueType.String,
                VisibleToPages = doc.VisibleToPages
            };

            switch (entry.ValueType)
            {
            case ConfigurationValueType.Boolean:
                entry.Value = doc.BooleanValue;
                break;

            case ConfigurationValueType.DateTime:
                entry.Value = new DateTime(doc.LongValue.Value, DateTimeKind.Utc);
                break;

            case ConfigurationValueType.Null:
                entry.Value = ConfigurationValue.NullValue;
                break;

            case ConfigurationValueType.String:
                entry.Value = doc.StringValue;
                break;

            case ConfigurationValueType.Integer:
                entry.Value = doc.LongValue.GetValueOrDefault();
                break;

            case ConfigurationValueType.Double:
                entry.Value = doc.DoubleValue.GetValueOrDefault();
                break;

            case ConfigurationValueType.TimeSpan:
                entry.Value = TimeSpan.FromTicks(doc.LongValue.Value);
                break;

            case ConfigurationValueType.Bytes:
                entry.Value = doc.BytesValue;
                break;

            case ConfigurationValueType.Json:
                entry.Value = ConfigurationValue.FromJSON(doc.StringValue);
                break;

            case ConfigurationValueType.Object:
                throw new NotSupportedException("Raw objects loading does not supported in current version");

            default:
                throw new NotImplementedException("Decoding from Mongo configuration document to Configuration value for arbitary types is not supported");
            }
            return(entry);
        }
        public void TestValuesFromDynamic()
        {
            var dynamicEntry = ConfigurationValue.FromJSON(@"{ 
    ""value1"": true, ""value2"": 1, ""value3"": ""Some text"" 
    }");

            Assert.AreEqual(1, dynamicEntry.DynamicValue.value2);
            Assert.AreEqual("Some text", dynamicEntry.DynamicValue.value3);
            Assert.IsTrue(dynamicEntry.DynamicValue.value1);
        }
        public ConfigurationValue ParseLodedConfigurationValue(Value confValue)
        {
            var parsedValue = ConfigurationValue.NullValue;

            switch (confValue.ValueTypeCase)
            {
            case Value.ValueTypeOneofCase.IntegerValue:
                parsedValue = confValue.IntegerValue;
                break;

            case Value.ValueTypeOneofCase.BooleanValue:
                parsedValue = confValue.BooleanValue;
                break;

            case Value.ValueTypeOneofCase.DoubleValue:
                parsedValue = confValue.DoubleValue;
                break;

            case Value.ValueTypeOneofCase.NullValue:
                parsedValue = null;
                break;

            case Value.ValueTypeOneofCase.StringValue:
                parsedValue = confValue.StringValue;
                break;

            case Value.ValueTypeOneofCase.TimestampValue:
                parsedValue = confValue.TimestampValue.ToDateTime();
                break;

            case Value.ValueTypeOneofCase.BlobValue:
                parsedValue = confValue.BlobValue.ToByteArray();
                break;

            case Value.ValueTypeOneofCase.GeoPointValue:
                parsedValue = ConfigurationValue.FromObject(new
                {
                    SchemaType = "GeoPoint",
                    Latitude   = confValue.GeoPointValue.Latitude,
                    Longtitude = confValue.GeoPointValue.Longitude
                });
                break;

            case Value.ValueTypeOneofCase.ArrayValue:
                parsedValue = ConfigurationValue.FromJSON(GenerateJSONFromValue(confValue));
                break;
            }
            return(parsedValue);
        }