Code/Core/Node.Serializable.cs
namespace Nodebox;
public partial class Node {
public class Serializable {
public Serializable() { }
[JsonInclude]
[Property]
public SerializableType SerializableType { get; set; } = null;
[JsonIgnore]
[Hide]
public Type Type => SerializableType?.Type;
[JsonInclude]
[Property]
public (List<Pin> Input, List<Pin> Output)? Pins { get; set; } = null;
[JsonInclude]
[Property]
[Hide]
public List<SerializableObject> Inputs { get; set; } = [];
public Dictionary<string, SerializableObject> Properties { get; set; } = [];
public static Serializable From<T>(List<object> inputs = null, Dictionary<string, object> properties = null)
where T : Node =>
new() {
SerializableType = typeof(T),
Pins = GetInitialPins<T>(),
Inputs = inputs?.Select(x => new SerializableObject(x))?.ToList() ?? [],
Properties = properties?.Select(x => (x.Key, new SerializableObject(x.Value)))?.ToDictionary() ?? [],
};
public Node Create() {
var node = SerializableType.Create<Node>();
if (Pins.HasValue) {
// Log.Info(Pins.Value.Input.Count);
node.SetPins((Pins.Value.Input, Pins.Value.Output));
}
foreach (var pair in Inputs.Enumerate()) {
if (pair.Index >= node.inputValues.Count) {
// Log.Warning($"{pair.Index} >= {node.inputValues.Count}, out of range input value index");
break;
}
node.inputValues[pair.Index] = pair.Item.Value;
}
foreach (var pair in Properties) {
node.SetProperty(pair.Key, pair.Value.Value);
}
return node;
}
}
}