xref: /aosp_15_r20/build/soong/android/provider.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1package 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)
17var _ OtherModuleProviderContext = SingletonContext(nil)
18var _ OtherModuleProviderContext = (*TestContext)(nil)
19
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) {
27	value, ok := ctx.otherModuleProvider(getWrappedModule(module), provider)
28	if !ok {
29		var k K
30		return k, false
31	}
32	return value.(K), ok
33}
34
35func OtherModuleProviderOrDefault[K any](ctx OtherModuleProviderContext, module blueprint.Module, provider blueprint.ProviderKey[K]) K {
36	value, _ := OtherModuleProvider(ctx, module, provider)
37	return value
38}
39
40// 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
66// SetProviderContext is a helper interface that is a subset of ModuleContext, BottomUpMutatorContext, or
67// TopDownMutatorContext for use in SetProvider.
68type SetProviderContext interface {
69	setProvider(provider blueprint.AnyProviderKey, value any)
70}
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) {
85	ctx.setProvider(provider, value)
86}
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}
108