code.oscarkilo.com/okg/repo.go

.gitignore
README.md
auth.go
client.go
config.go
go.mod
main.go
okg_test.go
pr.go
repo.go
package main

import "encoding/json"
import "fmt"
import "os"
import "text/tabwriter"

type repoInfo struct {
  Name     string         `json:"name"`
  IsPublic bool           `json:"is_public"`
  Authz    *repoInfoAuthz `json:"authz"`
}

type repoInfoAuthz struct {
  IsOwner        bool   `json:"is_owner"`
  IsReader       bool   `json:"is_reader"`
  OwnerUsername   string `json:"owner_username"`
  ReaderUsername  string `json:"reader_username"`
}

type lsResponse struct {
  Repos          []repoInfo `json:"repos"`
  CanCreateRepos bool       `json:"can_create_repos"`
}

func runRepo(args []string) error {
  if len(args) == 0 {
    return fmt.Errorf("usage: okg repo list")
  }
  switch args[0] {
  case "list":
    return runRepoList(args[1:])
  default:
    return fmt.Errorf("unknown repo command: %s", args[0])
  }
}

func runRepoList(args []string) error {
  as_json := false
  for _, a := range args {
    if a == "--json" {
      as_json = true
    }
  }

  cfg, err := loadConfig()
  if err != nil {
    return err
  }
  cl := newClient(cfg)

  var res lsResponse
  if err := cl.getJSON("/.ls", &res); err != nil {
    return err
  }

  if as_json {
    enc := json.NewEncoder(os.Stdout)
    enc.SetIndent("", "  ")
    return enc.Encode(res)
  }

  tw := tabwriter.NewWriter(os.Stdout, 0, 4, 2, ' ', 0)
  fmt.Fprintln(tw, "NAME\tOWNER\tREADER")
  for _, r := range res.Repos {
    owner := ""
    reader := ""
    if r.Authz != nil {
      owner = r.Authz.OwnerUsername
      reader = r.Authz.ReaderUsername
    }
    fmt.Fprintf(tw, "%s\t%s\t%s\n", r.Name, owner, reader)
  }
  return tw.Flush()
}