@@ -40,6 +40,13 @@ const (
4040 extPptx = ".pptx"
4141 extPNG = ".png"
4242 extTXT = ".txt"
43+
44+ driveShareToAnyone = "anyone"
45+ driveShareToUser = "user"
46+ driveShareToDomain = "domain"
47+
48+ drivePermRoleReader = "reader"
49+ drivePermRoleWriter = "writer"
4350)
4451
4552type DriveCmd struct {
@@ -572,8 +579,10 @@ func (c *DriveRenameCmd) Run(ctx context.Context, flags *RootFlags) error {
572579
573580type DriveShareCmd struct {
574581 FileID string `arg:"" name:"fileId" help:"File ID"`
575- Anyone bool `name:"anyone" help:"Make publicly accessible"`
576- Email string `name:"email" help:"Share with specific user"`
582+ To string `name:"to" help:"Share target: anyone|user|domain"`
583+ Anyone bool `name:"anyone" hidden:"" help:"(deprecated) Use --to=anyone"`
584+ Email string `name:"email" help:"User email (for --to=user)"`
585+ Domain string `name:"domain" help:"Domain (for --to=domain; e.g. example.com)"`
577586 Role string `name:"role" help:"Permission: reader|writer" default:"reader"`
578587 Discoverable bool `name:"discoverable" help:"Allow file discovery in search (anyone/domain only)"`
579588}
@@ -589,14 +598,58 @@ func (c *DriveShareCmd) Run(ctx context.Context, flags *RootFlags) error {
589598 return usage ("empty fileId" )
590599 }
591600
592- if ! c .Anyone && strings .TrimSpace (c .Email ) == "" {
593- return usage ("must specify --anyone or --email" )
601+ to := strings .TrimSpace (c .To )
602+ email := strings .TrimSpace (c .Email )
603+ domain := strings .TrimSpace (c .Domain )
604+
605+ // Back-compat: allow legacy target flags without --to, but keep it unambiguous.
606+ // New UX: prefer explicit --to + matching parameter.
607+ if to == "" {
608+ switch {
609+ case c .Anyone && email == "" && domain == "" :
610+ to = driveShareToAnyone
611+ case ! c .Anyone && email != "" && domain == "" :
612+ to = driveShareToUser
613+ case ! c .Anyone && email == "" && domain != "" :
614+ to = driveShareToDomain
615+ case ! c .Anyone && email == "" && domain == "" :
616+ return usage ("must specify --to (anyone|user|domain)" )
617+ default :
618+ return usage ("ambiguous share target (use --to=anyone|user|domain)" )
619+ }
620+ }
621+
622+ switch to {
623+ case driveShareToAnyone :
624+ if email != "" || domain != "" {
625+ return usage ("--to=anyone cannot be combined with --email or --domain" )
626+ }
627+ case driveShareToUser :
628+ if email == "" {
629+ return usage ("missing --email for --to=user" )
630+ }
631+ if domain != "" || c .Anyone {
632+ return usage ("--to=user cannot be combined with --anyone or --domain" )
633+ }
634+ if c .Discoverable {
635+ return usage ("--discoverable is only valid for --to=anyone or --to=domain" )
636+ }
637+ case driveShareToDomain :
638+ if domain == "" {
639+ return usage ("missing --domain for --to=domain" )
640+ }
641+ if email != "" || c .Anyone {
642+ return usage ("--to=domain cannot be combined with --anyone or --email" )
643+ }
644+ default :
645+ // Should be guarded by enum, but keep a friendly message for future changes.
646+ return usage ("invalid --to (expected anyone|user|domain)" )
594647 }
595648 role := strings .TrimSpace (c .Role )
596649 if role == "" {
597- role = "reader"
650+ role = drivePermRoleReader
598651 }
599- if role != "reader" && role != "writer" {
652+ if role != drivePermRoleReader && role != drivePermRoleWriter {
600653 return usage ("invalid --role (expected reader|writer)" )
601654 }
602655
@@ -606,18 +659,23 @@ func (c *DriveShareCmd) Run(ctx context.Context, flags *RootFlags) error {
606659 }
607660
608661 perm := & drive.Permission {Role : role }
609- if c .Anyone {
662+ switch to {
663+ case driveShareToAnyone :
610664 perm .Type = "anyone"
611665 perm .AllowFileDiscovery = c .Discoverable
612- } else {
666+ case driveShareToDomain :
667+ perm .Type = "domain"
668+ perm .Domain = domain
669+ perm .AllowFileDiscovery = c .Discoverable
670+ default :
613671 perm .Type = "user"
614- perm .EmailAddress = strings . TrimSpace ( c . Email )
672+ perm .EmailAddress = email
615673 }
616674
617675 created , err := svc .Permissions .Create (fileID , perm ).
618676 SupportsAllDrives (true ).
619677 SendNotificationEmail (false ).
620- Fields ("id, type, role, emailAddress" ).
678+ Fields ("id, type, role, emailAddress, domain, allowFileDiscovery " ).
621679 Context (ctx ).
622680 Do ()
623681 if err != nil {
@@ -713,7 +771,7 @@ func (c *DrivePermissionsCmd) Run(ctx context.Context, flags *RootFlags) error {
713771
714772 call := svc .Permissions .List (fileID ).
715773 SupportsAllDrives (true ).
716- Fields ("nextPageToken, permissions(id, type, role, emailAddress)" ).
774+ Fields ("nextPageToken, permissions(id, type, role, emailAddress, domain )" ).
717775 Context (ctx )
718776 if c .Max > 0 {
719777 call = call .PageSize (c .Max )
@@ -744,6 +802,9 @@ func (c *DrivePermissionsCmd) Run(ctx context.Context, flags *RootFlags) error {
744802 fmt .Fprintln (w , "ID\t TYPE\t ROLE\t EMAIL" )
745803 for _ , p := range resp .Permissions {
746804 email := p .EmailAddress
805+ if email == "" && p .Domain != "" {
806+ email = p .Domain
807+ }
747808 if email == "" {
748809 email = "-"
749810 }
0 commit comments