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:
parent
6387291e37
commit
2fca4282a9
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue