using System.Text.Json.Serialization;
using System.Threading;
namespace Sandbox.Resources;
///
/// Takes the "source" of a resource and creates a compiled version. The compiled version
/// can create a number of child resources and store binary data.
///
[Expose]
public abstract partial class ResourceCompiler
{
[JsonIgnore]
public ResourceCompileContext Context { get; private set; }
protected ResourceCompiler() { }
internal void SetContext( ResourceCompileContext context )
{
Context = context;
}
internal bool CompileEmbeddedInternal( ref EmbeddedResource json )
{
try
{
return CompileEmbedded( ref json );
}
catch ( System.Exception e )
{
Log.Error( e, "Exception when compiulnig resource" );
return false;
}
}
protected virtual bool CompileEmbedded( ref EmbeddedResource json )
{
return false;
}
internal bool CompileInternal()
{
try
{
var t = Task.Run( Compile );
while ( !t.IsCompleted )
{
Thread.Sleep( 1 );
}
return t.Result;
}
catch ( System.Exception e )
{
Log.Error( e, $"Exception when compiling resource {Context?.AbsolutePath}" );
return false;
}
}
protected abstract Task Compile();
///
/// Mark a ResourceCompiler. This is used to identify the compiler for a specific file extension, or compiler.
///
[AttributeUsage( AttributeTargets.Class, AllowMultiple = true )]
public sealed class ResourceIdentityAttribute : System.Attribute
{
public string Name { get; set; }
public ResourceIdentityAttribute( string name )
{
Name = name;
}
}
}