blob: 81d17a175f8bee7a4e9dd04e1d7d878914213b77 [file] [log] [blame]
Colin Cross3c0a83d2023-12-12 14:13:26 -08001package android
2
3import (
4 "github.com/google/blueprint"
5)
6
7// OtherModuleProviderContext is a helper interface that is a subset of ModuleContext, BottomUpMutatorContext, or
8// TopDownMutatorContext for use in OtherModuleProvider.
9type OtherModuleProviderContext interface {
10 otherModuleProvider(m blueprint.Module, provider blueprint.AnyProviderKey) (any, bool)
11}
12
13var _ OtherModuleProviderContext = BaseModuleContext(nil)
14var _ OtherModuleProviderContext = ModuleContext(nil)
15var _ OtherModuleProviderContext = BottomUpMutatorContext(nil)
16var _ OtherModuleProviderContext = TopDownMutatorContext(nil)
Yu Liu663e4502024-08-12 18:23:59 +000017var _ OtherModuleProviderContext = SingletonContext(nil)
18var _ OtherModuleProviderContext = (*TestContext)(nil)
Colin Cross3c0a83d2023-12-12 14:13:26 -080019
20// OtherModuleProvider reads the provider for the given module. If the provider has been set the value is
21// returned and the boolean is true. If it has not been set the zero value of the provider's type is returned
22// and the boolean is false. The value returned may be a deep copy of the value originally passed to SetProvider.
23//
24// OtherModuleProviderContext is a helper interface that accepts ModuleContext, BottomUpMutatorContext, or
25// TopDownMutatorContext.
26func OtherModuleProvider[K any](ctx OtherModuleProviderContext, module blueprint.Module, provider blueprint.ProviderKey[K]) (K, bool) {
Yu Liudd9ccb42024-10-07 17:07:44 +000027 value, ok := ctx.otherModuleProvider(getWrappedModule(module), provider)
Colin Cross3c0a83d2023-12-12 14:13:26 -080028 if !ok {
29 var k K
30 return k, false
31 }
32 return value.(K), ok
33}
34
Yu Liud46e5ae2024-08-15 18:46:17 +000035func OtherModuleProviderOrDefault[K any](ctx OtherModuleProviderContext, module blueprint.Module, provider blueprint.ProviderKey[K]) K {
36 value, _ := OtherModuleProvider(ctx, module, provider)
37 return value
38}
39
Colin Cross3c0a83d2023-12-12 14:13:26 -080040// ModuleProviderContext is a helper interface that is a subset of ModuleContext, BottomUpMutatorContext, or
41// TopDownMutatorContext for use in ModuleProvider.
42type ModuleProviderContext interface {
43 provider(provider blueprint.AnyProviderKey) (any, bool)
44}
45
46var _ ModuleProviderContext = BaseModuleContext(nil)
47var _ ModuleProviderContext = ModuleContext(nil)
48var _ ModuleProviderContext = BottomUpMutatorContext(nil)
49var _ ModuleProviderContext = TopDownMutatorContext(nil)
50
51// ModuleProvider reads the provider for the current module. If the provider has been set the value is
52// returned and the boolean is true. If it has not been set the zero value of the provider's type is returned
53// and the boolean is false. The value returned may be a deep copy of the value originally passed to SetProvider.
54//
55// ModuleProviderContext is a helper interface that accepts ModuleContext, BottomUpMutatorContext, or
56// TopDownMutatorContext.
57func ModuleProvider[K any](ctx ModuleProviderContext, provider blueprint.ProviderKey[K]) (K, bool) {
58 value, ok := ctx.provider(provider)
59 if !ok {
60 var k K
61 return k, false
62 }
63 return value.(K), ok
64}
65
Colin Cross3c0a83d2023-12-12 14:13:26 -080066// SetProviderContext is a helper interface that is a subset of ModuleContext, BottomUpMutatorContext, or
67// TopDownMutatorContext for use in SetProvider.
68type SetProviderContext interface {
Colin Cross24c1cbe2023-12-21 23:42:56 +000069 setProvider(provider blueprint.AnyProviderKey, value any)
Colin Cross3c0a83d2023-12-12 14:13:26 -080070}
71
72var _ SetProviderContext = BaseModuleContext(nil)
73var _ SetProviderContext = ModuleContext(nil)
74var _ SetProviderContext = BottomUpMutatorContext(nil)
75var _ SetProviderContext = TopDownMutatorContext(nil)
76
77// SetProvider sets the value for a provider for the current module. It panics if not called
78// during the appropriate mutator or GenerateBuildActions pass for the provider, if the value
79// is not of the appropriate type, or if the value has already been set. The value should not
80// be modified after being passed to SetProvider.
81//
82// SetProviderContext is a helper interface that accepts ModuleContext, BottomUpMutatorContext, or
83// TopDownMutatorContext.
84func SetProvider[K any](ctx SetProviderContext, provider blueprint.ProviderKey[K], value K) {
Colin Cross24c1cbe2023-12-21 23:42:56 +000085 ctx.setProvider(provider, value)
Colin Cross3c0a83d2023-12-12 14:13:26 -080086}
87
88var _ OtherModuleProviderContext = (*otherModuleProviderAdaptor)(nil)
89
90// An OtherModuleProviderFunc can be passed to NewOtherModuleProviderAdaptor to create an OtherModuleProviderContext
91// for use in tests.
92type OtherModuleProviderFunc func(module blueprint.Module, provider blueprint.AnyProviderKey) (any, bool)
93
94type otherModuleProviderAdaptor struct {
95 otherModuleProviderFunc OtherModuleProviderFunc
96}
97
98func (p *otherModuleProviderAdaptor) otherModuleProvider(module blueprint.Module, provider blueprint.AnyProviderKey) (any, bool) {
99 return p.otherModuleProviderFunc(module, provider)
100}
101
102// NewOtherModuleProviderAdaptor returns an OtherModuleProviderContext that proxies calls to otherModuleProvider to
103// the provided OtherModuleProviderFunc. It can be used in tests to unit test methods that need to call
104// android.OtherModuleProvider.
105func NewOtherModuleProviderAdaptor(otherModuleProviderFunc OtherModuleProviderFunc) OtherModuleProviderContext {
106 return &otherModuleProviderAdaptor{otherModuleProviderFunc}
107}