using System;
namespace Quadarax.Foundation.Core.QConsole.Value
{
public abstract class AbstractValue
{
private object _value;
///
/// Defines if value is set. Not null.
///
public bool HasValue => _value != null;
///
/// Returns underlying system value type.
///
public Type ValueType { get; }
public AbstractValue()
{
Reset();
}
public AbstractValue(Type valueType, object value) : this(valueType)
{
_value = value;
}
protected AbstractValue(Type valueType)
{
ValueType = valueType ?? throw new ArgumentNullException(nameof(valueType));
}
protected abstract object ConvertStringToValue(string valueAsString);
public abstract string AsString();
public void Set(string valueAsString)
{
if (string.IsNullOrEmpty(valueAsString))
{
Reset();
return;
}
Set(ConvertStringToValue(valueAsString));
}
public virtual void Set(object value)
{
_value = value;
}
public object Get()
{
return _value;
}
public void Reset()
{
_value = null;
}
public static AbstractValue Create(TypeValuesEnum typeValue)
{
switch (typeValue)
{
case TypeValuesEnum.Bool:
return new BoolValue();
case TypeValuesEnum.Date:
return new DateValue();
case TypeValuesEnum.DateTime:
return new DateTimeValue();
case TypeValuesEnum.Decimal:
return new DecimalValue();
case TypeValuesEnum.Guid:
return new GuidValue();
case TypeValuesEnum.Integer:
return new IntegerValue();
case TypeValuesEnum.String:
return new StringValue();
case TypeValuesEnum.Time:
return new TimeValue();
case TypeValuesEnum.TimeSpan:
return new TimeSpanValue();
default:
throw new NotSupportedException($"Unsupported argument value '{typeValue}'");
}
}
public override string ToString()
{
return AsString();
}
}
}