| package aconfig | 
 |  | 
 | import ( | 
 | 	"android/soong/android" | 
 | 	"android/soong/rust" | 
 | 	"fmt" | 
 |  | 
 | 	"github.com/google/blueprint" | 
 | 	"github.com/google/blueprint/proptools" | 
 | ) | 
 |  | 
 | type rustDeclarationsTagType struct { | 
 | 	blueprint.BaseDependencyTag | 
 | } | 
 |  | 
 | var rustDeclarationsTag = rustDeclarationsTagType{} | 
 |  | 
 | type RustAconfigLibraryProperties struct { | 
 | 	// name of the aconfig_declarations module to generate a library for | 
 | 	Aconfig_declarations string | 
 | 	Test                 *bool | 
 | } | 
 |  | 
 | type aconfigDecorator struct { | 
 | 	*rust.BaseSourceProvider | 
 |  | 
 | 	Properties RustAconfigLibraryProperties | 
 | } | 
 |  | 
 | func NewRustAconfigLibrary(hod android.HostOrDeviceSupported) (*rust.Module, *aconfigDecorator) { | 
 | 	aconfig := &aconfigDecorator{ | 
 | 		BaseSourceProvider: rust.NewSourceProvider(), | 
 | 		Properties:         RustAconfigLibraryProperties{}, | 
 | 	} | 
 |  | 
 | 	module := rust.NewSourceProviderModule(android.HostAndDeviceSupported, aconfig, false, false) | 
 | 	return module, aconfig | 
 | } | 
 |  | 
 | // rust_aconfig_library generates aconfig rust code from the provided aconfig declaration. This module type will | 
 | // create library variants that can be used as a crate dependency by adding it to the rlibs, dylibs, and rustlibs | 
 | // properties of other modules. | 
 | func RustAconfigLibraryFactory() android.Module { | 
 | 	module, _ := NewRustAconfigLibrary(android.HostAndDeviceSupported) | 
 | 	return module.Init() | 
 | } | 
 |  | 
 | func (a *aconfigDecorator) SourceProviderProps() []interface{} { | 
 | 	return append(a.BaseSourceProvider.SourceProviderProps(), &a.Properties) | 
 | } | 
 |  | 
 | func (a *aconfigDecorator) GenerateSource(ctx rust.ModuleContext, deps rust.PathDeps) android.Path { | 
 | 	generatedDir := android.PathForModuleGen(ctx) | 
 | 	generatedSource := android.PathForModuleGen(ctx, "src", "lib.rs") | 
 |  | 
 | 	declarationsModules := ctx.GetDirectDepsWithTag(rustDeclarationsTag) | 
 |  | 
 | 	if len(declarationsModules) != 1 { | 
 | 		panic(fmt.Errorf("Exactly one aconfig_declarations property required")) | 
 | 	} | 
 | 	declarations := ctx.OtherModuleProvider(declarationsModules[0], declarationsProviderKey).(declarationsProviderData) | 
 |  | 
 | 	mode := "production" | 
 | 	if proptools.Bool(a.Properties.Test) { | 
 | 		mode = "test" | 
 | 	} | 
 |  | 
 | 	ctx.Build(pctx, android.BuildParams{ | 
 | 		Rule:  rustRule, | 
 | 		Input: declarations.IntermediatePath, | 
 | 		Outputs: []android.WritablePath{ | 
 | 			generatedSource, | 
 | 		}, | 
 | 		Description: "rust_aconfig_library", | 
 | 		Args: map[string]string{ | 
 | 			"gendir": generatedDir.String(), | 
 | 			"mode":   mode, | 
 | 		}, | 
 | 	}) | 
 | 	a.BaseSourceProvider.OutputFiles = android.Paths{generatedSource} | 
 | 	return generatedSource | 
 | } | 
 |  | 
 | func (a *aconfigDecorator) SourceProviderDeps(ctx rust.DepsContext, deps rust.Deps) rust.Deps { | 
 | 	deps = a.BaseSourceProvider.SourceProviderDeps(ctx, deps) | 
 | 	deps.Rustlibs = append(deps.Rustlibs, "libflags_rust") | 
 | 	ctx.AddDependency(ctx.Module(), rustDeclarationsTag, a.Properties.Aconfig_declarations) | 
 | 	return deps | 
 | } |