• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1package android
2
3import (
4	"github.com/google/blueprint"
5)
6
7// OtherModuleProviderContext is a helper interface that is a subset of ModuleContext or BottomUpMutatorContext
8// 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 = SingletonContext(nil)
17var _ OtherModuleProviderContext = (*TestContext)(nil)
18
19// ConfigAndOtherModuleProviderContext is OtherModuleProviderContext + ConfigContext
20type ConfigAndOtherModuleProviderContext interface {
21	OtherModuleProviderContext
22	ConfigContext
23}
24
25// OtherModuleProvider reads the provider for the given module.  If the provider has been set the value is
26// returned and the boolean is true.  If it has not been set the zero value of the provider's type  is returned
27// and the boolean is false.  The value returned may be a deep copy of the value originally passed to SetProvider.
28//
29// OtherModuleProviderContext is a helper interface that accepts ModuleContext or BottomUpMutatorContext.
30func OtherModuleProvider[K any](ctx OtherModuleProviderContext, module blueprint.Module, provider blueprint.ProviderKey[K]) (K, bool) {
31	value, ok := ctx.otherModuleProvider(getWrappedModule(module), provider)
32	if !ok {
33		var k K
34		return k, false
35	}
36	return value.(K), ok
37}
38
39func OtherModuleProviderOrDefault[K any](ctx OtherModuleProviderContext, module blueprint.Module, provider blueprint.ProviderKey[K]) K {
40	value, _ := OtherModuleProvider(ctx, module, provider)
41	return value
42}
43
44func OtherModulePointerProviderOrDefault[K *T, T any](ctx OtherModuleProviderContext, module blueprint.Module, provider blueprint.ProviderKey[K]) K {
45	if value, ok := OtherModuleProvider(ctx, module, provider); ok {
46		return value
47	}
48	var val T
49	return &val
50}
51
52// ModuleProviderContext is a helper interface that is a subset of ModuleContext or BottomUpMutatorContext
53// for use in ModuleProvider.
54type ModuleProviderContext interface {
55	provider(provider blueprint.AnyProviderKey) (any, bool)
56}
57
58var _ ModuleProviderContext = BaseModuleContext(nil)
59var _ ModuleProviderContext = ModuleContext(nil)
60var _ ModuleProviderContext = BottomUpMutatorContext(nil)
61
62// ModuleProvider reads the provider for the current module.  If the provider has been set the value is
63// returned and the boolean is true.  If it has not been set the zero value of the provider's type  is returned
64// and the boolean is false.  The value returned may be a deep copy of the value originally passed to SetProvider.
65//
66// ModuleProviderContext is a helper interface that accepts ModuleContext or BottomUpMutatorContext.
67func ModuleProvider[K any](ctx ModuleProviderContext, provider blueprint.ProviderKey[K]) (K, bool) {
68	value, ok := ctx.provider(provider)
69	if !ok {
70		var k K
71		return k, false
72	}
73	return value.(K), ok
74}
75
76// SetProviderContext is a helper interface that is a subset of ModuleContext or BottomUpMutatorContext
77// for use in SetProvider.
78type SetProviderContext interface {
79	setProvider(provider blueprint.AnyProviderKey, value any)
80}
81
82var _ SetProviderContext = BaseModuleContext(nil)
83var _ SetProviderContext = ModuleContext(nil)
84var _ SetProviderContext = BottomUpMutatorContext(nil)
85
86// SetProvider sets the value for a provider for the current module.  It panics if not called
87// during the appropriate mutator or GenerateBuildActions pass for the provider, if the value
88// is not of the appropriate type, or if the value has already been set.  The value should not
89// be modified after being passed to SetProvider.
90//
91// SetProviderContext is a helper interface that accepts ModuleContext or BottomUpMutatorContext.
92func SetProvider[K any](ctx SetProviderContext, provider blueprint.ProviderKey[K], value K) {
93	ctx.setProvider(provider, value)
94}
95
96var _ OtherModuleProviderContext = (*otherModuleProviderAdaptor)(nil)
97
98// An OtherModuleProviderFunc can be passed to NewOtherModuleProviderAdaptor to create an OtherModuleProviderContext
99// for use in tests.
100type OtherModuleProviderFunc func(module blueprint.Module, provider blueprint.AnyProviderKey) (any, bool)
101
102type otherModuleProviderAdaptor struct {
103	otherModuleProviderFunc OtherModuleProviderFunc
104}
105
106func (p *otherModuleProviderAdaptor) otherModuleProvider(module blueprint.Module, provider blueprint.AnyProviderKey) (any, bool) {
107	return p.otherModuleProviderFunc(module, provider)
108}
109
110// NewOtherModuleProviderAdaptor returns an OtherModuleProviderContext that proxies calls to otherModuleProvider to
111// the provided OtherModuleProviderFunc.  It can be used in tests to unit test methods that need to call
112// android.OtherModuleProvider.
113func NewOtherModuleProviderAdaptor(otherModuleProviderFunc OtherModuleProviderFunc) OtherModuleProviderContext {
114	return &otherModuleProviderAdaptor{otherModuleProviderFunc}
115}
116