From 919039a01a006c41e720218bd55f83ce98a5edef Mon Sep 17 00:00:00 2001 From: Tyler Bui-Palsulich <26876514+tbpg@users.noreply.github.com> Date: Thu, 25 Feb 2021 12:38:04 -0500 Subject: [PATCH] fix(internal/godocfx): use correct anchor links (#3738) This works by pre-processing the package and generating all of the correct anchor links. Then, when converting an ID to a link, we check if the ID is listed in the map of anchors. It's possible there will be some duplication between IDs. But, that is already an issue because there is no way to know which one is correct to link to. An alternative would be to set the anchor for any duplicated links to `""` so they don't link at all. In practice, I don't think this is an issue. So, I left it as-is and we can revisit later if needed. Fixes #3737. --- internal/godocfx/parse.go | 100 ++++- internal/godocfx/testdata/golden/index.yml | 499 ++++++++++++--------- 2 files changed, 360 insertions(+), 239 deletions(-) diff --git a/internal/godocfx/parse.go b/internal/godocfx/parse.go index d50add666d0..848aa959fa7 100644 --- a/internal/godocfx/parse.go +++ b/internal/godocfx/parse.go @@ -34,6 +34,7 @@ import ( "log" "os" "path/filepath" + "regexp" "sort" "strconv" "strings" @@ -155,7 +156,7 @@ func parse(glob string, workingDir string, optionalExtraFiles []string) (*result // Once the files are grouped by package, process each package // independently. for _, pi := range pkgInfos { - link := newLinker(pi.pkg.Imports, pi.importRenames) + link := newLinker(pi) topLevelDecls := pkgsite.TopLevelDecls(pi.doc) pkgItem := &item{ UID: pi.doc.ImportPath, @@ -183,7 +184,7 @@ func parse(glob string, workingDir string, optionalExtraFiles []string) (*result Type: "const", Summary: c.Doc, Langs: onlyGo, - Syntax: syntax{Content: pkgsite.PrintType(pi.fset, c.Decl, toURL, topLevelDecls)}, + Syntax: syntax{Content: pkgsite.PrintType(pi.fset, c.Decl, link.toURL, topLevelDecls)}, }) } for _, v := range pi.doc.Vars { @@ -199,7 +200,7 @@ func parse(glob string, workingDir string, optionalExtraFiles []string) (*result Type: "variable", Summary: v.Doc, Langs: onlyGo, - Syntax: syntax{Content: pkgsite.PrintType(pi.fset, v.Decl, toURL, topLevelDecls)}, + Syntax: syntax{Content: pkgsite.PrintType(pi.fset, v.Decl, link.toURL, topLevelDecls)}, }) } for _, t := range pi.doc.Types { @@ -213,7 +214,7 @@ func parse(glob string, workingDir string, optionalExtraFiles []string) (*result Type: "type", Summary: t.Doc, Langs: onlyGo, - Syntax: syntax{Content: pkgsite.PrintType(pi.fset, t.Decl, toURL, topLevelDecls)}, + Syntax: syntax{Content: pkgsite.PrintType(pi.fset, t.Decl, link.toURL, topLevelDecls)}, Examples: processExamples(t.Examples, pi.fset), } // Note: items are added as page.Children, rather than @@ -232,7 +233,7 @@ func parse(glob string, workingDir string, optionalExtraFiles []string) (*result Type: "const", Summary: c.Doc, Langs: onlyGo, - Syntax: syntax{Content: pkgsite.PrintType(pi.fset, c.Decl, toURL, topLevelDecls)}, + Syntax: syntax{Content: pkgsite.PrintType(pi.fset, c.Decl, link.toURL, topLevelDecls)}, }) } for _, v := range t.Vars { @@ -248,7 +249,7 @@ func parse(glob string, workingDir string, optionalExtraFiles []string) (*result Type: "variable", Summary: v.Doc, Langs: onlyGo, - Syntax: syntax{Content: pkgsite.PrintType(pi.fset, v.Decl, toURL, topLevelDecls)}, + Syntax: syntax{Content: pkgsite.PrintType(pi.fset, v.Decl, link.toURL, topLevelDecls)}, }) } @@ -313,18 +314,84 @@ type linker struct { // Behavior is undefined when a single import has different names in // different files. imports map[string]string + + // idToAnchor is a map from an ID to the anchor URL for that ID. + idToAnchor map[string]string } -func newLinker(rawImports map[string]*packages.Package, importSyntax map[string]string) *linker { +func newLinker(pi pkgInfo) *linker { imports := map[string]string{} - for path, pkg := range rawImports { + for path, pkg := range pi.pkg.Imports { name := pkg.Name - if rename := importSyntax[path]; rename != "" { + if rename := pi.importRenames[path]; rename != "" { name = rename } imports[name] = path } - return &linker{imports: imports} + + idToAnchor := buildIDToAnchor(pi) + + return &linker{imports: imports, idToAnchor: idToAnchor} +} + +// nonWordRegex is based on +// https://github.com/googleapis/doc-templates/blob/70eba5908e7b9aef5525d0f1f24194ae750f267e/third_party/docfx/templates/devsite/common.js#L27-L30. +var nonWordRegex = regexp.MustCompile("\\W") + +func buildIDToAnchor(pi pkgInfo) map[string]string { + idToAnchor := map[string]string{} + idToAnchor[pi.doc.ImportPath] = pi.doc.ImportPath + + for _, c := range pi.doc.Consts { + commaID := strings.Join(c.Names, ",") + uid := pi.doc.ImportPath + "." + commaID + for _, name := range c.Names { + idToAnchor[name] = uid + } + } + for _, v := range pi.doc.Vars { + commaID := strings.Join(v.Names, ",") + uid := pi.doc.ImportPath + "." + commaID + for _, name := range v.Names { + idToAnchor[name] = uid + } + } + for _, f := range pi.doc.Funcs { + uid := pi.doc.ImportPath + "." + f.Name + idToAnchor[f.Name] = uid + } + for _, t := range pi.doc.Types { + uid := pi.doc.ImportPath + "." + t.Name + idToAnchor[t.Name] = uid + for _, c := range t.Consts { + commaID := strings.Join(c.Names, ",") + uid := pi.doc.ImportPath + "." + commaID + for _, name := range c.Names { + idToAnchor[name] = uid + } + } + for _, v := range t.Vars { + commaID := strings.Join(v.Names, ",") + uid := pi.doc.ImportPath + "." + commaID + for _, name := range v.Names { + idToAnchor[name] = uid + } + } + for _, f := range t.Funcs { + uid := pi.doc.ImportPath + "." + t.Name + "." + f.Name + idToAnchor[f.Name] = uid + } + for _, m := range t.Methods { + uid := pi.doc.ImportPath + "." + t.Name + "." + m.Name + idToAnchor[m.Name] = uid + } + } + + for id, anchor := range idToAnchor { + idToAnchor[id] = nonWordRegex.ReplaceAllString(anchor, "_") + } + + return idToAnchor } func (l *linker) linkify(s string) string { @@ -342,11 +409,11 @@ func (l *linker) linkify(s string) string { // If s is not exported, it's probably a builtin. if !token.IsExported(s) { if doc.IsPredeclared(s) { - return href(toURL("builtin", s), s) + return href(l.toURL("builtin", s), s) } return fmt.Sprintf("%s%s", prefix, s) } - return fmt.Sprintf("%s%s", prefix, href(toURL("", s), s)) + return fmt.Sprintf("%s%s", prefix, href(l.toURL("", s), s)) } // Otherwise, it's in another package. split := strings.Split(s, ".") @@ -362,14 +429,17 @@ func (l *linker) linkify(s string) string { return fmt.Sprintf("%s%s", prefix, s) } name := split[1] - return fmt.Sprintf("%s%s.%s", prefix, href(toURL(pkgPath, ""), pkg), href(toURL(pkgPath, name), name)) + return fmt.Sprintf("%s%s.%s", prefix, href(l.toURL(pkgPath, ""), pkg), href(l.toURL(pkgPath, name), name)) } // TODO: link to the right baseURL, with the right module name and version // pattern. -func toURL(pkg, name string) string { +func (l *linker) toURL(pkg, name string) string { if pkg == "" { - return fmt.Sprintf("#%s", strings.ToLower(name)) + if anchor := l.idToAnchor[name]; anchor != "" { + name = anchor + } + return fmt.Sprintf("#%s", name) } baseURL := "https://pkg.go.dev" if name == "" { diff --git a/internal/godocfx/testdata/golden/index.yml b/internal/godocfx/testdata/golden/index.yml index cd10f67f251..045f4026600 100644 --- a/internal/godocfx/testdata/golden/index.yml +++ b/internal/godocfx/testdata/golden/index.yml @@ -329,8 +329,8 @@ items: langs: - go syntax: - content: "const (\n\tAllUsers ACLEntity - = \"allUsers\"\n\tAllAuthenticatedUsers ACLEntity + content: "const (\n\tAllUsers ACLEntity + = \"allUsers\"\n\tAllAuthenticatedUsers ACLEntity = \"allAuthenticatedUsers\"\n)" - uid: cloud.google.com/go/storage.ACLHandle name: ACLHandle @@ -354,9 +354,10 @@ items: langs: - go syntax: - content: func (a *ACLHandle) Delete(ctx context.Context, entity ACLEntity) - (err error) + content: func (a *ACLHandle) + Delete(ctx context.Context, + entity ACLEntity) (err + error) codeexamples: - content: "package main\n\nimport (\n\t\"cloud.google.com/go/storage\"\n\t\"context\"\n)\n\nfunc main() {\n\tctx := context.Background()\n\tclient, err := storage.NewClient(ctx)\n\tif @@ -374,9 +375,10 @@ items: langs: - go syntax: - content: func (a *ACLHandle) List(ctx context.Context) (rules []ACLRule, - err error) + content: func (a *ACLHandle) + List(ctx context.Context) + (rules []ACLRule, err error) codeexamples: - content: "package main\n\nimport (\n\t\"cloud.google.com/go/storage\"\n\t\"context\"\n\t\"fmt\"\n)\n\nfunc main() {\n\tctx := context.Background()\n\tclient, err := storage.NewClient(ctx)\n\tif @@ -394,9 +396,10 @@ items: langs: - go syntax: - content: func (a *ACLHandle) Set(ctx context.Context, entity ACLEntity, - role ACLRole) (err error) + content: func (a *ACLHandle) + Set(ctx context.Context, + entity ACLEntity, role + ACLRole) (err error) codeexamples: - content: "package main\n\nimport (\n\t\"cloud.google.com/go/storage\"\n\t\"context\"\n)\n\nfunc main() {\n\tctx := context.Background()\n\tclient, err := storage.NewClient(ctx)\n\tif @@ -423,8 +426,9 @@ items: langs: - go syntax: - content: "const (\n\tRoleOwner ACLRole = \"OWNER\"\n\tRoleReader - ACLRole = \"READER\"\n\tRoleWriter ACLRole + content: "const (\n\tRoleOwner ACLRole + = \"OWNER\"\n\tRoleReader ACLRole + = \"READER\"\n\tRoleWriter ACLRole = \"WRITER\"\n)" - uid: cloud.google.com/go/storage.ACLRule name: ACLRule @@ -437,11 +441,11 @@ items: langs: - go syntax: - content: "type ACLRule struct {\n\tEntity ACLEntity\n\tEntityID + content: "type ACLRule struct {\n\tEntity ACLEntity\n\tEntityID \ string\n\tRole ACLRole\n\tDomain string\n\tEmail - \ string\n\tProjectTeam - *ProjectTeam\n}" + href=\"#cloud_google_com_go_storage_ACLRole\">ACLRole\n\tDomain string\n\tEmail string\n\tProjectTeam + *ProjectTeam\n}" - uid: cloud.google.com/go/storage.BucketAttrs name: BucketAttrs id: BucketAttrs @@ -455,16 +459,16 @@ items: syntax: content: "type BucketAttrs struct {\n\t// Name is the name of the bucket.\n\t// This field is read-only.\n\tName string\n\n\t// - ACL is the list of access control rules on the bucket.\n\tACL []ACLRule\n\n\t// + ACL is the list of access control rules on the bucket.\n\tACL []ACLRule\n\n\t// BucketPolicyOnly is an alias for UniformBucketLevelAccess. Use of\n\t// UniformBucketLevelAccess is recommended above the use of this field.\n\t// Setting BucketPolicyOnly.Enabled OR UniformBucketLevelAccess.Enabled to\n\t// true, will enable UniformBucketLevelAccess.\n\tBucketPolicyOnly - BucketPolicyOnly\n\n\t// UniformBucketLevelAccess - configures access checks to use only bucket-level IAM\n\t// policies and ignore - any ACL rules for the bucket.\n\t// See https://cloud.google.com/storage/docs/uniform-bucket-level-access\n\t// - for more information.\n\tUniformBucketLevelAccess UniformBucketLevelAccess\n\n\t// + BucketPolicyOnly\n\n\t// + UniformBucketLevelAccess configures access checks to use only bucket-level IAM\n\t// + policies and ignore any ACL rules for the bucket.\n\t// See https://cloud.google.com/storage/docs/uniform-bucket-level-access\n\t// + for more information.\n\tUniformBucketLevelAccess UniformBucketLevelAccess\n\n\t// DefaultObjectACL is the list of access controls to\n\t// apply to new objects - when no object ACL is provided.\n\tDefaultObjectACL []ACLRule\n\n\t// + when no object ACL is provided.\n\tDefaultObjectACL []ACLRule\n\n\t// DefaultEventBasedHold is the default value for event-based hold on\n\t// newly created objects in this bucket. It defaults to false.\n\tDefaultEventBasedHold bool\n\n\t// If not empty, applies @@ -495,21 +499,22 @@ items: operations on Requester Pays buckets must provide\n\t// a user project (see BucketHandle.UserProject), which will be billed\n\t// for the operations.\n\tRequesterPays bool\n\n\t// Lifecycle is the - lifecycle configuration for objects in the bucket.\n\tLifecycle Lifecycle\n\n\t// + lifecycle configuration for objects in the bucket.\n\tLifecycle Lifecycle\n\n\t// Retention policy enforces a minimum retention time for all objects\n\t// contained in the bucket. A RetentionPolicy of nil implies the bucket\n\t// has no minimum data retention.\n\t//\n\t// This feature is in private alpha release. It is not currently available to\n\t// most customers. It might be changed in backwards-incompatible ways and is not\n\t// subject to any SLA or deprecation policy.\n\tRetentionPolicy - *RetentionPolicy\n\n\t// The bucket's Cross-Origin - Resource Sharing (CORS) configuration.\n\tCORS []CORS\n\n\t// - The encryption configuration used by default for newly inserted objects.\n\tEncryption - *BucketEncryption\n\n\t// The logging configuration.\n\tLogging - *BucketLogging\n\n\t// The website configuration.\n\tWebsite - *BucketWebsite\n\n\t// Etag is the HTTP/1.1 Entity - tag for the bucket.\n\t// This field is read-only.\n\tEtag string\n\n\t// - LocationType describes how data is stored and replicated.\n\t// Typical values - are \"multi-region\", \"region\" and \"dual-region\".\n\t// This field is read-only.\n\tLocationType + *RetentionPolicy\n\n\t// + The bucket's Cross-Origin Resource Sharing (CORS) configuration.\n\tCORS []CORS\n\n\t// The encryption configuration + used by default for newly inserted objects.\n\tEncryption *BucketEncryption\n\n\t// + The logging configuration.\n\tLogging *BucketLogging\n\n\t// + The website configuration.\n\tWebsite *BucketWebsite\n\n\t// + Etag is the HTTP/1.1 Entity tag for the bucket.\n\t// This field is read-only.\n\tEtag + string\n\n\t// LocationType + describes how data is stored and replicated.\n\t// Typical values are \"multi-region\", + \"region\" and \"dual-region\".\n\t// This field is read-only.\n\tLocationType string\n}" - uid: cloud.google.com/go/storage.BucketAttrsToUpdate name: BucketAttrsToUpdate @@ -535,24 +540,24 @@ items: OR UniformBucketLevelAccess.Enabled to\n\t// true, will enable UniformBucketLevelAccess. If both BucketPolicyOnly and\n\t// UniformBucketLevelAccess are set, the value of UniformBucketLevelAccess\n\t// will take precedence.\n\tBucketPolicyOnly - *BucketPolicyOnly\n\n\t// UniformBucketLevelAccess - configures access checks to use only bucket-level IAM\n\t// policies and ignore - any ACL rules for the bucket.\n\t// See https://cloud.google.com/storage/docs/uniform-bucket-level-access\n\t// - for more information.\n\tUniformBucketLevelAccess *UniformBucketLevelAccess\n\n\t// + *BucketPolicyOnly\n\n\t// + UniformBucketLevelAccess configures access checks to use only bucket-level IAM\n\t// + policies and ignore any ACL rules for the bucket.\n\t// See https://cloud.google.com/storage/docs/uniform-bucket-level-access\n\t// + for more information.\n\tUniformBucketLevelAccess *UniformBucketLevelAccess\n\n\t// If set, updates the retention policy of the bucket. Using\n\t// RetentionPolicy.RetentionPeriod = 0 will delete the existing policy.\n\t//\n\t// This feature is in private alpha release. It is not currently available to\n\t// most customers. It might be changed in backwards-incompatible ways and is not\n\t// subject to any SLA - or deprecation policy.\n\tRetentionPolicy *RetentionPolicy\n\n\t// + or deprecation policy.\n\tRetentionPolicy *RetentionPolicy\n\n\t// If set, replaces the CORS configuration with a new configuration.\n\t// An empty (rather than nil) slice causes all CORS policies to be removed.\n\tCORS []CORS\n\n\t// If set, replaces the encryption configuration - of the bucket. Using\n\t// BucketEncryption.DefaultKMSKeyName = \"\" will delete - the existing\n\t// configuration.\n\tEncryption *BucketEncryption\n\n\t// + href=\"#cloud_google_com_go_storage_CORS\">CORS\n\n\t// If set, replaces + the encryption configuration of the bucket. Using\n\t// BucketEncryption.DefaultKMSKeyName + = \"\" will delete the existing\n\t// configuration.\n\tEncryption *BucketEncryption\n\n\t// If set, replaces the lifecycle configuration of the bucket.\n\tLifecycle *Lifecycle\n\n\t// If set, replaces the logging configuration - of the bucket.\n\tLogging *BucketLogging\n\n\t// - If set, replaces the website configuration of the bucket.\n\tWebsite *BucketWebsite\n\n\t// + href=\"#cloud_google_com_go_storage_Lifecycle\">Lifecycle\n\n\t// If set, + replaces the logging configuration of the bucket.\n\tLogging *BucketLogging\n\n\t// + If set, replaces the website configuration of the bucket.\n\tWebsite *BucketWebsite\n\n\t// If not empty, applies a predefined set of access controls.\n\t// See https://cloud.google.com/storage/docs/json_api/v1/buckets/patch.\n\tPredefinedACL string\n\n\t// If not empty, applies a predefined set of default object access controls.\n\t// See https://cloud.google.com/storage/docs/json_api/v1/buckets/patch.\n\tPredefinedDefaultObjectACL @@ -570,8 +575,8 @@ items: langs: - go syntax: - content: func (ua *BucketAttrsToUpdate) DeleteLabel(name - string) + content: func (ua *BucketAttrsToUpdate) + DeleteLabel(name string) - uid: cloud.google.com/go/storage.BucketAttrsToUpdate.SetLabel name: | func (*BucketAttrsToUpdate) SetLabel @@ -584,8 +589,8 @@ items: langs: - go syntax: - content: func (ua *BucketAttrsToUpdate) SetLabel(name, - value string) + content: func (ua *BucketAttrsToUpdate) + SetLabel(name, value string) - uid: cloud.google.com/go/storage.BucketConditions name: BucketConditions id: BucketConditions @@ -653,7 +658,8 @@ items: langs: - go syntax: - content: func (b *BucketHandle) ACL() *ACLHandle + content: func (b *BucketHandle) + ACL() *ACLHandle - uid: cloud.google.com/go/storage.BucketHandle.AddNotification name: | func (*BucketHandle) AddNotification @@ -667,10 +673,11 @@ items: langs: - go syntax: - content: func (b *BucketHandle) AddNotification(ctx - context.Context, - n *Notification) (ret *Notification, - err error) + content: func (b *BucketHandle) + AddNotification(ctx context.Context, + n *Notification) (ret + *Notification, err error) codeexamples: - content: "package main\n\nimport (\n\t\"cloud.google.com/go/storage\"\n\t\"context\"\n\t\"fmt\"\n)\n\nfunc main() {\n\tctx := context.Background()\n\tclient, err := storage.NewClient(ctx)\n\tif @@ -689,8 +696,9 @@ items: langs: - go syntax: - content: func (b *BucketHandle) Attrs(ctx context.Context) (attrs *BucketAttrs, + content: func (b *BucketHandle) + Attrs(ctx context.Context) + (attrs *BucketAttrs, err error) codeexamples: - content: "package main\n\nimport (\n\t\"cloud.google.com/go/storage\"\n\t\"context\"\n\t\"fmt\"\n)\n\nfunc @@ -709,9 +717,10 @@ items: langs: - go syntax: - content: func (b *BucketHandle) Create(ctx context.Context, projectID string, - attrs *BucketAttrs) (err error) + content: func (b *BucketHandle) + Create(ctx context.Context, + projectID string, attrs *BucketAttrs) (err error) codeexamples: - content: "package main\n\nimport (\n\t\"cloud.google.com/go/storage\"\n\t\"context\"\n)\n\nfunc main() {\n\tctx := context.Background()\n\tclient, err := storage.NewClient(ctx)\n\tif @@ -730,8 +739,8 @@ items: langs: - go syntax: - content: func (b *BucketHandle) DefaultObjectACL() - *ACLHandle + content: func (b *BucketHandle) + DefaultObjectACL() *ACLHandle - uid: cloud.google.com/go/storage.BucketHandle.Delete name: | func (*BucketHandle) Delete @@ -743,8 +752,9 @@ items: langs: - go syntax: - content: func (b *BucketHandle) Delete(ctx context.Context) (err error) + content: func (b *BucketHandle) + Delete(ctx context.Context) + (err error) codeexamples: - content: "package main\n\nimport (\n\t\"cloud.google.com/go/storage\"\n\t\"context\"\n)\n\nfunc main() {\n\tctx := context.Background()\n\tclient, err := storage.NewClient(ctx)\n\tif @@ -761,8 +771,8 @@ items: langs: - go syntax: - content: func (b *BucketHandle) DeleteNotification(ctx - context.Context, + content: func (b *BucketHandle) + DeleteNotification(ctx context.Context, id string) (err error) codeexamples: - content: "package main\n\nimport (\n\t\"cloud.google.com/go/storage\"\n\t\"context\"\n)\n\nvar @@ -782,8 +792,8 @@ items: langs: - go syntax: - content: func (b *BucketHandle) IAM() *iam.Handle + content: func (b *BucketHandle) + IAM() *iam.Handle - uid: cloud.google.com/go/storage.BucketHandle.If name: | func (*BucketHandle) If @@ -799,8 +809,9 @@ items: langs: - go syntax: - content: func (b *BucketHandle) If(conds BucketConditions) - *BucketHandle + content: func (b *BucketHandle) + If(conds BucketConditions) + *BucketHandle - uid: cloud.google.com/go/storage.BucketHandle.LockRetentionPolicy name: | func (*BucketHandle) LockRetentionPolicy @@ -820,9 +831,9 @@ items: langs: - go syntax: - content: func (b *BucketHandle) LockRetentionPolicy(ctx - context.Context) - error + content: func (b *BucketHandle) + LockRetentionPolicy(ctx context.Context) error codeexamples: - content: "package main\n\nimport (\n\t\"cloud.google.com/go/storage\"\n\t\"context\"\n)\n\nfunc main() {\n\tctx := context.Background()\n\tclient, err := storage.NewClient(ctx)\n\tif @@ -844,9 +855,9 @@ items: langs: - go syntax: - content: func (b *BucketHandle) Notifications(ctx - context.Context) - (n map[string]*Notification, + content: func (b *BucketHandle) + Notifications(ctx context.Context) + (n map[string]*Notification, err error) codeexamples: - content: "package main\n\nimport (\n\t\"cloud.google.com/go/storage\"\n\t\"context\"\n\t\"fmt\"\n)\n\nfunc @@ -870,8 +881,8 @@ items: langs: - go syntax: - content: func (b *BucketHandle) Object(name string) - *ObjectHandle + content: func (b *BucketHandle) + Object(name string) *ObjectHandle - uid: cloud.google.com/go/storage.BucketHandle.Objects name: | func (*BucketHandle) Objects @@ -886,9 +897,9 @@ items: langs: - go syntax: - content: func (b *BucketHandle) Objects(ctx context.Context, q *Query) - *ObjectIterator + content: func (b *BucketHandle) + Objects(ctx context.Context, + q *Query) *ObjectIterator codeexamples: - content: "package main\n\nimport (\n\t\"cloud.google.com/go/storage\"\n\t\"context\"\n)\n\nfunc main() {\n\tctx := context.Background()\n\tclient, err := storage.NewClient(ctx)\n\tif @@ -905,9 +916,11 @@ items: langs: - go syntax: - content: func (b *BucketHandle) Update(ctx context.Context, uattrs BucketAttrsToUpdate) - (attrs *BucketAttrs, err error) + content: func (b *BucketHandle) + Update(ctx context.Context, + uattrs BucketAttrsToUpdate) + (attrs *BucketAttrs, + err error) codeexamples: - content: "package main\n\nimport (\n\t\"cloud.google.com/go/storage\"\n\t\"context\"\n\t\"fmt\"\n)\n\nfunc main() {\n\tctx := context.Background()\n\tclient, err := storage.NewClient(ctx)\n\tif @@ -938,8 +951,9 @@ items: langs: - go syntax: - content: func (b *BucketHandle) UserProject(projectID - string) *BucketHandle + content: func (b *BucketHandle) + UserProject(projectID string) + *BucketHandle - uid: cloud.google.com/go/storage.BucketIterator name: BucketIterator id: BucketIterator @@ -970,7 +984,8 @@ items: langs: - go syntax: - content: func (it *BucketIterator) Next() (*BucketAttrs, + content: func (it *BucketIterator) + Next() (*BucketAttrs, error) codeexamples: - content: "package main\n\nimport (\n\t\"cloud.google.com/go/storage\"\n\t\"context\"\n\t\"fmt\"\n\t\"google.golang.org/api/iterator\"\n)\n\nfunc @@ -991,8 +1006,9 @@ items: langs: - go syntax: - content: func (it *BucketIterator) PageInfo() *iterator.PageInfo + content: func (it *BucketIterator) + PageInfo() *iterator.PageInfo - uid: cloud.google.com/go/storage.BucketLogging name: BucketLogging id: BucketLogging @@ -1099,7 +1115,7 @@ items: content: func NewClient(ctx context.Context, opts ...option.ClientOption) - (*Client, error) + (*Client, error) codeexamples: - content: "package main\n\nimport (\n\t\"cloud.google.com/go/storage\"\n\t\"context\"\n)\n\nfunc main() {\n\tctx := context.Background()\n\t// Use Google Application Default @@ -1131,8 +1147,8 @@ items: langs: - go syntax: - content: func (c *Client) Bucket(name string) - *BucketHandle + content: func (c *Client) Bucket(name + string) *BucketHandle - uid: cloud.google.com/go/storage.Client.Buckets name: | func (*Client) Buckets @@ -1149,9 +1165,9 @@ items: langs: - go syntax: - content: func (c *Client) Buckets(ctx context.Context, projectID string) - *BucketIterator + content: func (c *Client) Buckets(ctx + context.Context, + projectID string) *BucketIterator codeexamples: - content: "package main\n\nimport (\n\t\"cloud.google.com/go/storage\"\n\t\"context\"\n)\n\nfunc main() {\n\tctx := context.Background()\n\tclient, err := storage.NewClient(ctx)\n\tif @@ -1170,7 +1186,8 @@ items: langs: - go syntax: - content: func (c *Client) Close() error + content: func (c *Client) Close() + error - uid: cloud.google.com/go/storage.Client.CreateHMACKey name: | func (*Client) CreateHMACKey @@ -1184,10 +1201,11 @@ items: langs: - go syntax: - content: func (c *Client) CreateHMACKey(ctx context.Context, projectID, serviceAccountEmail - string, opts ...HMACKeyOption) - (*HMACKey, error) + content: func (c *Client) CreateHMACKey(ctx + context.Context, + projectID, serviceAccountEmail string, + opts ...HMACKeyOption) + (*HMACKey, error) codeexamples: - content: "package main\n\nimport (\n\t\"cloud.google.com/go/storage\"\n\t\"context\"\n)\n\nfunc main() {\n\tctx := context.Background()\n\tclient, err := storage.NewClient(ctx)\n\tif @@ -1207,8 +1225,8 @@ items: langs: - go syntax: - content: func (c *Client) HMACKeyHandle(projectID, accessID - string) *HMACKeyHandle + content: func (c *Client) HMACKeyHandle(projectID, + accessID string) *HMACKeyHandle - uid: cloud.google.com/go/storage.Client.ListHMACKeys name: | func (*Client) ListHMACKeys @@ -1224,9 +1242,10 @@ items: langs: - go syntax: - content: func (c *Client) ListHMACKeys(ctx context.Context, projectID string, - opts ...HMACKeyOption) *HMACKeysIterator + content: func (c *Client) ListHMACKeys(ctx + context.Context, + projectID string, opts ...HMACKeyOption) *HMACKeysIterator codeexamples: - content: "package main\n\nimport (\n\t\"cloud.google.com/go/storage\"\n\t\"context\"\n\t\"google.golang.org/api/iterator\"\n)\n\nfunc main() {\n\tctx := context.Background()\n\tclient, err := storage.NewClient(ctx)\n\tif @@ -1260,9 +1279,10 @@ items: langs: - go syntax: - content: func (c *Client) ServiceAccount(ctx context.Context, projectID string) - (string, error) + content: func (c *Client) ServiceAccount(ctx + context.Context, + projectID string) (string, + error) - uid: cloud.google.com/go/storage.Composer name: Composer id: Composer @@ -1278,13 +1298,13 @@ items: content: "type Composer struct {\n\t// ObjectAttrs are optional attributes to set on the destination object.\n\t// Any attributes must be initialized before any calls on the Composer. Nil\n\t// or zero-valued attributes are ignored.\n\tObjectAttrs\n\n\t// SendCRC specifies whether to transmit - a CRC32C field. It should be set\n\t// to true in addition to setting the Composer's - CRC32C field, because zero\n\t// is a valid CRC and normally a zero would not - be transmitted.\n\t// If a CRC32C is sent, and the data in the destination object - does not match\n\t// the checksum, the compose will be rejected.\n\tSendCRC32C - bool\n\t// contains filtered - or unexported fields\n}" + href=\"#cloud_google_com_go_storage_ObjectAttrs\">ObjectAttrs\n\n\t// SendCRC + specifies whether to transmit a CRC32C field. It should be set\n\t// to true + in addition to setting the Composer's CRC32C field, because zero\n\t// is a + valid CRC and normally a zero would not be transmitted.\n\t// If a CRC32C is + sent, and the data in the destination object does not match\n\t// the checksum, + the compose will be rejected.\n\tSendCRC32C bool\n\t// + contains filtered or unexported fields\n}" - uid: cloud.google.com/go/storage.Composer.Run name: | func (*Composer) Run @@ -1296,8 +1316,9 @@ items: langs: - go syntax: - content: func (c *Composer) Run(ctx context.Context) (attrs *ObjectAttrs, + content: func (c *Composer) + Run(ctx context.Context) + (attrs *ObjectAttrs, err error) codeexamples: - content: "package main\n\nimport (\n\t\"cloud.google.com/go/storage\"\n\t\"context\"\n\t\"fmt\"\n)\n\nfunc @@ -1355,10 +1376,10 @@ items: content: "type Copier struct {\n\t// ObjectAttrs are optional attributes to set on the destination object.\n\t// Any attributes must be initialized before any calls on the Copier. Nil\n\t// or zero-valued attributes are ignored.\n\tObjectAttrs\n\n\t// RewriteToken can be set before - calling Run to resume a copy\n\t// operation. After Run returns a non-nil error, - RewriteToken will\n\t// have been updated to contain the value needed to resume - the copy.\n\tRewriteToken string\n\n\t// + href=\"#cloud_google_com_go_storage_ObjectAttrs\">ObjectAttrs\n\n\t// RewriteToken + can be set before calling Run to resume a copy\n\t// operation. After Run returns + a non-nil error, RewriteToken will\n\t// have been updated to contain the value + needed to resume the copy.\n\tRewriteToken string\n\n\t// ProgressFunc can be used to monitor the progress of a multi-RPC copy\n\t// operation. If ProgressFunc is not nil and copying requires multiple\n\t// calls to the underlying service (see\n\t// https://cloud.google.com/storage/docs/json_api/v1/objects/rewrite), @@ -1386,8 +1407,9 @@ items: langs: - go syntax: - content: func (c *Copier) Run(ctx context.Context) (attrs *ObjectAttrs, + content: func (c *Copier) Run(ctx + context.Context) + (attrs *ObjectAttrs, err error) codeexamples: - content: "package main\n\nimport (\n\t\"cloud.google.com/go/storage\"\n\t\"context\"\n\t\"fmt\"\n)\n\nfunc @@ -1436,7 +1458,7 @@ items: modification time of the HMAC key metadata.\n\tUpdatedTime time.Time\n\n\t// State is the state of the HMAC key.\n\t// It can be one of StateActive, StateInactive or StateDeleted.\n\tState - HMACState\n}" + HMACState\n}" - uid: cloud.google.com/go/storage.HMACKeyAttrsToUpdate name: HMACKeyAttrsToUpdate id: HMACKeyAttrsToUpdate @@ -1450,7 +1472,7 @@ items: - go syntax: content: "type HMACKeyAttrsToUpdate struct {\n\t// State is required and must - be either StateActive or StateInactive.\n\tState HMACState\n\n\t// + be either StateActive or StateInactive.\n\tState HMACState\n\n\t// Etag is an optional field and it is the HTTP/1.1 Entity tag.\n\tEtag string\n}" - uid: cloud.google.com/go/storage.HMACKeyHandle name: HMACKeyHandle @@ -1480,9 +1502,10 @@ items: langs: - go syntax: - content: func (hkh *HMACKeyHandle) Delete(ctx context.Context, - opts ...HMACKeyOption) error + content: func (hkh *HMACKeyHandle) + Delete(ctx context.Context, + opts ...HMACKeyOption) + error codeexamples: - content: "package main\n\nimport (\n\t\"cloud.google.com/go/storage\"\n\t\"context\"\n)\n\nfunc main() {\n\tctx := context.Background()\n\tclient, err := storage.NewClient(ctx)\n\tif @@ -1507,9 +1530,10 @@ items: langs: - go syntax: - content: func (hkh *HMACKeyHandle) Get(ctx context.Context, opts ...HMACKeyOption) - (*HMACKey, error) + content: func (hkh *HMACKeyHandle) + Get(ctx context.Context, + opts ...HMACKeyOption) + (*HMACKey, error) codeexamples: - content: "package main\n\nimport (\n\t\"cloud.google.com/go/storage\"\n\t\"context\"\n)\n\nfunc main() {\n\tctx := context.Background()\n\tclient, err := storage.NewClient(ctx)\n\tif @@ -1529,10 +1553,11 @@ items: langs: - go syntax: - content: func (h *HMACKeyHandle) Update(ctx context.Context, au HMACKeyAttrsToUpdate, - opts ...HMACKeyOption) (*HMACKey, - error) + content: func (h *HMACKeyHandle) + Update(ctx context.Context, + au HMACKeyAttrsToUpdate, + opts ...HMACKeyOption) + (*HMACKey, error) codeexamples: - content: "package main\n\nimport (\n\t\"cloud.google.com/go/storage\"\n\t\"context\"\n)\n\nfunc main() {\n\tctx := context.Background()\n\tclient, err := storage.NewClient(ctx)\n\tif @@ -1572,7 +1597,7 @@ items: - go syntax: content: func ForHMACKeyServiceAccountEmail(serviceAccountEmail string) - HMACKeyOption + HMACKeyOption - uid: cloud.google.com/go/storage.HMACKeyOption.ShowDeletedHMACKeys name: | func ShowDeletedHMACKeys @@ -1586,7 +1611,7 @@ items: langs: - go syntax: - content: func ShowDeletedHMACKeys() HMACKeyOption + content: func ShowDeletedHMACKeys() HMACKeyOption - uid: cloud.google.com/go/storage.HMACKeyOption.UserProjectForHMACKeys name: | func UserProjectForHMACKeys @@ -1604,7 +1629,7 @@ items: - go syntax: content: func UserProjectForHMACKeys(userProjectID string) - HMACKeyOption + HMACKeyOption - uid: cloud.google.com/go/storage.HMACKeysIterator name: HMACKeysIterator id: HMACKeysIterator @@ -1638,8 +1663,8 @@ items: langs: - go syntax: - content: func (it *HMACKeysIterator) Next() (*HMACKey, error) + content: func (it *HMACKeysIterator) + Next() (*HMACKey, error) - uid: cloud.google.com/go/storage.HMACKeysIterator.PageInfo name: | func (*HMACKeysIterator) PageInfo @@ -1655,8 +1680,8 @@ items: langs: - go syntax: - content: func (it *HMACKeysIterator) PageInfo() - *iterator.HMACKeysIterator) + PageInfo() *iterator.PageInfo - uid: cloud.google.com/go/storage.HMACState name: HMACState @@ -1680,13 +1705,13 @@ items: - go syntax: content: "const (\n\t// Active is the status for an active key that can be used - to sign\n\t// requests.\n\tActive HMACState = \"ACTIVE\"\n\n\t// - Inactive is the status for an inactive key thus requests signed by\n\t// this - key will be denied.\n\tInactive HMACState = \"INACTIVE\"\n\n\t// - Deleted is the status for a key that is deleted.\n\t// Once in this state the - key cannot key cannot be recovered\n\t// and does not count towards key limits. - Deleted keys will be cleaned\n\t// up later.\n\tDeleted HMACState - = \"DELETED\"\n)" + to sign\n\t// requests.\n\tActive HMACState + = \"ACTIVE\"\n\n\t// Inactive is the status for an inactive key thus requests + signed by\n\t// this key will be denied.\n\tInactive HMACState + = \"INACTIVE\"\n\n\t// Deleted is the status for a key that is deleted.\n\t// + Once in this state the key cannot key cannot be recovered\n\t// and does not + count towards key limits. Deleted keys will be cleaned\n\t// up later.\n\tDeleted + HMACState = \"DELETED\"\n)" - uid: cloud.google.com/go/storage.Lifecycle name: Lifecycle id: Lifecycle @@ -1697,7 +1722,7 @@ items: langs: - go syntax: - content: "type Lifecycle struct {\n\tRules []LifecycleRule\n}" + content: "type Lifecycle struct {\n\tRules []LifecycleRule\n}" - uid: cloud.google.com/go/storage.LifecycleAction name: LifecycleAction id: LifecycleAction @@ -1743,7 +1768,7 @@ items: is the days elapsed since the noncurrent timestamp\n\t// of the object. This condition is relevant only for versioned objects.\n\tDaysSinceNoncurrentTime int64\n\n\t// Liveness specifies - the object's liveness. Relevant only for versioned objects\n\tLiveness Liveness\n\n\t// + the object's liveness. Relevant only for versioned objects\n\tLiveness Liveness\n\n\t// MatchesStorageClasses is the condition matching the object's storage\n\t// class.\n\t//\n\t// Values include \"STANDARD\", \"NEARLINE\", \"COLDLINE\" and \"ARCHIVE\".\n\tMatchesStorageClasses []string\n\n\t// NoncurrentTimeBefore @@ -1769,9 +1794,9 @@ items: - go syntax: content: "type LifecycleRule struct {\n\t// Action is the action to take when - all of the associated conditions are\n\t// met.\n\tAction LifecycleAction\n\n\t// + all of the associated conditions are\n\t// met.\n\tAction LifecycleAction\n\n\t// Condition is the set of conditions that must be met for the associated\n\t// - action to be taken.\n\tCondition LifecycleCondition\n}" + action to be taken.\n\tCondition LifecycleCondition\n}" - uid: cloud.google.com/go/storage.Liveness name: Liveness id: Liveness @@ -1792,7 +1817,7 @@ items: - go syntax: content: "const (\n\t// LiveAndArchived includes both live and archived objects.\n\tLiveAndArchived - Liveness = iota\n\t// + Liveness = iota\n\t// Live specifies that the object is still live.\n\tLive\n\t// Archived specifies that the object is archived.\n\tArchived\n)" - uid: cloud.google.com/go/storage.Notification @@ -1849,7 +1874,7 @@ items: earliest time that the object's retention period expires.\n\t// This is a read-only field.\n\tRetentionExpirationTime time.Time\n\n\t// ACL is the list of access - control rules for the object.\n\tACL []ACLRule\n\n\t// + control rules for the object.\n\tACL []ACLRule\n\n\t// If not empty, applies a predefined set of access controls. It should be set\n\t// only when writing, copying or composing an object. When copying or composing,\n\t// it acts as the destinationPredefinedAcl parameter.\n\t// PredefinedACL is always @@ -1952,7 +1977,7 @@ items: href=\"https://pkg.go.dev/cloud.google.com/go/internal/optional#String\">String\n\tCustomTime \ time.Time\n\tMetadata \ map[string]string - // set to map[string]string{} to delete\n\tACL []ACLRule\n\n\t// + // set to map[string]string{} to delete\n\tACL []ACLRule\n\n\t// If not empty, applies a predefined set of access controls. ACL must be nil.\n\t// See https://cloud.google.com/storage/docs/json_api/v1/objects/patch.\n\tPredefinedACL string\n}" @@ -1989,7 +2014,8 @@ items: langs: - go syntax: - content: func (o *ObjectHandle) ACL() *ACLHandle + content: func (o *ObjectHandle) + ACL() *ACLHandle - uid: cloud.google.com/go/storage.ObjectHandle.Attrs name: | func (*ObjectHandle) Attrs @@ -2002,8 +2028,9 @@ items: langs: - go syntax: - content: func (o *ObjectHandle) Attrs(ctx context.Context) (attrs *ObjectAttrs, + content: func (o *ObjectHandle) + Attrs(ctx context.Context) + (attrs *ObjectAttrs, err error) codeexamples: - content: "package main\n\nimport (\n\t\"cloud.google.com/go/storage\"\n\t\"context\"\n\t\"fmt\"\n)\n\nfunc @@ -2030,7 +2057,8 @@ items: langs: - go syntax: - content: func (o *ObjectHandle) BucketName() string + content: func (o *ObjectHandle) + BucketName() string - uid: cloud.google.com/go/storage.ObjectHandle.ComposerFrom name: | func (*ObjectHandle) ComposerFrom @@ -2048,8 +2076,9 @@ items: langs: - go syntax: - content: func (dst *ObjectHandle) ComposerFrom(srcs - ...*ObjectHandle) *Composer + content: func (dst *ObjectHandle) + ComposerFrom(srcs ...*ObjectHandle) + *Composer - uid: cloud.google.com/go/storage.ObjectHandle.CopierFrom name: | func (*ObjectHandle) CopierFrom @@ -2066,8 +2095,9 @@ items: langs: - go syntax: - content: func (dst *ObjectHandle) CopierFrom(src *ObjectHandle) *Copier + content: func (dst *ObjectHandle) + CopierFrom(src *ObjectHandle) + *Copier codeexamples: - content: "package main\n\nimport (\n\t\"cloud.google.com/go/storage\"\n\t\"context\"\n)\n\nvar key1, key2 []byte\n\nfunc main() {\n\t// To rotate the encryption key on an @@ -2088,8 +2118,9 @@ items: langs: - go syntax: - content: func (o *ObjectHandle) Delete(ctx context.Context) error + content: func (o *ObjectHandle) + Delete(ctx context.Context) + error codeexamples: - content: "package main\n\nimport (\n\t\"cloud.google.com/go/storage\"\n\t\"context\"\n\t\"fmt\"\n\t\"google.golang.org/api/iterator\"\n)\n\nfunc main() {\n\tctx := context.Background()\n\tclient, err := storage.NewClient(ctx)\n\tif @@ -2118,8 +2149,8 @@ items: langs: - go syntax: - content: func (o *ObjectHandle) Generation(gen int64) *ObjectHandle + content: func (o *ObjectHandle) + Generation(gen int64) *ObjectHandle codeexamples: - content: "package main\n\nimport (\n\t\"cloud.google.com/go/storage\"\n\t\"context\"\n\t\"io\"\n\t\"os\"\n)\n\nvar gen int64\n\nfunc main() {\n\t// Read an object's contents from generation gen, @@ -2143,8 +2174,9 @@ items: langs: - go syntax: - content: func (o *ObjectHandle) If(conds Conditions) - *ObjectHandle + content: func (o *ObjectHandle) + If(conds Conditions) *ObjectHandle codeexamples: - content: "package main\n\nimport (\n\t\"cloud.google.com/go/storage\"\n\t\"context\"\n\t\"google.golang.org/api/googleapi\"\n\t\"io\"\n\t\"net/http\"\n\t\"os\"\n)\n\nvar gen int64\n\nfunc main() {\n\t// Read from an object only if the current generation @@ -2172,8 +2204,9 @@ items: langs: - go syntax: - content: func (o *ObjectHandle) Key(encryptionKey - []byte) *ObjectHandle + content: func (o *ObjectHandle) + Key(encryptionKey []byte) *ObjectHandle codeexamples: - content: "package main\n\nimport (\n\t\"cloud.google.com/go/storage\"\n\t\"context\"\n)\n\nvar secretKey []byte\n\nfunc main() {\n\tctx := context.Background()\n\tclient, @@ -2202,10 +2235,10 @@ items: langs: - go syntax: - content: func (o *ObjectHandle) NewRangeReader(ctx - context.Context, + content: func (o *ObjectHandle) + NewRangeReader(ctx context.Context, offset, length int64) (r *Reader, err error) + href="#cloud_google_com_go_storage_Reader">Reader, err error) codeexamples: - content: "package main\n\nimport (\n\t\"cloud.google.com/go/storage\"\n\t\"context\"\n\t\"fmt\"\n\t\"io/ioutil\"\n)\n\nfunc main() {\n\tctx := context.Background()\n\tclient, err := storage.NewClient(ctx)\n\tif @@ -2245,9 +2278,9 @@ items: langs: - go syntax: - content: func (o *ObjectHandle) NewReader(ctx context.Context) (*Reader, - error) + content: func (o *ObjectHandle) + NewReader(ctx context.Context) + (*Reader, error) codeexamples: - content: "package main\n\nimport (\n\t\"cloud.google.com/go/storage\"\n\t\"context\"\n\t\"fmt\"\n\t\"io/ioutil\"\n)\n\nfunc main() {\n\tctx := context.Background()\n\tclient, err := storage.NewClient(ctx)\n\tif @@ -2280,8 +2313,9 @@ items: langs: - go syntax: - content: func (o *ObjectHandle) NewWriter(ctx context.Context) *Writer + content: func (o *ObjectHandle) + NewWriter(ctx context.Context) + *Writer codeexamples: - content: "package main\n\nimport (\n\t\"cloud.google.com/go/storage\"\n\t\"context\"\n)\n\nfunc main() {\n\tctx := context.Background()\n\tclient, err := storage.NewClient(ctx)\n\tif @@ -2298,7 +2332,8 @@ items: langs: - go syntax: - content: func (o *ObjectHandle) ObjectName() string + content: func (o *ObjectHandle) + ObjectName() string - uid: cloud.google.com/go/storage.ObjectHandle.ReadCompressed name: | func (*ObjectHandle) ReadCompressed @@ -2310,8 +2345,9 @@ items: langs: - go syntax: - content: func (o *ObjectHandle) ReadCompressed(compressed - bool) *ObjectHandle + content: func (o *ObjectHandle) + ReadCompressed(compressed bool) + *ObjectHandle - uid: cloud.google.com/go/storage.ObjectHandle.Update name: | func (*ObjectHandle) Update @@ -2325,9 +2361,11 @@ items: langs: - go syntax: - content: func (o *ObjectHandle) Update(ctx context.Context, uattrs ObjectAttrsToUpdate) - (oa *ObjectAttrs, err error) + content: func (o *ObjectHandle) + Update(ctx context.Context, + uattrs ObjectAttrsToUpdate) + (oa *ObjectAttrs, err + error) codeexamples: - content: "package main\n\nimport (\n\t\"cloud.google.com/go/storage\"\n\t\"context\"\n\t\"fmt\"\n)\n\nfunc main() {\n\tctx := context.Background()\n\tclient, err := storage.NewClient(ctx)\n\tif @@ -2368,7 +2406,8 @@ items: langs: - go syntax: - content: func (it *ObjectIterator) Next() (*ObjectAttrs, + content: func (it *ObjectIterator) + Next() (*ObjectAttrs, error) codeexamples: - content: "package main\n\nimport (\n\t\"cloud.google.com/go/storage\"\n\t\"context\"\n\t\"fmt\"\n\t\"google.golang.org/api/iterator\"\n)\n\nfunc @@ -2389,8 +2428,9 @@ items: langs: - go syntax: - content: func (it *ObjectIterator) PageInfo() *iterator.PageInfo + content: func (it *ObjectIterator) + PageInfo() *iterator.PageInfo - uid: cloud.google.com/go/storage.PolicyV4Fields name: PolicyV4Fields id: PolicyV4Fields @@ -2448,8 +2488,8 @@ items: - go syntax: content: func GenerateSignedPostPolicyV4(bucket, object string, - opts *PostPolicyV4Options) (*PostPolicyV4, - error) + opts *PostPolicyV4Options) + (*PostPolicyV4, error) codeexamples: - content: "package main\n\nimport (\n\t\"bytes\"\n\t\"cloud.google.com/go/storage\"\n\t\"io\"\n\t\"mime/multipart\"\n\t\"net/http\"\n\t\"time\"\n)\n\nfunc main() {\n\tpv4, err := storage.GenerateSignedPostPolicyV4(\"my-bucket\", \"my-object.txt\", @@ -2501,7 +2541,7 @@ items: - go syntax: content: func ConditionContentLengthRange(start, end uint64) - PostPolicyV4Condition + PostPolicyV4Condition - uid: cloud.google.com/go/storage.PostPolicyV4Condition.ConditionStartsWith name: | func ConditionStartsWith @@ -2515,7 +2555,7 @@ items: - go syntax: content: func ConditionStartsWith(key, value string) - PostPolicyV4Condition + PostPolicyV4Condition - uid: cloud.google.com/go/storage.PostPolicyV4Options name: PostPolicyV4Options id: PostPolicyV4Options @@ -2557,16 +2597,16 @@ items: href=\"https://pkg.go.dev/time#Time\">Time\n\n\t// Style provides options for the type of URL to use. Options are\n\t// PathStyle (default), BucketBoundHostname, and VirtualHostedStyle. See\n\t// https://cloud.google.com/storage/docs/request-endpoints - for details.\n\t// Optional.\n\tStyle URLStyle\n\n\t// + for details.\n\t// Optional.\n\tStyle URLStyle\n\n\t// Insecure when set indicates that the generated URL's scheme\n\t// will use \"http\" instead of \"https\" (default).\n\t// Optional.\n\tInsecure bool\n\n\t// Fields specifies the attributes of a PostPolicyV4 request.\n\t// When Fields is non-nil, its attributes must match those that will\n\t// passed into field - Conditions.\n\t// Optional.\n\tFields *PolicyV4Fields\n\n\t// + Conditions.\n\t// Optional.\n\tFields *PolicyV4Fields\n\n\t// The conditions that the uploaded file will be expected to conform to.\n\t// When used, the failure of an upload to satisfy a condition will result in\n\t// a 4XX status code, back with the message describing the problem.\n\t// Optional.\n\tConditions - []PostPolicyV4Condition\n}" + []PostPolicyV4Condition\n}" - uid: cloud.google.com/go/storage.ProjectTeam name: ProjectTeam id: ProjectTeam @@ -2624,8 +2664,8 @@ items: langs: - go syntax: - content: func (q *Query) SetAttrSelection(attrs []string) - error + content: func (q *Query) SetAttrSelection(attrs + []string) error - uid: cloud.google.com/go/storage.Reader name: Reader id: Reader @@ -2641,7 +2681,7 @@ items: langs: - go syntax: - content: "type Reader struct {\n\tAttrs ReaderObjectAttrs\n\t// + content: "type Reader struct {\n\tAttrs ReaderObjectAttrs\n\t// contains filtered or unexported fields\n}" - uid: cloud.google.com/go/storage.Reader.CacheControl name: | @@ -2656,7 +2696,8 @@ items: langs: - go syntax: - content: func (r *Reader) CacheControl() string + content: func (r *Reader) CacheControl() + string - uid: cloud.google.com/go/storage.Reader.Close name: | func (*Reader) Close @@ -2668,7 +2709,8 @@ items: langs: - go syntax: - content: func (r *Reader) Close() error + content: func (r *Reader) Close() + error - uid: cloud.google.com/go/storage.Reader.ContentEncoding name: | func (*Reader) ContentEncoding @@ -2682,7 +2724,8 @@ items: langs: - go syntax: - content: func (r *Reader) ContentEncoding() string + content: func (r *Reader) ContentEncoding() + string - uid: cloud.google.com/go/storage.Reader.ContentType name: | func (*Reader) ContentType @@ -2696,7 +2739,8 @@ items: langs: - go syntax: - content: func (r *Reader) ContentType() string + content: func (r *Reader) ContentType() + string - uid: cloud.google.com/go/storage.Reader.LastModified name: | func (*Reader) LastModified @@ -2710,8 +2754,9 @@ items: langs: - go syntax: - content: func (r *Reader) LastModified() (time.Time, error) + content: func (r *Reader) LastModified() + (time.Time, + error) - uid: cloud.google.com/go/storage.Reader.Read name: | func (*Reader) Read @@ -2721,8 +2766,9 @@ items: langs: - go syntax: - content: func (r *Reader) Read(p []byte) - (int, error) + content: func (r *Reader) Read(p + []byte) (int, + error) - uid: cloud.google.com/go/storage.Reader.Remain name: | func (*Reader) Remain @@ -2734,7 +2780,8 @@ items: langs: - go syntax: - content: func (r *Reader) Remain() int64 + content: func (r *Reader) Remain() + int64 - uid: cloud.google.com/go/storage.Reader.Size name: | func (*Reader) Size @@ -2750,7 +2797,8 @@ items: langs: - go syntax: - content: func (r *Reader) Size() int64 + content: func (r *Reader) Size() + int64 - uid: cloud.google.com/go/storage.ReaderObjectAttrs name: ReaderObjectAttrs id: ReaderObjectAttrs @@ -2870,11 +2918,11 @@ items: Style provides options for the type of URL to use. Options are\n\t// PathStyle (default), BucketBoundHostname, and VirtualHostedStyle. See\n\t// https://cloud.google.com/storage/docs/request-endpoints for details.\n\t// Only supported for V4 signing.\n\t// Optional.\n\tStyle URLStyle\n\n\t// Insecure determines whether the signed - URL should use HTTPS (default) or\n\t// HTTP.\n\t// Only supported for V4 signing.\n\t// - Optional.\n\tInsecure bool\n\n\t// + href=\"#cloud_google_com_go_storage_URLStyle\">URLStyle\n\n\t// Insecure + determines whether the signed URL should use HTTPS (default) or\n\t// HTTP.\n\t// + Only supported for V4 signing.\n\t// Optional.\n\tInsecure bool\n\n\t// Scheme determines the version of URL signing to use. Default is\n\t// SigningSchemeV2.\n\tScheme - SigningScheme\n}" + SigningScheme\n}" - uid: cloud.google.com/go/storage.SigningScheme name: SigningScheme id: SigningScheme @@ -2895,7 +2943,7 @@ items: - go syntax: content: "const (\n\t// SigningSchemeDefault is presently V2 and will change to - V4 in the future.\n\tSigningSchemeDefault SigningScheme + V4 in the future.\n\tSigningSchemeDefault SigningScheme = iota\n\n\t// SigningSchemeV2 uses the V2 scheme to sign URLs.\n\tSigningSchemeV2\n\n\t// SigningSchemeV4 uses the V4 scheme to sign URLs.\n\tSigningSchemeV4\n)" @@ -2931,7 +2979,7 @@ items: - go syntax: content: func BucketBoundHostname(hostname string) - URLStyle + URLStyle - uid: cloud.google.com/go/storage.URLStyle.PathStyle name: | func PathStyle @@ -2944,7 +2992,7 @@ items: langs: - go syntax: - content: func PathStyle() URLStyle + content: func PathStyle() URLStyle - uid: cloud.google.com/go/storage.URLStyle.VirtualHostedStyle name: | func VirtualHostedStyle @@ -2957,7 +3005,7 @@ items: langs: - go syntax: - content: func VirtualHostedStyle() URLStyle + content: func VirtualHostedStyle() URLStyle - uid: cloud.google.com/go/storage.UniformBucketLevelAccess name: UniformBucketLevelAccess id: UniformBucketLevelAccess @@ -2986,7 +3034,7 @@ items: syntax: content: "type Writer struct {\n\t// ObjectAttrs are optional attributes to set on the object. Any attributes\n\t// must be initialized before the first Write - call. Nil or zero-valued\n\t// attributes are ignored.\n\tObjectAttrs\n\n\t// + call. Nil or zero-valued\n\t// attributes are ignored.\n\tObjectAttrs\n\n\t// SendCRC specifies whether to transmit a CRC32C field. It should be set\n\t// to true in addition to setting the Writer's CRC32C field, because zero\n\t// is a valid CRC and normally a zero would not be transmitted.\n\t// If a CRC32C @@ -3026,7 +3074,8 @@ items: langs: - go syntax: - content: func (w *Writer) Attrs() *ObjectAttrs + content: func (w *Writer) Attrs() + *ObjectAttrs - uid: cloud.google.com/go/storage.Writer.Close name: | func (*Writer) Close @@ -3040,7 +3089,8 @@ items: langs: - go syntax: - content: func (w *Writer) Close() error + content: func (w *Writer) Close() + error - uid: cloud.google.com/go/storage.Writer.CloseWithError name: | func (*Writer) CloseWithError @@ -3055,8 +3105,8 @@ items: langs: - go syntax: - content: func (w *Writer) CloseWithError(err error) - error + content: func (w *Writer) CloseWithError(err + error) error - uid: cloud.google.com/go/storage.Writer.Write name: | func (*Writer) Write @@ -3076,8 +3126,9 @@ items: langs: - go syntax: - content: func (w *Writer) Write(p []byte) - (n int, err error) + content: func (w *Writer) Write(p + []byte) (n int, + err error) codeexamples: - content: "package main\n\nimport (\n\t\"cloud.google.com/go/storage\"\n\t\"context\"\n\t\"fmt\"\n)\n\nfunc main() {\n\tctx := context.Background()\n\tclient, err := storage.NewClient(ctx)\n\tif @@ -3125,8 +3176,8 @@ items: - go syntax: content: func SignedURL(bucket, name string, - opts *SignedURLOptions) (string, - error) + opts *SignedURLOptions) + (string, error) codeexamples: - content: "package main\n\nimport (\n\t\"cloud.google.com/go/storage\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"time\"\n)\n\nfunc main() {\n\tpkey, err := ioutil.ReadFile(\"my-private-key.pem\")\n\tif err !=