| package android |
| |
| import ( |
| "github.com/google/blueprint" |
| ) |
| |
| // OtherModuleProviderContext is a helper interface that is a subset of ModuleContext, BottomUpMutatorContext, or |
| // TopDownMutatorContext for use in OtherModuleProvider. |
| type OtherModuleProviderContext interface { |
| otherModuleProvider(m blueprint.Module, provider blueprint.AnyProviderKey) (any, bool) |
| } |
| |
| var _ OtherModuleProviderContext = BaseModuleContext(nil) |
| var _ OtherModuleProviderContext = ModuleContext(nil) |
| var _ OtherModuleProviderContext = BottomUpMutatorContext(nil) |
| var _ OtherModuleProviderContext = TopDownMutatorContext(nil) |
| |
| // OtherModuleProvider reads the provider for the given module. If the provider has been set the value is |
| // returned and the boolean is true. If it has not been set the zero value of the provider's type is returned |
| // and the boolean is false. The value returned may be a deep copy of the value originally passed to SetProvider. |
| // |
| // OtherModuleProviderContext is a helper interface that accepts ModuleContext, BottomUpMutatorContext, or |
| // TopDownMutatorContext. |
| func OtherModuleProvider[K any](ctx OtherModuleProviderContext, module blueprint.Module, provider blueprint.ProviderKey[K]) (K, bool) { |
| value, ok := ctx.otherModuleProvider(module, provider) |
| if !ok { |
| var k K |
| return k, false |
| } |
| return value.(K), ok |
| } |
| |
| // ModuleProviderContext is a helper interface that is a subset of ModuleContext, BottomUpMutatorContext, or |
| // TopDownMutatorContext for use in ModuleProvider. |
| type ModuleProviderContext interface { |
| provider(provider blueprint.AnyProviderKey) (any, bool) |
| } |
| |
| var _ ModuleProviderContext = BaseModuleContext(nil) |
| var _ ModuleProviderContext = ModuleContext(nil) |
| var _ ModuleProviderContext = BottomUpMutatorContext(nil) |
| var _ ModuleProviderContext = TopDownMutatorContext(nil) |
| |
| // ModuleProvider reads the provider for the current module. If the provider has been set the value is |
| // returned and the boolean is true. If it has not been set the zero value of the provider's type is returned |
| // and the boolean is false. The value returned may be a deep copy of the value originally passed to SetProvider. |
| // |
| // ModuleProviderContext is a helper interface that accepts ModuleContext, BottomUpMutatorContext, or |
| // TopDownMutatorContext. |
| func ModuleProvider[K any](ctx ModuleProviderContext, provider blueprint.ProviderKey[K]) (K, bool) { |
| value, ok := ctx.provider(provider) |
| if !ok { |
| var k K |
| return k, false |
| } |
| return value.(K), ok |
| } |
| |
| type SingletonModuleProviderContext interface { |
| moduleProvider(blueprint.Module, blueprint.AnyProviderKey) (any, bool) |
| } |
| |
| var _ SingletonModuleProviderContext = SingletonContext(nil) |
| var _ SingletonModuleProviderContext = (*TestContext)(nil) |
| |
| // SingletonModuleProvider wraps blueprint.SingletonModuleProvider to provide a type-safe method to retrieve the value |
| // of the given provider from a module using a SingletonContext. If the provider has not been set the first return |
| // value will be the zero value of the provider's type, and the second return value will be false. If the provider has |
| // been set the second return value will be true. |
| func SingletonModuleProvider[K any](ctx SingletonModuleProviderContext, module blueprint.Module, provider blueprint.ProviderKey[K]) (K, bool) { |
| value, ok := ctx.moduleProvider(module, provider) |
| if !ok { |
| var k K |
| return k, false |
| } |
| return value.(K), ok |
| } |
| |
| // SetProviderContext is a helper interface that is a subset of ModuleContext, BottomUpMutatorContext, or |
| // TopDownMutatorContext for use in SetProvider. |
| type SetProviderContext interface { |
| setProvider(provider blueprint.AnyProviderKey, value any) |
| } |
| |
| var _ SetProviderContext = BaseModuleContext(nil) |
| var _ SetProviderContext = ModuleContext(nil) |
| var _ SetProviderContext = BottomUpMutatorContext(nil) |
| var _ SetProviderContext = TopDownMutatorContext(nil) |
| |
| // SetProvider sets the value for a provider for the current module. It panics if not called |
| // during the appropriate mutator or GenerateBuildActions pass for the provider, if the value |
| // is not of the appropriate type, or if the value has already been set. The value should not |
| // be modified after being passed to SetProvider. |
| // |
| // SetProviderContext is a helper interface that accepts ModuleContext, BottomUpMutatorContext, or |
| // TopDownMutatorContext. |
| func SetProvider[K any](ctx SetProviderContext, provider blueprint.ProviderKey[K], value K) { |
| ctx.setProvider(provider, value) |
| } |
| |
| var _ OtherModuleProviderContext = (*otherModuleProviderAdaptor)(nil) |
| |
| // An OtherModuleProviderFunc can be passed to NewOtherModuleProviderAdaptor to create an OtherModuleProviderContext |
| // for use in tests. |
| type OtherModuleProviderFunc func(module blueprint.Module, provider blueprint.AnyProviderKey) (any, bool) |
| |
| type otherModuleProviderAdaptor struct { |
| otherModuleProviderFunc OtherModuleProviderFunc |
| } |
| |
| func (p *otherModuleProviderAdaptor) otherModuleProvider(module blueprint.Module, provider blueprint.AnyProviderKey) (any, bool) { |
| return p.otherModuleProviderFunc(module, provider) |
| } |
| |
| // NewOtherModuleProviderAdaptor returns an OtherModuleProviderContext that proxies calls to otherModuleProvider to |
| // the provided OtherModuleProviderFunc. It can be used in tests to unit test methods that need to call |
| // android.OtherModuleProvider. |
| func NewOtherModuleProviderAdaptor(otherModuleProviderFunc OtherModuleProviderFunc) OtherModuleProviderContext { |
| return &otherModuleProviderAdaptor{otherModuleProviderFunc} |
| } |