1515package dart
1616
1717import (
18+ "errors"
1819 "fmt"
1920 "log/slog"
2021 "slices"
@@ -47,14 +48,15 @@ type modelAnnotations struct {
4748 DefaultHost string
4849 DocLines []string
4950 // A reference to an optional hand-written part file.
50- PartFileReference string
51- PackageDependencies []packageDependency
52- Imports []string
53- DevDependencies []string
54- DoNotPublish bool
55- RepositoryURL string
56- ReadMeAfterTitleText string
57- ReadMeQuickstartText string
51+ PartFileReference string
52+ PackageDependencies []packageDependency
53+ Imports []string
54+ DevDependencies []string
55+ DoNotPublish bool
56+ RepositoryURL string
57+ ReadMeAfterTitleText string
58+ ReadMeQuickstartText string
59+ ApiKeyEnvironmentVariables []string
5860}
5961
6062// HasServices returns true if the model has services.
@@ -216,19 +218,28 @@ func newAnnotateModel(model *api.API) *annotateModel {
216218// [Template.Services] field.
217219func (annotate * annotateModel ) annotateModel (options map [string ]string ) error {
218220 var (
219- packageNameOverride string
220- generationYear string
221- packageVersion string
222- partFileReference string
223- doNotPublish bool
224- devDependencies = []string {}
225- repositoryURL string
226- readMeAfterTitleText string
227- readMeQuickstartText string
221+ packageNameOverride string
222+ generationYear string
223+ packageVersion string
224+ partFileReference string
225+ doNotPublish bool
226+ devDependencies = []string {}
227+ repositoryURL string
228+ readMeAfterTitleText string
229+ readMeQuickstartText string
230+ apiKeyEnvironmentVariables = []string {}
228231 )
229232
230233 for key , definition := range options {
231234 switch {
235+ case key == "api-keys-environment-variables" :
236+ // api-keys-environment-variables = "GOOGLE_API_KEY,GEMINI_API_KEY"
237+ // A comma-separated list of environment variables to look for searching for
238+ // a API key.
239+ apiKeyEnvironmentVariables = strings .Split (definition , "," )
240+ for i := range apiKeyEnvironmentVariables {
241+ apiKeyEnvironmentVariables [i ] = strings .TrimSpace (apiKeyEnvironmentVariables [i ])
242+ }
232243 case key == "package-name-override" :
233244 packageNameOverride = definition
234245 case key == "copyright-year" :
@@ -321,6 +332,11 @@ func (annotate *annotateModel) annotateModel(options map[string]string) error {
321332 if err != nil {
322333 return err
323334 }
335+
336+ if len (model .Services ) > 0 && len (apiKeyEnvironmentVariables ) == 0 {
337+ return errors .New ("all packages that define a service must define 'api-keys-environment-variables'" )
338+ }
339+
324340 ann := & modelAnnotations {
325341 Parent : model ,
326342 PackageName : packageName (model , packageNameOverride ),
@@ -336,15 +352,16 @@ func (annotate *annotateModel) annotateModel(options map[string]string) error {
336352 }
337353 return ""
338354 }(),
339- DocLines : formatDocComments (model .Description , model .State ),
340- Imports : calculateImports (annotate .imports ),
341- PartFileReference : partFileReference ,
342- PackageDependencies : packageDependencies ,
343- DevDependencies : devDependencies ,
344- DoNotPublish : doNotPublish ,
345- RepositoryURL : repositoryURL ,
346- ReadMeAfterTitleText : readMeAfterTitleText ,
347- ReadMeQuickstartText : readMeQuickstartText ,
355+ DocLines : formatDocComments (model .Description , model .State ),
356+ Imports : calculateImports (annotate .imports ),
357+ PartFileReference : partFileReference ,
358+ PackageDependencies : packageDependencies ,
359+ DevDependencies : devDependencies ,
360+ DoNotPublish : doNotPublish ,
361+ RepositoryURL : repositoryURL ,
362+ ReadMeAfterTitleText : readMeAfterTitleText ,
363+ ReadMeQuickstartText : readMeQuickstartText ,
364+ ApiKeyEnvironmentVariables : apiKeyEnvironmentVariables ,
348365 }
349366
350367 model .Codec = ann
@@ -438,6 +455,7 @@ func calculateImports(imports map[string]bool) []string {
438455func (annotate * annotateModel ) annotateService (s * api.Service ) {
439456 // Add a package:http import if we're generating a service.
440457 annotate .imports [httpImport ] = true
458+ annotate .imports [authImport ] = true
441459
442460 // Some methods are skipped.
443461 methods := language .FilterSlice (s .Methods , func (m * api.Method ) bool {
0 commit comments