Agenda/ISaveTarget.cs
using System.Text.Json.Nodes;

namespace PlanetMeat;

public interface ISaveTarget
{
	public JsonNode NextSave { get; }

	public void LoadFromSave( JsonNode save );
	public void ClearSave();
}

public static partial class Extensions
{
	public static JsonObject ToSaveObject<T>( this IEnumerable<KeyValuePair<string, T>> kvs ) where T : ISaveTarget
	{
		var json = new JsonObject();
		foreach ( var (key, target) in kvs )
			json.Add( key, target.NextSave );
		return json;
	}

	public static void LoadFromSaveObject<T>( this IEnumerable<KeyValuePair<string, T>> kvs, JsonObject json ) where T : ISaveTarget
	{
		foreach ( var (key, target) in kvs )
		{
			if ( json.TryGetPropertyValue( key, out var n ) )
				target.LoadFromSave( n );
		}
	}

	public static void ClearSavedInfo<T>( this IEnumerable<KeyValuePair<string, T>> kvs ) where T : ISaveTarget
	{
		foreach ( var (_, target) in kvs )
			target.ClearSave();
	}
}