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 ICommApi Comm => (ICommApi) Libraries[typeof(ICommApi)];
public IEmuClientApi EmuClient => (IEmuClientApi) Libraries[typeof(IEmuClientApi)];
public IEmulationApi Emulation => (IEmulationApi) Libraries[typeof(IEmulationApi)];
public ICommApi Comm
=> Get<ICommApi>();
public IEmuClientApi EmuClient
=> Get<IEmuClientApi>();
public IEmulationApi Emulation
=> Get<IEmulationApi>(); // requires IEmulator
[Obsolete("use Emulation")]
public IGameInfoApi GameInfo => (IGameInfoApi) Libraries[typeof(IGameInfoApi)];
public IGameInfoApi GameInfo
=> Get<IGameInfoApi>();
public IGuiApi Gui => (IGuiApi) Libraries[typeof(IGuiApi)];
public IInputApi Input => (IInputApi) Libraries[typeof(IInputApi)];
public IJoypadApi Joypad => (IJoypadApi) Libraries[typeof(IJoypadApi)];
public IMemoryApi Memory => (IMemoryApi) Libraries[typeof(IMemoryApi)];
public IMemoryEventsApi MemoryEvents => (IMemoryEventsApi) Libraries[typeof(IMemoryEventsApi)];
public IMemorySaveStateApi MemorySaveState => (IMemorySaveStateApi) Libraries[typeof(IMemorySaveStateApi)];
public IMovieApi Movie => (IMovieApi) Libraries[typeof(IMovieApi)];
public ISaveStateApi SaveState => (ISaveStateApi) Libraries[typeof(ISaveStateApi)];
public ISQLiteApi SQLite => (ISQLiteApi) Libraries[typeof(ISQLiteApi)];
public IUserDataApi UserData => (IUserDataApi) Libraries[typeof(IUserDataApi)];
public IToolApi Tool => (IToolApi) Libraries[typeof(IToolApi)];
public IGuiApi Gui
=> Get<IGuiApi>(); // requires IEmulator
public IInputApi Input
=> Get<IInputApi>();
public IJoypadApi Joypad
=> Get<IJoypadApi>();
public IMemoryApi Memory
=> 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;
@ -34,5 +61,13 @@ namespace BizHawk.Client.Common
{
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;
}
}