You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

52 lines
1.8 KiB

using System;
using System.IO;
using System.Reflection;
using System.Text;
using gaemstone.ECS;
namespace gaemstone.Client;
public static class Resources
{
public static Stream GetStream(EntityPath path)
{ var (ass, name) = GetAssemblyAndName(path); return GetStream(ass, name); }
public static Stream GetStream(Assembly assembly, string name)
{
var assemblyName = assembly.GetName().Name;
return assembly.GetManifestResourceStream($"{assemblyName}.Resources.{name}")
?? throw new ArgumentException($"Could not find embedded resource '{name}' in assembly '{assemblyName}'");
}
public static string GetString(EntityPath path)
{ var (ass, name) = GetAssemblyAndName(path); return GetString(ass, name); }
public static string GetString(Assembly assembly, string name)
{
using var stream = GetStream(assembly, name);
using var reader = new StreamReader(stream);
return reader.ReadToEnd();
}
public static byte[] GetBytes(EntityPath path)
{ var (ass, name) = GetAssemblyAndName(path); return GetBytes(ass, name); }
public static byte[] GetBytes(Assembly assembly, string name)
{
using var stream = GetStream(assembly, name);
using var memoryStream = new MemoryStream();
stream.CopyTo(memoryStream);
return memoryStream.ToArray();
}
private static (Assembly, string) GetAssemblyAndName(EntityPath path)
{
if (!path.IsAbsolute) throw new ArgumentException(
$"Path '{path}' must be absolute", nameof(path));
if ((path.Count < 3) || (path[1] != "Resources")) throw new ArgumentException(
$"Path '{path}' must be in the format '/[domain]/Resources/...", nameof(path));
var assembly = Assembly.Load(path[0]);
var builder = new StringBuilder(path[2]);
for (var i = 3; i < path.Count; i++)
builder.Append('.').Append(path[i]);
return (assembly, builder.ToString());
}
}