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