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
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()); |
|
} |
|
}
|
|
|