Make `ApiContainer` props return `null` if req. services unavailable

specifically `MemoryEvents` and `MemorySaveState`
now they behave like `[OptionalApi]` rather than `[RequiredApi]`
This commit is contained in:
YoshiRulz 2023-03-10 04:30:52 +10:00
parent 6387291e37
commit 2fca4282a9
No known key found for this signature in database
GPG Key ID: C4DE31C245353FB7
1 changed files with 50 additions and 15 deletions

View File

@ -9,24 +9,51 @@ namespace BizHawk.Client.Common
{ {
public readonly IReadOnlyDictionary<Type, IExternalApi> Libraries; public readonly IReadOnlyDictionary<Type, IExternalApi> Libraries;
public ICommApi Comm => (ICommApi) Libraries[typeof(ICommApi)]; public ICommApi Comm
public IEmuClientApi EmuClient => (IEmuClientApi) Libraries[typeof(IEmuClientApi)]; => Get<ICommApi>();
public IEmulationApi Emulation => (IEmulationApi) Libraries[typeof(IEmulationApi)];
public IEmuClientApi EmuClient
=> Get<IEmuClientApi>();
public IEmulationApi Emulation
=> Get<IEmulationApi>(); // requires IEmulator
[Obsolete("use Emulation")] [Obsolete("use Emulation")]
public IGameInfoApi GameInfo => (IGameInfoApi) Libraries[typeof(IGameInfoApi)]; public IGameInfoApi GameInfo
=> Get<IGameInfoApi>();
public IGuiApi Gui => (IGuiApi) Libraries[typeof(IGuiApi)]; public IGuiApi Gui
public IInputApi Input => (IInputApi) Libraries[typeof(IInputApi)]; => Get<IGuiApi>(); // requires IEmulator
public IJoypadApi Joypad => (IJoypadApi) Libraries[typeof(IJoypadApi)];
public IMemoryApi Memory => (IMemoryApi) Libraries[typeof(IMemoryApi)]; public IInputApi Input
public IMemoryEventsApi MemoryEvents => (IMemoryEventsApi) Libraries[typeof(IMemoryEventsApi)]; => Get<IInputApi>();
public IMemorySaveStateApi MemorySaveState => (IMemorySaveStateApi) Libraries[typeof(IMemorySaveStateApi)];
public IMovieApi Movie => (IMovieApi) Libraries[typeof(IMovieApi)]; public IJoypadApi Joypad
public ISaveStateApi SaveState => (ISaveStateApi) Libraries[typeof(ISaveStateApi)]; => Get<IJoypadApi>();
public ISQLiteApi SQLite => (ISQLiteApi) Libraries[typeof(ISQLiteApi)];
public IUserDataApi UserData => (IUserDataApi) Libraries[typeof(IUserDataApi)]; public IMemoryApi Memory
public IToolApi Tool => (IToolApi) Libraries[typeof(IToolApi)]; => Get<IMemoryApi>(); // requires IEmulator
public IMemoryEventsApi? MemoryEvents
=> TryGet<IMemoryEventsApi>(); // requires IDebuggable
public IMemorySaveStateApi? MemorySaveState
=> TryGet<IMemorySaveStateApi>(); // requires IStatable
public IMovieApi Movie
=> Get<IMovieApi>();
public ISaveStateApi SaveState
=> Get<ISaveStateApi>();
public ISQLiteApi SQLite
=> Get<ISQLiteApi>();
public IUserDataApi UserData
=> Get<IUserDataApi>();
public IToolApi Tool
=> Get<IToolApi>();
public ApiContainer(IReadOnlyDictionary<Type, IExternalApi> libs) => Libraries = libs; public ApiContainer(IReadOnlyDictionary<Type, IExternalApi> libs) => Libraries = libs;
@ -34,5 +61,13 @@ namespace BizHawk.Client.Common
{ {
foreach (var lib in Libraries.Values) if (lib is IDisposable disposableLib) disposableLib.Dispose(); foreach (var lib in Libraries.Values) if (lib is IDisposable disposableLib) disposableLib.Dispose();
} }
public T Get<T>()
where T : class, IExternalApi
=> (T) Libraries[typeof(T)];
public T? TryGet<T>()
where T : class, IExternalApi
=> Libraries.TryGetValue(typeof(T), out var inst) ? (T) inst : null;
} }
} }