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