|
@ -1,5 +1,6 @@ |
|
|
using System; |
|
|
using System; |
|
|
using System.Collections; |
|
|
using System.Collections; |
|
|
|
|
|
using System.Collections.Generic; |
|
|
using System.Linq; |
|
|
using System.Linq; |
|
|
using System.Text; |
|
|
using System.Text; |
|
|
using System.Threading.Tasks; |
|
|
using System.Threading.Tasks; |
|
@ -8,48 +9,125 @@ namespace IPA.Config.Data |
|
|
{ |
|
|
{ |
|
|
/// <summary>
|
|
|
/// <summary>
|
|
|
/// A base value type for config data abstract representations, to be serialized with an
|
|
|
/// A base value type for config data abstract representations, to be serialized with an
|
|
|
/// <see cref="IConfigProvider"/>.
|
|
|
|
|
|
|
|
|
/// <see cref="IConfigProvider"/>. If a <see cref="Value"/> is <see langword="null"/>, then
|
|
|
|
|
|
/// that represents just that: a <c>null</c> in whatever serialization is being used.
|
|
|
|
|
|
/// Also contains factory functions for all derived types.
|
|
|
/// </summary>
|
|
|
/// </summary>
|
|
|
public abstract class Value |
|
|
public abstract class Value |
|
|
{ |
|
|
{ |
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Converts this <see cref="Value"/> into a human-readable format.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <returns>a human-readable string containing the value provided</returns>
|
|
|
|
|
|
public abstract override string ToString(); |
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Creates a Null <see cref="Value"/>.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <returns><see langword="null"/></returns>
|
|
|
|
|
|
public static Value Null() => null; |
|
|
|
|
|
|
|
|
// not String to prevent overlap with System.String
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// A <see cref="Value"/> representing a piece of text. The only reason this is not named
|
|
|
|
|
|
/// String is so that it doesn't conflict with <see cref="string"/>.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public sealed class Text : Value |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Creates an empty <see cref="List"/>.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <returns>an empty <see cref="List"/></returns>
|
|
|
|
|
|
/// <seealso cref="From(IEnumerable{Value})"/>
|
|
|
|
|
|
public static List List() => new List(); |
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Creates an empty <see cref="Map"/>.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <returns>an empty <see cref="Map"/></returns>
|
|
|
|
|
|
/// <seealso cref="From(IDictionary{string, Value})"/>
|
|
|
|
|
|
public static Map Map() => new Map(); |
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Creates a new <see cref="Value"/> representing a <see cref="string"/>.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="val">the value to wrap</param>
|
|
|
|
|
|
/// <returns>a <see cref="Data.Text"/> wrapping <paramref name="val"/></returns>
|
|
|
|
|
|
/// <seealso cref="Text(string)"/>
|
|
|
|
|
|
public static Text From(string val) => Text(val); |
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Creates a new <see cref="Data.Text"/> object wrapping a <see cref="string"/>.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="val">the value to wrap</param>
|
|
|
|
|
|
/// <returns>a <see cref="Data.Text"/> wrapping <paramref name="val"/></returns>
|
|
|
|
|
|
/// <seealso cref="From(string)"/>
|
|
|
|
|
|
public static Text Text(string val) => val == null ? new Text { Value = val } : null; |
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// A <see cref="Value"/> representing an integer. This may hold a <see cref="long"/>'s
|
|
|
|
|
|
/// worth of data.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public sealed class Integer : Value |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Creates a new <see cref="Value"/> wrapping a <see cref="long"/>.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="val">the value to wrap</param>
|
|
|
|
|
|
/// <returns>a <see cref="Data.Integer"/> wrapping <paramref name="val"/></returns>
|
|
|
|
|
|
/// <seealso cref="Integer(long)"/>
|
|
|
|
|
|
public static Integer From(long val) => Integer(val); |
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Creates a new <see cref="Data.Integer"/> wrapping a <see cref="long"/>.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="val">the value to wrap</param>
|
|
|
|
|
|
/// <returns>a <see cref="Data.Integer"/> wrapping <paramref name="val"/></returns>
|
|
|
|
|
|
/// <seealso cref="From(long)"/>
|
|
|
|
|
|
public static Integer Integer(long val) => new Integer { Value = val }; |
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Creates a new <see cref="Value"/> wrapping a <see cref="double"/>.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="val">the value to wrap</param>
|
|
|
|
|
|
/// <returns>a <see cref="FloatingPoint"/> wrapping <paramref name="val"/></returns>
|
|
|
|
|
|
/// <seealso cref="Float(double)"/>
|
|
|
|
|
|
public static FloatingPoint From(double val) => Float(val); |
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Creates a new <see cref="FloatingPoint"/> wrapping a <see cref="double"/>.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="val">the value to wrap</param>
|
|
|
|
|
|
/// <returns>a <see cref="FloatingPoint"/> wrapping <paramref name="val"/></returns>
|
|
|
|
|
|
/// <seealso cref="From(double)"/>
|
|
|
|
|
|
public static FloatingPoint Float(double val) => new FloatingPoint { Value = val }; |
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// A <see cref="Value"/> representing a floating point value. This may hold a
|
|
|
|
|
|
/// <see cref="double"/>'s worth of data.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public sealed class FloatingPoint : Value |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Creates a new <see cref="Value"/> wrapping a <see cref="bool"/>.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="val">the value to wrap</param>
|
|
|
|
|
|
/// <returns>a <see cref="Boolean"/> wrapping <paramref name="val"/></returns>
|
|
|
|
|
|
/// <seealso cref="Bool(bool)"/>
|
|
|
|
|
|
public static Boolean From(bool val) => Bool(val); |
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Creates a new <see cref="Boolean"/> wrapping a <see cref="bool"/>.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="val">the value to wrap</param>
|
|
|
|
|
|
/// <returns>a <see cref="Boolean"/> wrapping <paramref name="val"/></returns>
|
|
|
|
|
|
/// <seealso cref="From(bool)"/>
|
|
|
|
|
|
public static Boolean Bool(bool val) => new Boolean { Value = val }; |
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// A <see cref="Value"/> representing a boolean value.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public sealed class Boolean : Value |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Creates a new <see cref="Data.List"/> holding the content of an <see cref="IEnumerable{T}"/>
|
|
|
|
|
|
/// of <see cref="Value"/>.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="vals">the <see cref="Value"/>s to initialize the <see cref="Data.List"/> with</param>
|
|
|
|
|
|
/// <returns>a <see cref="Data.List"/> containing the content of <paramref name="vals"/></returns>
|
|
|
|
|
|
/// <seealso cref="List"/>
|
|
|
|
|
|
public static List From(IEnumerable<Value> vals) |
|
|
|
|
|
{ |
|
|
|
|
|
if (vals == null) return null; |
|
|
|
|
|
var l = List(); |
|
|
|
|
|
l.AddRange(vals); |
|
|
|
|
|
return l; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Creates a new <see cref="Data.Map"/> holding the content of an <see cref="IDictionary{TKey, TValue}"/>
|
|
|
|
|
|
/// of <see cref="string"/> to <see cref="Value"/>.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="vals">the dictionary of <see cref="Value"/>s to initialize the <see cref="Data.Map"/> wtih</param>
|
|
|
|
|
|
/// <returns>a <see cref="Data.Map"/> containing the content of <paramref name="vals"/></returns>
|
|
|
|
|
|
/// <seealso cref="Map"/>
|
|
|
|
|
|
public static Map From(IDictionary<string, Value> vals) |
|
|
|
|
|
{ |
|
|
|
|
|
if (vals == null) return null; |
|
|
|
|
|
var m = Map(); |
|
|
|
|
|
foreach (var v in vals) m.Add(v.Key, v.Value); |
|
|
|
|
|
return m; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
} |