Skip to content

Commit 2fca428

Browse files
committed
Make ApiContainer props return null if req. services unavailable
specifically `MemoryEvents` and `MemorySaveState` now they behave like `[OptionalApi]` rather than `[RequiredApi]`
1 parent 6387291 commit 2fca428

File tree

1 file changed

+51
-16
lines changed

1 file changed

+51
-16
lines changed

src/BizHawk.Client.Common/Api/ApiContainer.cs

Lines changed: 51 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,30 +9,65 @@ public sealed class ApiContainer : IDisposable
99
{
1010
public readonly IReadOnlyDictionary<Type, IExternalApi> Libraries;
1111

12-
public ICommApi Comm => (ICommApi) Libraries[typeof(ICommApi)];
13-
public IEmuClientApi EmuClient => (IEmuClientApi) Libraries[typeof(IEmuClientApi)];
14-
public IEmulationApi Emulation => (IEmulationApi) Libraries[typeof(IEmulationApi)];
12+
public ICommApi Comm
13+
=> Get<ICommApi>();
14+
15+
public IEmuClientApi EmuClient
16+
=> Get<IEmuClientApi>();
17+
18+
public IEmulationApi Emulation
19+
=> Get<IEmulationApi>(); // requires IEmulator
1520

1621
[Obsolete("use Emulation")]
17-
public IGameInfoApi GameInfo => (IGameInfoApi) Libraries[typeof(IGameInfoApi)];
18-
19-
public IGuiApi Gui => (IGuiApi) Libraries[typeof(IGuiApi)];
20-
public IInputApi Input => (IInputApi) Libraries[typeof(IInputApi)];
21-
public IJoypadApi Joypad => (IJoypadApi) Libraries[typeof(IJoypadApi)];
22-
public IMemoryApi Memory => (IMemoryApi) Libraries[typeof(IMemoryApi)];
23-
public IMemoryEventsApi MemoryEvents => (IMemoryEventsApi) Libraries[typeof(IMemoryEventsApi)];
24-
public IMemorySaveStateApi MemorySaveState => (IMemorySaveStateApi) Libraries[typeof(IMemorySaveStateApi)];
25-
public IMovieApi Movie => (IMovieApi) Libraries[typeof(IMovieApi)];
26-
public ISaveStateApi SaveState => (ISaveStateApi) Libraries[typeof(ISaveStateApi)];
27-
public ISQLiteApi SQLite => (ISQLiteApi) Libraries[typeof(ISQLiteApi)];
28-
public IUserDataApi UserData => (IUserDataApi) Libraries[typeof(IUserDataApi)];
29-
public IToolApi Tool => (IToolApi) Libraries[typeof(IToolApi)];
22+
public IGameInfoApi GameInfo
23+
=> Get<IGameInfoApi>();
24+
25+
public IGuiApi Gui
26+
=> Get<IGuiApi>(); // requires IEmulator
27+
28+
public IInputApi Input
29+
=> Get<IInputApi>();
30+
31+
public IJoypadApi Joypad
32+
=> Get<IJoypadApi>();
33+
34+
public IMemoryApi Memory
35+
=> Get<IMemoryApi>(); // requires IEmulator
36+
37+
public IMemoryEventsApi? MemoryEvents
38+
=> TryGet<IMemoryEventsApi>(); // requires IDebuggable
39+
40+
public IMemorySaveStateApi? MemorySaveState
41+
=> TryGet<IMemorySaveStateApi>(); // requires IStatable
42+
43+
public IMovieApi Movie
44+
=> Get<IMovieApi>();
45+
46+
public ISaveStateApi SaveState
47+
=> Get<ISaveStateApi>();
48+
49+
public ISQLiteApi SQLite
50+
=> Get<ISQLiteApi>();
51+
52+
public IUserDataApi UserData
53+
=> Get<IUserDataApi>();
54+
55+
public IToolApi Tool
56+
=> Get<IToolApi>();
3057

3158
public ApiContainer(IReadOnlyDictionary<Type, IExternalApi> libs) => Libraries = libs;
3259

3360
public void Dispose()
3461
{
3562
foreach (var lib in Libraries.Values) if (lib is IDisposable disposableLib) disposableLib.Dispose();
3663
}
64+
65+
public T Get<T>()
66+
where T : class, IExternalApi
67+
=> (T) Libraries[typeof(T)];
68+
69+
public T? TryGet<T>()
70+
where T : class, IExternalApi
71+
=> Libraries.TryGetValue(typeof(T), out var inst) ? (T) inst : null;
3772
}
3873
}

0 commit comments

Comments
 (0)